mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-23 09:59:12 +00:00
Compare commits
217 Commits
@vercel/st
...
@vercel/go
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2de365f9cf | ||
|
|
fb6fe46158 | ||
|
|
bfebfc28e1 | ||
|
|
9e183b2e8d | ||
|
|
0490a7733b | ||
|
|
65a6e713c8 | ||
|
|
fda76691d1 | ||
|
|
007e48c1cd | ||
|
|
954536e681 | ||
|
|
c52220ab72 | ||
|
|
545f82603f | ||
|
|
032df14c79 | ||
|
|
604f3b8d83 | ||
|
|
c0380cac5a | ||
|
|
7082da8451 | ||
|
|
20a7b2f2d4 | ||
|
|
a5c3cbcd45 | ||
|
|
6dded87426 | ||
|
|
a63b9d960b | ||
|
|
3cefbb19fe | ||
|
|
f43894ef4e | ||
|
|
2081f10b22 | ||
|
|
b52df7a533 | ||
|
|
ec89436417 | ||
|
|
993a404311 | ||
|
|
3e7bcb2073 | ||
|
|
ed119d6a33 | ||
|
|
2aeddde7d5 | ||
|
|
a8eab6beb7 | ||
|
|
031c182896 | ||
|
|
38eb0bca04 | ||
|
|
732ac2072c | ||
|
|
64d9cef963 | ||
|
|
6b9e274bc7 | ||
|
|
a2da071755 | ||
|
|
14ece4111a | ||
|
|
e302631ded | ||
|
|
43a57a3a60 | ||
|
|
136077ab6f | ||
|
|
8634f9cd7e | ||
|
|
dc8523998c | ||
|
|
925c8ba18c | ||
|
|
19804b78a9 | ||
|
|
f774d5f7a2 | ||
|
|
9bf8a68685 | ||
|
|
294935a9c5 | ||
|
|
778c287964 | ||
|
|
7a9a519517 | ||
|
|
52b2892b80 | ||
|
|
ee4ba6ccbe | ||
|
|
07a09b7880 | ||
|
|
b62c40586a | ||
|
|
d07eb34e38 | ||
|
|
46d0503361 | ||
|
|
349df907a8 | ||
|
|
e5f5ba0ae8 | ||
|
|
b2ccbf4881 | ||
|
|
434c794713 | ||
|
|
d8f5052d9a | ||
|
|
10d14488db | ||
|
|
c29f2b2fbd | ||
|
|
46348201b4 | ||
|
|
509926545e | ||
|
|
70c8b32cf0 | ||
|
|
54514a44af | ||
|
|
0db8fadf74 | ||
|
|
6f01e5ab75 | ||
|
|
78d45f9e7e | ||
|
|
22e1a6a9ce | ||
|
|
8391734b5e | ||
|
|
6a7fa1526c | ||
|
|
64b15d2409 | ||
|
|
40f73e7978 | ||
|
|
4c9ca27195 | ||
|
|
a847ef43fd | ||
|
|
3b466232a9 | ||
|
|
efdeea9db2 | ||
|
|
ab9915af32 | ||
|
|
d6dc27638c | ||
|
|
0fb0601d19 | ||
|
|
ce25dec97d | ||
|
|
20bd71ce70 | ||
|
|
4c77dab5cb | ||
|
|
151b0dfb63 | ||
|
|
42e9bbea5b | ||
|
|
c0471302e9 | ||
|
|
b2c68f1301 | ||
|
|
9712640fe3 | ||
|
|
0dd3711f63 | ||
|
|
4b657debed | ||
|
|
ffdca76155 | ||
|
|
af7b34aa45 | ||
|
|
e210977a9c | ||
|
|
1c2ef37173 | ||
|
|
65bbcd3e62 | ||
|
|
5caf73380d | ||
|
|
395929b36a | ||
|
|
0e235a926a | ||
|
|
f1bdc0bfd1 | ||
|
|
59ca86365c | ||
|
|
13d54b2095 | ||
|
|
bada86b8d6 | ||
|
|
7ec377757d | ||
|
|
8040c8806b | ||
|
|
2b1c8d89d4 | ||
|
|
c5e9ccfacf | ||
|
|
66fe3db888 | ||
|
|
765ec05cea | ||
|
|
413706d72a | ||
|
|
9bc8817f92 | ||
|
|
9da41dcafa | ||
|
|
f1ab5704f1 | ||
|
|
d8cf3e8831 | ||
|
|
c06209901c | ||
|
|
f20756344e | ||
|
|
21a440b832 | ||
|
|
48d925f105 | ||
|
|
011f6ff150 | ||
|
|
cd09a38c19 | ||
|
|
af239b5fa5 | ||
|
|
38244c8ed6 | ||
|
|
57e8ec13cf | ||
|
|
2e8423e24e | ||
|
|
a92c68e0ff | ||
|
|
84f3a5bc1b | ||
|
|
186bd9bb51 | ||
|
|
9ae84ba05f | ||
|
|
a638755e95 | ||
|
|
15eb018f84 | ||
|
|
7f89aca52c | ||
|
|
dc9ec1bc6d | ||
|
|
df93b01248 | ||
|
|
fb37ad22ab | ||
|
|
684f69bc5b | ||
|
|
ddae78458d | ||
|
|
fc614a7a92 | ||
|
|
6e4ea0774e | ||
|
|
cfc1c9e818 | ||
|
|
62a872fc0e | ||
|
|
03b5bfbaa2 | ||
|
|
aa305e5c66 | ||
|
|
2309c43fce | ||
|
|
0bbb06daa7 | ||
|
|
61de63d285 | ||
|
|
1ca3704297 | ||
|
|
ae4180b287 | ||
|
|
40081cb319 | ||
|
|
9200be61d2 | ||
|
|
1390f6d2ee | ||
|
|
b78cfc9ba5 | ||
|
|
803a9363f9 | ||
|
|
4a0a3b64a2 | ||
|
|
347c2de3a2 | ||
|
|
a05cc11719 | ||
|
|
55b999ea9b | ||
|
|
8babc3694f | ||
|
|
6dc0321216 | ||
|
|
3df8c05792 | ||
|
|
e0f8bc9820 | ||
|
|
ebd2e1822c | ||
|
|
31bc2581f3 | ||
|
|
96759a9fda | ||
|
|
ad2864bca5 | ||
|
|
40fbc993d7 | ||
|
|
1f30e56a6d | ||
|
|
58d6268899 | ||
|
|
4e6659ace7 | ||
|
|
769234b6a6 | ||
|
|
53cab61e88 | ||
|
|
3a65acfb32 | ||
|
|
48eed7532a | ||
|
|
f09d6fce85 | ||
|
|
cc82c499db | ||
|
|
f0bc207717 | ||
|
|
151c7f99ee | ||
|
|
61c2c494bf | ||
|
|
7f49816129 | ||
|
|
7845bef826 | ||
|
|
7acb2e4b07 | ||
|
|
abea002e93 | ||
|
|
2db9678bd4 | ||
|
|
05f942c53f | ||
|
|
6c5f0b7aa0 | ||
|
|
fea05383b9 | ||
|
|
247f49f765 | ||
|
|
231714c71b | ||
|
|
73d6f0d0fa | ||
|
|
34d199bd49 | ||
|
|
1dd421e1f6 | ||
|
|
a91690fb8a | ||
|
|
264437c751 | ||
|
|
b8cce66eff | ||
|
|
cbad57d14f | ||
|
|
4da176d26f | ||
|
|
1f51e04387 | ||
|
|
756174714f | ||
|
|
6e32832f94 | ||
|
|
e682e9cd7d | ||
|
|
b30f000d2a | ||
|
|
f78051ada9 | ||
|
|
10bc74904c | ||
|
|
c8f7a9a874 | ||
|
|
2fd3315221 | ||
|
|
54ef027cbe | ||
|
|
6620c7f600 | ||
|
|
38f40f1c15 | ||
|
|
63211b8b89 | ||
|
|
83ee5ea2b8 | ||
|
|
f063645646 | ||
|
|
4f8c5e344d | ||
|
|
70a53515bd | ||
|
|
4d4f0fa672 | ||
|
|
46c0fd153a | ||
|
|
1c8b4717e3 | ||
|
|
d52d26eaac | ||
|
|
db65728fc4 | ||
|
|
a788d06f85 |
@@ -26,12 +26,6 @@ packages/hydrogen/edge-entry.js
|
|||||||
packages/next/test/integration/middleware
|
packages/next/test/integration/middleware
|
||||||
packages/next/test/integration/middleware-eval
|
packages/next/test/integration/middleware-eval
|
||||||
|
|
||||||
# node-bridge
|
|
||||||
packages/node-bridge/bridge.js
|
|
||||||
packages/node-bridge/launcher.js
|
|
||||||
packages/node-bridge/helpers.js
|
|
||||||
packages/node-bridge/source-map-support.js
|
|
||||||
|
|
||||||
# middleware
|
# middleware
|
||||||
packages/middleware/src/entries.js
|
packages/middleware/src/entries.js
|
||||||
|
|
||||||
|
|||||||
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -4,7 +4,6 @@
|
|||||||
* @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood
|
* @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood
|
||||||
/.github/workflows @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @ijjk
|
/.github/workflows @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @ijjk
|
||||||
/packages/fs-detectors @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @agadzik @chloetedder
|
/packages/fs-detectors @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @agadzik @chloetedder
|
||||||
/packages/node-bridge @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @ijjk
|
|
||||||
/packages/next @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @ijjk
|
/packages/next @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @ijjk
|
||||||
/packages/routing-utils @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @ijjk
|
/packages/routing-utils @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @ijjk
|
||||||
/packages/edge @vercel/edge-compute
|
/packages/edge @vercel/edge-compute
|
||||||
@@ -14,3 +13,4 @@
|
|||||||
/examples/hugo @styfle
|
/examples/hugo @styfle
|
||||||
/examples/jekyll @styfle
|
/examples/jekyll @styfle
|
||||||
/examples/zola @styfle
|
/examples/zola @styfle
|
||||||
|
/packages/node @TooTallNate @EndangeredMassa @styfle @cb1kenobi @Ethan-Arrowood @Kikobeats
|
||||||
|
|||||||
10
.github/DISCUSSION_TEMPLATE/general.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/general.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
10
.github/DISCUSSION_TEMPLATE/help.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/help.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions/categories/help)
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Problem Description
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
10
.github/DISCUSSION_TEMPLATE/ideas.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/ideas.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions/categories/ideas)
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Idea
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
10
.github/DISCUSSION_TEMPLATE/polls.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/polls.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
10
.github/DISCUSSION_TEMPLATE/show-and-tell.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/show-and-tell.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
5
.github/DISCUSSION_TEMPLATE/temporary.yml
vendored
Normal file
5
.github/DISCUSSION_TEMPLATE/temporary.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
> **Note**: This category should not be used for new discussions. Please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||||
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -4,8 +4,8 @@ contact_links:
|
|||||||
url: https://vercel.com/support/request
|
url: https://vercel.com/support/request
|
||||||
about: Report a bug using the Vercel support form
|
about: Report a bug using the Vercel support form
|
||||||
- name: Feature Request
|
- name: Feature Request
|
||||||
url: https://github.com/vercel/vercel/discussions/new?category=ideas
|
url: https://github.com/orgs/vercel/discussions/new?category=ideas
|
||||||
about: Share ideas for new features
|
about: Share ideas for new features
|
||||||
- name: Ask a Question
|
- name: Ask a Question
|
||||||
url: https://github.com/vercel/vercel/discussions/new?category=help
|
url: https://github.com/orgs/vercel/discussions/new?category=help
|
||||||
about: Ask the community for help
|
about: Ask the community for help
|
||||||
|
|||||||
34
.github/workflows/cron-update-gatsby-fixtures.yml
vendored
Normal file
34
.github/workflows/cron-update-gatsby-fixtures.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: Cron Update Gatsby Fixtures
|
||||||
|
|
||||||
|
on:
|
||||||
|
# Allow manual runs
|
||||||
|
workflow_dispatch:
|
||||||
|
# Run once a week https://crontab.guru/once-a-week
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * 0'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-gatsby-fixtures:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
# 0 means fetch all commits so we can commit and push in the script below
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 14
|
||||||
|
- name: Enable corepack
|
||||||
|
run: corepack enable pnpm
|
||||||
|
- name: Update Gatsby Fixtures
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
|
# See https://github.com/actions/github-script#run-a-separate-file-with-an-async-function
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
|
script: |
|
||||||
|
const script = require('./utils/update-gatsby-fixtures.js')
|
||||||
|
await script({ github, context })
|
||||||
1
.github/workflows/cron-update-next.yml
vendored
1
.github/workflows/cron-update-next.yml
vendored
@@ -25,6 +25,7 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
# See https://github.com/actions/github-script#run-a-separate-file-with-an-async-function
|
# See https://github.com/actions/github-script#run-a-separate-file-with-an-async-function
|
||||||
with:
|
with:
|
||||||
|
github-token: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
script: |
|
script: |
|
||||||
const script = require('./utils/update-next.js')
|
const script = require('./utils/update-next.js')
|
||||||
await script({ github, context })
|
await script({ github, context })
|
||||||
|
|||||||
1
.github/workflows/cron-update-turbo.yml
vendored
1
.github/workflows/cron-update-turbo.yml
vendored
@@ -25,6 +25,7 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
# See https://github.com/actions/github-script#run-a-separate-file-with-an-async-function
|
# See https://github.com/actions/github-script#run-a-separate-file-with-an-async-function
|
||||||
with:
|
with:
|
||||||
|
github-token: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
script: |
|
script: |
|
||||||
const script = require('./utils/update-turbo.js')
|
const script = require('./utils/update-turbo.js')
|
||||||
await script({ github, context })
|
await script({ github, context })
|
||||||
|
|||||||
102
.github/workflows/publish.yml
vendored
102
.github/workflows/publish.yml
vendored
@@ -3,9 +3,9 @@ name: Publish
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
tags:
|
tags:
|
||||||
- '!*'
|
- '!*'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
TURBO_REMOTE_ONLY: 'true'
|
TURBO_REMOTE_ONLY: 'true'
|
||||||
@@ -16,46 +16,60 @@ jobs:
|
|||||||
publish:
|
publish:
|
||||||
name: Publish
|
name: Publish
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
id-token: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Check Release
|
- name: Check Release
|
||||||
id: check-release
|
id: check-release
|
||||||
run: |
|
run: |
|
||||||
tag="$(git describe --tags --exact-match 2> /dev/null || :)"
|
tag="$(git describe --tags --exact-match 2> /dev/null || :)"
|
||||||
if [[ -z "$tag" ]];
|
if [[ -z "$tag" ]];
|
||||||
then
|
then
|
||||||
echo "IS_RELEASE=false" >> $GITHUB_OUTPUT
|
echo "IS_RELEASE=false" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
echo "IS_RELEASE=true" >> $GITHUB_OUTPUT
|
echo "IS_RELEASE=true" >> $GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '1.13.15'
|
go-version: '1.13.15'
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 16
|
node-version: 16
|
||||||
- name: install pnpm@7.24.2
|
- name: install npm@9
|
||||||
run: npm i -g pnpm@7.24.2
|
run: npm i -g npm@9
|
||||||
- name: Install
|
- name: install pnpm@8.3.1
|
||||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
run: npm i -g pnpm@8.3.1
|
||||||
run: pnpm install
|
- name: Install
|
||||||
- name: Build
|
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
run: pnpm install
|
||||||
run: pnpm build
|
- name: Build
|
||||||
env:
|
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||||
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
run: pnpm build
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
env:
|
||||||
- name: Publish
|
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
||||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
run: pnpm publish-from-github
|
- name: Publish
|
||||||
env:
|
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }}
|
run: pnpm publish-from-github
|
||||||
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
env:
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
NPM_CONFIG_PROVENANCE: 'true'
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }}
|
||||||
|
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
||||||
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
|
- name: Trigger Update
|
||||||
|
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
|
script: |
|
||||||
|
const script = require('./utils/trigger-update-workflow.js')
|
||||||
|
await script({ github, context })
|
||||||
|
|||||||
47
.github/workflows/test-integration-cli.yml
vendored
47
.github/workflows/test-integration-cli.yml
vendored
@@ -1,47 +0,0 @@
|
|||||||
name: CLI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
tags:
|
|
||||||
- '!*'
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
env:
|
|
||||||
TURBO_REMOTE_ONLY: 'true'
|
|
||||||
TURBO_TEAM: 'vercel'
|
|
||||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: CLI
|
|
||||||
timeout-minutes: 40
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest]
|
|
||||||
node: [16]
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 2
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: '1.18'
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node }}
|
|
||||||
- name: install pnpm@7.24.2
|
|
||||||
run: npm i -g pnpm@7.24.2
|
|
||||||
- run: pnpm install
|
|
||||||
- run: pnpm run build
|
|
||||||
- run: pnpm test-cli
|
|
||||||
env:
|
|
||||||
VERCEL_TEST_TOKEN: ${{ secrets.VERCEL_TEST_TOKEN }}
|
|
||||||
VERCEL_TEST_REGISTRATION_URL: ${{ secrets.VERCEL_TEST_REGISTRATION_URL }}
|
|
||||||
35
.github/workflows/test-lint.yml
vendored
Normal file
35
.github/workflows/test-lint.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
tags:
|
||||||
|
- '!*'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
env:
|
||||||
|
TURBO_REMOTE_ONLY: 'true'
|
||||||
|
TURBO_TEAM: 'vercel'
|
||||||
|
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||||
|
NODE_VERSION: '16'
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Lint
|
||||||
|
timeout-minutes: 10
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
|
- name: install pnpm@8.3.1
|
||||||
|
run: npm i -g pnpm@8.3.1
|
||||||
|
- run: pnpm install
|
||||||
|
- run: pnpm run lint
|
||||||
|
- run: pnpm run prettier-check
|
||||||
50
.github/workflows/test-unit.yml
vendored
50
.github/workflows/test-unit.yml
vendored
@@ -1,50 +0,0 @@
|
|||||||
name: Unit
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
tags:
|
|
||||||
- '!*'
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
env:
|
|
||||||
TURBO_REMOTE_ONLY: 'true'
|
|
||||||
TURBO_TEAM: 'vercel'
|
|
||||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: Unit
|
|
||||||
timeout-minutes: 20
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
||||||
node: [16]
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: '1.13.15'
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 2
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node }}
|
|
||||||
- name: install pnpm@7.24.2
|
|
||||||
run: npm i -g pnpm@7.24.2
|
|
||||||
- run: pnpm install
|
|
||||||
- run: pnpm run build
|
|
||||||
- run: pnpm run lint
|
|
||||||
if: matrix.os == 'ubuntu-latest' && matrix.node == 14 # only run lint once
|
|
||||||
- run: pnpm run test-unit
|
|
||||||
- run: pnpm -C packages/cli run coverage
|
|
||||||
if: matrix.os == 'ubuntu-latest' && matrix.node == 14 # only run coverage once
|
|
||||||
env:
|
|
||||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
26
.github/workflows/test.yml
vendored
26
.github/workflows/test.yml
vendored
@@ -3,9 +3,9 @@ name: Tests
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
tags:
|
tags:
|
||||||
- '!*'
|
- '!*'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
@@ -29,14 +29,11 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: '1.13.15'
|
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
- name: install pnpm@7.24.2
|
- name: install pnpm@8.3.1
|
||||||
run: npm i -g pnpm@7.24.2
|
run: npm i -g pnpm@8.3.1
|
||||||
- run: pnpm install
|
- run: pnpm install
|
||||||
- id: set-tests
|
- id: set-tests
|
||||||
run: |
|
run: |
|
||||||
@@ -66,9 +63,6 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: '1.13.15'
|
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
@@ -77,11 +71,15 @@ jobs:
|
|||||||
if: matrix.runner == 'macos-latest'
|
if: matrix.runner == 'macos-latest'
|
||||||
run: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/cli/test/dev/fixtures/08-hugo/
|
run: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/cli/test/dev/fixtures/08-hugo/
|
||||||
|
|
||||||
- name: install pnpm@7.24.2
|
- name: install pnpm@8.3.1
|
||||||
run: npm i -g pnpm@7.24.2
|
run: npm i -g pnpm@8.3.1
|
||||||
|
|
||||||
- run: pnpm install
|
- run: pnpm install
|
||||||
|
|
||||||
|
- name: fetch ssl certificate before build (linux, os x)
|
||||||
|
if: matrix.runner != 'windows-latest'
|
||||||
|
run: echo | openssl s_client -showcerts -servername 'api.vercel.com' -connect 76.76.21.21:443
|
||||||
|
|
||||||
- name: Build ${{matrix.packageName}} and all its dependencies
|
- name: Build ${{matrix.packageName}} and all its dependencies
|
||||||
run: node utils/gen.js && node_modules/.bin/turbo run build --cache-dir=".turbo" --scope=${{matrix.packageName}} --include-dependencies --no-deps
|
run: node utils/gen.js && node_modules/.bin/turbo run build --cache-dir=".turbo" --scope=${{matrix.packageName}} --include-dependencies --no-deps
|
||||||
env:
|
env:
|
||||||
@@ -95,6 +93,10 @@ jobs:
|
|||||||
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: fetch ssl certificate after tests (linux, os x)
|
||||||
|
if: matrix.runner != 'windows-latest'
|
||||||
|
run: echo | openssl s_client -showcerts -servername 'api.vercel.com' -connect 76.76.21.21:443
|
||||||
|
|
||||||
conclusion:
|
conclusion:
|
||||||
needs:
|
needs:
|
||||||
- test
|
- test
|
||||||
|
|||||||
28
.github/workflows/update-remix-run-dev.yml
vendored
Normal file
28
.github/workflows/update-remix-run-dev.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
name: Update @remix-run/dev
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
new-version:
|
||||||
|
type: string
|
||||||
|
description: 'Optional version to update @remix-run/dev to inside of @vercel/remix-builder'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-remix-run-dev:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
- name: Enable corepack
|
||||||
|
run: corepack enable pnpm
|
||||||
|
- name: Update @remix-run/dev
|
||||||
|
uses: actions/github-script@v6
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GH_TOKEN_PULL_REQUESTS }}
|
||||||
|
script: |
|
||||||
|
const script = require('./utils/update-remix-run-dev.js')
|
||||||
|
await script({ github, context }, "${{ inputs.new-version }}")
|
||||||
1
.npmrc
1
.npmrc
@@ -1,3 +1,4 @@
|
|||||||
|
provenance=true
|
||||||
save-exact=true
|
save-exact=true
|
||||||
hoist-pattern[]=!"**/@types/**"
|
hoist-pattern[]=!"**/@types/**"
|
||||||
hoist-pattern[]=!"**/typedoc"
|
hoist-pattern[]=!"**/typedoc"
|
||||||
|
|||||||
@@ -7,3 +7,28 @@ examples/sveltekit-1
|
|||||||
|
|
||||||
# gatsby-plugin-vercel-analytics
|
# gatsby-plugin-vercel-analytics
|
||||||
packages/gatsby-plugin-vercel-analytics
|
packages/gatsby-plugin-vercel-analytics
|
||||||
|
|
||||||
|
# ignore directories that are not source code
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
pnpm-lock.yaml
|
||||||
|
.vscode
|
||||||
|
.DS_Store
|
||||||
|
.next
|
||||||
|
.vercel
|
||||||
|
.turbo
|
||||||
|
.eslintcache
|
||||||
|
.output
|
||||||
|
.vercel_build_output
|
||||||
|
.vercel
|
||||||
|
coverage
|
||||||
|
turbo-cache-key.json
|
||||||
|
/examples
|
||||||
|
/public
|
||||||
|
packages/*/dist
|
||||||
|
packages/*/node_modules
|
||||||
|
packages/**/test/fixtures
|
||||||
|
packages/**/test/dev/fixtures
|
||||||
|
packages/**/test/build-fixtures
|
||||||
|
packages/**/test/cache-fixtures
|
||||||
|
|
||||||
|
|||||||
@@ -79,18 +79,23 @@ project. An example use-case is that `@vercel/node` uses this function to cache
|
|||||||
the `node_modules` directory, making it faster to install npm dependencies for
|
the `node_modules` directory, making it faster to install npm dependencies for
|
||||||
future builds.
|
future builds.
|
||||||
|
|
||||||
|
> Note: Only files within the repo root directory can be cached.
|
||||||
|
|
||||||
**Example:**
|
**Example:**
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { PrepareCacheOptions } from '@vercel/build-utils';
|
import { relative } from 'path';
|
||||||
|
import { glob, PrepareCache } from '@vercel/build-utils';
|
||||||
|
|
||||||
export async function prepareCache(options: PrepareCacheOptions) {
|
export const prepareCache: PrepareCache = async ({
|
||||||
|
workPath,
|
||||||
|
repoRootPath,
|
||||||
|
}) => {
|
||||||
// Create a mapping of file names and `File` object instances to cache here…
|
// Create a mapping of file names and `File` object instances to cache here…
|
||||||
|
const rootDirectory = relative(repoRootPath, workPath);
|
||||||
return {
|
const cache = await glob(`${rootDirectory}/some/dir/**`, repoRootPath);
|
||||||
'path-to-file': File,
|
return cache;
|
||||||
};
|
};
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### `shouldServe()`
|
### `shouldServe()`
|
||||||
|
|||||||
@@ -51,8 +51,11 @@ export async function getGitHubRepoInfo(repo: Repo) {
|
|||||||
data.subdir = repo.path.slice(subdirPath.length).split('/');
|
data.subdir = repo.path.slice(subdirPath.length).split('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.id === 'vercel/vercel' && data.subdir && data.subdir[0] === 'examples') {
|
if (
|
||||||
|
data.id === 'vercel/vercel' &&
|
||||||
|
data.subdir &&
|
||||||
|
data.subdir[0] === 'examples'
|
||||||
|
) {
|
||||||
// from our examples, add `homepage` and `description` fields
|
// from our examples, add `homepage` and `description` fields
|
||||||
const example = data.subdir[1];
|
const example = data.subdir[1];
|
||||||
const exampleList = await getExampleList();
|
const exampleList = await getExampleList();
|
||||||
|
|||||||
@@ -33,7 +33,12 @@ async function main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const existingExamples = exampleDirs
|
const existingExamples = exampleDirs
|
||||||
.filter(dir => dir.isDirectory())
|
.filter(
|
||||||
|
dir =>
|
||||||
|
dir.isDirectory() &&
|
||||||
|
dir.name !== 'node_modules' &&
|
||||||
|
dir.name !== '__tests__'
|
||||||
|
)
|
||||||
.map(dir => ({
|
.map(dir => ({
|
||||||
name: dir.name,
|
name: dir.name,
|
||||||
visible: true,
|
visible: true,
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "16.18.11",
|
"@types/node": "16.18.11",
|
||||||
"@types/node-fetch": "2.5.4",
|
"@types/node-fetch": "2.5.4",
|
||||||
"@vercel/node": "*",
|
"@vercel/node": "*"
|
||||||
"typescript": "4.3.4"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
codecov.yml
10
codecov.yml
@@ -1,10 +0,0 @@
|
|||||||
codecov:
|
|
||||||
require_ci_to_pass: yes
|
|
||||||
|
|
||||||
coverage:
|
|
||||||
status:
|
|
||||||
project: off
|
|
||||||
patch: off
|
|
||||||
|
|
||||||
fixes:
|
|
||||||
- "::packages/cli/" # move root e.g., "path/" => "after/path/"
|
|
||||||
@@ -14,7 +14,9 @@ In order to create the smallest possible lambdas Next.js has to be configured to
|
|||||||
npm install next --save
|
npm install next --save
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Add the `now-build` script to your `package.json`
|
2. Check [Node.js Version](https://vercel.link/node-version) in your Project Settings. Using an old or incompatible version of Node.js can cause the Build Step to fail with this error message.
|
||||||
|
|
||||||
|
3. Add the `now-build` script to your `package.json` [deprecated]
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -24,7 +26,7 @@ npm install next --save
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Add `target: 'serverless'` to `next.config.js` [deprecated]
|
4. Add `target: 'serverless'` to `next.config.js` [deprecated]
|
||||||
|
|
||||||
```js
|
```js
|
||||||
module.exports = {
|
module.exports = {
|
||||||
@@ -33,9 +35,9 @@ module.exports = {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Remove `distDir` from `next.config.js` as `@vercel/next` can't parse this file and expects your build output at `/.next`
|
5. Remove `distDir` from `next.config.js` as `@vercel/next` can't parse this file and expects your build output at `/.next`
|
||||||
|
|
||||||
5. Optionally make sure the `"src"` in `"builds"` points to your application `package.json`
|
6. Optionally make sure the `"src"` in `"builds"` points to your application `package.json`
|
||||||
|
|
||||||
```js
|
```js
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
# Astro
|
# Astro
|
||||||
|
|
||||||
This directory is a brief example of an [Astro](https://astro.build/) site that can be deployed to Vercel with zero configuration.
|
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)
|
||||||
|
- `/ssr` - A page that uses server-side rendering (through Vercel 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
|
||||||
|
- `/edge.json` - An Astro API Endpoint that returns JSON data using Vercel Edge Functions
|
||||||
|
|
||||||
|
Learn more about [Astro on Vercel](https://vercel.com/docs/frameworks/astro).
|
||||||
|
|
||||||
## Deploy Your Own
|
## Deploy Your Own
|
||||||
|
|
||||||
@@ -12,21 +19,7 @@ _Live Example: https://astro-template.vercel.app_
|
|||||||
|
|
||||||
## Project Structure
|
## Project Structure
|
||||||
|
|
||||||
Inside of your Astro project, you'll see the following folders and files:
|
Astro looks for `.astro`, `.md`, or `.js` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
||||||
|
|
||||||
```
|
|
||||||
/
|
|
||||||
├── public/
|
|
||||||
│ └── favicon.ico
|
|
||||||
├── src/
|
|
||||||
│ ├── components/
|
|
||||||
│ │ └── Layout.astro
|
|
||||||
│ └── pages/
|
|
||||||
│ └── index.astro
|
|
||||||
└── package.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
|
||||||
|
|
||||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components or layouts.
|
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components or layouts.
|
||||||
|
|
||||||
@@ -38,9 +31,10 @@ All commands are run from the root of the project, from a terminal:
|
|||||||
|
|
||||||
| Command | Action |
|
| Command | Action |
|
||||||
| :--------------------- | :------------------------------------------------- |
|
| :--------------------- | :------------------------------------------------- |
|
||||||
| `npm install` | Installs dependencies |
|
| `pnpm install` | Installs dependencies |
|
||||||
| `npm run dev` | Starts local dev server at `localhost:3000` |
|
| `pnpm run dev` | Starts local dev server at `localhost:3000` |
|
||||||
| `npm run build` | Build your production site to `./dist/` |
|
| `pnpm run build` | Build your production site to `./dist/` |
|
||||||
| `npm run preview` | Preview your build locally, before deploying |
|
| `pnpm run preview` | Preview your build locally, before deploying |
|
||||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
|
| `pnpm run start` | Starts a production dev server at `localhost:3000` |
|
||||||
| `npm run astro --help` | Get help using the Astro CLI |
|
| `pnpm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
|
||||||
|
| `pnpm run astro --help` | Get help using the Astro CLI |
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
|
import vercel from '@astrojs/vercel/edge';
|
||||||
|
|
||||||
// https://astro.build/config
|
export default defineConfig({
|
||||||
export default defineConfig({});
|
output: 'server',
|
||||||
|
adapter: vercel(),
|
||||||
|
});
|
||||||
|
|||||||
@@ -7,8 +7,10 @@
|
|||||||
"preview": "astro preview",
|
"preview": "astro preview",
|
||||||
"astro": "astro"
|
"astro": "astro"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"dependencies": {
|
||||||
"astro": "^2.0.6",
|
"@astrojs/vercel": "3.2.2",
|
||||||
"web-vitals": "^3.1.1"
|
"astro": "^2.2.1",
|
||||||
|
"react": "18.2.0",
|
||||||
|
"web-vitals": "^3.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2953
examples/astro/pnpm-lock.yaml
generated
2953
examples/astro/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -32,7 +32,7 @@ export function sendToAnalytics(metric, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (options.debug) {
|
if (options.debug) {
|
||||||
console.log("[Analytics]", metric.name, JSON.stringify(body, null, 2));
|
console.log("[Web Vitals]", metric.name, JSON.stringify(body, null, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
const blob = new Blob([new URLSearchParams(body).toString()], {
|
const blob = new Blob([new URLSearchParams(body).toString()], {
|
||||||
@@ -61,6 +61,6 @@ export function webVitals(options) {
|
|||||||
onCLS((metric) => sendToAnalytics(metric, options));
|
onCLS((metric) => sendToAnalytics(metric, options));
|
||||||
onFCP((metric) => sendToAnalytics(metric, options));
|
onFCP((metric) => sendToAnalytics(metric, options));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("[Analytics]", err);
|
console.error("[Web Vitals]", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
9
examples/astro/src/pages/edge.json.js
Normal file
9
examples/astro/src/pages/edge.json.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export async function get() {
|
||||||
|
return new Response(JSON.stringify({ time: new Date() }), {
|
||||||
|
status: 200,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Cache-Control': 's-maxage=10, stale-while-revalidate',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
---
|
---
|
||||||
import Layout from '../layouts/Layout.astro';
|
import Layout from '../layouts/Layout.astro';
|
||||||
import Card from '../components/Card.astro';
|
import Card from '../components/Card.astro';
|
||||||
|
|
||||||
|
export const prerender = true;
|
||||||
---
|
---
|
||||||
|
|
||||||
<Layout title="Welcome to Astro.">
|
<Layout title="Welcome to Astro.">
|
||||||
|
|||||||
7
examples/astro/src/pages/ssr-with-swr-caching.astro
Normal file
7
examples/astro/src/pages/ssr-with-swr-caching.astro
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
Astro.response.headers.set('Cache-Control', 's-maxage=10, stale-while-revalidate');
|
||||||
|
|
||||||
|
const time = new Date().toLocaleTimeString();
|
||||||
|
---
|
||||||
|
|
||||||
|
<h1>{time}</h1>
|
||||||
5
examples/astro/src/pages/ssr.astro
Normal file
5
examples/astro/src/pages/ssr.astro
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
const time = new Date().toLocaleTimeString();
|
||||||
|
---
|
||||||
|
|
||||||
|
<h1>{time}</h1>
|
||||||
5
examples/nextjs/.gitignore
vendored
5
examples/nextjs/.gitignore
vendored
@@ -23,10 +23,13 @@
|
|||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
.pnpm-debug.log*
|
|
||||||
|
|
||||||
# local env files
|
# local env files
|
||||||
.env*.local
|
.env*.local
|
||||||
|
|
||||||
# vercel
|
# vercel
|
||||||
.vercel
|
.vercel
|
||||||
|
|
||||||
|
# typescript
|
||||||
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./*"]
|
"@/*": ["./*"]
|
||||||
}
|
}
|
||||||
|
|||||||
2823
examples/nextjs/package-lock.json
generated
2823
examples/nextjs/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,10 +9,9 @@
|
|||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@next/font": "13.1.6",
|
"eslint": "8.39.0",
|
||||||
"eslint": "8.32.0",
|
"eslint-config-next": "13.3.1",
|
||||||
"eslint-config-next": "13.1.6",
|
"next": "13.3.1",
|
||||||
"next": "13.1.6",
|
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0"
|
"react-dom": "18.2.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import Head from 'next/head'
|
import Head from 'next/head'
|
||||||
import Image from 'next/image'
|
import Image from 'next/image'
|
||||||
import { Inter } from '@next/font/google'
|
import { Inter } from 'next/font/google'
|
||||||
import styles from '@/styles/Home.module.css'
|
import styles from '@/styles/Home.module.css'
|
||||||
|
|
||||||
const inter = Inter({ subsets: ['latin'] })
|
const inter = Inter({ subsets: ['latin'] })
|
||||||
@@ -14,7 +14,7 @@ export default function Home() {
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<link rel="icon" href="/favicon.ico" />
|
<link rel="icon" href="/favicon.ico" />
|
||||||
</Head>
|
</Head>
|
||||||
<main className={styles.main}>
|
<main className={`${styles.main} ${inter.className}`}>
|
||||||
<div className={styles.description}>
|
<div className={styles.description}>
|
||||||
<p>
|
<p>
|
||||||
Get started by editing
|
Get started by editing
|
||||||
@@ -48,15 +48,6 @@ export default function Home() {
|
|||||||
height={37}
|
height={37}
|
||||||
priority
|
priority
|
||||||
/>
|
/>
|
||||||
<div className={styles.thirteen}>
|
|
||||||
<Image
|
|
||||||
src="/thirteen.svg"
|
|
||||||
alt="13"
|
|
||||||
width={40}
|
|
||||||
height={31}
|
|
||||||
priority
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.grid}>
|
<div className={styles.grid}>
|
||||||
@@ -66,10 +57,10 @@ export default function Home() {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<h2 className={inter.className}>
|
<h2>
|
||||||
Docs <span>-></span>
|
Docs <span>-></span>
|
||||||
</h2>
|
</h2>
|
||||||
<p className={inter.className}>
|
<p>
|
||||||
Find in-depth information about Next.js features and API.
|
Find in-depth information about Next.js features and API.
|
||||||
</p>
|
</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -80,10 +71,10 @@ export default function Home() {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<h2 className={inter.className}>
|
<h2>
|
||||||
Learn <span>-></span>
|
Learn <span>-></span>
|
||||||
</h2>
|
</h2>
|
||||||
<p className={inter.className}>
|
<p>
|
||||||
Learn about Next.js in an interactive course with quizzes!
|
Learn about Next.js in an interactive course with quizzes!
|
||||||
</p>
|
</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -94,10 +85,10 @@ export default function Home() {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<h2 className={inter.className}>
|
<h2>
|
||||||
Templates <span>-></span>
|
Templates <span>-></span>
|
||||||
</h2>
|
</h2>
|
||||||
<p className={inter.className}>
|
<p>
|
||||||
Discover and deploy boilerplate example Next.js projects.
|
Discover and deploy boilerplate example Next.js projects.
|
||||||
</p>
|
</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -108,10 +99,10 @@ export default function Home() {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<h2 className={inter.className}>
|
<h2>
|
||||||
Deploy <span>-></span>
|
Deploy <span>-></span>
|
||||||
</h2>
|
</h2>
|
||||||
<p className={inter.className}>
|
<p>
|
||||||
Instantly deploy your Next.js site to a shareable URL
|
Instantly deploy your Next.js site to a shareable URL
|
||||||
with Vercel.
|
with Vercel.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="31" fill="none"><g opacity=".9"><path fill="url(#a)" d="M13 .4v29.3H7V6.3h-.2L0 10.5V5L7.2.4H13Z"/><path fill="url(#b)" d="M28.8 30.1c-2.2 0-4-.3-5.7-1-1.7-.8-3-1.8-4-3.1a7.7 7.7 0 0 1-1.4-4.6h6.2c0 .8.3 1.4.7 2 .4.5 1 .9 1.7 1.2.7.3 1.6.4 2.5.4 1 0 1.7-.2 2.5-.5.7-.3 1.3-.8 1.7-1.4.4-.6.6-1.2.6-2s-.2-1.5-.7-2.1c-.4-.6-1-1-1.8-1.4-.8-.4-1.8-.5-2.9-.5h-2.7v-4.6h2.7a6 6 0 0 0 2.5-.5 4 4 0 0 0 1.7-1.3c.4-.6.6-1.3.6-2a3.5 3.5 0 0 0-2-3.3 5.6 5.6 0 0 0-4.5 0 4 4 0 0 0-1.7 1.2c-.4.6-.6 1.2-.6 2h-6c0-1.7.6-3.2 1.5-4.5 1-1.3 2.2-2.3 3.8-3C25 .4 26.8 0 28.8 0s3.8.4 5.3 1.1c1.5.7 2.7 1.7 3.6 3a7.2 7.2 0 0 1 1.2 4.2c0 1.6-.5 3-1.5 4a7 7 0 0 1-4 2.2v.2c2.2.3 3.8 1 5 2.2a6.4 6.4 0 0 1 1.6 4.6c0 1.7-.5 3.1-1.4 4.4a9.7 9.7 0 0 1-4 3.1c-1.7.8-3.7 1.1-5.8 1.1Z"/></g><defs><linearGradient id="a" x1="20" x2="20" y1="0" y2="30.1" gradientUnits="userSpaceOnUse"><stop/><stop offset="1" stop-color="#3D3D3D"/></linearGradient><linearGradient id="b" x1="20" x2="20" y1="0" y2="30.1" gradientUnits="userSpaceOnUse"><stop/><stop offset="1" stop-color="#3D3D3D"/></linearGradient></defs></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -104,53 +104,9 @@
|
|||||||
transform: translateZ(0);
|
transform: translateZ(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logo,
|
.logo {
|
||||||
.thirteen {
|
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.thirteen {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
width: 75px;
|
|
||||||
height: 75px;
|
|
||||||
padding: 25px 10px;
|
|
||||||
margin-left: 16px;
|
|
||||||
transform: translateZ(0);
|
|
||||||
border-radius: var(--border-radius);
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0px 2px 8px -1px #0000001a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.thirteen::before,
|
|
||||||
.thirteen::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
z-index: -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Conic Gradient Animation */
|
|
||||||
.thirteen::before {
|
|
||||||
animation: 6s rotate linear infinite;
|
|
||||||
width: 200%;
|
|
||||||
height: 200%;
|
|
||||||
background: var(--tile-border);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Inner Square */
|
|
||||||
.thirteen::after {
|
|
||||||
inset: 0;
|
|
||||||
padding: 1px;
|
|
||||||
border-radius: var(--border-radius);
|
|
||||||
background: linear-gradient(
|
|
||||||
to bottom right,
|
|
||||||
rgba(var(--tile-start-rgb), 1),
|
|
||||||
rgba(var(--tile-end-rgb), 1)
|
|
||||||
);
|
|
||||||
background-clip: content-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable hover only on non-touch devices */
|
/* Enable hover only on non-touch devices */
|
||||||
@media (hover: hover) and (pointer: fine) {
|
@media (hover: hover) and (pointer: fine) {
|
||||||
.card:hover {
|
.card:hover {
|
||||||
@@ -164,10 +120,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-reduced-motion) {
|
@media (prefers-reduced-motion) {
|
||||||
.thirteen::before {
|
|
||||||
animation: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card:hover span {
|
.card:hover span {
|
||||||
transform: none;
|
transform: none;
|
||||||
}
|
}
|
||||||
@@ -262,8 +214,7 @@
|
|||||||
filter: invert(1);
|
filter: invert(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logo,
|
.logo {
|
||||||
.thirteen img {
|
|
||||||
filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
|
filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type { MetaFunction } from "@remix-run/node";
|
import type { MetaFunction } from "@vercel/remix";
|
||||||
import {
|
import {
|
||||||
Links,
|
Links,
|
||||||
LiveReload,
|
LiveReload,
|
||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
Scripts,
|
Scripts,
|
||||||
ScrollRestoration,
|
ScrollRestoration,
|
||||||
} from "@remix-run/react";
|
} from "@remix-run/react";
|
||||||
import { Analytics } from '@vercel/analytics/react';
|
import { Analytics } from "@vercel/analytics/react";
|
||||||
|
|
||||||
export const meta: MetaFunction = () => ({
|
export const meta: MetaFunction = () => ({
|
||||||
charset: "utf-8",
|
charset: "utf-8",
|
||||||
|
|||||||
9
examples/remix/app/routes/edge.tsx
Normal file
9
examples/remix/app/routes/edge.tsx
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export const config = { runtime: "edge" };
|
||||||
|
|
||||||
|
export default function Edge() {
|
||||||
|
return (
|
||||||
|
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.4" }}>
|
||||||
|
<h1>Welcome to Remix@Edge</h1>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -6,20 +6,19 @@
|
|||||||
"dev": "remix dev"
|
"dev": "remix dev"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@remix-run/node": "^1.7.6",
|
"@remix-run/node": "^1.15.0",
|
||||||
"@remix-run/react": "^1.7.6",
|
"@remix-run/react": "^1.15.0",
|
||||||
"@remix-run/vercel": "^1.7.6",
|
"@remix-run/serve": "^1.15.0",
|
||||||
"@vercel/analytics": "^0.1.5",
|
"@vercel/analytics": "^0.1.11",
|
||||||
"@vercel/node": "^2.7.0",
|
"@vercel/remix": "^1.15.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0"
|
"react-dom": "^18.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@remix-run/dev": "^1.7.6",
|
"@remix-run/dev": "^1.15.0",
|
||||||
"@remix-run/eslint-config": "^1.7.6",
|
"@remix-run/eslint-config": "^1.15.0",
|
||||||
"@remix-run/serve": "^1.7.6",
|
|
||||||
"@types/react": "^18.0.25",
|
"@types/react": "^18.0.25",
|
||||||
"@types/react-dom": "^18.0.9",
|
"@types/react-dom": "^18.0.11",
|
||||||
"eslint": "^8.28.0",
|
"eslint": "^8.28.0",
|
||||||
"typescript": "^4.9.3"
|
"typescript": "^4.9.3"
|
||||||
},
|
},
|
||||||
|
|||||||
3846
examples/remix/pnpm-lock.yaml
generated
3846
examples/remix/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,10 @@
|
|||||||
/** @type {import('@remix-run/dev').AppConfig} */
|
/**
|
||||||
|
* @type {import('@remix-run/dev').AppConfig}
|
||||||
|
*/
|
||||||
module.exports = {
|
module.exports = {
|
||||||
serverBuildTarget: "vercel",
|
ignoredRouteFiles: ['**/.*'],
|
||||||
// When running locally in development mode, we use the built in remix
|
|
||||||
// server. This does not understand the vercel lambda module format,
|
|
||||||
// so we default back to the standard build output.
|
|
||||||
server: process.env.NODE_ENV === "development" ? undefined : "./server.js",
|
|
||||||
ignoredRouteFiles: ["**/.*"],
|
|
||||||
// appDirectory: "app",
|
// appDirectory: "app",
|
||||||
// assetsBuildDirectory: "public/build",
|
// assetsBuildDirectory: "public/build",
|
||||||
// serverBuildPath: "api/index.js",
|
// serverBuildPath: "build/index.js",
|
||||||
// publicPath: "/build/",
|
// publicPath: "/build/",
|
||||||
};
|
};
|
||||||
|
|||||||
2
examples/remix/remix.env.d.ts
vendored
2
examples/remix/remix.env.d.ts
vendored
@@ -1,2 +1,2 @@
|
|||||||
/// <reference types="@remix-run/dev" />
|
/// <reference types="@remix-run/dev" />
|
||||||
/// <reference types="@remix-run/node" />
|
/// <reference types="@vercel/remix" />
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ function sendToAnalytics(metric, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (options.debug) {
|
if (options.debug) {
|
||||||
console.log('[Analytics]', metric.name, JSON.stringify(body, null, 2));
|
console.log('[Web Vitals]', metric.name, JSON.stringify(body, null, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
const blob = new Blob([new URLSearchParams(body).toString()], {
|
const blob = new Blob([new URLSearchParams(body).toString()], {
|
||||||
@@ -61,6 +61,6 @@ export function webVitals(options) {
|
|||||||
getCLS((metric) => sendToAnalytics(metric, options));
|
getCLS((metric) => sendToAnalytics(metric, options));
|
||||||
getFCP((metric) => sendToAnalytics(metric, options));
|
getFCP((metric) => sendToAnalytics(metric, options));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[Analytics]', err);
|
console.error('[Web Vitals]', err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
internals/constants/package.json
Normal file
18
internals/constants/package.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"name": "@vercel-internals/constants",
|
||||||
|
"types": "dist/index.d.ts",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc -p tsconfig.json"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@vercel/build-utils": "6.3.2",
|
||||||
|
"@vercel/routing-utils": "2.1.10"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vercel-internals/tsconfig": "*",
|
||||||
|
"@vercel/style-guide": "4.0.2",
|
||||||
|
"typescript": "4.9.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
5
internals/constants/src/index.ts
Normal file
5
internals/constants/src/index.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export const PROJECT_ENV_TARGET = [
|
||||||
|
'production',
|
||||||
|
'preview',
|
||||||
|
'development',
|
||||||
|
] as const;
|
||||||
7
internals/constants/tsconfig.json
Normal file
7
internals/constants/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vercel-internals/tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./dist"
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"]
|
||||||
|
}
|
||||||
28
internals/get-package-json/package.json
Normal file
28
internals/get-package-json/package.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"name": "@vercel-internals/get-package-json",
|
||||||
|
"types": "dist/index.d.ts",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"files": [
|
||||||
|
"dist/*"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"test": "jest --env node --verbose --runInBand --bail",
|
||||||
|
"test-unit": "pnpm test tests/unit"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/jest": "29.5.0",
|
||||||
|
"@types/node": "14.14.31",
|
||||||
|
"@vercel-internals/tsconfig": "*",
|
||||||
|
"@vercel/style-guide": "4.0.2",
|
||||||
|
"jest": "29.5.0",
|
||||||
|
"ts-jest": "29.1.0",
|
||||||
|
"typescript": "4.9.4"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"verbose": true,
|
||||||
|
"preset": "ts-jest",
|
||||||
|
"testEnvironment": "node"
|
||||||
|
}
|
||||||
|
}
|
||||||
58
internals/get-package-json/src/index.ts
Normal file
58
internals/get-package-json/src/index.ts
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
const cache = new Map();
|
||||||
|
|
||||||
|
function getPackageJSONPath(dir: string) {
|
||||||
|
return path.join(dir, 'package.json');
|
||||||
|
}
|
||||||
|
|
||||||
|
function captureCallerCallSite() {
|
||||||
|
const _prepareStackTrace = Error.prepareStackTrace;
|
||||||
|
|
||||||
|
let callSite;
|
||||||
|
try {
|
||||||
|
Error.prepareStackTrace = (_, stack) => stack;
|
||||||
|
|
||||||
|
// The `stack` reference above is of type `Array<NodeJS.CallSite>`
|
||||||
|
const callSites = new Error().stack as unknown as Array<NodeJS.CallSite>;
|
||||||
|
|
||||||
|
// TypeScript rule noUncheckedIndexedAccess makes `callSites[2]` potentially
|
||||||
|
// undefined; however, we can safely assert it is not undefined as the
|
||||||
|
// callstack will always have at least 3 entries, the first being this
|
||||||
|
// function, the second being `getPackageJSON`, and the third wherever its
|
||||||
|
// being called from.
|
||||||
|
callSite = callSites[2]!;
|
||||||
|
} finally {
|
||||||
|
Error.prepareStackTrace = _prepareStackTrace;
|
||||||
|
}
|
||||||
|
|
||||||
|
return callSite;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getPackageJSON() {
|
||||||
|
const callSite = captureCallerCallSite();
|
||||||
|
// Get the file name of where this function was called. It is guaranteed that
|
||||||
|
// the only way for `getFileName` to return `undefined` is if this function is
|
||||||
|
// called using `eval` thus it is safe to assert `filePath` is defined at this
|
||||||
|
// point.
|
||||||
|
const filePath = (callSite.getFileName() ||
|
||||||
|
callSite.getEvalOrigin()) as string;
|
||||||
|
|
||||||
|
let rootDir = path.dirname(filePath);
|
||||||
|
|
||||||
|
let packageJSONPath = getPackageJSONPath(rootDir);
|
||||||
|
while (!fs.existsSync(packageJSONPath)) {
|
||||||
|
rootDir = path.join(rootDir, '..');
|
||||||
|
packageJSONPath = getPackageJSONPath(rootDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
let packageJSON = cache.get(packageJSONPath);
|
||||||
|
|
||||||
|
if (!packageJSON) {
|
||||||
|
packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, 'utf-8'));
|
||||||
|
cache.set(packageJSONPath, packageJSON);
|
||||||
|
}
|
||||||
|
|
||||||
|
return packageJSON;
|
||||||
|
}
|
||||||
7
internals/get-package-json/tests/tsconfig.json
Normal file
7
internals/get-package-json/tests/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"noEmit": true
|
||||||
|
},
|
||||||
|
"include": ["./**/*.ts"]
|
||||||
|
}
|
||||||
20
internals/get-package-json/tests/unit/cache.test.ts
Normal file
20
internals/get-package-json/tests/unit/cache.test.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { getPackageJSON } from '../../src/index';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
test('getPackageJSON caches read operations', () => {
|
||||||
|
const expected = JSON.parse(
|
||||||
|
fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8')
|
||||||
|
);
|
||||||
|
expect(expected.name).toBe('@vercel-internals/get-package-json');
|
||||||
|
|
||||||
|
const readFileSyncSpy = jest.spyOn(fs, 'readFileSync');
|
||||||
|
|
||||||
|
const actual = getPackageJSON();
|
||||||
|
expect(actual).toStrictEqual(expected);
|
||||||
|
expect(readFileSyncSpy).toBeCalledTimes(1);
|
||||||
|
|
||||||
|
const cacheHit = getPackageJSON();
|
||||||
|
expect(cacheHit).toStrictEqual(expected);
|
||||||
|
expect(readFileSyncSpy).toBeCalledTimes(1);
|
||||||
|
});
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { getPackageJSON } from '../../../../../src/index';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
test('getPackageJSON should return the package.json', () => {
|
||||||
|
const expected = JSON.parse(
|
||||||
|
fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8')
|
||||||
|
);
|
||||||
|
expect(expected.name).toBe('deeply-nested');
|
||||||
|
const actual = getPackageJSON();
|
||||||
|
expect(actual).toStrictEqual(expected);
|
||||||
|
});
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"name": "deeply-nested",
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
12
internals/get-package-json/tests/unit/getPackageJSON.test.ts
Normal file
12
internals/get-package-json/tests/unit/getPackageJSON.test.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { getPackageJSON } from '../../src/index';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
test('getPackageJSON should return the package.json', () => {
|
||||||
|
const expected = JSON.parse(
|
||||||
|
fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8')
|
||||||
|
);
|
||||||
|
expect(expected.name).toBe('@vercel-internals/get-package-json');
|
||||||
|
const actual = getPackageJSON();
|
||||||
|
expect(actual).toStrictEqual(expected);
|
||||||
|
});
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { getPackageJSON } from '../../../src/index';
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
test('getPackageJSON should return the package.json', () => {
|
||||||
|
const expected = JSON.parse(
|
||||||
|
fs.readFileSync(path.join(__dirname, 'package.json'), 'utf-8')
|
||||||
|
);
|
||||||
|
expect(expected.name).toBe('nested');
|
||||||
|
const actual = getPackageJSON();
|
||||||
|
expect(actual).toStrictEqual(expected);
|
||||||
|
});
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"name": "nested",
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
7
internals/get-package-json/tsconfig.json
Normal file
7
internals/get-package-json/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vercel-internals/tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "dist"
|
||||||
|
},
|
||||||
|
"include": ["src/**/*"]
|
||||||
|
}
|
||||||
11
internals/tsconfig/package.json
Normal file
11
internals/tsconfig/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"name": "@vercel-internals/tsconfig",
|
||||||
|
"description": "Node.js tsconfig file based on `@vercel/style-guide`",
|
||||||
|
"files": [
|
||||||
|
"tsconfig.json"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"@vercel/style-guide": "4.0.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
internals/tsconfig/tsconfig.json
Normal file
13
internals/tsconfig/tsconfig.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vercel/style-guide/typescript",
|
||||||
|
"compilerOptions": {
|
||||||
|
"declaration": true,
|
||||||
|
"allowJs": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"target": "ES2020",
|
||||||
|
"module": "commonjs",
|
||||||
|
"lib": ["ES2020"],
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"sourceMap": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
import type { BuilderFunctions } from '@vercel/build-utils';
|
import type { BuilderFunctions } from '@vercel/build-utils';
|
||||||
import type { Readable, Writable } from 'stream';
|
import type { Readable, Writable } from 'stream';
|
||||||
import type { Route } from '@vercel/routing-utils';
|
import type { Route } from '@vercel/routing-utils';
|
||||||
|
import { PROJECT_ENV_TARGET } from '@vercel-internals/constants';
|
||||||
|
|
||||||
|
export type ProjectEnvTarget = typeof PROJECT_ENV_TARGET[number];
|
||||||
|
export type ProjectEnvType = 'plain' | 'secret' | 'encrypted' | 'system';
|
||||||
|
|
||||||
export type ProjectSettings = import('@vercel/build-utils').ProjectSettings;
|
export type ProjectSettings = import('@vercel/build-utils').ProjectSettings;
|
||||||
|
|
||||||
@@ -300,19 +304,6 @@ export interface Secret {
|
|||||||
createdAt: number;
|
createdAt: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ProjectEnvTarget {
|
|
||||||
Production = 'production',
|
|
||||||
Preview = 'preview',
|
|
||||||
Development = 'development',
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum ProjectEnvType {
|
|
||||||
Plaintext = 'plain',
|
|
||||||
Secret = 'secret',
|
|
||||||
Encrypted = 'encrypted',
|
|
||||||
System = 'system',
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ProjectEnvVariable {
|
export interface ProjectEnvVariable {
|
||||||
id: string;
|
id: string;
|
||||||
key: string;
|
key: string;
|
||||||
@@ -427,7 +418,7 @@ export interface GitMetadata {
|
|||||||
commitRef?: string | undefined;
|
commitRef?: string | undefined;
|
||||||
commitSha?: string | undefined;
|
commitSha?: string | undefined;
|
||||||
dirty?: boolean | undefined;
|
dirty?: boolean | undefined;
|
||||||
remoteUrl: string;
|
remoteUrl?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
17
internals/types/package.json
Normal file
17
internals/types/package.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"name": "@vercel-internals/types",
|
||||||
|
"types": "index.d.ts",
|
||||||
|
"main": "index.d.ts",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": "14.14.31",
|
||||||
|
"@vercel-internals/constants": "*",
|
||||||
|
"@vercel/build-utils": "6.3.2",
|
||||||
|
"@vercel/routing-utils": "2.1.10"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vercel-internals/tsconfig": "*",
|
||||||
|
"@vercel/style-guide": "4.0.2",
|
||||||
|
"typescript": "4.9.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
7
internals/types/tsconfig.json
Normal file
7
internals/types/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vercel-internals/tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"noEmit": true
|
||||||
|
},
|
||||||
|
"include": ["index.d.ts"]
|
||||||
|
}
|
||||||
21
package.json
21
package.json
@@ -3,7 +3,7 @@
|
|||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"packageManager": "pnpm@7.24.2",
|
"packageManager": "pnpm@8.3.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lerna": "5.6.2"
|
"lerna": "5.6.2"
|
||||||
},
|
},
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
"execa": "3.2.0",
|
"execa": "3.2.0",
|
||||||
"fs-extra": "11.1.0",
|
"fs-extra": "11.1.0",
|
||||||
"husky": "7.0.4",
|
"husky": "7.0.4",
|
||||||
"jest": "28.0.2",
|
"jest": "29.5.0",
|
||||||
"json5": "2.1.1",
|
"json5": "2.1.1",
|
||||||
"lint-staged": "9.2.5",
|
"lint-staged": "9.2.5",
|
||||||
"node-fetch": "2.6.7",
|
"node-fetch": "2.6.7",
|
||||||
@@ -31,26 +31,27 @@
|
|||||||
"prettier": "2.6.2",
|
"prettier": "2.6.2",
|
||||||
"source-map-support": "0.5.12",
|
"source-map-support": "0.5.12",
|
||||||
"ts-eager": "2.0.2",
|
"ts-eager": "2.0.2",
|
||||||
"ts-jest": "28.0.5",
|
"ts-jest": "29.1.0",
|
||||||
"turbo": "1.7.4"
|
"typescript": "4.9.5",
|
||||||
|
"turbo": "1.9.3"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lerna": "lerna",
|
"lerna": "lerna",
|
||||||
"version": "pnpm install && git add pnpm-lock.yaml",
|
"version": "pnpm install && git add pnpm-lock.yaml",
|
||||||
"bootstrap": "lerna bootstrap",
|
"bootstrap": "lerna bootstrap",
|
||||||
"publish-stable": "echo 'Run `pnpm changelog` for instructions'",
|
"publish-stable": "echo 'Run `pnpm changelog` for instructions'",
|
||||||
"publish-canary": "git checkout main && git pull && lerna version prerelease --preid canary --message \"Publish Canary\" --exact",
|
|
||||||
"publish-from-github": "./utils/publish.sh",
|
"publish-from-github": "./utils/publish.sh",
|
||||||
"changelog": "node utils/changelog.js",
|
"changelog": "node utils/changelog.js",
|
||||||
"build": "node utils/gen.js && turbo run build",
|
"build": "node utils/gen.js && turbo --no-update-notifier run build",
|
||||||
"vercel-build": "pnpm build && pnpm run pack && cd api && node -r ts-eager/register ./_lib/script/build.ts",
|
"vercel-build": "pnpm build && pnpm run pack && cd api && node -r ts-eager/register ./_lib/script/build.ts",
|
||||||
"pre-commit": "lint-staged",
|
"pre-commit": "lint-staged",
|
||||||
"test": "jest --rootDir=\"test\" --testPathPattern=\"\\.test.js\"",
|
"test": "jest --rootDir=\"test\" --testPathPattern=\"\\.test.js\"",
|
||||||
"test-unit": "pnpm test && node utils/gen.js && turbo run test-unit",
|
"test-unit": "pnpm test && node utils/gen.js && turbo --no-update-notifier run test-unit",
|
||||||
"test-cli": "node utils/gen.js && turbo run test-cli",
|
"test-cli": "node utils/gen.js && turbo --no-update-notifier run test-cli",
|
||||||
"test-e2e": "node utils/gen.js && turbo run test-e2e",
|
"test-e2e": "node utils/gen.js && turbo --no-update-notifier run test-e2e",
|
||||||
"test-dev": "node utils/gen.js && turbo run test-dev",
|
"test-dev": "node utils/gen.js && turbo --no-update-notifier run test-dev",
|
||||||
"lint": "eslint . --cache --ext .ts,.js",
|
"lint": "eslint . --cache --ext .ts,.js",
|
||||||
|
"prettier-check": "prettier --check .",
|
||||||
"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"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@vercel/build-utils",
|
"name": "@vercel/build-utils",
|
||||||
"version": "6.3.0",
|
"version": "6.7.2",
|
||||||
"license": "MIT",
|
"license": "Apache-2.0",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.js",
|
"types": "./dist/index.d.js",
|
||||||
"homepage": "https://github.com/vercel/vercel/blob/main/DEVELOPING_A_RUNTIME.md",
|
"homepage": "https://github.com/vercel/vercel/blob/main/DEVELOPING_A_RUNTIME.md",
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
"@types/node-fetch": "^2.1.6",
|
"@types/node-fetch": "^2.1.6",
|
||||||
"@types/semver": "6.0.0",
|
"@types/semver": "6.0.0",
|
||||||
"@types/yazl": "2.4.2",
|
"@types/yazl": "2.4.2",
|
||||||
|
"@vercel/error-utils": "1.0.10",
|
||||||
"@vercel/ncc": "0.24.0",
|
"@vercel/ncc": "0.24.0",
|
||||||
"aggregate-error": "3.0.1",
|
"aggregate-error": "3.0.1",
|
||||||
"async-retry": "1.2.3",
|
"async-retry": "1.2.3",
|
||||||
@@ -44,11 +45,11 @@
|
|||||||
"ignore": "4.0.6",
|
"ignore": "4.0.6",
|
||||||
"into-stream": "5.0.0",
|
"into-stream": "5.0.0",
|
||||||
"js-yaml": "3.13.1",
|
"js-yaml": "3.13.1",
|
||||||
"minimatch": "3.0.4",
|
"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.1.1",
|
||||||
"typescript": "4.3.4",
|
"typescript": "4.9.5",
|
||||||
"yazl": "2.5.1"
|
"yazl": "2.5.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,18 @@
|
|||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
import toml from '@iarna/toml';
|
import toml from '@iarna/toml';
|
||||||
import { readFile } from 'fs-extra';
|
import { readFile } from 'fs-extra';
|
||||||
|
import { isErrnoException } from '@vercel/error-utils';
|
||||||
|
|
||||||
async function readFileOrNull(file: string) {
|
async function readFileOrNull(file: string) {
|
||||||
try {
|
try {
|
||||||
const data = await readFile(file);
|
const data = await readFile(file);
|
||||||
return data;
|
return data;
|
||||||
} catch (err) {
|
} catch (error: unknown) {
|
||||||
if (err.code !== 'ENOENT') {
|
if (!isErrnoException(error)) {
|
||||||
throw err;
|
throw error;
|
||||||
|
}
|
||||||
|
if (error.code !== 'ENOENT') {
|
||||||
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,12 +29,16 @@ export async function readConfigFile<T>(
|
|||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
const str = data.toString('utf8');
|
const str = data.toString('utf8');
|
||||||
if (name.endsWith('.json')) {
|
try {
|
||||||
return JSON.parse(str) as T;
|
if (name.endsWith('.json')) {
|
||||||
} else if (name.endsWith('.toml')) {
|
return JSON.parse(str) as T;
|
||||||
return (toml.parse(str) as unknown) as T;
|
} else if (name.endsWith('.toml')) {
|
||||||
} else if (name.endsWith('.yaml') || name.endsWith('.yml')) {
|
return toml.parse(str) as unknown as T;
|
||||||
return yaml.safeLoad(str, { filename: name }) as T;
|
} else if (name.endsWith('.yaml') || name.endsWith('.yml')) {
|
||||||
|
return yaml.safeLoad(str, { filename: name }) as T;
|
||||||
|
}
|
||||||
|
} catch (error: unknown) {
|
||||||
|
console.log(`Error while parsing config file: "${name}"`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -487,6 +487,7 @@ export function getEnvForPackageManager({
|
|||||||
const oldPath = env.PATH + '';
|
const oldPath = env.PATH + '';
|
||||||
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 corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
|
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
|
||||||
if (cliType === 'npm') {
|
if (cliType === 'npm') {
|
||||||
if (
|
if (
|
||||||
@@ -509,7 +510,20 @@ 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('Detected `pnpm-lock.yaml` generated by pnpm 7...');
|
console.log(
|
||||||
|
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 7...`
|
||||||
|
);
|
||||||
|
} else if (
|
||||||
|
typeof lockfileVersion === 'number' &&
|
||||||
|
lockfileVersion >= 6 &&
|
||||||
|
!oldPath.includes(pnpm8) &&
|
||||||
|
!corepackEnabled
|
||||||
|
) {
|
||||||
|
// Ensure that pnpm 8 is at the beginning of the `$PATH`
|
||||||
|
newEnv.PATH = `${pnpm8}${path.delimiter}${oldPath}`;
|
||||||
|
console.log(
|
||||||
|
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 8...`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
|
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
|
||||||
|
|||||||
@@ -14,10 +14,11 @@ export function getPrefixedEnvVars({
|
|||||||
envs: Envs;
|
envs: Envs;
|
||||||
}): Envs {
|
}): Envs {
|
||||||
const vercelSystemEnvPrefix = 'VERCEL_';
|
const vercelSystemEnvPrefix = 'VERCEL_';
|
||||||
|
const allowed = ['VERCEL_URL', 'VERCEL_ENV', 'VERCEL_REGION'];
|
||||||
const newEnvs: Envs = {};
|
const newEnvs: Envs = {};
|
||||||
if (envPrefix && envs.VERCEL_URL) {
|
if (envPrefix && envs.VERCEL_URL) {
|
||||||
Object.keys(envs)
|
Object.keys(envs)
|
||||||
.filter(key => key.startsWith(vercelSystemEnvPrefix))
|
.filter(key => allowed.includes(key) || key.startsWith('VERCEL_GIT_'))
|
||||||
.forEach(key => {
|
.forEach(key => {
|
||||||
const newKey = `${envPrefix}${key}`;
|
const newKey = `${envPrefix}${key}`;
|
||||||
if (!(newKey in envs)) {
|
if (!(newKey in envs)) {
|
||||||
|
|||||||
79
packages/build-utils/src/hard-link-dir.ts
Normal file
79
packages/build-utils/src/hard-link-dir.ts
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
// Source: https://github.com/pnpm/pnpm/blob/b38d711f3892a473e20e69dd32ca7e1b439efaec/fs/hard-link-dir/src/index.ts#L4
|
||||||
|
// LICENSE (MIT): https://github.com/pnpm/pnpm/blob/b38d711f3892a473e20e69dd32ca7e1b439efaec/LICENSE
|
||||||
|
|
||||||
|
import path from 'path';
|
||||||
|
import { promises as fs } from 'fs';
|
||||||
|
|
||||||
|
export async function hardLinkDir(src: string, destDirs: string[]) {
|
||||||
|
if (destDirs.length === 0) return;
|
||||||
|
// Don't try to hard link the source directory to itself
|
||||||
|
destDirs = destDirs.filter(destDir => path.relative(destDir, src) !== '');
|
||||||
|
const files = await fs.readdir(src);
|
||||||
|
await Promise.all(
|
||||||
|
files.map(async file => {
|
||||||
|
if (file === 'node_modules') return;
|
||||||
|
const srcFile = path.join(src, file);
|
||||||
|
if ((await fs.lstat(srcFile)).isDirectory()) {
|
||||||
|
const destSubdirs = await Promise.all(
|
||||||
|
destDirs.map(async destDir => {
|
||||||
|
const destSubdir = path.join(destDir, file);
|
||||||
|
try {
|
||||||
|
await fs.mkdir(destSubdir, { recursive: true });
|
||||||
|
} catch (err: any) {
|
||||||
|
// eslint-disable-line
|
||||||
|
if (err.code !== 'EEXIST') throw err;
|
||||||
|
}
|
||||||
|
return destSubdir;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
await hardLinkDir(srcFile, destSubdirs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await Promise.all(
|
||||||
|
destDirs.map(async destDir => {
|
||||||
|
const destFile = path.join(destDir, file);
|
||||||
|
try {
|
||||||
|
await linkOrCopyFile(srcFile, destFile);
|
||||||
|
} catch (err: any) {
|
||||||
|
// eslint-disable-line
|
||||||
|
if (err.code === 'ENOENT') {
|
||||||
|
// Ignore broken symlinks
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function linkOrCopyFile(srcFile: string, destFile: string) {
|
||||||
|
try {
|
||||||
|
await linkOrCopy(srcFile, destFile);
|
||||||
|
} catch (err: any) {
|
||||||
|
// eslint-disable-line
|
||||||
|
if (err.code === 'ENOENT') {
|
||||||
|
await fs.mkdir(path.dirname(destFile), { recursive: true });
|
||||||
|
await linkOrCopy(srcFile, destFile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (err.code !== 'EEXIST') {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function could be optimized because we don't really need to try linking again
|
||||||
|
* if linking failed once.
|
||||||
|
*/
|
||||||
|
async function linkOrCopy(srcFile: string, destFile: string) {
|
||||||
|
try {
|
||||||
|
await fs.link(srcFile, destFile);
|
||||||
|
} catch (err: any) {
|
||||||
|
// eslint-disable-line
|
||||||
|
if (err.code !== 'EXDEV') throw err;
|
||||||
|
await fs.copyFile(srcFile, destFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -42,6 +42,7 @@ import getIgnoreFilter from './get-ignore-filter';
|
|||||||
import { getPlatformEnv } from './get-platform-env';
|
import { getPlatformEnv } from './get-platform-env';
|
||||||
import { getPrefixedEnvVars } from './get-prefixed-env-vars';
|
import { getPrefixedEnvVars } from './get-prefixed-env-vars';
|
||||||
import { cloneEnv } from './clone-env';
|
import { cloneEnv } from './clone-env';
|
||||||
|
import { hardLinkDir } from './hard-link-dir';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
FileBlob,
|
FileBlob,
|
||||||
@@ -86,6 +87,7 @@ export {
|
|||||||
scanParentDirs,
|
scanParentDirs,
|
||||||
getIgnoreFilter,
|
getIgnoreFilter,
|
||||||
cloneEnv,
|
cloneEnv,
|
||||||
|
hardLinkDir,
|
||||||
};
|
};
|
||||||
|
|
||||||
export { EdgeFunction } from './edge-function';
|
export { EdgeFunction } from './edge-function';
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ export interface LambdaOptionsBase {
|
|||||||
regions?: string[];
|
regions?: string[];
|
||||||
supportsMultiPayloads?: boolean;
|
supportsMultiPayloads?: boolean;
|
||||||
supportsWrapper?: boolean;
|
supportsWrapper?: boolean;
|
||||||
|
supportsResponseStreaming?: boolean;
|
||||||
|
/**
|
||||||
|
* @deprecated Use the `supportsResponseStreaming` property instead.
|
||||||
|
*/
|
||||||
experimentalResponseStreaming?: boolean;
|
experimentalResponseStreaming?: boolean;
|
||||||
operationType?: string;
|
operationType?: string;
|
||||||
framework?: FunctionFramework;
|
framework?: FunctionFramework;
|
||||||
@@ -69,7 +73,7 @@ export class Lambda {
|
|||||||
zipBuffer?: Buffer;
|
zipBuffer?: Buffer;
|
||||||
supportsMultiPayloads?: boolean;
|
supportsMultiPayloads?: boolean;
|
||||||
supportsWrapper?: boolean;
|
supportsWrapper?: boolean;
|
||||||
experimentalResponseStreaming?: boolean;
|
supportsResponseStreaming?: boolean;
|
||||||
framework?: FunctionFramework;
|
framework?: FunctionFramework;
|
||||||
|
|
||||||
constructor(opts: LambdaOptions) {
|
constructor(opts: LambdaOptions) {
|
||||||
@@ -83,6 +87,7 @@ export class Lambda {
|
|||||||
regions,
|
regions,
|
||||||
supportsMultiPayloads,
|
supportsMultiPayloads,
|
||||||
supportsWrapper,
|
supportsWrapper,
|
||||||
|
supportsResponseStreaming,
|
||||||
experimentalResponseStreaming,
|
experimentalResponseStreaming,
|
||||||
operationType,
|
operationType,
|
||||||
framework,
|
framework,
|
||||||
@@ -162,7 +167,8 @@ export class Lambda {
|
|||||||
this.zipBuffer = 'zipBuffer' in opts ? opts.zipBuffer : undefined;
|
this.zipBuffer = 'zipBuffer' in opts ? opts.zipBuffer : undefined;
|
||||||
this.supportsMultiPayloads = supportsMultiPayloads;
|
this.supportsMultiPayloads = supportsMultiPayloads;
|
||||||
this.supportsWrapper = supportsWrapper;
|
this.supportsWrapper = supportsWrapper;
|
||||||
this.experimentalResponseStreaming = experimentalResponseStreaming;
|
this.supportsResponseStreaming =
|
||||||
|
supportsResponseStreaming ?? experimentalResponseStreaming;
|
||||||
this.framework = framework;
|
this.framework = framework;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,6 +187,16 @@ export class Lambda {
|
|||||||
}
|
}
|
||||||
return zipBuffer;
|
return zipBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use the `supportsResponseStreaming` property instead.
|
||||||
|
*/
|
||||||
|
get experimentalResponseStreaming(): boolean | undefined {
|
||||||
|
return this.supportsResponseStreaming;
|
||||||
|
}
|
||||||
|
set experimentalResponseStreaming(v: boolean | undefined) {
|
||||||
|
this.supportsResponseStreaming = v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const sema = new Sema(10);
|
const sema = new Sema(10);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ interface PrerenderOptions {
|
|||||||
initialHeaders?: Record<string, string>;
|
initialHeaders?: Record<string, string>;
|
||||||
initialStatus?: number;
|
initialStatus?: number;
|
||||||
passQuery?: boolean;
|
passQuery?: boolean;
|
||||||
|
sourcePath?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Prerender {
|
export class Prerender {
|
||||||
@@ -24,6 +25,7 @@ export class Prerender {
|
|||||||
public initialHeaders?: Record<string, string>;
|
public initialHeaders?: Record<string, string>;
|
||||||
public initialStatus?: number;
|
public initialStatus?: number;
|
||||||
public passQuery?: boolean;
|
public passQuery?: boolean;
|
||||||
|
public sourcePath?: string;
|
||||||
|
|
||||||
constructor({
|
constructor({
|
||||||
expiration,
|
expiration,
|
||||||
@@ -35,9 +37,11 @@ export class Prerender {
|
|||||||
initialHeaders,
|
initialHeaders,
|
||||||
initialStatus,
|
initialStatus,
|
||||||
passQuery,
|
passQuery,
|
||||||
|
sourcePath,
|
||||||
}: PrerenderOptions) {
|
}: PrerenderOptions) {
|
||||||
this.type = 'Prerender';
|
this.type = 'Prerender';
|
||||||
this.expiration = expiration;
|
this.expiration = expiration;
|
||||||
|
this.sourcePath = sourcePath;
|
||||||
|
|
||||||
this.lambda = lambda;
|
this.lambda = lambda;
|
||||||
if (this.lambda) {
|
if (this.lambda) {
|
||||||
|
|||||||
@@ -355,6 +355,8 @@ export interface BuilderV3 {
|
|||||||
|
|
||||||
type ImageFormat = 'image/avif' | 'image/webp';
|
type ImageFormat = 'image/avif' | 'image/webp';
|
||||||
|
|
||||||
|
type ImageContentDispositionType = 'inline' | 'attachment';
|
||||||
|
|
||||||
export type RemotePattern = {
|
export type RemotePattern = {
|
||||||
/**
|
/**
|
||||||
* Must be `http` or `https`.
|
* Must be `http` or `https`.
|
||||||
@@ -390,6 +392,7 @@ export interface Images {
|
|||||||
formats?: ImageFormat[];
|
formats?: ImageFormat[];
|
||||||
dangerouslyAllowSVG?: boolean;
|
dangerouslyAllowSVG?: boolean;
|
||||||
contentSecurityPolicy?: string;
|
contentSecurityPolicy?: string;
|
||||||
|
contentDispositionType?: ImageContentDispositionType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,8 +4,7 @@
|
|||||||
"probes": [
|
"probes": [
|
||||||
{
|
{
|
||||||
"path": "/",
|
"path": "/",
|
||||||
"mustContain": "pnpm version: 6",
|
"mustContain": "pnpm version: 7"
|
||||||
"logMustContain": "pnpm run build"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
9
packages/build-utils/test/fixtures/27-pnpm-v7/package.json
vendored
Normal file
9
packages/build-utils/test/fixtures/27-pnpm-v7/package.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "mkdir -p public && (printf \"pnpm version: \" && pnpm -v) > public/index.txt"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"once": "^1.4.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
21
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-lock.yaml
generated
vendored
Normal file
21
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-lock.yaml
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
lockfileVersion: 5.4
|
||||||
|
|
||||||
|
importers:
|
||||||
|
|
||||||
|
.:
|
||||||
|
specifiers:
|
||||||
|
once: ^1.4.0
|
||||||
|
dependencies:
|
||||||
|
once: 1.4.0
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
/once/1.4.0:
|
||||||
|
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||||
|
dependencies:
|
||||||
|
wrappy: 1.0.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/wrappy/1.0.2:
|
||||||
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
|
dev: false
|
||||||
1
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-workspace.yaml
vendored
Normal file
1
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-workspace.yaml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Empty so this is treated as its own pnpm workspace
|
||||||
8
packages/build-utils/test/fixtures/27-pnpm-v7/probes.json
vendored
Normal file
8
packages/build-utils/test/fixtures/27-pnpm-v7/probes.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"probes": [
|
||||||
|
{
|
||||||
|
"path": "/",
|
||||||
|
"mustContain": "pnpm version: 7"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
9
packages/build-utils/test/fixtures/28-pnpm-v8/package.json
vendored
Normal file
9
packages/build-utils/test/fixtures/28-pnpm-v8/package.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build": "mkdir -p public && (printf \"pnpm version: \" && pnpm -v) > public/index.txt"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"once": "^1.4.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
21
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-lock.yaml
generated
vendored
Normal file
21
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-lock.yaml
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
lockfileVersion: '6.0'
|
||||||
|
|
||||||
|
importers:
|
||||||
|
|
||||||
|
.:
|
||||||
|
dependencies:
|
||||||
|
once:
|
||||||
|
specifier: ^1.4.0
|
||||||
|
version: 1.4.0
|
||||||
|
|
||||||
|
packages:
|
||||||
|
|
||||||
|
/once@1.4.0:
|
||||||
|
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||||
|
dependencies:
|
||||||
|
wrappy: 1.0.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/wrappy@1.0.2:
|
||||||
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
|
dev: false
|
||||||
1
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-workspace.yaml
vendored
Normal file
1
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-workspace.yaml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Empty so this is treated as its own pnpm workspace
|
||||||
8
packages/build-utils/test/fixtures/28-pnpm-v8/probes.json
vendored
Normal file
8
packages/build-utils/test/fixtures/28-pnpm-v8/probes.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"probes": [
|
||||||
|
{
|
||||||
|
"path": "/",
|
||||||
|
"mustContain": "pnpm version: 8"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -30,8 +30,8 @@ describe('Test `getPlatformEnv()`', () => {
|
|||||||
process.env.NOW_FOO = 'bar';
|
process.env.NOW_FOO = 'bar';
|
||||||
process.env.VERCEL_FOO = 'baz';
|
process.env.VERCEL_FOO = 'baz';
|
||||||
getPlatformEnv('FOO');
|
getPlatformEnv('FOO');
|
||||||
} catch (_err) {
|
} catch (_err: unknown) {
|
||||||
err = _err;
|
err = _err as Error;
|
||||||
} finally {
|
} finally {
|
||||||
delete process.env.NOW_FOO;
|
delete process.env.NOW_FOO;
|
||||||
delete process.env.VERCEL_FOO;
|
delete process.env.VERCEL_FOO;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ describe('Test `getPrefixedEnvVars()`', () => {
|
|||||||
VERCEL: '1',
|
VERCEL: '1',
|
||||||
VERCEL_URL: 'example.vercel.sh',
|
VERCEL_URL: 'example.vercel.sh',
|
||||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||||
|
VERCEL_ARTIFACTS_TOKEN: 'abc123',
|
||||||
FOO: 'bar',
|
FOO: 'bar',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -28,6 +29,7 @@ describe('Test `getPrefixedEnvVars()`', () => {
|
|||||||
envPrefix: 'GATSBY_',
|
envPrefix: 'GATSBY_',
|
||||||
envs: {
|
envs: {
|
||||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||||
|
VERCEL_ARTIFACTS_TOKEN: 'abc123',
|
||||||
FOO: 'bar',
|
FOO: 'bar',
|
||||||
VERCEL_URL: 'example.vercel.sh',
|
VERCEL_URL: 'example.vercel.sh',
|
||||||
VERCEL_ENV: 'production',
|
VERCEL_ENV: 'production',
|
||||||
@@ -51,6 +53,7 @@ describe('Test `getPrefixedEnvVars()`', () => {
|
|||||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||||
FOO: 'bar',
|
FOO: 'bar',
|
||||||
BLARG_VERCEL_THING: 'fake',
|
BLARG_VERCEL_THING: 'fake',
|
||||||
|
VERCEL_ARTIFACTS_TOKEN: 'abc123',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
want: {},
|
want: {},
|
||||||
|
|||||||
77
packages/build-utils/test/unit.read-config-file.test.ts
vendored
Normal file
77
packages/build-utils/test/unit.read-config-file.test.ts
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
import { join } from 'path';
|
||||||
|
import { writeFile, rm } from 'fs/promises';
|
||||||
|
import { readConfigFile } from '../src';
|
||||||
|
|
||||||
|
describe('Test `readConfigFile()`', () => {
|
||||||
|
let logMessages: string[];
|
||||||
|
const originalConsoleLog = console.log;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
logMessages = [];
|
||||||
|
console.log = m => {
|
||||||
|
logMessages.push(m);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
console.log = originalConsoleLog;
|
||||||
|
});
|
||||||
|
|
||||||
|
const doesnotexist = join(__dirname, 'does-not-exist.json');
|
||||||
|
const tsconfig = join(__dirname, '../tsconfig.json');
|
||||||
|
const invalid = join(__dirname, 'invalid.json');
|
||||||
|
|
||||||
|
it('should return null when file does not exist', async () => {
|
||||||
|
expect(await readConfigFile(doesnotexist)).toBeNull();
|
||||||
|
expect(logMessages).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return parsed object when file exists', async () => {
|
||||||
|
expect(await readConfigFile(tsconfig)).toMatchObject({
|
||||||
|
compilerOptions: {
|
||||||
|
strict: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(logMessages).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return parsed object when at least one file exists', async () => {
|
||||||
|
const files = [doesnotexist, tsconfig];
|
||||||
|
expect(await readConfigFile(files)).toMatchObject({
|
||||||
|
compilerOptions: {
|
||||||
|
strict: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(logMessages).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return null when parse fails', async () => {
|
||||||
|
try {
|
||||||
|
await writeFile(invalid, 'borked');
|
||||||
|
expect(await readConfigFile(invalid)).toBeNull();
|
||||||
|
} finally {
|
||||||
|
await rm(invalid);
|
||||||
|
}
|
||||||
|
expect(logMessages.length).toBe(1);
|
||||||
|
expect(logMessages[0]).toMatch(
|
||||||
|
/^Error while parsing config file.+invalid.json/
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return parsed object when at least one file is valid', async () => {
|
||||||
|
try {
|
||||||
|
await writeFile(invalid, 'borked');
|
||||||
|
expect(await readConfigFile([invalid, tsconfig])).toMatchObject({
|
||||||
|
compilerOptions: {
|
||||||
|
strict: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
await rm(invalid);
|
||||||
|
}
|
||||||
|
expect(logMessages.length).toBe(1);
|
||||||
|
expect(logMessages[0]).toMatch(
|
||||||
|
/^Error while parsing config file.+invalid.json/
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
9
packages/build-utils/test/unit.test.ts
vendored
9
packages/build-utils/test/unit.test.ts
vendored
@@ -480,7 +480,7 @@ it('should detect package.json in nested backend', async () => {
|
|||||||
const result = await scanParentDirs(fixture);
|
const result = await scanParentDirs(fixture);
|
||||||
expect(result.cliType).toEqual('pnpm');
|
expect(result.cliType).toEqual('pnpm');
|
||||||
// There is no lockfile but this test will pick up vercel/vercel/pnpm-lock.yaml
|
// There is no lockfile but this test will pick up vercel/vercel/pnpm-lock.yaml
|
||||||
expect(result.lockfileVersion).toEqual(5.4);
|
expect(result.lockfileVersion).toEqual(6);
|
||||||
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
|
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -492,7 +492,7 @@ it('should detect package.json in nested frontend', async () => {
|
|||||||
const result = await scanParentDirs(fixture);
|
const result = await scanParentDirs(fixture);
|
||||||
expect(result.cliType).toEqual('pnpm');
|
expect(result.cliType).toEqual('pnpm');
|
||||||
// There is no lockfile but this test will pick up vercel/vercel/pnpm-lock.yaml
|
// There is no lockfile but this test will pick up vercel/vercel/pnpm-lock.yaml
|
||||||
expect(result.lockfileVersion).toEqual(5.4);
|
expect(result.lockfileVersion).toEqual(6);
|
||||||
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
|
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -506,6 +506,11 @@ it('should retry npm install when peer deps invalid and npm@8 on node@16', async
|
|||||||
console.log('Skipping test on windows');
|
console.log('Skipping test on windows');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
console.log('Skipping test on mac');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const fixture = path.join(__dirname, 'fixtures', '15-npm-8-legacy-peer-deps');
|
const fixture = path.join(__dirname, 'fixtures', '15-npm-8-legacy-peer-deps');
|
||||||
const nodeVersion = { major: nodeMajor } as any;
|
const nodeVersion = { major: nodeMajor } as any;
|
||||||
await runNpmInstall(fixture, [], {}, {}, nodeVersion);
|
await runNpmInstall(fixture, [], {}, {}, nodeVersion);
|
||||||
|
|||||||
17
packages/cli/jest.config.js
Normal file
17
packages/cli/jest.config.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/** @type {import('@ts-jest/dist/types').InitialOptionsTsJest} */
|
||||||
|
module.exports = {
|
||||||
|
preset: 'ts-jest',
|
||||||
|
transform: {
|
||||||
|
'^.+\\.[tj]s$': [
|
||||||
|
'ts-jest',
|
||||||
|
{
|
||||||
|
diagnostics: true,
|
||||||
|
isolatedModules: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
setupFilesAfterEnv: ['@alex_neo/jest-expect-message'],
|
||||||
|
verbose: false,
|
||||||
|
testEnvironment: 'node',
|
||||||
|
testMatch: ['<rootDir>/test/**/*.test.ts'],
|
||||||
|
};
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vercel",
|
"name": "vercel",
|
||||||
"version": "28.16.0",
|
"version": "29.0.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",
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
"preinstall": "node ./scripts/preinstall.js",
|
"preinstall": "node ./scripts/preinstall.js",
|
||||||
"test": "jest --env node --verbose --bail",
|
"test": "jest --env node --verbose --bail",
|
||||||
"test-unit": "pnpm test test/unit/",
|
"test-unit": "pnpm test test/unit/",
|
||||||
"test-cli": "rimraf test/fixtures/integration && ava test/integration.js --serial --fail-fast --verbose",
|
"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": "ts-node ./scripts/build.ts",
|
||||||
@@ -28,29 +28,20 @@
|
|||||||
"dist",
|
"dist",
|
||||||
"scripts/preinstall.js"
|
"scripts/preinstall.js"
|
||||||
],
|
],
|
||||||
"ava": {
|
|
||||||
"extensions": [
|
|
||||||
"ts"
|
|
||||||
],
|
|
||||||
"require": [
|
|
||||||
"ts-node/register/transpile-only",
|
|
||||||
"esm"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 14"
|
"node": ">= 14"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vercel/build-utils": "6.3.0",
|
"@vercel/build-utils": "6.7.2",
|
||||||
"@vercel/go": "2.3.7",
|
"@vercel/go": "2.5.1",
|
||||||
"@vercel/hydrogen": "0.0.53",
|
"@vercel/hydrogen": "0.0.64",
|
||||||
"@vercel/next": "3.4.7",
|
"@vercel/next": "3.7.6",
|
||||||
"@vercel/node": "2.9.6",
|
"@vercel/node": "2.13.0",
|
||||||
"@vercel/python": "3.1.49",
|
"@vercel/python": "3.1.60",
|
||||||
"@vercel/redwood": "1.1.5",
|
"@vercel/redwood": "1.1.15",
|
||||||
"@vercel/remix": "1.3.3",
|
"@vercel/remix-builder": "1.8.6",
|
||||||
"@vercel/ruby": "1.3.65",
|
"@vercel/ruby": "1.3.76",
|
||||||
"@vercel/static-build": "1.3.9"
|
"@vercel/static-build": "1.3.26"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@alex_neo/jest-expect-message": "1.0.5",
|
"@alex_neo/jest-expect-message": "1.0.5",
|
||||||
@@ -93,13 +84,16 @@
|
|||||||
"@types/which": "1.3.2",
|
"@types/which": "1.3.2",
|
||||||
"@types/write-json-file": "2.2.1",
|
"@types/write-json-file": "2.2.1",
|
||||||
"@types/yauzl-promise": "2.1.0",
|
"@types/yauzl-promise": "2.1.0",
|
||||||
"@vercel/client": "12.4.0",
|
"@vercel-internals/constants": "*",
|
||||||
"@vercel/error-utils": "1.0.8",
|
"@vercel-internals/get-package-json": "*",
|
||||||
"@vercel/frameworks": "1.3.1",
|
"@vercel-internals/types": "*",
|
||||||
"@vercel/fs-detectors": "3.7.14",
|
"@vercel/client": "12.4.12",
|
||||||
|
"@vercel/error-utils": "1.0.10",
|
||||||
|
"@vercel/frameworks": "1.3.5",
|
||||||
|
"@vercel/fs-detectors": "3.8.12",
|
||||||
"@vercel/fun": "1.0.4",
|
"@vercel/fun": "1.0.4",
|
||||||
"@vercel/ncc": "0.24.0",
|
"@vercel/ncc": "0.24.0",
|
||||||
"@vercel/routing-utils": "2.1.9",
|
"@vercel/routing-utils": "2.2.1",
|
||||||
"@zeit/source-map-support": "0.6.2",
|
"@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",
|
||||||
@@ -109,7 +103,6 @@
|
|||||||
"async-listen": "1.2.0",
|
"async-listen": "1.2.0",
|
||||||
"async-retry": "1.1.3",
|
"async-retry": "1.1.3",
|
||||||
"async-sema": "2.1.4",
|
"async-sema": "2.1.4",
|
||||||
"ava": "2.2.0",
|
|
||||||
"bytes": "3.0.0",
|
"bytes": "3.0.0",
|
||||||
"chalk": "4.1.0",
|
"chalk": "4.1.0",
|
||||||
"chance": "1.1.7",
|
"chance": "1.1.7",
|
||||||
@@ -140,12 +133,11 @@
|
|||||||
"is-url": "1.2.2",
|
"is-url": "1.2.2",
|
||||||
"jaro-winkler": "0.2.8",
|
"jaro-winkler": "0.2.8",
|
||||||
"jest-matcher-utils": "29.3.1",
|
"jest-matcher-utils": "29.3.1",
|
||||||
"json5": "2.2.1",
|
|
||||||
"jsonlines": "0.1.1",
|
"jsonlines": "0.1.1",
|
||||||
"line-async-iterator": "3.0.0",
|
"line-async-iterator": "3.0.0",
|
||||||
"load-json-file": "3.0.0",
|
"load-json-file": "3.0.0",
|
||||||
"mime-types": "2.1.24",
|
"mime-types": "2.1.24",
|
||||||
"minimatch": "3.0.4",
|
"minimatch": "3.1.2",
|
||||||
"mri": "1.1.5",
|
"mri": "1.1.5",
|
||||||
"ms": "2.1.2",
|
"ms": "2.1.2",
|
||||||
"node-fetch": "2.6.7",
|
"node-fetch": "2.6.7",
|
||||||
@@ -171,28 +163,10 @@
|
|||||||
"tmp-promise": "1.0.3",
|
"tmp-promise": "1.0.3",
|
||||||
"tree-kill": "1.2.2",
|
"tree-kill": "1.2.2",
|
||||||
"ts-node": "10.9.1",
|
"ts-node": "10.9.1",
|
||||||
"typescript": "4.9.4",
|
|
||||||
"universal-analytics": "0.4.20",
|
"universal-analytics": "0.4.20",
|
||||||
"utility-types": "2.1.0",
|
"utility-types": "2.1.0",
|
||||||
"write-json-file": "2.2.0",
|
"write-json-file": "2.2.0",
|
||||||
"xdg-app-paths": "5.1.0",
|
"xdg-app-paths": "5.1.0",
|
||||||
"yauzl-promise": "2.1.3"
|
"yauzl-promise": "2.1.3"
|
||||||
},
|
|
||||||
"jest": {
|
|
||||||
"preset": "ts-jest",
|
|
||||||
"globals": {
|
|
||||||
"ts-jest": {
|
|
||||||
"diagnostics": false,
|
|
||||||
"isolatedModules": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"setupFilesAfterEnv": [
|
|
||||||
"@alex_neo/jest-expect-message"
|
|
||||||
],
|
|
||||||
"verbose": false,
|
|
||||||
"testEnvironment": "node",
|
|
||||||
"testMatch": [
|
|
||||||
"<rootDir>/test/**/*.test.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,9 +36,7 @@ async function main() {
|
|||||||
const def = await readFile(fnPath.replace(/\.js$/, '.tsdef'), 'utf8');
|
const def = await readFile(fnPath.replace(/\.js$/, '.tsdef'), 'utf8');
|
||||||
const interfaceName = def.match(/interface (\w+)/)[1];
|
const interfaceName = def.match(/interface (\w+)/)[1];
|
||||||
|
|
||||||
const lines = require(fnPath)
|
const lines = require(fnPath).toString().split('\n');
|
||||||
.toString()
|
|
||||||
.split('\n');
|
|
||||||
let errorHtmlStart = -1;
|
let errorHtmlStart = -1;
|
||||||
let errorHtmlEnd = -1;
|
let errorHtmlEnd = -1;
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import stamp from '../../util/output/stamp';
|
|||||||
import strlen from '../../util/strlen';
|
import strlen from '../../util/strlen';
|
||||||
import getCommandFlags from '../../util/get-command-flags';
|
import getCommandFlags from '../../util/get-command-flags';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
import { Alias } from '../../types';
|
import type { Alias } from '@vercel-internals/types';
|
||||||
|
|
||||||
export default async function ls(
|
export default async function ls(
|
||||||
client: Client,
|
client: Client,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import strlen from '../../util/strlen';
|
|||||||
import confirm from '../../util/input/confirm';
|
import confirm from '../../util/input/confirm';
|
||||||
import findAliasByAliasOrId from '../../util/alias/find-alias-by-alias-or-id';
|
import findAliasByAliasOrId from '../../util/alias/find-alias-by-alias-or-id';
|
||||||
|
|
||||||
import { Alias } from '../../types';
|
import type { Alias } from '@vercel-internals/types';
|
||||||
import { isValidName } from '../../util/is-valid-name';
|
import { isValidName } from '../../util/is-valid-name';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import { SetDifference } from 'utility-types';
|
import { SetDifference } from 'utility-types';
|
||||||
import { AliasRecord } from '../../util/alias/create-alias';
|
import { AliasRecord } from '../../util/alias/create-alias';
|
||||||
import { Domain } from '../../types';
|
import type { Domain } from '@vercel-internals/types';
|
||||||
import { Output } from '../../util/output';
|
import { Output } from '../../util/output';
|
||||||
import * as ERRORS from '../../util/errors-ts';
|
import * as ERRORS from '../../util/errors-ts';
|
||||||
import assignAlias from '../../util/alias/assign-alias';
|
import assignAlias from '../../util/alias/assign-alias';
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import logo from '../../util/output/logo';
|
|||||||
import getArgs from '../../util/get-args';
|
import getArgs from '../../util/get-args';
|
||||||
import Client from '../../util/client';
|
import Client from '../../util/client';
|
||||||
import { getPkgName } from '../../util/pkg-name';
|
import { getPkgName } from '../../util/pkg-name';
|
||||||
import { Deployment, PaginationOptions } from '../../types';
|
import { Deployment, PaginationOptions } from '@vercel-internals/types';
|
||||||
import { normalizeURL } from '../../util/bisect/normalize-url';
|
import { normalizeURL } from '../../util/bisect/normalize-url';
|
||||||
import getScope from '../../util/get-scope';
|
import getScope from '../../util/get-scope';
|
||||||
import getDeployment from '../../util/get-deployment';
|
import getDeployment from '../../util/get-deployment';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import fs from 'fs-extra';
|
import fs from 'fs-extra';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import dotenv from 'dotenv';
|
import dotenv from 'dotenv';
|
||||||
import { join, normalize, relative, resolve } from 'path';
|
import { join, normalize, relative, resolve, sep } from 'path';
|
||||||
import {
|
import {
|
||||||
getDiscontinuedNodeVersions,
|
getDiscontinuedNodeVersions,
|
||||||
normalizePath,
|
normalizePath,
|
||||||
@@ -157,6 +157,7 @@ export default async function main(client: Client): Promise<number> {
|
|||||||
'--output': String,
|
'--output': String,
|
||||||
'--prod': Boolean,
|
'--prod': Boolean,
|
||||||
'--yes': Boolean,
|
'--yes': Boolean,
|
||||||
|
'-y': '--yes',
|
||||||
});
|
});
|
||||||
|
|
||||||
if (argv['--help']) {
|
if (argv['--help']) {
|
||||||
@@ -251,7 +252,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 Analytics support
|
// For Vercel 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;
|
||||||
@@ -296,13 +297,15 @@ async function doBuild(
|
|||||||
cwd: string,
|
cwd: string,
|
||||||
outputDir: string
|
outputDir: string
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const { output } = client;
|
const { localConfigPath, output } = client;
|
||||||
|
|
||||||
const workPath = join(cwd, project.settings.rootDirectory || '.');
|
const workPath = join(cwd, project.settings.rootDirectory || '.');
|
||||||
|
|
||||||
const [pkg, vercelConfig, nowConfig] = await Promise.all([
|
const [pkg, vercelConfig, nowConfig] = await Promise.all([
|
||||||
readJSONFile<PackageJson>(join(workPath, 'package.json')),
|
readJSONFile<PackageJson>(join(workPath, 'package.json')),
|
||||||
readJSONFile<VercelConfig>(join(workPath, 'vercel.json')),
|
readJSONFile<VercelConfig>(
|
||||||
|
localConfigPath || join(workPath, 'vercel.json')
|
||||||
|
),
|
||||||
readJSONFile<VercelConfig>(join(workPath, 'now.json')),
|
readJSONFile<VercelConfig>(join(workPath, 'now.json')),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -710,7 +713,9 @@ function expandBuild(files: string[], build: Builder): Builder[] {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let src = normalize(build.src || '**');
|
let src = normalize(build.src || '**')
|
||||||
|
.split(sep)
|
||||||
|
.join('/');
|
||||||
if (src === '.' || src === './') {
|
if (src === '.' || src === './') {
|
||||||
throw new NowBuildError({
|
throw new NowBuildError({
|
||||||
code: `invalid_build_specification`,
|
code: `invalid_build_specification`,
|
||||||
@@ -751,12 +756,12 @@ function mergeImages(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mergeCrons(
|
function mergeCrons(
|
||||||
crons: BuildOutputConfig['crons'],
|
crons: BuildOutputConfig['crons'] = [],
|
||||||
buildResults: Iterable<BuildResult | BuildOutputConfig>
|
buildResults: Iterable<BuildResult | BuildOutputConfig>
|
||||||
): BuildOutputConfig['crons'] {
|
): BuildOutputConfig['crons'] {
|
||||||
for (const result of buildResults) {
|
for (const result of buildResults) {
|
||||||
if ('crons' in result && result.crons) {
|
if ('crons' in result && result.crons) {
|
||||||
crons = Object.assign({}, crons, result.crons);
|
crons = crons.concat(result.crons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return crons;
|
return crons;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import stamp from '../../util/output/stamp';
|
|||||||
import createCertFromFile from '../../util/certs/create-cert-from-file';
|
import createCertFromFile from '../../util/certs/create-cert-from-file';
|
||||||
import createCertForCns from '../../util/certs/create-cert-for-cns';
|
import createCertForCns from '../../util/certs/create-cert-for-cns';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
import { Cert } from '../../types';
|
import type { Cert } from '@vercel-internals/types';
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
'--overwrite'?: boolean;
|
'--overwrite'?: boolean;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
import stamp from '../../util/output/stamp';
|
import stamp from '../../util/output/stamp';
|
||||||
import getCerts from '../../util/certs/get-certs';
|
import getCerts from '../../util/certs/get-certs';
|
||||||
import strlen from '../../util/strlen';
|
import strlen from '../../util/strlen';
|
||||||
import { Cert } from '../../types';
|
import type { Cert } from '@vercel-internals/types';
|
||||||
import getCommandFlags from '../../util/get-command-flags';
|
import getCommandFlags from '../../util/get-command-flags';
|
||||||
import { getCommandName } from '../../util/pkg-name';
|
import { getCommandName } from '../../util/pkg-name';
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user