mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-23 01:49:13 +00:00
Compare commits
202 Commits
@vercel/ro
...
@vercel/bu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ac3ae19c0 | ||
|
|
e7920fd783 | ||
|
|
b4c13470df | ||
|
|
2a797b77b9 | ||
|
|
85a34126df | ||
|
|
92889c5376 | ||
|
|
66a7fa30b8 | ||
|
|
a7ba405503 | ||
|
|
84145245ba | ||
|
|
90d2e8b63b | ||
|
|
0d31fe8018 | ||
|
|
37d747c241 | ||
|
|
3f052d905f | ||
|
|
0b60467d2f | ||
|
|
4384a6104f | ||
|
|
f40f95ff37 | ||
|
|
90c05250b0 | ||
|
|
030880fe74 | ||
|
|
02bc88f33b | ||
|
|
38ff557cad | ||
|
|
47c34842d5 | ||
|
|
d21b215ad0 | ||
|
|
5827737fd5 | ||
|
|
a9e078d410 | ||
|
|
b4d9b17fb8 | ||
|
|
02c55bf634 | ||
|
|
08af15055f | ||
|
|
0597aaa5e4 | ||
|
|
176856a1ea | ||
|
|
375a55ebed | ||
|
|
7d33a05581 | ||
|
|
0377c8b737 | ||
|
|
662d546388 | ||
|
|
8c514b5608 | ||
|
|
a6ec53d9d3 | ||
|
|
3ad5903f70 | ||
|
|
3cf155e999 | ||
|
|
d9a298d97c | ||
|
|
487d3c8554 | ||
|
|
9d0bfd3656 | ||
|
|
ec75333569 | ||
|
|
51aab912a2 | ||
|
|
670b2653c0 | ||
|
|
f71686fdad | ||
|
|
ec9c8ce150 | ||
|
|
a2048fc6d3 | ||
|
|
09ff9cda9f | ||
|
|
3a4d6f7848 | ||
|
|
9a0d676c0d | ||
|
|
25cd7b9e6e | ||
|
|
f926d5516c | ||
|
|
4603383850 | ||
|
|
c0c57889c8 | ||
|
|
85908a0524 | ||
|
|
503b9a2429 | ||
|
|
eac8f32ae7 | ||
|
|
3f76fefde6 | ||
|
|
79ddc5746b | ||
|
|
9a14615b43 | ||
|
|
6d6ccbdc25 | ||
|
|
704424ec58 | ||
|
|
c471127c69 | ||
|
|
c02dc9ac49 | ||
|
|
dd10e8cc77 | ||
|
|
cf69c2398c | ||
|
|
e48707571f | ||
|
|
6051fe6f0c | ||
|
|
2b3ba8a14f | ||
|
|
25bea3f83e | ||
|
|
b3e1828ebe | ||
|
|
e0e2a8e87e | ||
|
|
37ec89796d | ||
|
|
d3e2a4c4db | ||
|
|
ece3645914 | ||
|
|
fee386493b | ||
|
|
d95ed184ab | ||
|
|
aef8e6388e | ||
|
|
ba43e88603 | ||
|
|
e61f9740c4 | ||
|
|
c4b010fe8b | ||
|
|
db18eb091f | ||
|
|
360e62d172 | ||
|
|
8c3cd0332d | ||
|
|
f5f276021e | ||
|
|
9fbec823f3 | ||
|
|
18c3dd3a63 | ||
|
|
5a4a20b33f | ||
|
|
4489ed0c85 | ||
|
|
359f23daf1 | ||
|
|
4ef92e85db | ||
|
|
659c4d6ccd | ||
|
|
e93d477df8 | ||
|
|
f64625655b | ||
|
|
25a8189997 | ||
|
|
25c3e627cf | ||
|
|
1d6d8b530f | ||
|
|
e821cc0ae7 | ||
|
|
8ecbdc5d03 | ||
|
|
895224985b | ||
|
|
0f42a63c03 | ||
|
|
81e4c9e6fe | ||
|
|
a0a29dc836 | ||
|
|
c1f9d51d7a | ||
|
|
422f0558c1 | ||
|
|
f064ae2908 | ||
|
|
58c3e636f0 | ||
|
|
d5081367f3 | ||
|
|
0ee88366ff | ||
|
|
9ae42c9e92 | ||
|
|
62b8df4a8d | ||
|
|
73ec7f3018 | ||
|
|
2d24a75ca6 | ||
|
|
3f92c42ad6 | ||
|
|
d824f79d5a | ||
|
|
eefbf3a52d | ||
|
|
dda793018b | ||
|
|
9e588068ea | ||
|
|
76a7a51bdc | ||
|
|
5f5b5b0340 | ||
|
|
a0ce373dc9 | ||
|
|
049ffb268b | ||
|
|
94483c8b36 | ||
|
|
078f9de44e | ||
|
|
0ae41f97a4 | ||
|
|
9fb6a1ec4c | ||
|
|
21be46c8bb | ||
|
|
91942fc4d2 | ||
|
|
8e02f2289f | ||
|
|
4205d643a1 | ||
|
|
b2dda4dbb9 | ||
|
|
f36eac3d0a | ||
|
|
a2c56425f4 | ||
|
|
c759bfda9c | ||
|
|
57995001ac | ||
|
|
e5553d8ec2 | ||
|
|
dcee5b16c7 | ||
|
|
b190f2e118 | ||
|
|
2389d3e936 | ||
|
|
0f4ed1965a | ||
|
|
e1e38ee536 | ||
|
|
dc1ff00610 | ||
|
|
5f31736603 | ||
|
|
9a57cc72dd | ||
|
|
9d9c5f3753 | ||
|
|
deeefc0c93 | ||
|
|
5c23b08bc1 | ||
|
|
7c4e25ccce | ||
|
|
1bfa310945 | ||
|
|
c96062266b | ||
|
|
5bea99c1d9 | ||
|
|
358be773a2 | ||
|
|
9ebf4e531d | ||
|
|
71e79258b7 | ||
|
|
1dfafe7040 | ||
|
|
78ed452a99 | ||
|
|
d408e2ef1a | ||
|
|
8ebb1fd9ce | ||
|
|
4eb5ad625c | ||
|
|
7164f6e58e | ||
|
|
a36d084b3e | ||
|
|
8a16447fed | ||
|
|
efda4ab6b9 | ||
|
|
16060a71a9 | ||
|
|
b18e0a7415 | ||
|
|
1251f11a97 | ||
|
|
07235e22f6 | ||
|
|
81011df816 | ||
|
|
c8d31bdcf7 | ||
|
|
5e7f1158ad | ||
|
|
df5aa1f10d | ||
|
|
eb1ba97309 | ||
|
|
8047d6de49 | ||
|
|
7470ff3724 | ||
|
|
8340d9327c | ||
|
|
d278425810 | ||
|
|
8b26bbe643 | ||
|
|
fa8e1e73c8 | ||
|
|
f8abcbcd9f | ||
|
|
e18ff683b2 | ||
|
|
f28293a5a8 | ||
|
|
a4963a89c7 | ||
|
|
21df39fe8c | ||
|
|
5ad9d61451 | ||
|
|
8b5a2aa44f | ||
|
|
d0da1ce195 | ||
|
|
fd5d3b2921 | ||
|
|
d22bdeb8d0 | ||
|
|
c120fd82f9 | ||
|
|
2474a80ff1 | ||
|
|
cc1cdbe610 | ||
|
|
0b92f8ceee | ||
|
|
be82a88d1a | ||
|
|
64da08f0f2 | ||
|
|
2e957fce55 | ||
|
|
c7ead151f5 | ||
|
|
e2baf9b00f | ||
|
|
ba8ef7bc98 | ||
|
|
c5d04e0d4f | ||
|
|
b4f849418d | ||
|
|
b37c4f211e | ||
|
|
f06efe167c | ||
|
|
296d8da676 |
@@ -34,6 +34,7 @@ packages/now-node-bridge/bridge.*
|
|||||||
|
|
||||||
# now-static-build
|
# now-static-build
|
||||||
packages/now-static-build/test/fixtures
|
packages/now-static-build/test/fixtures
|
||||||
|
packages/now-static-build/test/build-fixtures
|
||||||
|
|
||||||
# redwood
|
# redwood
|
||||||
packages/redwood/test/fixtures
|
packages/redwood/test/fixtures
|
||||||
|
|||||||
13
.github/CONTRIBUTING.md
vendored
13
.github/CONTRIBUTING.md
vendored
@@ -73,8 +73,8 @@ The logs of this deployment will contain the actual error which may help you to
|
|||||||
Some of the Builders use `@vercel/nft` to tree-shake files before deployment. If you suspect an error with this tree-shaking mechanism, you can create the following script in your project:
|
Some of the Builders use `@vercel/nft` to tree-shake files before deployment. If you suspect an error with this tree-shaking mechanism, you can create the following script in your project:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const trace = require('@vercel/nft');
|
const { nodeFileTrace } = require('@vercel/nft');
|
||||||
trace(['path/to/entrypoint.js'], {
|
nodeFileTrace(['path/to/entrypoint.js'], {
|
||||||
ts: true,
|
ts: true,
|
||||||
mixedModules: true,
|
mixedModules: true,
|
||||||
})
|
})
|
||||||
@@ -94,12 +94,3 @@ Sometimes you want to test changes to a Builder against an existing project, may
|
|||||||
4. Run `vercel *.tgz` to upload the tarball file and get a URL
|
4. Run `vercel *.tgz` to upload the tarball file and get a URL
|
||||||
5. Edit any existing `vercel.json` project and replace `use` with the URL
|
5. Edit any existing `vercel.json` project and replace `use` with the URL
|
||||||
6. Run `vercel` or `vercel dev` to deploy with the experimental Builder
|
6. Run `vercel` or `vercel dev` to deploy with the experimental Builder
|
||||||
|
|
||||||
## Add a New Framework
|
|
||||||
|
|
||||||
You can add support for a new Framework by creating a Pull Request for this repository and following the steps below:
|
|
||||||
|
|
||||||
1. Add the Framework to the `@vercel/frameworks` package: The file is located in `./packages/frameworks/frameworks.json`. You can copy the structure of an existing one and adjust the required fields. Note that the `settings` property either contains a `value` or a `placeholder`. The `value` property is used when something is not configurable, the `placeholder` is used when something is configurable and can be changed with configuration. An example would be the Output Directory for Hugo, it's `public` by default but can be changed through its config file, so we use `placeholder` with an explanation of what can be used.
|
|
||||||
2. Add an example to the `./examples` directory: The name of the directory should equal the slug of the framework used in `@vercel/frameworks`. The `.github/EXAMPLE_README_TEMPLATE.md` file can be used to create a `README.md` file for the example.
|
|
||||||
3. Update the `@vercel/static-build` package: The file `./packages/now-static-build/src/frameworks.ts` has to be extended. You can add default routes that will always be applied to projects that use this Framework or specify some paths that will be cached to speed up the build process.
|
|
||||||
4. After your Pull Request has been merged and released, other users can select the example on the Vercel dashboard and deploy it.
|
|
||||||
|
|||||||
20
.github/pull_request_template.md
vendored
Normal file
20
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
### Related Issues
|
||||||
|
|
||||||
|
> Fixes #1
|
||||||
|
> Related to #2
|
||||||
|
|
||||||
|
### 📋 Checklist
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Please keep your PR as a Draft until the checklist is complete
|
||||||
|
-->
|
||||||
|
|
||||||
|
#### Tests
|
||||||
|
|
||||||
|
- [ ] The code changed/added as part of this PR has been covered with tests
|
||||||
|
- [ ] All tests pass locally with `yarn test-unit`
|
||||||
|
|
||||||
|
#### Code Review
|
||||||
|
|
||||||
|
- [ ] This PR has a concise title and thorough description useful to a reviewer
|
||||||
|
- [ ] Issue from task tracker has a link to this PR
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
version = 1
|
version = 1
|
||||||
|
|
||||||
[merge]
|
[merge]
|
||||||
automerge_label = "automerge"
|
automerge_label = ["semver-major","semver-minor","semver-patch"]
|
||||||
blacklist_title_regex = "^WIP.*"
|
blacklist_title_regex = "^WIP.*"
|
||||||
blacklist_labels = ["work in progress"]
|
blacklist_labels = ["work in progress"]
|
||||||
method = "squash"
|
method = "squash"
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ You're running Vercel CLI in a non-terminal context and there are no credentials
|
|||||||
|
|
||||||
#### Possible Ways to Fix It
|
#### Possible Ways to Fix It
|
||||||
|
|
||||||
- Specify a value for the `--token` flag (this needs to be the token of the user account as which you'd like to act). You can either get the token from the `./vercel/auth.json` file located in your user directory or [from the dashboard](https://vercel.com/account/tokens).
|
- Specify a value for the `--token` flag (this needs to be the token of the user account as which you'd like to act). You can create a new token on your [Settings page](https://vercel.com/account/tokens).
|
||||||
- Ensure that both `~/vercel/auth.json` and `~/vercel/config.json` exist
|
- Run `vercel login` to sign in and generate a new token
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { NowRequest, NowResponse } from '@now/node';
|
import { NowRequest, NowResponse } from '@vercel/node';
|
||||||
|
|
||||||
export default (_req: NowRequest, res: NowResponse) => {
|
export default (_req: NowRequest, res: NowResponse) => {
|
||||||
const date = new Date().toString();
|
const date = new Date().toString();
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"react-helmet": "^5.2.0"
|
"react-helmet": "^5.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@now/node": "^1.3.0"
|
"@vercel/node": "1.8.5"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "gatsby develop",
|
"dev": "gatsby develop",
|
||||||
|
|||||||
@@ -1107,15 +1107,6 @@
|
|||||||
"@nodelib/fs.scandir" "2.1.3"
|
"@nodelib/fs.scandir" "2.1.3"
|
||||||
fastq "^1.6.0"
|
fastq "^1.6.0"
|
||||||
|
|
||||||
"@now/node@^1.3.0":
|
|
||||||
version "1.7.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@now/node/-/node-1.7.1.tgz#764a0c6bcb24967f8014c4f73ad238c292996fe3"
|
|
||||||
integrity sha512-+srVKopsVTPDR3u9eOjJryZroLTrPp8XEOuIDGBdfFcJuS7qpAomctSbfyA7WNyjC0ExtUxELqBg5sAedG5+2g==
|
|
||||||
dependencies:
|
|
||||||
"@types/node" "*"
|
|
||||||
ts-node "8.9.1"
|
|
||||||
typescript "3.9.3"
|
|
||||||
|
|
||||||
"@pieh/friendly-errors-webpack-plugin@1.7.0-chalk-2":
|
"@pieh/friendly-errors-webpack-plugin@1.7.0-chalk-2":
|
||||||
version "1.7.0-chalk-2"
|
version "1.7.0-chalk-2"
|
||||||
resolved "https://registry.yarnpkg.com/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz#2e9da9d3ade9d18d013333eb408c457d04eabac0"
|
resolved "https://registry.yarnpkg.com/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz#2e9da9d3ade9d18d013333eb408c457d04eabac0"
|
||||||
@@ -1409,6 +1400,15 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
wonka "^4.0.14"
|
wonka "^4.0.14"
|
||||||
|
|
||||||
|
"@vercel/node@1.8.5":
|
||||||
|
version "1.8.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@vercel/node/-/node-1.8.5.tgz#2c8b9532f1bb25734a9964c52973386ed78022d4"
|
||||||
|
integrity sha512-1iw7FSR8Oau6vZB1MWfBnA5q2a/IqRHiSZSbt8lz0dyTF599q8pc5GcSv/TvmrYaEGzh3+N0S4cbmuMCqVlwJg==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
ts-node "8.9.1"
|
||||||
|
typescript "3.9.3"
|
||||||
|
|
||||||
"@webassemblyjs/ast@1.9.0":
|
"@webassemblyjs/ast@1.9.0":
|
||||||
version "1.9.0"
|
version "1.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
|
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ Open [http://localhost:3000](http://localhost:3000) with your browser to see the
|
|||||||
|
|
||||||
You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
|
You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
|
||||||
|
|
||||||
|
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
|
||||||
|
|
||||||
|
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
|
||||||
|
|
||||||
## Learn More
|
## Learn More
|
||||||
|
|
||||||
To learn more about Next.js, take a look at the following resources:
|
To learn more about Next.js, take a look at the following resources:
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
"start": "next start"
|
"start": "next start"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"next": "9.5.1",
|
"next": "10.0.5",
|
||||||
"react": "16.13.1",
|
"react": "17.0.1",
|
||||||
"react-dom": "16.13.1"
|
"react-dom": "17.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,6 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
max-width: 800px;
|
max-width: 800px;
|
||||||
margin-top: 3rem;
|
margin-top: 3rem;
|
||||||
}
|
}
|
||||||
|
|||||||
7
examples/svelte/.gitignore
vendored
7
examples/svelte/.gitignore
vendored
@@ -1,5 +1,8 @@
|
|||||||
|
/node_modules/
|
||||||
|
/public/build/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
node_modules
|
|
||||||
public/bundle.*
|
|
||||||
.env
|
.env
|
||||||
|
.env.local
|
||||||
.env.build
|
.env.build
|
||||||
|
|
||||||
|
.vercel
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
yarn.lock
|
|
||||||
README.md
|
|
||||||
@@ -1,24 +1,21 @@
|
|||||||
{
|
{
|
||||||
"name": "svelte-app",
|
"name": "svelte-app",
|
||||||
"version": "1.0.0",
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "rollup -c",
|
||||||
|
"dev": "rollup -c -w",
|
||||||
|
"start": "sirv public"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rollup/plugin-commonjs": "^13.0.0",
|
"@rollup/plugin-commonjs": "^14.0.0",
|
||||||
"@rollup/plugin-node-resolve": "^8.1.0",
|
"@rollup/plugin-node-resolve": "^8.0.0",
|
||||||
"npm-run-all": "^4.1.5",
|
"rollup": "^2.3.4",
|
||||||
"rollup": "^2.18.0",
|
"rollup-plugin-livereload": "^2.0.0",
|
||||||
"rollup-plugin-livereload": "^1.0.0",
|
"rollup-plugin-svelte": "^6.0.0",
|
||||||
"rollup-plugin-svelte": "^5.0.3",
|
"rollup-plugin-terser": "^7.0.0",
|
||||||
"rollup-plugin-terser": "^6.1.0",
|
|
||||||
"svelte": "^3.0.0"
|
"svelte": "^3.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"sirv-cli": "^1.0.1"
|
"sirv-cli": "^1.0.0"
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"build": "rollup -c",
|
|
||||||
"autobuild": "rollup -c -w",
|
|
||||||
"dev": "run-p start:dev autobuild",
|
|
||||||
"start": "sirv public --single",
|
|
||||||
"start:dev": "sirv public --single --dev"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf8" />
|
<meta charset='utf-8'>
|
||||||
<meta name="viewport" content="width=device-width" />
|
<meta name='viewport' content='width=device-width,initial-scale=1'>
|
||||||
|
|
||||||
<title>Svelte + Node.js API</title>
|
<title>Svelte + Node.js API</title>
|
||||||
|
|
||||||
<link rel="icon" type="image/png" href="/favicon.png" />
|
<link rel='icon' type='image/png' href='/favicon.png'>
|
||||||
<link rel="stylesheet" href="/global.css" />
|
<link rel='stylesheet' href='/global.css'>
|
||||||
<link rel="stylesheet" href="/bundle.css" />
|
<link rel='stylesheet' href='/build/bundle.css'>
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
<script defer src='/build/bundle.js'></script>
|
||||||
<script src="/bundle.js"></script>
|
</head>
|
||||||
</body>
|
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -6,42 +6,70 @@ import { terser } from 'rollup-plugin-terser';
|
|||||||
|
|
||||||
const production = !process.env.ROLLUP_WATCH;
|
const production = !process.env.ROLLUP_WATCH;
|
||||||
|
|
||||||
|
function serve() {
|
||||||
|
let server;
|
||||||
|
|
||||||
|
function toExit() {
|
||||||
|
if (server) server.kill(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
writeBundle() {
|
||||||
|
if (server) return;
|
||||||
|
server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
|
||||||
|
stdio: ['ignore', 'inherit', 'inherit'],
|
||||||
|
shell: true
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('SIGTERM', toExit);
|
||||||
|
process.on('exit', toExit);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
input: 'src/main.js',
|
input: 'src/main.js',
|
||||||
output: {
|
output: {
|
||||||
sourcemap: true,
|
sourcemap: true,
|
||||||
format: 'iife',
|
format: 'iife',
|
||||||
name: 'app',
|
name: 'app',
|
||||||
file: 'public/bundle.js',
|
file: 'public/build/bundle.js'
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
svelte({
|
svelte({
|
||||||
// enable run-time checks when not in production
|
// enable run-time checks when not in production
|
||||||
dev: !production,
|
dev: !production,
|
||||||
// we'll extract any component CSS out into
|
// we'll extract any component CSS out into
|
||||||
// a separate file — better for performance
|
// a separate file - better for performance
|
||||||
css: css => {
|
css: css => {
|
||||||
css.write('public/bundle.css');
|
css.write('bundle.css');
|
||||||
},
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// If you have external dependencies installed from
|
// If you have external dependencies installed from
|
||||||
// npm, you'll most likely need these plugins. In
|
// npm, you'll most likely need these plugins. In
|
||||||
// some cases you'll need additional configuration —
|
// some cases you'll need additional configuration -
|
||||||
// consult the documentation for details:
|
// consult the documentation for details:
|
||||||
// https://github.com/rollup/rollup-plugin-commonjs
|
// https://github.com/rollup/plugins/tree/master/packages/commonjs
|
||||||
resolve({ browser: true }),
|
resolve({
|
||||||
|
browser: true,
|
||||||
|
dedupe: ['svelte']
|
||||||
|
}),
|
||||||
commonjs(),
|
commonjs(),
|
||||||
|
|
||||||
|
// In dev mode, call `npm run start` once
|
||||||
|
// the bundle has been generated
|
||||||
|
!production && serve(),
|
||||||
|
|
||||||
// Watch the `public` directory and refresh the
|
// Watch the `public` directory and refresh the
|
||||||
// browser on changes when not in production
|
// browser on changes when not in production
|
||||||
!production && livereload('public'),
|
!production && livereload('public'),
|
||||||
|
|
||||||
// If we're building for production (npm run build
|
// If we're building for production (npm run build
|
||||||
// instead of npm run dev), minify
|
// instead of npm run dev), minify
|
||||||
production && terser(),
|
production && terser()
|
||||||
],
|
],
|
||||||
watch: {
|
watch: {
|
||||||
clearScreen: false,
|
clearScreen: false
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
128
examples/svelte/scripts/setupTypeScript.js
Normal file
128
examples/svelte/scripts/setupTypeScript.js
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
// @ts-check
|
||||||
|
|
||||||
|
/** This script modifies the project to support TS code in .svelte files like:
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export let name: string;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
As well as validating the code for CI.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** To work on this script:
|
||||||
|
rm -rf test-template template && git clone sveltejs/template test-template && node scripts/setupTypeScript.js test-template
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require("fs")
|
||||||
|
const path = require("path")
|
||||||
|
const { argv } = require("process")
|
||||||
|
|
||||||
|
const projectRoot = argv[2] || path.join(__dirname, "..")
|
||||||
|
|
||||||
|
// Add deps to pkg.json
|
||||||
|
const packageJSON = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8"))
|
||||||
|
packageJSON.devDependencies = Object.assign(packageJSON.devDependencies, {
|
||||||
|
"svelte-check": "^1.0.0",
|
||||||
|
"svelte-preprocess": "^4.0.0",
|
||||||
|
"@rollup/plugin-typescript": "^6.0.0",
|
||||||
|
"typescript": "^3.9.3",
|
||||||
|
"tslib": "^2.0.0",
|
||||||
|
"@tsconfig/svelte": "^1.0.0"
|
||||||
|
})
|
||||||
|
|
||||||
|
// Add script for checking
|
||||||
|
packageJSON.scripts = Object.assign(packageJSON.scripts, {
|
||||||
|
"validate": "svelte-check"
|
||||||
|
})
|
||||||
|
|
||||||
|
// Write the package JSON
|
||||||
|
fs.writeFileSync(path.join(projectRoot, "package.json"), JSON.stringify(packageJSON, null, " "))
|
||||||
|
|
||||||
|
// mv src/main.js to main.ts - note, we need to edit rollup.config.js for this too
|
||||||
|
const beforeMainJSPath = path.join(projectRoot, "src", "main.js")
|
||||||
|
const afterMainTSPath = path.join(projectRoot, "src", "main.ts")
|
||||||
|
fs.renameSync(beforeMainJSPath, afterMainTSPath)
|
||||||
|
|
||||||
|
// Switch the app.svelte file to use TS
|
||||||
|
const appSveltePath = path.join(projectRoot, "src", "App.svelte")
|
||||||
|
let appFile = fs.readFileSync(appSveltePath, "utf8")
|
||||||
|
appFile = appFile.replace("<script>", '<script lang="ts">')
|
||||||
|
appFile = appFile.replace("export let name;", 'export let name: string;')
|
||||||
|
fs.writeFileSync(appSveltePath, appFile)
|
||||||
|
|
||||||
|
// Edit rollup config
|
||||||
|
const rollupConfigPath = path.join(projectRoot, "rollup.config.js")
|
||||||
|
let rollupConfig = fs.readFileSync(rollupConfigPath, "utf8")
|
||||||
|
|
||||||
|
// Edit imports
|
||||||
|
rollupConfig = rollupConfig.replace(`'rollup-plugin-terser';`, `'rollup-plugin-terser';
|
||||||
|
import sveltePreprocess from 'svelte-preprocess';
|
||||||
|
import typescript from '@rollup/plugin-typescript';`)
|
||||||
|
|
||||||
|
// Replace name of entry point
|
||||||
|
rollupConfig = rollupConfig.replace(`'src/main.js'`, `'src/main.ts'`)
|
||||||
|
|
||||||
|
// Add preprocess to the svelte config, this is tricky because there's no easy signifier.
|
||||||
|
// Instead we look for `css:` then the next `}` and add the preprocessor to that
|
||||||
|
let foundCSS = false
|
||||||
|
let match
|
||||||
|
|
||||||
|
// https://regex101.com/r/OtNjwo/1
|
||||||
|
const configEditor = new RegExp(/css:.|\n*}/gmi)
|
||||||
|
while (( match = configEditor.exec(rollupConfig)) != null) {
|
||||||
|
if (foundCSS) {
|
||||||
|
const endOfCSSIndex = match.index + 1
|
||||||
|
rollupConfig = rollupConfig.slice(0, endOfCSSIndex) + ",\n preprocess: sveltePreprocess()," + rollupConfig.slice(endOfCSSIndex);
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if (match[0].includes("css:")) foundCSS = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Add TypeScript
|
||||||
|
rollupConfig = rollupConfig.replace(
|
||||||
|
'commonjs(),',
|
||||||
|
'commonjs(),\n\t\ttypescript({\n\t\t\tsourceMap: !production,\n\t\t\tinlineSources: !production\n\t\t}),'
|
||||||
|
);
|
||||||
|
fs.writeFileSync(rollupConfigPath, rollupConfig)
|
||||||
|
|
||||||
|
// Add TSConfig
|
||||||
|
const tsconfig = `{
|
||||||
|
"extends": "@tsconfig/svelte/tsconfig.json",
|
||||||
|
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
"exclude": ["node_modules/*", "__sapper__/*", "public/*"]
|
||||||
|
}`
|
||||||
|
const tsconfigPath = path.join(projectRoot, "tsconfig.json")
|
||||||
|
fs.writeFileSync(tsconfigPath, tsconfig)
|
||||||
|
|
||||||
|
// Delete this script, but not during testing
|
||||||
|
if (!argv[2]) {
|
||||||
|
// Remove the script
|
||||||
|
fs.unlinkSync(path.join(__filename))
|
||||||
|
|
||||||
|
// Check for Mac's DS_store file, and if it's the only one left remove it
|
||||||
|
const remainingFiles = fs.readdirSync(path.join(__dirname))
|
||||||
|
if (remainingFiles.length === 1 && remainingFiles[0] === '.DS_store') {
|
||||||
|
fs.unlinkSync(path.join(__dirname, '.DS_store'))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the scripts folder is empty
|
||||||
|
if (fs.readdirSync(path.join(__dirname)).length === 0) {
|
||||||
|
// Remove the scripts folder
|
||||||
|
fs.rmdirSync(path.join(__dirname))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adds the extension recommendation
|
||||||
|
fs.mkdirSync(path.join(projectRoot, ".vscode"))
|
||||||
|
fs.writeFileSync(path.join(projectRoot, ".vscode", "extensions.json"), `{
|
||||||
|
"recommendations": ["svelte.svelte-vscode"]
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
console.log("Converted to TypeScript.")
|
||||||
|
|
||||||
|
if (fs.existsSync(path.join(projectRoot, "node_modules"))) {
|
||||||
|
console.log("\nYou will need to re-run your dependency manager to get started.")
|
||||||
|
}
|
||||||
@@ -3,8 +3,8 @@ import App from './App.svelte';
|
|||||||
const app = new App({
|
const app = new App({
|
||||||
target: document.body,
|
target: document.body,
|
||||||
props: {
|
props: {
|
||||||
name: 'world',
|
name: 'world'
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
export default app;
|
export default app;
|
||||||
635
examples/svelte/yarn.lock
Normal file
635
examples/svelte/yarn.lock
Normal file
@@ -0,0 +1,635 @@
|
|||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@babel/code-frame@^7.10.4":
|
||||||
|
version "7.10.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
|
||||||
|
integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
|
||||||
|
dependencies:
|
||||||
|
"@babel/highlight" "^7.10.4"
|
||||||
|
|
||||||
|
"@babel/helper-validator-identifier@^7.10.4":
|
||||||
|
version "7.10.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
|
||||||
|
integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
|
||||||
|
|
||||||
|
"@babel/highlight@^7.10.4":
|
||||||
|
version "7.10.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
|
||||||
|
integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/helper-validator-identifier" "^7.10.4"
|
||||||
|
chalk "^2.0.0"
|
||||||
|
js-tokens "^4.0.0"
|
||||||
|
|
||||||
|
"@polka/url@^1.0.0-next.9":
|
||||||
|
version "1.0.0-next.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz#aeb16f50649a91af79dbe36574b66d0f9e4d9f71"
|
||||||
|
integrity sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==
|
||||||
|
|
||||||
|
"@rollup/plugin-commonjs@^14.0.0":
|
||||||
|
version "14.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz#4285f9ec2db686a31129e5a2b415c94aa1f836f0"
|
||||||
|
integrity sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==
|
||||||
|
dependencies:
|
||||||
|
"@rollup/pluginutils" "^3.0.8"
|
||||||
|
commondir "^1.0.1"
|
||||||
|
estree-walker "^1.0.1"
|
||||||
|
glob "^7.1.2"
|
||||||
|
is-reference "^1.1.2"
|
||||||
|
magic-string "^0.25.2"
|
||||||
|
resolve "^1.11.0"
|
||||||
|
|
||||||
|
"@rollup/plugin-node-resolve@^8.0.0":
|
||||||
|
version "8.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz#261d79a680e9dc3d86761c14462f24126ba83575"
|
||||||
|
integrity sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==
|
||||||
|
dependencies:
|
||||||
|
"@rollup/pluginutils" "^3.1.0"
|
||||||
|
"@types/resolve" "1.17.1"
|
||||||
|
builtin-modules "^3.1.0"
|
||||||
|
deep-freeze "^0.0.1"
|
||||||
|
deepmerge "^4.2.2"
|
||||||
|
is-module "^1.0.0"
|
||||||
|
resolve "^1.17.0"
|
||||||
|
|
||||||
|
"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0":
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
|
||||||
|
integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
|
||||||
|
dependencies:
|
||||||
|
"@types/estree" "0.0.39"
|
||||||
|
estree-walker "^1.0.1"
|
||||||
|
picomatch "^2.2.2"
|
||||||
|
|
||||||
|
"@types/estree@*":
|
||||||
|
version "0.0.45"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884"
|
||||||
|
integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==
|
||||||
|
|
||||||
|
"@types/estree@0.0.39":
|
||||||
|
version "0.0.39"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
|
||||||
|
integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
|
||||||
|
|
||||||
|
"@types/node@*":
|
||||||
|
version "14.14.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d"
|
||||||
|
integrity sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==
|
||||||
|
|
||||||
|
"@types/resolve@1.17.1":
|
||||||
|
version "1.17.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
|
||||||
|
integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
|
ansi-styles@^3.2.1:
|
||||||
|
version "3.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
|
||||||
|
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
|
||||||
|
dependencies:
|
||||||
|
color-convert "^1.9.0"
|
||||||
|
|
||||||
|
anymatch@~3.1.1:
|
||||||
|
version "3.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
|
||||||
|
integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
|
||||||
|
dependencies:
|
||||||
|
normalize-path "^3.0.0"
|
||||||
|
picomatch "^2.0.4"
|
||||||
|
|
||||||
|
async-limiter@~1.0.0:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
|
||||||
|
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
|
||||||
|
|
||||||
|
balanced-match@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||||
|
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||||
|
|
||||||
|
binary-extensions@^2.0.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
|
||||||
|
integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
|
||||||
|
|
||||||
|
brace-expansion@^1.1.7:
|
||||||
|
version "1.1.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||||
|
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
|
||||||
|
dependencies:
|
||||||
|
balanced-match "^1.0.0"
|
||||||
|
concat-map "0.0.1"
|
||||||
|
|
||||||
|
braces@~3.0.2:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
||||||
|
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
|
||||||
|
dependencies:
|
||||||
|
fill-range "^7.0.1"
|
||||||
|
|
||||||
|
buffer-from@^1.0.0:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||||
|
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
|
||||||
|
|
||||||
|
builtin-modules@^3.1.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
|
||||||
|
integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
|
||||||
|
|
||||||
|
chalk@^2.0.0:
|
||||||
|
version "2.4.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||||
|
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||||
|
dependencies:
|
||||||
|
ansi-styles "^3.2.1"
|
||||||
|
escape-string-regexp "^1.0.5"
|
||||||
|
supports-color "^5.3.0"
|
||||||
|
|
||||||
|
chokidar@^3.3.0:
|
||||||
|
version "3.4.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b"
|
||||||
|
integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==
|
||||||
|
dependencies:
|
||||||
|
anymatch "~3.1.1"
|
||||||
|
braces "~3.0.2"
|
||||||
|
glob-parent "~5.1.0"
|
||||||
|
is-binary-path "~2.1.0"
|
||||||
|
is-glob "~4.0.1"
|
||||||
|
normalize-path "~3.0.0"
|
||||||
|
readdirp "~3.5.0"
|
||||||
|
optionalDependencies:
|
||||||
|
fsevents "~2.1.2"
|
||||||
|
|
||||||
|
color-convert@^1.9.0:
|
||||||
|
version "1.9.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
||||||
|
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
|
||||||
|
dependencies:
|
||||||
|
color-name "1.1.3"
|
||||||
|
|
||||||
|
color-name@1.1.3:
|
||||||
|
version "1.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
|
||||||
|
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
|
||||||
|
|
||||||
|
commander@^2.20.0:
|
||||||
|
version "2.20.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||||
|
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||||
|
|
||||||
|
commondir@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
|
||||||
|
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
|
||||||
|
|
||||||
|
concat-map@0.0.1:
|
||||||
|
version "0.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||||
|
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||||
|
|
||||||
|
console-clear@^1.1.0:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/console-clear/-/console-clear-1.1.1.tgz#995e20cbfbf14dd792b672cde387bd128d674bf7"
|
||||||
|
integrity sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==
|
||||||
|
|
||||||
|
deep-freeze@^0.0.1:
|
||||||
|
version "0.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84"
|
||||||
|
integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=
|
||||||
|
|
||||||
|
deepmerge@^4.2.2:
|
||||||
|
version "4.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
|
||||||
|
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
|
||||||
|
|
||||||
|
escape-string-regexp@^1.0.5:
|
||||||
|
version "1.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
|
||||||
|
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
|
||||||
|
|
||||||
|
estree-walker@^0.6.1:
|
||||||
|
version "0.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
|
||||||
|
integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
|
||||||
|
|
||||||
|
estree-walker@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
|
||||||
|
integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
|
||||||
|
|
||||||
|
fill-range@^7.0.1:
|
||||||
|
version "7.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||||
|
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
||||||
|
dependencies:
|
||||||
|
to-regex-range "^5.0.1"
|
||||||
|
|
||||||
|
fs.realpath@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||||
|
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
||||||
|
|
||||||
|
fsevents@~2.1.2:
|
||||||
|
version "2.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
|
||||||
|
integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
|
||||||
|
|
||||||
|
function-bind@^1.1.1:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
||||||
|
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
||||||
|
|
||||||
|
get-port@^3.2.0:
|
||||||
|
version "3.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
|
||||||
|
integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=
|
||||||
|
|
||||||
|
glob-parent@~5.1.0:
|
||||||
|
version "5.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
|
||||||
|
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
|
||||||
|
dependencies:
|
||||||
|
is-glob "^4.0.1"
|
||||||
|
|
||||||
|
glob@^7.1.2:
|
||||||
|
version "7.1.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
||||||
|
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||||
|
dependencies:
|
||||||
|
fs.realpath "^1.0.0"
|
||||||
|
inflight "^1.0.4"
|
||||||
|
inherits "2"
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
once "^1.3.0"
|
||||||
|
path-is-absolute "^1.0.0"
|
||||||
|
|
||||||
|
has-flag@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
||||||
|
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
|
||||||
|
|
||||||
|
has-flag@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
||||||
|
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
|
||||||
|
|
||||||
|
has@^1.0.3:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
||||||
|
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
|
||||||
|
dependencies:
|
||||||
|
function-bind "^1.1.1"
|
||||||
|
|
||||||
|
inflight@^1.0.4:
|
||||||
|
version "1.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
|
||||||
|
integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
|
||||||
|
dependencies:
|
||||||
|
once "^1.3.0"
|
||||||
|
wrappy "1"
|
||||||
|
|
||||||
|
inherits@2:
|
||||||
|
version "2.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
|
||||||
|
is-binary-path@~2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
|
||||||
|
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
|
||||||
|
dependencies:
|
||||||
|
binary-extensions "^2.0.0"
|
||||||
|
|
||||||
|
is-core-module@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946"
|
||||||
|
integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==
|
||||||
|
dependencies:
|
||||||
|
has "^1.0.3"
|
||||||
|
|
||||||
|
is-extglob@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||||
|
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
|
||||||
|
|
||||||
|
is-glob@^4.0.1, is-glob@~4.0.1:
|
||||||
|
version "4.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
|
||||||
|
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
|
||||||
|
dependencies:
|
||||||
|
is-extglob "^2.1.1"
|
||||||
|
|
||||||
|
is-module@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
|
||||||
|
integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
|
||||||
|
|
||||||
|
is-number@^7.0.0:
|
||||||
|
version "7.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||||
|
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||||
|
|
||||||
|
is-reference@^1.1.2:
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
|
||||||
|
integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/estree" "*"
|
||||||
|
|
||||||
|
jest-worker@^26.2.1:
|
||||||
|
version "26.6.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
|
||||||
|
integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
merge-stream "^2.0.0"
|
||||||
|
supports-color "^7.0.0"
|
||||||
|
|
||||||
|
js-tokens@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||||
|
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
||||||
|
|
||||||
|
kleur@^3.0.0:
|
||||||
|
version "3.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
|
||||||
|
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
|
||||||
|
|
||||||
|
livereload-js@^3.1.0:
|
||||||
|
version "3.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.3.1.tgz#61f887468086762e61fb2987412cf9d1dda99202"
|
||||||
|
integrity sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==
|
||||||
|
|
||||||
|
livereload@^0.9.1:
|
||||||
|
version "0.9.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.1.tgz#65125dabdf2db4fd3f1169e953fe56e3bcc6f477"
|
||||||
|
integrity sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==
|
||||||
|
dependencies:
|
||||||
|
chokidar "^3.3.0"
|
||||||
|
livereload-js "^3.1.0"
|
||||||
|
opts ">= 1.2.0"
|
||||||
|
ws "^6.2.1"
|
||||||
|
|
||||||
|
local-access@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/local-access/-/local-access-1.0.1.tgz#5121258146d64e869046c642ea4f1dd39ff942bb"
|
||||||
|
integrity sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==
|
||||||
|
|
||||||
|
magic-string@^0.25.2:
|
||||||
|
version "0.25.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
|
||||||
|
integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
|
||||||
|
dependencies:
|
||||||
|
sourcemap-codec "^1.4.4"
|
||||||
|
|
||||||
|
merge-stream@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
||||||
|
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
|
||||||
|
|
||||||
|
mime@^2.3.1:
|
||||||
|
version "2.4.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
|
||||||
|
integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
|
||||||
|
|
||||||
|
minimatch@^3.0.4:
|
||||||
|
version "3.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||||
|
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
|
||||||
|
dependencies:
|
||||||
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
|
mri@^1.1.0:
|
||||||
|
version "1.1.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6"
|
||||||
|
integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==
|
||||||
|
|
||||||
|
normalize-path@^3.0.0, normalize-path@~3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
||||||
|
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
||||||
|
|
||||||
|
once@^1.3.0:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
|
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||||
|
dependencies:
|
||||||
|
wrappy "1"
|
||||||
|
|
||||||
|
"opts@>= 1.2.0":
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1"
|
||||||
|
integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==
|
||||||
|
|
||||||
|
path-is-absolute@^1.0.0:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||||
|
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||||
|
|
||||||
|
path-parse@^1.0.6:
|
||||||
|
version "1.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
|
||||||
|
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
|
||||||
|
|
||||||
|
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2:
|
||||||
|
version "2.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
|
||||||
|
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
|
||||||
|
|
||||||
|
randombytes@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
|
||||||
|
integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
|
||||||
|
dependencies:
|
||||||
|
safe-buffer "^5.1.0"
|
||||||
|
|
||||||
|
readdirp@~3.5.0:
|
||||||
|
version "3.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
|
||||||
|
integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
|
||||||
|
dependencies:
|
||||||
|
picomatch "^2.2.1"
|
||||||
|
|
||||||
|
require-relative@^0.8.7:
|
||||||
|
version "0.8.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
|
||||||
|
integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=
|
||||||
|
|
||||||
|
resolve@^1.11.0, resolve@^1.17.0:
|
||||||
|
version "1.19.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
|
||||||
|
integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
|
||||||
|
dependencies:
|
||||||
|
is-core-module "^2.1.0"
|
||||||
|
path-parse "^1.0.6"
|
||||||
|
|
||||||
|
rollup-plugin-livereload@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz#d3928d74e8cf2ae4286c5dd46b770fd3f3b82313"
|
||||||
|
integrity sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==
|
||||||
|
dependencies:
|
||||||
|
livereload "^0.9.1"
|
||||||
|
|
||||||
|
rollup-plugin-svelte@^6.0.0:
|
||||||
|
version "6.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz#66362cf0500fb7a848283ebcf19d289a60ef0871"
|
||||||
|
integrity sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow==
|
||||||
|
dependencies:
|
||||||
|
require-relative "^0.8.7"
|
||||||
|
rollup-pluginutils "^2.8.2"
|
||||||
|
sourcemap-codec "^1.4.8"
|
||||||
|
|
||||||
|
rollup-plugin-terser@^7.0.0:
|
||||||
|
version "7.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d"
|
||||||
|
integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==
|
||||||
|
dependencies:
|
||||||
|
"@babel/code-frame" "^7.10.4"
|
||||||
|
jest-worker "^26.2.1"
|
||||||
|
serialize-javascript "^4.0.0"
|
||||||
|
terser "^5.0.0"
|
||||||
|
|
||||||
|
rollup-pluginutils@^2.8.2:
|
||||||
|
version "2.8.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
|
||||||
|
integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
|
||||||
|
dependencies:
|
||||||
|
estree-walker "^0.6.1"
|
||||||
|
|
||||||
|
rollup@^2.3.4:
|
||||||
|
version "2.33.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.33.1.tgz#802795164164ee63cd47769d8879c33ec8ae0c40"
|
||||||
|
integrity sha512-uY4O/IoL9oNW8MMcbA5hcOaz6tZTMIh7qJHx/tzIJm+n1wLoY38BLn6fuy7DhR57oNFLMbDQtDeJoFURt5933w==
|
||||||
|
optionalDependencies:
|
||||||
|
fsevents "~2.1.2"
|
||||||
|
|
||||||
|
sade@^1.6.0:
|
||||||
|
version "1.7.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.4.tgz#ea681e0c65d248d2095c90578c03ca0bb1b54691"
|
||||||
|
integrity sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==
|
||||||
|
dependencies:
|
||||||
|
mri "^1.1.0"
|
||||||
|
|
||||||
|
safe-buffer@^5.1.0:
|
||||||
|
version "5.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||||
|
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||||
|
|
||||||
|
semiver@^1.0.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/semiver/-/semiver-1.1.0.tgz#9c97fb02c21c7ce4fcf1b73e2c7a24324bdddd5f"
|
||||||
|
integrity sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==
|
||||||
|
|
||||||
|
serialize-javascript@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
|
||||||
|
integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
|
||||||
|
dependencies:
|
||||||
|
randombytes "^2.1.0"
|
||||||
|
|
||||||
|
sirv-cli@^1.0.0:
|
||||||
|
version "1.0.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/sirv-cli/-/sirv-cli-1.0.8.tgz#150c3f62694203a86cf5d71ec60e6ff4c34064a9"
|
||||||
|
integrity sha512-bJI+kkzQvMKfAOfgLzv09kWsdymLm39LgKmGjacB19GHIAQLCvXXg8e8HzcofTjDZlA8zVv4dQjU9SWkNzkJhw==
|
||||||
|
dependencies:
|
||||||
|
console-clear "^1.1.0"
|
||||||
|
get-port "^3.2.0"
|
||||||
|
kleur "^3.0.0"
|
||||||
|
local-access "^1.0.1"
|
||||||
|
sade "^1.6.0"
|
||||||
|
semiver "^1.0.0"
|
||||||
|
sirv "^1.0.7"
|
||||||
|
tinydate "^1.0.0"
|
||||||
|
|
||||||
|
sirv@^1.0.7:
|
||||||
|
version "1.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.7.tgz#ad8ca1f84430777a59162592626c2b8e9b9f1384"
|
||||||
|
integrity sha512-QMT2OTD3CTr8de9VByPmvSEeyt6k8/Cxg0J2kQJ5HNhIWfhFg9ypcIWWzez9rPWnGj+WtJ7AZD/MdT/vdilV/A==
|
||||||
|
dependencies:
|
||||||
|
"@polka/url" "^1.0.0-next.9"
|
||||||
|
mime "^2.3.1"
|
||||||
|
totalist "^1.0.0"
|
||||||
|
|
||||||
|
source-map-support@~0.5.19:
|
||||||
|
version "0.5.19"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
|
||||||
|
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
|
||||||
|
dependencies:
|
||||||
|
buffer-from "^1.0.0"
|
||||||
|
source-map "^0.6.0"
|
||||||
|
|
||||||
|
source-map@^0.6.0:
|
||||||
|
version "0.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||||
|
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||||
|
|
||||||
|
source-map@~0.7.2:
|
||||||
|
version "0.7.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
|
||||||
|
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
|
||||||
|
|
||||||
|
sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8:
|
||||||
|
version "1.4.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
|
||||||
|
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
|
||||||
|
|
||||||
|
supports-color@^5.3.0:
|
||||||
|
version "5.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
|
||||||
|
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
|
||||||
|
dependencies:
|
||||||
|
has-flag "^3.0.0"
|
||||||
|
|
||||||
|
supports-color@^7.0.0:
|
||||||
|
version "7.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
|
||||||
|
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
|
||||||
|
dependencies:
|
||||||
|
has-flag "^4.0.0"
|
||||||
|
|
||||||
|
svelte@^3.0.0:
|
||||||
|
version "3.29.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.29.7.tgz#e254eb2d0d609ce0fd60f052d444ac4a66d90f7d"
|
||||||
|
integrity sha512-rx0g311kBODvEWUU01DFBUl3MJuJven04bvTVFUG/w0On/wuj0PajQY/QlXcJndFxG+W1s8iXKaB418tdHWc3A==
|
||||||
|
|
||||||
|
terser@^5.0.0:
|
||||||
|
version "5.3.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd"
|
||||||
|
integrity sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==
|
||||||
|
dependencies:
|
||||||
|
commander "^2.20.0"
|
||||||
|
source-map "~0.7.2"
|
||||||
|
source-map-support "~0.5.19"
|
||||||
|
|
||||||
|
tinydate@^1.0.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/tinydate/-/tinydate-1.3.0.tgz#e6ca8e5a22b51bb4ea1c3a2a4fd1352dbd4c57fb"
|
||||||
|
integrity sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==
|
||||||
|
|
||||||
|
to-regex-range@^5.0.1:
|
||||||
|
version "5.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||||
|
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
|
||||||
|
dependencies:
|
||||||
|
is-number "^7.0.0"
|
||||||
|
|
||||||
|
totalist@^1.0.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df"
|
||||||
|
integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==
|
||||||
|
|
||||||
|
wrappy@1:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||||
|
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||||
|
|
||||||
|
ws@^6.2.1:
|
||||||
|
version "6.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
|
||||||
|
integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
|
||||||
|
dependencies:
|
||||||
|
async-limiter "~1.0.0"
|
||||||
@@ -17,6 +17,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `blitz build`"
|
"placeholder": "`npm run build` or `blitz build`"
|
||||||
},
|
},
|
||||||
@@ -47,6 +50,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `next build`"
|
"placeholder": "`npm run build` or `next build`"
|
||||||
},
|
},
|
||||||
@@ -56,7 +62,13 @@
|
|||||||
"outputDirectory": {
|
"outputDirectory": {
|
||||||
"placeholder": "Next.js default"
|
"placeholder": "Next.js default"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"recommendedIntegrations": [
|
||||||
|
{
|
||||||
|
"id": "oac_5lUsiANun1DEzgLg0NZx5Es3",
|
||||||
|
"dependencies": ["next-plugin-sentry", "next-sentry-source-maps"]
|
||||||
}
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Gatsby.js",
|
"name": "Gatsby.js",
|
||||||
@@ -76,6 +88,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `gatsby build`"
|
"placeholder": "`npm run build` or `gatsby build`"
|
||||||
},
|
},
|
||||||
@@ -105,6 +120,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `hexo generate`"
|
"placeholder": "`npm run build` or `hexo generate`"
|
||||||
},
|
},
|
||||||
@@ -134,6 +152,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `npx @11ty/eleventy`"
|
"placeholder": "`npm run build` or `npx @11ty/eleventy`"
|
||||||
},
|
},
|
||||||
@@ -162,6 +183,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `docusaurus build`"
|
"placeholder": "`npm run build` or `docusaurus build`"
|
||||||
},
|
},
|
||||||
@@ -190,6 +214,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `docusaurus-build`"
|
"placeholder": "`npm run build` or `docusaurus-build`"
|
||||||
},
|
},
|
||||||
@@ -218,6 +245,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `preact build`"
|
"placeholder": "`npm run build` or `preact build`"
|
||||||
},
|
},
|
||||||
@@ -249,6 +279,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `dojo build`"
|
"placeholder": "`npm run build` or `dojo build`"
|
||||||
},
|
},
|
||||||
@@ -277,6 +310,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `ember build`"
|
"placeholder": "`npm run build` or `ember build`"
|
||||||
},
|
},
|
||||||
@@ -305,6 +341,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `vue-cli-service build`"
|
"placeholder": "`npm run build` or `vue-cli-service build`"
|
||||||
},
|
},
|
||||||
@@ -333,6 +372,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `ng build && scully`"
|
"placeholder": "`npm run build` or `ng build && scully`"
|
||||||
},
|
},
|
||||||
@@ -361,6 +403,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `ng build`"
|
"placeholder": "`npm run build` or `ng build`"
|
||||||
},
|
},
|
||||||
@@ -389,6 +434,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `ng build`"
|
"placeholder": "`npm run build` or `ng build`"
|
||||||
},
|
},
|
||||||
@@ -417,6 +465,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `polymer build`"
|
"placeholder": "`npm run build` or `polymer build`"
|
||||||
},
|
},
|
||||||
@@ -445,6 +496,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `rollup -c`"
|
"placeholder": "`npm run build` or `rollup -c`"
|
||||||
},
|
},
|
||||||
@@ -473,6 +527,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `react-scripts build`"
|
"placeholder": "`npm run build` or `react-scripts build`"
|
||||||
},
|
},
|
||||||
@@ -505,6 +562,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `react-scripts build`"
|
"placeholder": "`npm run build` or `react-scripts build`"
|
||||||
},
|
},
|
||||||
@@ -533,6 +593,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `gridsome build`"
|
"placeholder": "`npm run build` or `gridsome build`"
|
||||||
},
|
},
|
||||||
@@ -561,6 +624,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `umi build`"
|
"placeholder": "`npm run build` or `umi build`"
|
||||||
},
|
},
|
||||||
@@ -589,6 +655,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `sapper export`"
|
"placeholder": "`npm run build` or `sapper export`"
|
||||||
},
|
},
|
||||||
@@ -617,6 +686,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `saber build`"
|
"placeholder": "`npm run build` or `saber build`"
|
||||||
},
|
},
|
||||||
@@ -645,6 +717,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `stencil build`"
|
"placeholder": "`npm run build` or `stencil build`"
|
||||||
},
|
},
|
||||||
@@ -673,6 +748,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `nuxt generate`"
|
"placeholder": "`npm run build` or `nuxt generate`"
|
||||||
},
|
},
|
||||||
@@ -703,6 +781,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"value": "yarn rw build && yarn rw db up --no-db-client --auto-approve && yarn rw dataMigrate up"
|
"value": "yarn rw build && yarn rw db up --no-db-client --auto-approve && yarn rw dataMigrate up"
|
||||||
},
|
},
|
||||||
@@ -737,6 +818,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "None"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `hugo -D --gc`"
|
"placeholder": "`npm run build` or `hugo -D --gc`"
|
||||||
},
|
},
|
||||||
@@ -764,6 +848,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"value": "bundle install"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `jekyll build`"
|
"placeholder": "`npm run build` or `jekyll build`"
|
||||||
},
|
},
|
||||||
@@ -791,6 +878,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run build` or `brunch build --production`"
|
"placeholder": "`npm run build` or `brunch build --production`"
|
||||||
},
|
},
|
||||||
@@ -818,6 +908,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"value": "bundle install"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"value": "`npm run build` or `bundle exec middleman build`"
|
"value": "`npm run build` or `bundle exec middleman build`"
|
||||||
},
|
},
|
||||||
@@ -835,6 +928,9 @@
|
|||||||
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/other.svg",
|
"logo": "https://raw.githubusercontent.com/vercel/vercel/master/packages/frameworks/logos/other.svg",
|
||||||
"description": "No framework or a unoptimized framework.",
|
"description": "No framework or a unoptimized framework.",
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"installCommand": {
|
||||||
|
"placeholder": "`yarn install` or `npm install`"
|
||||||
|
},
|
||||||
"buildCommand": {
|
"buildCommand": {
|
||||||
"placeholder": "`npm run vercel-build` or `npm run build`"
|
"placeholder": "`npm run vercel-build` or `npm run build`"
|
||||||
},
|
},
|
||||||
|
|||||||
4
packages/frameworks/index.d.ts
vendored
4
packages/frameworks/index.d.ts
vendored
@@ -31,4 +31,8 @@ export interface Framework {
|
|||||||
devCommand: Setting;
|
devCommand: Setting;
|
||||||
outputDirectory: Setting;
|
outputDirectory: Setting;
|
||||||
};
|
};
|
||||||
|
recommendedIntegrations?: {
|
||||||
|
id: string;
|
||||||
|
dependencies: string[];
|
||||||
|
}[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vercel/frameworks",
|
"name": "@vercel/frameworks",
|
||||||
"version": "0.1.1",
|
"version": "0.2.0",
|
||||||
"main": "frameworks.json",
|
"main": "frameworks.json",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
27
packages/frameworks/test/frameworks.unit.test.ts
vendored
27
packages/frameworks/test/frameworks.unit.test.ts
vendored
@@ -89,14 +89,39 @@ const Schema = {
|
|||||||
},
|
},
|
||||||
settings: {
|
settings: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
required: ['buildCommand', 'devCommand', 'outputDirectory'],
|
required: [
|
||||||
|
'installCommand',
|
||||||
|
'buildCommand',
|
||||||
|
'devCommand',
|
||||||
|
'outputDirectory',
|
||||||
|
],
|
||||||
additionalProperties: false,
|
additionalProperties: false,
|
||||||
properties: {
|
properties: {
|
||||||
|
installCommand: SchemaSettings,
|
||||||
buildCommand: SchemaSettings,
|
buildCommand: SchemaSettings,
|
||||||
devCommand: SchemaSettings,
|
devCommand: SchemaSettings,
|
||||||
outputDirectory: SchemaSettings,
|
outputDirectory: SchemaSettings,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
recommendedIntegrations: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
required: ['id', 'dependencies'],
|
||||||
|
additionalProperties: false,
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
dependencies: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vercel/build-utils",
|
"name": "@vercel/build-utils",
|
||||||
"version": "2.5.4",
|
"version": "2.7.1-canary.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.js",
|
"types": "./dist/index.d.js",
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
"@types/node-fetch": "^2.1.6",
|
"@types/node-fetch": "^2.1.6",
|
||||||
"@types/semver": "6.0.0",
|
"@types/semver": "6.0.0",
|
||||||
"@types/yazl": "^2.4.1",
|
"@types/yazl": "^2.4.1",
|
||||||
"@vercel/frameworks": "0.1.1",
|
"@vercel/frameworks": "0.2.0",
|
||||||
"@vercel/ncc": "0.24.0",
|
"@vercel/ncc": "0.24.0",
|
||||||
"aggregate-error": "3.0.1",
|
"aggregate-error": "3.0.1",
|
||||||
"async-retry": "1.2.3",
|
"async-retry": "1.2.3",
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ interface Options {
|
|||||||
projectSettings?: {
|
projectSettings?: {
|
||||||
framework?: string | null;
|
framework?: string | null;
|
||||||
devCommand?: string | null;
|
devCommand?: string | null;
|
||||||
|
installCommand?: string | null;
|
||||||
buildCommand?: string | null;
|
buildCommand?: string | null;
|
||||||
outputDirectory?: string | null;
|
outputDirectory?: string | null;
|
||||||
createdAt?: number;
|
createdAt?: number;
|
||||||
@@ -42,9 +43,8 @@ export function sortFiles(fileA: string, fileB: string) {
|
|||||||
export function detectApiExtensions(builders: Builder[]): Set<string> {
|
export function detectApiExtensions(builders: Builder[]): Set<string> {
|
||||||
return new Set<string>(
|
return new Set<string>(
|
||||||
builders
|
builders
|
||||||
.filter(
|
.filter((b): b is Builder & { src: string } =>
|
||||||
b =>
|
Boolean(b.config && b.config.zeroConfig && b.src?.startsWith('api/'))
|
||||||
b.config && b.config.zeroConfig && b.src && b.src.startsWith('api/')
|
|
||||||
)
|
)
|
||||||
.map(b => extname(b.src))
|
.map(b => extname(b.src))
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
@@ -55,22 +55,28 @@ export function detectApiDirectory(builders: Builder[]): string | null {
|
|||||||
// TODO: We eventually want to save the api directory to
|
// TODO: We eventually want to save the api directory to
|
||||||
// builder.config.apiDirectory so it is only detected once
|
// builder.config.apiDirectory so it is only detected once
|
||||||
const found = builders.some(
|
const found = builders.some(
|
||||||
b => b.config && b.config.zeroConfig && b.src.startsWith('api/')
|
b => b.config && b.config.zeroConfig && b.src?.startsWith('api/')
|
||||||
);
|
);
|
||||||
return found ? 'api' : null;
|
return found ? 'api' : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Replace this function with `config.outputDirectory`
|
// TODO: Replace this function with `config.outputDirectory`
|
||||||
function getPublicBuilder(builders: Builder[]): Builder | null {
|
function getPublicBuilder(
|
||||||
const builder = builders.find(
|
builders: Builder[]
|
||||||
builder =>
|
): (Builder & { src: string }) | null {
|
||||||
|
for (const builder of builders) {
|
||||||
|
if (
|
||||||
|
typeof builder.src === 'string' &&
|
||||||
isOfficialRuntime('static', builder.use) &&
|
isOfficialRuntime('static', builder.use) &&
|
||||||
/^.*\/\*\*\/\*$/.test(builder.src) &&
|
/^.*\/\*\*\/\*$/.test(builder.src) &&
|
||||||
builder.config &&
|
builder.config &&
|
||||||
builder.config.zeroConfig === true
|
builder.config.zeroConfig === true
|
||||||
);
|
) {
|
||||||
|
return builder as Builder & { src: string };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return builder || null;
|
return null;
|
||||||
}
|
}
|
||||||
export function detectOutputDirectory(builders: Builder[]): string | null {
|
export function detectOutputDirectory(builders: Builder[]): string | null {
|
||||||
// TODO: We eventually want to save the output directory to
|
// TODO: We eventually want to save the output directory to
|
||||||
@@ -360,7 +366,7 @@ function maybeGetApiBuilder(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const match = apiMatches.find(({ src }) => {
|
const match = apiMatches.find(({ src = '**' }) => {
|
||||||
return src === fileName || minimatch(fileName, src);
|
return src === fileName || minimatch(fileName, src);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -450,6 +456,10 @@ function detectFrontBuilder(
|
|||||||
config.devCommand = projectSettings.devCommand;
|
config.devCommand = projectSettings.devCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof projectSettings.installCommand === 'string') {
|
||||||
|
config.installCommand = projectSettings.installCommand;
|
||||||
|
}
|
||||||
|
|
||||||
if (projectSettings.buildCommand) {
|
if (projectSettings.buildCommand) {
|
||||||
config.buildCommand = projectSettings.buildCommand;
|
config.buildCommand = projectSettings.buildCommand;
|
||||||
}
|
}
|
||||||
@@ -984,7 +994,6 @@ function getRouteResult(
|
|||||||
rewriteRoutes.push({
|
rewriteRoutes.push({
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
status: 404,
|
status: 404,
|
||||||
continue: true,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -165,8 +165,8 @@ export function getSpawnOptions(
|
|||||||
export async function getNodeVersion(
|
export async function getNodeVersion(
|
||||||
destPath: string,
|
destPath: string,
|
||||||
_nodeVersion?: string,
|
_nodeVersion?: string,
|
||||||
_config?: Config,
|
config: Config = {},
|
||||||
meta?: Meta
|
meta: Meta = {}
|
||||||
): Promise<NodeVersion> {
|
): Promise<NodeVersion> {
|
||||||
if (meta && meta.isDev) {
|
if (meta && meta.isDev) {
|
||||||
// Use the system-installed version of `node` in PATH for `vercel dev`
|
// Use the system-installed version of `node` in PATH for `vercel dev`
|
||||||
@@ -174,13 +174,22 @@ export async function getNodeVersion(
|
|||||||
return { ...latest, runtime: 'nodejs' };
|
return { ...latest, runtime: 'nodejs' };
|
||||||
}
|
}
|
||||||
const { packageJson } = await scanParentDirs(destPath, true);
|
const { packageJson } = await scanParentDirs(destPath, true);
|
||||||
let range: string | undefined;
|
let { nodeVersion } = config;
|
||||||
let isAuto = true;
|
let isAuto = true;
|
||||||
if (packageJson && packageJson.engines && packageJson.engines.node) {
|
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;
|
isAuto = false;
|
||||||
}
|
}
|
||||||
return getSupportedNodeVersion(range, isAuto);
|
return getSupportedNodeVersion(nodeVersion, isAuto);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function scanParentDirs(destPath: string, readPackageJson = false) {
|
async function scanParentDirs(destPath: string, readPackageJson = false) {
|
||||||
@@ -292,6 +301,11 @@ export async function runNpmInstall(
|
|||||||
opts.prettyCommand = 'yarn install';
|
opts.prettyCommand = 'yarn install';
|
||||||
command = 'yarn';
|
command = 'yarn';
|
||||||
commandArgs = ['install', ...args];
|
commandArgs = ['install', ...args];
|
||||||
|
|
||||||
|
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
|
||||||
|
if (!env.YARN_NODE_LINKER) {
|
||||||
|
env.YARN_NODE_LINKER = 'node-modules';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.NPM_ONLY_PRODUCTION) {
|
if (process.env.NPM_ONLY_PRODUCTION) {
|
||||||
@@ -388,10 +402,17 @@ export async function runPackageJsonScript(
|
|||||||
prettyCommand,
|
prettyCommand,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
|
||||||
|
const env: typeof process.env = { ...spawnOpts?.env };
|
||||||
|
if (!env.YARN_NODE_LINKER) {
|
||||||
|
env.YARN_NODE_LINKER = 'node-modules';
|
||||||
|
}
|
||||||
|
|
||||||
const prettyCommand = `yarn run ${scriptName}`;
|
const prettyCommand = `yarn run ${scriptName}`;
|
||||||
console.log(`Running "${prettyCommand}"`);
|
console.log(`Running "${prettyCommand}"`);
|
||||||
await spawnAsync('yarn', ['run', scriptName], {
|
await spawnAsync('yarn', ['run', scriptName], {
|
||||||
...spawnOpts,
|
...spawnOpts,
|
||||||
|
env,
|
||||||
cwd: destPath,
|
cwd: destPath,
|
||||||
prettyCommand,
|
prettyCommand,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ export interface Config {
|
|||||||
import?: { [key: string]: string };
|
import?: { [key: string]: string };
|
||||||
functions?: BuilderFunctions;
|
functions?: BuilderFunctions;
|
||||||
outputDirectory?: string;
|
outputDirectory?: string;
|
||||||
|
installCommand?: string;
|
||||||
buildCommand?: string;
|
buildCommand?: string;
|
||||||
devCommand?: string;
|
devCommand?: string;
|
||||||
framework?: string;
|
framework?: string;
|
||||||
@@ -335,7 +336,7 @@ export interface NodeVersion {
|
|||||||
|
|
||||||
export interface Builder {
|
export interface Builder {
|
||||||
use: string;
|
use: string;
|
||||||
src: string;
|
src?: string;
|
||||||
config?: Config;
|
config?: Config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
5
packages/now-build-utils/test/fixtures/19-yarn-v2/api/index.js
vendored
Normal file
5
packages/now-build-utils/test/fixtures/19-yarn-v2/api/index.js
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
const { camelCase } = require('camel-case');
|
||||||
|
|
||||||
|
module.exports = (req, res) => {
|
||||||
|
res.end(camelCase('camel-case module is working'));
|
||||||
|
};
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 2,
|
|
||||||
"builds": [{ "src": "package.json", "use": "@vercel/static-build" }],
|
|
||||||
"probes": [{ "path": "/", "mustContain": "Svelte app" }]
|
|
||||||
}
|
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
"svelte": "^3.0.0"
|
"svelte": "^3.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"camel-case": "^4.1.2",
|
||||||
"sirv-cli": "^0.4.4"
|
"sirv-cli": "^0.4.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
packages/now-build-utils/test/fixtures/19-yarn-v2/vercel.json
vendored
Normal file
11
packages/now-build-utils/test/fixtures/19-yarn-v2/vercel.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"builds": [
|
||||||
|
{ "src": "package.json", "use": "@vercel/static-build" },
|
||||||
|
{ "src": "api/index.js", "use": "@vercel/node" }
|
||||||
|
],
|
||||||
|
"probes": [
|
||||||
|
{ "path": "/", "mustContain": "Svelte app" },
|
||||||
|
{ "path": "/api", "mustContain": "camelCaseModuleIsWorking" }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -270,6 +270,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"camel-case@npm:^4.1.2":
|
||||||
|
version: 4.1.2
|
||||||
|
resolution: "camel-case@npm:4.1.2"
|
||||||
|
dependencies:
|
||||||
|
pascal-case: ^3.1.2
|
||||||
|
tslib: ^2.0.3
|
||||||
|
checksum: 3/0b8dcfb424c9497e45984b88ef005c66bdf8e877e36365aedfc3cf73182684fde5a14cf2c526579c0351a5f27dc39a00f1edecc25d43606075fea948c504e37f
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"caseless@npm:~0.12.0":
|
"caseless@npm:~0.12.0":
|
||||||
version: 0.12.0
|
version: 0.12.0
|
||||||
resolution: "caseless@npm:0.12.0"
|
resolution: "caseless@npm:0.12.0"
|
||||||
@@ -850,6 +860,15 @@ fsevents@~2.1.2:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"lower-case@npm:^2.0.2":
|
||||||
|
version: 2.0.2
|
||||||
|
resolution: "lower-case@npm:2.0.2"
|
||||||
|
dependencies:
|
||||||
|
tslib: ^2.0.3
|
||||||
|
checksum: 3/aabaca9cef65f7564a1005b625664527e4d169e363101e65773f8f6ff2fdcf09884a3bc02990cd7a62cf05f3538114af25ee7bef553f1ca3208c8a77ac75cbfa
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"magic-string@npm:^0.25.2":
|
"magic-string@npm:^0.25.2":
|
||||||
version: 0.25.7
|
version: 0.25.7
|
||||||
resolution: "magic-string@npm:0.25.7"
|
resolution: "magic-string@npm:0.25.7"
|
||||||
@@ -944,6 +963,16 @@ fsevents@~2.1.2:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"no-case@npm:^3.0.4":
|
||||||
|
version: 3.0.4
|
||||||
|
resolution: "no-case@npm:3.0.4"
|
||||||
|
dependencies:
|
||||||
|
lower-case: ^2.0.2
|
||||||
|
tslib: ^2.0.3
|
||||||
|
checksum: 3/84db4909caec37504c6655f995a004067f8733be8cd8d849f1578661b60a1685e086325fa4e1a5e8ce94e7416c1d0f037e2a00f635a14457183de80ab4fc7612
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"node-gyp@npm:latest":
|
"node-gyp@npm:latest":
|
||||||
version: 6.1.0
|
version: 6.1.0
|
||||||
resolution: "node-gyp@npm:6.1.0"
|
resolution: "node-gyp@npm:6.1.0"
|
||||||
@@ -1057,6 +1086,16 @@ fsevents@~2.1.2:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"pascal-case@npm:^3.1.2":
|
||||||
|
version: 3.1.2
|
||||||
|
resolution: "pascal-case@npm:3.1.2"
|
||||||
|
dependencies:
|
||||||
|
no-case: ^3.0.4
|
||||||
|
tslib: ^2.0.3
|
||||||
|
checksum: 3/31708cecab221482edc81e2bd9b9d8282d72d4f1443b31f39725aa23768c5e42d93c4c014f1bc90f7f074e2a70d5091e4892ea370e550affc9ccf1d33c900bcd
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"path-is-absolute@npm:^1.0.0":
|
"path-is-absolute@npm:^1.0.0":
|
||||||
version: 1.0.1
|
version: 1.0.1
|
||||||
resolution: "path-is-absolute@npm:1.0.1"
|
resolution: "path-is-absolute@npm:1.0.1"
|
||||||
@@ -1447,6 +1486,7 @@ fsevents@~2.1.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@rollup/plugin-commonjs": ^12.0.0
|
"@rollup/plugin-commonjs": ^12.0.0
|
||||||
"@rollup/plugin-node-resolve": ^8.0.0
|
"@rollup/plugin-node-resolve": ^8.0.0
|
||||||
|
camel-case: ^4.1.2
|
||||||
rollup: ^2.3.4
|
rollup: ^2.3.4
|
||||||
rollup-plugin-livereload: ^1.0.0
|
rollup-plugin-livereload: ^1.0.0
|
||||||
rollup-plugin-svelte: ^5.0.3
|
rollup-plugin-svelte: ^5.0.3
|
||||||
@@ -1517,6 +1557,13 @@ fsevents@~2.1.2:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"tslib@npm:^2.0.3":
|
||||||
|
version: 2.0.3
|
||||||
|
resolution: "tslib@npm:2.0.3"
|
||||||
|
checksum: 3/447bfca5deaa157806c3f77eaba74d05dd0b38b014e47ce79d98b5c77ce7d91b00a687ba13ca1b5a74d35ca1098ac7a072c0a97fad06f0266612f2a03a6c8e8f
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"tunnel-agent@npm:^0.6.0":
|
"tunnel-agent@npm:^0.6.0":
|
||||||
version: 0.6.0
|
version: 0.6.0
|
||||||
resolution: "tunnel-agent@npm:0.6.0"
|
resolution: "tunnel-agent@npm:0.6.0"
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ for (const fixture of fs.readdirSync(fixturesPath)) {
|
|||||||
|
|
||||||
// few foreign tests
|
// few foreign tests
|
||||||
|
|
||||||
const buildersToTestWith = ['now-next', 'now-node', 'now-static-build'];
|
const buildersToTestWith = ['now-node'];
|
||||||
|
|
||||||
// eslint-disable-next-line no-restricted-syntax
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
for (const builder of buildersToTestWith) {
|
for (const builder of buildersToTestWith) {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"private": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "10.x"
|
"node": "10.x"
|
||||||
}
|
}
|
||||||
@@ -182,7 +182,7 @@ describe('Test `detectBuilders`', () => {
|
|||||||
|
|
||||||
const { builders } = await detectBuilders(files);
|
const { builders } = await detectBuilders(files);
|
||||||
expect(builders!.length).toBe(7);
|
expect(builders!.length).toBe(7);
|
||||||
expect(builders!.some(b => b.src.endsWith('_test.go'))).toBe(false);
|
expect(builders!.some(b => b.src!.endsWith('_test.go'))).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('just public', async () => {
|
it('just public', async () => {
|
||||||
@@ -833,6 +833,50 @@ describe('Test `detectBuilders`', () => {
|
|||||||
describe('Test `detectBuilders` with `featHandleMiss=true`', () => {
|
describe('Test `detectBuilders` with `featHandleMiss=true`', () => {
|
||||||
const featHandleMiss = true;
|
const featHandleMiss = true;
|
||||||
|
|
||||||
|
it('should select "installCommand"', async () => {
|
||||||
|
const pkg = {
|
||||||
|
scripts: { build: 'next build' },
|
||||||
|
dependencies: { next: '9.0.0' },
|
||||||
|
};
|
||||||
|
const files = ['package.json', 'pages/index.js', 'public/index.html'];
|
||||||
|
const { builders, errors } = await detectBuilders(files, pkg, {
|
||||||
|
featHandleMiss,
|
||||||
|
projectSettings: {
|
||||||
|
installCommand: 'npx pnpm install',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(errors).toBe(null);
|
||||||
|
expect(builders).toBeDefined();
|
||||||
|
expect(builders!.length).toStrictEqual(1);
|
||||||
|
expect(builders![0].src).toStrictEqual('package.json');
|
||||||
|
expect(builders![0].use).toStrictEqual('@vercel/next');
|
||||||
|
expect(builders![0].config!.zeroConfig).toStrictEqual(true);
|
||||||
|
expect(builders![0].config!.installCommand).toStrictEqual(
|
||||||
|
'npx pnpm install'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should select empty "installCommand"', async () => {
|
||||||
|
const pkg = {
|
||||||
|
scripts: { build: 'next build' },
|
||||||
|
dependencies: { next: '9.0.0' },
|
||||||
|
};
|
||||||
|
const files = ['package.json', 'pages/index.js', 'public/index.html'];
|
||||||
|
const { builders, errors } = await detectBuilders(files, pkg, {
|
||||||
|
featHandleMiss,
|
||||||
|
projectSettings: {
|
||||||
|
installCommand: '',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(errors).toBe(null);
|
||||||
|
expect(builders).toBeDefined();
|
||||||
|
expect(builders!.length).toStrictEqual(1);
|
||||||
|
expect(builders![0].src).toStrictEqual('package.json');
|
||||||
|
expect(builders![0].use).toStrictEqual('@vercel/next');
|
||||||
|
expect(builders![0].config!.zeroConfig).toStrictEqual(true);
|
||||||
|
expect(builders![0].config!.installCommand).toStrictEqual('');
|
||||||
|
});
|
||||||
|
|
||||||
it('should never select now.json src', async () => {
|
it('should never select now.json src', async () => {
|
||||||
const files = ['docs/index.md', 'mkdocs.yml', 'now.json'];
|
const files = ['docs/index.md', 'mkdocs.yml', 'now.json'];
|
||||||
const { builders, errors } = await detectBuilders(files, null, {
|
const { builders, errors } = await detectBuilders(files, null, {
|
||||||
@@ -1297,7 +1341,7 @@ describe('Test `detectBuilders` with `featHandleMiss=true`', () => {
|
|||||||
featHandleMiss,
|
featHandleMiss,
|
||||||
});
|
});
|
||||||
expect(builders!.length).toBe(7);
|
expect(builders!.length).toBe(7);
|
||||||
expect(builders!.some(b => b.src.endsWith('_test.go'))).toBe(false);
|
expect(builders!.some(b => b.src!.endsWith('_test.go'))).toBe(false);
|
||||||
expect(errorRoutes!.length).toBe(1);
|
expect(errorRoutes!.length).toBe(1);
|
||||||
expect((errorRoutes![0] as Source).status).toBe(404);
|
expect((errorRoutes![0] as Source).status).toBe(404);
|
||||||
});
|
});
|
||||||
@@ -2349,7 +2393,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
expect(errorRoutes).toStrictEqual([
|
expect(errorRoutes).toStrictEqual([
|
||||||
@@ -2451,7 +2494,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2489,7 +2531,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2527,7 +2568,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2560,7 +2600,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2588,7 +2627,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2619,7 +2657,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2646,7 +2683,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`', async () => {
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2681,7 +2717,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
expect(errorRoutes).toStrictEqual([
|
expect(errorRoutes).toStrictEqual([
|
||||||
@@ -2776,7 +2811,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2809,7 +2843,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2843,7 +2876,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2869,7 +2901,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2893,7 +2924,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2918,7 +2948,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2939,7 +2968,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`', async ()
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -2974,7 +3002,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -3032,7 +3059,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -3065,7 +3091,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -3099,7 +3124,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -3118,7 +3142,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -3142,7 +3165,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -3167,7 +3189,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
@@ -3188,7 +3209,6 @@ it('Test `detectRoutes` with `featHandleMiss=true`, `cleanUrls=true`, `trailingS
|
|||||||
{
|
{
|
||||||
status: 404,
|
status: 404,
|
||||||
src: '^/api(/.*)?$',
|
src: '^/api(/.*)?$',
|
||||||
continue: true,
|
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
46
packages/now-build-utils/test/unit.test.js
vendored
46
packages/now-build-utils/test/unit.test.js
vendored
@@ -24,6 +24,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 () => {
|
it('should re-create symlinks properly', async () => {
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
console.log('Skipping test on windows');
|
console.log('Skipping test on windows');
|
||||||
@@ -150,6 +163,39 @@ it('should ignore node version in vercel dev getNodeVersion()', async () => {
|
|||||||
).toHaveProperty('runtime', 'nodejs');
|
).toHaveProperty('runtime', 'nodejs');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should select project setting from config when no package.json is found', async () => {
|
||||||
|
expect(
|
||||||
|
await getNodeVersion('/tmp', undefined, { nodeVersion: '10.x' }, {})
|
||||||
|
).toHaveProperty('range', '10.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', '10.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: '10.x' },
|
||||||
|
{}
|
||||||
|
)
|
||||||
|
).toHaveProperty('range', '10.x');
|
||||||
|
expect(warningMessages).toStrictEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
it('should get latest node version', async () => {
|
it('should get latest node version', async () => {
|
||||||
expect(await getLatestNodeVersion()).toHaveProperty('major', 12);
|
expect(await getLatestNodeVersion()).toHaveProperty('major', 12);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vercel",
|
"name": "vercel",
|
||||||
"version": "20.1.2",
|
"version": "21.1.1-canary.3",
|
||||||
"preferGlobal": true,
|
"preferGlobal": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"description": "The command-line interface for Vercel",
|
"description": "The command-line interface for Vercel",
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"preinstall": "node ./scripts/preinstall.js",
|
"preinstall": "node ./scripts/preinstall.js",
|
||||||
"test-unit": "nyc ava test/unit.js test/dev-builder.unit.js test/dev-router.unit.js test/dev-server.unit.js test/dev-validate.unit.js --serial --fail-fast --verbose",
|
"test-unit": "nyc ava test/unit.js test/dev-builder.unit.js test/dev-router.unit.js test/dev-server.unit.js test/dev-validate.unit.js --serial --fail-fast --verbose",
|
||||||
"test-integration-cli": "ava test/integration.js --serial --fail-fast --verbose",
|
"test-integration-cli": "rimraf test/fixtures/integration && ava test/integration.js --serial --fail-fast --verbose",
|
||||||
"test-integration-dev": "ava test/dev/integration.js --serial --fail-fast --verbose",
|
"test-integration-dev": "ava test/dev/integration.js --serial --fail-fast --verbose",
|
||||||
"prepublishOnly": "yarn build",
|
"prepublishOnly": "yarn build",
|
||||||
"coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov",
|
"coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov",
|
||||||
@@ -61,11 +61,11 @@
|
|||||||
"node": ">= 10"
|
"node": ">= 10"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vercel/build-utils": "2.5.4",
|
"@vercel/build-utils": "2.7.1-canary.2",
|
||||||
"@vercel/go": "1.1.6",
|
"@vercel/go": "1.1.7",
|
||||||
"@vercel/node": "1.8.4",
|
"@vercel/node": "1.9.0",
|
||||||
"@vercel/python": "1.2.3",
|
"@vercel/python": "1.2.4",
|
||||||
"@vercel/ruby": "1.2.4",
|
"@vercel/ruby": "1.2.5",
|
||||||
"update-notifier": "4.1.0"
|
"update-notifier": "4.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
"@types/universal-analytics": "0.4.2",
|
"@types/universal-analytics": "0.4.2",
|
||||||
"@types/which": "1.3.2",
|
"@types/which": "1.3.2",
|
||||||
"@types/write-json-file": "2.2.1",
|
"@types/write-json-file": "2.2.1",
|
||||||
"@vercel/frameworks": "0.1.1",
|
"@vercel/frameworks": "0.2.0",
|
||||||
"@vercel/ncc": "0.24.0",
|
"@vercel/ncc": "0.24.0",
|
||||||
"@zeit/fun": "0.11.2",
|
"@zeit/fun": "0.11.2",
|
||||||
"@zeit/source-map-support": "0.6.2",
|
"@zeit/source-map-support": "0.6.2",
|
||||||
@@ -146,7 +146,6 @@
|
|||||||
"minimatch": "3.0.4",
|
"minimatch": "3.0.4",
|
||||||
"mri": "1.1.5",
|
"mri": "1.1.5",
|
||||||
"ms": "2.1.2",
|
"ms": "2.1.2",
|
||||||
"nanoid": "3.0.2",
|
|
||||||
"node-fetch": "2.6.1",
|
"node-fetch": "2.6.1",
|
||||||
"npm-package-arg": "6.1.0",
|
"npm-package-arg": "6.1.0",
|
||||||
"nyc": "13.2.0",
|
"nyc": "13.2.0",
|
||||||
@@ -158,6 +157,7 @@
|
|||||||
"psl": "1.1.31",
|
"psl": "1.1.31",
|
||||||
"qr-image": "3.2.0",
|
"qr-image": "3.2.0",
|
||||||
"raw-body": "2.4.1",
|
"raw-body": "2.4.1",
|
||||||
|
"rimraf": "3.0.2",
|
||||||
"semver": "5.5.0",
|
"semver": "5.5.0",
|
||||||
"serve-handler": "6.1.1",
|
"serve-handler": "6.1.1",
|
||||||
"sinon": "4.4.2",
|
"sinon": "4.4.2",
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import chalk from 'chalk';
|
|||||||
|
|
||||||
import { handleError } from '../../util/error';
|
import { handleError } from '../../util/error';
|
||||||
|
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import getSubcommand from '../../util/get-subcommand';
|
import getSubcommand from '../../util/get-subcommand';
|
||||||
import logo from '../../util/output/logo';
|
import logo from '../../util/output/logo';
|
||||||
@@ -92,15 +91,14 @@ export default async function main(ctx) {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const output = createOutput({ debug: argv['--debug'] });
|
|
||||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||||
|
|
||||||
switch (subcommand) {
|
switch (subcommand) {
|
||||||
case 'ls':
|
case 'ls':
|
||||||
return ls(ctx, argv, args, output);
|
return ls(ctx, argv, args);
|
||||||
case 'rm':
|
case 'rm':
|
||||||
return rm(ctx, argv, args, output);
|
return rm(ctx, argv, args);
|
||||||
default:
|
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 getCommandFlags from '../../util/get-command-flags';
|
||||||
import { getCommandName } from '../../util/pkg-name.ts';
|
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 {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
@@ -23,6 +24,7 @@ export default async function ls(ctx, opts, args, output) {
|
|||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
@@ -47,6 +49,7 @@ export default async function ls(ctx, opts, args, output) {
|
|||||||
token,
|
token,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
const lsStamp = stamp();
|
const lsStamp = stamp();
|
||||||
let cancelWait;
|
let cancelWait;
|
||||||
|
|||||||
@@ -7,14 +7,15 @@ import getScope from '../../util/get-scope.ts';
|
|||||||
import removeAliasById from '../../util/alias/remove-alias-by-id';
|
import removeAliasById from '../../util/alias/remove-alias-by-id';
|
||||||
import stamp from '../../util/output/stamp.ts';
|
import stamp from '../../util/output/stamp.ts';
|
||||||
import strlen from '../../util/strlen.ts';
|
import strlen from '../../util/strlen.ts';
|
||||||
import promptBool from '../../util/prompt-bool';
|
import confirm from '../../util/input/confirm';
|
||||||
import { isValidName } from '../../util/is-valid-name';
|
import { isValidName } from '../../util/is-valid-name';
|
||||||
import findAliasByAliasOrId from '../../util/alias/find-alias-by-alias-or-id';
|
import findAliasByAliasOrId from '../../util/alias/find-alias-by-alias-or-id';
|
||||||
import { getCommandName } from '../../util/pkg-name.ts';
|
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 {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
@@ -25,6 +26,7 @@ export default async function rm(ctx, opts, args, output) {
|
|||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
@@ -39,8 +41,13 @@ export default async function rm(ctx, opts, args, output) {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
// $FlowFixMe
|
const now = new Now({
|
||||||
const now = new Now({ apiUrl, token, debug: debugEnabled, currentTeam });
|
apiUrl,
|
||||||
|
token,
|
||||||
|
debug: debugEnabled,
|
||||||
|
currentTeam,
|
||||||
|
output,
|
||||||
|
});
|
||||||
const [aliasOrId] = args;
|
const [aliasOrId] = args;
|
||||||
|
|
||||||
if (args.length !== 1) {
|
if (args.length !== 1) {
|
||||||
@@ -108,5 +115,5 @@ async function confirmAliasRemove(output, alias) {
|
|||||||
|
|
||||||
output.log(`The following alias will be removed permanently`);
|
output.log(`The following alias will be removed permanently`);
|
||||||
output.print(` ${tbl}\n`);
|
output.print(` ${tbl}\n`);
|
||||||
return promptBool(output, chalk.red('Are you sure?'));
|
return confirm(chalk.red('Are you sure?'), false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,11 +29,11 @@ type Options = {
|
|||||||
export default async function set(
|
export default async function set(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
localConfig,
|
localConfig,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
@@ -49,6 +49,7 @@ export default async function set(
|
|||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
|
|
||||||
let user: User;
|
let user: User;
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import addBilling from './add';
|
|||||||
import exit from '../../util/exit';
|
import exit from '../../util/exit';
|
||||||
import Client from '../../util/client.ts';
|
import Client from '../../util/client.ts';
|
||||||
import getScope from '../../util/get-scope.ts';
|
import getScope from '../../util/get-scope.ts';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import { getPkgName } from '../../util/pkg-name.ts';
|
import { getPkgName } from '../../util/pkg-name.ts';
|
||||||
|
|
||||||
const help = () => {
|
const help = () => {
|
||||||
@@ -90,8 +89,9 @@ function buildInquirerChoices(cards) {
|
|||||||
const _default =
|
const _default =
|
||||||
source.id === cards.defaultSource ? ` ${chalk.bold('(default)')}` : '';
|
source.id === cards.defaultSource ? ` ${chalk.bold('(default)')}` : '';
|
||||||
const id = `${chalk.cyan(`ID: ${source.id}`)}${_default}`;
|
const id = `${chalk.cyan(`ID: ${source.id}`)}${_default}`;
|
||||||
const number = `${chalk.gray('#### ').repeat(3)}${source.last4 ||
|
const number = `${chalk.gray('#### ').repeat(3)}${
|
||||||
source.card.last4}`;
|
source.last4 || source.card.last4
|
||||||
|
}`;
|
||||||
const str = [
|
const str = [
|
||||||
id,
|
id,
|
||||||
indent(source.name || source.owner.name, 2),
|
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 start = new Date();
|
||||||
const creditCards = new NowCreditCards({ apiUrl, token, debug, currentTeam });
|
const creditCards = new NowCreditCards({
|
||||||
const output = createOutput({ debug });
|
apiUrl,
|
||||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
token,
|
||||||
|
debug,
|
||||||
|
currentTeam,
|
||||||
|
output,
|
||||||
|
});
|
||||||
|
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -147,8 +152,9 @@ async function run({ token, config: { currentTeam } }) {
|
|||||||
const id = `${chalk.gray('-')} ${chalk.cyan(
|
const id = `${chalk.gray('-')} ${chalk.cyan(
|
||||||
`ID: ${source.id}`
|
`ID: ${source.id}`
|
||||||
)}${_default}`;
|
)}${_default}`;
|
||||||
const number = `${chalk.gray('#### ').repeat(3)}${source.last4 ||
|
const number = `${chalk.gray('#### ').repeat(3)}${
|
||||||
source.card.last4}`;
|
source.last4 || source.card.last4
|
||||||
|
}`;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
id,
|
id,
|
||||||
@@ -231,8 +237,9 @@ async function run({ token, config: { currentTeam } }) {
|
|||||||
const elapsed = ms(new Date() - start);
|
const elapsed = ms(new Date() - start);
|
||||||
console.log(
|
console.log(
|
||||||
success(
|
success(
|
||||||
`${card.brand || card.card.brand} ending in ${card.last4 ||
|
`${card.brand || card.card.brand} ending in ${
|
||||||
card.card.last4} is now the default ${chalk.gray(`[${elapsed}]`)}`
|
card.last4 || card.card.last4
|
||||||
|
} is now the default ${chalk.gray(`[${elapsed}]`)}`
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@@ -301,9 +308,9 @@ async function run({ token, config: { currentTeam } }) {
|
|||||||
const deletedCard = cards.sources.find(card => card.id === cardId);
|
const deletedCard = cards.sources.find(card => card.id === cardId);
|
||||||
const remainingCards = cards.sources.filter(card => card.id !== cardId);
|
const remainingCards = cards.sources.filter(card => card.id !== cardId);
|
||||||
|
|
||||||
let text = `${deletedCard.brand ||
|
let text = `${deletedCard.brand || deletedCard.card.brand} ending in ${
|
||||||
deletedCard.card.brand} ending in ${deletedCard.last4 ||
|
deletedCard.last4 || deletedCard.card.last4
|
||||||
deletedCard.card.last4} was deleted`;
|
} was deleted`;
|
||||||
// ${chalk.gray(`[${elapsed}]`)}
|
// ${chalk.gray(`[${elapsed}]`)}
|
||||||
|
|
||||||
if (cardId === cards.defaultSource) {
|
if (cardId === cards.defaultSource) {
|
||||||
@@ -317,11 +324,11 @@ async function run({ token, config: { currentTeam } }) {
|
|||||||
card => card.id === cards.defaultCardId
|
card => card.id === cards.defaultCardId
|
||||||
);
|
);
|
||||||
|
|
||||||
text += `\n${newDefaultCard.brand ||
|
text += `\n${
|
||||||
newDefaultCard.card.brand} ending in ${newDefaultCard.last4 ||
|
newDefaultCard.brand || newDefaultCard.card.brand
|
||||||
newDefaultCard.card.last4} in now default for ${chalk.bold(
|
} ending in ${
|
||||||
contextName
|
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 createCertFromFile from '../../util/certs/create-cert-from-file';
|
||||||
import createCertForCns from '../../util/certs/create-cert-for-cns';
|
import createCertForCns from '../../util/certs/create-cert-for-cns';
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
@@ -22,11 +21,11 @@ interface Options {
|
|||||||
async function add(
|
async function add(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
): Promise<number> {
|
): Promise<number> {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
@@ -49,6 +48,7 @@ async function add(
|
|||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -62,7 +62,13 @@ async function add(
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
const now = new Now({ apiUrl, token, debug: debugEnabled, currentTeam });
|
const now = new Now({
|
||||||
|
apiUrl,
|
||||||
|
token,
|
||||||
|
debug: debugEnabled,
|
||||||
|
currentTeam,
|
||||||
|
output,
|
||||||
|
});
|
||||||
|
|
||||||
if (overwite) {
|
if (overwite) {
|
||||||
output.error('Overwrite option is deprecated');
|
output.error('Overwrite option is deprecated');
|
||||||
@@ -71,7 +77,7 @@ async function add(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (crtPath || keyPath || caPath) {
|
if (crtPath || keyPath || caPath) {
|
||||||
if (args.length !== 0 || (!crtPath || !keyPath || !caPath)) {
|
if (args.length !== 0 || !crtPath || !keyPath || !caPath) {
|
||||||
output.error(
|
output.error(
|
||||||
`Invalid number of arguments to create a custom certificate entry. Usage:`
|
`Invalid number of arguments to create a custom certificate entry. Usage:`
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import chalk from 'chalk';
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import { handleError } from '../../util/error';
|
import { handleError } from '../../util/error';
|
||||||
|
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import getSubcommand from '../../util/get-subcommand';
|
import getSubcommand from '../../util/get-subcommand';
|
||||||
import logo from '../../util/output/logo';
|
import logo from '../../util/output/logo';
|
||||||
@@ -104,17 +103,17 @@ export default async function main(ctx: NowContext) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const output = createOutput({ debug: argv['--debug'] });
|
const { output } = ctx;
|
||||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||||
switch (subcommand) {
|
switch (subcommand) {
|
||||||
case 'issue':
|
case 'issue':
|
||||||
return issue(ctx, argv, args, output);
|
return issue(ctx, argv, args);
|
||||||
case 'ls':
|
case 'ls':
|
||||||
return ls(ctx, argv, args, output);
|
return ls(ctx, argv, args);
|
||||||
case 'rm':
|
case 'rm':
|
||||||
return rm(ctx, argv, args, output);
|
return rm(ctx, argv, args);
|
||||||
case 'add':
|
case 'add':
|
||||||
return add(ctx, argv, args, output);
|
return add(ctx, argv, args);
|
||||||
case 'renew':
|
case 'renew':
|
||||||
output.error('Renewing certificates is deprecated, issue a new one.');
|
output.error('Renewing certificates is deprecated, issue a new one.');
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ type Options = {
|
|||||||
export default async function issue(
|
export default async function issue(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
@@ -55,6 +55,7 @@ export default async function issue(
|
|||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import getScope from '../../util/get-scope';
|
|||||||
import stamp from '../../util/output/stamp';
|
import stamp from '../../util/output/stamp';
|
||||||
import getCerts from '../../util/certs/get-certs';
|
import getCerts from '../../util/certs/get-certs';
|
||||||
import strlen from '../../util/strlen';
|
import strlen from '../../util/strlen';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import { NowContext, Cert } from '../../types';
|
import { NowContext, Cert } from '../../types';
|
||||||
import getCommandFlags from '../../util/get-command-flags';
|
import getCommandFlags from '../../util/get-command-flags';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
@@ -21,17 +20,17 @@ interface Options {
|
|||||||
async function ls(
|
async function ls(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
): Promise<number> {
|
): Promise<number> {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const { '--debug': debug, '--next': nextTimestamp } = opts;
|
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;
|
let contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -48,7 +47,7 @@ async function ls(
|
|||||||
output.error('Please provide a number for flag --next');
|
output.error('Please provide a number for flag --next');
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
const now = new Now({ apiUrl, token, debug, currentTeam });
|
const now = new Now({ apiUrl, token, debug, currentTeam, output });
|
||||||
const lsStamp = stamp();
|
const lsStamp = stamp();
|
||||||
|
|
||||||
if (args.length !== 0) {
|
if (args.length !== 0) {
|
||||||
|
|||||||
@@ -18,21 +18,17 @@ type Options = {
|
|||||||
'--debug': boolean;
|
'--debug': boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
async function rm(
|
async function rm(ctx: NowContext, opts: Options, args: string[]) {
|
||||||
ctx: NowContext,
|
|
||||||
opts: Options,
|
|
||||||
args: string[],
|
|
||||||
output: Output
|
|
||||||
) {
|
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const rmStamp = stamp();
|
const rmStamp = stamp();
|
||||||
const debug = opts['--debug'];
|
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 contextName = null;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { resolve, basename } from 'path';
|
|||||||
import { fileNameSymbol } from '@vercel/client';
|
import { fileNameSymbol } from '@vercel/client';
|
||||||
import Client from '../../util/client.ts';
|
import Client from '../../util/client.ts';
|
||||||
import getScope from '../../util/get-scope.ts';
|
import getScope from '../../util/get-scope.ts';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import code from '../../util/output/code';
|
import code from '../../util/output/code';
|
||||||
import highlight from '../../util/output/highlight';
|
import highlight from '../../util/output/highlight';
|
||||||
import { readLocalConfig } from '../../util/config/files';
|
import { readLocalConfig } from '../../util/config/files';
|
||||||
@@ -15,6 +14,7 @@ import deploy from './latest';
|
|||||||
export default async ctx => {
|
export default async ctx => {
|
||||||
const {
|
const {
|
||||||
authConfig,
|
authConfig,
|
||||||
|
output,
|
||||||
config: { currentTeam },
|
config: { currentTeam },
|
||||||
apiUrl,
|
apiUrl,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
@@ -48,7 +48,6 @@ export default async ctx => {
|
|||||||
localConfig = readLocalConfig(paths[0]);
|
localConfig = readLocalConfig(paths[0]);
|
||||||
}
|
}
|
||||||
const debugEnabled = argv['--debug'];
|
const debugEnabled = argv['--debug'];
|
||||||
const output = createOutput({ debug: debugEnabled });
|
|
||||||
const stats = {};
|
const stats = {};
|
||||||
|
|
||||||
if (argv['--help']) {
|
if (argv['--help']) {
|
||||||
@@ -74,6 +73,7 @@ export default async ctx => {
|
|||||||
apiUrl,
|
apiUrl,
|
||||||
token: authConfig.token,
|
token: authConfig.token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
|
output,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -233,8 +233,7 @@ export default async function main(
|
|||||||
const paths = Object.keys(stats);
|
const paths = Object.keys(stats);
|
||||||
const debugEnabled = argv['--debug'];
|
const debugEnabled = argv['--debug'];
|
||||||
|
|
||||||
// $FlowFixMe
|
const { isTTY } = process.stdout;
|
||||||
const isTTY = process.stdout.isTTY;
|
|
||||||
const quiet = !isTTY;
|
const quiet = !isTTY;
|
||||||
|
|
||||||
// check paths
|
// check paths
|
||||||
@@ -263,6 +262,7 @@ export default async function main(
|
|||||||
apiUrl: ctx.apiUrl,
|
apiUrl: ctx.apiUrl,
|
||||||
token: ctx.authConfig.token,
|
token: ctx.authConfig.token,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
|
|
||||||
// retrieve `project` and `org` from .vercel
|
// retrieve `project` and `org` from .vercel
|
||||||
@@ -645,6 +645,7 @@ export default async function main(
|
|||||||
token: ctx.authConfig.token,
|
token: ctx.authConfig.token,
|
||||||
currentTeam: org.id,
|
currentTeam: org.id,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
}),
|
}),
|
||||||
err.meta.domain,
|
err.meta.domain,
|
||||||
contextName
|
contextName
|
||||||
@@ -727,6 +728,7 @@ export default async function main(
|
|||||||
token: ctx.authConfig.token,
|
token: ctx.authConfig.token,
|
||||||
currentTeam: org.type === 'team' ? org.id : null,
|
currentTeam: org.type === 'team' ? org.id : null,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
}),
|
}),
|
||||||
deployment,
|
deployment,
|
||||||
deployStamp,
|
deployStamp,
|
||||||
|
|||||||
@@ -2,16 +2,15 @@ import { resolve, join } from 'path';
|
|||||||
|
|
||||||
import DevServer from '../../util/dev/server';
|
import DevServer from '../../util/dev/server';
|
||||||
import parseListen from '../../util/dev/parse-listen';
|
import parseListen from '../../util/dev/parse-listen';
|
||||||
import { Output } from '../../util/output';
|
import { NowContext, ProjectEnvVariable } from '../../types';
|
||||||
import { NowContext } from '../../types';
|
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import { getLinkedProject } from '../../util/projects/link';
|
import { getLinkedProject } from '../../util/projects/link';
|
||||||
import { getFrameworks } from '../../util/get-frameworks';
|
import { getFrameworks } from '../../util/get-frameworks';
|
||||||
import { isSettingValue } from '../../util/is-setting-value';
|
import { isSettingValue } from '../../util/is-setting-value';
|
||||||
import { ProjectSettings, ProjectEnvTarget } from '../../types';
|
import { ProjectSettings } from '../../types';
|
||||||
import getDecryptedEnvRecords from '../../util/get-decrypted-env-records';
|
import getDecryptedEnvRecords from '../../util/get-decrypted-env-records';
|
||||||
import { Env } from '@vercel/build-utils';
|
|
||||||
import setupAndLink from '../../util/link/setup-and-link';
|
import setupAndLink from '../../util/link/setup-and-link';
|
||||||
|
import getSystemEnvValues from '../../util/env/get-system-env-values';
|
||||||
|
|
||||||
type Options = {
|
type Options = {
|
||||||
'--debug'?: boolean;
|
'--debug'?: boolean;
|
||||||
@@ -22,9 +21,9 @@ type Options = {
|
|||||||
export default async function dev(
|
export default async function dev(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
|
const { output } = ctx;
|
||||||
const [dir = '.'] = args;
|
const [dir = '.'] = args;
|
||||||
let cwd = resolve(dir);
|
let cwd = resolve(dir);
|
||||||
const listen = parseListen(opts['--listen'] || '3000');
|
const listen = parseListen(opts['--listen'] || '3000');
|
||||||
@@ -35,6 +34,7 @@ export default async function dev(
|
|||||||
token: ctx.authConfig.token,
|
token: ctx.authConfig.token,
|
||||||
currentTeam: ctx.config.currentTeam,
|
currentTeam: ctx.config.currentTeam,
|
||||||
debug,
|
debug,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
|
|
||||||
// retrieve dev command
|
// retrieve dev command
|
||||||
@@ -49,7 +49,6 @@ export default async function dev(
|
|||||||
|
|
||||||
link = await setupAndLink(
|
link = await setupAndLink(
|
||||||
ctx,
|
ctx,
|
||||||
output,
|
|
||||||
cwd,
|
cwd,
|
||||||
forceDelete,
|
forceDelete,
|
||||||
autoConfirm,
|
autoConfirm,
|
||||||
@@ -70,7 +69,8 @@ export default async function dev(
|
|||||||
let devCommand: string | undefined;
|
let devCommand: string | undefined;
|
||||||
let frameworkSlug: string | undefined;
|
let frameworkSlug: string | undefined;
|
||||||
let projectSettings: ProjectSettings | undefined;
|
let projectSettings: ProjectSettings | undefined;
|
||||||
let environmentVars: Env | undefined;
|
let projectEnvs: ProjectEnvVariable[] = [];
|
||||||
|
let systemEnvValues: string[] = [];
|
||||||
if (link.status === 'linked') {
|
if (link.status === 'linked') {
|
||||||
const { project, org } = link;
|
const { project, org } = link;
|
||||||
client.currentTeam = org.type === 'team' ? org.id : undefined;
|
client.currentTeam = org.type === 'team' ? org.id : undefined;
|
||||||
@@ -98,12 +98,12 @@ export default async function dev(
|
|||||||
cwd = join(cwd, project.rootDirectory);
|
cwd = join(cwd, project.rootDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
environmentVars = await getDecryptedEnvRecords(
|
[{ envs: projectEnvs }, { systemEnvValues }] = await Promise.all([
|
||||||
output,
|
getDecryptedEnvRecords(output, client, project.id),
|
||||||
client,
|
project.autoExposeSystemEnvs
|
||||||
project,
|
? getSystemEnvValues(output, client, project.id)
|
||||||
ProjectEnvTarget.Development
|
: { systemEnvValues: [] },
|
||||||
);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const devServer = new DevServer(cwd, {
|
const devServer = new DevServer(cwd, {
|
||||||
@@ -112,7 +112,8 @@ export default async function dev(
|
|||||||
devCommand,
|
devCommand,
|
||||||
frameworkSlug,
|
frameworkSlug,
|
||||||
projectSettings,
|
projectSettings,
|
||||||
environmentVars,
|
projectEnvs,
|
||||||
|
systemEnvValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
process.once('SIGINT', () => devServer.stop());
|
process.once('SIGINT', () => devServer.stop());
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import getSubcommand from '../../util/get-subcommand';
|
|||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { NowError } from '../../util/now-error';
|
import { NowError } from '../../util/now-error';
|
||||||
import handleError from '../../util/handle-error';
|
import handleError from '../../util/handle-error';
|
||||||
import createOutput from '../../util/output/create-output';
|
|
||||||
import logo from '../../util/output/logo';
|
import logo from '../../util/output/logo';
|
||||||
import cmd from '../../util/output/cmd';
|
import cmd from '../../util/output/cmd';
|
||||||
import highlight from '../../util/output/highlight';
|
import highlight from '../../util/output/highlight';
|
||||||
@@ -51,7 +50,7 @@ const help = () => {
|
|||||||
export default async function main(ctx: NowContext) {
|
export default async function main(ctx: NowContext) {
|
||||||
let argv;
|
let argv;
|
||||||
let args;
|
let args;
|
||||||
let output;
|
const { output } = ctx;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
argv = getArgs(ctx.argv.slice(2), {
|
argv = getArgs(ctx.argv.slice(2), {
|
||||||
@@ -63,9 +62,7 @@ export default async function main(ctx: NowContext) {
|
|||||||
'--port': Number,
|
'--port': Number,
|
||||||
'-p': '--port',
|
'-p': '--port',
|
||||||
});
|
});
|
||||||
const debug = argv['--debug'];
|
|
||||||
args = getSubcommand(argv._.slice(1), COMMAND_CONFIG).args;
|
args = getSubcommand(argv._.slice(1), COMMAND_CONFIG).args;
|
||||||
output = createOutput({ debug });
|
|
||||||
|
|
||||||
if ('--port' in argv) {
|
if ('--port' in argv) {
|
||||||
output.warn('`--port` is deprecated, please use `--listen` instead');
|
output.warn('`--port` is deprecated, please use `--listen` instead');
|
||||||
@@ -120,7 +117,7 @@ export default async function main(ctx: NowContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return await dev(ctx, argv, args, output);
|
return await dev(ctx, argv, args);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code === 'ENOTFOUND') {
|
if (err.code === 'ENOTFOUND') {
|
||||||
// Error message will look like the following:
|
// Error message will look like the following:
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import {
|
|||||||
DNSInvalidType,
|
DNSInvalidType,
|
||||||
} from '../../util/errors-ts';
|
} from '../../util/errors-ts';
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import addDNSRecord from '../../util/dns/add-dns-record';
|
import addDNSRecord from '../../util/dns/add-dns-record';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import getScope from '../../util/get-scope';
|
import getScope from '../../util/get-scope';
|
||||||
@@ -22,17 +21,17 @@ type Options = {
|
|||||||
export default async function add(
|
export default async function add(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
|
apiUrl,
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
|
||||||
const debug = opts['--debug'];
|
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 contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import getScope from '../../util/get-scope';
|
import getScope from '../../util/get-scope';
|
||||||
import { DomainNotFound, InvalidDomain } from '../../util/errors-ts';
|
import { DomainNotFound, InvalidDomain } from '../../util/errors-ts';
|
||||||
@@ -15,17 +14,17 @@ type Options = {
|
|||||||
export default async function add(
|
export default async function add(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
|
apiUrl,
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
|
||||||
const debug = opts['--debug'];
|
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 contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
|
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import getSubcommand from '../../util/get-subcommand';
|
import getSubcommand from '../../util/get-subcommand';
|
||||||
import handleError from '../../util/handle-error';
|
import handleError from '../../util/handle-error';
|
||||||
@@ -112,16 +111,15 @@ export default async function main(ctx: NowContext) {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const output = createOutput({ debug: argv['--debug'] });
|
|
||||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||||
switch (subcommand) {
|
switch (subcommand) {
|
||||||
case 'add':
|
case 'add':
|
||||||
return add(ctx, argv, args, output);
|
return add(ctx, argv, args);
|
||||||
case 'import':
|
case 'import':
|
||||||
return importZone(ctx, argv, args, output);
|
return importZone(ctx, argv, args);
|
||||||
case 'rm':
|
case 'rm':
|
||||||
return rm(ctx, argv, args, output);
|
return rm(ctx, argv, args);
|
||||||
default:
|
default:
|
||||||
return ls(ctx, argv, args, output);
|
return ls(ctx, argv, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import { DomainNotFound } from '../../util/errors-ts';
|
import { DomainNotFound } from '../../util/errors-ts';
|
||||||
import { DNSRecord, NowContext } from '../../types';
|
import { DNSRecord, NowContext } from '../../types';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
@@ -22,17 +21,17 @@ type Options = {
|
|||||||
export default async function ls(
|
export default async function ls(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
|
apiUrl,
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
|
||||||
const { '--debug': debug, '--next': nextTimestamp } = opts;
|
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;
|
let contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -17,17 +17,17 @@ type Options = {
|
|||||||
export default async function rm(
|
export default async function rm(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
|
apiUrl,
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
|
||||||
const debug = opts['--debug'];
|
const debug = opts['--debug'];
|
||||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await getScope(client);
|
await getScope(client);
|
||||||
@@ -100,12 +100,7 @@ function readConfirmation(
|
|||||||
process.stdin
|
process.stdin
|
||||||
.on('data', d => {
|
.on('data', d => {
|
||||||
process.stdin.pause();
|
process.stdin.pause();
|
||||||
resolve(
|
resolve(d.toString().trim().toLowerCase() === 'y');
|
||||||
d
|
|
||||||
.toString()
|
|
||||||
.trim()
|
|
||||||
.toLowerCase() === 'y'
|
|
||||||
);
|
|
||||||
})
|
})
|
||||||
.resume();
|
.resume();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
|
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import * as ERRORS from '../../util/errors-ts';
|
import * as ERRORS from '../../util/errors-ts';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import formatNSTable from '../../util/format-ns-table';
|
import formatNSTable from '../../util/format-ns-table';
|
||||||
@@ -24,18 +23,18 @@ type Options = {
|
|||||||
export default async function add(
|
export default async function add(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const debug = opts['--debug'];
|
const debug = opts['--debug'];
|
||||||
const force = opts['--force'];
|
const force = opts['--force'];
|
||||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import chalk from 'chalk';
|
|||||||
import psl from 'psl';
|
import psl from 'psl';
|
||||||
|
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import * as ERRORS from '../../util/errors-ts';
|
import * as ERRORS from '../../util/errors-ts';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import getDomainPrice from '../../util/domains/get-domain-price';
|
import getDomainPrice from '../../util/domains/get-domain-price';
|
||||||
@@ -21,17 +20,17 @@ type Options = {
|
|||||||
export default async function buy(
|
export default async function buy(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const debug = opts['--debug'];
|
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 contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -70,7 +69,10 @@ export default async function buy(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const availableStamp = stamp();
|
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) {
|
if (domainPrice instanceof Error) {
|
||||||
output.prettyError(domainPrice);
|
output.prettyError(domainPrice);
|
||||||
@@ -102,12 +104,21 @@ export default async function buy(
|
|||||||
return 0;
|
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;
|
let buyResult;
|
||||||
const purchaseStamp = stamp();
|
const purchaseStamp = stamp();
|
||||||
const stopPurchaseSpinner = output.spinner('Purchasing');
|
const stopPurchaseSpinner = output.spinner('Purchasing');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
buyResult = await purchaseDomain(client, domainName, price);
|
buyResult = await purchaseDomain(client, domainName, price, autoRenew);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
stopPurchaseSpinner();
|
stopPurchaseSpinner();
|
||||||
output.error(
|
output.error(
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
|
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import getSubcommand from '../../util/get-subcommand';
|
import getSubcommand from '../../util/get-subcommand';
|
||||||
import handleError from '../../util/handle-error';
|
import handleError from '../../util/handle-error';
|
||||||
@@ -106,24 +105,23 @@ export default async function main(ctx: NowContext) {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const output = createOutput({ debug: argv['--debug'] });
|
|
||||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||||
switch (subcommand) {
|
switch (subcommand) {
|
||||||
case 'add':
|
case 'add':
|
||||||
return add(ctx, argv, args, output);
|
return add(ctx, argv, args);
|
||||||
case 'inspect':
|
case 'inspect':
|
||||||
return inspect(ctx, argv, args, output);
|
return inspect(ctx, argv, args);
|
||||||
case 'move':
|
case 'move':
|
||||||
return move(ctx, argv, args, output);
|
return move(ctx, argv, args);
|
||||||
case 'buy':
|
case 'buy':
|
||||||
return buy(ctx, argv, args, output);
|
return buy(ctx, argv, args);
|
||||||
case 'rm':
|
case 'rm':
|
||||||
return rm(ctx, argv, args, output);
|
return rm(ctx, argv, args);
|
||||||
case 'transferIn':
|
case 'transferIn':
|
||||||
return transferIn(ctx, argv, args, output);
|
return transferIn(ctx, argv, args);
|
||||||
case 'verify':
|
case 'verify':
|
||||||
return verify(ctx, argv, args, output);
|
return verify(ctx, argv, args);
|
||||||
default:
|
default:
|
||||||
return ls(ctx, argv, args, output);
|
return ls(ctx, argv, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,17 +24,17 @@ type Options = {
|
|||||||
export default async function inspect(
|
export default async function inspect(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const debug = opts['--debug'];
|
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 contextName = null;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import Client from '../../util/client';
|
|||||||
import getDomains from '../../util/domains/get-domains';
|
import getDomains from '../../util/domains/get-domains';
|
||||||
import getScope from '../../util/get-scope';
|
import getScope from '../../util/get-scope';
|
||||||
import stamp from '../../util/output/stamp';
|
import stamp from '../../util/output/stamp';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import formatTable from '../../util/format-table';
|
import formatTable from '../../util/format-table';
|
||||||
import { formatDateWithoutTime } from '../../util/format-date';
|
import { formatDateWithoutTime } from '../../util/format-date';
|
||||||
import { Domain, NowContext } from '../../types';
|
import { Domain, NowContext } from '../../types';
|
||||||
@@ -24,17 +23,17 @@ type Options = {
|
|||||||
export default async function ls(
|
export default async function ls(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const { '--debug': debug, '--next': nextTimestamp } = opts;
|
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;
|
let contextName = null;
|
||||||
|
|
||||||
if (typeof nextTimestamp !== undefined && Number.isNaN(nextTimestamp)) {
|
if (typeof nextTimestamp !== undefined && Number.isNaN(nextTimestamp)) {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import chalk from 'chalk';
|
|||||||
import plural from 'pluralize';
|
import plural from 'pluralize';
|
||||||
|
|
||||||
import { NowContext, User, Team } from '../../types';
|
import { NowContext, User, Team } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import * as ERRORS from '../../util/errors-ts';
|
import * as ERRORS from '../../util/errors-ts';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import getScope from '../../util/get-scope';
|
import getScope from '../../util/get-scope';
|
||||||
@@ -25,17 +24,17 @@ type Options = {
|
|||||||
export default async function move(
|
export default async function move(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const debug = opts['--debug'];
|
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 contextName = null;
|
||||||
let user = null;
|
let user = null;
|
||||||
|
|
||||||
|
|||||||
@@ -26,17 +26,17 @@ type Options = {
|
|||||||
export default async function rm(
|
export default async function rm(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const debug = opts['--debug'];
|
const debug = opts['--debug'];
|
||||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||||
const [domainName] = args;
|
const [domainName] = args;
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
|
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import * as ERRORS from '../../util/errors-ts';
|
import * as ERRORS from '../../util/errors-ts';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import getScope from '../../util/get-scope';
|
import getScope from '../../util/get-scope';
|
||||||
@@ -24,17 +23,17 @@ type Options = {
|
|||||||
export default async function transferIn(
|
export default async function transferIn(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const { apiUrl } = ctx;
|
||||||
const debug = opts['--debug'];
|
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 contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
|
||||||
import { NowBuildError } from '@vercel/build-utils';
|
import { NowBuildError } from '@vercel/build-utils';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
|
|
||||||
export default async function verify(
|
export default async function verify(
|
||||||
_ctx: NowContext,
|
{ output }: NowContext,
|
||||||
_opts: {},
|
_opts: {},
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
const [domainName] = args;
|
const [domainName] = args;
|
||||||
|
|
||||||
|
|||||||
143
packages/now-cli/src/commands/env/add.ts
vendored
143
packages/now-cli/src/commands/env/add.ts
vendored
@@ -1,6 +1,6 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import inquirer from 'inquirer';
|
import inquirer from 'inquirer';
|
||||||
import { ProjectEnvTarget, Project } from '../../types';
|
import { ProjectEnvTarget, Project, Secret, ProjectEnvType } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
import { Output } from '../../util/output';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import stamp from '../../util/output/stamp';
|
import stamp from '../../util/output/stamp';
|
||||||
@@ -11,12 +11,14 @@ import {
|
|||||||
getEnvTargetPlaceholder,
|
getEnvTargetPlaceholder,
|
||||||
getEnvTargetChoices,
|
getEnvTargetChoices,
|
||||||
} from '../../util/env/env-target';
|
} from '../../util/env/env-target';
|
||||||
|
import { isValidEnvType, getEnvTypePlaceholder } from '../../util/env/env-type';
|
||||||
import readStandardInput from '../../util/input/read-standard-input';
|
import readStandardInput from '../../util/input/read-standard-input';
|
||||||
import param from '../../util/output/param';
|
import param from '../../util/output/param';
|
||||||
import withSpinner from '../../util/with-spinner';
|
import withSpinner from '../../util/with-spinner';
|
||||||
import { emoji, prependEmoji } from '../../util/emoji';
|
import { emoji, prependEmoji } from '../../util/emoji';
|
||||||
import { isKnownError } from '../../util/env/known-error';
|
import { isKnownError } from '../../util/env/known-error';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
|
import getSystemEnvValues from '../../util/env/get-system-env-values';
|
||||||
|
|
||||||
type Options = {
|
type Options = {
|
||||||
'--debug': boolean;
|
'--debug': boolean;
|
||||||
@@ -29,38 +31,74 @@ export default async function add(
|
|||||||
args: string[],
|
args: string[],
|
||||||
output: Output
|
output: Output
|
||||||
) {
|
) {
|
||||||
const stdInput = await readStandardInput();
|
// improve the way we show inquirer prompts
|
||||||
let [envName, envTarget] = args;
|
require('../../util/input/patch-inquirer');
|
||||||
|
|
||||||
if (args.length > 2) {
|
const stdInput = await readStandardInput();
|
||||||
|
let [envTypeArg, envName, envTargetArg] = args;
|
||||||
|
|
||||||
|
if (args.length > 3) {
|
||||||
output.error(
|
output.error(
|
||||||
`Invalid number of arguments. Usage: ${getCommandName(
|
`Invalid number of arguments. Usage: ${getCommandName(
|
||||||
`env add <name> ${getEnvTargetPlaceholder()}`
|
`env add ${getEnvTypePlaceholder()} <name> ${getEnvTargetPlaceholder()}`
|
||||||
)}`
|
)}`
|
||||||
);
|
);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stdInput && (!envName || !envTarget)) {
|
if (stdInput && (!envTypeArg || !envName || !envTargetArg)) {
|
||||||
output.error(
|
output.error(
|
||||||
`Invalid number of arguments. Usage: ${getCommandName(
|
`Invalid number of arguments. Usage: ${getCommandName(
|
||||||
`env add <name> <target> < <file>`
|
`env add ${getEnvTypePlaceholder()} <name> <target> < <file>`
|
||||||
)}`
|
)}`
|
||||||
);
|
);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let envTargets: ProjectEnvTarget[] = [];
|
let envTargets: ProjectEnvTarget[] = [];
|
||||||
if (envTarget) {
|
if (envTargetArg) {
|
||||||
if (!isValidEnvTarget(envTarget)) {
|
if (!isValidEnvTarget(envTargetArg)) {
|
||||||
output.error(
|
output.error(
|
||||||
`The Environment ${param(
|
`The Environment ${param(
|
||||||
envTarget
|
envTargetArg
|
||||||
)} is invalid. It must be one of: ${getEnvTargetPlaceholder()}.`
|
)} is invalid. It must be one of: ${getEnvTargetPlaceholder()}.`
|
||||||
);
|
);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
envTargets.push(envTarget);
|
envTargets.push(envTargetArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
let envType: ProjectEnvType;
|
||||||
|
if (envTypeArg) {
|
||||||
|
if (!isValidEnvType(envTypeArg)) {
|
||||||
|
output.error(
|
||||||
|
`The Environment Variable type ${param(
|
||||||
|
envTypeArg
|
||||||
|
)} is invalid. It must be one of: ${getEnvTypePlaceholder()}.`
|
||||||
|
);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
envType = envTypeArg;
|
||||||
|
} else {
|
||||||
|
const answers = (await inquirer.prompt({
|
||||||
|
name: 'inputEnvType',
|
||||||
|
type: 'list',
|
||||||
|
message: `Which type of Environment Variable do you want to add?`,
|
||||||
|
choices: [
|
||||||
|
{ name: 'Plaintext', value: ProjectEnvType.Plaintext },
|
||||||
|
{
|
||||||
|
name: `Secret (can be created using ${getCommandName('secret add')})`,
|
||||||
|
value: ProjectEnvType.Secret,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Reference to System Environment Variable',
|
||||||
|
value: ProjectEnvType.System,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})) as { inputEnvType: ProjectEnvType };
|
||||||
|
|
||||||
|
envType = answers.inputEnvType;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!envName) {
|
while (!envName) {
|
||||||
@@ -77,11 +115,24 @@ export default async function add(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const envs = await getEnvVariables(output, client, project.id, 4);
|
const [{ envs }, { systemEnvValues }] = await Promise.all([
|
||||||
|
getEnvVariables(output, client, project.id),
|
||||||
|
getSystemEnvValues(output, client, project.id),
|
||||||
|
]);
|
||||||
const existing = new Set(
|
const existing = new Set(
|
||||||
envs.filter(r => r.key === envName).map(r => r.target)
|
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) {
|
if (choices.length === 0) {
|
||||||
output.error(
|
output.error(
|
||||||
@@ -98,15 +149,59 @@ export default async function add(
|
|||||||
|
|
||||||
if (stdInput) {
|
if (stdInput) {
|
||||||
envValue = stdInput;
|
envValue = stdInput;
|
||||||
} else if (isSystemEnvVariable(envName)) {
|
} else if (envType === ProjectEnvType.Plaintext) {
|
||||||
envValue = '';
|
|
||||||
} else {
|
|
||||||
const { inputValue } = await inquirer.prompt({
|
const { inputValue } = await inquirer.prompt({
|
||||||
type: 'password',
|
type: 'input',
|
||||||
name: 'inputValue',
|
name: 'inputValue',
|
||||||
message: `What’s the value of ${envName}?`,
|
message: `What’s the value of ${envName}?`,
|
||||||
});
|
});
|
||||||
|
|
||||||
envValue = inputValue || '';
|
envValue = inputValue || '';
|
||||||
|
} else if (envType === ProjectEnvType.Secret) {
|
||||||
|
let secretId: string | null = null;
|
||||||
|
|
||||||
|
while (!secretId) {
|
||||||
|
let { secretName } = await inquirer.prompt({
|
||||||
|
type: 'input',
|
||||||
|
name: 'secretName',
|
||||||
|
message: `What’s the value of ${envName}?`,
|
||||||
|
});
|
||||||
|
|
||||||
|
secretName = secretName || '';
|
||||||
|
|
||||||
|
if (secretName[0] === '@') {
|
||||||
|
secretName = secretName.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const secret = await client.fetch<Secret>(
|
||||||
|
`/v2/now/secrets/${encodeURIComponent(secretName)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
secretId = secret.uid;
|
||||||
|
} catch (error) {
|
||||||
|
if (error.status === 404) {
|
||||||
|
output.error(
|
||||||
|
`Please enter the name of an existing Secret (can be created with ${getCommandName(
|
||||||
|
'secret add'
|
||||||
|
)}).`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
envValue = secretId;
|
||||||
|
} else {
|
||||||
|
const { systemEnvValue } = await inquirer.prompt({
|
||||||
|
name: 'systemEnvValue',
|
||||||
|
type: 'list',
|
||||||
|
message: `What’s the value of ${envName}?`,
|
||||||
|
choices: systemEnvValues.map(value => ({ name: value, value })),
|
||||||
|
});
|
||||||
|
|
||||||
|
envValue = systemEnvValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (envTargets.length === 0) {
|
while (envTargets.length === 0) {
|
||||||
@@ -127,7 +222,15 @@ export default async function add(
|
|||||||
const addStamp = stamp();
|
const addStamp = stamp();
|
||||||
try {
|
try {
|
||||||
await withSpinner('Saving', () =>
|
await withSpinner('Saving', () =>
|
||||||
addEnvRecord(output, client, project.id, envName, envValue, envTargets)
|
addEnvRecord(
|
||||||
|
output,
|
||||||
|
client,
|
||||||
|
project.id,
|
||||||
|
envType,
|
||||||
|
envName,
|
||||||
|
envValue,
|
||||||
|
envTargets
|
||||||
|
)
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (isKnownError(error) && error.serverMessage) {
|
if (isKnownError(error) && error.serverMessage) {
|
||||||
@@ -148,7 +251,3 @@ export default async function add(
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isSystemEnvVariable(envName: string) {
|
|
||||||
return envName.startsWith('VERCEL_');
|
|
||||||
}
|
|
||||||
|
|||||||
44
packages/now-cli/src/commands/env/index.ts
vendored
44
packages/now-cli/src/commands/env/index.ts
vendored
@@ -1,11 +1,11 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
|
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import getSubcommand from '../../util/get-subcommand';
|
import getSubcommand from '../../util/get-subcommand';
|
||||||
import getInvalidSubcommand from '../../util/get-invalid-subcommand';
|
import getInvalidSubcommand from '../../util/get-invalid-subcommand';
|
||||||
import { getEnvTargetPlaceholder } from '../../util/env/env-target';
|
import { getEnvTargetPlaceholder } from '../../util/env/env-target';
|
||||||
|
import { getEnvTypePlaceholder } from '../../util/env/env-type';
|
||||||
import { getLinkedProject } from '../../util/projects/link';
|
import { getLinkedProject } from '../../util/projects/link';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import handleError from '../../util/handle-error';
|
import handleError from '../../util/handle-error';
|
||||||
@@ -18,14 +18,15 @@ import ls from './ls';
|
|||||||
import rm from './rm';
|
import rm from './rm';
|
||||||
|
|
||||||
const help = () => {
|
const help = () => {
|
||||||
const placeholder = getEnvTargetPlaceholder();
|
const typePlaceholder = getEnvTypePlaceholder();
|
||||||
|
const targetPlaceholder = getEnvTargetPlaceholder();
|
||||||
console.log(`
|
console.log(`
|
||||||
${chalk.bold(`${logo} ${getPkgName()} env`)} [options] <command>
|
${chalk.bold(`${logo} ${getPkgName()} env`)} [options] <command>
|
||||||
|
|
||||||
${chalk.dim('Commands:')}
|
${chalk.dim('Commands:')}
|
||||||
|
|
||||||
ls [environment] List all variables for the specified Environment
|
ls [environment] List all variables for the specified Environment
|
||||||
add [name] [environment] Add an Environment Variable (see examples below)
|
add [type] [name] [environment] Add an Environment Variable (see examples below)
|
||||||
rm [name] [environment] Remove an Environment Variable (see examples below)
|
rm [name] [environment] Remove an Environment Variable (see examples below)
|
||||||
pull [filename] Pull all Development Environment Variables from the cloud and write to a file [.env]
|
pull [filename] Pull all Development Environment Variables from the cloud and write to a file [.env]
|
||||||
|
|
||||||
@@ -42,27 +43,32 @@ const help = () => {
|
|||||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline(
|
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline(
|
||||||
'TOKEN'
|
'TOKEN'
|
||||||
)} Login token
|
)} Login token
|
||||||
-N, --next Show next page of results
|
|
||||||
|
|
||||||
${chalk.dim('Examples:')}
|
${chalk.dim('Examples:')}
|
||||||
|
|
||||||
${chalk.gray('–')} Add a new variable to multiple Environments
|
${chalk.gray('–')} Add a new variable to multiple Environments
|
||||||
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} env add <name>`)}
|
${chalk.cyan(`$ ${getPkgName()} env add ${typePlaceholder} <name>`)}
|
||||||
${chalk.cyan(`$ ${getPkgName()} env add API_TOKEN`)}
|
${chalk.cyan(`$ ${getPkgName()} env add secret API_TOKEN`)}
|
||||||
|
|
||||||
${chalk.gray('–')} Add a new variable for a specific Environment
|
${chalk.gray('–')} Add a new variable for a specific Environment
|
||||||
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} env add <name> ${placeholder}`)}
|
${chalk.cyan(
|
||||||
${chalk.cyan(`$ ${getPkgName()} env add DB_CONNECTION production`)}
|
`$ ${getPkgName()} env add ${typePlaceholder} <name> ${targetPlaceholder}`
|
||||||
|
)}
|
||||||
|
${chalk.cyan(`$ ${getPkgName()} env add secret DB_PASS production`)}
|
||||||
|
|
||||||
${chalk.gray('–')} Add a new Environment Variable from stdin
|
${chalk.gray('–')} Add a new Environment Variable from stdin
|
||||||
|
|
||||||
${chalk.cyan(
|
${chalk.cyan(
|
||||||
`$ cat <file> | ${getPkgName()} env add <name> ${placeholder}`
|
`$ cat <file> | ${getPkgName()} env add ${typePlaceholder} <name> ${targetPlaceholder}`
|
||||||
|
)}
|
||||||
|
${chalk.cyan(
|
||||||
|
`$ cat ~/.npmrc | ${getPkgName()} env add plain NPM_RC preview`
|
||||||
|
)}
|
||||||
|
${chalk.cyan(
|
||||||
|
`$ ${getPkgName()} env add plain API_URL production < url.txt`
|
||||||
)}
|
)}
|
||||||
${chalk.cyan(`$ cat ~/.npmrc | ${getPkgName()} env add NPM_RC preview`)}
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} env add DB_PASS production < secret.txt`)}
|
|
||||||
|
|
||||||
${chalk.gray('–')} Remove an variable from multiple Environments
|
${chalk.gray('–')} Remove an variable from multiple Environments
|
||||||
|
|
||||||
@@ -71,14 +77,8 @@ const help = () => {
|
|||||||
|
|
||||||
${chalk.gray('–')} Remove a variable from a specific Environment
|
${chalk.gray('–')} Remove a variable from a specific Environment
|
||||||
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} env rm <name> ${placeholder}`)}
|
${chalk.cyan(`$ ${getPkgName()} env rm <name> ${targetPlaceholder}`)}
|
||||||
${chalk.cyan(`$ ${getPkgName()} env rm NPM_RC preview`)}
|
${chalk.cyan(`$ ${getPkgName()} env rm NPM_RC preview`)}
|
||||||
|
|
||||||
${chalk.gray('–')} Paginate results, where ${chalk.dim(
|
|
||||||
'`1584722256178`'
|
|
||||||
)} is the time in milliseconds since the UNIX epoch.
|
|
||||||
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} env ls --next 1584722256178`)}
|
|
||||||
`);
|
`);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -96,8 +96,6 @@ export default async function main(ctx: NowContext) {
|
|||||||
argv = getArgs(ctx.argv.slice(2), {
|
argv = getArgs(ctx.argv.slice(2), {
|
||||||
'--yes': Boolean,
|
'--yes': Boolean,
|
||||||
'-y': '--yes',
|
'-y': '--yes',
|
||||||
'--next': Number,
|
|
||||||
'-N': '--next',
|
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
handleError(error);
|
handleError(error);
|
||||||
@@ -110,15 +108,15 @@ export default async function main(ctx: NowContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const debug = argv['--debug'];
|
const debug = argv['--debug'];
|
||||||
const output = createOutput({ debug });
|
|
||||||
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
const { subcommand, args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
apiUrl,
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const { apiUrl } = ctx;
|
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
|
||||||
const link = await getLinkedProject(output, client);
|
const link = await getLinkedProject(output, client);
|
||||||
if (link.status === 'error') {
|
if (link.status === 'error') {
|
||||||
return link.exitCode;
|
return link.exitCode;
|
||||||
|
|||||||
73
packages/now-cli/src/commands/env/ls.ts
vendored
73
packages/now-cli/src/commands/env/ls.ts
vendored
@@ -1,7 +1,12 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
import { Output } from '../../util/output';
|
import { Output } from '../../util/output';
|
||||||
import { ProjectEnvVariable, ProjectEnvTarget, Project } from '../../types';
|
import {
|
||||||
|
ProjectEnvTarget,
|
||||||
|
Project,
|
||||||
|
ProjectEnvVariable,
|
||||||
|
ProjectEnvType,
|
||||||
|
} from '../../types';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import formatTable from '../../util/format-table';
|
import formatTable from '../../util/format-table';
|
||||||
import getEnvVariables from '../../util/env/get-env-records';
|
import getEnvVariables from '../../util/env/get-env-records';
|
||||||
@@ -11,12 +16,13 @@ import {
|
|||||||
} from '../../util/env/env-target';
|
} from '../../util/env/env-target';
|
||||||
import stamp from '../../util/output/stamp';
|
import stamp from '../../util/output/stamp';
|
||||||
import param from '../../util/output/param';
|
import param from '../../util/output/param';
|
||||||
import getCommandFlags from '../../util/get-command-flags';
|
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
|
import ellipsis from '../../util/output/ellipsis';
|
||||||
|
// @ts-ignore
|
||||||
|
import title from 'title';
|
||||||
|
|
||||||
type Options = {
|
type Options = {
|
||||||
'--debug': boolean;
|
'--debug': boolean;
|
||||||
'--next'?: number;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default async function ls(
|
export default async function ls(
|
||||||
@@ -26,8 +32,6 @@ export default async function ls(
|
|||||||
args: string[],
|
args: string[],
|
||||||
output: Output
|
output: Output
|
||||||
) {
|
) {
|
||||||
const { '--next': nextTimestamp } = opts;
|
|
||||||
|
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
output.error(
|
output.error(
|
||||||
`Invalid number of arguments. Usage: ${getCommandName(
|
`Invalid number of arguments. Usage: ${getCommandName(
|
||||||
@@ -50,42 +54,21 @@ export default async function ls(
|
|||||||
|
|
||||||
const lsStamp = stamp();
|
const lsStamp = stamp();
|
||||||
|
|
||||||
if (typeof nextTimestamp !== 'undefined' && Number.isNaN(nextTimestamp)) {
|
const { envs } = await getEnvVariables(output, client, project.id, envTarget);
|
||||||
output.error('Please provide a number for flag --next');
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await getEnvVariables(
|
|
||||||
output,
|
|
||||||
client,
|
|
||||||
project.id,
|
|
||||||
5,
|
|
||||||
envTarget,
|
|
||||||
nextTimestamp
|
|
||||||
);
|
|
||||||
const { envs: records, pagination } = data;
|
|
||||||
output.log(
|
output.log(
|
||||||
`${
|
`${
|
||||||
records.length > 0 ? 'Environment Variables' : 'No Environment Variables'
|
envs.length > 0 ? 'Environment Variables' : 'No Environment Variables'
|
||||||
} found in Project ${chalk.bold(project.name)} ${chalk.gray(lsStamp())}`
|
} found in Project ${chalk.bold(project.name)} ${chalk.gray(lsStamp())}`
|
||||||
);
|
);
|
||||||
console.log(getTable(records));
|
console.log(getTable(envs));
|
||||||
|
|
||||||
if (pagination && pagination.count === 20) {
|
|
||||||
const flags = getCommandFlags(opts, ['_', '--next']);
|
|
||||||
output.log(
|
|
||||||
`To display the next page run ${getCommandName(
|
|
||||||
`env ls${flags} --next ${pagination.next}`
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTable(records: ProjectEnvVariable[]) {
|
function getTable(records: ProjectEnvVariable[]) {
|
||||||
return formatTable(
|
return formatTable(
|
||||||
['name', 'value', 'environment', 'created'],
|
['name', 'value', 'environments', 'created'],
|
||||||
['l', 'l', 'l', 'l', 'l'],
|
['l', 'l', 'l', 'l', 'l'],
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
@@ -96,17 +79,27 @@ function getTable(records: ProjectEnvVariable[]) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRow({
|
function getRow(env: ProjectEnvVariable) {
|
||||||
key,
|
let value: string;
|
||||||
system = false,
|
if (env.type === ProjectEnvType.Plaintext) {
|
||||||
target,
|
// replace space characters (line-break, etc.) with simple spaces
|
||||||
createdAt = 0,
|
// to make sure the displayed value is a single line
|
||||||
}: ProjectEnvVariable) {
|
const singleLineValue = env.value.replace(/\s/g, ' ');
|
||||||
|
|
||||||
|
value = chalk.gray(ellipsis(singleLineValue, 19));
|
||||||
|
} else if (env.type === ProjectEnvType.System) {
|
||||||
|
value = chalk.gray.italic(env.value);
|
||||||
|
} else {
|
||||||
|
value = chalk.gray.italic('Encrypted');
|
||||||
|
}
|
||||||
|
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
return [
|
return [
|
||||||
chalk.bold(key),
|
chalk.bold(env.key),
|
||||||
chalk.gray(chalk.italic(system ? 'Populated by System' : 'Encrypted')),
|
value,
|
||||||
target || '',
|
(Array.isArray(env.target) ? env.target : [env.target || ''])
|
||||||
`${ms(now - createdAt)} ago`,
|
.map(title)
|
||||||
|
.join(', '),
|
||||||
|
env.createdAt ? `${ms(now - env.createdAt)} ago` : '',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
38
packages/now-cli/src/commands/env/pull.ts
vendored
38
packages/now-cli/src/commands/env/pull.ts
vendored
@@ -1,7 +1,7 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import { ProjectEnvTarget, Project } from '../../types';
|
import { Project } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
import { Output } from '../../util/output';
|
||||||
import promptBool from '../../util/prompt-bool';
|
import confirm from '../../util/input/confirm';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import stamp from '../../util/output/stamp';
|
import stamp from '../../util/output/stamp';
|
||||||
import getDecryptedEnvRecords from '../../util/get-decrypted-env-records';
|
import getDecryptedEnvRecords from '../../util/get-decrypted-env-records';
|
||||||
@@ -12,7 +12,8 @@ import { promises, openSync, closeSync, readSync } from 'fs';
|
|||||||
import { emoji, prependEmoji } from '../../util/emoji';
|
import { emoji, prependEmoji } from '../../util/emoji';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
const { writeFile } = promises;
|
const { writeFile } = promises;
|
||||||
import { Env } from '@vercel/build-utils';
|
import exposeSystemEnvs from '../../util/dev/expose-system-envs';
|
||||||
|
import getSystemEnvValues from '../../util/env/get-system-env-values';
|
||||||
|
|
||||||
const CONTENTS_PREFIX = '# Created by Vercel CLI\n';
|
const CONTENTS_PREFIX = '# Created by Vercel CLI\n';
|
||||||
|
|
||||||
@@ -68,9 +69,9 @@ export default async function pull(
|
|||||||
} else if (
|
} else if (
|
||||||
exists &&
|
exists &&
|
||||||
!skipConfirmation &&
|
!skipConfirmation &&
|
||||||
!(await promptBool(
|
!(await confirm(
|
||||||
output,
|
`Found existing file ${param(filename)}. Do you want to overwrite?`,
|
||||||
`Found existing file ${param(filename)}. Do you want to overwrite?`
|
false
|
||||||
))
|
))
|
||||||
) {
|
) {
|
||||||
output.log('Aborted');
|
output.log('Aborted');
|
||||||
@@ -84,15 +85,22 @@ export default async function pull(
|
|||||||
);
|
);
|
||||||
const pullStamp = stamp();
|
const pullStamp = stamp();
|
||||||
|
|
||||||
const records: Env = await withSpinner(
|
const [
|
||||||
'Downloading',
|
{ envs: projectEnvs },
|
||||||
async () =>
|
{ systemEnvValues },
|
||||||
await getDecryptedEnvRecords(
|
] = await withSpinner('Downloading', () =>
|
||||||
output,
|
Promise.all([
|
||||||
client,
|
getDecryptedEnvRecords(output, client, project.id),
|
||||||
project,
|
project.autoExposeSystemEnvs
|
||||||
ProjectEnvTarget.Development
|
? getSystemEnvValues(output, client, project.id)
|
||||||
)
|
: { systemEnvValues: [] },
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
const records = exposeSystemEnvs(
|
||||||
|
projectEnvs,
|
||||||
|
systemEnvValues,
|
||||||
|
project.autoExposeSystemEnvs
|
||||||
);
|
);
|
||||||
|
|
||||||
const contents =
|
const contents =
|
||||||
|
|||||||
37
packages/now-cli/src/commands/env/rm.ts
vendored
37
packages/now-cli/src/commands/env/rm.ts
vendored
@@ -1,8 +1,8 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import inquirer from 'inquirer';
|
import inquirer from 'inquirer';
|
||||||
import { ProjectEnvTarget, Project } from '../../types';
|
import { ProjectEnvTarget, Project, ProjectEnvVariableV5 } from '../../types';
|
||||||
import { Output } from '../../util/output';
|
import { Output } from '../../util/output';
|
||||||
import promptBool from '../../util/prompt-bool';
|
import confirm from '../../util/input/confirm';
|
||||||
import removeEnvRecord from '../../util/env/remove-env-record';
|
import removeEnvRecord from '../../util/env/remove-env-record';
|
||||||
import getEnvVariables from '../../util/env/get-env-records';
|
import getEnvVariables from '../../util/env/get-env-records';
|
||||||
import {
|
import {
|
||||||
@@ -30,6 +30,9 @@ export default async function rm(
|
|||||||
args: string[],
|
args: string[],
|
||||||
output: Output
|
output: Output
|
||||||
) {
|
) {
|
||||||
|
// improve the way we show inquirer prompts
|
||||||
|
require('../../util/input/patch-inquirer');
|
||||||
|
|
||||||
if (args.length > 2) {
|
if (args.length > 2) {
|
||||||
output.error(
|
output.error(
|
||||||
`Invalid number of arguments. Usage: ${getCommandName(
|
`Invalid number of arguments. Usage: ${getCommandName(
|
||||||
@@ -69,7 +72,20 @@ export default async function rm(
|
|||||||
envName = inputName;
|
envName = inputName;
|
||||||
}
|
}
|
||||||
|
|
||||||
const envs = await getEnvVariables(output, client, project.id, 4);
|
const data = await getEnvVariables(output, client, project.id);
|
||||||
|
|
||||||
|
// we expand env vars with multiple targets
|
||||||
|
const envs: ProjectEnvVariableV5[] = [];
|
||||||
|
for (let env of data.envs) {
|
||||||
|
if (Array.isArray(env.target)) {
|
||||||
|
for (let target of env.target) {
|
||||||
|
envs.push({ ...env, target });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
envs.push({ ...env, target: env.target });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const existing = new Set(
|
const existing = new Set(
|
||||||
envs.filter(r => r.key === envName).map(r => r.target)
|
envs.filter(r => r.key === envName).map(r => r.target)
|
||||||
);
|
);
|
||||||
@@ -79,7 +95,7 @@ export default async function rm(
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (envTargets.length === 0) {
|
while (envTargets.length === 0) {
|
||||||
const choices = getEnvTargetChoices().filter(c => existing.has(c.value));
|
const choices = getEnvTargetChoices().filter(c => existing.has(c.value));
|
||||||
if (choices.length === 0) {
|
if (choices.length === 0) {
|
||||||
output.error(
|
output.error(
|
||||||
@@ -97,6 +113,13 @@ export default async function rm(
|
|||||||
message: `Remove ${envName} from which Environments (select multiple)?`,
|
message: `Remove ${envName} from which Environments (select multiple)?`,
|
||||||
choices,
|
choices,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (inputTargets.length === 0) {
|
||||||
|
output.error(
|
||||||
|
'Please select an Environment to remove the Environment Variable from.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
envTargets = inputTargets;
|
envTargets = inputTargets;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,11 +127,11 @@ export default async function rm(
|
|||||||
const skipConfirmation = opts['--yes'];
|
const skipConfirmation = opts['--yes'];
|
||||||
if (
|
if (
|
||||||
!skipConfirmation &&
|
!skipConfirmation &&
|
||||||
!(await promptBool(
|
!(await confirm(
|
||||||
output,
|
|
||||||
`Removing Environment Variable ${param(
|
`Removing Environment Variable ${param(
|
||||||
envName
|
envName
|
||||||
)} from Project ${chalk.bold(project.name)}. Are you sure?`
|
)} from Project ${chalk.bold(project.name)}. Are you sure?`,
|
||||||
|
false
|
||||||
))
|
))
|
||||||
) {
|
) {
|
||||||
output.log('Aborted');
|
output.log('Aborted');
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import getArgs from '../../util/get-args';
|
|||||||
import getSubcommand from '../../util/get-subcommand';
|
import getSubcommand from '../../util/get-subcommand';
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import handleError from '../../util/handle-error';
|
import handleError from '../../util/handle-error';
|
||||||
import createOutput from '../../util/output/create-output';
|
|
||||||
import logo from '../../util/output/logo';
|
import logo from '../../util/output/logo';
|
||||||
import error from '../../util/output/error';
|
import error from '../../util/output/error';
|
||||||
import init from './init';
|
import init from './init';
|
||||||
@@ -47,7 +46,6 @@ const help = () => {
|
|||||||
export default async function main(ctx: NowContext) {
|
export default async function main(ctx: NowContext) {
|
||||||
let argv;
|
let argv;
|
||||||
let args;
|
let args;
|
||||||
let output;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
argv = getArgs(ctx.argv.slice(2), {
|
argv = getArgs(ctx.argv.slice(2), {
|
||||||
@@ -55,7 +53,6 @@ export default async function main(ctx: NowContext) {
|
|||||||
'-f': Boolean,
|
'-f': Boolean,
|
||||||
});
|
});
|
||||||
args = getSubcommand(argv._.slice(1), COMMAND_CONFIG).args;
|
args = getSubcommand(argv._.slice(1), COMMAND_CONFIG).args;
|
||||||
output = createOutput({ debug: argv['--debug'] });
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
handleError(err);
|
handleError(err);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -67,15 +64,15 @@ export default async function main(ctx: NowContext) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (argv._.length > 3) {
|
if (argv._.length > 3) {
|
||||||
output.error('Too much arguments.');
|
ctx.output.error('Too much arguments.');
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return await init(ctx, argv, args, output);
|
return await init(ctx, argv, args);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(error(err.message));
|
console.log(error(err.message));
|
||||||
output.debug(err.stack);
|
ctx.output.debug(err.stack);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,9 +34,9 @@ const EXAMPLE_API = 'https://now-example-files.zeit.sh';
|
|||||||
export default async function init(
|
export default async function init(
|
||||||
ctx: NowContext,
|
ctx: NowContext,
|
||||||
opts: Options,
|
opts: Options,
|
||||||
args: string[],
|
args: string[]
|
||||||
output: Output
|
|
||||||
) {
|
) {
|
||||||
|
const { output } = ctx;
|
||||||
const [name, dir] = args;
|
const [name, dir] = args;
|
||||||
const force = opts['-f'] || opts['--force'];
|
const force = opts['-f'] || opts['--force'];
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import getArgs from '../util/get-args';
|
|||||||
import buildsList from '../util/output/builds';
|
import buildsList from '../util/output/builds';
|
||||||
import routesList from '../util/output/routes';
|
import routesList from '../util/output/routes';
|
||||||
import indent from '../util/output/indent';
|
import indent from '../util/output/indent';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import Now from '../util';
|
import Now from '../util';
|
||||||
import logo from '../util/output/logo';
|
import logo from '../util/output/logo';
|
||||||
import elapsed from '../util/output/elapsed.ts';
|
import elapsed from '../util/output/elapsed.ts';
|
||||||
@@ -59,9 +58,13 @@ export default async function main(ctx) {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const apiUrl = ctx.apiUrl;
|
const {
|
||||||
|
apiUrl,
|
||||||
|
output,
|
||||||
|
authConfig: { token },
|
||||||
|
config,
|
||||||
|
} = ctx;
|
||||||
const debugEnabled = argv['--debug'];
|
const debugEnabled = argv['--debug'];
|
||||||
const output = createOutput({ debug: debugEnabled });
|
|
||||||
const { print, log, error } = output;
|
const { print, log, error } = output;
|
||||||
|
|
||||||
// extract the first parameter
|
// extract the first parameter
|
||||||
@@ -73,16 +76,13 @@ export default async function main(ctx) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
|
||||||
authConfig: { token },
|
|
||||||
config,
|
|
||||||
} = ctx;
|
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const client = new Client({
|
const client = new Client({
|
||||||
apiUrl,
|
apiUrl,
|
||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
@@ -90,25 +90,30 @@ export default async function main(ctx) {
|
|||||||
({ contextName } = await getScope(client));
|
({ contextName } = await getScope(client));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code === 'NOT_AUTHORIZED' || err.code === 'TEAM_DELETED') {
|
if (err.code === 'NOT_AUTHORIZED' || err.code === 'TEAM_DELETED') {
|
||||||
output.error(err.message);
|
error(err.message);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
const now = new Now({ apiUrl, token, debug: debugEnabled, currentTeam });
|
const now = new Now({
|
||||||
|
apiUrl,
|
||||||
|
token,
|
||||||
|
debug: debugEnabled,
|
||||||
|
currentTeam,
|
||||||
|
output,
|
||||||
|
});
|
||||||
|
|
||||||
// resolve the deployment, since we might have been given an alias
|
// resolve the deployment, since we might have been given an alias
|
||||||
const depFetchStart = Date.now();
|
const depFetchStart = Date.now();
|
||||||
const cancelWait = output.spinner(
|
output.spinner(
|
||||||
`Fetching deployment "${deploymentIdOrHost}" in ${chalk.bold(contextName)}`
|
`Fetching deployment "${deploymentIdOrHost}" in ${chalk.bold(contextName)}`
|
||||||
);
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
deployment = await now.findDeployment(deploymentIdOrHost);
|
deployment = await now.findDeployment(deploymentIdOrHost);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
cancelWait();
|
|
||||||
if (err.status === 404) {
|
if (err.status === 404) {
|
||||||
error(
|
error(
|
||||||
`Failed to find deployment "${deploymentIdOrHost}" in ${chalk.bold(
|
`Failed to find deployment "${deploymentIdOrHost}" in ${chalk.bold(
|
||||||
@@ -136,7 +141,6 @@ export default async function main(ctx) {
|
|||||||
? await now.fetch(`/v1/now/deployments/${id}/builds`)
|
? await now.fetch(`/v1/now/deployments/${id}/builds`)
|
||||||
: { builds: [] };
|
: { builds: [] };
|
||||||
|
|
||||||
cancelWait();
|
|
||||||
log(
|
log(
|
||||||
`Fetched deployment "${url}" in ${chalk.bold(contextName)} ${elapsed(
|
`Fetched deployment "${url}" in ${chalk.bold(contextName)} ${elapsed(
|
||||||
Date.now() - depFetchStart
|
Date.now() - depFetchStart
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import { NowContext } from '../../types';
|
import { NowContext } from '../../types';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import getSubcommand from '../../util/get-subcommand';
|
import getSubcommand from '../../util/get-subcommand';
|
||||||
import handleError from '../../util/handle-error';
|
import handleError from '../../util/handle-error';
|
||||||
@@ -66,8 +65,6 @@ export default async function main(ctx: NowContext) {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const debug = argv['--debug'];
|
|
||||||
const output = createOutput({ debug });
|
|
||||||
const { args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
const { args } = getSubcommand(argv._.slice(1), COMMAND_CONFIG);
|
||||||
const path = args[0] || process.cwd();
|
const path = args[0] || process.cwd();
|
||||||
const autoConfirm = argv['--confirm'];
|
const autoConfirm = argv['--confirm'];
|
||||||
@@ -75,7 +72,6 @@ export default async function main(ctx: NowContext) {
|
|||||||
|
|
||||||
const link = await setupAndLink(
|
const link = await setupAndLink(
|
||||||
ctx,
|
ctx,
|
||||||
output,
|
|
||||||
path,
|
path,
|
||||||
forceDelete,
|
forceDelete,
|
||||||
autoConfirm,
|
autoConfirm,
|
||||||
|
|||||||
@@ -3,12 +3,10 @@ import ms from 'ms';
|
|||||||
import table from 'text-table';
|
import table from 'text-table';
|
||||||
import Now from '../util';
|
import Now from '../util';
|
||||||
import getArgs from '../util/get-args';
|
import getArgs from '../util/get-args';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import { handleError } from '../util/error';
|
import { handleError } from '../util/error';
|
||||||
import cmd from '../util/output/cmd.ts';
|
import cmd from '../util/output/cmd.ts';
|
||||||
import logo from '../util/output/logo';
|
import logo from '../util/output/logo';
|
||||||
import elapsed from '../util/output/elapsed.ts';
|
import elapsed from '../util/output/elapsed.ts';
|
||||||
import wait from '../util/output/wait';
|
|
||||||
import strlen from '../util/strlen.ts';
|
import strlen from '../util/strlen.ts';
|
||||||
import Client from '../util/client.ts';
|
import Client from '../util/client.ts';
|
||||||
import getScope from '../util/get-scope.ts';
|
import getScope from '../util/get-scope.ts';
|
||||||
@@ -51,12 +49,6 @@ const help = () => {
|
|||||||
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} ls my-app`)}
|
${chalk.cyan(`$ ${getPkgName()} ls my-app`)}
|
||||||
|
|
||||||
${chalk.gray(
|
|
||||||
'–'
|
|
||||||
)} List all deployments and all instances for the app ${chalk.dim('`my-app`')}
|
|
||||||
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} ls my-app --all`)}
|
|
||||||
|
|
||||||
${chalk.gray('–')} Filter deployments by metadata
|
${chalk.gray('–')} Filter deployments by metadata
|
||||||
|
|
||||||
${chalk.cyan(`$ ${getPkgName()} ls -m key1=value1 -m key2=value2`)}
|
${chalk.cyan(`$ ${getPkgName()} ls -m key1=value1 -m key2=value2`)}
|
||||||
@@ -84,11 +76,15 @@ export default async function main(ctx) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugEnabled = argv['--debug'];
|
const {
|
||||||
|
authConfig: { token },
|
||||||
|
output,
|
||||||
|
apiUrl,
|
||||||
|
config,
|
||||||
|
} = ctx;
|
||||||
|
|
||||||
const { print, log, error, note, debug } = createOutput({
|
const debugEnabled = argv['--debug'];
|
||||||
debug: debugEnabled,
|
const { print, log, error, note, debug, spinner } = output;
|
||||||
});
|
|
||||||
|
|
||||||
if (argv._.length > 2) {
|
if (argv._.length > 2) {
|
||||||
error(`${getCommandName('ls [app]')} accepts at most one argument`);
|
error(`${getCommandName('ls [app]')} accepts at most one argument`);
|
||||||
@@ -98,24 +94,19 @@ export default async function main(ctx) {
|
|||||||
let app = argv._[1];
|
let app = argv._[1];
|
||||||
let host = null;
|
let host = null;
|
||||||
|
|
||||||
const apiUrl = ctx.apiUrl;
|
|
||||||
|
|
||||||
if (argv['--help']) {
|
if (argv['--help']) {
|
||||||
help();
|
help();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const meta = parseMeta(argv['--meta']);
|
const meta = parseMeta(argv['--meta']);
|
||||||
const {
|
|
||||||
authConfig: { token },
|
|
||||||
config,
|
|
||||||
} = ctx;
|
|
||||||
const { currentTeam, includeScheme } = config;
|
const { currentTeam, includeScheme } = config;
|
||||||
const client = new Client({
|
const client = new Client({
|
||||||
apiUrl,
|
apiUrl,
|
||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
@@ -137,11 +128,15 @@ export default async function main(ctx) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const stopSpinner = wait(
|
spinner(`Fetching deployments in ${chalk.bold(contextName)}`);
|
||||||
`Fetching deployments in ${chalk.bold(contextName)}`
|
|
||||||
);
|
|
||||||
|
|
||||||
const now = new Now({ apiUrl, token, debug: debugEnabled, currentTeam });
|
const now = new Now({
|
||||||
|
apiUrl,
|
||||||
|
token,
|
||||||
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
|
currentTeam,
|
||||||
|
});
|
||||||
const start = new Date();
|
const start = new Date();
|
||||||
|
|
||||||
if (app && !isValidName(app)) {
|
if (app && !isValidName(app)) {
|
||||||
@@ -162,7 +157,6 @@ export default async function main(ctx) {
|
|||||||
const hostParts = asHost.split('-');
|
const hostParts = asHost.split('-');
|
||||||
|
|
||||||
if (hostParts < 2) {
|
if (hostParts < 2) {
|
||||||
stopSpinner();
|
|
||||||
error('Only deployment hostnames are allowed, no aliases');
|
error('Only deployment hostnames are allowed, no aliases');
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -171,19 +165,12 @@ export default async function main(ctx) {
|
|||||||
host = asHost;
|
host = asHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
let response;
|
|
||||||
|
|
||||||
try {
|
|
||||||
debug('Fetching deployments');
|
debug('Fetching deployments');
|
||||||
response = await now.list(app, {
|
const response = await now.list(app, {
|
||||||
version: 6,
|
version: 6,
|
||||||
meta,
|
meta,
|
||||||
nextTimestamp,
|
nextTimestamp,
|
||||||
});
|
});
|
||||||
} catch (err) {
|
|
||||||
stopSpinner();
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
|
|
||||||
let { deployments, pagination } = response;
|
let { deployments, pagination } = response;
|
||||||
|
|
||||||
@@ -199,7 +186,6 @@ export default async function main(ctx) {
|
|||||||
if (err.status === 404) {
|
if (err.status === 404) {
|
||||||
debug('Ignore findDeployment 404');
|
debug('Ignore findDeployment 404');
|
||||||
} else {
|
} else {
|
||||||
stopSpinner();
|
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -216,7 +202,6 @@ export default async function main(ctx) {
|
|||||||
deployments = deployments.filter(deployment => deployment.url === host);
|
deployments = deployments.filter(deployment => deployment.url === host);
|
||||||
}
|
}
|
||||||
|
|
||||||
stopSpinner();
|
|
||||||
log(
|
log(
|
||||||
`Deployments under ${chalk.bold(contextName)} ${elapsed(
|
`Deployments under ${chalk.bold(contextName)} ${elapsed(
|
||||||
Date.now() - start
|
Date.now() - start
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import getGlobalPathConfig from '../util/config/global-path';
|
|||||||
import hp from '../util/humanize-path';
|
import hp from '../util/humanize-path';
|
||||||
import logo from '../util/output/logo';
|
import logo from '../util/output/logo';
|
||||||
import exit from '../util/exit';
|
import exit from '../util/exit';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import executeLogin from '../util/login/login.ts';
|
import executeLogin from '../util/login/login.ts';
|
||||||
import { prependEmoji, emoji } from '../util/emoji';
|
import { prependEmoji, emoji } from '../util/emoji';
|
||||||
import { getCommandName, getPkgName } from '../util/pkg-name.ts';
|
import { getCommandName, getPkgName } from '../util/pkg-name.ts';
|
||||||
@@ -141,15 +140,12 @@ const login = async ctx => {
|
|||||||
await exit(0);
|
await exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugEnabled = argv['--debug'];
|
const { apiUrl, output } = ctx;
|
||||||
const output = createOutput({ debug: debugEnabled });
|
|
||||||
|
|
||||||
argv._ = argv._.slice(1);
|
argv._ = argv._.slice(1);
|
||||||
|
|
||||||
const apiUrl = ctx.apiUrl;
|
|
||||||
let email;
|
let email;
|
||||||
let emailIsValid = false;
|
let emailIsValid = false;
|
||||||
let stopSpinner;
|
|
||||||
|
|
||||||
const possibleAddress = argv._[0];
|
const possibleAddress = argv._[0];
|
||||||
|
|
||||||
@@ -190,19 +186,18 @@ const login = async ctx => {
|
|||||||
let verificationToken;
|
let verificationToken;
|
||||||
let securityCode;
|
let securityCode;
|
||||||
|
|
||||||
stopSpinner = output.spinner('Sending you an email');
|
output.spinner('Sending you an email');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = await executeLogin(apiUrl, email);
|
const data = await executeLogin(apiUrl, email);
|
||||||
verificationToken = data.token;
|
verificationToken = data.token;
|
||||||
securityCode = data.securityCode;
|
securityCode = data.securityCode;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
stopSpinner();
|
output.error(err.message);
|
||||||
console.log(error(err.message));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
stopSpinner();
|
output.stopSpinner();
|
||||||
|
|
||||||
// Clear up `Sending email` success message
|
// Clear up `Sending email` success message
|
||||||
process.stdout.write(eraseLines(possibleAddress ? 1 : 2));
|
process.stdout.write(eraseLines(possibleAddress ? 1 : 2));
|
||||||
@@ -215,7 +210,7 @@ const login = async ctx => {
|
|||||||
)}.\n`
|
)}.\n`
|
||||||
);
|
);
|
||||||
|
|
||||||
stopSpinner = output.spinner('Waiting for your confirmation');
|
output.spinner('Waiting for your confirmation');
|
||||||
|
|
||||||
let token;
|
let token;
|
||||||
|
|
||||||
@@ -228,14 +223,13 @@ const login = async ctx => {
|
|||||||
// /now/registraton is currently returning plain text in that case
|
// /now/registraton is currently returning plain text in that case
|
||||||
// we just wait for the user to click on the link
|
// we just wait for the user to click on the link
|
||||||
} else {
|
} else {
|
||||||
stopSpinner();
|
output.error(err.message);
|
||||||
console.log(err.message);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stopSpinner();
|
output.stopSpinner();
|
||||||
console.log(ok('Email confirmed'));
|
console.log(ok('Email confirmed'));
|
||||||
|
|
||||||
// There's no need to save the user since we always
|
// There's no need to save the user since we always
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
} from '../util/config/files';
|
} from '../util/config/files';
|
||||||
import getArgs from '../util/get-args';
|
import getArgs from '../util/get-args';
|
||||||
import { NowContext } from '../types';
|
import { NowContext } from '../types';
|
||||||
import createOutput, { Output } from '../util/output';
|
import { Output } from '../util/output';
|
||||||
import { getPkgName } from '../util/pkg-name';
|
import { getPkgName } from '../util/pkg-name';
|
||||||
|
|
||||||
const help = () => {
|
const help = () => {
|
||||||
@@ -54,9 +54,7 @@ export default async function main(ctx: NowContext): Promise<number> {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugEnabled = argv['--debug'];
|
return logout(ctx.apiUrl, ctx.output);
|
||||||
const output = createOutput({ debug: debugEnabled });
|
|
||||||
return logout(ctx.apiUrl, output);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const logout = async (apiUrl: string, output: Output) => {
|
const logout = async (apiUrl: string, output: Output) => {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import mri from 'mri';
|
import mri from 'mri';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import Now from '../util';
|
import Now from '../util';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import logo from '../util/output/logo';
|
import logo from '../util/output/logo';
|
||||||
import elapsed from '../util/output/elapsed.ts';
|
import elapsed from '../util/output/elapsed.ts';
|
||||||
import { maybeURL, normalizeURL } from '../util/url';
|
import { maybeURL, normalizeURL } from '../util/url';
|
||||||
@@ -59,7 +58,6 @@ export default async function main(ctx) {
|
|||||||
let deploymentIdOrURL;
|
let deploymentIdOrURL;
|
||||||
|
|
||||||
let debug;
|
let debug;
|
||||||
let apiUrl;
|
|
||||||
let head;
|
let head;
|
||||||
let limit;
|
let limit;
|
||||||
let follow;
|
let follow;
|
||||||
@@ -87,8 +85,12 @@ export default async function main(ctx) {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugEnabled = argv.debug;
|
const {
|
||||||
const output = createOutput({ debug: debugEnabled });
|
authConfig: { token },
|
||||||
|
apiUrl,
|
||||||
|
output,
|
||||||
|
config,
|
||||||
|
} = ctx;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
since = argv.since ? toTimestamp(argv.since) : 0;
|
since = argv.since ? toTimestamp(argv.since) : 0;
|
||||||
@@ -117,7 +119,6 @@ export default async function main(ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug = argv.debug;
|
debug = argv.debug;
|
||||||
apiUrl = ctx.apiUrl;
|
|
||||||
|
|
||||||
head = argv.head;
|
head = argv.head;
|
||||||
limit = typeof argv.n === 'number' ? argv.n : 100;
|
limit = typeof argv.n === 'number' ? argv.n : 100;
|
||||||
@@ -125,17 +126,14 @@ export default async function main(ctx) {
|
|||||||
if (follow) until = 0;
|
if (follow) until = 0;
|
||||||
outputMode = argv.output in logPrinters ? argv.output : 'short';
|
outputMode = argv.output in logPrinters ? argv.output : 'short';
|
||||||
|
|
||||||
const {
|
|
||||||
authConfig: { token },
|
|
||||||
config,
|
|
||||||
} = ctx;
|
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const now = new Now({ apiUrl, token, debug, currentTeam });
|
const now = new Now({ apiUrl, token, debug, currentTeam, output });
|
||||||
const client = new Client({
|
const client = new Client({
|
||||||
apiUrl,
|
apiUrl,
|
||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
@@ -206,6 +204,7 @@ export default async function main(ctx) {
|
|||||||
quiet: false,
|
quiet: false,
|
||||||
debug,
|
debug,
|
||||||
findOpts: findOpts1,
|
findOpts: findOpts1,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
|
|
||||||
const printedEventIds = new Set();
|
const printedEventIds = new Set();
|
||||||
@@ -232,6 +231,7 @@ export default async function main(ctx) {
|
|||||||
quiet: false,
|
quiet: false,
|
||||||
debug,
|
debug,
|
||||||
findOpts: findOpts2,
|
findOpts: findOpts2,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -324,7 +324,7 @@ function printLogRaw(log) {
|
|||||||
|
|
||||||
if (log.object) {
|
if (log.object) {
|
||||||
console.log(log.object);
|
console.log(log.object);
|
||||||
} else {
|
} else if (typeof log.text === 'string') {
|
||||||
console.log(
|
console.log(
|
||||||
log.text
|
log.text
|
||||||
.replace(/\n$/, '')
|
.replace(/\n$/, '')
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import exit from '../util/exit';
|
|||||||
import Client from '../util/client.ts';
|
import Client from '../util/client.ts';
|
||||||
import logo from '../util/output/logo';
|
import logo from '../util/output/logo';
|
||||||
import getScope from '../util/get-scope';
|
import getScope from '../util/get-scope';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import getCommandFlags from '../util/get-command-flags';
|
import getCommandFlags from '../util/get-command-flags';
|
||||||
import wait from '../util/output/wait';
|
import wait from '../util/output/wait';
|
||||||
import { getPkgName, getCommandName } from '../util/pkg-name.ts';
|
import { getPkgName, getCommandName } from '../util/pkg-name.ts';
|
||||||
@@ -76,13 +75,12 @@ const main = async ctx => {
|
|||||||
return exit(2);
|
return exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
const output = createOutput({ debug });
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
config: { currentTeam },
|
config: { currentTeam },
|
||||||
|
output,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||||
|
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
@@ -288,12 +286,7 @@ function readConfirmation(projectName) {
|
|||||||
process.stdin
|
process.stdin
|
||||||
.on('data', d => {
|
.on('data', d => {
|
||||||
process.stdin.pause();
|
process.stdin.pause();
|
||||||
resolve(
|
resolve(d.toString().trim().toLowerCase() === 'y');
|
||||||
d
|
|
||||||
.toString()
|
|
||||||
.trim()
|
|
||||||
.toLowerCase() === 'y'
|
|
||||||
);
|
|
||||||
})
|
})
|
||||||
.resume();
|
.resume();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import plural from 'pluralize';
|
|||||||
import table from 'text-table';
|
import table from 'text-table';
|
||||||
import Now from '../util';
|
import Now from '../util';
|
||||||
import getAliases from '../util/alias/get-aliases';
|
import getAliases from '../util/alias/get-aliases';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import logo from '../util/output/logo';
|
import logo from '../util/output/logo';
|
||||||
import elapsed from '../util/output/elapsed.ts';
|
import elapsed from '../util/output/elapsed.ts';
|
||||||
import { normalizeURL } from '../util/url';
|
import { normalizeURL } from '../util/url';
|
||||||
@@ -79,12 +78,16 @@ export default async function main(ctx) {
|
|||||||
|
|
||||||
argv._ = argv._.slice(1);
|
argv._ = argv._.slice(1);
|
||||||
|
|
||||||
const apiUrl = ctx.apiUrl;
|
const {
|
||||||
|
apiUrl,
|
||||||
|
authConfig: { token },
|
||||||
|
output,
|
||||||
|
config,
|
||||||
|
} = ctx;
|
||||||
const hard = argv.hard || false;
|
const hard = argv.hard || false;
|
||||||
const skipConfirmation = argv.yes || false;
|
const skipConfirmation = argv.yes || false;
|
||||||
const ids = argv._;
|
const ids = argv._;
|
||||||
const debugEnabled = argv.debug;
|
const debugEnabled = argv.debug;
|
||||||
const output = createOutput({ debug: debugEnabled });
|
|
||||||
const { success, error, log } = output;
|
const { success, error, log } = output;
|
||||||
|
|
||||||
if (argv.help || ids[0] === 'help') {
|
if (argv.help || ids[0] === 'help') {
|
||||||
@@ -107,16 +110,13 @@ export default async function main(ctx) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
|
||||||
authConfig: { token },
|
|
||||||
config,
|
|
||||||
} = ctx;
|
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const client = new Client({
|
const client = new Client({
|
||||||
apiUrl,
|
apiUrl,
|
||||||
token,
|
token,
|
||||||
currentTeam,
|
currentTeam,
|
||||||
debug: debugEnabled,
|
debug: debugEnabled,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
@@ -235,11 +235,9 @@ export default async function main(ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!skipConfirmation) {
|
if (!skipConfirmation) {
|
||||||
const confirmation = (await readConfirmation(
|
const confirmation = (
|
||||||
deployments,
|
await readConfirmation(deployments, projects, output)
|
||||||
projects,
|
).toLowerCase();
|
||||||
output
|
|
||||||
)).toLowerCase();
|
|
||||||
|
|
||||||
if (confirmation !== 'y' && confirmation !== 'yes') {
|
if (confirmation !== 'y' && confirmation !== 'yes') {
|
||||||
output.log('Aborted');
|
output.log('Aborted');
|
||||||
@@ -248,7 +246,13 @@ export default async function main(ctx) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const now = new Now({ apiUrl, token, debug: debugEnabled, currentTeam });
|
const now = new Now({
|
||||||
|
apiUrl,
|
||||||
|
token,
|
||||||
|
debug: debugEnabled,
|
||||||
|
currentTeam,
|
||||||
|
output,
|
||||||
|
});
|
||||||
const start = new Date();
|
const start = new Date();
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import exit from '../util/exit';
|
|||||||
import logo from '../util/output/logo';
|
import logo from '../util/output/logo';
|
||||||
import Client from '../util/client.ts';
|
import Client from '../util/client.ts';
|
||||||
import getScope from '../util/get-scope.ts';
|
import getScope from '../util/get-scope.ts';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import confirm from '../util/input/confirm';
|
import confirm from '../util/input/confirm';
|
||||||
import getCommandFlags from '../util/get-command-flags';
|
import getCommandFlags from '../util/get-command-flags';
|
||||||
import getPrefixedFlags from '../util/get-prefixed-flags';
|
import getPrefixedFlags from '../util/get-prefixed-flags';
|
||||||
@@ -104,10 +103,10 @@ const main = async ctx => {
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config: { currentTeam },
|
config: { currentTeam },
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const output = createOutput({ debug });
|
const client = new Client({ apiUrl, token, currentTeam, debug, output });
|
||||||
const client = new Client({ apiUrl, token, currentTeam, debug });
|
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -139,7 +138,7 @@ export default async ctx => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function run({ output, token, contextName, currentTeam, ctx }) {
|
async function run({ output, token, contextName, currentTeam, ctx }) {
|
||||||
const secrets = new NowSecrets({ apiUrl, token, debug, currentTeam });
|
const secrets = new NowSecrets({ apiUrl, token, debug, currentTeam, output });
|
||||||
const args = argv._.slice(1);
|
const args = argv._.slice(1);
|
||||||
const start = Date.now();
|
const start = Date.now();
|
||||||
|
|
||||||
|
|||||||
@@ -97,10 +97,11 @@ const main = async ctx => {
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
|
|
||||||
return run({ token, config });
|
return run({ token, config, output });
|
||||||
};
|
};
|
||||||
|
|
||||||
export default async ctx => {
|
export default async ctx => {
|
||||||
@@ -112,7 +113,7 @@ export default async ctx => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
async function run({ token, config }) {
|
async function run({ token, config, output }) {
|
||||||
const { currentTeam } = config;
|
const { currentTeam } = config;
|
||||||
const teams = new NowTeams({ apiUrl, token, debug, currentTeam });
|
const teams = new NowTeams({ apiUrl, token, debug, currentTeam });
|
||||||
const args = argv._;
|
const args = argv._;
|
||||||
@@ -126,6 +127,7 @@ async function run({ token, config }) {
|
|||||||
config,
|
config,
|
||||||
apiUrl,
|
apiUrl,
|
||||||
token,
|
token,
|
||||||
|
output,
|
||||||
argv,
|
argv,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@@ -154,6 +156,7 @@ async function run({ token, config }) {
|
|||||||
config,
|
config,
|
||||||
apiUrl,
|
apiUrl,
|
||||||
token,
|
token,
|
||||||
|
output,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import success from '../../util/output/success';
|
|||||||
import getUser from '../../util/get-user.ts';
|
import getUser from '../../util/get-user.ts';
|
||||||
import Client from '../../util/client.ts';
|
import Client from '../../util/client.ts';
|
||||||
import { getCommandName } from '../../util/pkg-name.ts';
|
import { getCommandName } from '../../util/pkg-name.ts';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
|
|
||||||
const validateEmail = data => regexEmail.test(data.trim()) || data.length === 0;
|
const validateEmail = data => regexEmail.test(data.trim()) || data.length === 0;
|
||||||
|
|
||||||
@@ -65,8 +64,8 @@ export default async function ({
|
|||||||
noopMsg = 'No changes made',
|
noopMsg = 'No changes made',
|
||||||
apiUrl,
|
apiUrl,
|
||||||
token,
|
token,
|
||||||
|
output,
|
||||||
} = {}) {
|
} = {}) {
|
||||||
const output = createOutput();
|
|
||||||
const { currentTeam: currentTeamId } = config;
|
const { currentTeam: currentTeamId } = config;
|
||||||
|
|
||||||
const stopSpinner = wait('Fetching teams');
|
const stopSpinner = wait('Fetching teams');
|
||||||
@@ -77,7 +76,7 @@ export default async function ({
|
|||||||
stopSpinner();
|
stopSpinner();
|
||||||
|
|
||||||
const stopUserSpinner = wait('Fetching user information');
|
const stopUserSpinner = wait('Fetching user information');
|
||||||
const client = new Client({ apiUrl, token });
|
const client = new Client({ apiUrl, token, output });
|
||||||
let user;
|
let user;
|
||||||
try {
|
try {
|
||||||
user = await getUser(client);
|
user = await getUser(client);
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import info from '../../util/output/info';
|
|||||||
import error from '../../util/output/error';
|
import error from '../../util/output/error';
|
||||||
import chars from '../../util/output/chars';
|
import chars from '../../util/output/chars';
|
||||||
import table from '../../util/output/table';
|
import table from '../../util/output/table';
|
||||||
import createOutput from '../../util/output';
|
|
||||||
import getUser from '../../util/get-user.ts';
|
import getUser from '../../util/get-user.ts';
|
||||||
import Client from '../../util/client.ts';
|
import Client from '../../util/client.ts';
|
||||||
import getPrefixedFlags from '../../util/get-prefixed-flags';
|
import getPrefixedFlags from '../../util/get-prefixed-flags';
|
||||||
@@ -16,9 +15,8 @@ import { getPkgName } from '../../util/pkg-name.ts';
|
|||||||
import getCommandFlags from '../../util/get-command-flags';
|
import getCommandFlags from '../../util/get-command-flags';
|
||||||
import cmd from '../../util/output/cmd.ts';
|
import cmd from '../../util/output/cmd.ts';
|
||||||
|
|
||||||
export default async function({ teams, config, apiUrl, token, argv }) {
|
export default async function ({ teams, config, apiUrl, token, output, argv }) {
|
||||||
const { next } = argv;
|
const { next } = argv;
|
||||||
const output = createOutput({ debug: argv['--debug'] });
|
|
||||||
|
|
||||||
if (typeof next !== 'undefined' && !Number.isInteger(next)) {
|
if (typeof next !== 'undefined' && !Number.isInteger(next)) {
|
||||||
output.error('Please provide a number for flag --next');
|
output.error('Please provide a number for flag --next');
|
||||||
@@ -36,7 +34,7 @@ export default async function({ teams, config, apiUrl, token, argv }) {
|
|||||||
stopSpinner();
|
stopSpinner();
|
||||||
|
|
||||||
const stopUserSpinner = wait('Fetching user information');
|
const stopUserSpinner = wait('Fetching user information');
|
||||||
const client = new Client({ apiUrl, token, currentTeam });
|
const client = new Client({ apiUrl, token, currentTeam, output });
|
||||||
let user;
|
let user;
|
||||||
try {
|
try {
|
||||||
user = await getUser(client);
|
user = await getUser(client);
|
||||||
|
|||||||
@@ -24,22 +24,21 @@ const updateCurrentTeam = (config, newTeam) => {
|
|||||||
writeToConfigFile(config);
|
writeToConfigFile(config);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default async function({ apiUrl, token, debug, args, config }) {
|
export default async function ({ apiUrl, token, debug, args, config, output }) {
|
||||||
let stopSpinner = wait('Fetching teams');
|
let stopSpinner;
|
||||||
|
output.spinner('Fetching teams');
|
||||||
|
|
||||||
// We're loading the teams here without `currentTeam`, so that
|
// We're loading the teams here without `currentTeam`, so that
|
||||||
// people can use `vercel switch` in the case that their
|
// people can use `vercel switch` in the case that their
|
||||||
// current team was deleted.
|
// current team was deleted.
|
||||||
const teams = new NowTeams({ apiUrl, token, debug });
|
const teams = new NowTeams({ apiUrl, token, debug, output });
|
||||||
const list = (await teams.ls()).teams;
|
const list = (await teams.ls()).teams;
|
||||||
|
|
||||||
let { currentTeam } = config;
|
let { currentTeam } = config;
|
||||||
const accountIsCurrent = !currentTeam;
|
const accountIsCurrent = !currentTeam;
|
||||||
|
|
||||||
stopSpinner();
|
output.spinner('Fetching user information');
|
||||||
|
const client = new Client({ apiUrl, token, output });
|
||||||
const stopUserSpinner = wait('Fetching user information');
|
|
||||||
const client = new Client({ apiUrl, token });
|
|
||||||
let user;
|
let user;
|
||||||
try {
|
try {
|
||||||
user = await getUser(client);
|
user = await getUser(client);
|
||||||
@@ -52,8 +51,6 @@ export default async function({ apiUrl, token, debug, args, config }) {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
stopUserSpinner();
|
|
||||||
|
|
||||||
if (accountIsCurrent) {
|
if (accountIsCurrent) {
|
||||||
currentTeam = {
|
currentTeam = {
|
||||||
slug: user.username || user.email,
|
slug: user.username || user.email,
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import logo from '../util/output/logo';
|
|||||||
import handleError from '../util/handle-error';
|
import handleError from '../util/handle-error';
|
||||||
import getArgs from '../util/get-args';
|
import getArgs from '../util/get-args';
|
||||||
import { NowContext } from '../types';
|
import { NowContext } from '../types';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import getUpdateCommand from '../util/get-update-command';
|
import getUpdateCommand from '../util/get-update-command';
|
||||||
import { getPkgName, getTitleName } from '../util/pkg-name';
|
import { getPkgName, getTitleName } from '../util/pkg-name';
|
||||||
|
|
||||||
@@ -35,6 +34,7 @@ const help = () => {
|
|||||||
|
|
||||||
export default async function main(ctx: NowContext): Promise<number> {
|
export default async function main(ctx: NowContext): Promise<number> {
|
||||||
let argv;
|
let argv;
|
||||||
|
const { output } = ctx;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
argv = getArgs(ctx.argv.slice(2), {
|
argv = getArgs(ctx.argv.slice(2), {
|
||||||
@@ -55,8 +55,6 @@ export default async function main(ctx: NowContext): Promise<number> {
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugEnabled = argv['--debug'];
|
|
||||||
const output = createOutput({ debug: debugEnabled });
|
|
||||||
output.log(
|
output.log(
|
||||||
`Please run ${cmd(
|
`Please run ${cmd(
|
||||||
await getUpdateCommand()
|
await getUpdateCommand()
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import logo from '../util/output/logo';
|
|||||||
import { handleError } from '../util/error';
|
import { handleError } from '../util/error';
|
||||||
import Client from '../util/client.ts';
|
import Client from '../util/client.ts';
|
||||||
import getScope from '../util/get-scope.ts';
|
import getScope from '../util/get-scope.ts';
|
||||||
import createOutput from '../util/output';
|
|
||||||
import { getPkgName } from '../util/pkg-name.ts';
|
import { getPkgName } from '../util/pkg-name.ts';
|
||||||
|
|
||||||
const help = () => {
|
const help = () => {
|
||||||
@@ -55,10 +54,10 @@ const main = async ctx => {
|
|||||||
const debug = argv['--debug'];
|
const debug = argv['--debug'];
|
||||||
const {
|
const {
|
||||||
authConfig: { token },
|
authConfig: { token },
|
||||||
|
output,
|
||||||
apiUrl,
|
apiUrl,
|
||||||
} = ctx;
|
} = ctx;
|
||||||
const output = createOutput({ debug });
|
const client = new Client({ apiUrl, token, debug, output });
|
||||||
const client = new Client({ apiUrl, token, debug });
|
|
||||||
let contextName = null;
|
let contextName = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ const main = async argv_ => {
|
|||||||
|
|
||||||
let authConfig = null;
|
let authConfig = null;
|
||||||
|
|
||||||
const subcommandsWithoutToken = ['login', 'help', 'init', 'dev', 'update'];
|
const subcommandsWithoutToken = ['login', 'help', 'init', 'update'];
|
||||||
|
|
||||||
if (authConfigExists) {
|
if (authConfigExists) {
|
||||||
try {
|
try {
|
||||||
@@ -346,6 +346,7 @@ const main = async argv_ => {
|
|||||||
|
|
||||||
// the context object to supply to the providers or the commands
|
// the context object to supply to the providers or the commands
|
||||||
const ctx = {
|
const ctx = {
|
||||||
|
output,
|
||||||
config,
|
config,
|
||||||
authConfig,
|
authConfig,
|
||||||
localConfig,
|
localConfig,
|
||||||
@@ -536,7 +537,7 @@ const main = async argv_ => {
|
|||||||
!(targetCommand === 'teams' && argv._[3] !== 'invite')
|
!(targetCommand === 'teams' && argv._[3] !== 'invite')
|
||||||
) {
|
) {
|
||||||
let user = null;
|
let user = null;
|
||||||
const client = new Client({ apiUrl, token });
|
const client = new Client({ apiUrl, token, output });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
user = await getUser(client);
|
user = await getUser(client);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { NowConfig } from './util/dev/types';
|
import { NowConfig } from './util/dev/types';
|
||||||
|
import { Output } from './util/output';
|
||||||
|
|
||||||
export type ThenArg<T> = T extends Promise<infer U> ? U : T;
|
export type ThenArg<T> = T extends Promise<infer U> ? U : T;
|
||||||
|
|
||||||
@@ -8,6 +9,7 @@ export interface NowContext {
|
|||||||
authConfig: {
|
authConfig: {
|
||||||
token: string;
|
token: string;
|
||||||
};
|
};
|
||||||
|
output: Output;
|
||||||
config: {
|
config: {
|
||||||
currentTeam: string;
|
currentTeam: string;
|
||||||
updateChannel: string;
|
updateChannel: string;
|
||||||
@@ -203,12 +205,23 @@ export enum ProjectEnvTarget {
|
|||||||
Development = 'development',
|
Development = 'development',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum ProjectEnvType {
|
||||||
|
Plaintext = 'plain',
|
||||||
|
Secret = 'secret',
|
||||||
|
System = 'system',
|
||||||
|
}
|
||||||
|
|
||||||
export interface ProjectEnvVariable {
|
export interface ProjectEnvVariable {
|
||||||
key: string;
|
key: string;
|
||||||
value: string;
|
value: string;
|
||||||
|
type: ProjectEnvType;
|
||||||
configurationId?: string | null;
|
configurationId?: string | null;
|
||||||
createdAt?: number;
|
createdAt?: number;
|
||||||
updatedAt?: number;
|
updatedAt?: number;
|
||||||
|
target?: ProjectEnvTarget | ProjectEnvTarget[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ProjectEnvVariableV5 extends ProjectEnvVariable {
|
||||||
target?: ProjectEnvTarget;
|
target?: ProjectEnvTarget;
|
||||||
system?: boolean;
|
system?: boolean;
|
||||||
}
|
}
|
||||||
@@ -219,6 +232,8 @@ export interface ProjectSettings {
|
|||||||
buildCommand?: string | null;
|
buildCommand?: string | null;
|
||||||
outputDirectory?: string | null;
|
outputDirectory?: string | null;
|
||||||
rootDirectory?: string | null;
|
rootDirectory?: string | null;
|
||||||
|
autoExposeSystemEnvs?: boolean;
|
||||||
|
directoryListing?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Project extends ProjectSettings {
|
export interface Project extends ProjectSettings {
|
||||||
@@ -232,6 +247,7 @@ export interface Project extends ProjectSettings {
|
|||||||
framework?: string | null;
|
framework?: string | null;
|
||||||
rootDirectory?: string | null;
|
rootDirectory?: string | null;
|
||||||
latestDeployments?: Partial<Deployment>[];
|
latestDeployments?: Partial<Deployment>[];
|
||||||
|
autoExposeSystemEnvs?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Org {
|
export interface Org {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export default class Client extends EventEmitter {
|
|||||||
forceNew = false,
|
forceNew = false,
|
||||||
withCache = false,
|
withCache = false,
|
||||||
debug = false,
|
debug = false,
|
||||||
|
output = createOutput({ debug }),
|
||||||
}: {
|
}: {
|
||||||
apiUrl: string;
|
apiUrl: string;
|
||||||
token: string;
|
token: string;
|
||||||
@@ -40,13 +41,14 @@ export default class Client extends EventEmitter {
|
|||||||
forceNew?: boolean;
|
forceNew?: boolean;
|
||||||
withCache?: boolean;
|
withCache?: boolean;
|
||||||
debug?: boolean;
|
debug?: boolean;
|
||||||
|
output?: Output;
|
||||||
}) {
|
}) {
|
||||||
super();
|
super();
|
||||||
this._token = token;
|
this._token = token;
|
||||||
this._debug = debug;
|
this._debug = debug;
|
||||||
this._forceNew = forceNew;
|
this._forceNew = forceNew;
|
||||||
this._withCache = withCache;
|
this._withCache = withCache;
|
||||||
this._output = createOutput({ debug });
|
this._output = output;
|
||||||
this._apiUrl = apiUrl;
|
this._apiUrl = apiUrl;
|
||||||
this._onRetry = this._onRetry.bind(this);
|
this._onRetry = this._onRetry.bind(this);
|
||||||
this.currentTeam = currentTeam;
|
this.currentTeam = currentTeam;
|
||||||
|
|||||||
@@ -100,11 +100,7 @@ export default async function processDeployment({
|
|||||||
skipAutoDetectionConfirmation,
|
skipAutoDetectionConfirmation,
|
||||||
};
|
};
|
||||||
|
|
||||||
let queuedSpinner = null;
|
output.spinner(
|
||||||
let buildSpinner = null;
|
|
||||||
let deploySpinner = null;
|
|
||||||
|
|
||||||
const deployingSpinner = output.spinner(
|
|
||||||
isSettingUpProject
|
isSettingUpProject
|
||||||
? 'Setting up project'
|
? 'Setting up project'
|
||||||
: `Deploying ${chalk.bold(`${org.slug}/${projectName}`)}`,
|
: `Deploying ${chalk.bold(`${org.slug}/${projectName}`)}`,
|
||||||
@@ -138,16 +134,7 @@ export default async function processDeployment({
|
|||||||
.map((sha: string) => event.payload.total.get(sha).data.length)
|
.map((sha: string) => event.payload.total.get(sha).data.length)
|
||||||
.reduce((a: number, b: number) => a + b, 0);
|
.reduce((a: number, b: number) => a + b, 0);
|
||||||
|
|
||||||
if (queuedSpinner) {
|
output.stopSpinner();
|
||||||
queuedSpinner();
|
|
||||||
}
|
|
||||||
if (buildSpinner) {
|
|
||||||
buildSpinner();
|
|
||||||
}
|
|
||||||
if (deploySpinner) {
|
|
||||||
deploySpinner();
|
|
||||||
}
|
|
||||||
deployingSpinner();
|
|
||||||
bar = new Progress(`${chalk.gray('>')} Upload [:bar] :percent :etas`, {
|
bar = new Progress(`${chalk.gray('>')} Upload [:bar] :percent :etas`, {
|
||||||
width: 20,
|
width: 20,
|
||||||
complete: '=',
|
complete: '=',
|
||||||
@@ -170,8 +157,6 @@ export default async function processDeployment({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (event.type === 'created') {
|
if (event.type === 'created') {
|
||||||
deployingSpinner();
|
|
||||||
|
|
||||||
if (bar && !bar.complete) {
|
if (bar && !bar.complete) {
|
||||||
bar.tick(bar.total + 1);
|
bar.tick(bar.total + 1);
|
||||||
}
|
}
|
||||||
@@ -191,63 +176,36 @@ export default async function processDeployment({
|
|||||||
|
|
||||||
now.url = event.payload.url;
|
now.url = event.payload.url;
|
||||||
|
|
||||||
|
output.stopSpinner();
|
||||||
|
|
||||||
printInspectUrl(output, event.payload.url, deployStamp, org.slug);
|
printInspectUrl(output, event.payload.url, deployStamp, org.slug);
|
||||||
|
|
||||||
if (quiet) {
|
if (quiet) {
|
||||||
process.stdout.write(`https://${event.payload.url}`);
|
process.stdout.write(`https://${event.payload.url}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queuedSpinner === null) {
|
output.spinner(
|
||||||
queuedSpinner =
|
event.payload.readyState === 'QUEUED' ? 'Queued' : 'Building',
|
||||||
event.payload.readyState === 'QUEUED'
|
0
|
||||||
? output.spinner('Queued', 0)
|
);
|
||||||
: output.spinner('Building', 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.type === 'building') {
|
if (event.type === 'building') {
|
||||||
if (queuedSpinner) {
|
output.spinner('Building', 0);
|
||||||
queuedSpinner();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buildSpinner === null) {
|
|
||||||
buildSpinner = output.spinner('Building', 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.type === 'canceled') {
|
if (event.type === 'canceled') {
|
||||||
if (queuedSpinner) {
|
output.stopSpinner();
|
||||||
queuedSpinner();
|
|
||||||
}
|
|
||||||
if (buildSpinner) {
|
|
||||||
buildSpinner();
|
|
||||||
}
|
|
||||||
return event.payload;
|
return event.payload;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.type === 'ready') {
|
if (event.type === 'ready') {
|
||||||
if (queuedSpinner) {
|
output.spinner('Completing', 0);
|
||||||
queuedSpinner();
|
|
||||||
}
|
|
||||||
if (buildSpinner) {
|
|
||||||
buildSpinner();
|
|
||||||
}
|
|
||||||
|
|
||||||
deploySpinner = output.spinner('Completing', 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle error events
|
// Handle error events
|
||||||
if (event.type === 'error') {
|
if (event.type === 'error') {
|
||||||
if (queuedSpinner) {
|
output.stopSpinner();
|
||||||
queuedSpinner();
|
|
||||||
}
|
|
||||||
if (buildSpinner) {
|
|
||||||
buildSpinner();
|
|
||||||
}
|
|
||||||
if (deploySpinner) {
|
|
||||||
deploySpinner();
|
|
||||||
}
|
|
||||||
deployingSpinner();
|
|
||||||
|
|
||||||
const error = await now.handleDeploymentError(event.payload, {
|
const error = await now.handleDeploymentError(event.payload, {
|
||||||
hashes,
|
hashes,
|
||||||
@@ -263,32 +221,12 @@ export default async function processDeployment({
|
|||||||
|
|
||||||
// Handle alias-assigned event
|
// Handle alias-assigned event
|
||||||
if (event.type === 'alias-assigned') {
|
if (event.type === 'alias-assigned') {
|
||||||
if (queuedSpinner) {
|
|
||||||
queuedSpinner();
|
|
||||||
}
|
|
||||||
if (buildSpinner) {
|
|
||||||
buildSpinner();
|
|
||||||
}
|
|
||||||
if (deploySpinner) {
|
|
||||||
deploySpinner();
|
|
||||||
}
|
|
||||||
deployingSpinner();
|
|
||||||
|
|
||||||
event.payload.indications = indications;
|
event.payload.indications = indications;
|
||||||
return event.payload;
|
return event.payload;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (queuedSpinner) {
|
output.stopSpinner();
|
||||||
queuedSpinner();
|
|
||||||
}
|
|
||||||
if (buildSpinner) {
|
|
||||||
buildSpinner();
|
|
||||||
}
|
|
||||||
if (deploySpinner) {
|
|
||||||
deploySpinner();
|
|
||||||
}
|
|
||||||
deployingSpinner();
|
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import chalk from 'chalk';
|
||||||
import execa from 'execa';
|
import execa from 'execa';
|
||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
import npa from 'npm-package-arg';
|
import npa from 'npm-package-arg';
|
||||||
@@ -8,9 +9,10 @@ import { mkdirp, readJSON, writeJSON } from 'fs-extra';
|
|||||||
import { NowBuildError, PackageJson } from '@vercel/build-utils';
|
import { NowBuildError, PackageJson } from '@vercel/build-utils';
|
||||||
import cliPkg from '../pkg';
|
import cliPkg from '../pkg';
|
||||||
|
|
||||||
import { NoBuilderCacheError } from '../errors-ts';
|
import cmd from '../output/cmd';
|
||||||
import { Output } from '../output';
|
import { Output } from '../output';
|
||||||
import { getDistTag } from '../get-dist-tag';
|
import { getDistTag } from '../get-dist-tag';
|
||||||
|
import { NoBuilderCacheError } from '../errors-ts';
|
||||||
|
|
||||||
import * as staticBuilder from './static-builder';
|
import * as staticBuilder from './static-builder';
|
||||||
import { BuilderWithPackage } from './types';
|
import { BuilderWithPackage } from './types';
|
||||||
@@ -261,7 +263,9 @@ async function npmInstall(
|
|||||||
throw new NowBuildError({
|
throw new NowBuildError({
|
||||||
message:
|
message:
|
||||||
(result as any).code === 'ENOENT'
|
(result as any).code === 'ENOENT'
|
||||||
? '`npm` is not installed'
|
? `Command not found: ${chalk.cyan(
|
||||||
|
'npm'
|
||||||
|
)}\nPlease ensure that ${cmd('npm')} is properly installed`
|
||||||
: 'Failed to install `vercel dev` dependencies',
|
: 'Failed to install `vercel dev` dependencies',
|
||||||
code: 'NPM_INSTALL_ERROR',
|
code: 'NPM_INSTALL_ERROR',
|
||||||
link: 'https://vercel.link/npm-install-failed-dev',
|
link: 'https://vercel.link/npm-install-failed-dev',
|
||||||
|
|||||||
@@ -149,8 +149,8 @@ export async function executeBuild(
|
|||||||
filesRemoved,
|
filesRemoved,
|
||||||
// This env distiniction is only necessary to maintain
|
// This env distiniction is only necessary to maintain
|
||||||
// backwards compatibility with the `@vercel/next` builder.
|
// backwards compatibility with the `@vercel/next` builder.
|
||||||
env: envConfigs.runEnv,
|
env: { ...envConfigs.runEnv },
|
||||||
buildEnv: envConfigs.buildEnv,
|
buildEnv: { ...envConfigs.buildEnv },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -280,7 +280,6 @@ export async function executeBuild(
|
|||||||
path = extensionless;
|
path = extensionless;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete output[path];
|
|
||||||
output[path] = value;
|
output[path] = value;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -402,7 +401,7 @@ export async function getBuildMatches(
|
|||||||
const builds = nowConfig.builds || [{ src: '**', use: '@vercel/static' }];
|
const builds = nowConfig.builds || [{ src: '**', use: '@vercel/static' }];
|
||||||
|
|
||||||
for (const buildConfig of builds) {
|
for (const buildConfig of builds) {
|
||||||
let { src, use } = buildConfig;
|
let { src = '**', use, config = {} } = buildConfig;
|
||||||
|
|
||||||
if (!use) {
|
if (!use) {
|
||||||
continue;
|
continue;
|
||||||
@@ -437,6 +436,15 @@ export async function getBuildMatches(
|
|||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
src = relative(cwd, file);
|
src = relative(cwd, file);
|
||||||
|
|
||||||
|
// Remove the output directory prefix
|
||||||
|
if (config.zeroConfig && config.outputDirectory) {
|
||||||
|
const outputMatch = config.outputDirectory + '/';
|
||||||
|
if (src.startsWith(outputMatch)) {
|
||||||
|
src = src.slice(outputMatch.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const builderWithPkg = await getBuilder(use, output);
|
const builderWithPkg = await getBuilder(use, output);
|
||||||
matches.push({
|
matches.push({
|
||||||
...buildConfig,
|
...buildConfig,
|
||||||
|
|||||||
41
packages/now-cli/src/util/dev/expose-system-envs.ts
Normal file
41
packages/now-cli/src/util/dev/expose-system-envs.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { ProjectEnvType, ProjectEnvVariable } from '../../types';
|
||||||
|
import { Env } from '@vercel/build-utils';
|
||||||
|
|
||||||
|
function getSystemEnvValue(
|
||||||
|
systemEnvRef: string,
|
||||||
|
{ vercelUrl }: { vercelUrl?: string }
|
||||||
|
) {
|
||||||
|
if (systemEnvRef === 'VERCEL_URL') {
|
||||||
|
return vercelUrl || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function exposeSystemEnvs(
|
||||||
|
projectEnvs: ProjectEnvVariable[],
|
||||||
|
systemEnvValues: string[],
|
||||||
|
autoExposeSystemEnvs: boolean | undefined,
|
||||||
|
vercelUrl?: string
|
||||||
|
) {
|
||||||
|
const envs: Env = {};
|
||||||
|
|
||||||
|
if (autoExposeSystemEnvs) {
|
||||||
|
envs['VERCEL'] = '1';
|
||||||
|
envs['VERCEL_ENV'] = 'development';
|
||||||
|
|
||||||
|
for (const key of systemEnvValues) {
|
||||||
|
envs[key] = getSystemEnvValue(key, { vercelUrl });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let env of projectEnvs) {
|
||||||
|
if (env.type === ProjectEnvType.System) {
|
||||||
|
envs[env.key] = getSystemEnvValue(env.value, { vercelUrl });
|
||||||
|
} else {
|
||||||
|
envs[env.key] = env.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return envs;
|
||||||
|
}
|
||||||
@@ -43,6 +43,7 @@ import {
|
|||||||
} from '@vercel/build-utils';
|
} from '@vercel/build-utils';
|
||||||
import _frameworks, { Framework } from '@vercel/frameworks';
|
import _frameworks, { Framework } from '@vercel/frameworks';
|
||||||
|
|
||||||
|
import cmd from '../output/cmd';
|
||||||
import link from '../output/link';
|
import link from '../output/link';
|
||||||
import { Output } from '../output';
|
import { Output } from '../output';
|
||||||
import { relative } from '../path-helpers';
|
import { relative } from '../path-helpers';
|
||||||
@@ -85,7 +86,8 @@ import {
|
|||||||
HttpHeadersConfig,
|
HttpHeadersConfig,
|
||||||
EnvConfigs,
|
EnvConfigs,
|
||||||
} from './types';
|
} from './types';
|
||||||
import { ProjectSettings } from '../../types';
|
import { ProjectEnvVariable, ProjectSettings } from '../../types';
|
||||||
|
import exposeSystemEnvs from './expose-system-envs';
|
||||||
|
|
||||||
const frameworkList = _frameworks as Framework[];
|
const frameworkList = _frameworks as Framework[];
|
||||||
const frontendRuntimeSet = new Set(
|
const frontendRuntimeSet = new Set(
|
||||||
@@ -149,14 +151,16 @@ export default class DevServer {
|
|||||||
private updateBuildersTimeout: NodeJS.Timeout | undefined;
|
private updateBuildersTimeout: NodeJS.Timeout | undefined;
|
||||||
private startPromise: Promise<void> | null;
|
private startPromise: Promise<void> | null;
|
||||||
|
|
||||||
private environmentVars: Env | undefined;
|
private systemEnvValues: string[];
|
||||||
|
private projectEnvs: ProjectEnvVariable[];
|
||||||
|
|
||||||
constructor(cwd: string, options: DevServerOptions) {
|
constructor(cwd: string, options: DevServerOptions) {
|
||||||
this.cwd = cwd;
|
this.cwd = cwd;
|
||||||
this.debug = options.debug;
|
this.debug = options.debug;
|
||||||
this.output = options.output;
|
this.output = options.output;
|
||||||
this.envConfigs = { buildEnv: {}, runEnv: {}, allEnv: {} };
|
this.envConfigs = { buildEnv: {}, runEnv: {}, allEnv: {} };
|
||||||
this.environmentVars = options.environmentVars;
|
this.systemEnvValues = options.systemEnvValues || [];
|
||||||
|
this.projectEnvs = options.projectEnvs || [];
|
||||||
this.files = {};
|
this.files = {};
|
||||||
this.address = '';
|
this.address = '';
|
||||||
this.devCommand = options.devCommand;
|
this.devCommand = options.devCommand;
|
||||||
@@ -491,7 +495,7 @@ export default class DevServer {
|
|||||||
const dotenv = await fs.readFile(filePath, 'utf8');
|
const dotenv = await fs.readFile(filePath, 'utf8');
|
||||||
this.output.debug(`Using local env: ${filePath}`);
|
this.output.debug(`Using local env: ${filePath}`);
|
||||||
env = parseDotenv(dotenv);
|
env = parseDotenv(dotenv);
|
||||||
env = this.populateVercelEnvVars(env);
|
env = this.injectSystemValuesInDotenv(env);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code !== 'ENOENT') {
|
if (err.code !== 'ENOENT') {
|
||||||
throw err;
|
throw err;
|
||||||
@@ -642,10 +646,30 @@ export default class DevServer {
|
|||||||
|
|
||||||
let allEnv = { ...buildEnv, ...runEnv };
|
let allEnv = { ...buildEnv, ...runEnv };
|
||||||
|
|
||||||
// If no .env/.build.env is present, fetch and use cloud environment variables
|
// If no .env/.build.env is present, use cloud environment variables
|
||||||
if (Object.keys(allEnv).length === 0) {
|
if (Object.keys(allEnv).length === 0) {
|
||||||
const cloudEnv = this.populateVercelEnvVars(this.environmentVars);
|
const cloudEnv = exposeSystemEnvs(
|
||||||
allEnv = runEnv = buildEnv = cloudEnv;
|
this.projectEnvs || [],
|
||||||
|
this.systemEnvValues || [],
|
||||||
|
this.projectSettings?.autoExposeSystemEnvs,
|
||||||
|
new URL(this.address).host
|
||||||
|
);
|
||||||
|
|
||||||
|
allEnv = { ...cloudEnv };
|
||||||
|
runEnv = { ...cloudEnv };
|
||||||
|
buildEnv = { ...cloudEnv };
|
||||||
|
}
|
||||||
|
|
||||||
|
// legacy NOW_REGION env variable
|
||||||
|
runEnv['NOW_REGION'] = 'dev1';
|
||||||
|
buildEnv['NOW_REGION'] = 'dev1';
|
||||||
|
allEnv['NOW_REGION'] = 'dev1';
|
||||||
|
|
||||||
|
// mirror how VERCEL_REGION is injected in prod/preview
|
||||||
|
// only inject in `runEnvs`, because `allEnvs` is exposed to dev command
|
||||||
|
// and should not contain VERCEL_REGION
|
||||||
|
if (this.projectSettings?.autoExposeSystemEnvs) {
|
||||||
|
runEnv['VERCEL_REGION'] = 'dev1';
|
||||||
}
|
}
|
||||||
|
|
||||||
this.envConfigs = { buildEnv, runEnv, allEnv };
|
this.envConfigs = { buildEnv, runEnv, allEnv };
|
||||||
@@ -753,23 +777,15 @@ export default class DevServer {
|
|||||||
return merged;
|
return merged;
|
||||||
}
|
}
|
||||||
|
|
||||||
populateVercelEnvVars(env: Env | undefined): Env {
|
injectSystemValuesInDotenv(env: Env): Env {
|
||||||
if (!env) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const name of Object.keys(env)) {
|
for (const name of Object.keys(env)) {
|
||||||
if (name === 'VERCEL_URL') {
|
if (name === 'VERCEL_URL') {
|
||||||
const host = new URL(this.address).host;
|
env['VERCEL_URL'] = new URL(this.address).host;
|
||||||
env['VERCEL_URL'] = host;
|
|
||||||
} else if (name === 'VERCEL_REGION') {
|
} else if (name === 'VERCEL_REGION') {
|
||||||
env['VERCEL_REGION'] = 'dev1';
|
env['VERCEL_REGION'] = 'dev1';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always set NOW_REGION to match production
|
|
||||||
env['NOW_REGION'] = 'dev1';
|
|
||||||
|
|
||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -871,7 +887,7 @@ export default class DevServer {
|
|||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
this.updateBuildersPromise = null;
|
this.updateBuildersPromise = null;
|
||||||
this.output.error(`Failed to update builders: ${err.message}`);
|
this.output.prettyError(err);
|
||||||
this.output.debug(err.stack);
|
this.output.debug(err.stack);
|
||||||
});
|
});
|
||||||
}, ms('30s'));
|
}, ms('30s'));
|
||||||
@@ -1658,15 +1674,24 @@ export default class DevServer {
|
|||||||
isDev: true,
|
isDev: true,
|
||||||
requestPath,
|
requestPath,
|
||||||
devCacheDir,
|
devCacheDir,
|
||||||
env: envConfigs.runEnv,
|
env: { ...envConfigs.runEnv },
|
||||||
buildEnv: envConfigs.buildEnv,
|
buildEnv: { ...envConfigs.buildEnv },
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// `startDevServer()` threw an error. Most likely this means the dev
|
// `startDevServer()` threw an error. Most likely this means the dev
|
||||||
// server process exited before sending the port information message
|
// server process exited before sending the port information message
|
||||||
// (missing dependency at runtime, for example).
|
// (missing dependency at runtime, for example).
|
||||||
debug(`Error starting "${builderPkg.name}" dev server: ${err}`);
|
if (err.code === 'ENOENT') {
|
||||||
|
err.message = `Command not found: ${chalk.cyan(
|
||||||
|
err.path,
|
||||||
|
...err.spawnargs
|
||||||
|
)}\nPlease ensure that ${cmd(err.path)} is properly installed`;
|
||||||
|
err.link = 'https://vercel.link/command-not-found';
|
||||||
|
}
|
||||||
|
|
||||||
|
this.output.prettyError(err);
|
||||||
|
|
||||||
await this.sendError(
|
await this.sendError(
|
||||||
req,
|
req,
|
||||||
res,
|
res,
|
||||||
@@ -1879,6 +1904,12 @@ export default class DevServer {
|
|||||||
requestPath: string,
|
requestPath: string,
|
||||||
nowRequestId: string
|
nowRequestId: string
|
||||||
): boolean {
|
): boolean {
|
||||||
|
// If the "directory listing" feature is disabled in the
|
||||||
|
// Project's settings, then don't render the directory listing
|
||||||
|
if (this.projectSettings?.directoryListing === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
let prefix = requestPath;
|
let prefix = requestPath;
|
||||||
if (prefix.length > 0 && !prefix.endsWith('/')) {
|
if (prefix.length > 0 && !prefix.endsWith('/')) {
|
||||||
prefix += '/';
|
prefix += '/';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { basename, extname, join } from 'path';
|
|
||||||
import {
|
import {
|
||||||
FileFsRef,
|
FileFsRef,
|
||||||
BuildOptions,
|
BuildOptions,
|
||||||
|
shouldServe as defaultShouldServe,
|
||||||
ShouldServeOptions,
|
ShouldServeOptions,
|
||||||
} from '@vercel/build-utils';
|
} from '@vercel/build-utils';
|
||||||
import { BuildResult } from './types';
|
import { BuildResult } from './types';
|
||||||
@@ -11,50 +11,32 @@ export const version = 2;
|
|||||||
export function build({
|
export function build({
|
||||||
files,
|
files,
|
||||||
entrypoint,
|
entrypoint,
|
||||||
config,
|
config: { zeroConfig, outputDirectory },
|
||||||
}: BuildOptions): BuildResult {
|
}: BuildOptions): BuildResult {
|
||||||
let path = entrypoint;
|
const path =
|
||||||
const outputDir = config.zeroConfig ? config.outputDirectory : '';
|
zeroConfig && outputDirectory
|
||||||
const outputMatch = outputDir + '/';
|
? `${outputDirectory}/${entrypoint}`
|
||||||
if (outputDir && path.startsWith(outputMatch)) {
|
: entrypoint;
|
||||||
// static output files are moved to the root directory
|
return {
|
||||||
path = path.slice(outputMatch.length);
|
output: {
|
||||||
}
|
[entrypoint]: files[path] as FileFsRef,
|
||||||
const output = {
|
},
|
||||||
[path]: files[entrypoint] as FileFsRef,
|
routes: [],
|
||||||
|
watch: [path],
|
||||||
};
|
};
|
||||||
const watch = [path];
|
|
||||||
|
|
||||||
return { output, routes: [], watch };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function shouldServe({
|
export function shouldServe(_opts: ShouldServeOptions) {
|
||||||
entrypoint,
|
const opts = { ..._opts };
|
||||||
files,
|
let {
|
||||||
requestPath,
|
config: { zeroConfig, outputDirectory },
|
||||||
config = {},
|
} = opts;
|
||||||
}: ShouldServeOptions) {
|
|
||||||
let outputPrefix = '';
|
|
||||||
const outputDir = config.zeroConfig ? config.outputDirectory : '';
|
|
||||||
const outputMatch = outputDir + '/';
|
|
||||||
if (outputDir && entrypoint.startsWith(outputMatch)) {
|
|
||||||
// static output files are moved to the root directory
|
|
||||||
entrypoint = entrypoint.slice(outputMatch.length);
|
|
||||||
outputPrefix = outputMatch;
|
|
||||||
}
|
|
||||||
const isMatch = (f: string) => entrypoint === f && outputPrefix + f in files;
|
|
||||||
|
|
||||||
if (isIndex(entrypoint)) {
|
// Add the output directory prefix
|
||||||
const indexPath = join(requestPath, basename(entrypoint));
|
if (zeroConfig && outputDirectory) {
|
||||||
if (isMatch(indexPath)) {
|
opts.entrypoint = `${outputDirectory}/${opts.entrypoint}`;
|
||||||
return true;
|
opts.requestPath = `${outputDirectory}/${opts.requestPath}`;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return isMatch(requestPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
function isIndex(path: string): boolean {
|
return defaultShouldServe(opts);
|
||||||
const ext = extname(path);
|
|
||||||
const name = basename(path, ext);
|
|
||||||
return name === 'index';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import {
|
|||||||
import { NowConfig } from '@vercel/client';
|
import { NowConfig } from '@vercel/client';
|
||||||
import { HandleValue, Route } from '@vercel/routing-utils';
|
import { HandleValue, Route } from '@vercel/routing-utils';
|
||||||
import { Output } from '../output';
|
import { Output } from '../output';
|
||||||
import { ProjectSettings } from '../../types';
|
import { ProjectEnvVariable, ProjectSettings } from '../../types';
|
||||||
|
|
||||||
export { NowConfig };
|
export { NowConfig };
|
||||||
|
|
||||||
@@ -27,7 +27,8 @@ export interface DevServerOptions {
|
|||||||
devCommand?: string;
|
devCommand?: string;
|
||||||
frameworkSlug?: string;
|
frameworkSlug?: string;
|
||||||
projectSettings?: ProjectSettings;
|
projectSettings?: ProjectSettings;
|
||||||
environmentVars?: Env;
|
systemEnvValues?: string[];
|
||||||
|
projectEnvs?: ProjectEnvVariable[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface EnvConfigs {
|
export interface EnvConfigs {
|
||||||
@@ -49,6 +50,7 @@ export interface EnvConfigs {
|
|||||||
|
|
||||||
export interface BuildMatch extends BuildConfig {
|
export interface BuildMatch extends BuildConfig {
|
||||||
entrypoint: string;
|
entrypoint: string;
|
||||||
|
src: string;
|
||||||
builderWithPkg: BuilderWithPackage;
|
builderWithPkg: BuilderWithPackage;
|
||||||
buildOutput: BuilderOutputs;
|
buildOutput: BuilderOutputs;
|
||||||
buildResults: Map<string | null, BuildResult>;
|
buildResults: Map<string | null, BuildResult>;
|
||||||
|
|||||||
@@ -12,11 +12,12 @@ type Response = {
|
|||||||
export default async function purchaseDomain(
|
export default async function purchaseDomain(
|
||||||
client: Client,
|
client: Client,
|
||||||
name: string,
|
name: string,
|
||||||
expectedPrice: number
|
expectedPrice: number,
|
||||||
|
renew: boolean = true
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
return await client.fetch<Response>(`/v3/domains/buy`, {
|
return await client.fetch<Response>(`/v3/domains/buy`, {
|
||||||
body: { name, expectedPrice },
|
body: { name, expectedPrice, renew },
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
57
packages/now-cli/src/util/env/add-env-record.ts
vendored
57
packages/now-cli/src/util/env/add-env-record.ts
vendored
@@ -1,60 +1,39 @@
|
|||||||
import { Output } from '../output';
|
import { Output } from '../output';
|
||||||
import Client from '../client';
|
import Client from '../client';
|
||||||
import { Secret, ProjectEnvTarget, ProjectEnvVariable } from '../../types';
|
import {
|
||||||
import { customAlphabet } from 'nanoid';
|
Secret,
|
||||||
import slugify from '@sindresorhus/slugify';
|
ProjectEnvTarget,
|
||||||
|
ProjectEnvVariableV5,
|
||||||
|
ProjectEnvType,
|
||||||
|
} from '../../types';
|
||||||
|
|
||||||
export default async function addEnvRecord(
|
export default async function addEnvRecord(
|
||||||
output: Output,
|
output: Output,
|
||||||
client: Client,
|
client: Client,
|
||||||
projectId: string,
|
projectId: string,
|
||||||
envName: string,
|
type: ProjectEnvType,
|
||||||
envValue: string | undefined,
|
key: string,
|
||||||
|
envValue: string,
|
||||||
targets: ProjectEnvTarget[]
|
targets: ProjectEnvTarget[]
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
output.debug(
|
output.debug(
|
||||||
`Adding Environment Variable ${envName} to ${targets.length} targets`
|
`Adding ${type} Environment Variable ${key} to ${targets.length} targets`
|
||||||
);
|
);
|
||||||
|
|
||||||
let values: string[] | undefined;
|
let value = envValue;
|
||||||
|
|
||||||
if (envValue) {
|
if (type === ProjectEnvType.Secret) {
|
||||||
const secrets = await Promise.all(
|
const secret = await client.fetch<Secret>(
|
||||||
targets.map(target =>
|
`/v2/now/secrets/${encodeURIComponent(envValue)}`
|
||||||
client.fetch<Secret>('/v2/now/secrets', {
|
|
||||||
method: 'POST',
|
|
||||||
body: JSON.stringify({
|
|
||||||
name: generateSecretName(envName, target),
|
|
||||||
value: envValue,
|
|
||||||
projectId: projectId,
|
|
||||||
decryptable: target === ProjectEnvTarget.Development,
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
values = secrets.map(secret => secret.uid);
|
value = secret.uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
const body = targets.map((target, i) => ({
|
const body = { type, key, value, target: targets };
|
||||||
key: envName,
|
|
||||||
value: values ? values[i] : '',
|
|
||||||
target,
|
|
||||||
}));
|
|
||||||
|
|
||||||
const urlProject = `/v4/projects/${projectId}/env`;
|
const urlProject = `/v6/projects/${projectId}/env`;
|
||||||
await client.fetch<ProjectEnvVariable>(urlProject, {
|
await client.fetch<ProjectEnvVariableV5>(urlProject, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify(body),
|
body: JSON.stringify(body),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const randomSecretSuffix = customAlphabet(
|
|
||||||
'123456789abcdefghijklmnopqrstuvwxyz',
|
|
||||||
4
|
|
||||||
);
|
|
||||||
|
|
||||||
function generateSecretName(envName: string, target: ProjectEnvTarget) {
|
|
||||||
return `${
|
|
||||||
slugify(envName).substring(0, 80) // we truncate because the max secret length is 100
|
|
||||||
}-${target}-${randomSecretSuffix()}`;
|
|
||||||
}
|
|
||||||
|
|||||||
15
packages/now-cli/src/util/env/env-type.ts
vendored
Normal file
15
packages/now-cli/src/util/env/env-type.ts
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { ProjectEnvType } from '../../types';
|
||||||
|
|
||||||
|
function envTypes(): string[] {
|
||||||
|
return Object.values(ProjectEnvType);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isValidEnvType(
|
||||||
|
type?: string
|
||||||
|
): type is ProjectEnvType | undefined {
|
||||||
|
return typeof type === 'undefined' || envTypes().includes(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getEnvTypePlaceholder() {
|
||||||
|
return `<${envTypes().join(' | ')}>`;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user