mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-23 01:49:13 +00:00
Compare commits
58 Commits
@vercel/py
...
@vercel/cl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
50080e4b92 | ||
|
|
5845bebe2d | ||
|
|
3e18146846 | ||
|
|
dbde60f47f | ||
|
|
aa3db23cad | ||
|
|
60a5b0a586 | ||
|
|
8b682ccc41 | ||
|
|
50055963af | ||
|
|
43fa6e6d97 | ||
|
|
98c0b9b573 | ||
|
|
8b8541f4aa | ||
|
|
59cc2bf0f2 | ||
|
|
30e078062f | ||
|
|
4d015a60ef | ||
|
|
ad0e66242d | ||
|
|
044f956de2 | ||
|
|
d26ed43d26 | ||
|
|
84d859a016 | ||
|
|
9238687089 | ||
|
|
212c91cf32 | ||
|
|
48b34f5b02 | ||
|
|
b2c72538a3 | ||
|
|
57d8702188 | ||
|
|
9a72195d8a | ||
|
|
29ab7f7cfb | ||
|
|
ffa36c12d5 | ||
|
|
d1fc729d31 | ||
|
|
ba47ad00f9 | ||
|
|
2b62de803f | ||
|
|
196433ec9d | ||
|
|
0cdd571087 | ||
|
|
5e2227507d | ||
|
|
e3d478a471 | ||
|
|
187d41434a | ||
|
|
f6fde2d351 | ||
|
|
e09ceca95d | ||
|
|
d9318af654 | ||
|
|
679cd6f14e | ||
|
|
47c7a13324 | ||
|
|
f498d25d8b | ||
|
|
726d3924ae | ||
|
|
d3e6c2d335 | ||
|
|
f9ed84a5c9 | ||
|
|
88a815b5f0 | ||
|
|
9f49743ea4 | ||
|
|
0ac3ae19c0 | ||
|
|
e7920fd783 | ||
|
|
b4c13470df | ||
|
|
2a797b77b9 | ||
|
|
85a34126df | ||
|
|
92889c5376 | ||
|
|
66a7fa30b8 | ||
|
|
a7ba405503 | ||
|
|
84145245ba | ||
|
|
90d2e8b63b | ||
|
|
0d31fe8018 | ||
|
|
37d747c241 | ||
|
|
3f052d905f |
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -4,8 +4,8 @@ contact_links:
|
||||
url: https://vercel.com/support/request
|
||||
about: Report a bug using the Vercel support form
|
||||
- name: Feature Request
|
||||
url: https://github.com/vercel/vercel/discussions/new?category_id=66161
|
||||
url: https://github.com/vercel/vercel/discussions/new?category=ideas
|
||||
about: Share ideas for new features
|
||||
- name: Ask a Question
|
||||
url: https://github.com/vercel/vercel/discussions/new?category_id=66160
|
||||
url: https://github.com/vercel/vercel/discussions/new?category=help
|
||||
about: Ask the community for help
|
||||
|
||||
2
.github/workflows/publish.yml
vendored
2
.github/workflows/publish.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
with:
|
||||
node-version: 12
|
||||
- name: Install
|
||||
run: yarn install --check-files --frozen-lockfile
|
||||
run: yarn install --check-files --frozen-lockfile --network-timeout 1000000
|
||||
- name: Build
|
||||
run: yarn build
|
||||
env:
|
||||
|
||||
2
.github/workflows/test-integration-cli.yml
vendored
2
.github/workflows/test-integration-cli.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
- run: git fetch origin master --depth=100
|
||||
- run: git fetch origin ${{ github.ref }} --depth=100
|
||||
- run: git diff origin/master...HEAD --name-only
|
||||
- run: yarn install
|
||||
- run: yarn install --network-timeout 1000000
|
||||
- run: yarn run build
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
|
||||
4
.github/workflows/test-integration-dev.yml
vendored
4
.github/workflows/test-integration-dev.yml
vendored
@@ -11,7 +11,7 @@ on:
|
||||
jobs:
|
||||
test:
|
||||
name: Dev
|
||||
timeout-minutes: 45
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
- name: Install Hugo
|
||||
if: matrix.os == 'macos-latest'
|
||||
run: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/
|
||||
- run: yarn install
|
||||
- run: yarn install --network-timeout 1000000
|
||||
- run: yarn run build
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
|
||||
2
.github/workflows/test-integration-once.yml
vendored
2
.github/workflows/test-integration-once.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
- run: git fetch origin master --depth=100
|
||||
- run: git fetch origin ${{ github.ref }} --depth=100
|
||||
- run: git diff origin/master...HEAD --name-only
|
||||
- run: yarn install
|
||||
- run: yarn install --network-timeout 1000000
|
||||
- run: yarn run build
|
||||
- run: yarn test-integration-once --clean false
|
||||
env:
|
||||
|
||||
2
.github/workflows/test-unit.yml
vendored
2
.github/workflows/test-unit.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
- run: yarn install
|
||||
- run: yarn install --network-timeout 1000000
|
||||
- run: yarn run build
|
||||
- run: yarn run lint
|
||||
if: matrix.os == 'ubuntu-latest' && matrix.node == 12 # only run lint once
|
||||
|
||||
@@ -12,6 +12,11 @@ const frameworks = (_frameworks as Framework[])
|
||||
...frameworkItem,
|
||||
detectors: undefined,
|
||||
sort: undefined,
|
||||
dependency: undefined,
|
||||
defaultRoutes: undefined,
|
||||
cachePattern: undefined,
|
||||
devCommand: undefined,
|
||||
buildCommand: undefined,
|
||||
};
|
||||
|
||||
if (framework.logo) {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"description": "API for the vercel/vercel repo",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "yarn --cwd .. && node ../utils/run.js build all"
|
||||
"vercel-build": "yarn --cwd .. && node ../utils/run.js build all"
|
||||
},
|
||||
"dependencies": {
|
||||
"@sentry/node": "5.11.1",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"strict": false,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"noEmit": true,
|
||||
"noEmitOnError": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
|
||||
@@ -8,6 +8,6 @@
|
||||
"explore": "gridsome explore"
|
||||
},
|
||||
"dependencies": {
|
||||
"gridsome": "^0.6.0"
|
||||
"gridsome": "0.7.23"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,18 +3,18 @@
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"hexo": {
|
||||
"version": "3.9.0"
|
||||
"version": "5.3.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"hexo": "^3.9.0",
|
||||
"hexo-generator-archive": "^0.1.5",
|
||||
"hexo-generator-category": "^0.1.3",
|
||||
"hexo-generator-index": "^0.2.1",
|
||||
"hexo-generator-tag": "^0.2.0",
|
||||
"hexo-renderer-ejs": "^0.3.1",
|
||||
"hexo-renderer-stylus": "^0.3.3",
|
||||
"hexo-renderer-marked": "^1.0.1",
|
||||
"hexo-server": "^0.3.3"
|
||||
"hexo": "^5.3.0",
|
||||
"hexo-generator-archive": "^1.0.0",
|
||||
"hexo-generator-category": "^1.0.0",
|
||||
"hexo-generator-index": "^2.0.0",
|
||||
"hexo-generator-tag": "^1.0.0",
|
||||
"hexo-renderer-ejs": "^1.0.0",
|
||||
"hexo-renderer-marked": "^3.3.0",
|
||||
"hexo-renderer-stylus": "^2.0.1",
|
||||
"hexo-server": "^2.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "hexo server -p $PORT",
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
# editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
@@ -3,5 +3,11 @@
|
||||
# system. Any custom values should go in .env and .env should *not* be checked
|
||||
# into version control.
|
||||
|
||||
# schema.prisma defaults
|
||||
DATABASE_URL=file:./dev.db
|
||||
BINARY_TARGET=native
|
||||
|
||||
# location of the test database for api service scenarios (defaults to ./.redwood/test.db if not set)
|
||||
# TEST_DATABASE_URL=file:./.redwood/test.db
|
||||
|
||||
# disables Prisma CLI update notifier
|
||||
PRISMA_HIDE_UPDATE_MESSAGE=true
|
||||
|
||||
3
examples/redwoodjs/.gitignore
vendored
3
examples/redwoodjs/.gitignore
vendored
@@ -1,10 +1,13 @@
|
||||
.idea
|
||||
.DS_Store
|
||||
.env
|
||||
.netlify
|
||||
.redwood
|
||||
dev.db
|
||||
dist
|
||||
dist-babel
|
||||
node_modules
|
||||
yarn-error.log
|
||||
web/public/mockServiceWorker.js
|
||||
|
||||
.vercel
|
||||
@@ -1 +0,0 @@
|
||||
lts/*
|
||||
@@ -5,11 +5,11 @@ datasource DS {
|
||||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
binaryTargets = env("BINARY_TARGET")
|
||||
binaryTargets = "native"
|
||||
}
|
||||
|
||||
// Define your own datamodels here and run `yarn redwood db save` to create
|
||||
// migrations for them.
|
||||
// Define your own datamodels here and run `yarn redwood prisma migrate dev`
|
||||
// to create migrations for them and apply to your dev DB.
|
||||
// TODO: Please remove the following example:
|
||||
model UserExample {
|
||||
id Int @id @default(autoincrement())
|
||||
@@ -6,6 +6,8 @@ dotenv.config()
|
||||
const db = new PrismaClient()
|
||||
|
||||
async function main() {
|
||||
// https://www.prisma.io/docs/guides/prisma-guides/seed-database
|
||||
//
|
||||
// Seed data is database data that needs to exist for your app to run.
|
||||
// Ideally this file should be idempotent: running it multiple times
|
||||
// will result in the same database state (usually by checking for the
|
||||
@@ -16,11 +18,11 @@ async function main() {
|
||||
// await db.user.create({ data: { name: 'Admin', email: 'admin@email.com' }})
|
||||
// }
|
||||
|
||||
console.info('No data to seed. See api/prisma/seeds.js for info.')
|
||||
console.info('No data to seed. See api/db/seed.js for info.')
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => console.error(e))
|
||||
.finally(async () => {
|
||||
await db.disconnect()
|
||||
await db.$disconnect()
|
||||
})
|
||||
6
examples/redwoodjs/api/jest.config.js
Normal file
6
examples/redwoodjs/api/jest.config.js
Normal file
@@ -0,0 +1,6 @@
|
||||
const { getConfig } = require('@redwoodjs/core')
|
||||
|
||||
const config = getConfig({ type: 'jest', target: 'node' })
|
||||
config.displayName.name = 'api'
|
||||
|
||||
module.exports = config
|
||||
@@ -5,5 +5,5 @@
|
||||
"src/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
"include": ["src/**/*", "../.redwood/index.d.ts"]
|
||||
}
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@redwoodjs/api": "0.15.0"
|
||||
"@redwoodjs/api": "^0.25.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,17 +3,18 @@ import {
|
||||
makeMergedSchema,
|
||||
makeServices,
|
||||
} from '@redwoodjs/api'
|
||||
import importAll from '@redwoodjs/api/importAll.macro'
|
||||
|
||||
import schemas from 'src/graphql/**/*.{js,ts}'
|
||||
import { db } from 'src/lib/db'
|
||||
|
||||
const schemas = importAll('api', 'graphql')
|
||||
const services = importAll('api', 'services')
|
||||
import services from 'src/services/**/*.{js,ts}'
|
||||
|
||||
export const handler = createGraphQLHandler({
|
||||
schema: makeMergedSchema({
|
||||
schemas,
|
||||
services: makeServices({ services }),
|
||||
}),
|
||||
db,
|
||||
onException: () => {
|
||||
// Disconnect from your database with an unhandled exception.
|
||||
db.$disconnect()
|
||||
},
|
||||
})
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// See https://github.com/prisma/prisma2/blob/master/docs/prisma-client-js/api.md#constructor
|
||||
// See https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-client/constructor
|
||||
// for options.
|
||||
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
|
||||
7
examples/redwoodjs/graphql.config.js
Normal file
7
examples/redwoodjs/graphql.config.js
Normal file
@@ -0,0 +1,7 @@
|
||||
const { getConfig } = require('@redwoodjs/internal')
|
||||
|
||||
const config = getConfig()
|
||||
|
||||
module.exports = {
|
||||
schema: `http://${config.api.host}:${config.api.port}/graphql`,
|
||||
}
|
||||
@@ -3,11 +3,12 @@
|
||||
"workspaces": {
|
||||
"packages": [
|
||||
"api",
|
||||
"web"
|
||||
"web",
|
||||
"packages/*"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@redwoodjs/core": "0.15.0"
|
||||
"@redwoodjs/core": "^0.25.0"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": "@redwoodjs/eslint-config"
|
||||
|
||||
@@ -6,4 +6,12 @@ module.exports = {
|
||||
semi: false,
|
||||
singleQuote: true,
|
||||
arrowParens: 'always',
|
||||
overrides: [
|
||||
{
|
||||
files: 'Routes.js',
|
||||
options: {
|
||||
printWidth: 200,
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
# This file contains the configuration settings for your Redwood app.
|
||||
# This file is also what makes your Redwood app a Redwood app.
|
||||
# If you remove it and try to run `yarn rw dev`, you'll get an error.
|
||||
#
|
||||
# For the full list of options, see the "App Configuration: redwood.toml" doc:
|
||||
# https://redwoodjs.com/docs/app-configuration-redwood-toml
|
||||
|
||||
[web]
|
||||
port = 8910
|
||||
apiProxyPath = "/api"
|
||||
[api]
|
||||
port = 8911
|
||||
schemaPath = "./api/db/schema.prisma"
|
||||
[browser]
|
||||
open = false
|
||||
|
||||
6
examples/redwoodjs/web/jest.config.js
Normal file
6
examples/redwoodjs/web/jest.config.js
Normal file
@@ -0,0 +1,6 @@
|
||||
const { getConfig } = require('@redwoodjs/core')
|
||||
|
||||
const config = getConfig({ type: 'jest', target: 'browser' })
|
||||
config.displayName.name = 'web'
|
||||
|
||||
module.exports = config
|
||||
@@ -6,5 +6,5 @@
|
||||
},
|
||||
"jsx": "preserve"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
"include": ["src/**/*", "../.redwood/index.d.ts"]
|
||||
}
|
||||
|
||||
@@ -2,12 +2,20 @@
|
||||
"name": "web",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"browserslist": [
|
||||
"defaults"
|
||||
],
|
||||
"browserslist": {
|
||||
"development": [
|
||||
"last 1 version"
|
||||
],
|
||||
"production": [
|
||||
"defaults",
|
||||
"not IE 11",
|
||||
"not IE_Mob 11"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@redwoodjs/router": "0.15.0",
|
||||
"@redwoodjs/web": "0.15.0",
|
||||
"@redwoodjs/forms": "^0.25.0",
|
||||
"@redwoodjs/router": "^0.25.0",
|
||||
"@redwoodjs/web": "^0.25.0",
|
||||
"prop-types": "^15.7.2",
|
||||
"react": "^16.13.1",
|
||||
"react-dom": "^16.13.1"
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
# Static Assets
|
||||
|
||||
Use this folder to add static files directly to your app. All included files and folders will be copied directly into the `/dist` folder (created when Webpack builds for production). They will also be available during development when you run `yarn rw dev`.
|
||||
>Note: files will *not* hot reload while the development server is running. You'll need to manually stop/start to access file changes.
|
||||
|
||||
> Note: files will _not_ hot reload while the development server is running. You'll need to manually stop/start to access file changes.
|
||||
|
||||
### Example Use
|
||||
|
||||
A file like `favicon.png` will be copied to `/dist/favicon.png`. A folder containing a file such as `static-files/my-logo.jpg` will be copied to `/dist/static-files/my-logo.jpg`. These can be referenced in your code directly without any special handling, e.g.
|
||||
|
||||
```
|
||||
<link rel="icon" type="image/png" href="/favicon.png" />
|
||||
```
|
||||
|
||||
and
|
||||
|
||||
```
|
||||
<img src="/static-files/my-logo.jpg"> alt="Logo" />
|
||||
```
|
||||
@@ -15,12 +21,15 @@ and
|
||||
Behind the scenes, we are using Webpack's ["copy-webpack-plugin"](https://github.com/webpack-contrib/copy-webpack-plugin).
|
||||
|
||||
## Best Practices
|
||||
|
||||
Because assets in this folder are bypassing the javascript module system, **this folder should be used sparingly** for assets such as favicons, robots.txt, manifests, libraries incompatible with Webpack, etc.
|
||||
|
||||
In general, it's best to import files directly into a template, page, or component. This allows Webpack to include that file in the bundle, which ensures Webpack will correctly process and move assets into the distribution folder, providing error checks and correct paths along the way.
|
||||
|
||||
### Example Asset Import with Webpack
|
||||
|
||||
Instead of handling our logo image as a static file per the example above, we can do the following:
|
||||
|
||||
```
|
||||
import React from "react"
|
||||
import logo from "./my-logo.jpg"
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
import ReactDOM from 'react-dom'
|
||||
import { RedwoodProvider, FatalErrorBoundary } from '@redwoodjs/web'
|
||||
import FatalErrorPage from 'src/pages/FatalErrorPage'
|
||||
|
||||
import { FatalErrorBoundary } from '@redwoodjs/web'
|
||||
import { RedwoodApolloProvider } from '@redwoodjs/web/apollo'
|
||||
|
||||
import FatalErrorPage from 'src/pages/FatalErrorPage'
|
||||
import Routes from 'src/Routes'
|
||||
|
||||
import './index.css'
|
||||
|
||||
ReactDOM.render(
|
||||
<FatalErrorBoundary page={FatalErrorPage}>
|
||||
<RedwoodProvider>
|
||||
<RedwoodApolloProvider>
|
||||
<Routes />
|
||||
</RedwoodProvider>
|
||||
</RedwoodApolloProvider>
|
||||
</FatalErrorBoundary>,
|
||||
document.getElementById('redwood-app')
|
||||
)
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
export default () => (
|
||||
import { Link, routes } from '@redwoodjs/router'
|
||||
|
||||
const AboutPage = () => (
|
||||
<main>
|
||||
<style
|
||||
dangerouslySetInnerHTML={{
|
||||
@@ -36,9 +38,16 @@ export default () => (
|
||||
}}
|
||||
/>
|
||||
<section>
|
||||
<h1>
|
||||
<span>About RedwoodJS</span>
|
||||
</h1>
|
||||
<h1>About</h1>
|
||||
<p>
|
||||
Find me in <code>./web/src/pages/AboutPage/AboutPage.js</code>
|
||||
</p>
|
||||
<p>
|
||||
My default route is named <code>about</code>, link to me with `
|
||||
<Link to={routes.about()}>About</Link>`
|
||||
</p>
|
||||
</section>
|
||||
</main>
|
||||
)
|
||||
|
||||
export default AboutPage
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
export default () => (
|
||||
import { Link, routes } from '@redwoodjs/router'
|
||||
|
||||
const HomePage = () => (
|
||||
<main>
|
||||
<style
|
||||
dangerouslySetInnerHTML={{
|
||||
@@ -36,9 +38,16 @@ export default () => (
|
||||
}}
|
||||
/>
|
||||
<section>
|
||||
<h1>
|
||||
<span>Welcome to RedwoodJS!</span>
|
||||
</h1>
|
||||
<h1>Welcome to RedwoodJS!</h1>
|
||||
<p>
|
||||
Find me in <code>./web/src/pages/HomePage/HomePage.js</code>
|
||||
</p>
|
||||
<p>
|
||||
My default route is named <code>home</code>, link to me with `
|
||||
<Link to={routes.home()}>Home</Link>`
|
||||
</p>
|
||||
</section>
|
||||
</main>
|
||||
)
|
||||
|
||||
export default HomePage
|
||||
@@ -0,0 +1,7 @@
|
||||
import HomePage from './HomePage'
|
||||
|
||||
export const generated = () => {
|
||||
return <HomePage />
|
||||
}
|
||||
|
||||
export default { title: 'Pages/HomePage' }
|
||||
File diff suppressed because it is too large
Load Diff
2
examples/zola/.gitignore
vendored
Normal file
2
examples/zola/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/public
|
||||
/.vercel
|
||||
16
examples/zola/config.toml
Normal file
16
examples/zola/config.toml
Normal file
@@ -0,0 +1,16 @@
|
||||
# The URL the site will be built for
|
||||
base_url = "/"
|
||||
|
||||
# Whether to automatically compile all Sass files in the sass directory
|
||||
compile_sass = true
|
||||
|
||||
# Whether to build a search index to be used later on by a JavaScript library
|
||||
build_search_index = false
|
||||
|
||||
[markdown]
|
||||
# Whether to do syntax highlighting
|
||||
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
|
||||
highlight_code = false
|
||||
|
||||
[extra]
|
||||
# Put all your custom variables here
|
||||
6
examples/zola/content/blog/_index.md
Normal file
6
examples/zola/content/blog/_index.md
Normal file
@@ -0,0 +1,6 @@
|
||||
+++
|
||||
title = "List of blog posts"
|
||||
sort_by = "date"
|
||||
template = "blog.html"
|
||||
page_template = "blog-page.html"
|
||||
+++
|
||||
6
examples/zola/content/blog/first.md
Normal file
6
examples/zola/content/blog/first.md
Normal file
@@ -0,0 +1,6 @@
|
||||
+++
|
||||
title = "My first post"
|
||||
date = 2019-11-27
|
||||
+++
|
||||
|
||||
This is my first blog post.
|
||||
6
examples/zola/content/blog/second.md
Normal file
6
examples/zola/content/blog/second.md
Normal file
@@ -0,0 +1,6 @@
|
||||
+++
|
||||
title = "My second post"
|
||||
date = 2019-11-28
|
||||
+++
|
||||
|
||||
This is my second blog post.
|
||||
18
examples/zola/templates/base.html
Normal file
18
examples/zola/templates/base.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>MyBlog</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
{% block content %} {% endblock %}
|
||||
</div>
|
||||
</section>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
9
examples/zola/templates/blog-page.html
Normal file
9
examples/zola/templates/blog-page.html
Normal file
@@ -0,0 +1,9 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1 class="title">
|
||||
{{ page.title }}
|
||||
</h1>
|
||||
<p class="subtitle"><strong>{{ page.date }}</strong></p>
|
||||
{{ page.content | safe }}
|
||||
{% endblock content %}
|
||||
12
examples/zola/templates/blog.html
Normal file
12
examples/zola/templates/blog.html
Normal file
@@ -0,0 +1,12 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1 class="title">
|
||||
{{ section.title }}
|
||||
</h1>
|
||||
<ul>
|
||||
{% for page in section.pages %}
|
||||
<li><a href="{{ page.permalink | safe }}">{{ page.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock content %}
|
||||
8
examples/zola/templates/index.html
Normal file
8
examples/zola/templates/index.html
Normal file
@@ -0,0 +1,8 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1 class="title">
|
||||
This is my blog made with Zola.
|
||||
</h1>
|
||||
<p>Click <a href="/blog/">here</a> to see my posts.</p>
|
||||
{% endblock content %}
|
||||
@@ -39,7 +39,7 @@
|
||||
"publish-from-github": "./utils/publish.sh",
|
||||
"changelog": "node utils/changelog.js",
|
||||
"build": "node utils/run.js build all",
|
||||
"now-build": "mkdir -p public && echo '<a href=\"https://vercel.com/import\">Import</a>' > public/output.html",
|
||||
"vercel-build": "mkdir -p public && echo '<a href=\"https://vercel.com/import\">Import</a>' > public/output.html",
|
||||
"test-unit": "node utils/run.js test-unit",
|
||||
"test-integration-cli": "node utils/run.js test-integration-cli",
|
||||
"test-integration-once": "node utils/run.js test-integration-once",
|
||||
|
||||
@@ -1,945 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "Blitz.js",
|
||||
"slug": "blitzjs",
|
||||
"demo": "https://blitzjs.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/blitz.svg",
|
||||
"tagline": "Blitz.js: The Fullstack React Framework",
|
||||
"description": "A brand new Blitz.js app - the result of running `npx blitz new`.",
|
||||
"website": "https://blitzjs.com",
|
||||
"useRuntime": { "src": "package.json", "use": "@vercel/next" },
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"blitz\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `blitz build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "blitz start"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"placeholder": "Next.js default"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Next.js",
|
||||
"slug": "nextjs",
|
||||
"demo": "https://nextjs.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/next.svg",
|
||||
"tagline": "Next.js makes you productive with React instantly — whether you want to build static or dynamic sites.",
|
||||
"description": "A Next.js app and a Serverless Function API.",
|
||||
"website": "https://nextjs.org",
|
||||
"sort": 1,
|
||||
"useRuntime": { "src": "package.json", "use": "@vercel/next" },
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"next\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `next build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "next dev --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"placeholder": "Next.js default"
|
||||
}
|
||||
},
|
||||
"recommendedIntegrations": [
|
||||
{
|
||||
"id": "oac_5lUsiANun1DEzgLg0NZx5Es3",
|
||||
"dependencies": ["next-plugin-sentry", "next-sentry-source-maps"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Gatsby.js",
|
||||
"slug": "gatsby",
|
||||
"demo": "https://gatsby.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/gatsby.svg",
|
||||
"tagline": "Gatsby helps developers build blazing fast websites and apps with React.",
|
||||
"description": "A Gatsby app, using the default starter theme and a Serverless Function API.",
|
||||
"website": "https://gatsbyjs.org",
|
||||
"sort": 2,
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"gatsby\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `gatsby build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "gatsby develop --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "public"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Hexo",
|
||||
"slug": "hexo",
|
||||
"demo": "https://hexo.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/hexo.svg",
|
||||
"tagline": "Hexo is a fast, simple & powerful blog framework powered by Node.js.",
|
||||
"description": "A Hexo site, created with the Hexo CLI.",
|
||||
"website": "https://hexo.io",
|
||||
"sort": 3,
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"hexo\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `hexo generate`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "hexo server --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "public"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Eleventy",
|
||||
"slug": "eleventy",
|
||||
"demo": "https://eleventy.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/eleventy.svg",
|
||||
"tagline": "11ty is a simpler static site generator written in JavaScript, created to be an alternative to Jekyll.",
|
||||
"description": "An Eleventy site, created with npm init.",
|
||||
"website": "https://www.11ty.dev",
|
||||
"sort": 4,
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@11ty\\/eleventy\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `npx @11ty/eleventy`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "npx @11ty/eleventy --serve --watch --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "_site"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Docusaurus 2",
|
||||
"slug": "docusaurus-2",
|
||||
"demo": "https://docusaurus-2.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/docusaurus.svg",
|
||||
"tagline": "Docusaurus makes it easy to maintain Open Source documentation websites.",
|
||||
"description": "A static Docusaurus site that makes it easy to maintain OSS documentation.",
|
||||
"website": "https://v2.docusaurus.io",
|
||||
"detectors": {
|
||||
"some": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@docusaurus\\/core\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `docusaurus build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "docusaurus start --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Docusaurus 1",
|
||||
"slug": "docusaurus",
|
||||
"demo": "https://docusaurus.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/docusaurus.svg",
|
||||
"tagline": "Docusaurus makes it easy to maintain Open Source documentation websites.",
|
||||
"description": "A static Docusaurus site that makes it easy to maintain OSS documentation.",
|
||||
"website": "https://docusaurus.io/",
|
||||
"detectors": {
|
||||
"some": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"docusaurus\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `docusaurus-build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "docusaurus-start --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Preact",
|
||||
"slug": "preact",
|
||||
"demo": "https://preact.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/preact.svg",
|
||||
"tagline": "Preact is a fast 3kB alternative to React with the same modern API.",
|
||||
"description": "A Preact app, created with the Preact CLI.",
|
||||
"website": "https://preactjs.com",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"preact-cli\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `preact build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "preact watch --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Dojo",
|
||||
"slug": "dojo",
|
||||
"demo": "https://dojo.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/dojo.png",
|
||||
"tagline": "Dojo is a modern progressive, TypeScript first framework.",
|
||||
"description": "A Dojo app, created with the Dojo CLI's cli-create-app command.",
|
||||
"website": "https://dojo.io",
|
||||
"detectors": {
|
||||
"some": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@dojo\\/framework\":\\s*\".+?\"[^}]*}"
|
||||
},
|
||||
{
|
||||
"path": ".dojorc"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `dojo build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "dojo build -m dev -w -s -p $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "output/dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ember.js",
|
||||
"slug": "ember",
|
||||
"demo": "https://ember.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/ember.svg",
|
||||
"tagline": "Ember.js helps webapp developers be more productive out of the box.",
|
||||
"description": "An Ember app, created with the Ember CLI.",
|
||||
"website": "https://emberjs.com/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"ember-cli\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `ember build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "ember serve --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Vue.js",
|
||||
"slug": "vue",
|
||||
"demo": "https://vue.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/vue.svg",
|
||||
"tagline": "Vue.js is a versatile JavaScript framework that is as approachable as it is performant.",
|
||||
"description": "A Vue.js app, created with the Vue CLI.",
|
||||
"website": "https://vuejs.org",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@vue\\/cli-service\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `vue-cli-service build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "vue-cli-service serve --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Scully",
|
||||
"slug": "scully",
|
||||
"demo": "https://scully.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/scullyio-logo.png",
|
||||
"tagline": "Scully is a static site generator for Angular.",
|
||||
"description": "The Static Site Generator for Angular apps.",
|
||||
"website": "https://github.com/scullyio/scully",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@scullyio\\/init\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `ng build && scully`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "ng serve --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ionic Angular",
|
||||
"slug": "ionic-angular",
|
||||
"demo": "https://ionic-angular.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/ionic.svg",
|
||||
"tagline": "Ionic Angular allows you to build mobile PWAs with Angular and the Ionic Framework.",
|
||||
"description": "An Ionic Angular site, created with the Ionic CLI.",
|
||||
"website": "https://ionicframework.com",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@ionic\\/angular\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `ng build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "ng start"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "www"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Angular",
|
||||
"slug": "angular",
|
||||
"demo": "https://angular.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/angular.svg",
|
||||
"tagline": "Angular is a TypeScript-based cross-platform framework from Google.",
|
||||
"description": "An Angular app, created with the Angular CLI.",
|
||||
"website": "https://angular.io",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@angular\\/cli\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `ng build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "ng serve --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Polymer",
|
||||
"slug": "polymer",
|
||||
"demo": "https://polymer.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/polymer.svg",
|
||||
"tagline": "Polymer is an open-source webapps library from Google, for building using Web Components.",
|
||||
"description": "A Polymer app, created with the Polymer CLI.",
|
||||
"website": "https://www.polymer-project.org/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"polymer-cli\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `polymer build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "polymer serve --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Svelte",
|
||||
"slug": "svelte",
|
||||
"demo": "https://svelte.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/svelte.svg",
|
||||
"tagline": "Svelte lets you write high performance reactive apps with significantly less boilerplate. ",
|
||||
"description": "A Svelte app, using the Svelte template, and a Serverless Function API.",
|
||||
"website": "https://svelte.dev",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"sirv-cli\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `rollup -c`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "sirv public --single --dev --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "public"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Ionic React",
|
||||
"slug": "ionic-react",
|
||||
"demo": "https://ionic-react.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/ionic.svg",
|
||||
"tagline": "Ionic React allows you to build mobile PWAs with React and the Ionic Framework.",
|
||||
"description": "An Ionic React site, created with the Ionic CLI.",
|
||||
"website": "https://ionicframework.com",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@ionic\\/react\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `react-scripts build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "react-scripts start"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Create React App",
|
||||
"slug": "create-react-app",
|
||||
"demo": "https://react-functions.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/react.svg",
|
||||
"tagline": "Create React App allows you to get going with React in no time.",
|
||||
"description": "A React app, bootstrapped with create-react-app, and a Serverless Function API.",
|
||||
"website": "https://create-react-app.dev",
|
||||
"detectors": {
|
||||
"some": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"react-scripts\":\\s*\".+?\"[^}]*}"
|
||||
},
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"react-dev-utils\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `react-scripts build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "react-scripts start"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Gridsome",
|
||||
"slug": "gridsome",
|
||||
"demo": "https://gridsome.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/gridsome.svg",
|
||||
"tagline": "Gridsome is a Vue.js-powered framework for building websites & apps that are fast by default.",
|
||||
"description": "A Gridsome app, created with the Gridsome CLI.",
|
||||
"website": "https://gridsome.org/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"gridsome\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `gridsome build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "gridsome develop -p $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "UmiJS",
|
||||
"slug": "umijs",
|
||||
"demo": "https://umijs.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/umi.svg",
|
||||
"tagline": "UmiJS is an extensible enterprise-level React application framework.",
|
||||
"description": "An UmiJS app, created using the Umi CLI.",
|
||||
"website": "https://umijs.org",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"umi\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `umi build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "umi dev --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Sapper",
|
||||
"slug": "sapper",
|
||||
"demo": "https://sapper.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/svelte.svg",
|
||||
"tagline": "Sapper is a framework for building high-performance universal web apps with Svelte.",
|
||||
"description": "A Sapper app, using the Sapper template.",
|
||||
"website": "https://sapper.svelte.dev",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"sapper\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `sapper export`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "sapper dev --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "__sapper__/export"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Saber",
|
||||
"slug": "saber",
|
||||
"demo": "https://saber.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/saber.svg",
|
||||
"tagline": "Saber is a framework for building static sites in Vue.js that supports data from any source.",
|
||||
"description": "A Saber site, created with npm init.",
|
||||
"website": "https://saber.land/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"saber\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `saber build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "saber --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "public"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Stencil",
|
||||
"slug": "stencil",
|
||||
"demo": "https://stencil.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/stencil.svg",
|
||||
"tagline": "Stencil is a powerful toolchain for building Progressive Web Apps and Design Systems.",
|
||||
"description": "A Stencil site, created with the Stencil CLI.",
|
||||
"website": "https://stenciljs.com/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@stencil\\/core\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `stencil build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "stencil build --dev --watch --serve --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "www"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Nuxt.js",
|
||||
"slug": "nuxtjs",
|
||||
"demo": "https://nuxtjs.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/nuxt.svg",
|
||||
"tagline": "Nuxt.js is the web comprehensive framework that lets you dream big with Vue.js.",
|
||||
"description": "A Nuxt.js app, bootstrapped with create-nuxt-app.",
|
||||
"website": "https://nuxtjs.org",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"nuxt(-edge)?\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `nuxt generate`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "nuxt"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "RedwoodJS",
|
||||
"slug": "redwoodjs",
|
||||
"demo": "https://redwoodjs.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/redwoodjs.svg",
|
||||
"tagline": "RedwoodJS is a full-stack framework for the Jamstack.",
|
||||
"description": "A RedwoodJS app, bootstraped with create-redwood-app.",
|
||||
"website": "https://redwoodjs.com",
|
||||
"useRuntime": { "src": "package.json", "use": "@vercel/redwood" },
|
||||
"ignoreRuntimes": ["@vercel/node"],
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "package.json",
|
||||
"matchContent": "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"@redwoodjs\\/core\":\\s*\".+?\"[^}]*}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"value": "yarn rw build && yarn rw db up --no-db-client --auto-approve && yarn rw dataMigrate up"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "yarn rw dev --fwd=\"--port=$PORT --open=false\""
|
||||
},
|
||||
"outputDirectory": {
|
||||
"placeholder": "RedwoodJS default"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Hugo",
|
||||
"slug": "hugo",
|
||||
"demo": "https://hugo.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/hugo.svg",
|
||||
"tagline": "Hugo is the world’s fastest framework for building websites, written in Go.",
|
||||
"description": "A Hugo site, created with the Hugo CLI.",
|
||||
"website": "https://gohugo.io",
|
||||
"sort": 5,
|
||||
"detectors": {
|
||||
"some": [
|
||||
{
|
||||
"path": "config.yaml"
|
||||
},
|
||||
{
|
||||
"path": "config.toml"
|
||||
},
|
||||
{
|
||||
"path": "config.json"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "None"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `hugo -D --gc`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "hugo server -D -w -p $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"placeholder": "`public` or `publishDir` from the `config` file"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Jekyll",
|
||||
"slug": "jekyll",
|
||||
"demo": "https://jekyll.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/jekyll.svg",
|
||||
"tagline": "Jekyll makes it super easy to transform your plain text into static websites and blogs.",
|
||||
"description": "A Jekyll site, created with the Jekyll CLI.",
|
||||
"website": "https://jekyllrb.com/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "_config.yml"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"value": "bundle install"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `jekyll build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "bundle exec jekyll serve --watch --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"placeholder": "`_site` or `destination` from `_config.yml`"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Brunch",
|
||||
"slug": "brunch",
|
||||
"demo": "https://brunch.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/brunch.svg",
|
||||
"tagline": "Brunch is a fast and simple webapp build tool with seamless incremental compilation for rapid development.",
|
||||
"description": "A Brunch app, created with the Brunch CLI.",
|
||||
"website": "https://brunch.io/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "brunch-config.js"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run build` or `brunch build --production`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "brunch watch --server --port $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "public"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Middleman",
|
||||
"slug": "middleman",
|
||||
"demo": "https://middleman.now-examples.now.sh",
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/middleman.svg",
|
||||
"tagline": "Middleman is a static site generator that uses all the shortcuts and tools in modern web development.",
|
||||
"description": "A Middleman app, created with the Middleman CLI.",
|
||||
"website": "https://middlemanapp.com/",
|
||||
"detectors": {
|
||||
"every": [
|
||||
{
|
||||
"path": "config.rb"
|
||||
}
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"value": "bundle install"
|
||||
},
|
||||
"buildCommand": {
|
||||
"value": "`npm run build` or `bundle exec middleman build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"value": "bundle exec middleman server -p $PORT"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"value": "build"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Other",
|
||||
"slug": null,
|
||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/other.svg",
|
||||
"description": "No framework or a unoptimized framework.",
|
||||
"settings": {
|
||||
"installCommand": {
|
||||
"placeholder": "`yarn install` or `npm install`"
|
||||
},
|
||||
"buildCommand": {
|
||||
"placeholder": "`npm run vercel-build` or `npm run build`"
|
||||
},
|
||||
"devCommand": {
|
||||
"placeholder": "None"
|
||||
},
|
||||
"outputDirectory": {
|
||||
"placeholder": "`public` if it exists, or `.`"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
38
packages/frameworks/index.d.ts
vendored
38
packages/frameworks/index.d.ts
vendored
@@ -1,38 +0,0 @@
|
||||
export interface FrameworkDetectionItem {
|
||||
path: string;
|
||||
matchContent?: string;
|
||||
}
|
||||
|
||||
export interface SettingPlaceholder {
|
||||
placeholder: string;
|
||||
}
|
||||
export interface SettingValue {
|
||||
value: string;
|
||||
}
|
||||
export type Setting = SettingValue | SettingPlaceholder;
|
||||
|
||||
export interface Framework {
|
||||
name: string;
|
||||
slug: string | null;
|
||||
logo: string;
|
||||
demo?: string;
|
||||
tagline?: string;
|
||||
website?: string;
|
||||
description: string;
|
||||
sort?: number;
|
||||
useRuntime?: { src: string; use: string };
|
||||
ignoreRuntimes?: string[];
|
||||
detectors?: {
|
||||
every?: FrameworkDetectionItem[];
|
||||
some?: FrameworkDetectionItem[];
|
||||
};
|
||||
settings: {
|
||||
buildCommand: Setting;
|
||||
devCommand: Setting;
|
||||
outputDirectory: Setting;
|
||||
};
|
||||
recommendedIntegrations?: {
|
||||
id: string;
|
||||
dependencies: string[];
|
||||
}[];
|
||||
}
|
||||
BIN
packages/frameworks/logos/zola.png
Normal file
BIN
packages/frameworks/logos/zola.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
@@ -1,14 +1,26 @@
|
||||
{
|
||||
"name": "@vercel/frameworks",
|
||||
"version": "0.2.0",
|
||||
"main": "frameworks.json",
|
||||
"version": "0.2.1-canary.5",
|
||||
"main": "./dist/frameworks.js",
|
||||
"types": "./dist/frameworks.d.ts",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"license": "UNLICENSED",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test-unit": "jest --env node --verbose --runInBand --bail"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iarna/toml": "2.2.3",
|
||||
"js-yaml": "3.13.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "24.0.22",
|
||||
"@types/js-yaml": "3.12.1",
|
||||
"@types/node": "12.0.4",
|
||||
"@types/node-fetch": "2.5.8",
|
||||
"@vercel/routing-utils": "1.9.3-canary.0",
|
||||
"ajv": "6.12.2",
|
||||
"jest": "24.9.0",
|
||||
"ts-jest": "24.1.0",
|
||||
|
||||
1565
packages/frameworks/src/frameworks.ts
Normal file
1565
packages/frameworks/src/frameworks.ts
Normal file
File diff suppressed because it is too large
Load Diff
41
packages/frameworks/src/read-config-file.ts
Normal file
41
packages/frameworks/src/read-config-file.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import yaml from 'js-yaml';
|
||||
import toml from '@iarna/toml';
|
||||
import { promises } from 'fs';
|
||||
|
||||
const { readFile } = promises;
|
||||
|
||||
async function readFileOrNull(file: string) {
|
||||
try {
|
||||
const data = await readFile(file);
|
||||
return data;
|
||||
} catch (err) {
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export async function readConfigFile<T>(
|
||||
files: string | string[]
|
||||
): Promise<T | null> {
|
||||
files = Array.isArray(files) ? files : [files];
|
||||
|
||||
for (const name of files) {
|
||||
const data = await readFileOrNull(name);
|
||||
|
||||
if (data) {
|
||||
const str = data.toString('utf8');
|
||||
if (name.endsWith('.json')) {
|
||||
return JSON.parse(str) as T;
|
||||
} else if (name.endsWith('.toml')) {
|
||||
return (toml.parse(str) as unknown) as T;
|
||||
} else if (name.endsWith('.yaml') || name.endsWith('.yml')) {
|
||||
return yaml.safeLoad(str, { filename: name }) as T;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
179
packages/frameworks/src/types.ts
Normal file
179
packages/frameworks/src/types.ts
Normal file
@@ -0,0 +1,179 @@
|
||||
import { Route } from '@vercel/routing-utils';
|
||||
|
||||
export interface FrameworkDetectionItem {
|
||||
/**
|
||||
* A file path
|
||||
* @example "package.json"
|
||||
*/
|
||||
path: string;
|
||||
/**
|
||||
* A matcher
|
||||
* @example "\"(dev)?(d|D)ependencies\":\\s*{[^}]*\"next\":\\s*\".+?\"[^}]*}"
|
||||
*/
|
||||
matchContent?: string;
|
||||
}
|
||||
|
||||
export interface SettingPlaceholder {
|
||||
/**
|
||||
* A placeholder value for when the framework has not a predefined one
|
||||
* @example "`npm run build` or `next build`"
|
||||
*/
|
||||
placeholder: string;
|
||||
}
|
||||
|
||||
export interface SettingValue {
|
||||
/**
|
||||
* A predefined setting for the detected framework
|
||||
* @example "next dev --port $PORT"
|
||||
*/
|
||||
value: string;
|
||||
}
|
||||
|
||||
export type Setting = SettingValue | SettingPlaceholder;
|
||||
|
||||
/**
|
||||
* Framework detection information.
|
||||
*/
|
||||
export interface Framework {
|
||||
/**
|
||||
* Name of the framework
|
||||
* @example "Next.js"
|
||||
*/
|
||||
name: string;
|
||||
/**
|
||||
* A unique identifier for the framework
|
||||
* @example "nextjs"
|
||||
*/
|
||||
slug: string | null;
|
||||
/**
|
||||
* A URL to the logo of the framework
|
||||
* @example "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/next.svg"
|
||||
*/
|
||||
logo: string;
|
||||
/**
|
||||
* A URL to a deployed example of the framework
|
||||
* @example "https://nextjs.now-examples.vercel.app"
|
||||
*/
|
||||
demo?: string;
|
||||
/**
|
||||
* A marketing tagline for the framework
|
||||
* @example "Next.js makes you productive with React instantly — whether you want to build static or dynamic sites."
|
||||
*/
|
||||
tagline?: string;
|
||||
/**
|
||||
* A URL to the official website of the framework
|
||||
* @example "https://nextjs.org"
|
||||
*/
|
||||
website?: string;
|
||||
/**
|
||||
* Short description of the framework
|
||||
* @example "A Next.js app and a Serverless Function API."
|
||||
*/
|
||||
description: string;
|
||||
/**
|
||||
* A ponderated value to sort matching frameworks
|
||||
* @example 1
|
||||
*/
|
||||
sort?: number;
|
||||
/**
|
||||
* Runtime configuration required to run the framework in Vercel
|
||||
*/
|
||||
useRuntime?: {
|
||||
/**
|
||||
* Runtime source
|
||||
* @example "package.json"
|
||||
*/
|
||||
src: string;
|
||||
/**
|
||||
* Runtime
|
||||
* @example "@vercel/next"
|
||||
*/
|
||||
use: string;
|
||||
};
|
||||
ignoreRuntimes?: string[];
|
||||
/**
|
||||
* Detectors used to find out the framework
|
||||
*/
|
||||
detectors?: {
|
||||
/**
|
||||
* Collection of detectors that must be matched for the framework
|
||||
* to be detected.
|
||||
*/
|
||||
every?: FrameworkDetectionItem[];
|
||||
/**
|
||||
* Collection of detectors where one match triggers the framework
|
||||
* to be detected.
|
||||
*/
|
||||
some?: FrameworkDetectionItem[];
|
||||
};
|
||||
settings: {
|
||||
/**
|
||||
* Default Install Command or a placeholder
|
||||
*/
|
||||
installCommand: Setting;
|
||||
/**
|
||||
* Default Build Command or a placeholder
|
||||
*/
|
||||
buildCommand: Setting;
|
||||
/**
|
||||
* Default Development Command or a placeholder
|
||||
*/
|
||||
devCommand: Setting;
|
||||
/**
|
||||
* Default Output Directory
|
||||
*/
|
||||
outputDirectory: Setting;
|
||||
};
|
||||
/**
|
||||
* A list of recommended integrations for the framework
|
||||
*/
|
||||
recommendedIntegrations?: {
|
||||
/**
|
||||
* Id of the recommended integration
|
||||
* @example "oac_5lUsiANun1DEzgLg0NZx5Es3"
|
||||
*/
|
||||
id: string;
|
||||
/**
|
||||
* Dependencies of the recommended integration
|
||||
* @example ["next-plugin-sentry", "next-sentry-source-maps"]
|
||||
*/
|
||||
dependencies: string[];
|
||||
}[];
|
||||
/**
|
||||
* Name of a dependency in `package.json` to detect this framework.
|
||||
* @example "hexo"
|
||||
*/
|
||||
dependency?: string;
|
||||
/**
|
||||
* Function that returns the name of the directory that the framework outputs
|
||||
* its build results to. In some cases this is read from a configuration file.
|
||||
*/
|
||||
getOutputDirName: (dirPrefix: string) => Promise<string>;
|
||||
/**
|
||||
* An array (or a function that returns an array) of default `Route` rules that
|
||||
* the framework uses.
|
||||
* @example [{ handle: 'filesystem' }, { src: '.*', status: 404, dest: '404.html' }]
|
||||
*/
|
||||
defaultRoutes?: Route[] | ((dirPrefix: string) => Promise<Route[]>);
|
||||
/**
|
||||
* A glob string of files to cache for future deployments.
|
||||
* @example ".cache/**"
|
||||
*/
|
||||
cachePattern?: string;
|
||||
/**
|
||||
* The default build command for the framework.
|
||||
* @example "next build"
|
||||
*/
|
||||
buildCommand: string | null;
|
||||
/**
|
||||
* The default development command for the framework.
|
||||
* @example "next dev"
|
||||
*/
|
||||
devCommand: string | null;
|
||||
/**
|
||||
* The default version of the framework command that is available within the
|
||||
* build image. Usually an environment variable can be set to override this.
|
||||
* @example "0.13.0"
|
||||
*/
|
||||
defaultVersion?: string;
|
||||
}
|
||||
58
packages/frameworks/test/frameworks.unit.test.ts
vendored
58
packages/frameworks/test/frameworks.unit.test.ts
vendored
@@ -1,9 +1,11 @@
|
||||
import Ajv from 'ajv';
|
||||
import assert from 'assert';
|
||||
import { join } from 'path';
|
||||
import { existsSync } from 'fs';
|
||||
import { isString } from 'util';
|
||||
import { Framework } from '../';
|
||||
const frameworkList = require('../frameworks.json') as Framework[];
|
||||
import fetch from 'node-fetch';
|
||||
import { URL, URLSearchParams } from 'url';
|
||||
import frameworkList from '../src/frameworks';
|
||||
|
||||
const SchemaFrameworkDetectionItem = {
|
||||
type: 'array',
|
||||
@@ -53,8 +55,15 @@ const Schema = {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
required: ['name', 'slug', 'logo', 'description', 'settings'],
|
||||
additionalProperties: false,
|
||||
required: [
|
||||
'name',
|
||||
'slug',
|
||||
'logo',
|
||||
'description',
|
||||
'settings',
|
||||
'buildCommand',
|
||||
'devCommand',
|
||||
],
|
||||
properties: {
|
||||
name: { type: 'string' },
|
||||
slug: { type: ['string', 'null'] },
|
||||
@@ -122,10 +131,25 @@ const Schema = {
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
dependency: { type: 'string' },
|
||||
cachePattern: { type: 'string' },
|
||||
buildCommand: { type: ['string', 'null'] },
|
||||
devCommand: { type: ['string', 'null'] },
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
async function getDeployment(host: string) {
|
||||
const query = new URLSearchParams();
|
||||
query.set('url', host);
|
||||
const res = await fetch(
|
||||
`https://api.vercel.com/v11/deployments/get?${query}`
|
||||
);
|
||||
const body = await res.json();
|
||||
return body;
|
||||
}
|
||||
|
||||
describe('frameworks', () => {
|
||||
it('ensure there is an example for every framework', async () => {
|
||||
const root = join(__dirname, '..', '..', '..');
|
||||
@@ -173,4 +197,30 @@ describe('frameworks', () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('ensure unique slug', async () => {
|
||||
const slugs = new Set<string>();
|
||||
for (const { slug } of frameworkList) {
|
||||
if (typeof slug === 'string') {
|
||||
assert(!slugs.has(slug), `Slug "${slug}" is not unique`);
|
||||
slugs.add(slug);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('ensure all demo URLs are "public"', async () => {
|
||||
await Promise.all(
|
||||
frameworkList
|
||||
.filter(f => typeof f.demo === 'string')
|
||||
.map(async f => {
|
||||
const url = new URL(f.demo!);
|
||||
const deployment = await getDeployment(url.hostname);
|
||||
assert.equal(
|
||||
deployment.public,
|
||||
true,
|
||||
`Demo URL ${f.demo} is not "public"`
|
||||
);
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
"strict": true,
|
||||
"target": "esnext"
|
||||
},
|
||||
"include": ["src/**/*", "test/**/*"],
|
||||
"include": ["src/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
||||
30
packages/now-build-utils/build.js
Normal file
30
packages/now-build-utils/build.js
Normal file
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env node
|
||||
const fs = require('fs-extra');
|
||||
const execa = require('execa');
|
||||
const { join } = require('path');
|
||||
|
||||
async function main() {
|
||||
const outDir = join(__dirname, 'dist');
|
||||
|
||||
// Start fresh
|
||||
await fs.remove(outDir);
|
||||
|
||||
// Compile TypeScript
|
||||
await execa('tsc', [], { stdio: 'inherit' });
|
||||
|
||||
// Run `ncc`
|
||||
const mainDir = join(outDir, 'main');
|
||||
await execa('ncc', ['build', 'src/index.ts', '-o', mainDir], {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
// Move compiled ncc file to out dir
|
||||
await fs.rename(join(mainDir, 'index.js'), join(outDir, 'index.js'));
|
||||
|
||||
// Delete leftover "main" dir
|
||||
await fs.remove(mainDir);
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
out="dist"
|
||||
|
||||
rm -rf "$out"
|
||||
|
||||
tsc
|
||||
|
||||
rm "$out/index.js"
|
||||
ncc build "src/index.ts" -o "$out/main"
|
||||
mv "$out/main/index.js" "$out/index.js"
|
||||
rm -rf "$out/main"
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/build-utils",
|
||||
"version": "2.7.0",
|
||||
"version": "2.9.1-canary.5",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.js",
|
||||
@@ -11,10 +11,10 @@
|
||||
"directory": "packages/now-build-utils"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "./build.sh",
|
||||
"build": "node build",
|
||||
"test-unit": "jest --env node --verbose --runInBand --bail test/unit.*test.*",
|
||||
"test-integration-once": "jest --env node --verbose --runInBand --bail test/integration.test.js",
|
||||
"prepublishOnly": "./build.sh"
|
||||
"prepublishOnly": "node build"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iarna/toml": "2.2.3",
|
||||
@@ -29,7 +29,7 @@
|
||||
"@types/node-fetch": "^2.1.6",
|
||||
"@types/semver": "6.0.0",
|
||||
"@types/yazl": "^2.4.1",
|
||||
"@vercel/frameworks": "0.2.0",
|
||||
"@vercel/frameworks": "0.2.1-canary.5",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"aggregate-error": "3.0.1",
|
||||
"async-retry": "1.2.3",
|
||||
|
||||
@@ -2,10 +2,9 @@ import minimatch from 'minimatch';
|
||||
import { valid as validSemver } from 'semver';
|
||||
import { parse as parsePath, extname } from 'path';
|
||||
import { Route, Source } from '@vercel/routing-utils';
|
||||
import _frameworks, { Framework } from '@vercel/frameworks';
|
||||
import frameworkList, { Framework } from '@vercel/frameworks';
|
||||
import { PackageJson, Builder, Config, BuilderFunctions } from './types';
|
||||
import { isOfficialRuntime } from './';
|
||||
const frameworkList = _frameworks as Framework[];
|
||||
const slugToFramework = new Map<string | null, Framework>(
|
||||
frameworkList.map(f => [f.slug, f])
|
||||
);
|
||||
|
||||
@@ -3,7 +3,7 @@ import { DetectorFilesystem } from './detectors/filesystem';
|
||||
|
||||
export interface DetectFrameworkOptions {
|
||||
fs: DetectorFilesystem;
|
||||
frameworkList: Framework[];
|
||||
frameworkList: readonly Framework[];
|
||||
}
|
||||
|
||||
async function matches(fs: DetectorFilesystem, framework: Framework) {
|
||||
|
||||
@@ -4,28 +4,34 @@ import { NodeVersion } from '../types';
|
||||
import { NowBuildError } from '../errors';
|
||||
import debug from '../debug';
|
||||
|
||||
const allOptions: NodeVersion[] = [
|
||||
const allOptions = [
|
||||
{ major: 14, range: '14.x', runtime: 'nodejs14.x' },
|
||||
{ major: 12, range: '12.x', runtime: 'nodejs12.x' },
|
||||
{ major: 10, range: '10.x', runtime: 'nodejs10.x' },
|
||||
{
|
||||
major: 10,
|
||||
range: '10.x',
|
||||
runtime: 'nodejs10.x',
|
||||
discontinueDate: new Date('2021-03-30'),
|
||||
},
|
||||
{
|
||||
major: 8,
|
||||
range: '8.10.x',
|
||||
runtime: 'nodejs8.10',
|
||||
discontinueDate: new Date('2020-01-06'),
|
||||
},
|
||||
];
|
||||
] as const;
|
||||
|
||||
const pleaseSet =
|
||||
'Please set "engines": { "node": "' +
|
||||
'Please change your Project Settings or set "engines": { "node": "' +
|
||||
getLatestNodeVersion().range +
|
||||
'" } in your `package.json` file to upgrade to Node.js ' +
|
||||
'" } in your `package.json` file to use Node.js ' +
|
||||
getLatestNodeVersion().major +
|
||||
'.';
|
||||
const upstreamProvider =
|
||||
'This change is the result of a decision made by an upstream infrastructure provider (AWS).' +
|
||||
'\nRead more: https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html';
|
||||
|
||||
export function getLatestNodeVersion(): NodeVersion {
|
||||
export function getLatestNodeVersion() {
|
||||
return allOptions[0];
|
||||
}
|
||||
|
||||
@@ -37,7 +43,7 @@ export async function getSupportedNodeVersion(
|
||||
engineRange?: string,
|
||||
isAuto?: boolean
|
||||
): Promise<NodeVersion> {
|
||||
let selection = getLatestNodeVersion();
|
||||
let selection: NodeVersion = getLatestNodeVersion();
|
||||
|
||||
if (engineRange) {
|
||||
const found =
|
||||
|
||||
@@ -165,8 +165,8 @@ export function getSpawnOptions(
|
||||
export async function getNodeVersion(
|
||||
destPath: string,
|
||||
_nodeVersion?: string,
|
||||
_config?: Config,
|
||||
meta?: Meta
|
||||
config: Config = {},
|
||||
meta: Meta = {}
|
||||
): Promise<NodeVersion> {
|
||||
if (meta && meta.isDev) {
|
||||
// Use the system-installed version of `node` in PATH for `vercel dev`
|
||||
@@ -174,13 +174,22 @@ export async function getNodeVersion(
|
||||
return { ...latest, runtime: 'nodejs' };
|
||||
}
|
||||
const { packageJson } = await scanParentDirs(destPath, true);
|
||||
let range: string | undefined;
|
||||
let { nodeVersion } = config;
|
||||
let isAuto = true;
|
||||
if (packageJson && packageJson.engines && packageJson.engines.node) {
|
||||
range = packageJson.engines.node;
|
||||
if (
|
||||
nodeVersion &&
|
||||
nodeVersion !== packageJson.engines.node &&
|
||||
!meta.isDev
|
||||
) {
|
||||
console.warn(
|
||||
'Warning: Due to `engines` existing in your `package.json` file, the Node.js Version defined in your Project Settings will not apply. Learn More: http://vercel.link/node-version'
|
||||
);
|
||||
}
|
||||
nodeVersion = packageJson.engines.node;
|
||||
isAuto = false;
|
||||
}
|
||||
return getSupportedNodeVersion(range, isAuto);
|
||||
return getSupportedNodeVersion(nodeVersion, isAuto);
|
||||
}
|
||||
|
||||
async function scanParentDirs(destPath: string, readPackageJson = false) {
|
||||
@@ -394,7 +403,7 @@ export async function runPackageJsonScript(
|
||||
});
|
||||
} else {
|
||||
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
|
||||
const env: typeof process.env = { ...spawnOpts?.env };
|
||||
const env: typeof process.env = { ...process.env, ...spawnOpts?.env };
|
||||
if (!env.YARN_NODE_LINKER) {
|
||||
env.YARN_NODE_LINKER = 'node-modules';
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/env.txt
|
||||
/node_modules/
|
||||
/public/build/
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
"scripts": {
|
||||
"build": "rollup -c",
|
||||
"dev": "rollup -c -w",
|
||||
"start": "sirv public"
|
||||
"start": "sirv public",
|
||||
"env": "echo \"$PATH\" > env.txt"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-commonjs": "^12.0.0",
|
||||
|
||||
@@ -39,7 +39,7 @@ for (const fixture of fs.readdirSync(fixturesPath)) {
|
||||
|
||||
// few foreign tests
|
||||
|
||||
const buildersToTestWith = ['now-next', 'now-node', 'now-static-build'];
|
||||
const buildersToTestWith = ['now-node'];
|
||||
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const builder of buildersToTestWith) {
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"private": true,
|
||||
"engines": {
|
||||
"node": "14.x"
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,6 @@
|
||||
import path from 'path';
|
||||
import { readFileSync } from 'fs-extra';
|
||||
import { Framework } from '@vercel/frameworks';
|
||||
import frameworkList from '@vercel/frameworks';
|
||||
import { detectFramework, DetectorFilesystem } from '../src';
|
||||
|
||||
const frameworkList = JSON.parse(
|
||||
readFileSync(
|
||||
path.join(__dirname, '..', '..', 'frameworks', 'frameworks.json')
|
||||
).toString()
|
||||
) as Framework[];
|
||||
|
||||
class VirtualFilesystem extends DetectorFilesystem {
|
||||
private files: Map<string, Buffer>;
|
||||
|
||||
@@ -98,7 +90,7 @@ describe('#detectFramework', () => {
|
||||
|
||||
it('Detect Hugo #1', async () => {
|
||||
const fs = new VirtualFilesystem({
|
||||
'config.yaml': 'config',
|
||||
'config.yaml': 'baseURL: http://example.org/',
|
||||
'content/post.md': '# hello world',
|
||||
});
|
||||
|
||||
@@ -107,7 +99,7 @@ describe('#detectFramework', () => {
|
||||
|
||||
it('Detect Hugo #2', async () => {
|
||||
const fs = new VirtualFilesystem({
|
||||
'config.json': 'config',
|
||||
'config.json': '{ "baseURL": "http://example.org/" }',
|
||||
'content/post.md': '# hello world',
|
||||
});
|
||||
|
||||
@@ -116,7 +108,7 @@ describe('#detectFramework', () => {
|
||||
|
||||
it('Detect Hugo #3', async () => {
|
||||
const fs = new VirtualFilesystem({
|
||||
'config.toml': 'config',
|
||||
'config.toml': 'baseURL = "http://example.org/"',
|
||||
'content/post.md': '# hello world',
|
||||
});
|
||||
|
||||
@@ -151,4 +143,12 @@ describe('#detectFramework', () => {
|
||||
|
||||
expect(await detectFramework({ fs, frameworkList })).toBe('scully');
|
||||
});
|
||||
|
||||
it('Detect Zola', async () => {
|
||||
const fs = new VirtualFilesystem({
|
||||
'config.toml': 'base_url = "/"',
|
||||
});
|
||||
|
||||
expect(await detectFramework({ fs, frameworkList })).toBe('zola');
|
||||
});
|
||||
});
|
||||
|
||||
88
packages/now-build-utils/test/unit.test.js
vendored
88
packages/now-build-utils/test/unit.test.js
vendored
@@ -1,3 +1,4 @@
|
||||
const ms = require('ms');
|
||||
const path = require('path');
|
||||
const fs = require('fs-extra');
|
||||
const assert = require('assert').strict;
|
||||
@@ -8,6 +9,8 @@ const {
|
||||
getNodeVersion,
|
||||
getLatestNodeVersion,
|
||||
getDiscontinuedNodeVersions,
|
||||
runNpmInstall,
|
||||
runPackageJsonScript,
|
||||
} = require('../dist');
|
||||
|
||||
async function expectBuilderError(promise, pattern) {
|
||||
@@ -24,6 +27,19 @@ async function expectBuilderError(promise, pattern) {
|
||||
);
|
||||
}
|
||||
|
||||
let warningMessages;
|
||||
const originalConsoleWarn = console.warn;
|
||||
beforeEach(() => {
|
||||
warningMessages = [];
|
||||
console.warn = m => {
|
||||
warningMessages.push(m);
|
||||
};
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
console.warn = originalConsoleWarn;
|
||||
});
|
||||
|
||||
it('should re-create symlinks properly', async () => {
|
||||
if (process.platform === 'win32') {
|
||||
console.log('Skipping test on windows');
|
||||
@@ -81,6 +97,10 @@ it('should only match supported node versions', async () => {
|
||||
'major',
|
||||
12
|
||||
);
|
||||
expect(await getSupportedNodeVersion('14.x', false)).toHaveProperty(
|
||||
'major',
|
||||
14
|
||||
);
|
||||
expect(getSupportedNodeVersion('8.11.x', false)).rejects.toThrow();
|
||||
expect(getSupportedNodeVersion('6.x', false)).rejects.toThrow();
|
||||
expect(getSupportedNodeVersion('999.x', false)).rejects.toThrow();
|
||||
@@ -104,6 +124,10 @@ it('should only match supported node versions', async () => {
|
||||
'major',
|
||||
12
|
||||
);
|
||||
expect(await getSupportedNodeVersion('14.x', true)).toHaveProperty(
|
||||
'major',
|
||||
14
|
||||
);
|
||||
const foundMessage = /Found `engines` in `package\.json` with an invalid Node\.js version range/;
|
||||
await expectBuilderError(
|
||||
getSupportedNodeVersion('8.11.x', false),
|
||||
@@ -125,8 +149,8 @@ it('should match all semver ranges', async () => {
|
||||
// See https://docs.npmjs.com/files/package.json#engines
|
||||
expect(await getSupportedNodeVersion('10.0.0')).toHaveProperty('major', 10);
|
||||
expect(await getSupportedNodeVersion('10.x')).toHaveProperty('major', 10);
|
||||
expect(await getSupportedNodeVersion('>=10')).toHaveProperty('major', 12);
|
||||
expect(await getSupportedNodeVersion('>=10.3.0')).toHaveProperty('major', 12);
|
||||
expect(await getSupportedNodeVersion('>=10')).toHaveProperty('major', 14);
|
||||
expect(await getSupportedNodeVersion('>=10.3.0')).toHaveProperty('major', 14);
|
||||
expect(await getSupportedNodeVersion('8.5.0 - 10.5.0')).toHaveProperty(
|
||||
'major',
|
||||
10
|
||||
@@ -150,20 +174,57 @@ it('should ignore node version in vercel dev getNodeVersion()', async () => {
|
||||
).toHaveProperty('runtime', 'nodejs');
|
||||
});
|
||||
|
||||
it('should select project setting from config when no package.json is found', async () => {
|
||||
expect(
|
||||
await getNodeVersion('/tmp', undefined, { nodeVersion: '14.x' }, {})
|
||||
).toHaveProperty('range', '14.x');
|
||||
expect(warningMessages).toStrictEqual([]);
|
||||
});
|
||||
|
||||
it('should prefer package.json engines over project setting from config and warn', async () => {
|
||||
expect(
|
||||
await getNodeVersion(
|
||||
path.join(__dirname, 'pkg-engine-node'),
|
||||
undefined,
|
||||
{ nodeVersion: '12.x' },
|
||||
{}
|
||||
)
|
||||
).toHaveProperty('range', '14.x');
|
||||
expect(warningMessages).toStrictEqual([
|
||||
'Warning: Due to `engines` existing in your `package.json` file, the Node.js Version defined in your Project Settings will not apply. Learn More: http://vercel.link/node-version',
|
||||
]);
|
||||
});
|
||||
|
||||
it('should not warn when package.json engines matches project setting from config', async () => {
|
||||
expect(
|
||||
await getNodeVersion(
|
||||
path.join(__dirname, 'pkg-engine-node'),
|
||||
undefined,
|
||||
{ nodeVersion: '14.x' },
|
||||
{}
|
||||
)
|
||||
).toHaveProperty('range', '14.x');
|
||||
expect(warningMessages).toStrictEqual([]);
|
||||
});
|
||||
|
||||
it('should get latest node version', async () => {
|
||||
expect(await getLatestNodeVersion()).toHaveProperty('major', 12);
|
||||
expect(await getLatestNodeVersion()).toHaveProperty('major', 14);
|
||||
});
|
||||
|
||||
it('should throw for discontinued versions', async () => {
|
||||
// Mock a future date so that Node 8 becomes discontinued
|
||||
const realDateNow = Date.now.bind(global.Date);
|
||||
global.Date.now = () => new Date('2020-02-14').getTime();
|
||||
global.Date.now = () => new Date('2021-04-01').getTime();
|
||||
|
||||
expect(getSupportedNodeVersion('8.10.x', false)).rejects.toThrow();
|
||||
expect(getSupportedNodeVersion('8.10.x', true)).rejects.toThrow();
|
||||
expect(getSupportedNodeVersion('10.x', false)).rejects.toThrow();
|
||||
expect(getSupportedNodeVersion('10.x', true)).rejects.toThrow();
|
||||
|
||||
expect(getDiscontinuedNodeVersions().length).toBe(1);
|
||||
expect(getDiscontinuedNodeVersions()[0]).toHaveProperty('range', '8.10.x');
|
||||
const discontinued = getDiscontinuedNodeVersions();
|
||||
expect(discontinued.length).toBe(2);
|
||||
expect(discontinued[0]).toHaveProperty('range', '10.x');
|
||||
expect(discontinued[1]).toHaveProperty('range', '8.10.x');
|
||||
|
||||
global.Date.now = realDateNow;
|
||||
});
|
||||
@@ -197,3 +258,18 @@ it('should support require by path for legacy builders', () => {
|
||||
expect(FileRef2).toBe(index.FileRef);
|
||||
expect(Lambda2).toBe(index.Lambda);
|
||||
});
|
||||
|
||||
it(
|
||||
'should have correct $PATH when running `runPackageJsonScript()` with yarn',
|
||||
async () => {
|
||||
const fixture = path.join(__dirname, 'fixtures', '19-yarn-v2');
|
||||
await runNpmInstall(fixture);
|
||||
await runPackageJsonScript(fixture, 'env');
|
||||
|
||||
// `yarn` was failing with ENOENT before, so as long as the
|
||||
// script was invoked at all is enough to verify the fix
|
||||
const out = await fs.readFile(path.join(fixture, 'env.txt'), 'utf8');
|
||||
expect(out.trim()).toBeTruthy();
|
||||
},
|
||||
ms('1m')
|
||||
);
|
||||
|
||||
25
packages/now-cgi/build.js
Normal file
25
packages/now-cgi/build.js
Normal file
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env node
|
||||
const execa = require('execa');
|
||||
const { join } = require('path');
|
||||
const { homedir } = require('os');
|
||||
|
||||
async function main() {
|
||||
process.env.GOOS = 'linux';
|
||||
process.env.GOARCH = 'amd64';
|
||||
process.env.GOPATH = join(homedir(), 'go');
|
||||
|
||||
await execa('go', ['get', 'github.com/aws/aws-lambda-go/events'], {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
await execa('go', ['get', 'github.com/aws/aws-lambda-go/lambda'], {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
await execa('go', ['build', '-o', 'handler', 'main.go'], {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
export GOOS=linux
|
||||
export GOARCH=amd64
|
||||
export GOPATH=$HOME/go
|
||||
go get github.com/aws/aws-lambda-go/events
|
||||
go get github.com/aws/aws-lambda-go/lambda
|
||||
go build -o handler main.go
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/cgi",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.7-canary.0",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -8,7 +8,8 @@
|
||||
"directory": "packages/now-cgi"
|
||||
},
|
||||
"scripts": {
|
||||
"prepublish": "./build.sh"
|
||||
"build": "node build",
|
||||
"prepublishOnly": "node build"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vercel",
|
||||
"version": "21.1.0",
|
||||
"version": "21.2.4-canary.7",
|
||||
"preferGlobal": true,
|
||||
"license": "Apache-2.0",
|
||||
"description": "The command-line interface for Vercel",
|
||||
@@ -61,11 +61,11 @@
|
||||
"node": ">= 10"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "2.7.0",
|
||||
"@vercel/go": "1.1.7",
|
||||
"@vercel/node": "1.9.0",
|
||||
"@vercel/python": "1.2.4",
|
||||
"@vercel/ruby": "1.2.5",
|
||||
"@vercel/build-utils": "2.9.1-canary.5",
|
||||
"@vercel/go": "1.1.9-canary.0",
|
||||
"@vercel/node": "1.9.1-canary.0",
|
||||
"@vercel/python": "1.2.5-canary.1",
|
||||
"@vercel/ruby": "1.2.6-canary.0",
|
||||
"update-notifier": "4.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -100,7 +100,7 @@
|
||||
"@types/universal-analytics": "0.4.2",
|
||||
"@types/which": "1.3.2",
|
||||
"@types/write-json-file": "2.2.1",
|
||||
"@vercel/frameworks": "0.2.0",
|
||||
"@vercel/frameworks": "0.2.1-canary.5",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"@zeit/fun": "0.11.2",
|
||||
"@zeit/source-map-support": "0.6.2",
|
||||
|
||||
@@ -2,7 +2,6 @@ import chalk from 'chalk';
|
||||
|
||||
import { handleError } from '../../util/error';
|
||||
|
||||
import createOutput from '../../util/output';
|
||||
import getArgs from '../../util/get-args';
|
||||
import getSubcommand from '../../util/get-subcommand';
|
||||
import logo from '../../util/output/logo';
|
||||
@@ -92,15 +91,14 @@ export default async function main(ctx) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
const output = createOutput({ debug: argv['--debug'] });
|
||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||
|
||||
switch (subcommand) {
|
||||
case 'ls':
|
||||
return ls(ctx, argv, args, output);
|
||||
return ls(ctx, argv, args);
|
||||
case 'rm':
|
||||
return rm(ctx, argv, args, output);
|
||||
return rm(ctx, argv, args);
|
||||
default:
|
||||
return set(ctx, argv, args, output);
|
||||
return set(ctx, argv, args);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,9 +10,10 @@ import strlen from '../../util/strlen.ts';
|
||||
import getCommandFlags from '../../util/get-command-flags';
|
||||
import { getCommandName } from '../../util/pkg-name.ts';
|
||||
|
||||
export default async function ls(ctx, opts, args, output) {
|
||||
export default async function ls(ctx, opts, args) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
@@ -23,6 +24,7 @@ export default async function ls(ctx, opts, args, output) {
|
||||
token,
|
||||
currentTeam,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
});
|
||||
let contextName = null;
|
||||
|
||||
@@ -47,9 +49,9 @@ export default async function ls(ctx, opts, args, output) {
|
||||
token,
|
||||
debug: debugEnabled,
|
||||
currentTeam,
|
||||
output,
|
||||
});
|
||||
const lsStamp = stamp();
|
||||
let cancelWait;
|
||||
|
||||
if (args.length > 0) {
|
||||
output.error(
|
||||
@@ -60,17 +62,13 @@ export default async function ls(ctx, opts, args, output) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
cancelWait = output.spinner(
|
||||
`Fetching aliases under ${chalk.bold(contextName)}`
|
||||
);
|
||||
output.spinner(`Fetching aliases under ${chalk.bold(contextName)}`);
|
||||
|
||||
const { aliases, pagination } = await getAliases(
|
||||
now,
|
||||
undefined,
|
||||
nextTimestamp
|
||||
);
|
||||
if (cancelWait) cancelWait();
|
||||
|
||||
output.log(`aliases found under ${chalk.bold(contextName)} ${lsStamp()}`);
|
||||
console.log(printAliasTable(aliases));
|
||||
|
||||
|
||||
@@ -12,9 +12,10 @@ import { isValidName } from '../../util/is-valid-name';
|
||||
import findAliasByAliasOrId from '../../util/alias/find-alias-by-alias-or-id';
|
||||
import { getCommandName } from '../../util/pkg-name.ts';
|
||||
|
||||
export default async function rm(ctx, opts, args, output) {
|
||||
export default async function rm(ctx, opts, args) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
@@ -25,6 +26,7 @@ export default async function rm(ctx, opts, args, output) {
|
||||
token,
|
||||
currentTeam,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
});
|
||||
let contextName = null;
|
||||
|
||||
@@ -39,8 +41,13 @@ export default async function rm(ctx, opts, args, output) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
// $FlowFixMe
|
||||
const now = new Now({ apiUrl, token, debug: debugEnabled, currentTeam });
|
||||
const now = new Now({
|
||||
apiUrl,
|
||||
token,
|
||||
debug: debugEnabled,
|
||||
currentTeam,
|
||||
output,
|
||||
});
|
||||
const [aliasOrId] = args;
|
||||
|
||||
if (args.length !== 1) {
|
||||
|
||||
@@ -29,11 +29,11 @@ type Options = {
|
||||
export default async function set(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
localConfig,
|
||||
} = ctx;
|
||||
@@ -49,6 +49,7 @@ export default async function set(
|
||||
token,
|
||||
currentTeam,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
});
|
||||
|
||||
let user: User;
|
||||
|
||||
@@ -14,7 +14,6 @@ import addBilling from './add';
|
||||
import exit from '../../util/exit';
|
||||
import Client from '../../util/client.ts';
|
||||
import getScope from '../../util/get-scope.ts';
|
||||
import createOutput from '../../util/output';
|
||||
import { getPkgName } from '../../util/pkg-name.ts';
|
||||
|
||||
const help = () => {
|
||||
@@ -90,8 +89,9 @@ function buildInquirerChoices(cards) {
|
||||
const _default =
|
||||
source.id === cards.defaultSource ? ` ${chalk.bold('(default)')}` : '';
|
||||
const id = `${chalk.cyan(`ID: ${source.id}`)}${_default}`;
|
||||
const number = `${chalk.gray('#### ').repeat(3)}${source.last4 ||
|
||||
source.card.last4}`;
|
||||
const number = `${chalk.gray('#### ').repeat(3)}${
|
||||
source.last4 || source.card.last4
|
||||
}`;
|
||||
const str = [
|
||||
id,
|
||||
indent(source.name || source.owner.name, 2),
|
||||
@@ -106,11 +106,16 @@ function buildInquirerChoices(cards) {
|
||||
});
|
||||
}
|
||||
|
||||
async function run({ token, config: { currentTeam } }) {
|
||||
async function run({ token, output, config: { currentTeam } }) {
|
||||
const start = new Date();
|
||||
const creditCards = new NowCreditCards({ apiUrl, token, debug, currentTeam });
|
||||
const output = createOutput({ debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const creditCards = new NowCreditCards({
|
||||
apiUrl,
|
||||
token,
|
||||
debug,
|
||||
currentTeam,
|
||||
output,
|
||||
});
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
@@ -147,8 +152,9 @@ async function run({ token, config: { currentTeam } }) {
|
||||
const id = `${chalk.gray('-')} ${chalk.cyan(
|
||||
`ID: ${source.id}`
|
||||
)}${_default}`;
|
||||
const number = `${chalk.gray('#### ').repeat(3)}${source.last4 ||
|
||||
source.card.last4}`;
|
||||
const number = `${chalk.gray('#### ').repeat(3)}${
|
||||
source.last4 || source.card.last4
|
||||
}`;
|
||||
|
||||
return [
|
||||
id,
|
||||
@@ -231,8 +237,9 @@ async function run({ token, config: { currentTeam } }) {
|
||||
const elapsed = ms(new Date() - start);
|
||||
console.log(
|
||||
success(
|
||||
`${card.brand || card.card.brand} ending in ${card.last4 ||
|
||||
card.card.last4} is now the default ${chalk.gray(`[${elapsed}]`)}`
|
||||
`${card.brand || card.card.brand} ending in ${
|
||||
card.last4 || card.card.last4
|
||||
} is now the default ${chalk.gray(`[${elapsed}]`)}`
|
||||
)
|
||||
);
|
||||
} else {
|
||||
@@ -301,9 +308,9 @@ async function run({ token, config: { currentTeam } }) {
|
||||
const deletedCard = cards.sources.find(card => card.id === cardId);
|
||||
const remainingCards = cards.sources.filter(card => card.id !== cardId);
|
||||
|
||||
let text = `${deletedCard.brand ||
|
||||
deletedCard.card.brand} ending in ${deletedCard.last4 ||
|
||||
deletedCard.card.last4} was deleted`;
|
||||
let text = `${deletedCard.brand || deletedCard.card.brand} ending in ${
|
||||
deletedCard.last4 || deletedCard.card.last4
|
||||
} was deleted`;
|
||||
// ${chalk.gray(`[${elapsed}]`)}
|
||||
|
||||
if (cardId === cards.defaultSource) {
|
||||
@@ -317,11 +324,11 @@ async function run({ token, config: { currentTeam } }) {
|
||||
card => card.id === cards.defaultCardId
|
||||
);
|
||||
|
||||
text += `\n${newDefaultCard.brand ||
|
||||
newDefaultCard.card.brand} ending in ${newDefaultCard.last4 ||
|
||||
newDefaultCard.card.last4} in now default for ${chalk.bold(
|
||||
contextName
|
||||
)}`;
|
||||
text += `\n${
|
||||
newDefaultCard.brand || newDefaultCard.card.brand
|
||||
} ending in ${
|
||||
newDefaultCard.last4 || newDefaultCard.card.last4
|
||||
} in now default for ${chalk.bold(contextName)}`;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ import stamp from '../../util/output/stamp';
|
||||
import createCertFromFile from '../../util/certs/create-cert-from-file';
|
||||
import createCertForCns from '../../util/certs/create-cert-for-cns';
|
||||
import { NowContext } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import { getCommandName } from '../../util/pkg-name';
|
||||
|
||||
interface Options {
|
||||
@@ -22,11 +21,11 @@ interface Options {
|
||||
async function add(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
): Promise<number> {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
@@ -49,6 +48,7 @@ async function add(
|
||||
token,
|
||||
currentTeam,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
});
|
||||
|
||||
try {
|
||||
@@ -62,7 +62,13 @@ async function add(
|
||||
throw err;
|
||||
}
|
||||
|
||||
const now = new Now({ apiUrl, token, debug: debugEnabled, currentTeam });
|
||||
const now = new Now({
|
||||
apiUrl,
|
||||
token,
|
||||
debug: debugEnabled,
|
||||
currentTeam,
|
||||
output,
|
||||
});
|
||||
|
||||
if (overwite) {
|
||||
output.error('Overwrite option is deprecated');
|
||||
@@ -71,7 +77,7 @@ async function add(
|
||||
}
|
||||
|
||||
if (crtPath || keyPath || caPath) {
|
||||
if (args.length !== 0 || (!crtPath || !keyPath || !caPath)) {
|
||||
if (args.length !== 0 || !crtPath || !keyPath || !caPath) {
|
||||
output.error(
|
||||
`Invalid number of arguments to create a custom certificate entry. Usage:`
|
||||
);
|
||||
@@ -113,12 +119,12 @@ async function add(
|
||||
(res, item) => res.concat(item.split(',')),
|
||||
[]
|
||||
);
|
||||
const cancelWait = output.spinner(
|
||||
output.spinner(
|
||||
`Generating a certificate for ${chalk.bold(cns.join(', '))}`
|
||||
);
|
||||
|
||||
cert = await createCertForCns(now, cns, contextName);
|
||||
cancelWait();
|
||||
output.stopSpinner();
|
||||
}
|
||||
|
||||
if (cert instanceof Error) {
|
||||
|
||||
@@ -3,7 +3,6 @@ import chalk from 'chalk';
|
||||
// @ts-ignore
|
||||
import { handleError } from '../../util/error';
|
||||
|
||||
import createOutput from '../../util/output';
|
||||
import getArgs from '../../util/get-args';
|
||||
import getSubcommand from '../../util/get-subcommand';
|
||||
import logo from '../../util/output/logo';
|
||||
@@ -104,17 +103,17 @@ export default async function main(ctx: NowContext) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const output = createOutput({ debug: argv['--debug'] });
|
||||
const { output } = ctx;
|
||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||
switch (subcommand) {
|
||||
case 'issue':
|
||||
return issue(ctx, argv, args, output);
|
||||
return issue(ctx, argv, args);
|
||||
case 'ls':
|
||||
return ls(ctx, argv, args, output);
|
||||
return ls(ctx, argv, args);
|
||||
case 'rm':
|
||||
return rm(ctx, argv, args, output);
|
||||
return rm(ctx, argv, args);
|
||||
case 'add':
|
||||
return add(ctx, argv, args, output);
|
||||
return add(ctx, argv, args);
|
||||
case 'renew':
|
||||
output.error('Renewing certificates is deprecated, issue a new one.');
|
||||
return 1;
|
||||
|
||||
@@ -28,11 +28,11 @@ type Options = {
|
||||
export default async function issue(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
@@ -55,6 +55,7 @@ export default async function issue(
|
||||
token,
|
||||
currentTeam,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
});
|
||||
let contextName = null;
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ import getScope from '../../util/get-scope';
|
||||
import stamp from '../../util/output/stamp';
|
||||
import getCerts from '../../util/certs/get-certs';
|
||||
import strlen from '../../util/strlen';
|
||||
import { Output } from '../../util/output';
|
||||
import { NowContext, Cert } from '../../types';
|
||||
import getCommandFlags from '../../util/get-command-flags';
|
||||
import { getCommandName } from '../../util/pkg-name';
|
||||
@@ -21,17 +20,17 @@ interface Options {
|
||||
async function ls(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
): Promise<number> {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const { '--debug': debug, '--next': nextTimestamp } = opts;
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
@@ -48,7 +47,7 @@ async function ls(
|
||||
output.error('Please provide a number for flag --next');
|
||||
return 1;
|
||||
}
|
||||
const now = new Now({ apiUrl, token, debug, currentTeam });
|
||||
const now = new Now({ apiUrl, token, debug, currentTeam, output });
|
||||
const lsStamp = stamp();
|
||||
|
||||
if (args.length !== 0) {
|
||||
|
||||
@@ -18,21 +18,17 @@ type Options = {
|
||||
'--debug': boolean;
|
||||
};
|
||||
|
||||
async function rm(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
) {
|
||||
async function rm(ctx: NowContext, opts: Options, args: string[]) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const rmStamp = stamp();
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
|
||||
let contextName = null;
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import { resolve, basename } from 'path';
|
||||
import { fileNameSymbol } from '@vercel/client';
|
||||
import Client from '../../util/client.ts';
|
||||
import getScope from '../../util/get-scope.ts';
|
||||
import createOutput from '../../util/output';
|
||||
import code from '../../util/output/code';
|
||||
import highlight from '../../util/output/highlight';
|
||||
import { readLocalConfig } from '../../util/config/files';
|
||||
@@ -15,6 +14,7 @@ import deploy from './latest';
|
||||
export default async ctx => {
|
||||
const {
|
||||
authConfig,
|
||||
output,
|
||||
config: { currentTeam },
|
||||
apiUrl,
|
||||
} = ctx;
|
||||
@@ -48,7 +48,6 @@ export default async ctx => {
|
||||
localConfig = readLocalConfig(paths[0]);
|
||||
}
|
||||
const debugEnabled = argv['--debug'];
|
||||
const output = createOutput({ debug: debugEnabled });
|
||||
const stats = {};
|
||||
|
||||
if (argv['--help']) {
|
||||
@@ -74,6 +73,7 @@ export default async ctx => {
|
||||
apiUrl,
|
||||
token: authConfig.token,
|
||||
currentTeam,
|
||||
output,
|
||||
debug: debugEnabled,
|
||||
});
|
||||
try {
|
||||
|
||||
@@ -233,8 +233,7 @@ export default async function main(
|
||||
const paths = Object.keys(stats);
|
||||
const debugEnabled = argv['--debug'];
|
||||
|
||||
// $FlowFixMe
|
||||
const isTTY = process.stdout.isTTY;
|
||||
const { isTTY } = process.stdout;
|
||||
const quiet = !isTTY;
|
||||
|
||||
// check paths
|
||||
@@ -263,6 +262,7 @@ export default async function main(
|
||||
apiUrl: ctx.apiUrl,
|
||||
token: ctx.authConfig.token,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
});
|
||||
|
||||
// retrieve `project` and `org` from .vercel
|
||||
@@ -645,6 +645,7 @@ export default async function main(
|
||||
token: ctx.authConfig.token,
|
||||
currentTeam: org.id,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
}),
|
||||
err.meta.domain,
|
||||
contextName
|
||||
@@ -727,6 +728,7 @@ export default async function main(
|
||||
token: ctx.authConfig.token,
|
||||
currentTeam: org.type === 'team' ? org.id : null,
|
||||
debug: debugEnabled,
|
||||
output,
|
||||
}),
|
||||
deployment,
|
||||
deployStamp,
|
||||
|
||||
@@ -2,7 +2,6 @@ import { resolve, join } from 'path';
|
||||
|
||||
import DevServer from '../../util/dev/server';
|
||||
import parseListen from '../../util/dev/parse-listen';
|
||||
import { Output } from '../../util/output';
|
||||
import { NowContext, ProjectEnvVariable } from '../../types';
|
||||
import Client from '../../util/client';
|
||||
import { getLinkedProject } from '../../util/projects/link';
|
||||
@@ -22,9 +21,9 @@ type Options = {
|
||||
export default async function dev(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const { output } = ctx;
|
||||
const [dir = '.'] = args;
|
||||
let cwd = resolve(dir);
|
||||
const listen = parseListen(opts['--listen'] || '3000');
|
||||
@@ -35,6 +34,7 @@ export default async function dev(
|
||||
token: ctx.authConfig.token,
|
||||
currentTeam: ctx.config.currentTeam,
|
||||
debug,
|
||||
output,
|
||||
});
|
||||
|
||||
// retrieve dev command
|
||||
@@ -49,7 +49,6 @@ export default async function dev(
|
||||
|
||||
link = await setupAndLink(
|
||||
ctx,
|
||||
output,
|
||||
cwd,
|
||||
forceDelete,
|
||||
autoConfirm,
|
||||
|
||||
@@ -7,7 +7,6 @@ import getSubcommand from '../../util/get-subcommand';
|
||||
import { NowContext } from '../../types';
|
||||
import { NowError } from '../../util/now-error';
|
||||
import handleError from '../../util/handle-error';
|
||||
import createOutput from '../../util/output/create-output';
|
||||
import logo from '../../util/output/logo';
|
||||
import cmd from '../../util/output/cmd';
|
||||
import highlight from '../../util/output/highlight';
|
||||
@@ -51,7 +50,7 @@ const help = () => {
|
||||
export default async function main(ctx: NowContext) {
|
||||
let argv;
|
||||
let args;
|
||||
let output;
|
||||
const { output } = ctx;
|
||||
|
||||
try {
|
||||
argv = getArgs(ctx.argv.slice(2), {
|
||||
@@ -63,9 +62,7 @@ export default async function main(ctx: NowContext) {
|
||||
'--port': Number,
|
||||
'-p': '--port',
|
||||
});
|
||||
const debug = argv['--debug'];
|
||||
args = getSubcommand(argv._.slice(1), COMMAND_CONFIG).args;
|
||||
output = createOutput({ debug });
|
||||
|
||||
if ('--port' in argv) {
|
||||
output.warn('`--port` is deprecated, please use `--listen` instead');
|
||||
@@ -120,7 +117,7 @@ export default async function main(ctx: NowContext) {
|
||||
}
|
||||
|
||||
try {
|
||||
return await dev(ctx, argv, args, output);
|
||||
return await dev(ctx, argv, args);
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOTFOUND') {
|
||||
// Error message will look like the following:
|
||||
|
||||
@@ -6,7 +6,6 @@ import {
|
||||
DNSInvalidType,
|
||||
} from '../../util/errors-ts';
|
||||
import { NowContext } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import addDNSRecord from '../../util/dns/add-dns-record';
|
||||
import Client from '../../util/client';
|
||||
import getScope from '../../util/get-scope';
|
||||
@@ -22,17 +21,17 @@ type Options = {
|
||||
export default async function add(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
apiUrl,
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import chalk from 'chalk';
|
||||
import { NowContext } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import Client from '../../util/client';
|
||||
import getScope from '../../util/get-scope';
|
||||
import { DomainNotFound, InvalidDomain } from '../../util/errors-ts';
|
||||
@@ -15,17 +14,17 @@ type Options = {
|
||||
export default async function add(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
apiUrl,
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
import { NowContext } from '../../types';
|
||||
import createOutput from '../../util/output';
|
||||
import getArgs from '../../util/get-args';
|
||||
import getSubcommand from '../../util/get-subcommand';
|
||||
import handleError from '../../util/handle-error';
|
||||
@@ -112,16 +111,15 @@ export default async function main(ctx: NowContext) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
const output = createOutput({ debug: argv['--debug'] });
|
||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||
switch (subcommand) {
|
||||
case 'add':
|
||||
return add(ctx, argv, args, output);
|
||||
return add(ctx, argv, args);
|
||||
case 'import':
|
||||
return importZone(ctx, argv, args, output);
|
||||
return importZone(ctx, argv, args);
|
||||
case 'rm':
|
||||
return rm(ctx, argv, args, output);
|
||||
return rm(ctx, argv, args);
|
||||
default:
|
||||
return ls(ctx, argv, args, output);
|
||||
return ls(ctx, argv, args);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import chalk from 'chalk';
|
||||
import ms from 'ms';
|
||||
import { Output } from '../../util/output';
|
||||
import { DomainNotFound } from '../../util/errors-ts';
|
||||
import { DNSRecord, NowContext } from '../../types';
|
||||
import Client from '../../util/client';
|
||||
@@ -22,17 +21,17 @@ type Options = {
|
||||
export default async function ls(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
apiUrl,
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const { '--debug': debug, '--next': nextTimestamp } = opts;
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
|
||||
@@ -17,17 +17,17 @@ type Options = {
|
||||
export default async function rm(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
apiUrl,
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
|
||||
try {
|
||||
await getScope(client);
|
||||
@@ -100,12 +100,7 @@ function readConfirmation(
|
||||
process.stdin
|
||||
.on('data', d => {
|
||||
process.stdin.pause();
|
||||
resolve(
|
||||
d
|
||||
.toString()
|
||||
.trim()
|
||||
.toLowerCase() === 'y'
|
||||
);
|
||||
resolve(d.toString().trim().toLowerCase() === 'y');
|
||||
})
|
||||
.resume();
|
||||
});
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
import { NowContext } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import * as ERRORS from '../../util/errors-ts';
|
||||
import Client from '../../util/client';
|
||||
import formatNSTable from '../../util/format-ns-table';
|
||||
@@ -24,18 +23,18 @@ type Options = {
|
||||
export default async function add(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const force = opts['--force'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
|
||||
@@ -2,7 +2,6 @@ import chalk from 'chalk';
|
||||
import psl from 'psl';
|
||||
|
||||
import { NowContext } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import * as ERRORS from '../../util/errors-ts';
|
||||
import Client from '../../util/client';
|
||||
import getDomainPrice from '../../util/domains/get-domain-price';
|
||||
@@ -21,17 +20,17 @@ type Options = {
|
||||
export default async function buy(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
@@ -70,7 +69,10 @@ export default async function buy(
|
||||
}
|
||||
|
||||
const availableStamp = stamp();
|
||||
const domainPrice = await getDomainPrice(client, domainName);
|
||||
const [domainPrice, renewalPrice] = await Promise.all([
|
||||
getDomainPrice(client, domainName),
|
||||
getDomainPrice(client, domainName, 'renewal'),
|
||||
]);
|
||||
|
||||
if (domainPrice instanceof Error) {
|
||||
output.prettyError(domainPrice);
|
||||
@@ -102,14 +104,22 @@ export default async function buy(
|
||||
return 0;
|
||||
}
|
||||
|
||||
const autoRenew = await promptBool(
|
||||
renewalPrice.period === 1
|
||||
? `Auto renew yearly for ${chalk.bold(`$${price}`)}?`
|
||||
: `Auto renew every ${renewalPrice.period} years for ${chalk.bold(
|
||||
`$${price}`
|
||||
)}?`,
|
||||
{ defaultValue: true }
|
||||
);
|
||||
|
||||
let buyResult;
|
||||
const purchaseStamp = stamp();
|
||||
const stopPurchaseSpinner = output.spinner('Purchasing');
|
||||
output.spinner('Purchasing');
|
||||
|
||||
try {
|
||||
buyResult = await purchaseDomain(client, domainName, price);
|
||||
buyResult = await purchaseDomain(client, domainName, price, autoRenew);
|
||||
} catch (err) {
|
||||
stopPurchaseSpinner();
|
||||
output.error(
|
||||
'An unexpected error occurred while purchasing your domain. Please try again later.'
|
||||
);
|
||||
@@ -117,7 +127,7 @@ export default async function buy(
|
||||
return 1;
|
||||
}
|
||||
|
||||
stopPurchaseSpinner();
|
||||
output.stopSpinner();
|
||||
|
||||
if (buyResult instanceof ERRORS.SourceNotFound) {
|
||||
output.error(
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
import { NowContext } from '../../types';
|
||||
import createOutput from '../../util/output';
|
||||
import getArgs from '../../util/get-args';
|
||||
import getSubcommand from '../../util/get-subcommand';
|
||||
import handleError from '../../util/handle-error';
|
||||
@@ -106,24 +105,23 @@ export default async function main(ctx: NowContext) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
const output = createOutput({ debug: argv['--debug'] });
|
||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||
switch (subcommand) {
|
||||
case 'add':
|
||||
return add(ctx, argv, args, output);
|
||||
return add(ctx, argv, args);
|
||||
case 'inspect':
|
||||
return inspect(ctx, argv, args, output);
|
||||
return inspect(ctx, argv, args);
|
||||
case 'move':
|
||||
return move(ctx, argv, args, output);
|
||||
return move(ctx, argv, args);
|
||||
case 'buy':
|
||||
return buy(ctx, argv, args, output);
|
||||
return buy(ctx, argv, args);
|
||||
case 'rm':
|
||||
return rm(ctx, argv, args, output);
|
||||
return rm(ctx, argv, args);
|
||||
case 'transferIn':
|
||||
return transferIn(ctx, argv, args, output);
|
||||
return transferIn(ctx, argv, args);
|
||||
case 'verify':
|
||||
return verify(ctx, argv, args, output);
|
||||
return verify(ctx, argv, args);
|
||||
default:
|
||||
return ls(ctx, argv, args, output);
|
||||
return ls(ctx, argv, args);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,17 +24,17 @@ type Options = {
|
||||
export default async function inspect(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
|
||||
let contextName = null;
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ import Client from '../../util/client';
|
||||
import getDomains from '../../util/domains/get-domains';
|
||||
import getScope from '../../util/get-scope';
|
||||
import stamp from '../../util/output/stamp';
|
||||
import { Output } from '../../util/output';
|
||||
import formatTable from '../../util/format-table';
|
||||
import { formatDateWithoutTime } from '../../util/format-date';
|
||||
import { Domain, NowContext } from '../../types';
|
||||
@@ -24,17 +23,17 @@ type Options = {
|
||||
export default async function ls(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const { '--debug': debug, '--next': nextTimestamp } = opts;
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
if (typeof nextTimestamp !== undefined && Number.isNaN(nextTimestamp)) {
|
||||
|
||||
@@ -2,7 +2,6 @@ import chalk from 'chalk';
|
||||
import plural from 'pluralize';
|
||||
|
||||
import { NowContext, User, Team } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import * as ERRORS from '../../util/errors-ts';
|
||||
import Client from '../../util/client';
|
||||
import getScope from '../../util/get-scope';
|
||||
@@ -25,17 +24,17 @@ type Options = {
|
||||
export default async function move(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
let user = null;
|
||||
|
||||
|
||||
@@ -26,17 +26,17 @@ type Options = {
|
||||
export default async function rm(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
const [domainName] = args;
|
||||
let contextName = null;
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
import { NowContext } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import * as ERRORS from '../../util/errors-ts';
|
||||
import Client from '../../util/client';
|
||||
import getScope from '../../util/get-scope';
|
||||
@@ -24,17 +23,17 @@ type Options = {
|
||||
export default async function transferIn(
|
||||
ctx: NowContext,
|
||||
opts: Options,
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const {
|
||||
authConfig: { token },
|
||||
output,
|
||||
config,
|
||||
} = ctx;
|
||||
const { currentTeam } = config;
|
||||
const { apiUrl } = ctx;
|
||||
const debug = opts['--debug'];
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
||||
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||
let contextName = null;
|
||||
|
||||
try {
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
import { NowContext } from '../../types';
|
||||
import { Output } from '../../util/output';
|
||||
import { NowBuildError } from '@vercel/build-utils';
|
||||
import { getCommandName } from '../../util/pkg-name';
|
||||
|
||||
export default async function verify(
|
||||
_ctx: NowContext,
|
||||
{ output }: NowContext,
|
||||
_opts: {},
|
||||
args: string[],
|
||||
output: Output
|
||||
args: string[]
|
||||
) {
|
||||
const [domainName] = args;
|
||||
|
||||
|
||||
12
packages/now-cli/src/commands/env/add.ts
vendored
12
packages/now-cli/src/commands/env/add.ts
vendored
@@ -122,7 +122,17 @@ export default async function add(
|
||||
const existing = new Set(
|
||||
envs.filter(r => r.key === envName).map(r => r.target)
|
||||
);
|
||||
const choices = getEnvTargetChoices().filter(c => !existing.has(c.value));
|
||||
const choices = getEnvTargetChoices().filter(c => {
|
||||
// hide Development if "Secret" is chosen
|
||||
if (
|
||||
envType === ProjectEnvType.Secret &&
|
||||
c.value === ProjectEnvTarget.Development
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return !existing.has(c.value);
|
||||
});
|
||||
|
||||
if (choices.length === 0) {
|
||||
output.error(
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user