mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-11 21:07:47 +00:00
Compare commits
156 Commits
esbuild-py
...
@vercel/py
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7504bfbe26 | ||
|
|
7fa08088ea | ||
|
|
5d40da17ba | ||
|
|
de84743e10 | ||
|
|
39ce9166ba | ||
|
|
ce54ca631b | ||
|
|
d6ca05d975 | ||
|
|
f8c893bb15 | ||
|
|
5e6ef3d569 | ||
|
|
88715ad598 | ||
|
|
ed19b26603 | ||
|
|
9c4589ed28 | ||
|
|
da300030c9 | ||
|
|
90b14b689d | ||
|
|
e0ed2d1e76 | ||
|
|
e7516f8002 | ||
|
|
9e9fac0191 | ||
|
|
00f26b3571 | ||
|
|
68b4516722 | ||
|
|
7bf7591dd3 | ||
|
|
a012a1e749 | ||
|
|
6dbeb5c3ee | ||
|
|
853a570384 | ||
|
|
353a7ddfcd | ||
|
|
6fcbdb90c7 | ||
|
|
80a6960dc9 | ||
|
|
b52741b1bb | ||
|
|
1d4c86d0f8 | ||
|
|
913608de4d | ||
|
|
d595db6294 | ||
|
|
ae489687d2 | ||
|
|
6fc2872794 | ||
|
|
6697a0e846 | ||
|
|
ed9ef486a8 | ||
|
|
213ec69db3 | ||
|
|
7512bf64b1 | ||
|
|
00e12792d8 | ||
|
|
469d38aad8 | ||
|
|
0e84a6775d | ||
|
|
3029af5a2b | ||
|
|
4422eee5c4 | ||
|
|
222710f612 | ||
|
|
d8179032e2 | ||
|
|
f2d7f3f444 | ||
|
|
60929bb1af | ||
|
|
4ef0b19508 | ||
|
|
6041a3f6c8 | ||
|
|
5ee94e0dce | ||
|
|
9bc5bb4afc | ||
|
|
cf6152d16b | ||
|
|
0f5ec80cc6 | ||
|
|
c523a755f8 | ||
|
|
fa8e313222 | ||
|
|
0c1603f41b | ||
|
|
18b04b3589 | ||
|
|
58215906f9 | ||
|
|
1feb4d797e | ||
|
|
45ae16e371 | ||
|
|
ce7e82fa7a | ||
|
|
e9026c7a69 | ||
|
|
a18ed98f2d | ||
|
|
09f1bbfa41 | ||
|
|
13efc4f04f | ||
|
|
08c5a9b0fc | ||
|
|
5349fb9181 | ||
|
|
2f51171a17 | ||
|
|
63c010a7f4 | ||
|
|
7128a65ccd | ||
|
|
d402c4350a | ||
|
|
f88afba733 | ||
|
|
ea5bc88062 | ||
|
|
eb06bd262b | ||
|
|
cb37ff2c89 | ||
|
|
2f5b0aeeb1 | ||
|
|
ab01608785 | ||
|
|
905c7b6ad4 | ||
|
|
717dd82c51 | ||
|
|
a4996e1c5a | ||
|
|
c147ead1bc | ||
|
|
2ab5ce5d90 | ||
|
|
33e43e103a | ||
|
|
3dbc75580d | ||
|
|
f6e863d4bb | ||
|
|
9f63ca60ad | ||
|
|
873327e9bd | ||
|
|
e3f9faf513 | ||
|
|
1a5bd6c5b9 | ||
|
|
6d312d85b2 | ||
|
|
10d4e51ac5 | ||
|
|
57231a0d60 | ||
|
|
e0e9cffc8d | ||
|
|
d0d0520111 | ||
|
|
9bb3067de2 | ||
|
|
decdf27fb5 | ||
|
|
4b376a564a | ||
|
|
b7e93524e3 | ||
|
|
62283356b8 | ||
|
|
3305f5e832 | ||
|
|
a938706916 | ||
|
|
b8bc682d3e | ||
|
|
f5ca497b75 | ||
|
|
b0898a6659 | ||
|
|
ab329f0fe8 | ||
|
|
8b35333446 | ||
|
|
a92467719b | ||
|
|
f6f16b0347 | ||
|
|
92ad73b8f3 | ||
|
|
849eedf0f2 | ||
|
|
848a62e4a5 | ||
|
|
cb784aeb9c | ||
|
|
3035e18fb6 | ||
|
|
eb40c4c4a0 | ||
|
|
c90ee12b17 | ||
|
|
78be0200b4 | ||
|
|
1b6f3a0f65 | ||
|
|
eceb15ace9 | ||
|
|
fa3f701e05 | ||
|
|
9953fc765f | ||
|
|
29ea1af971 | ||
|
|
083aad448e | ||
|
|
314a105ba1 | ||
|
|
1abda9ca87 | ||
|
|
7a0fed970c | ||
|
|
2f461a8b0b | ||
|
|
ec894bdf7f | ||
|
|
009cea6d30 | ||
|
|
1bab21026e | ||
|
|
bcebab7517 | ||
|
|
45b73c7e86 | ||
|
|
a732d30c84 | ||
|
|
8504735808 | ||
|
|
9d64312aaa | ||
|
|
a8ad176262 | ||
|
|
0ee089a501 | ||
|
|
d8bc570f60 | ||
|
|
f15cba6148 | ||
|
|
989f0d8139 | ||
|
|
6784e77516 | ||
|
|
6baefc825a | ||
|
|
0a08e4b23e | ||
|
|
b265e13d40 | ||
|
|
50e04dd858 | ||
|
|
82231058da | ||
|
|
61227bf7e3 | ||
|
|
6aa0aa4e65 | ||
|
|
caaba0d685 | ||
|
|
335fd70a68 | ||
|
|
c3c54d6e69 | ||
|
|
43048a0dd8 | ||
|
|
60c75fd76c | ||
|
|
bd1319d7a3 | ||
|
|
1138f7e3d1 | ||
|
|
bb95cb9225 | ||
|
|
0048eb999e | ||
|
|
1b4de4a986 | ||
|
|
c9ad4084ee |
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"@vercel/build-utils": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
add descriptions to NodeVersion properties
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
---
|
|
||||||
---
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'vercel': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
Migrates the vc env command to the command data structure for use in the help output.
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'vercel': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
Update domains command to new structure
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"vercel": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
migrate `rollback` command structure for help output
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"vercel": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
migrate `inti` command structure for help output
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'vercel': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
Remove mri workaround
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"vercel": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
migrate dev command structure for help output
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"@vercel/next": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
fix 404 enoent for i18n
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'vercel': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
Migrate `vc secrets` to new help command structure
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"vercel": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
migrate `promote` command structure for help output
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"@vercel/node": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
remove console.log
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"examples": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
update examples to use at least node@16
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"vercel": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
migrate `git` command structure for help output
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
'vercel': patch
|
|
||||||
---
|
|
||||||
|
|
||||||
Update project command to new data structure
|
|
||||||
10
.github/CODEOWNERS
vendored
10
.github/CODEOWNERS
vendored
@@ -5,15 +5,13 @@
|
|||||||
* @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek
|
* @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek
|
||||||
/.github/workflows @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @ijjk
|
/.github/workflows @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @ijjk
|
||||||
/packages/fs-detectors @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @agadzik @chloetedder
|
/packages/fs-detectors @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @agadzik @chloetedder
|
||||||
/packages/next @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @ijjk
|
/packages/next @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @ijjk @ztanner
|
||||||
/packages/routing-utils @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @ijjk
|
/packages/routing-utils @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @ijjk
|
||||||
/packages/edge @vercel/compute
|
/packages/static-build @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek
|
||||||
|
/packages/edge @vercel/compute @TooTallNate @EndangeredMassa @cb1kenobi @Ethan-Arrowood @trek
|
||||||
/examples @leerob
|
/examples @leerob
|
||||||
/examples/create-react-app @Timer
|
/examples/create-react-app @Timer
|
||||||
/examples/nextjs @timneutkens @ijjk @styfle
|
/examples/nextjs @timneutkens @ijjk @styfle @ztanner @huozhi
|
||||||
/examples/hugo @styfle
|
|
||||||
/examples/jekyll @styfle
|
|
||||||
/examples/zola @styfle
|
|
||||||
/packages/node @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @Kikobeats
|
/packages/node @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @trek @Kikobeats
|
||||||
|
|
||||||
# Unrestricted Paths
|
# Unrestricted Paths
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 14
|
node-version: 16
|
||||||
- name: Enable corepack
|
- name: Enable corepack
|
||||||
run: corepack enable pnpm
|
run: corepack enable pnpm
|
||||||
- name: Update Gatsby Fixtures
|
- name: Update Gatsby Fixtures
|
||||||
|
|||||||
2
.github/workflows/test-lint.yml
vendored
2
.github/workflows/test-lint.yml
vendored
@@ -49,3 +49,5 @@ jobs:
|
|||||||
- run: pnpm install
|
- run: pnpm install
|
||||||
- run: pnpm run lint
|
- run: pnpm run lint
|
||||||
- run: pnpm run prettier-check
|
- run: pnpm run prettier-check
|
||||||
|
- run: pnpm run build
|
||||||
|
- run: pnpm run type-check
|
||||||
|
|||||||
16
.github/workflows/test.yml
vendored
16
.github/workflows/test.yml
vendored
@@ -64,7 +64,7 @@ jobs:
|
|||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ matrix.nodeVersion || env.NODE_VERSION }}
|
||||||
|
|
||||||
- name: Install Hugo
|
- name: Install Hugo
|
||||||
if: matrix.runner == 'macos-latest'
|
if: matrix.runner == 'macos-latest'
|
||||||
@@ -83,7 +83,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
FORCE_COLOR: '1'
|
FORCE_COLOR: '1'
|
||||||
- name: Test ${{matrix.packageName}}
|
- name: Test ${{matrix.packageName}}
|
||||||
run: node utils/gen.js && node_modules/.bin/turbo run test --cache-dir=".turbo" --log-order=stream --scope=${{matrix.packageName}} --no-deps -- ${{ join(matrix.testPaths, ' ') }}
|
run: node utils/gen.js && node_modules/.bin/turbo run test --summarize --cache-dir=".turbo" --log-order=stream --scope=${{matrix.packageName}} --no-deps -- ${{ join(matrix.testPaths, ' ') }}
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
JEST_JUNIT_OUTPUT_FILE: ${{github.workspace}}/.junit-reports/${{matrix.scriptName}}-${{matrix.packageName}}-${{matrix.chunkNumber}}-${{ matrix.runner }}.xml
|
JEST_JUNIT_OUTPUT_FILE: ${{github.workspace}}/.junit-reports/${{matrix.scriptName}}-${{matrix.packageName}}-${{matrix.chunkNumber}}-${{ matrix.runner }}.xml
|
||||||
@@ -91,13 +91,19 @@ jobs:
|
|||||||
VERCEL_TEST_TOKEN: ${{ secrets.VERCEL_TEST_TOKEN }}
|
VERCEL_TEST_TOKEN: ${{ secrets.VERCEL_TEST_TOKEN }}
|
||||||
VERCEL_TEST_REGISTRATION_URL: ${{ secrets.VERCEL_TEST_REGISTRATION_URL }}
|
VERCEL_TEST_REGISTRATION_URL: ${{ secrets.VERCEL_TEST_REGISTRATION_URL }}
|
||||||
FORCE_COLOR: '1'
|
FORCE_COLOR: '1'
|
||||||
|
- name: 'Determine Turbo HIT or MISS'
|
||||||
|
if: ${{ !cancelled() }}
|
||||||
|
id: turbo-summary
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
TURBO_MISS_COUNT=`node utils/determine-turbo-hit-or-miss.js`
|
||||||
|
echo "MISS COUNT: $TURBO_MISS_COUNT"
|
||||||
|
echo "misses=$TURBO_MISS_COUNT" >> $GITHUB_OUTPUT
|
||||||
- name: fetch ssl certificate after tests (linux, os x)
|
- name: fetch ssl certificate after tests (linux, os x)
|
||||||
if: matrix.runner != 'windows-latest'
|
if: matrix.runner != 'windows-latest'
|
||||||
run: echo | openssl s_client -showcerts -servername 'api.vercel.com' -connect 76.76.21.21:443
|
run: echo | openssl s_client -showcerts -servername 'api.vercel.com' -connect 76.76.21.21:443
|
||||||
|
|
||||||
- name: 'Upload Test Report to Datadog'
|
- name: 'Upload Test Report to Datadog'
|
||||||
if: always()
|
if: ${{ steps['turbo-summary'].outputs.misses != '0' && !cancelled() }}
|
||||||
run: 'npx @datadog/datadog-ci@2.18.1 junit upload --service vercel-cli .junit-reports'
|
run: 'npx @datadog/datadog-ci@2.18.1 junit upload --service vercel-cli .junit-reports'
|
||||||
env:
|
env:
|
||||||
DATADOG_API_KEY: ${{secrets.DATADOG_API_KEY_CLI}}
|
DATADOG_API_KEY: ${{secrets.DATADOG_API_KEY_CLI}}
|
||||||
|
|||||||
2
.github/workflows/update-remix-run-dev.yml
vendored
2
.github/workflows/update-remix-run-dev.yml
vendored
@@ -17,6 +17,8 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup node
|
- name: Setup node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
- name: Enable corepack
|
- name: Enable corepack
|
||||||
run: corepack enable pnpm
|
run: corepack enable pnpm
|
||||||
- name: Update @remix-run/dev
|
- name: Update @remix-run/dev
|
||||||
|
|||||||
7
examples/CHANGELOG.md
vendored
Normal file
7
examples/CHANGELOG.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# examples
|
||||||
|
|
||||||
|
## null
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- update examples to use at least node@16 ([#10395](https://github.com/vercel/vercel/pull/10395))
|
||||||
@@ -3,9 +3,10 @@
|
|||||||
This directory is a brief example of an [Astro](https://astro.build/) site that can be deployed to Vercel with zero configuration. This demo showcases:
|
This directory is a brief example of an [Astro](https://astro.build/) site that can be deployed to Vercel with zero configuration. This demo showcases:
|
||||||
|
|
||||||
- `/` - A static page (pre-rendered)
|
- `/` - A static page (pre-rendered)
|
||||||
- `/ssr` - A page that uses server-side rendering (through Vercel Edge Functions)
|
- `/ssr` - A page that uses server-side rendering (through [Vercel Edge Functions](https://vercel.com/docs/functions/edge-functions))
|
||||||
- `/ssr-with-swr-caching` - Similar to the previous page, but also caches the response on the Vercel Edge Network using `cache-control` headers
|
- `/ssr-with-swr-caching` - Similar to the previous page, but also caches the response on the [Vercel Edge Network](https://vercel.com/docs/edge-network/overview) using `cache-control` headers
|
||||||
- `/edge.json` - An Astro API Endpoint that returns JSON data using Vercel Edge Functions
|
- `/image` - Astro [Asset](https://docs.astro.build/en/guides/assets/) using Vercel [Image Optimization](https://vercel.com/docs/image-optimization)
|
||||||
|
- `/edge.json` - An Astro API Endpoint that returns JSON data using [Vercel Edge Functions](https://vercel.com/docs/functions/edge-functions)
|
||||||
|
|
||||||
Learn more about [Astro on Vercel](https://vercel.com/docs/frameworks/astro).
|
Learn more about [Astro on Vercel](https://vercel.com/docs/frameworks/astro).
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,17 @@
|
|||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
|
// Use Vercel Edge Functions (Recommended)
|
||||||
import vercel from '@astrojs/vercel/edge';
|
import vercel from '@astrojs/vercel/edge';
|
||||||
|
// Can also use Serverless Functions
|
||||||
|
// import vercel from '@astrojs/vercel/serverless';
|
||||||
|
// Or a completely static build
|
||||||
|
// import vercel from '@astrojs/vercel/static';
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
output: 'server',
|
output: 'server',
|
||||||
adapter: vercel(),
|
experimental: {
|
||||||
|
assets: true
|
||||||
|
},
|
||||||
|
adapter: vercel({
|
||||||
|
imageService: true,
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
"astro": "astro"
|
"astro": "astro"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/vercel": "3.2.2",
|
"@astrojs/vercel": "3.8.2",
|
||||||
"astro": "^2.2.1",
|
"astro": "^2.10.14",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"web-vitals": "^3.3.1"
|
"web-vitals": "^3.3.1"
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
examples/astro/src/assets/logo.png
Normal file
BIN
examples/astro/src/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
2
examples/astro/src/env.d.ts
vendored
2
examples/astro/src/env.d.ts
vendored
@@ -1,4 +1,4 @@
|
|||||||
/// <reference types="astro/client" />
|
/// <reference types="astro/client-image" />
|
||||||
|
|
||||||
interface ImportMetaEnv {
|
interface ImportMetaEnv {
|
||||||
readonly PUBLIC_VERCEL_ANALYTICS_ID: string;
|
readonly PUBLIC_VERCEL_ANALYTICS_ID: string;
|
||||||
|
|||||||
6
examples/astro/src/pages/image.astro
Normal file
6
examples/astro/src/pages/image.astro
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
import { Image } from 'astro:assets';
|
||||||
|
import astroLogo from '../assets/logo.png';
|
||||||
|
---
|
||||||
|
|
||||||
|
<Image src={astroLogo} alt="Astro Logo" width={50} quality={75} />
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<!-- Replace the API key with your own, see:
|
<!-- Replace the API key with your own, see:
|
||||||
https://developers.google.com/maps/documentation/javascript/get-api-key -->
|
https://developers.google.com/maps/documentation/javascript/get-api-key -->
|
||||||
<!-- <script async="" defer="" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB8pf6ZdFQj5qw7rc_HSGrhUwQKfIe9ICw"></script> -->
|
<!-- <script async="" defer="" src="https://maps.googleapis.com/maps/api/js?key=<YOUR_GOOGLE_MAPS_API_KEY>"></script> -->
|
||||||
|
|
||||||
<noscript>Please enable JavaScript to continue using this application.</noscript>
|
<noscript>Please enable JavaScript to continue using this application.</noscript>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ npm run dev
|
|||||||
yarn dev
|
yarn dev
|
||||||
# or
|
# or
|
||||||
pnpm dev
|
pnpm dev
|
||||||
|
# or
|
||||||
|
bun dev
|
||||||
```
|
```
|
||||||
|
|
||||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import './globals.css'
|
|
||||||
import type { Metadata } from 'next'
|
import type { Metadata } from 'next'
|
||||||
import { Inter } from 'next/font/google'
|
import { Inter } from 'next/font/google'
|
||||||
|
import './globals.css'
|
||||||
|
|
||||||
const inter = Inter({ subsets: ['latin'] })
|
const inter = Inter({ subsets: ['latin'] })
|
||||||
|
|
||||||
|
|||||||
1161
examples/nextjs/package-lock.json
generated
1161
examples/nextjs/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,17 +9,19 @@
|
|||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": "20.5.1",
|
"react": "^18",
|
||||||
"@types/react": "18.2.20",
|
"react-dom": "^18",
|
||||||
"@types/react-dom": "18.2.7",
|
"next": "13.5.6"
|
||||||
"autoprefixer": "10.4.15",
|
},
|
||||||
"eslint": "8.47.0",
|
"devDependencies": {
|
||||||
"eslint-config-next": "13.4.19",
|
"typescript": "^5",
|
||||||
"next": "13.4.19",
|
"@types/node": "^20",
|
||||||
"postcss": "8.4.28",
|
"@types/react": "^18",
|
||||||
"react": "18.2.0",
|
"@types/react-dom": "^18",
|
||||||
"react-dom": "18.2.0",
|
"autoprefixer": "^10",
|
||||||
"tailwindcss": "3.3.3",
|
"postcss": "^8",
|
||||||
"typescript": "5.1.6"
|
"tailwindcss": "^3",
|
||||||
|
"eslint": "^8",
|
||||||
|
"eslint-config-next": "13.5.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
examples/package.json
vendored
5
examples/package.json
vendored
@@ -9,6 +9,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "27.4.1",
|
"@types/jest": "27.4.1",
|
||||||
"@vercel/frameworks": "2.0.1"
|
"@vercel/frameworks": "2.0.2"
|
||||||
}
|
},
|
||||||
|
"version": null
|
||||||
}
|
}
|
||||||
|
|||||||
5
examples/remix/.gitignore
vendored
5
examples/remix/.gitignore
vendored
@@ -4,9 +4,4 @@ node_modules
|
|||||||
/build
|
/build
|
||||||
/public/build
|
/public/build
|
||||||
.env
|
.env
|
||||||
|
|
||||||
.vercel
|
.vercel
|
||||||
.output
|
|
||||||
|
|
||||||
/api/index.js
|
|
||||||
/api/index.js.map
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default function App() {
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charSet="utf-8" />
|
<meta charSet="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<Meta />
|
<Meta />
|
||||||
<Links />
|
<Links />
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
import type { V2_MetaFunction } from "@vercel/remix";
|
import type { MetaFunction } from "@vercel/remix";
|
||||||
|
|
||||||
export const meta: V2_MetaFunction = () => [{ title: "New Remix App" }];
|
export const meta: MetaFunction = () => {
|
||||||
|
return [
|
||||||
|
{ title: "New Remix App" },
|
||||||
|
{ name: "description", content: "Welcome to Remix!" },
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
export default function Index() {
|
export default function Index() {
|
||||||
return (
|
return (
|
||||||
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.4" }}>
|
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.8" }}>
|
||||||
<h1>Welcome to Remix</h1>
|
<h1>Welcome to Remix</h1>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import type { V2_MetaFunction } from "@vercel/remix";
|
import type { MetaFunction } from "@vercel/remix";
|
||||||
|
|
||||||
export const config = { runtime: "edge" };
|
export const config = { runtime: "edge" };
|
||||||
|
|
||||||
export const meta: V2_MetaFunction = () => [{ title: "Remix@Edge | New Remix App" }];
|
export const meta: MetaFunction = () => [{ title: "Remix@Edge | New Remix App" }];
|
||||||
|
|
||||||
export default function Edge() {
|
export default function Edge() {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,32 +1,34 @@
|
|||||||
{
|
{
|
||||||
|
"name": "my-remix-app",
|
||||||
"private": true,
|
"private": true,
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "remix build",
|
"build": "remix build",
|
||||||
"dev": "remix dev",
|
"dev": "remix dev --manual",
|
||||||
"start": "remix-serve build",
|
"start": "remix-serve ./build/index.js",
|
||||||
"typecheck": "tsc"
|
"typecheck": "tsc"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@remix-run/css-bundle": "^1.18.0",
|
"@remix-run/css-bundle": "^2.0.0",
|
||||||
"@remix-run/node": "^1.18.0",
|
"@remix-run/node": "^2.0.0",
|
||||||
"@remix-run/react": "^1.18.0",
|
"@remix-run/react": "^2.0.0",
|
||||||
"@remix-run/serve": "^1.18.0",
|
"@remix-run/serve": "^2.0.0",
|
||||||
"@vercel/analytics": "^0.1.11",
|
"@vercel/analytics": "^1.0.2",
|
||||||
"@vercel/remix": "^1.18.0",
|
"@vercel/remix": "^2.0.0",
|
||||||
"isbot": "^3.6.8",
|
"isbot": "^3.6.8",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0"
|
"react-dom": "^18.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@remix-run/dev": "^1.18.0",
|
"@remix-run/dev": "^2.0.0",
|
||||||
"@remix-run/eslint-config": "^1.18.0",
|
"@remix-run/eslint-config": "^2.0.0",
|
||||||
"@types/react": "^18.0.25",
|
"@types/react": "^18.2.20",
|
||||||
"@types/react-dom": "^18.0.11",
|
"@types/react-dom": "^18.2.7",
|
||||||
"eslint": "^8.28.0",
|
"eslint": "^8.38.0",
|
||||||
"typescript": "^5.1.3"
|
"typescript": "^5.1.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16"
|
"node": ">=18.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
/** @type {import('@remix-run/dev').AppConfig} */
|
/** @type {import('@remix-run/dev').AppConfig} */
|
||||||
module.exports = {
|
export default {
|
||||||
future: {
|
|
||||||
v2_dev: true,
|
|
||||||
v2_errorBoundary: true,
|
|
||||||
v2_headers: true,
|
|
||||||
v2_meta: true,
|
|
||||||
v2_normalizeFormMethod: true,
|
|
||||||
v2_routeConvention: true,
|
|
||||||
},
|
|
||||||
ignoredRouteFiles: ["**/.*"],
|
ignoredRouteFiles: ["**/.*"],
|
||||||
serverModuleFormat: "cjs",
|
|
||||||
// appDirectory: "app",
|
// appDirectory: "app",
|
||||||
// assetsBuildDirectory: "public/build",
|
// assetsBuildDirectory: "public/build",
|
||||||
// serverBuildPath: "build/index.js",
|
|
||||||
// publicPath: "/build/",
|
// publicPath: "/build/",
|
||||||
|
// serverBuildPath: "build/index.js",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"],
|
"include": ["remix.env.d.ts", "**/*.ts", "**/*.tsx"],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"lib": ["DOM", "DOM.Iterable", "ES2019"],
|
"lib": ["DOM", "DOM.Iterable", "ES2022"],
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"jsx": "react-jsx",
|
"jsx": "react-jsx",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "Bundler",
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"target": "ES2019",
|
"target": "ES2022",
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
"dist"
|
"dist"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc",
|
"build": "node ../../utils/build.mjs",
|
||||||
"test": "jest --reporters=default --reporters=jest-junit --env node --verbose --runInBand --bail",
|
"test": "jest --reporters=default --reporters=jest-junit --env node --verbose --runInBand --bail",
|
||||||
"test-unit": "pnpm test tests/unit"
|
"test-unit": "pnpm test tests/unit"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
{
|
{
|
||||||
"extends": "@vercel-internals/tsconfig",
|
"extends": "@vercel-internals/tsconfig",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "dist"
|
"outDir": "dist",
|
||||||
|
"declaration": true,
|
||||||
|
"emitDeclarationOnly": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"]
|
"include": ["src/**/*"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,40 @@
|
|||||||
# @vercel-internals/types
|
# @vercel-internals/types
|
||||||
|
|
||||||
|
## 1.0.13
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`9e9fac019`](https://github.com/vercel/vercel/commit/9e9fac0191cb1428ac9e5479c3d5c8afd7b7d357)]:
|
||||||
|
- @vercel/routing-utils@3.1.0
|
||||||
|
|
||||||
|
## 1.0.12
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`2f5b0aeeb`](https://github.com/vercel/vercel/commit/2f5b0aeeb183ed3ea8cbc68cb3bc3c949c486ada)]:
|
||||||
|
- @vercel/build-utils@7.2.2
|
||||||
|
|
||||||
|
## 1.0.11
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`decdf27fb`](https://github.com/vercel/vercel/commit/decdf27fb5ca914fe50a9320c4fd50ef79d2fbb3)]:
|
||||||
|
- @vercel/build-utils@7.2.1
|
||||||
|
|
||||||
|
## 1.0.10
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`50e04dd85`](https://github.com/vercel/vercel/commit/50e04dd8584664c842a86c15d92d654f4ea8dcbb), [`45b73c7e8`](https://github.com/vercel/vercel/commit/45b73c7e86458564dc0bab007f6f6365c4c4ab5d), [`d8bc570f6`](https://github.com/vercel/vercel/commit/d8bc570f604950d97156d4f33c8accecf3b3b28f)]:
|
||||||
|
- @vercel/build-utils@7.2.0
|
||||||
|
|
||||||
|
## 1.0.9
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`5609a1187`](https://github.com/vercel/vercel/commit/5609a1187be9d6cf8d5f16825690c5ea72f17dc5), [`1b4de4a98`](https://github.com/vercel/vercel/commit/1b4de4a986f7a612aac834ebae3ec7bb9e9b8cf8)]:
|
||||||
|
- @vercel/build-utils@7.1.1
|
||||||
|
|
||||||
## 1.0.8
|
## 1.0.8
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
2
internals/types/index.d.ts
vendored
2
internals/types/index.d.ts
vendored
@@ -65,6 +65,8 @@ export type User = {
|
|||||||
billing: Billing;
|
billing: Billing;
|
||||||
name?: string;
|
name?: string;
|
||||||
limited?: boolean;
|
limited?: boolean;
|
||||||
|
version?: 'northstar';
|
||||||
|
defaultTeamId?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface Team {
|
export interface Team {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "@vercel-internals/types",
|
"name": "@vercel-internals/types",
|
||||||
"version": "1.0.8",
|
"version": "1.0.13",
|
||||||
"types": "index.d.ts",
|
"types": "index.d.ts",
|
||||||
"main": "index.d.ts",
|
"main": "index.d.ts",
|
||||||
"files": [
|
"files": [
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": "14.14.31",
|
"@types/node": "14.14.31",
|
||||||
"@vercel-internals/constants": "1.0.4",
|
"@vercel-internals/constants": "1.0.4",
|
||||||
"@vercel/build-utils": "7.1.0",
|
"@vercel/build-utils": "7.2.2",
|
||||||
"@vercel/routing-utils": "3.0.0"
|
"@vercel/routing-utils": "3.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vercel-internals/tsconfig": "1.0.0",
|
"@vercel-internals/tsconfig": "1.0.0",
|
||||||
|
|||||||
@@ -11,11 +11,12 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "5.21.0",
|
"@typescript-eslint/eslint-plugin": "5.21.0",
|
||||||
"@typescript-eslint/parser": "5.21.0",
|
"@typescript-eslint/parser": "5.21.0",
|
||||||
"@vercel/build-utils": "*",
|
"@vercel/build-utils": "*",
|
||||||
"@vercel/ncc": "0.24.0",
|
"@vercel/style-guide": "4.0.2",
|
||||||
"async-retry": "1.2.3",
|
"async-retry": "1.2.3",
|
||||||
"buffer-replace": "1.0.0",
|
"buffer-replace": "1.0.0",
|
||||||
"create-svelte": "2.0.1",
|
"create-svelte": "2.0.1",
|
||||||
"dot": "1.1.3",
|
"dot": "1.1.3",
|
||||||
|
"esbuild": "0.19.2",
|
||||||
"eslint": "8.14.0",
|
"eslint": "8.14.0",
|
||||||
"eslint-config-prettier": "8.5.0",
|
"eslint-config-prettier": "8.5.0",
|
||||||
"eslint-plugin-jest": "26.1.5",
|
"eslint-plugin-jest": "26.1.5",
|
||||||
@@ -32,7 +33,7 @@
|
|||||||
"source-map-support": "0.5.12",
|
"source-map-support": "0.5.12",
|
||||||
"ts-eager": "2.0.2",
|
"ts-eager": "2.0.2",
|
||||||
"ts-jest": "29.1.0",
|
"ts-jest": "29.1.0",
|
||||||
"turbo": "1.10.13",
|
"turbo": "1.10.15",
|
||||||
"typescript": "4.9.5"
|
"typescript": "4.9.5"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -49,7 +50,8 @@
|
|||||||
"prepare": "husky install",
|
"prepare": "husky install",
|
||||||
"pack": "cd utils && node -r ts-eager/register ./pack.ts",
|
"pack": "cd utils && node -r ts-eager/register ./pack.ts",
|
||||||
"ci:version": "changeset version && pnpm install --no-frozen-lockfile",
|
"ci:version": "changeset version && pnpm install --no-frozen-lockfile",
|
||||||
"ci:publish": "pnpm publish -r && node utils/update-canary-tags.mjs && changeset tag"
|
"ci:publish": "pnpm publish -r && node utils/update-canary-tags.mjs && changeset tag",
|
||||||
|
"type-check": "turbo type-check --concurrency=12 --output-logs=errors-only --summarize --continue"
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"./{*,{api,packages,test,utils}/**/*}.{js,ts}": [
|
"./{*,{api,packages,test,utils}/**/*}.{js,ts}": [
|
||||||
|
|||||||
@@ -1,5 +1,37 @@
|
|||||||
# @vercel/build-utils
|
# @vercel/build-utils
|
||||||
|
|
||||||
|
## 7.2.2
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- [cli] Update bun detection and add tests for projects with both bunlock binary and yarn.lock text files ([#10583](https://github.com/vercel/vercel/pull/10583))
|
||||||
|
|
||||||
|
## 7.2.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Internal variants ([#10549](https://github.com/vercel/vercel/pull/10549))
|
||||||
|
|
||||||
|
## 7.2.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- Add new optional prerender field: experimentalStreamingLambdaPath ([#10476](https://github.com/vercel/vercel/pull/10476))
|
||||||
|
|
||||||
|
- [build-utils] Add zero config detection for bun package manager ([#10486](https://github.com/vercel/vercel/pull/10486))
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- add `experimentalBypassFor` field to Prerender ([#10481](https://github.com/vercel/vercel/pull/10481))
|
||||||
|
|
||||||
|
## 7.1.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- add descriptions to NodeVersion properties ([#10403](https://github.com/vercel/vercel/pull/10403))
|
||||||
|
|
||||||
|
- Updated semver dependency ([#10411](https://github.com/vercel/vercel/pull/10411))
|
||||||
|
|
||||||
## 7.1.0
|
## 7.1.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
const fs = require('fs-extra');
|
|
||||||
const execa = require('execa');
|
|
||||||
const { join } = require('path');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const outDir = join(__dirname, 'dist');
|
|
||||||
|
|
||||||
// Start fresh
|
|
||||||
await fs.remove(outDir);
|
|
||||||
|
|
||||||
// Compile TypeScript
|
|
||||||
await execa('tsc', [], { stdio: 'inherit' });
|
|
||||||
|
|
||||||
// Run `ncc`
|
|
||||||
const mainDir = join(outDir, 'main');
|
|
||||||
await execa('ncc', ['build', 'src/index.ts', '-o', mainDir], {
|
|
||||||
stdio: 'inherit',
|
|
||||||
});
|
|
||||||
// Move compiled ncc file to out dir
|
|
||||||
await fs.rename(join(mainDir, 'index.js'), join(outDir, 'index.js'));
|
|
||||||
|
|
||||||
// Delete leftover "main" dir
|
|
||||||
await fs.remove(mainDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
main().catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
3
packages/build-utils/build.mjs
Normal file
3
packages/build-utils/build.mjs
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import { tsc, esbuild } from '../../utils/build.mjs';
|
||||||
|
|
||||||
|
await Promise.all([tsc(), esbuild().then(() => esbuild({ bundle: true }))]);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vercel/build-utils",
|
"name": "@vercel/build-utils",
|
||||||
"version": "7.1.0",
|
"version": "7.2.2",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.js",
|
"types": "./dist/index.d.js",
|
||||||
@@ -11,10 +11,11 @@
|
|||||||
"directory": "packages/now-build-utils"
|
"directory": "packages/now-build-utils"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node build",
|
"build": "node build.mjs",
|
||||||
"test": "jest --reporters=default --reporters=jest-junit --env node --verbose --runInBand --bail",
|
"test": "jest --reporters=default --reporters=jest-junit --env node --verbose --runInBand --bail",
|
||||||
"test-unit": "pnpm test test/unit.*test.*",
|
"test-unit": "pnpm test test/unit.*test.*",
|
||||||
"test-e2e": "pnpm test test/integration.test.ts"
|
"test-e2e": "pnpm test test/integration.test.ts",
|
||||||
|
"type-check": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@iarna/toml": "2.2.3",
|
"@iarna/toml": "2.2.3",
|
||||||
@@ -33,7 +34,6 @@
|
|||||||
"@types/semver": "6.0.0",
|
"@types/semver": "6.0.0",
|
||||||
"@types/yazl": "2.4.2",
|
"@types/yazl": "2.4.2",
|
||||||
"@vercel/error-utils": "2.0.1",
|
"@vercel/error-utils": "2.0.1",
|
||||||
"@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",
|
||||||
"async-sema": "2.1.4",
|
"async-sema": "2.1.4",
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
"minimatch": "3.1.2",
|
"minimatch": "3.1.2",
|
||||||
"multistream": "2.1.1",
|
"multistream": "2.1.1",
|
||||||
"node-fetch": "2.6.7",
|
"node-fetch": "2.6.7",
|
||||||
"semver": "6.1.1",
|
"semver": "6.3.1",
|
||||||
"typescript": "4.9.5",
|
"typescript": "4.9.5",
|
||||||
"yazl": "2.5.1"
|
"yazl": "2.5.1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import { cloneEnv } from '../clone-env';
|
|||||||
// Only allow one `runNpmInstall()` invocation to run concurrently
|
// Only allow one `runNpmInstall()` invocation to run concurrently
|
||||||
const runNpmInstallSema = new Sema(1);
|
const runNpmInstallSema = new Sema(1);
|
||||||
|
|
||||||
export type CliType = 'yarn' | 'npm' | 'pnpm';
|
export type CliType = 'yarn' | 'npm' | 'pnpm' | 'bun';
|
||||||
|
|
||||||
export interface ScanParentDirsResult {
|
export interface ScanParentDirsResult {
|
||||||
/**
|
/**
|
||||||
@@ -284,27 +284,40 @@ export async function scanParentDirs(
|
|||||||
readPackageJson && pkgJsonPath
|
readPackageJson && pkgJsonPath
|
||||||
? JSON.parse(await fs.readFile(pkgJsonPath, 'utf8'))
|
? JSON.parse(await fs.readFile(pkgJsonPath, 'utf8'))
|
||||||
: undefined;
|
: undefined;
|
||||||
const [yarnLockPath, npmLockPath, pnpmLockPath] = await walkParentDirsMulti({
|
const [yarnLockPath, npmLockPath, pnpmLockPath, bunLockPath] =
|
||||||
base: '/',
|
await walkParentDirsMulti({
|
||||||
start: destPath,
|
base: '/',
|
||||||
filenames: ['yarn.lock', 'package-lock.json', 'pnpm-lock.yaml'],
|
start: destPath,
|
||||||
});
|
filenames: [
|
||||||
|
'yarn.lock',
|
||||||
|
'package-lock.json',
|
||||||
|
'pnpm-lock.yaml',
|
||||||
|
'bun.lockb',
|
||||||
|
],
|
||||||
|
});
|
||||||
let lockfilePath: string | undefined;
|
let lockfilePath: string | undefined;
|
||||||
let lockfileVersion: number | undefined;
|
let lockfileVersion: number | undefined;
|
||||||
let cliType: CliType = 'yarn';
|
let cliType: CliType = 'yarn';
|
||||||
|
|
||||||
const [hasYarnLock, packageLockJson, pnpmLockYaml] = await Promise.all([
|
const [hasYarnLock, packageLockJson, pnpmLockYaml, bunLockBin] =
|
||||||
Boolean(yarnLockPath),
|
await Promise.all([
|
||||||
npmLockPath
|
Boolean(yarnLockPath),
|
||||||
? readConfigFile<{ lockfileVersion: number }>(npmLockPath)
|
npmLockPath
|
||||||
: null,
|
? readConfigFile<{ lockfileVersion: number }>(npmLockPath)
|
||||||
pnpmLockPath
|
: null,
|
||||||
? readConfigFile<{ lockfileVersion: number }>(pnpmLockPath)
|
pnpmLockPath
|
||||||
: null,
|
? readConfigFile<{ lockfileVersion: number }>(pnpmLockPath)
|
||||||
]);
|
: null,
|
||||||
|
bunLockPath ? fs.readFile(bunLockPath, 'utf8') : null,
|
||||||
|
]);
|
||||||
|
|
||||||
// Priority order is Yarn > pnpm > npm
|
// Priority order is bun with yarn lock > yarn > pnpm > npm > bun
|
||||||
if (hasYarnLock) {
|
if (bunLockBin && hasYarnLock) {
|
||||||
|
cliType = 'bun';
|
||||||
|
lockfilePath = bunLockPath;
|
||||||
|
// TODO: read "bun-lockfile-format-v0"
|
||||||
|
lockfileVersion = 0;
|
||||||
|
} else if (hasYarnLock) {
|
||||||
cliType = 'yarn';
|
cliType = 'yarn';
|
||||||
lockfilePath = yarnLockPath;
|
lockfilePath = yarnLockPath;
|
||||||
} else if (pnpmLockYaml) {
|
} else if (pnpmLockYaml) {
|
||||||
@@ -315,6 +328,11 @@ export async function scanParentDirs(
|
|||||||
cliType = 'npm';
|
cliType = 'npm';
|
||||||
lockfilePath = npmLockPath;
|
lockfilePath = npmLockPath;
|
||||||
lockfileVersion = packageLockJson.lockfileVersion;
|
lockfileVersion = packageLockJson.lockfileVersion;
|
||||||
|
} else if (bunLockBin) {
|
||||||
|
cliType = 'bun';
|
||||||
|
lockfilePath = bunLockPath;
|
||||||
|
// TODO: read "bun-lockfile-format-v0"
|
||||||
|
lockfileVersion = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const packageJsonPath = pkgJsonPath || undefined;
|
const packageJsonPath = pkgJsonPath || undefined;
|
||||||
@@ -451,6 +469,10 @@ export async function runNpmInstall(
|
|||||||
commandArgs = args
|
commandArgs = args
|
||||||
.filter(a => a !== '--prefer-offline')
|
.filter(a => a !== '--prefer-offline')
|
||||||
.concat(['install', '--unsafe-perm']);
|
.concat(['install', '--unsafe-perm']);
|
||||||
|
} else if (cliType === 'bun') {
|
||||||
|
// @see options https://bun.sh/docs/cli/install
|
||||||
|
opts.prettyCommand = 'bun install';
|
||||||
|
commandArgs = ['install', ...args];
|
||||||
} else {
|
} else {
|
||||||
opts.prettyCommand = 'yarn install';
|
opts.prettyCommand = 'yarn install';
|
||||||
commandArgs = ['install', ...args];
|
commandArgs = ['install', ...args];
|
||||||
@@ -505,6 +527,7 @@ export function getEnvForPackageManager({
|
|||||||
const npm7 = '/node16/bin-npm7';
|
const npm7 = '/node16/bin-npm7';
|
||||||
const pnpm7 = '/pnpm7/node_modules/.bin';
|
const pnpm7 = '/pnpm7/node_modules/.bin';
|
||||||
const pnpm8 = '/pnpm8/node_modules/.bin';
|
const pnpm8 = '/pnpm8/node_modules/.bin';
|
||||||
|
const bun1 = '/bun1';
|
||||||
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
|
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
|
||||||
if (cliType === 'npm') {
|
if (cliType === 'npm') {
|
||||||
if (
|
if (
|
||||||
@@ -516,7 +539,7 @@ export function getEnvForPackageManager({
|
|||||||
) {
|
) {
|
||||||
// Ensure that npm 7 is at the beginning of the `$PATH`
|
// Ensure that npm 7 is at the beginning of the `$PATH`
|
||||||
newEnv.PATH = `${npm7}${path.delimiter}${oldPath}`;
|
newEnv.PATH = `${npm7}${path.delimiter}${oldPath}`;
|
||||||
console.log('Detected `package-lock.json` generated by npm 7+...');
|
console.log('Detected `package-lock.json` generated by npm 7+');
|
||||||
}
|
}
|
||||||
} else if (cliType === 'pnpm') {
|
} else if (cliType === 'pnpm') {
|
||||||
if (
|
if (
|
||||||
@@ -528,7 +551,7 @@ export function getEnvForPackageManager({
|
|||||||
// Ensure that pnpm 7 is at the beginning of the `$PATH`
|
// Ensure that pnpm 7 is at the beginning of the `$PATH`
|
||||||
newEnv.PATH = `${pnpm7}${path.delimiter}${oldPath}`;
|
newEnv.PATH = `${pnpm7}${path.delimiter}${oldPath}`;
|
||||||
console.log(
|
console.log(
|
||||||
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 7...`
|
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 7`
|
||||||
);
|
);
|
||||||
} else if (
|
} else if (
|
||||||
typeof lockfileVersion === 'number' &&
|
typeof lockfileVersion === 'number' &&
|
||||||
@@ -539,7 +562,16 @@ export function getEnvForPackageManager({
|
|||||||
// Ensure that pnpm 8 is at the beginning of the `$PATH`
|
// Ensure that pnpm 8 is at the beginning of the `$PATH`
|
||||||
newEnv.PATH = `${pnpm8}${path.delimiter}${oldPath}`;
|
newEnv.PATH = `${pnpm8}${path.delimiter}${oldPath}`;
|
||||||
console.log(
|
console.log(
|
||||||
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 8...`
|
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 8`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else if (cliType === 'bun') {
|
||||||
|
if (!oldPath.includes(bun1) && !corepackEnabled) {
|
||||||
|
// Ensure that Bun 1 is at the beginning of the `$PATH`
|
||||||
|
newEnv.PATH = `${bun1}${path.delimiter}${oldPath}`;
|
||||||
|
console.log('Detected `bun.lockb` generated by Bun');
|
||||||
|
console.warn(
|
||||||
|
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -548,7 +580,6 @@ export function getEnvForPackageManager({
|
|||||||
newEnv.YARN_NODE_LINKER = 'node-modules';
|
newEnv.YARN_NODE_LINKER = 'node-modules';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return newEnv;
|
return newEnv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -614,6 +645,8 @@ export async function runPackageJsonScript(
|
|||||||
opts.prettyCommand = `npm run ${scriptName}`;
|
opts.prettyCommand = `npm run ${scriptName}`;
|
||||||
} else if (cliType === 'pnpm') {
|
} else if (cliType === 'pnpm') {
|
||||||
opts.prettyCommand = `pnpm run ${scriptName}`;
|
opts.prettyCommand = `pnpm run ${scriptName}`;
|
||||||
|
} else if (cliType === 'bun') {
|
||||||
|
opts.prettyCommand = `bun run ${scriptName}`;
|
||||||
} else {
|
} else {
|
||||||
opts.prettyCommand = `yarn run ${scriptName}`;
|
opts.prettyCommand = `yarn run ${scriptName}`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { File } from './types';
|
import type { File, HasField } from './types';
|
||||||
import { Lambda } from './lambda';
|
import { Lambda } from './lambda';
|
||||||
|
|
||||||
interface PrerenderOptions {
|
interface PrerenderOptions {
|
||||||
@@ -12,6 +12,8 @@ interface PrerenderOptions {
|
|||||||
initialStatus?: number;
|
initialStatus?: number;
|
||||||
passQuery?: boolean;
|
passQuery?: boolean;
|
||||||
sourcePath?: string;
|
sourcePath?: string;
|
||||||
|
experimentalBypassFor?: HasField;
|
||||||
|
experimentalStreamingLambdaPath?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Prerender {
|
export class Prerender {
|
||||||
@@ -26,6 +28,8 @@ export class Prerender {
|
|||||||
public initialStatus?: number;
|
public initialStatus?: number;
|
||||||
public passQuery?: boolean;
|
public passQuery?: boolean;
|
||||||
public sourcePath?: string;
|
public sourcePath?: string;
|
||||||
|
public experimentalBypassFor?: HasField;
|
||||||
|
public experimentalStreamingLambdaPath?: string;
|
||||||
|
|
||||||
constructor({
|
constructor({
|
||||||
expiration,
|
expiration,
|
||||||
@@ -38,6 +42,8 @@ export class Prerender {
|
|||||||
initialStatus,
|
initialStatus,
|
||||||
passQuery,
|
passQuery,
|
||||||
sourcePath,
|
sourcePath,
|
||||||
|
experimentalBypassFor,
|
||||||
|
experimentalStreamingLambdaPath,
|
||||||
}: PrerenderOptions) {
|
}: PrerenderOptions) {
|
||||||
this.type = 'Prerender';
|
this.type = 'Prerender';
|
||||||
this.expiration = expiration;
|
this.expiration = expiration;
|
||||||
@@ -86,6 +92,26 @@ export class Prerender {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (experimentalBypassFor !== undefined) {
|
||||||
|
if (
|
||||||
|
!Array.isArray(experimentalBypassFor) ||
|
||||||
|
experimentalBypassFor.some(
|
||||||
|
field =>
|
||||||
|
typeof field !== 'object' ||
|
||||||
|
// host doesn't need a key
|
||||||
|
(field.type !== 'host' && typeof field.key !== 'string') ||
|
||||||
|
typeof field.type !== 'string' ||
|
||||||
|
(field.value !== undefined && typeof field.value !== 'string')
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
throw new Error(
|
||||||
|
'The `experimentalBypassFor` argument for `Prerender` must be Array of objects with fields `type`, `key` and optionally `value`.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.experimentalBypassFor = experimentalBypassFor;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof fallback === 'undefined') {
|
if (typeof fallback === 'undefined') {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'The `fallback` argument for `Prerender` needs to be a `FileBlob`, `FileFsRef`, `FileRef`, or null.'
|
'The `fallback` argument for `Prerender` needs to be a `FileBlob`, `FileFsRef`, `FileRef`, or null.'
|
||||||
@@ -130,5 +156,14 @@ export class Prerender {
|
|||||||
}
|
}
|
||||||
this.allowQuery = allowQuery;
|
this.allowQuery = allowQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (experimentalStreamingLambdaPath !== undefined) {
|
||||||
|
if (typeof experimentalStreamingLambdaPath !== 'string') {
|
||||||
|
throw new Error(
|
||||||
|
'The `experimentalStreamingLambdaPath` argument for `Prerender` must be a string.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
this.experimentalStreamingLambdaPath = experimentalStreamingLambdaPath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,18 @@ export interface Config {
|
|||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type HasField = Array<
|
||||||
|
| {
|
||||||
|
type: 'host';
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: 'header' | 'cookie' | 'query';
|
||||||
|
key: string;
|
||||||
|
value?: string;
|
||||||
|
}
|
||||||
|
>;
|
||||||
|
|
||||||
export interface Meta {
|
export interface Meta {
|
||||||
isDev?: boolean;
|
isDev?: boolean;
|
||||||
devCacheDir?: string;
|
devCacheDir?: string;
|
||||||
@@ -422,6 +434,13 @@ export interface Cron {
|
|||||||
schedule: string;
|
schedule: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Proper description once complete
|
||||||
|
export interface Flag {
|
||||||
|
key: string;
|
||||||
|
defaultValue?: unknown;
|
||||||
|
metadata: Record<string, unknown>;
|
||||||
|
}
|
||||||
|
|
||||||
/** The framework which created the function */
|
/** The framework which created the function */
|
||||||
export interface FunctionFramework {
|
export interface FunctionFramework {
|
||||||
slug: string;
|
slug: string;
|
||||||
@@ -446,6 +465,7 @@ export interface BuildResultV2Typical {
|
|||||||
framework?: {
|
framework?: {
|
||||||
version: string;
|
version: string;
|
||||||
};
|
};
|
||||||
|
flags?: Flag[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export type BuildResultV2 = BuildResultV2Typical | BuildResultBuildOutput;
|
export type BuildResultV2 = BuildResultV2Typical | BuildResultBuildOutput;
|
||||||
|
|||||||
2
packages/build-utils/test/fixtures/30-bun-v1/.gitignore
vendored
Normal file
2
packages/build-utils/test/fixtures/30-bun-v1/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.vercel
|
||||||
|
public
|
||||||
8
packages/build-utils/test/fixtures/30-bun-v1/build.js
vendored
Normal file
8
packages/build-utils/test/fixtures/30-bun-v1/build.js
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { mkdir, rm, writeFile } from 'node:fs/promises'
|
||||||
|
import { say } from 'cowsay'
|
||||||
|
|
||||||
|
const text = say({ text: `bun version: ${process.versions.bun}` })
|
||||||
|
const content = say({ text })
|
||||||
|
await rm('./public', { recursive: true, force: true })
|
||||||
|
await mkdir('./public', { recursive: true })
|
||||||
|
await writeFile('./public/index.txt', content)
|
||||||
BIN
packages/build-utils/test/fixtures/30-bun-v1/bun.lockb
vendored
Executable file
BIN
packages/build-utils/test/fixtures/30-bun-v1/bun.lockb
vendored
Executable file
Binary file not shown.
9
packages/build-utils/test/fixtures/30-bun-v1/package.json
vendored
Normal file
9
packages/build-utils/test/fixtures/30-bun-v1/package.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun build.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"cowsay": "1.5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
8
packages/build-utils/test/fixtures/30-bun-v1/probes.json
vendored
Normal file
8
packages/build-utils/test/fixtures/30-bun-v1/probes.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"probes": [
|
||||||
|
{
|
||||||
|
"path": "/",
|
||||||
|
"mustContain": "bun version: 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
2
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/.gitignore
vendored
Normal file
2
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.vercel
|
||||||
|
public
|
||||||
8
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/build.js
vendored
Normal file
8
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/build.js
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { mkdir, rm, writeFile } from 'node:fs/promises'
|
||||||
|
import { say } from 'cowsay'
|
||||||
|
|
||||||
|
const text = say({ text: `bun version: ${process.versions.bun}` })
|
||||||
|
const content = say({ text })
|
||||||
|
await rm('./public', { recursive: true, force: true })
|
||||||
|
await mkdir('./public', { recursive: true })
|
||||||
|
await writeFile('./public/index.txt', content)
|
||||||
BIN
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/bun.lockb
vendored
Executable file
BIN
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/bun.lockb
vendored
Executable file
Binary file not shown.
9
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/package.json
vendored
Normal file
9
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/package.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "bun build.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"cowsay": "1.5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
8
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/probes.json
vendored
Normal file
8
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/probes.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"probes": [
|
||||||
|
{
|
||||||
|
"path": "/",
|
||||||
|
"mustContain": "bun version: 1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
221
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/yarn.lock
vendored
Normal file
221
packages/build-utils/test/fixtures/31-bun-v1-with-yarn-lock/yarn.lock
vendored
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
# bun ./bun.lockb --hash: CD5862D9DB80873E-24483eaa80ed0cc4-641E4430BAAAECB3-abebd38edad3b1b9
|
||||||
|
|
||||||
|
|
||||||
|
ansi-regex@^3.0.0:
|
||||||
|
version "3.0.1"
|
||||||
|
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz"
|
||||||
|
integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
|
||||||
|
|
||||||
|
ansi-regex@^5.0.1:
|
||||||
|
version "5.0.1"
|
||||||
|
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
|
||||||
|
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
|
||||||
|
|
||||||
|
ansi-styles@^4.0.0:
|
||||||
|
version "4.3.0"
|
||||||
|
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
|
||||||
|
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
|
||||||
|
dependencies:
|
||||||
|
color-convert "^2.0.1"
|
||||||
|
|
||||||
|
camelcase@^5.0.0:
|
||||||
|
version "5.3.1"
|
||||||
|
resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
|
||||||
|
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
|
||||||
|
|
||||||
|
cliui@^6.0.0:
|
||||||
|
version "6.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz"
|
||||||
|
integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
|
||||||
|
dependencies:
|
||||||
|
string-width "^4.2.0"
|
||||||
|
strip-ansi "^6.0.0"
|
||||||
|
wrap-ansi "^6.2.0"
|
||||||
|
|
||||||
|
color-convert@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
|
||||||
|
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
|
||||||
|
dependencies:
|
||||||
|
color-name "~1.1.4"
|
||||||
|
|
||||||
|
color-name@~1.1.4:
|
||||||
|
version "1.1.4"
|
||||||
|
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
|
||||||
|
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||||
|
|
||||||
|
cowsay@1.5.0:
|
||||||
|
version "1.5.0"
|
||||||
|
resolved "https://registry.npmjs.org/cowsay/-/cowsay-1.5.0.tgz"
|
||||||
|
integrity sha512-8Ipzr54Z8zROr/62C8f0PdhQcDusS05gKTS87xxdji8VbWefWly0k8BwGK7+VqamOrkv3eGsCkPtvlHzrhWsCA==
|
||||||
|
dependencies:
|
||||||
|
get-stdin "8.0.0"
|
||||||
|
string-width "~2.1.1"
|
||||||
|
strip-final-newline "2.0.0"
|
||||||
|
yargs "15.4.1"
|
||||||
|
|
||||||
|
decamelize@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
|
||||||
|
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
|
||||||
|
|
||||||
|
emoji-regex@^8.0.0:
|
||||||
|
version "8.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
|
||||||
|
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
|
||||||
|
|
||||||
|
find-up@^4.1.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
|
||||||
|
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
|
||||||
|
dependencies:
|
||||||
|
locate-path "^5.0.0"
|
||||||
|
path-exists "^4.0.0"
|
||||||
|
|
||||||
|
get-caller-file@^2.0.1:
|
||||||
|
version "2.0.5"
|
||||||
|
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
|
||||||
|
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
|
||||||
|
|
||||||
|
get-stdin@8.0.0:
|
||||||
|
version "8.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz"
|
||||||
|
integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
|
||||||
|
|
||||||
|
is-fullwidth-code-point@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"
|
||||||
|
integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
|
||||||
|
|
||||||
|
is-fullwidth-code-point@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
|
||||||
|
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
|
||||||
|
|
||||||
|
locate-path@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
|
||||||
|
integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
|
||||||
|
dependencies:
|
||||||
|
p-locate "^4.1.0"
|
||||||
|
|
||||||
|
p-limit@^2.2.0:
|
||||||
|
version "2.3.0"
|
||||||
|
resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
|
||||||
|
integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
|
||||||
|
dependencies:
|
||||||
|
p-try "^2.0.0"
|
||||||
|
|
||||||
|
p-locate@^4.1.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"
|
||||||
|
integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
|
||||||
|
dependencies:
|
||||||
|
p-limit "^2.2.0"
|
||||||
|
|
||||||
|
p-try@^2.0.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
|
||||||
|
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
|
||||||
|
|
||||||
|
path-exists@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
|
||||||
|
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
|
||||||
|
|
||||||
|
require-directory@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
|
||||||
|
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
|
||||||
|
|
||||||
|
require-main-filename@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz"
|
||||||
|
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
|
||||||
|
|
||||||
|
set-blocking@^2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
|
||||||
|
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
|
||||||
|
|
||||||
|
string-width@~2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
|
||||||
|
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
|
||||||
|
dependencies:
|
||||||
|
is-fullwidth-code-point "^2.0.0"
|
||||||
|
strip-ansi "^4.0.0"
|
||||||
|
|
||||||
|
string-width@^4.1.0, string-width@^4.2.0:
|
||||||
|
version "4.2.3"
|
||||||
|
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
|
||||||
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
|
dependencies:
|
||||||
|
emoji-regex "^8.0.0"
|
||||||
|
is-fullwidth-code-point "^3.0.0"
|
||||||
|
strip-ansi "^6.0.1"
|
||||||
|
|
||||||
|
strip-ansi@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz"
|
||||||
|
integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^3.0.0"
|
||||||
|
|
||||||
|
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||||
|
version "6.0.1"
|
||||||
|
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
|
||||||
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^5.0.1"
|
||||||
|
|
||||||
|
strip-final-newline@2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
|
||||||
|
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
|
||||||
|
|
||||||
|
which-module@^2.0.0:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz"
|
||||||
|
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
|
||||||
|
|
||||||
|
wrap-ansi@^6.2.0:
|
||||||
|
version "6.2.0"
|
||||||
|
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
|
||||||
|
integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
|
||||||
|
dependencies:
|
||||||
|
ansi-styles "^4.0.0"
|
||||||
|
string-width "^4.1.0"
|
||||||
|
strip-ansi "^6.0.0"
|
||||||
|
|
||||||
|
y18n@^4.0.0:
|
||||||
|
version "4.0.3"
|
||||||
|
resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz"
|
||||||
|
integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
|
||||||
|
|
||||||
|
yargs@15.4.1:
|
||||||
|
version "15.4.1"
|
||||||
|
resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz"
|
||||||
|
integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
|
||||||
|
dependencies:
|
||||||
|
cliui "^6.0.0"
|
||||||
|
decamelize "^1.2.0"
|
||||||
|
find-up "^4.1.0"
|
||||||
|
get-caller-file "^2.0.1"
|
||||||
|
require-directory "^2.1.1"
|
||||||
|
require-main-filename "^2.0.0"
|
||||||
|
set-blocking "^2.0.0"
|
||||||
|
string-width "^4.2.0"
|
||||||
|
which-module "^2.0.0"
|
||||||
|
y18n "^4.0.0"
|
||||||
|
yargs-parser "^18.1.2"
|
||||||
|
|
||||||
|
yargs-parser@^18.1.2:
|
||||||
|
version "18.1.3"
|
||||||
|
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz"
|
||||||
|
integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
|
||||||
|
dependencies:
|
||||||
|
camelcase "^5.0.0"
|
||||||
|
decamelize "^1.2.0"
|
||||||
3
packages/build-utils/test/tsconfig.json
vendored
3
packages/build-utils/test/tsconfig.json
vendored
@@ -1,4 +1,7 @@
|
|||||||
{
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"sourceMap": true
|
||||||
|
},
|
||||||
"extends": "../tsconfig.json",
|
"extends": "../tsconfig.json",
|
||||||
"include": ["*.test.ts"]
|
"include": ["*.test.ts"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,6 +133,22 @@ describe('Test `getEnvForPackageManager()`', () => {
|
|||||||
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
|
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'should set path if bun v1 is detected',
|
||||||
|
args: {
|
||||||
|
cliType: 'bun',
|
||||||
|
nodeVersion: { major: 18, range: '18.x', runtime: 'nodejs18.x' },
|
||||||
|
lockfileVersion: 0,
|
||||||
|
env: {
|
||||||
|
FOO: 'bar',
|
||||||
|
PATH: '/usr/local/bin',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: {
|
||||||
|
FOO: 'bar',
|
||||||
|
PATH: `/bun1${delimiter}/usr/local/bin`,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'should not set pnpm path if corepack is enabled',
|
name: 'should not set pnpm path if corepack is enabled',
|
||||||
args: {
|
args: {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ describe('Test `readConfigFile()`', () => {
|
|||||||
it('should return parsed object when file exists', async () => {
|
it('should return parsed object when file exists', async () => {
|
||||||
expect(await readConfigFile(tsconfig)).toMatchObject({
|
expect(await readConfigFile(tsconfig)).toMatchObject({
|
||||||
compilerOptions: {
|
compilerOptions: {
|
||||||
strict: true,
|
outDir: './dist',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
expect(logMessages).toEqual([]);
|
expect(logMessages).toEqual([]);
|
||||||
@@ -39,7 +39,7 @@ describe('Test `readConfigFile()`', () => {
|
|||||||
const files = [doesnotexist, tsconfig];
|
const files = [doesnotexist, tsconfig];
|
||||||
expect(await readConfigFile(files)).toMatchObject({
|
expect(await readConfigFile(files)).toMatchObject({
|
||||||
compilerOptions: {
|
compilerOptions: {
|
||||||
strict: true,
|
outDir: './dist',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
expect(logMessages).toEqual([]);
|
expect(logMessages).toEqual([]);
|
||||||
@@ -63,7 +63,7 @@ describe('Test `readConfigFile()`', () => {
|
|||||||
await writeFile(invalid, 'borked');
|
await writeFile(invalid, 'borked');
|
||||||
expect(await readConfigFile([invalid, tsconfig])).toMatchObject({
|
expect(await readConfigFile([invalid, tsconfig])).toMatchObject({
|
||||||
compilerOptions: {
|
compilerOptions: {
|
||||||
strict: true,
|
outDir: './dist',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
118
packages/build-utils/test/unit.test.ts
vendored
118
packages/build-utils/test/unit.test.ts
vendored
@@ -344,6 +344,70 @@ it('should support initialHeaders and initialStatus correctly', async () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support experimentalBypassFor correctly', async () => {
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
experimentalBypassFor: [{ type: 'header', key: 'Next-Action' }],
|
||||||
|
});
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
experimentalBypassFor: [
|
||||||
|
{ type: 'header', key: 'Next-Action' },
|
||||||
|
{
|
||||||
|
type: 'cookie',
|
||||||
|
key: '__prerender_bypass',
|
||||||
|
value: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
experimentalBypassFor: [{ type: 'query', key: 'bypass', value: '1' }],
|
||||||
|
});
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
experimentalBypassFor: [{ type: 'host', value: 'vercel.com' }],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(() => {
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
// @ts-expect-error: testing invalid args
|
||||||
|
experimentalBypassFor: 'foo',
|
||||||
|
});
|
||||||
|
}).toThrowError(
|
||||||
|
'The `experimentalBypassFor` argument for `Prerender` must be Array of objects with fields `type`, `key` and optionally `value`.'
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(() => {
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
// @ts-expect-error: testing invalid args
|
||||||
|
experimentalBypassFor: [{ type: 'header', value: { foo: 'bar' } }],
|
||||||
|
});
|
||||||
|
}).toThrowError(
|
||||||
|
'The `experimentalBypassFor` argument for `Prerender` must be Array of objects with fields `type`, `key` and optionally `value`.'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('should support passQuery correctly', async () => {
|
it('should support passQuery correctly', async () => {
|
||||||
new Prerender({
|
new Prerender({
|
||||||
expiration: 1,
|
expiration: 1,
|
||||||
@@ -387,6 +451,42 @@ it('should support passQuery correctly', async () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support experimentalStreamingLambdaPath correctly', async () => {
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
experimentalStreamingLambdaPath: undefined,
|
||||||
|
});
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
experimentalStreamingLambdaPath: '/some/path/to/lambda',
|
||||||
|
});
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(() => {
|
||||||
|
new Prerender({
|
||||||
|
expiration: 1,
|
||||||
|
fallback: null,
|
||||||
|
group: 1,
|
||||||
|
bypassToken: 'some-long-bypass-token-to-make-it-work',
|
||||||
|
// @ts-expect-error testing invalid field
|
||||||
|
experimentalStreamingLambdaPath: 1,
|
||||||
|
});
|
||||||
|
}).toThrowError(
|
||||||
|
`The \`experimentalStreamingLambdaPath\` argument for \`Prerender\` must be a string.`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('should support require by path for legacy builders', () => {
|
it('should support require by path for legacy builders', () => {
|
||||||
const index = require('../');
|
const index = require('../');
|
||||||
|
|
||||||
@@ -440,6 +540,24 @@ it(
|
|||||||
ms('1m')
|
ms('1m')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
it('should return cliType bun and correct lock file for bun v1', async () => {
|
||||||
|
const fixture = path.join(__dirname, 'fixtures', '31-bun-v1-with-yarn-lock');
|
||||||
|
const result = await scanParentDirs(fixture);
|
||||||
|
expect(result.cliType).toEqual('bun');
|
||||||
|
expect(result.lockfileVersion).toEqual(0);
|
||||||
|
expect(result.lockfilePath).toEqual(path.join(fixture, 'bun.lockb'));
|
||||||
|
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return cliType bun and correct lock file for bun v1 with yarn.lock file', async () => {
|
||||||
|
const fixture = path.join(__dirname, 'fixtures', '30-bun-v1');
|
||||||
|
const result = await scanParentDirs(fixture);
|
||||||
|
expect(result.cliType).toEqual('bun');
|
||||||
|
expect(result.lockfileVersion).toEqual(0);
|
||||||
|
expect(result.lockfilePath).toEqual(path.join(fixture, 'bun.lockb'));
|
||||||
|
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
|
||||||
|
});
|
||||||
|
|
||||||
it('should return lockfileVersion 2 with npm7', async () => {
|
it('should return lockfileVersion 2 with npm7', async () => {
|
||||||
const fixture = path.join(__dirname, 'fixtures', '20-npm-7');
|
const fixture = path.join(__dirname, 'fixtures', '20-npm-7');
|
||||||
const result = await scanParentDirs(fixture);
|
const result = await scanParentDirs(fixture);
|
||||||
|
|||||||
@@ -1,20 +1,9 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"declaration": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"lib": ["ES2021"],
|
|
||||||
"module": "commonjs",
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"noEmitOnError": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"noImplicitReturns": true,
|
|
||||||
"noUnusedLocals": true,
|
|
||||||
"noUnusedParameters": true,
|
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"types": ["node", "jest"],
|
"types": ["node", "jest"]
|
||||||
"strict": true,
|
|
||||||
"target": "ES2021"
|
|
||||||
},
|
},
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
"include": ["src/**/*"],
|
"include": ["src/**/*"],
|
||||||
"exclude": ["node_modules"]
|
"exclude": ["node_modules"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,183 @@
|
|||||||
# vercel
|
# vercel
|
||||||
|
|
||||||
|
## 32.5.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- Indicates whether @vercel/speed-insights or @vercel/analytics are used ([#10623](https://github.com/vercel/vercel/pull/10623))
|
||||||
|
|
||||||
|
- [cli] update env var validation rule to allow name start with underscore ([#10697](https://github.com/vercel/vercel/pull/10697))
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`da300030c`](https://github.com/vercel/vercel/commit/da300030c999b3555c608a321c9d0a4d36923a5a), [`de84743e1`](https://github.com/vercel/vercel/commit/de84743e10d4c9701d409355c0fe057f35e6e435), [`913608de4`](https://github.com/vercel/vercel/commit/913608de4dd4e37557533d732ca8449a5737d4a6), [`7fa08088e`](https://github.com/vercel/vercel/commit/7fa08088ea0d5df6955ea4af7f08513cf4027bb3)]:
|
||||||
|
- @vercel/next@4.0.11
|
||||||
|
- @vercel/python@4.1.0
|
||||||
|
- @vercel/remix-builder@2.0.10
|
||||||
|
- @vercel/redwood@2.0.5
|
||||||
|
- @vercel/static-build@2.0.9
|
||||||
|
|
||||||
|
## 32.4.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`c523a755f`](https://github.com/vercel/vercel/commit/c523a755f8e4bc41f7c353ebc0b939c21703df00), [`58215906f`](https://github.com/vercel/vercel/commit/58215906f9ee28da3a7f2f3f4aeb862ab53bf55e)]:
|
||||||
|
- @vercel/next@4.0.10
|
||||||
|
|
||||||
|
## 32.4.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- Restore unsetting teamId for non-team accounts ([#10612](https://github.com/vercel/vercel/pull/10612))
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- remove unused source map pkg ([#10577](https://github.com/vercel/vercel/pull/10577))
|
||||||
|
|
||||||
|
- disable source map for prod build ([#10575](https://github.com/vercel/vercel/pull/10575))
|
||||||
|
|
||||||
|
- Better rendering upon authentication error in `vc cert ls` ([#10551](https://github.com/vercel/vercel/pull/10551))
|
||||||
|
|
||||||
|
- Updated dependencies [[`e9026c7a6`](https://github.com/vercel/vercel/commit/e9026c7a692937122e60e73b91100cf7009e022d), [`ea5bc8806`](https://github.com/vercel/vercel/commit/ea5bc8806276abf5ba14bdb4a966267497e5d14d), [`a4996e1c5`](https://github.com/vercel/vercel/commit/a4996e1c5a7e6986d5410b662014dc584c0f7c54), [`a18ed98f2`](https://github.com/vercel/vercel/commit/a18ed98f2df78fe1256410ea8676686564ed9b35), [`2f5b0aeeb`](https://github.com/vercel/vercel/commit/2f5b0aeeb183ed3ea8cbc68cb3bc3c949c486ada), [`09f1bbfa4`](https://github.com/vercel/vercel/commit/09f1bbfa41a87cf0063a3fb3022b7531d03862b5), [`ce7e82fa7`](https://github.com/vercel/vercel/commit/ce7e82fa7aa6cec5f5d7b4953353b297b7ad1694)]:
|
||||||
|
- @vercel/next@4.0.9
|
||||||
|
- @vercel/go@3.0.3
|
||||||
|
- @vercel/build-utils@7.2.2
|
||||||
|
- @vercel/node@3.0.7
|
||||||
|
- @vercel/redwood@2.0.4
|
||||||
|
- @vercel/remix-builder@2.0.9
|
||||||
|
- @vercel/static-build@2.0.8
|
||||||
|
|
||||||
|
## 32.3.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Use "esbuild" to build CLI ([#10555](https://github.com/vercel/vercel/pull/10555))
|
||||||
|
|
||||||
|
- Updated dependencies [[`9f63ca60a`](https://github.com/vercel/vercel/commit/9f63ca60ad914af0f7ba18c9bbe1656eeea68a0a), [`e3f9faf51`](https://github.com/vercel/vercel/commit/e3f9faf513bd97900d8966f2f1116fc3ca07221b)]:
|
||||||
|
- @vercel/next@4.0.8
|
||||||
|
- @vercel/remix-builder@2.0.8
|
||||||
|
|
||||||
|
## 32.3.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- [cli] Support northstar users ([#10535](https://github.com/vercel/vercel/pull/10535))
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Internal variants ([#10549](https://github.com/vercel/vercel/pull/10549))
|
||||||
|
|
||||||
|
- [speed insights] Prepare for migration to new speed insights package ([#10500](https://github.com/vercel/vercel/pull/10500))
|
||||||
|
|
||||||
|
- Updated dependencies [[`b0898a665`](https://github.com/vercel/vercel/commit/b0898a66591d5296dc38ffcf0e8345c9338b72f3), [`10d4e51ac`](https://github.com/vercel/vercel/commit/10d4e51ac57b76f05ddc0bf3adf220e2490244fc), [`decdf27fb`](https://github.com/vercel/vercel/commit/decdf27fb5ca914fe50a9320c4fd50ef79d2fbb3), [`f5ca497b7`](https://github.com/vercel/vercel/commit/f5ca497b7522a2dad637cef238da9716ac133057), [`ab329f0fe`](https://github.com/vercel/vercel/commit/ab329f0fe88e9cb72607d0cba41f5e168d77e077), [`d0d052011`](https://github.com/vercel/vercel/commit/d0d0520111264434d57d5920de0f622f6a2588dc), [`9bb3067de`](https://github.com/vercel/vercel/commit/9bb3067de28be77f3ce268a31a7aa6184836dfb1)]:
|
||||||
|
- @vercel/static-build@2.0.7
|
||||||
|
- @vercel/node@3.0.6
|
||||||
|
- @vercel/build-utils@7.2.1
|
||||||
|
- @vercel/next@4.0.7
|
||||||
|
- @vercel/python@4.0.2
|
||||||
|
- @vercel/redwood@2.0.3
|
||||||
|
- @vercel/remix-builder@2.0.7
|
||||||
|
- @vercel/go@3.0.2
|
||||||
|
|
||||||
|
## 32.2.5
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`849eedf0f`](https://github.com/vercel/vercel/commit/849eedf0f2841211e4175d374f1cf01330bf9611), [`f6f16b034`](https://github.com/vercel/vercel/commit/f6f16b0347bac9f5c33c79ccb1fb9fd9d254cae5), [`3035e18fb`](https://github.com/vercel/vercel/commit/3035e18fb67dfe7031e235a74136a41948f86d5a), [`cb784aeb9`](https://github.com/vercel/vercel/commit/cb784aeb9c9e4eddf1c65b61849a87edb1117af1)]:
|
||||||
|
- @vercel/next@4.0.6
|
||||||
|
- @vercel/remix-builder@2.0.6
|
||||||
|
|
||||||
|
## 32.2.4
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Add support for bun detection in monorepo ([#10511](https://github.com/vercel/vercel/pull/10511))
|
||||||
|
|
||||||
|
- Updated dependencies [[`1b6f3a0f6`](https://github.com/vercel/vercel/commit/1b6f3a0f6534f71c7486a4e33ac199f1da330626)]:
|
||||||
|
- @vercel/static-build@2.0.6
|
||||||
|
|
||||||
|
## 32.2.3
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`083aad448`](https://github.com/vercel/vercel/commit/083aad448e45edae296da3201eec9f890a01d22d)]:
|
||||||
|
- @vercel/next@4.0.5
|
||||||
|
|
||||||
|
## 32.2.2
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [[`7a0fed970`](https://github.com/vercel/vercel/commit/7a0fed970c39cb8f4df70544ded3284d3538b06a), [`2f461a8b0`](https://github.com/vercel/vercel/commit/2f461a8b0bcbdd05da0516395c2905c2d0242682), [`1bab21026`](https://github.com/vercel/vercel/commit/1bab21026ec0bb8a4a8fbeac3d6e4a197f1030fd)]:
|
||||||
|
- @vercel/next@4.0.4
|
||||||
|
- @vercel/remix-builder@2.0.5
|
||||||
|
|
||||||
|
## 32.2.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Update @vercel/fun@1.1.0 ([#10477](https://github.com/vercel/vercel/pull/10477))
|
||||||
|
|
||||||
|
- [node] upgrade edge-runtime ([#10451](https://github.com/vercel/vercel/pull/10451))
|
||||||
|
|
||||||
|
- Updated dependencies [[`6784e7751`](https://github.com/vercel/vercel/commit/6784e77516ba180a691e3c48323b32bb4506d7b6), [`a8ad17626`](https://github.com/vercel/vercel/commit/a8ad176262ef822860ce338927e6f959961d2d32), [`0ee089a50`](https://github.com/vercel/vercel/commit/0ee089a501ebb78901c4afe1658e794917998f8f), [`f15cba614`](https://github.com/vercel/vercel/commit/f15cba6148a0cdb6975db7724775c35ab7d929b2), [`b265e13d4`](https://github.com/vercel/vercel/commit/b265e13d40d541b77148fa79ac60b4c4dd10974c), [`50e04dd85`](https://github.com/vercel/vercel/commit/50e04dd8584664c842a86c15d92d654f4ea8dcbb), [`45b73c7e8`](https://github.com/vercel/vercel/commit/45b73c7e86458564dc0bab007f6f6365c4c4ab5d), [`a732d30c8`](https://github.com/vercel/vercel/commit/a732d30c8409f96f59ea5406e974a6c4186cc130), [`9d64312aa`](https://github.com/vercel/vercel/commit/9d64312aaaa875a4e193b7602c50e5dc68979aad), [`6baefc825`](https://github.com/vercel/vercel/commit/6baefc825ad7cfc3a5edce31cb4244721452f753), [`989f0d813`](https://github.com/vercel/vercel/commit/989f0d813910d8d67ed355de93018f1dcd91b6ba), [`d8bc570f6`](https://github.com/vercel/vercel/commit/d8bc570f604950d97156d4f33c8accecf3b3b28f)]:
|
||||||
|
- @vercel/go@3.0.1
|
||||||
|
- @vercel/redwood@2.0.2
|
||||||
|
- @vercel/remix-builder@2.0.4
|
||||||
|
- @vercel/hydrogen@1.0.1
|
||||||
|
- @vercel/static-build@2.0.5
|
||||||
|
- @vercel/build-utils@7.2.0
|
||||||
|
- @vercel/next@4.0.3
|
||||||
|
- @vercel/node@3.0.5
|
||||||
|
- @vercel/python@4.0.1
|
||||||
|
- @vercel/ruby@2.0.2
|
||||||
|
|
||||||
|
## 32.2.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- show instant preview url on deploy ([#10458](https://github.com/vercel/vercel/pull/10458))
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- N, not n. ([#10460](https://github.com/vercel/vercel/pull/10460))
|
||||||
|
|
||||||
|
- Fix team URL on `vercel help switch` ([#10466](https://github.com/vercel/vercel/pull/10466))
|
||||||
|
|
||||||
|
- Migrates the vc env command to the command data structure for use in the help output. ([#10429](https://github.com/vercel/vercel/pull/10429))
|
||||||
|
|
||||||
|
- Update domains command to new structure ([#10427](https://github.com/vercel/vercel/pull/10427))
|
||||||
|
|
||||||
|
- Updated semver dependency ([#10411](https://github.com/vercel/vercel/pull/10411))
|
||||||
|
|
||||||
|
- migrate `rollback` command structure for help output ([#10426](https://github.com/vercel/vercel/pull/10426))
|
||||||
|
|
||||||
|
- migrate `inti` command structure for help output ([#10428](https://github.com/vercel/vercel/pull/10428))
|
||||||
|
|
||||||
|
- Remove mri workaround ([#10452](https://github.com/vercel/vercel/pull/10452))
|
||||||
|
|
||||||
|
- migrate dev command structure for help output ([#10433](https://github.com/vercel/vercel/pull/10433))
|
||||||
|
|
||||||
|
- Update secrets to more recent structure ([#10461](https://github.com/vercel/vercel/pull/10461))
|
||||||
|
|
||||||
|
- Migrate `vc secrets` to new help command structure ([#10435](https://github.com/vercel/vercel/pull/10435))
|
||||||
|
|
||||||
|
- migrate `promote` command structure for help output ([#10425](https://github.com/vercel/vercel/pull/10425))
|
||||||
|
|
||||||
|
- migrate `git` command structure for help output ([#10431](https://github.com/vercel/vercel/pull/10431))
|
||||||
|
|
||||||
|
- Update project command to new data structure ([#10432](https://github.com/vercel/vercel/pull/10432))
|
||||||
|
|
||||||
|
- migrate teams command ([#10434](https://github.com/vercel/vercel/pull/10434))
|
||||||
|
|
||||||
|
- Updated dependencies [[`5609a1187`](https://github.com/vercel/vercel/commit/5609a1187be9d6cf8d5f16825690c5ea72f17dc5), [`caaba0d68`](https://github.com/vercel/vercel/commit/caaba0d6855eff4350b6a04acc3ea502025bff8f), [`1b4de4a98`](https://github.com/vercel/vercel/commit/1b4de4a986f7a612aac834ebae3ec7bb9e9b8cf8), [`c3c54d6e6`](https://github.com/vercel/vercel/commit/c3c54d6e695ec078777c4b1f4f23acbeee3c3b09), [`6aa0aa4e6`](https://github.com/vercel/vercel/commit/6aa0aa4e65b81903f4fce677a198dcfaebee744b), [`e43191b18`](https://github.com/vercel/vercel/commit/e43191b1866da70a3dab3815a3f2176942240ef3), [`fc1e13c09`](https://github.com/vercel/vercel/commit/fc1e13c09928c654410b373fc1775c2b63c6ef4a)]:
|
||||||
|
- @vercel/build-utils@7.1.1
|
||||||
|
- @vercel/next@4.0.2
|
||||||
|
- @vercel/static-build@2.0.4
|
||||||
|
- @vercel/redwood@2.0.1
|
||||||
|
- @vercel/remix-builder@2.0.3
|
||||||
|
- @vercel/ruby@2.0.1
|
||||||
|
- @vercel/node@3.0.4
|
||||||
|
|
||||||
## 32.1.0
|
## 32.1.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vercel",
|
"name": "vercel",
|
||||||
"version": "32.1.0",
|
"version": "32.5.0",
|
||||||
"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",
|
||||||
@@ -16,35 +16,37 @@
|
|||||||
"test-e2e": "rimraf test/fixtures/integration && pnpm test test/integration-1.test.ts test/integration-2.test.ts test/integration-3.test.ts",
|
"test-e2e": "rimraf test/fixtures/integration && pnpm test test/integration-1.test.ts test/integration-2.test.ts test/integration-3.test.ts",
|
||||||
"test-dev": "pnpm test test/dev/",
|
"test-dev": "pnpm test test/dev/",
|
||||||
"coverage": "codecov",
|
"coverage": "codecov",
|
||||||
"build": "ts-node ./scripts/build.ts",
|
"build": "node scripts/build.mjs",
|
||||||
"dev": "ts-node ./src/index.ts"
|
"dev": "ts-node ./src/index.ts",
|
||||||
|
"type-check": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"vc": "./dist/index.js",
|
"vc": "./dist/index.js",
|
||||||
"vercel": "./dist/index.js"
|
"vercel": "./dist/index.js"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist"
|
||||||
"scripts/preinstall.js"
|
|
||||||
],
|
],
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 16"
|
"node": ">= 16"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vercel/build-utils": "7.1.0",
|
"@vercel/build-utils": "7.2.2",
|
||||||
"@vercel/go": "3.0.0",
|
"@vercel/fun": "1.1.0",
|
||||||
"@vercel/hydrogen": "1.0.0",
|
"@vercel/go": "3.0.3",
|
||||||
"@vercel/next": "4.0.1",
|
"@vercel/hydrogen": "1.0.1",
|
||||||
"@vercel/node": "3.0.3",
|
"@vercel/next": "4.0.11",
|
||||||
"@vercel/python": "4.0.0",
|
"@vercel/node": "3.0.7",
|
||||||
"@vercel/redwood": "2.0.0",
|
"@vercel/python": "4.1.0",
|
||||||
"@vercel/remix-builder": "2.0.2",
|
"@vercel/redwood": "2.0.5",
|
||||||
"@vercel/ruby": "2.0.0",
|
"@vercel/remix-builder": "2.0.10",
|
||||||
"@vercel/static-build": "2.0.3"
|
"@vercel/ruby": "2.0.2",
|
||||||
|
"@vercel/static-build": "2.0.9",
|
||||||
|
"chokidar": "3.3.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@alex_neo/jest-expect-message": "1.0.5",
|
"@alex_neo/jest-expect-message": "1.0.5",
|
||||||
"@edge-runtime/node-utils": "2.2.0",
|
"@edge-runtime/node-utils": "2.2.1",
|
||||||
"@next/env": "11.1.2",
|
"@next/env": "11.1.2",
|
||||||
"@sentry/node": "5.5.0",
|
"@sentry/node": "5.5.0",
|
||||||
"@sindresorhus/slugify": "0.11.0",
|
"@sindresorhus/slugify": "0.11.0",
|
||||||
@@ -86,15 +88,12 @@
|
|||||||
"@types/yauzl-promise": "2.1.0",
|
"@types/yauzl-promise": "2.1.0",
|
||||||
"@vercel-internals/constants": "1.0.4",
|
"@vercel-internals/constants": "1.0.4",
|
||||||
"@vercel-internals/get-package-json": "1.0.0",
|
"@vercel-internals/get-package-json": "1.0.0",
|
||||||
"@vercel-internals/types": "1.0.8",
|
"@vercel-internals/types": "1.0.13",
|
||||||
"@vercel/client": "13.0.1",
|
"@vercel/client": "13.0.6",
|
||||||
"@vercel/error-utils": "2.0.1",
|
"@vercel/error-utils": "2.0.1",
|
||||||
"@vercel/frameworks": "2.0.1",
|
"@vercel/frameworks": "2.0.2",
|
||||||
"@vercel/fs-detectors": "5.0.1",
|
"@vercel/fs-detectors": "5.1.2",
|
||||||
"@vercel/fun": "1.0.4",
|
"@vercel/routing-utils": "3.1.0",
|
||||||
"@vercel/ncc": "0.24.0",
|
|
||||||
"@vercel/routing-utils": "3.0.0",
|
|
||||||
"@zeit/source-map-support": "0.6.2",
|
|
||||||
"ajv": "6.12.2",
|
"ajv": "6.12.2",
|
||||||
"alpha-sort": "2.0.1",
|
"alpha-sort": "2.0.1",
|
||||||
"ansi-escapes": "4.3.2",
|
"ansi-escapes": "4.3.2",
|
||||||
@@ -106,10 +105,8 @@
|
|||||||
"bytes": "3.0.0",
|
"bytes": "3.0.0",
|
||||||
"chalk": "4.1.0",
|
"chalk": "4.1.0",
|
||||||
"chance": "1.1.7",
|
"chance": "1.1.7",
|
||||||
"chokidar": "3.3.1",
|
|
||||||
"cli-table3": "0.6.3",
|
"cli-table3": "0.6.3",
|
||||||
"codecov": "3.8.2",
|
"codecov": "3.8.2",
|
||||||
"cpy": "7.2.0",
|
|
||||||
"date-fns": "1.29.0",
|
"date-fns": "1.29.0",
|
||||||
"debug": "3.1.0",
|
"debug": "3.1.0",
|
||||||
"dot": "1.1.3",
|
"dot": "1.1.3",
|
||||||
@@ -156,12 +153,11 @@
|
|||||||
"qr-image": "3.2.0",
|
"qr-image": "3.2.0",
|
||||||
"raw-body": "2.4.1",
|
"raw-body": "2.4.1",
|
||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"semver": "5.5.0",
|
"semver": "5.7.2",
|
||||||
"serve-handler": "6.1.1",
|
"serve-handler": "6.1.1",
|
||||||
"strip-ansi": "6.0.1",
|
"strip-ansi": "6.0.1",
|
||||||
"supports-hyperlinks": "3.0.0",
|
"supports-hyperlinks": "3.0.0",
|
||||||
"tar-fs": "1.16.3",
|
"tar-fs": "1.16.3",
|
||||||
"test-listen": "1.1.0",
|
|
||||||
"text-table": "0.2.0",
|
"text-table": "0.2.0",
|
||||||
"title": "3.4.1",
|
"title": "3.4.1",
|
||||||
"tmp-promise": "1.0.3",
|
"tmp-promise": "1.0.3",
|
||||||
|
|||||||
54
packages/cli/scripts/build.mjs
Normal file
54
packages/cli/scripts/build.mjs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import { join } from 'node:path';
|
||||||
|
import { copyFileSync, readFileSync, writeFileSync } from 'node:fs';
|
||||||
|
import { esbuild } from '../../../utils/build.mjs';
|
||||||
|
import { compileDevTemplates } from './compile-templates.mjs';
|
||||||
|
|
||||||
|
const repoRoot = new URL('../', import.meta.url);
|
||||||
|
|
||||||
|
function createConstants() {
|
||||||
|
const filename = new URL('src/util/constants.ts', repoRoot);
|
||||||
|
const contents = `// This file is auto-generated
|
||||||
|
export const GA_TRACKING_ID: string | undefined = ${envToString(
|
||||||
|
'GA_TRACKING_ID'
|
||||||
|
)};
|
||||||
|
export const SENTRY_DSN: string | undefined = ${envToString('SENTRY_DSN')};
|
||||||
|
`;
|
||||||
|
writeFileSync(filename, contents, 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
function envToString(key) {
|
||||||
|
const value = process.env[key];
|
||||||
|
if (value) {
|
||||||
|
return JSON.stringify(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the secrets from GitHub Actions and generate a file.
|
||||||
|
// During local development, these secrets will be empty.
|
||||||
|
createConstants();
|
||||||
|
|
||||||
|
// Compile the `doT.js` template files for `vercel dev`
|
||||||
|
await compileDevTemplates();
|
||||||
|
|
||||||
|
const pkgPath = join(process.cwd(), 'package.json');
|
||||||
|
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
||||||
|
const externals = Object.keys(pkg.dependencies || {});
|
||||||
|
await esbuild({
|
||||||
|
bundle: true,
|
||||||
|
external: externals,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Copy a few static files into `dist`
|
||||||
|
const distRoot = new URL('dist/', repoRoot);
|
||||||
|
copyFileSync(
|
||||||
|
new URL('src/util/projects/VERCEL_DIR_README.txt', repoRoot),
|
||||||
|
new URL('VERCEL_DIR_README.txt', distRoot)
|
||||||
|
);
|
||||||
|
copyFileSync(
|
||||||
|
new URL('src/util/dev/builder-worker.js', repoRoot),
|
||||||
|
new URL('builder-worker.js', distRoot)
|
||||||
|
);
|
||||||
|
copyFileSync(
|
||||||
|
new URL('src/util/get-latest-version/get-latest-worker.js', repoRoot),
|
||||||
|
new URL('get-latest-worker.js', distRoot)
|
||||||
|
);
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
import cpy from 'cpy';
|
|
||||||
import execa from 'execa';
|
|
||||||
import { join } from 'path';
|
|
||||||
import { remove, readJSON, writeFile } from 'fs-extra';
|
|
||||||
|
|
||||||
const dirRoot = join(__dirname, '..');
|
|
||||||
const distRoot = join(dirRoot, 'dist');
|
|
||||||
|
|
||||||
async function createConstants() {
|
|
||||||
console.log('Creating constants.ts');
|
|
||||||
const filename = join(dirRoot, 'src/util/constants.ts');
|
|
||||||
const contents = `// This file is auto-generated
|
|
||||||
export const GA_TRACKING_ID: string | undefined = ${envToString(
|
|
||||||
'GA_TRACKING_ID'
|
|
||||||
)};
|
|
||||||
export const SENTRY_DSN: string | undefined = ${envToString('SENTRY_DSN')};
|
|
||||||
`;
|
|
||||||
await writeFile(filename, contents, 'utf8');
|
|
||||||
}
|
|
||||||
|
|
||||||
function envToString(key: string) {
|
|
||||||
const value = process.env[key];
|
|
||||||
if (!value) {
|
|
||||||
console.log(`- Constant ${key} is not assigned`);
|
|
||||||
}
|
|
||||||
return JSON.stringify(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
// Read the secrets from GitHub Actions and generate a file.
|
|
||||||
// During local development, these secrets will be empty.
|
|
||||||
await createConstants();
|
|
||||||
|
|
||||||
// `vercel dev` uses chokidar to watch the filesystem, but opts-out of the
|
|
||||||
// `fsevents` feature using `useFsEvents: false`, so delete the module here so
|
|
||||||
// that it is not compiled by ncc, which makes the npm package size larger
|
|
||||||
// than necessary.
|
|
||||||
await remove(join(dirRoot, '../../node_modules/fsevents'));
|
|
||||||
|
|
||||||
// Compile the `doT.js` template files for `vercel dev`
|
|
||||||
console.log();
|
|
||||||
await execa(process.execPath, [join(__dirname, 'compile-templates.js')], {
|
|
||||||
stdio: 'inherit',
|
|
||||||
});
|
|
||||||
|
|
||||||
const pkg = await readJSON(join(dirRoot, 'package.json'));
|
|
||||||
const dependencies = Object.keys(pkg?.dependencies ?? {});
|
|
||||||
// Do the initial `ncc` build
|
|
||||||
console.log('Dependencies:', dependencies);
|
|
||||||
const externs: Array<string> = [];
|
|
||||||
for (const dep of dependencies) {
|
|
||||||
externs.push('--external', dep);
|
|
||||||
}
|
|
||||||
const args = ['ncc', 'build', 'src/index.ts', ...externs];
|
|
||||||
await execa('pnpm', args, { stdio: 'inherit', cwd: dirRoot });
|
|
||||||
|
|
||||||
// `ncc` has some issues with `@vercel/fun`'s runtime files:
|
|
||||||
// - Executable bits on the `bootstrap` files appear to be lost:
|
|
||||||
// https://github.com/vercel/ncc/pull/182
|
|
||||||
// - The `bootstrap.js` asset does not get copied into the output dir:
|
|
||||||
// https://github.com/vercel/ncc/issues/278
|
|
||||||
//
|
|
||||||
// Aside from those issues, all the same files from the `runtimes` directory
|
|
||||||
// should be copied into the output runtimes dir, specifically the `index.js`
|
|
||||||
// files (correctly) do not get copied into the output bundle because they
|
|
||||||
// get compiled into the final ncc bundle file, however, we want them to be
|
|
||||||
// present in the npm package because the contents of those files are involved
|
|
||||||
// with `fun`'s cache invalidation mechanism and they need to be shasum'd.
|
|
||||||
const runtimes = join(dirRoot, 'node_modules/@vercel/fun/dist/src/runtimes');
|
|
||||||
await cpy('**/*', join(distRoot, 'runtimes'), {
|
|
||||||
parents: true,
|
|
||||||
cwd: runtimes,
|
|
||||||
});
|
|
||||||
|
|
||||||
// Band-aid to bundle stuff that `ncc` neglects to bundle
|
|
||||||
await cpy(join(dirRoot, 'src/util/projects/VERCEL_DIR_README.txt'), distRoot);
|
|
||||||
await cpy(join(dirRoot, 'src/util/dev/builder-worker.js'), distRoot);
|
|
||||||
await cpy(
|
|
||||||
join(dirRoot, 'src/util/get-latest-version/get-latest-worker.js'),
|
|
||||||
distRoot
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log('Finished building Vercel CLI');
|
|
||||||
}
|
|
||||||
|
|
||||||
process.on('unhandledRejection', (reason: any, promise: Promise<any>) => {
|
|
||||||
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on('uncaughtException', err => {
|
|
||||||
console.error('Uncaught Exception:');
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
main().catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
const execa = require('execa');
|
|
||||||
const { join } = require('path');
|
|
||||||
const { readFile, writeFile, readdir, remove } = require('fs-extra');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
const dirRoot = join(__dirname, '..');
|
|
||||||
|
|
||||||
// Compile the `doT.js` template files for `vercel dev`
|
|
||||||
const templatesDir = join(dirRoot, 'src/util/dev/templates');
|
|
||||||
const dotPacker = join(dirRoot, '../../node_modules/dot/bin/dot-packer');
|
|
||||||
await execa(process.execPath, [dotPacker], {
|
|
||||||
cwd: templatesDir,
|
|
||||||
stdio: 'inherit',
|
|
||||||
});
|
|
||||||
|
|
||||||
const files = await readdir(templatesDir);
|
|
||||||
const compiledFiles = files.filter(f => f.endsWith('.js'));
|
|
||||||
|
|
||||||
// Prettier
|
|
||||||
console.log('\nMaking the compiled template functions prettier...');
|
|
||||||
const prettier = join(dirRoot, '../../node_modules/prettier/bin-prettier.js');
|
|
||||||
await execa(
|
|
||||||
process.execPath,
|
|
||||||
[prettier, '--write', '--single-quote', ...compiledFiles],
|
|
||||||
{
|
|
||||||
cwd: templatesDir,
|
|
||||||
stdio: 'inherit',
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log('\nConverting template functions to TypeScript');
|
|
||||||
for (const file of compiledFiles) {
|
|
||||||
const start = Date.now();
|
|
||||||
const fnPath = join(templatesDir, file);
|
|
||||||
const tsPath = fnPath.replace(/\.js$/, '.ts');
|
|
||||||
const def = await readFile(fnPath.replace(/\.js$/, '.tsdef'), 'utf8');
|
|
||||||
const interfaceName = def.match(/interface (\w+)/)[1];
|
|
||||||
|
|
||||||
const lines = require(fnPath).toString().split('\n');
|
|
||||||
let errorHtmlStart = -1;
|
|
||||||
let errorHtmlEnd = -1;
|
|
||||||
for (let i = 0; i < lines.length; i++) {
|
|
||||||
const line = lines[i];
|
|
||||||
if (errorHtmlStart === -1 && line.includes('encodeHTML')) {
|
|
||||||
errorHtmlStart = i;
|
|
||||||
} else if (errorHtmlEnd === -1 && line.includes(')();')) {
|
|
||||||
errorHtmlEnd = i;
|
|
||||||
}
|
|
||||||
if (/\bvar\b/.test(line)) {
|
|
||||||
lines[i] = line.replace(/\bvar\b/g, 'let');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lines.splice(errorHtmlStart, errorHtmlEnd);
|
|
||||||
|
|
||||||
lines[0] = `export default ${lines[0].replace(
|
|
||||||
'(it)',
|
|
||||||
`(it: ${interfaceName}): string`
|
|
||||||
)}`;
|
|
||||||
|
|
||||||
lines.unshift(
|
|
||||||
"import encodeHTML from 'escape-html';",
|
|
||||||
'',
|
|
||||||
...def.split('\n')
|
|
||||||
);
|
|
||||||
|
|
||||||
await Promise.all([writeFile(tsPath, lines.join('\n')), remove(fnPath)]);
|
|
||||||
console.log(
|
|
||||||
`${file} -> ${file.replace(/\.js$/, '.ts')} (${Date.now() - start}ms)`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
process.on('unhandledRejection', err => {
|
|
||||||
console.error('Unhandled Rejection:');
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on('uncaughtException', err => {
|
|
||||||
console.error('Uncaught Exception:');
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
main().catch(err => {
|
|
||||||
console.error(err);
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
||||||
43
packages/cli/scripts/compile-templates.mjs
Normal file
43
packages/cli/scripts/compile-templates.mjs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import execa from 'execa';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import { readFile, writeFile, readdir, unlink } from 'node:fs/promises';
|
||||||
|
|
||||||
|
export async function compileDevTemplates() {
|
||||||
|
const dirRoot = new URL('../', import.meta.url);
|
||||||
|
|
||||||
|
// Compile the `doT.js` template files for `vercel dev`
|
||||||
|
const templatesDir = new URL('src/util/dev/templates/', dirRoot);
|
||||||
|
const dotPacker = fileURLToPath(
|
||||||
|
new URL('../../node_modules/dot/bin/dot-packer', dirRoot)
|
||||||
|
);
|
||||||
|
await execa(process.execPath, [dotPacker], {
|
||||||
|
cwd: templatesDir,
|
||||||
|
stdio: ['ignore', 'ignore', 'inherit'],
|
||||||
|
});
|
||||||
|
|
||||||
|
const files = await readdir(templatesDir);
|
||||||
|
const compiledFiles = files.filter(f => f.endsWith('.js'));
|
||||||
|
|
||||||
|
for (const file of compiledFiles) {
|
||||||
|
const fnPath = new URL(file, templatesDir);
|
||||||
|
const tsPath = fnPath.href.replace(/\.js$/, '.ts');
|
||||||
|
const def = await readFile(
|
||||||
|
new URL(fnPath.href.replace(/\.js$/, '.tsdef')),
|
||||||
|
'utf8'
|
||||||
|
);
|
||||||
|
const interfaceName = def.match(/interface (\w+)/)[1];
|
||||||
|
|
||||||
|
const { default: fn } = await import(fnPath);
|
||||||
|
|
||||||
|
const contents = `import encodeHTML from 'escape-html';
|
||||||
|
|
||||||
|
${def}
|
||||||
|
export default ${fn
|
||||||
|
.toString()
|
||||||
|
.replace(/var encodeHTML.+\(\)\);/s, '')
|
||||||
|
.replace(/\bvar\b/g, 'let')
|
||||||
|
.replace(/\(it\s*\)/s, `(it: ${interfaceName}): string`)}`;
|
||||||
|
|
||||||
|
await Promise.all([writeFile(new URL(tsPath), contents), unlink(fnPath)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,7 +27,7 @@ export const help = () => `
|
|||||||
pull [path] Pull your Project Settings from the cloud
|
pull [path] Pull your Project Settings from the cloud
|
||||||
redeploy [url|id] Rebuild and deploy a previous deployment.
|
redeploy [url|id] Rebuild and deploy a previous deployment.
|
||||||
rollback [url|id] Quickly revert back to a previous deployment
|
rollback [url|id] Quickly revert back to a previous deployment
|
||||||
switch [scope] Switches between teams and your personal account
|
switch [scope] Switches between different scopes
|
||||||
|
|
||||||
${chalk.dim('Advanced')}
|
${chalk.dim('Advanced')}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import {
|
|||||||
NowBuildError,
|
NowBuildError,
|
||||||
Cron,
|
Cron,
|
||||||
validateNpmrc,
|
validateNpmrc,
|
||||||
|
Flag,
|
||||||
} from '@vercel/build-utils';
|
} from '@vercel/build-utils';
|
||||||
import {
|
import {
|
||||||
detectBuilders,
|
detectBuilders,
|
||||||
@@ -93,6 +94,7 @@ interface BuildOutputConfig {
|
|||||||
version: string;
|
version: string;
|
||||||
};
|
};
|
||||||
crons?: Cron[];
|
crons?: Cron[];
|
||||||
|
flags?: Flag[];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -104,6 +106,10 @@ export interface BuildsManifest {
|
|||||||
argv: string[];
|
argv: string[];
|
||||||
error?: any;
|
error?: any;
|
||||||
builds?: SerializedBuilder[];
|
builds?: SerializedBuilder[];
|
||||||
|
features?: {
|
||||||
|
speedInsightsVersion?: string | undefined;
|
||||||
|
webAnalyticsVersion?: string | undefined;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function main(client: Client): Promise<number> {
|
export default async function main(client: Client): Promise<number> {
|
||||||
@@ -247,7 +253,7 @@ export default async function main(client: Client): Promise<number> {
|
|||||||
output.debug(`Loaded environment variables from "${envPath}"`);
|
output.debug(`Loaded environment variables from "${envPath}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// For Vercel Speed Insights support
|
// For Vercel Legacy speed Insights support
|
||||||
if (project.settings.analyticsId) {
|
if (project.settings.analyticsId) {
|
||||||
envToUnset.add('VERCEL_ANALYTICS_ID');
|
envToUnset.add('VERCEL_ANALYTICS_ID');
|
||||||
process.env.VERCEL_ANALYTICS_ID = project.settings.analyticsId;
|
process.env.VERCEL_ANALYTICS_ID = project.settings.analyticsId;
|
||||||
@@ -426,6 +432,29 @@ async function doBuild(
|
|||||||
|
|
||||||
const ops: Promise<Error | void>[] = [];
|
const ops: Promise<Error | void>[] = [];
|
||||||
|
|
||||||
|
const dependencyMap = makeDepencyMap(pkg);
|
||||||
|
const speedInsighsVersion = dependencyMap.get('@vercel/speed-insights');
|
||||||
|
if (speedInsighsVersion) {
|
||||||
|
if (process.env.VERCEL_ANALYTICS_ID) {
|
||||||
|
output.warn(
|
||||||
|
`The \`VERCEL_ANALYTICS_ID\` environment variable is deprecated and will be removed in a future release. Please remove it from your environment variables`
|
||||||
|
);
|
||||||
|
|
||||||
|
delete process.env.VERCEL_ANALYTICS_ID;
|
||||||
|
}
|
||||||
|
buildsJson.features = {
|
||||||
|
...(buildsJson.features ?? {}),
|
||||||
|
speedInsightsVersion: speedInsighsVersion,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const webAnalyticsVersion = dependencyMap.get('@vercel/analytics');
|
||||||
|
if (webAnalyticsVersion) {
|
||||||
|
buildsJson.features = {
|
||||||
|
...(buildsJson.features ?? {}),
|
||||||
|
webAnalyticsVersion: webAnalyticsVersion,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// Write the `detectedBuilders` result to output dir
|
// Write the `detectedBuilders` result to output dir
|
||||||
const buildsJsonBuilds = new Map<Builder, SerializedBuilder>(
|
const buildsJsonBuilds = new Map<Builder, SerializedBuilder>(
|
||||||
builds.map(build => {
|
builds.map(build => {
|
||||||
@@ -627,6 +656,7 @@ async function doBuild(
|
|||||||
const mergedWildcard = mergeWildcard(buildResults.values());
|
const mergedWildcard = mergeWildcard(buildResults.values());
|
||||||
const mergedOverrides: Record<string, PathOverride> =
|
const mergedOverrides: Record<string, PathOverride> =
|
||||||
overrides.length > 0 ? Object.assign({}, ...overrides) : undefined;
|
overrides.length > 0 ? Object.assign({}, ...overrides) : undefined;
|
||||||
|
const mergedFlags = mergeFlags(buildResults.values());
|
||||||
|
|
||||||
const framework = await getFramework(cwd, buildResults);
|
const framework = await getFramework(cwd, buildResults);
|
||||||
|
|
||||||
@@ -640,6 +670,7 @@ async function doBuild(
|
|||||||
overrides: mergedOverrides,
|
overrides: mergedOverrides,
|
||||||
framework,
|
framework,
|
||||||
crons: mergedCrons,
|
crons: mergedCrons,
|
||||||
|
flags: mergedFlags,
|
||||||
};
|
};
|
||||||
await fs.writeJSON(join(outputDir, 'config.json'), config, { spaces: 2 });
|
await fs.writeJSON(join(outputDir, 'config.json'), config, { spaces: 2 });
|
||||||
|
|
||||||
@@ -774,3 +805,22 @@ function mergeWildcard(
|
|||||||
}
|
}
|
||||||
return wildcard;
|
return wildcard;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function mergeFlags(
|
||||||
|
buildResults: Iterable<BuildResult | BuildOutputConfig>
|
||||||
|
): BuildResultV2Typical['flags'] {
|
||||||
|
return Array.from(buildResults).flatMap(result => {
|
||||||
|
if ('flags' in result) {
|
||||||
|
return result.flags ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeDepencyMap(pkg: PackageJson | null): Map<string, string> {
|
||||||
|
return new Map([
|
||||||
|
...Object.entries(pkg?.devDependencies ?? {}),
|
||||||
|
...Object.entries(pkg?.dependencies ?? {}),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,10 +43,7 @@ async function ls(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the list of certificates
|
// Get the list of certificates
|
||||||
const { certs, pagination } = await getCerts(
|
const { certs, pagination } = await getCerts(client, ...paginationOptions);
|
||||||
client,
|
|
||||||
...paginationOptions
|
|
||||||
).catch(err => err);
|
|
||||||
|
|
||||||
output.log(
|
output.log(
|
||||||
`${
|
`${
|
||||||
|
|||||||
@@ -17,12 +17,14 @@ type Options = {};
|
|||||||
|
|
||||||
export default async function buy(
|
export default async function buy(
|
||||||
client: Client,
|
client: Client,
|
||||||
opts: Options,
|
opts: Partial<Options>,
|
||||||
args: string[]
|
args: string[]
|
||||||
) {
|
) {
|
||||||
const { output } = client;
|
const { output } = client;
|
||||||
const { contextName } = await getScope(client);
|
const { contextName } = await getScope(client);
|
||||||
|
|
||||||
|
const skipConfirmation = !!process.env.CI;
|
||||||
|
|
||||||
const [domainName] = args;
|
const [domainName] = args;
|
||||||
if (!domainName) {
|
if (!domainName) {
|
||||||
output.error(
|
output.error(
|
||||||
@@ -78,25 +80,31 @@ export default async function buy(
|
|||||||
'available'
|
'available'
|
||||||
)} to buy under ${chalk.bold(contextName)}! ${availableStamp()}`
|
)} to buy under ${chalk.bold(contextName)}! ${availableStamp()}`
|
||||||
);
|
);
|
||||||
if (
|
|
||||||
!(await promptBool(
|
|
||||||
`Buy now for ${chalk.bold(`$${price}`)} (${`${period}yr${
|
|
||||||
period > 1 ? 's' : ''
|
|
||||||
}`})?`,
|
|
||||||
client
|
|
||||||
))
|
|
||||||
) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const autoRenew = await promptBool(
|
let autoRenew;
|
||||||
renewalPrice.period === 1
|
if (skipConfirmation) {
|
||||||
? `Auto renew yearly for ${chalk.bold(`$${price}`)}?`
|
autoRenew = true;
|
||||||
: `Auto renew every ${renewalPrice.period} years for ${chalk.bold(
|
} else {
|
||||||
`$${price}`
|
if (
|
||||||
)}?`,
|
!(await promptBool(
|
||||||
{ ...client, defaultValue: true }
|
`Buy now for ${chalk.bold(`$${price}`)} (${`${period}yr${
|
||||||
);
|
period > 1 ? 's' : ''
|
||||||
|
}`})?`,
|
||||||
|
client
|
||||||
|
))
|
||||||
|
) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
autoRenew = await promptBool(
|
||||||
|
renewalPrice.period === 1
|
||||||
|
? `Auto renew yearly for ${chalk.bold(`$${price}`)}?`
|
||||||
|
: `Auto renew every ${renewalPrice.period} years for ${chalk.bold(
|
||||||
|
`$${price}`
|
||||||
|
)}?`,
|
||||||
|
{ ...client, defaultValue: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let buyResult;
|
let buyResult;
|
||||||
const purchaseStamp = stamp();
|
const purchaseStamp = stamp();
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ export const domainsCommand: Command = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'move',
|
name: 'move',
|
||||||
description: 'Move a domain to another user or team',
|
description: 'Move a domain to another scope',
|
||||||
arguments: [
|
arguments: [
|
||||||
{
|
{
|
||||||
name: 'name',
|
name: 'name',
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ export default async function move(
|
|||||||
|
|
||||||
const teams = await getTeams(client);
|
const teams = await getTeams(client);
|
||||||
const matchId = await findDestinationMatch(destination, user, teams);
|
const matchId = await findDestinationMatch(destination, user, teams);
|
||||||
|
|
||||||
|
if (matchId && matchId === user.id && user.version === 'northstar') {
|
||||||
|
output.error(`You may not move your domain to your user account.`);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!matchId && !opts['--yes']) {
|
if (!matchId && !opts['--yes']) {
|
||||||
output.warn(
|
output.warn(
|
||||||
`You're not a member of ${param(destination)}. ` +
|
`You're not a member of ${param(destination)}. ` +
|
||||||
|
|||||||
7
packages/cli/src/commands/env/pull.ts
vendored
7
packages/cli/src/commands/env/pull.ts
vendored
@@ -55,6 +55,12 @@ function tryReadHeadSync(path: string, length: number) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const VARIABLES_TO_IGNORE = [
|
||||||
|
'VERCEL_ANALYTICS_ID',
|
||||||
|
'VERCEL_SPEED_INSIGHTS_ID',
|
||||||
|
'VERCEL_WEB_ANALYTICS_ID',
|
||||||
|
];
|
||||||
|
|
||||||
export default async function pull(
|
export default async function pull(
|
||||||
client: Client,
|
client: Client,
|
||||||
link: ProjectLinked,
|
link: ProjectLinked,
|
||||||
@@ -131,6 +137,7 @@ export default async function pull(
|
|||||||
CONTENTS_PREFIX +
|
CONTENTS_PREFIX +
|
||||||
Object.keys(records)
|
Object.keys(records)
|
||||||
.sort()
|
.sort()
|
||||||
|
.filter(key => !VARIABLES_TO_IGNORE.includes(key))
|
||||||
.map(key => `${key}="${escapeValue(records[key])}"`)
|
.map(key => `${key}="${escapeValue(records[key])}"`)
|
||||||
.join('\n') +
|
.join('\n') +
|
||||||
'\n';
|
'\n';
|
||||||
|
|||||||
@@ -19,10 +19,14 @@ import Client from '../../util/client';
|
|||||||
import { LoginResult } from '../../util/login/types';
|
import { LoginResult } from '../../util/login/types';
|
||||||
import { help } from '../help';
|
import { help } from '../help';
|
||||||
import { loginCommand } from './command';
|
import { loginCommand } from './command';
|
||||||
|
import { updateCurrentTeamAfterLogin } from '../../util/login/update-current-team-after-login';
|
||||||
|
|
||||||
export default async function login(client: Client): Promise<number> {
|
export default async function login(client: Client): Promise<number> {
|
||||||
const { output } = client;
|
const { output } = client;
|
||||||
|
|
||||||
|
// user is not currently authenticated on this machine
|
||||||
|
const isInitialLogin = !client.authConfig.token;
|
||||||
|
|
||||||
const argv = getArgs(client.argv.slice(2), {
|
const argv = getArgs(client.argv.slice(2), {
|
||||||
'--oob': Boolean,
|
'--oob': Boolean,
|
||||||
'--github': Boolean,
|
'--github': Boolean,
|
||||||
@@ -67,20 +71,24 @@ export default async function login(client: Client): Promise<number> {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the token was upgraded (not a new login), then don't modify
|
|
||||||
// the current scope.
|
|
||||||
if (!client.authConfig.token) {
|
|
||||||
if (result.teamId) {
|
|
||||||
// SSO login, so set the current scope to the appropriate Team
|
|
||||||
client.config.currentTeam = result.teamId;
|
|
||||||
} else {
|
|
||||||
delete client.config.currentTeam;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the user's authentication token to the configuration file.
|
// Save the user's authentication token to the configuration file.
|
||||||
client.authConfig.token = result.token;
|
client.authConfig.token = result.token;
|
||||||
|
|
||||||
|
if (result.teamId) {
|
||||||
|
client.config.currentTeam = result.teamId;
|
||||||
|
} else {
|
||||||
|
delete client.config.currentTeam;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have a brand new login, update `currentTeam`
|
||||||
|
if (isInitialLogin) {
|
||||||
|
await updateCurrentTeamAfterLogin(
|
||||||
|
client,
|
||||||
|
output,
|
||||||
|
client.config.currentTeam
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
writeToAuthConfigFile(client.authConfig);
|
writeToAuthConfigFile(client.authConfig);
|
||||||
writeToConfigFile(client.config);
|
writeToConfigFile(client.config);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { packageName } from '../../util/pkg-name';
|
|||||||
|
|
||||||
export const logoutCommand: Command = {
|
export const logoutCommand: Command = {
|
||||||
name: 'logout',
|
name: 'logout',
|
||||||
description: 'Logout the current authenticated user or team.',
|
description: 'Logout the current authenticated user.',
|
||||||
arguments: [],
|
arguments: [],
|
||||||
options: [],
|
options: [],
|
||||||
examples: [
|
examples: [
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export const projectCommand: Command = {
|
|||||||
subcommands: [
|
subcommands: [
|
||||||
{
|
{
|
||||||
name: 'ls',
|
name: 'ls',
|
||||||
description: 'Show all projects in the selected team/user',
|
description: 'Show all projects in the selected scope',
|
||||||
arguments: [],
|
arguments: [],
|
||||||
options: [],
|
options: [],
|
||||||
examples: [],
|
examples: [],
|
||||||
@@ -48,7 +48,7 @@ export const projectCommand: Command = {
|
|||||||
name: 'next',
|
name: 'next',
|
||||||
description: 'Show next page of results',
|
description: 'Show next page of results',
|
||||||
argument: 'MS',
|
argument: 'MS',
|
||||||
shorthand: 'n',
|
shorthand: 'N',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
deprecated: false,
|
deprecated: false,
|
||||||
multi: false,
|
multi: false,
|
||||||
|
|||||||
@@ -76,12 +76,23 @@ export default async function redeploy(client: Client): Promise<number> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
output.stopSpinner();
|
output.stopSpinner();
|
||||||
|
|
||||||
|
const isProdDeployment = deployment.target === 'production';
|
||||||
|
const previewUrl = `https://${deployment.url}`;
|
||||||
output.print(
|
output.print(
|
||||||
`${prependEmoji(
|
`${prependEmoji(
|
||||||
`Inspect: ${chalk.bold(deployment.inspectorUrl)} ${deployStamp()}`,
|
`Inspect: ${chalk.bold(deployment.inspectorUrl)} ${deployStamp()}`,
|
||||||
emoji('inspect')
|
emoji('inspect')
|
||||||
)}\n`
|
)}\n`
|
||||||
);
|
);
|
||||||
|
output.print(
|
||||||
|
prependEmoji(
|
||||||
|
`${isProdDeployment ? 'Production' : 'Preview'}: ${chalk.bold(
|
||||||
|
previewUrl
|
||||||
|
)} ${deployStamp()}`,
|
||||||
|
emoji('success')
|
||||||
|
) + `\n`
|
||||||
|
);
|
||||||
|
|
||||||
if (!client.stdout.isTTY) {
|
if (!client.stdout.isTTY) {
|
||||||
client.stdout.write(`https://${deployment.url}`);
|
client.stdout.write(`https://${deployment.url}`);
|
||||||
|
|||||||
96
packages/cli/src/commands/secrets/command.js
Normal file
96
packages/cli/src/commands/secrets/command.js
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import { packageName, getCommandName } from '../../util/pkg-name';
|
||||||
|
|
||||||
|
export const secretsCommand = {
|
||||||
|
name: 'secrets',
|
||||||
|
description: `NOTE: The ${getCommandName(
|
||||||
|
'env'
|
||||||
|
)} command is recommended instead of ${getCommandName('secrets')}`,
|
||||||
|
arguments: [
|
||||||
|
{
|
||||||
|
name: 'command',
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
subcommands: [
|
||||||
|
{
|
||||||
|
name: 'ls',
|
||||||
|
description: 'Show all secrets in a list',
|
||||||
|
arguments: [],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'add',
|
||||||
|
description: 'Add a new secret',
|
||||||
|
arguments: [
|
||||||
|
{
|
||||||
|
name: 'name',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'value',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'rename',
|
||||||
|
description: 'Change the name of a secret',
|
||||||
|
arguments: [
|
||||||
|
{
|
||||||
|
name: 'old-name',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'new-name',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'rm',
|
||||||
|
description: 'Remove a secret',
|
||||||
|
arguments: [
|
||||||
|
{
|
||||||
|
name: 'name',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'next',
|
||||||
|
description: 'Show next page of results',
|
||||||
|
argument: 'MS',
|
||||||
|
shorthand: 'n',
|
||||||
|
type: 'string',
|
||||||
|
deprecated: false,
|
||||||
|
multi: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
name: 'Add a new secret',
|
||||||
|
value: `${packageName} secrets add my-secret "my value"
|
||||||
|
|
||||||
|
- Once added, a secret's value can't be retrieved in plain text anymore
|
||||||
|
- If the secret's value is more than one word, wrap it in quotes
|
||||||
|
- When in doubt, always wrap your value in quotes`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Expose a secret as an environment variable (notice the `@` symbol)',
|
||||||
|
value: `${packageName} -e MY_SECRET=@my-secret`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Paginate results, where 1584722256178 is the time in milliseconds since the UNIX epoch',
|
||||||
|
value: `$ ${packageName} secrets ls --next 1584722256178`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
@@ -1,111 +1,17 @@
|
|||||||
|
import isErrnoException from '@vercel/error-utils';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import table from 'text-table';
|
import table from 'text-table';
|
||||||
import ms from 'ms';
|
import ms from 'ms';
|
||||||
import strlen from '../util/strlen.ts';
|
import strlen from '../../util/strlen';
|
||||||
import { handleError, error } from '../util/error';
|
import { handleError, error } from '../../util/error';
|
||||||
import NowSecrets from '../util/secrets';
|
import NowSecrets from '../../util/secrets';
|
||||||
import exit from '../util/exit';
|
import getScope from '../../util/get-scope';
|
||||||
import getScope from '../util/get-scope.ts';
|
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 { getCommandName } from '../../util/pkg-name';
|
||||||
import { packageName, getCommandName } from '../util/pkg-name.ts';
|
import getArgs from '../../util/get-args';
|
||||||
import getArgs from '../util/get-args';
|
import { help } from '../help';
|
||||||
import { help } from './help';
|
import { secretsCommand } from './command';
|
||||||
|
|
||||||
export const secretsCommand = {
|
|
||||||
name: 'secrets',
|
|
||||||
description: `NOTE: The ${getCommandName(
|
|
||||||
'env'
|
|
||||||
)} command is recommended instead of ${getCommandName('secrets')}`,
|
|
||||||
arguments: [
|
|
||||||
{
|
|
||||||
name: 'command',
|
|
||||||
required: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
subcommands: [
|
|
||||||
{
|
|
||||||
name: 'ls',
|
|
||||||
description: 'Show all secrets in a list',
|
|
||||||
arguments: [],
|
|
||||||
options: [],
|
|
||||||
examples: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'add',
|
|
||||||
description: 'Add a new secret',
|
|
||||||
arguments: [
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'value',
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: [],
|
|
||||||
examples: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'rename',
|
|
||||||
description: 'Change the name of a secret',
|
|
||||||
arguments: [
|
|
||||||
{
|
|
||||||
name: 'old-name',
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'new-name',
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: [],
|
|
||||||
examples: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'rm',
|
|
||||||
description: 'Remove a secret',
|
|
||||||
arguments: [
|
|
||||||
{
|
|
||||||
name: 'name',
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: [],
|
|
||||||
examples: [],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
name: 'next',
|
|
||||||
description: 'Show next page of results',
|
|
||||||
argument: 'MS',
|
|
||||||
shorthand: 'n',
|
|
||||||
type: 'string',
|
|
||||||
deprecated: false,
|
|
||||||
multi: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
examples: [
|
|
||||||
{
|
|
||||||
name: 'Add a new secret',
|
|
||||||
value: `${packageName} secrets add my-secret "my value"
|
|
||||||
|
|
||||||
- Once added, a secret's value can't be retrieved in plain text anymore
|
|
||||||
- If the secret's value is more than one word, wrap it in quotes
|
|
||||||
- When in doubt, always wrap your value in quotes`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Expose a secret as an environment variable (notice the `@` symbol)',
|
|
||||||
value: `${packageName} -e MY_SECRET=@my-secret`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Paginate results, where 1584722256178 is the time in milliseconds since the UNIX epoch',
|
|
||||||
value: `$ ${packageName} secrets ls --next 1584722256178`,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
let argv;
|
let argv;
|
||||||
@@ -130,7 +36,7 @@ const main = async client => {
|
|||||||
client.output.print(
|
client.output.print(
|
||||||
help(secretsCommand, { columns: client.stderr.columns })
|
help(secretsCommand, { columns: client.stderr.columns })
|
||||||
);
|
);
|
||||||
await exit(2);
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -142,9 +48,11 @@ const main = async client => {
|
|||||||
try {
|
try {
|
||||||
({ contextName } = await getScope(client));
|
({ contextName } = await getScope(client));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code === 'NOT_AUTHORIZED' || err.code === 'TEAM_DELETED') {
|
if (isErrnoException(err)) {
|
||||||
output.error(err.message);
|
if (err.code === 'NOT_AUTHORIZED' || err.code === 'TEAM_DELETED') {
|
||||||
return 1;
|
output.error(err.message);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw err;
|
throw err;
|
||||||
@@ -155,7 +63,7 @@ const main = async client => {
|
|||||||
|
|
||||||
export default async client => {
|
export default async client => {
|
||||||
try {
|
try {
|
||||||
await main(client);
|
return await main(client);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
handleError(err);
|
handleError(err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
@@ -218,7 +126,7 @@ async function run({ output, contextName, currentTeam, client }) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (out) {
|
if (out) {
|
||||||
console.log(`\n${out}\n`);
|
client.output.print(`\n${out}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
77
packages/cli/src/commands/teams/command.ts
Normal file
77
packages/cli/src/commands/teams/command.ts
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
import { Command } from '../help';
|
||||||
|
import { packageName } from '../../util/pkg-name';
|
||||||
|
|
||||||
|
export const teamsCommand: Command = {
|
||||||
|
name: 'teams',
|
||||||
|
description: 'Manage teams under your Vercel account',
|
||||||
|
arguments: [],
|
||||||
|
subcommands: [
|
||||||
|
{
|
||||||
|
name: 'add',
|
||||||
|
description: 'Create a new team',
|
||||||
|
arguments: [],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'ls',
|
||||||
|
description: "Show all teams you're a part of",
|
||||||
|
arguments: [],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'switch',
|
||||||
|
description: 'Switch to a different team',
|
||||||
|
arguments: [
|
||||||
|
{
|
||||||
|
name: 'name',
|
||||||
|
required: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'invite',
|
||||||
|
description: 'Invite a new member to a team',
|
||||||
|
arguments: [
|
||||||
|
{
|
||||||
|
name: 'emails',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
options: [],
|
||||||
|
examples: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'next',
|
||||||
|
shorthand: 'N',
|
||||||
|
type: 'string',
|
||||||
|
argument: 'MS',
|
||||||
|
deprecated: false,
|
||||||
|
multi: false,
|
||||||
|
description: 'Show next page of results',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
examples: [
|
||||||
|
{
|
||||||
|
name: "Switch to a team. If your team's url is 'vercel.com/name', then 'name' is the slug. If the slug is omitted, you can choose interactively.",
|
||||||
|
value: `${packageName} teams switch <slug>`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Invite new members (interactively)',
|
||||||
|
value: `${packageName} teams invite`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Invite multiple members simultaneously',
|
||||||
|
value: `${packageName} teams invite abc@vercel.com xyz@vercel.com`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Paginate results, where `1584722256178` is the time in milliseconds since the UNIX epoch.',
|
||||||
|
value: `${packageName} teams ls --next 1584722256178`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
@@ -1,63 +1,12 @@
|
|||||||
import chalk from 'chalk';
|
|
||||||
import error from '../../util/output/error';
|
import error from '../../util/output/error';
|
||||||
import list from './list';
|
import list from './list';
|
||||||
import add from './add';
|
import add from './add';
|
||||||
import change from './switch';
|
import change from './switch';
|
||||||
import invite from './invite';
|
import invite from './invite';
|
||||||
import { packageName, logo } from '../../util/pkg-name';
|
|
||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
|
import { teamsCommand } from './command';
|
||||||
const help = () => {
|
import { help } from '../help';
|
||||||
console.log(`
|
|
||||||
${chalk.bold(`${logo} ${packageName} teams`)} [options] <command>
|
|
||||||
|
|
||||||
${chalk.dim('Commands:')}
|
|
||||||
|
|
||||||
add Create a new team
|
|
||||||
ls Show all teams you're a part of
|
|
||||||
switch [name] Switch to a different team
|
|
||||||
invite [email] Invite a new member to a team
|
|
||||||
|
|
||||||
${chalk.dim('Options:')}
|
|
||||||
|
|
||||||
-h, --help Output usage information
|
|
||||||
-A ${chalk.bold.underline('FILE')}, --local-config=${chalk.bold.underline(
|
|
||||||
'FILE'
|
|
||||||
)} Path to the local ${'`vercel.json`'} file
|
|
||||||
-Q ${chalk.bold.underline('DIR')}, --global-config=${chalk.bold.underline(
|
|
||||||
'DIR'
|
|
||||||
)} Path to the global ${'`.vercel`'} directory
|
|
||||||
-d, --debug Debug mode [off]
|
|
||||||
--no-color No color mode [off]
|
|
||||||
-N, --next Show next page of results
|
|
||||||
|
|
||||||
${chalk.dim('Examples:')}
|
|
||||||
|
|
||||||
${chalk.gray('–')} Switch to a team
|
|
||||||
|
|
||||||
${chalk.cyan(`$ ${packageName} switch <slug>`)}
|
|
||||||
|
|
||||||
${chalk.gray(
|
|
||||||
'–'
|
|
||||||
)} If your team's url is 'vercel.com/teams/name', 'name' is the slug
|
|
||||||
${chalk.gray('–')} If the slug is omitted, you can choose interactively
|
|
||||||
|
|
||||||
${chalk.yellow(
|
|
||||||
'NOTE:'
|
|
||||||
)} When you switch, everything you add, list or remove will be scoped that team!
|
|
||||||
|
|
||||||
${chalk.gray('–')} Invite new members (interactively)
|
|
||||||
|
|
||||||
${chalk.cyan(`$ ${packageName} teams invite`)}
|
|
||||||
|
|
||||||
${chalk.gray('–')} Paginate results, where ${chalk.dim(
|
|
||||||
'`1584722256178`'
|
|
||||||
)} is the time in milliseconds since the UNIX epoch.
|
|
||||||
|
|
||||||
${chalk.cyan(`$ ${packageName} teams ls --next 1584722256178`)}
|
|
||||||
`);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default async (client: Client) => {
|
export default async (client: Client) => {
|
||||||
let subcommand;
|
let subcommand;
|
||||||
@@ -74,7 +23,7 @@ export default async (client: Client) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (argv['--help'] || !subcommand) {
|
if (argv['--help'] || !subcommand) {
|
||||||
help();
|
client.output.print(help(teamsCommand, { columns: client.stderr.columns }));
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +56,9 @@ export default async (client: Client) => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
exitCode = 2;
|
exitCode = 2;
|
||||||
help();
|
client.output.print(
|
||||||
|
help(teamsCommand, { columns: client.stderr.columns })
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return exitCode;
|
return exitCode;
|
||||||
|
|||||||
@@ -39,11 +39,12 @@ export default async function list(client: Client): Promise<number> {
|
|||||||
apiVersion: 2,
|
apiVersion: 2,
|
||||||
});
|
});
|
||||||
let { currentTeam } = config;
|
let { currentTeam } = config;
|
||||||
const accountIsCurrent = !currentTeam;
|
|
||||||
|
|
||||||
output.spinner('Fetching user information');
|
output.spinner('Fetching user information');
|
||||||
const user = await getUser(client);
|
const user = await getUser(client);
|
||||||
|
|
||||||
|
const accountIsCurrent = !currentTeam && user.version !== 'northstar';
|
||||||
|
|
||||||
if (accountIsCurrent) {
|
if (accountIsCurrent) {
|
||||||
currentTeam = user.id;
|
currentTeam = user.id;
|
||||||
}
|
}
|
||||||
@@ -55,12 +56,14 @@ export default async function list(client: Client): Promise<number> {
|
|||||||
current: id === currentTeam ? chars.tick : '',
|
current: id === currentTeam ? chars.tick : '',
|
||||||
}));
|
}));
|
||||||
|
|
||||||
teamList.unshift({
|
if (user.version !== 'northstar') {
|
||||||
id: user.id,
|
teamList.unshift({
|
||||||
name: user.email,
|
id: user.id,
|
||||||
value: user.username || user.email,
|
name: user.email,
|
||||||
current: accountIsCurrent ? chars.tick : '',
|
value: user.username || user.email,
|
||||||
});
|
current: accountIsCurrent ? chars.tick : '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Bring the current Team to the beginning of the list
|
// Bring the current Team to the beginning of the list
|
||||||
if (!accountIsCurrent) {
|
if (!accountIsCurrent) {
|
||||||
@@ -71,18 +74,21 @@ export default async function list(client: Client): Promise<number> {
|
|||||||
|
|
||||||
// Printing
|
// Printing
|
||||||
output.stopSpinner();
|
output.stopSpinner();
|
||||||
console.log(); // empty line
|
client.stdout.write('\n'); // empty line
|
||||||
|
|
||||||
table(
|
table(
|
||||||
['', 'id', 'email / name'],
|
['', 'id', 'email / name'],
|
||||||
teamList.map(team => [team.current, team.value, team.name]),
|
teamList.map(team => [team.current, team.value, team.name]),
|
||||||
[1, 5]
|
[1, 5],
|
||||||
|
(str: string) => {
|
||||||
|
client.stdout.write(str);
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
if (pagination?.count === 20) {
|
if (pagination?.count === 20) {
|
||||||
const flags = getCommandFlags(argv, ['_', '--next', '-N', '-d']);
|
const flags = getCommandFlags(argv, ['_', '--next', '-N', '-d']);
|
||||||
const nextCmd = `${packageName} teams ls${flags} --next ${pagination.next}`;
|
const nextCmd = `${packageName} teams ls${flags} --next ${pagination.next}`;
|
||||||
console.log(); // empty line
|
client.stdout.write('\n'); // empty line
|
||||||
output.log(`To display the next page run ${cmd(nextCmd)}`);
|
output.log(`To display the next page run ${cmd(nextCmd)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,14 +70,21 @@ export default async function main(client: Client, desiredSlug?: string) {
|
|||||||
suffix += ` ${emoji('locked')}`;
|
suffix += ` ${emoji('locked')}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const personalAccountChoice =
|
||||||
|
user.version === 'northstar'
|
||||||
|
? []
|
||||||
|
: [
|
||||||
|
{ separator: 'Personal Account' },
|
||||||
|
{
|
||||||
|
name: `${user.name || user.email} (${user.username})${suffix}`,
|
||||||
|
value: user.username,
|
||||||
|
short: user.username,
|
||||||
|
selected: personalScopeSelected,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
const choices = [
|
const choices = [
|
||||||
{ separator: 'Personal Account' },
|
...personalAccountChoice,
|
||||||
{
|
|
||||||
name: `${user.name || user.email} (${user.username})${suffix}`,
|
|
||||||
value: user.username,
|
|
||||||
short: user.username,
|
|
||||||
selected: personalScopeSelected,
|
|
||||||
},
|
|
||||||
{ separator: 'Teams' },
|
{ separator: 'Teams' },
|
||||||
...teamChoices,
|
...teamChoices,
|
||||||
];
|
];
|
||||||
@@ -97,6 +104,11 @@ export default async function main(client: Client, desiredSlug?: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (desiredSlug === user.username || desiredSlug === user.email) {
|
if (desiredSlug === user.username || desiredSlug === user.email) {
|
||||||
|
if (user.version === 'northstar') {
|
||||||
|
output.error('You cannot set your Personal Account as the scope.');
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Switch to user's personal account
|
// Switch to user's personal account
|
||||||
if (personalScopeSelected) {
|
if (personalScopeSelected) {
|
||||||
output.log('No changes made');
|
output.log('No changes made');
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ try {
|
|||||||
|
|
||||||
import { join } from 'path';
|
import { join } from 'path';
|
||||||
import { existsSync } from 'fs';
|
import { existsSync } from 'fs';
|
||||||
import sourceMap from '@zeit/source-map-support';
|
|
||||||
import { mkdirp } from 'fs-extra';
|
import { mkdirp } from 'fs-extra';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import epipebomb from 'epipebomb';
|
import epipebomb from 'epipebomb';
|
||||||
@@ -56,6 +55,7 @@ import { ProxyAgent } from 'proxy-agent';
|
|||||||
import box from './util/output/box';
|
import box from './util/output/box';
|
||||||
import { execExtension } from './util/extension/exec';
|
import { execExtension } from './util/extension/exec';
|
||||||
import { help } from './args';
|
import { help } from './args';
|
||||||
|
import { updateCurrentTeamAfterLogin } from './util/login/update-current-team-after-login';
|
||||||
|
|
||||||
const VERCEL_DIR = getGlobalPathConfig();
|
const VERCEL_DIR = getGlobalPathConfig();
|
||||||
const VERCEL_CONFIG_PATH = configFiles.getConfigFilePath();
|
const VERCEL_CONFIG_PATH = configFiles.getConfigFilePath();
|
||||||
@@ -65,8 +65,6 @@ const GLOBAL_COMMANDS = new Set(['help']);
|
|||||||
|
|
||||||
epipebomb();
|
epipebomb();
|
||||||
|
|
||||||
sourceMap.install();
|
|
||||||
|
|
||||||
// Configure the error reporting system
|
// Configure the error reporting system
|
||||||
Sentry.init({
|
Sentry.init({
|
||||||
dsn: SENTRY_DSN,
|
dsn: SENTRY_DSN,
|
||||||
@@ -337,17 +335,12 @@ const main = async () => {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.teamId) {
|
|
||||||
// SSO login, so set the current scope to the appropriate Team
|
|
||||||
client.config.currentTeam = result.teamId;
|
|
||||||
} else {
|
|
||||||
delete client.config.currentTeam;
|
|
||||||
}
|
|
||||||
|
|
||||||
// When `result` is a string it's the user's authentication token.
|
// When `result` is a string it's the user's authentication token.
|
||||||
// It needs to be saved to the configuration file.
|
// It needs to be saved to the configuration file.
|
||||||
client.authConfig.token = result.token;
|
client.authConfig.token = result.token;
|
||||||
|
|
||||||
|
await updateCurrentTeamAfterLogin(client, output, result.teamId);
|
||||||
|
|
||||||
configFiles.writeToAuthConfigFile(client.authConfig);
|
configFiles.writeToAuthConfigFile(client.authConfig);
|
||||||
configFiles.writeToConfigFile(client.config);
|
configFiles.writeToConfigFile(client.config);
|
||||||
|
|
||||||
@@ -447,6 +440,11 @@ const main = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (user.id === scope || user.email === scope || user.username === scope) {
|
if (user.id === scope || user.email === scope || user.username === scope) {
|
||||||
|
if (user.version === 'northstar') {
|
||||||
|
output.error('You cannot set your Personal Account as the scope.');
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
delete client.config.currentTeam;
|
delete client.config.currentTeam;
|
||||||
} else {
|
} else {
|
||||||
let teams = [];
|
let teams = [];
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export async function initCorepack({
|
|||||||
const pkgManagerName = pkg.packageManager.split('@')[0];
|
const pkgManagerName = pkg.packageManager.split('@')[0];
|
||||||
// We must explicitly call `corepack enable npm` since `corepack enable`
|
// We must explicitly call `corepack enable npm` since `corepack enable`
|
||||||
// doesn't work with npm. See https://github.com/nodejs/corepack/pull/24
|
// doesn't work with npm. See https://github.com/nodejs/corepack/pull/24
|
||||||
// Also, `corepack enable` is too broad and will change the verison of
|
// Also, `corepack enable` is too broad and will change the version of
|
||||||
// yarn & pnpm even though those versions are not specified by the user.
|
// yarn & pnpm even though those versions are not specified by the user.
|
||||||
// See https://github.com/nodejs/corepack#known-good-releases
|
// See https://github.com/nodejs/corepack#known-good-releases
|
||||||
// Finally, we use `--install-directory` so we can cache the result to
|
// Finally, we use `--install-directory` so we can cache the result to
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import plural from 'pluralize';
|
|||||||
import npa from 'npm-package-arg';
|
import npa from 'npm-package-arg';
|
||||||
import { satisfies } from 'semver';
|
import { satisfies } from 'semver';
|
||||||
import { dirname, join } from 'path';
|
import { dirname, join } from 'path';
|
||||||
|
import { createRequire } from 'module';
|
||||||
import { mkdirp, outputJSON, readJSON, symlink } from 'fs-extra';
|
import { mkdirp, outputJSON, readJSON, symlink } from 'fs-extra';
|
||||||
import { isStaticRuntime } from '@vercel/fs-detectors';
|
import { isStaticRuntime } from '@vercel/fs-detectors';
|
||||||
import { BuilderV2, BuilderV3, PackageJson } from '@vercel/build-utils';
|
import { BuilderV2, BuilderV3, PackageJson } from '@vercel/build-utils';
|
||||||
@@ -28,6 +29,9 @@ type ResolveBuildersResult =
|
|||||||
| { buildersToAdd: Set<string> }
|
| { buildersToAdd: Set<string> }
|
||||||
| { builders: Map<string, BuilderWithPkg> };
|
| { builders: Map<string, BuilderWithPkg> };
|
||||||
|
|
||||||
|
// Get a real `require()` reference that esbuild won't mutate
|
||||||
|
const require_ = createRequire(__filename);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Imports the specified Vercel Builders, installing any missing ones
|
* Imports the specified Vercel Builders, installing any missing ones
|
||||||
* into `.vercel/builders` if necessary.
|
* into `.vercel/builders` if necessary.
|
||||||
@@ -115,10 +119,9 @@ export async function resolveBuilders(
|
|||||||
// If `pkgPath` wasn't found in `.vercel/builders` then try as a CLI local
|
// If `pkgPath` wasn't found in `.vercel/builders` then try as a CLI local
|
||||||
// dependency. `require.resolve()` will throw if the Builder is not a CLI
|
// dependency. `require.resolve()` will throw if the Builder is not a CLI
|
||||||
// dep, in which case we'll install it into `.vercel/builders`.
|
// dep, in which case we'll install it into `.vercel/builders`.
|
||||||
// NOTE: `eval('require')` is necessary to avoid bad transpilation to `__webpack_require__`
|
pkgPath = require_.resolve(`${name}/package.json`, {
|
||||||
pkgPath = eval('require').resolve(`${name}/package.json`, {
|
|
||||||
paths: [__dirname],
|
paths: [__dirname],
|
||||||
}) as string;
|
});
|
||||||
builderPkg = await readJSON(pkgPath);
|
builderPkg = await readJSON(pkgPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,8 +162,7 @@ export async function resolveBuilders(
|
|||||||
|
|
||||||
const path = join(dirname(pkgPath), builderPkg.main || 'index.js');
|
const path = join(dirname(pkgPath), builderPkg.main || 'index.js');
|
||||||
|
|
||||||
// NOTE: `eval('require')` is necessary to avoid bad transpilation to `__webpack_require__`
|
const builder = require_(path);
|
||||||
const builder = eval('require')(path);
|
|
||||||
|
|
||||||
builders.set(spec, {
|
builders.set(spec, {
|
||||||
builder,
|
builder,
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
import isWildcardAlias from '../alias/is-wildcard-alias';
|
|
||||||
import { getCertsForCn } from '../certs/get-certs-for-cn';
|
|
||||||
import Client from '../client';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tries to find the "best" alias url.
|
|
||||||
* @param aliasList
|
|
||||||
*/
|
|
||||||
export async function getPreferredPreviewURL(
|
|
||||||
client: Client,
|
|
||||||
aliasList: string[]
|
|
||||||
) {
|
|
||||||
if (aliasList.length === 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* First checks for non public aliases and non wildcard domains.
|
|
||||||
*/
|
|
||||||
const preferredAliases = aliasList.filter(
|
|
||||||
alias =>
|
|
||||||
!alias.endsWith('.now.sh') &&
|
|
||||||
!alias.endsWith('.vercel.app') &&
|
|
||||||
!isWildcardAlias(alias)
|
|
||||||
);
|
|
||||||
for (const alias of preferredAliases) {
|
|
||||||
const certs = await getCertsForCn(client, alias, { limit: 1 }).catch(() => {
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
if (certs && certs.length > 0) {
|
|
||||||
return { previewUrl: `https://${alias}`, isWildcard: false };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fallback to first alias
|
|
||||||
*/
|
|
||||||
const [firstAlias] = aliasList;
|
|
||||||
if (isWildcardAlias(firstAlias)) {
|
|
||||||
return { previewUrl: firstAlias, isWildcard: true };
|
|
||||||
}
|
|
||||||
|
|
||||||
if (firstAlias.endsWith('.vercel.app') || firstAlias.endsWith('.now.sh')) {
|
|
||||||
return { previewUrl: `https://${firstAlias}`, isWildcard: false };
|
|
||||||
}
|
|
||||||
|
|
||||||
return { previewUrl: `http://${firstAlias}`, isWildcard: false };
|
|
||||||
}
|
|
||||||
@@ -1,20 +1,20 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import type Client from '../client';
|
import type Client from '../client';
|
||||||
import type { Deployment } from '@vercel-internals/types';
|
import type { Deployment } from '@vercel-internals/types';
|
||||||
import { getPreferredPreviewURL } from '../../util/deploy/get-preferred-preview-url';
|
|
||||||
import { isDeploying } from '../../util/deploy/is-deploying';
|
import { isDeploying } from '../../util/deploy/is-deploying';
|
||||||
import linkStyle from '../output/link';
|
import linkStyle from '../output/link';
|
||||||
import { prependEmoji, emoji } from '../../util/emoji';
|
import { prependEmoji, emoji } from '../../util/emoji';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints (to `client.output`) warnings and errors, if any.
|
||||||
|
*/
|
||||||
export async function printDeploymentStatus(
|
export async function printDeploymentStatus(
|
||||||
client: Client,
|
client: Client,
|
||||||
{
|
{
|
||||||
readyState,
|
readyState,
|
||||||
alias: aliasList,
|
|
||||||
aliasError,
|
aliasError,
|
||||||
target,
|
|
||||||
indications,
|
indications,
|
||||||
url: deploymentUrl,
|
|
||||||
aliasWarning,
|
aliasWarning,
|
||||||
}: {
|
}: {
|
||||||
readyState: Deployment['readyState'];
|
readyState: Deployment['readyState'];
|
||||||
@@ -36,7 +36,6 @@ export async function printDeploymentStatus(
|
|||||||
const { output } = client;
|
const { output } = client;
|
||||||
|
|
||||||
indications = indications || [];
|
indications = indications || [];
|
||||||
const isProdDeployment = target === 'production';
|
|
||||||
|
|
||||||
let isStillBuilding = false;
|
let isStillBuilding = false;
|
||||||
if (noWait) {
|
if (noWait) {
|
||||||
@@ -64,30 +63,6 @@ export async function printDeploymentStatus(
|
|||||||
aliasError.message ? `: ${aliasError.message}` : ''
|
aliasError.message ? `: ${aliasError.message}` : ''
|
||||||
}`
|
}`
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
// print preview/production url
|
|
||||||
let previewUrl: string;
|
|
||||||
// if `noWait` is true, then use the deployment url, not an alias
|
|
||||||
if (!noWait && Array.isArray(aliasList) && aliasList.length > 0) {
|
|
||||||
const previewUrlInfo = await getPreferredPreviewURL(client, aliasList);
|
|
||||||
if (previewUrlInfo) {
|
|
||||||
previewUrl = previewUrlInfo.previewUrl;
|
|
||||||
} else {
|
|
||||||
previewUrl = `https://${deploymentUrl}`;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// fallback to deployment url
|
|
||||||
previewUrl = `https://${deploymentUrl}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
output.print(
|
|
||||||
prependEmoji(
|
|
||||||
`${isProdDeployment ? 'Production' : 'Preview'}: ${chalk.bold(
|
|
||||||
previewUrl
|
|
||||||
)} ${deployStamp()}`,
|
|
||||||
emoji('success')
|
|
||||||
) + `\n`
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aliasWarning?.message) {
|
if (aliasWarning?.message) {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
import { Output } from '../output';
|
import { Output } from '../output';
|
||||||
import { progress } from '../output/progress';
|
import { progress } from '../output/progress';
|
||||||
import Now from '../../util';
|
import Now from '../../util';
|
||||||
import type { Org } from '@vercel-internals/types';
|
import type { Deployment, Org } from '@vercel-internals/types';
|
||||||
import ua from '../ua';
|
import ua from '../ua';
|
||||||
import { linkFolderToProject } from '../projects/link';
|
import { linkFolderToProject } from '../projects/link';
|
||||||
import { prependEmoji, emoji } from '../emoji';
|
import { prependEmoji, emoji } from '../emoji';
|
||||||
@@ -17,9 +17,13 @@ import type { Agent } from 'http';
|
|||||||
|
|
||||||
function printInspectUrl(
|
function printInspectUrl(
|
||||||
output: Output,
|
output: Output,
|
||||||
inspectorUrl: string,
|
inspectorUrl: string | null | undefined,
|
||||||
deployStamp: () => string
|
deployStamp: () => string
|
||||||
) {
|
) {
|
||||||
|
if (!inspectorUrl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
output.print(
|
output.print(
|
||||||
prependEmoji(
|
prependEmoji(
|
||||||
`Inspect: ${chalk.bold(inspectorUrl)} ${deployStamp()}`,
|
`Inspect: ${chalk.bold(inspectorUrl)} ${deployStamp()}`,
|
||||||
@@ -162,33 +166,47 @@ export default async function processDeployment({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (event.type === 'created') {
|
if (event.type === 'created') {
|
||||||
|
const deployment: Deployment = event.payload;
|
||||||
|
|
||||||
await linkFolderToProject(
|
await linkFolderToProject(
|
||||||
client,
|
client,
|
||||||
cwd,
|
cwd,
|
||||||
{
|
{
|
||||||
orgId: org.id,
|
orgId: org.id,
|
||||||
projectId: event.payload.projectId,
|
projectId: deployment.projectId!,
|
||||||
},
|
},
|
||||||
projectName,
|
projectName,
|
||||||
org.slug
|
org.slug
|
||||||
);
|
);
|
||||||
|
|
||||||
now.url = event.payload.url;
|
now.url = deployment.url;
|
||||||
|
|
||||||
output.stopSpinner();
|
output.stopSpinner();
|
||||||
|
|
||||||
printInspectUrl(output, event.payload.inspectorUrl, deployStamp);
|
printInspectUrl(output, deployment.inspectorUrl, deployStamp);
|
||||||
|
|
||||||
|
const isProdDeployment = requestBody.target === 'production';
|
||||||
|
const previewUrl = `https://${deployment.url}`;
|
||||||
|
|
||||||
|
output.print(
|
||||||
|
prependEmoji(
|
||||||
|
`${isProdDeployment ? 'Production' : 'Preview'}: ${chalk.bold(
|
||||||
|
previewUrl
|
||||||
|
)} ${deployStamp()}`,
|
||||||
|
emoji('success')
|
||||||
|
) + `\n`
|
||||||
|
);
|
||||||
|
|
||||||
if (quiet) {
|
if (quiet) {
|
||||||
process.stdout.write(`https://${event.payload.url}`);
|
process.stdout.write(`https://${event.payload.url}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (noWait) {
|
if (noWait) {
|
||||||
return event.payload;
|
return deployment;
|
||||||
}
|
}
|
||||||
|
|
||||||
output.spinner(
|
output.spinner(
|
||||||
event.payload.readyState === 'QUEUED' ? 'Queued' : 'Building',
|
deployment.readyState === 'QUEUED' ? 'Queued' : 'Building',
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -243,6 +261,7 @@ export default async function processDeployment({
|
|||||||
|
|
||||||
// Handle alias-assigned event
|
// Handle alias-assigned event
|
||||||
if (event.type === 'alias-assigned') {
|
if (event.type === 'alias-assigned') {
|
||||||
|
output.stopSpinner();
|
||||||
event.payload.indications = indications;
|
event.payload.indications = indications;
|
||||||
return event.payload;
|
return event.payload;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -790,11 +790,10 @@ export default class DevServer {
|
|||||||
|
|
||||||
const merged: Env = { ...env, ...localEnv };
|
const merged: Env = { ...env, ...localEnv };
|
||||||
|
|
||||||
// Validate that the env var name matches what AWS Lambda allows:
|
// Validate that the env var name satisfies what Vercel's platform accepts.
|
||||||
// - https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html
|
|
||||||
let hasInvalidName = false;
|
let hasInvalidName = false;
|
||||||
for (const key of Object.keys(merged)) {
|
for (const key of Object.keys(merged)) {
|
||||||
if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(key)) {
|
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {
|
||||||
this.output.warn(
|
this.output.warn(
|
||||||
`Ignoring ${type
|
`Ignoring ${type
|
||||||
.split('.')
|
.split('.')
|
||||||
@@ -808,7 +807,7 @@ export default class DevServer {
|
|||||||
}
|
}
|
||||||
if (hasInvalidName) {
|
if (hasInvalidName) {
|
||||||
this.output.log(
|
this.output.log(
|
||||||
'Env var names must start with letters, and can only contain alphanumeric characters and underscores'
|
'The name contains invalid characters. Only letters, digits, and underscores are allowed. Furthermore, the name should not start with a digit'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1319,6 +1318,11 @@ export default class DevServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!match && status && phase !== 'miss') {
|
if (!match && status && phase !== 'miss') {
|
||||||
|
if (routeResult.userDest) {
|
||||||
|
// If it's a user defined route then we continue routing
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
this.output.debug(`Route found with with status code ${status}`);
|
this.output.debug(`Route found with with status code ${status}`);
|
||||||
await this.sendError(req, res, requestId, '', status, headers);
|
await this.sendError(req, res, requestId, '', status, headers);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user