Compare commits

...

43 Commits

Author SHA1 Message Date
Steven
8cd84ec066 Publish Stable
- @vercel/build-utils@5.5.2
 - vercel@28.4.4
 - @vercel/client@12.2.9
 - @vercel/go@2.2.10
 - @vercel/hydrogen@0.0.23
 - @vercel/next@3.2.0
 - @vercel/node@2.5.20
 - @vercel/python@3.1.19
 - @vercel/redwood@1.0.28
 - @vercel/remix@1.0.29
 - @vercel/ruby@1.3.36
 - @vercel/static-build@1.0.28
2022-09-27 16:35:00 -04:00
Steven
a8df231e4c [build-utils] Fix npm version detection for --legacy-peer-deps (#8646)
There was a case where the npm version wasn't decided base on Node.js version but instead based on the lockfile.
This PR fixes the case when a newer npm version is detected base on the lockfile.

- Follow up to #8598
- Follow up to #8550
2022-09-27 16:33:24 -04:00
Gal Schlezinger
f674842bed [next] read regions from middleware-manifest output (#8629)
### Related Issues

- Needs https://github.com/vercel/next.js/pull/40881 for this to be
useful
- Resolves EC-238

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [ ] The code changed/added as part of this PR has been covered with
tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a
reviewer
- [ ] Issue from task tracker has a link to this PR

Co-authored-by: Steven <steven@ceriously.com>
Co-authored-by: JJ Kasper <jj@jjsweb.site>
2022-09-27 10:46:02 -07:00
Steven
bf5cfa9a41 Publish Stable
- @vercel/build-utils@5.5.1
 - vercel@28.4.3
 - @vercel/client@12.2.8
 - @vercel/go@2.2.9
 - @vercel/hydrogen@0.0.22
 - @vercel/next@3.1.30
 - @vercel/node@2.5.19
 - @vercel/python@3.1.18
 - @vercel/redwood@1.0.27
 - @vercel/remix@1.0.28
 - @vercel/ruby@1.3.35
 - @vercel/static-build@1.0.27
2022-09-27 09:39:04 -04:00
JJ Kasper
12121b7a71 [next] Fix build time 404 route with trailingSlash: true (#8627)
This ensures we properly handle trailing slashes in the `notFound: true` build time routes. 

Fixes: [slack thread](https://vercel.slack.com/archives/C03S8ED1DKM/p1663691719703509)
2022-09-27 09:21:49 -04:00
Steven
baa56aed2c [tests] Fix timeout for actions/setup-node (#8639)
Try fixing the timeout again. For example: https://github.com/vercel/vercel/actions/runs/3130757219/jobs/5081381465

- Follow up to #8613 
- Related to https://github.com/actions/cache/issues/810 
- Related to https://github.com/Azure/azure-sdk-for-js/issues/22321
2022-09-26 18:33:43 -04:00
Steven
6f767367e4 [build-utils] Adjust nodejs12.x discontinueDate to Monday (#8638)
The previous date was on a Saturday so lets move it to the following Monday to ensure support tickets are quickly answered.
2022-09-26 22:22:32 +00:00
Sean Massa
0e4124f94c [cli] fix vc bisect off by one (#8399)
Co-authored-by: Nathan Rajlich <n@n8.io>
2022-09-26 14:47:15 -05:00
Sean Massa
30503d0a3f [go] remove unused, breaking watchlist from Go builder (#8633) 2022-09-26 14:31:36 -05:00
Steven
6c9164f67d [cli] Refactor doBuild to return void (#8626)
This PR refactor `doBuild()` to return `void`.

This will prevent accidental bugs like #8623 where an exit code number was returned instead of throwing on error.
2022-09-24 01:25:59 +00:00
Steven
906b7a8f2c [cli] Fix invalid vercel.json config error serialization (#8623)
Follow up to #8622 since we should be throwing errors so the error is correctly serialized to `builds.json`.
2022-09-23 22:08:53 +00:00
Steven
43499b13d8 [cli] Add vercel.json validation to vercel build (#8622)
We were doing this validation in `vercel dev` but not `vercel build`.

This PR adds `vercel.json` validation to `vercel build` too.

Note I am calling this a patch because invalid `vercel.json` was already failing when passed to the API so this allows a nice error message earlier in the process.
2022-09-23 20:33:28 +00:00
Sean Massa
7d6e56670f [cli][dev] Add strict mode to vc dev edge function handlers (#8616)
Add strict mode to `vc dev` edge function handlers. This is behind a flag in production, but that flag has been at 100% for a while. So, it seems safe to include it here unconditionally.

Also remove legal comments.

These changes bring `vc dev` edge function support closer to production.
2022-09-23 14:23:03 +00:00
Sean Massa
dba337f148 [cli][dev] extract edge/serverless handler logic into separate files (#8615) 2022-09-22 16:34:32 -05:00
Steven
a825bc9540 Publish Stable
- @vercel/build-utils@5.5.0
 - vercel@28.4.2
 - @vercel/client@12.2.7
 - @vercel/go@2.2.8
 - @vercel/hydrogen@0.0.21
 - @vercel/next@3.1.29
 - @vercel/node@2.5.18
 - @vercel/python@3.1.17
 - @vercel/redwood@1.0.26
 - @vercel/remix@1.0.27
 - @vercel/ruby@1.3.34
 - @vercel/static-build@1.0.26
2022-09-22 16:50:27 -04:00
JJ Kasper
f5486a8297 [next] Update to route app rsc paths correctly (#8611)
### Related Issues

x-ref: [slack thread](https://vercel.slack.com/archives/C035J346QQL/p1663799417151099)

Failing probes are unrelated, more info can be seen in [this thread](https://vercel.slack.com/archives/C035J346QQL/p1663820032810519?thread_ts=1663775935.504379&cid=C035J346QQL)
2022-09-22 20:44:40 +00:00
Mark Glagola
225e0a4de3 [tests] Use new VERCEL_TEST_TOKEN for tests (#8614)
Use `VERCEL_TEST_TOKEN` for tests
2022-09-22 16:07:43 -04:00
Steven
0ecfdc1325 [tests] Add timeout for broken actions/setup-node@v3 (#8613)
This PR will make sure that CI fails fast if there is a network issue when restoring the cache.

This has been a known issue for 3 months and no resolution:

- https://github.com/actions/cache/issues/810
2022-09-22 14:42:48 +00:00
Gal Schlezinger
628409d233 [build-utils] support providing execution regions in Edge Functions (#8612) 2022-09-22 14:38:33 +03:00
Steven
51d968314f Publish Stable
- vercel@28.4.1
 - @vercel/fs-detectors@3.4.0
 - @vercel/next@3.1.28
 - @vercel/node@2.5.17
2022-09-21 18:47:45 -04:00
Chris Barber
b4e2cbc6e5 [tests] Test route src and dest for normalized path (#8609)
Adding assertions for normalized routes.
2022-09-21 18:44:52 -04:00
Jiachi Liu
7323beea8e [next] fix app dir SSG deployment paths (#8608)
### Related Issues

Seeing this while deploying appDir to production. The collecting path is
not correct for generated dist from appDir
```
Collected static files (public/, static/, .next/static): 18.834ms
Error: ENOENT: no such file or directory, open '/vercel/path0/.next/server/pages/route-groups/checkout.html'
Error: An unexpected error occurred!
Error: ENOENT: no such file or directory, open '/vercel/path0/.next/server/pages/route-groups/checkout.html'
Error: Command "vercel build" exited with 1
```

Fix the deployment of SSG, the output html/json paths should be prefixed
with `/app`

Adding a TODO now for how to determine the app path route, leveraging
`.rsc` suffix in data route. Better to use app paths manifest to
refactor it later.

### 📋 Checklist
<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [x] The code changed/added as part of this PR has been covered with
tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [x] This PR has a concise title and thorough description useful to a
reviewer
- [ ] Issue from task tracker has a link to this PR

Co-authored-by: JJ Kasper <jj@jjsweb.site>
2022-09-21 15:40:38 -07:00
Chris Barber
e4bb311144 [cli] Disable git status background index refresh/optimization (#8569)
The `create-git-meta` file contains a `isDirty()` function which calls `git status` and subsequently causes one of the test fixture's git index to be updated. Turns out that `git status` will update/optimize the index in the background when invoked: https://git-scm.com/docs/git-status#_background_refresh.

By disabling this using the `--no-optional-locks` flag, `isDirty()` will no longer update the index when checking the status.

From my testing, the `--no-optional-locks` flag must be set after `git` and before `status`.

This PR is likely a better alternative to https://github.com/vercel/vercel/pull/8568 as this PR eliminates the problem all together.

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-21 21:47:10 +00:00
Andrew Gadzik
288546659d [fs-detectors] ensure processing of potentialFiles for readdir cache hits (#8604)
This is to fix the issue with processing  new entries of `potentialFiles` when there was a `readdir` cache hit 

### Related Issues

Related to https://linear.app/vercel/issue/HIT-57/monorepo-detection-api-prevent-rate-limits

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [ ] The code changed/added as part of this PR has been covered with tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-21 20:59:21 +00:00
Sean Massa
822224e212 [cli][dev] Use browser platform when bundling edge functions for vc dev (#8605) 2022-09-21 15:50:22 -05:00
Nathan Rajlich
6b23950b65 [cli] Don't set analyticsId when Vercel Analytics are disabled in "vc pull" (#8607)
The `disabledAt` and `enabledAt` properties need to be consulted in order to determine whether or not the Vercel Analytics feature has been enabled.

Related to https://github.com/vercel/vercel/discussions/8575.
2022-09-21 19:54:34 +00:00
Chris Barber
1558f21e49 [tests] Added lock file for normalize paths test fixture (#8600)
Added a lock file to the normalize paths text fixture to speed up install dependencies.

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-21 19:31:27 +00:00
chloetedder
a6aee8b904 [fs-detectors] Rush json workspace (#8603)
### Related Issues

Add in getting the package paths for Rush workspaces.
First get the contents of the `rush.json` file. If the `projects`
property is an array, map through that array and return the
`projectFolder` as the package path.


### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [ ] The code changed/added as part of this PR has been covered with
tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a
reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-21 13:00:21 -05:00
Steven
27f4034bdc Publish Stable
- @vercel/build-utils@5.4.4
 - vercel@28.4.0
 - @vercel/client@12.2.6
 - @vercel/go@2.2.7
 - @vercel/hydrogen@0.0.20
 - @vercel/next@3.1.27
 - @vercel/node@2.5.16
 - @vercel/python@3.1.16
 - @vercel/redwood@1.0.25
 - @vercel/remix@1.0.26
 - @vercel/ruby@1.3.33
 - @vercel/static-build@1.0.25
2022-09-21 09:24:15 -04:00
Steven
e43b968fbe [build-utils] Retry with legacy peer deps on install failure (#8598)
In this PR, we try to detect when npm install fails due to invalid peer deps and retry with `--legacy-peer-deps`.

This is a follow up to PR #8550 that explains more.

Steps to reproduce the npm bug:

```sh
corepack enable npm
echo '{"packageManager":"npm@8.5.5","dependencies":{"swr":"1.3.0","react":"16.8.0"}}' > package.json
npm install --legacy-peer-deps
npm install # works fine now that a lockfile exists
echo '{"packageManager":"npm@8.6.0","dependencies":{"swr":"1.3.0","react":"16.8.0"}}' > package.json
npm install # fails with code ERESOLVE (Conflicting peer dependency)
```
2022-09-21 13:14:21 +00:00
Chris Barber
48eb720556 [build-utils][next] Remove Path once copied to PATH. (#8596)
Windows doesn't like it when the env has both a `PATH` and a `Path`, so `cloneEnv()` must remove `Path` after copying it to `PATH`.

Renamed the next builder `01-normalize-routes` test to `01-normalize-paths` as it's test normalization of output paths, then re-enabled the test for Windows.

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [x] The code changed/added as part of this PR has been covered with tests
- [x] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-20 22:10:26 +00:00
Steven
30e4d74db6 [tests] Add turbo caching to publish (#8597) 2022-09-20 20:50:56 +00:00
Steven
75840896ee [tests] Update workflows to use global env (#8594)
Follow up to #8586 because [that syntax](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable) never worked on windows
2022-09-20 20:16:54 +00:00
Nathan Rajlich
9657bda86d [cli] Add "images" optimization configuration support in vercel.json (#8566)
This is a (further 😄) continuation of #8379 by @theMosaad, so that the tests can run.

I also added a change to make `images` _not_ be sent to the create deployment API endpoint, since it fails validation there.
2022-09-20 19:58:20 +00:00
Steven
4536029d42 Revert "[fs-detectors] Rush json workspace" (#8591)
Reverts vercel/vercel#8565 since tests are failing on windows

https://github.com/vercel/vercel/actions/runs/3091763554/jobs/5002704682
2022-09-20 15:13:23 -04:00
Steven
a35654d047 [tests] Skip test 01-normalize-routes temporarily (#8590)
The  `01-normalize-routes` test is failing on windows so we need to temporarily disable until the root cause can be corrected.
2022-09-20 14:51:01 -04:00
github-actions[bot]
f6a01a1af3 [examples] Upgrade Next.js to version 12.3.1 (#8587)
This auto-generated PR updates Next.js to version 12.3.1
Co-authored-by: Steven <steven@ceriously.com>
2022-09-20 14:13:12 -04:00
chloetedder
c2bca954e0 [fs-detectors] Rush json workspace (#8565)
### Related Issues

Add in Rush workspace

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [ ] The code changed/added as part of this PR has been covered with
tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a
reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-20 12:14:45 -05:00
Steven
21701c3c3d [tests] Fix turbo remote cache (#8586)
Follow up to #7874 since the remote cache was not used on `main`.

We can unconditionally set these env vars with the latest turbo so it will work for contributors too.
2022-09-20 12:19:38 -04:00
JJ Kasper
7f4723b3f8 [next] Update local app edge test (#8588)
### Related Issues

Fixes:
https://github.com/vercel/vercel/actions/runs/3086450305/jobs/4990850756

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [ ] The code changed/added as part of this PR has been covered with
tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a
reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-19 18:15:13 -07:00
Sean Massa
619ca93421 Publish Stable
- @vercel/build-utils@5.4.3
 - vercel@28.3.0
 - @vercel/client@12.2.5
 - @vercel/frameworks@1.1.6
 - @vercel/fs-detectors@3.3.0
 - @vercel/go@2.2.6
 - @vercel/hydrogen@0.0.19
 - @vercel/next@3.1.26
 - @vercel/node@2.5.15
 - @vercel/python@3.1.15
 - @vercel/redwood@1.0.24
 - @vercel/remix@1.0.25
 - @vercel/ruby@1.3.32
 - @vercel/static-build@1.0.24
2022-09-19 16:40:10 -05:00
Steven
cea2981512 [tests] Change some runNpmInstall() unit tests to mocks (#8581)
- Closes #8580
2022-09-19 21:30:32 +00:00
JJ Kasper
1f30e3a4b7 [next] Update app test fixture (#8584)
### Related Issues

Updates our test fixture for related changes in latest canary of
Next.js.

Fixes: https://vercel.slack.com/archives/CGU8HUTUH/p1663607276817069

### 📋 Checklist

<!--
  Please keep your PR as a Draft until the checklist is complete
-->

#### Tests

- [ ] The code changed/added as part of this PR has been covered with
tests
- [ ] All tests pass locally with `yarn test-unit`

#### Code Review

- [ ] This PR has a concise title and thorough description useful to a
reviewer
- [ ] Issue from task tracker has a link to this PR
2022-09-19 13:08:10 -07:00
160 changed files with 2228 additions and 1088 deletions

View File

@@ -7,6 +7,11 @@ on:
tags: tags:
- '!*' - '!*'
env:
TURBO_REMOTE_ONLY: 'true'
TURBO_TEAM: 'vercel'
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
jobs: jobs:
publish: publish:
name: Publish name: Publish
@@ -32,6 +37,7 @@ jobs:
- 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
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with: with:
node-version: 14 node-version: 14
cache: 'yarn' cache: 'yarn'

View File

@@ -8,6 +8,11 @@ on:
- '!*' - '!*'
pull_request: pull_request:
env:
TURBO_REMOTE_ONLY: 'true'
TURBO_TEAM: 'vercel'
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
jobs: jobs:
test: test:
name: CLI name: CLI
@@ -19,12 +24,6 @@ jobs:
node: [14] node: [14]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- name: Conditionally set remote env
if: github.event.pull_request.head.repo.full_name == github.repository
run: |
echo "TURBO_REMOTE_ONLY=true" >> $GITHUB_ENV
echo "TURBO_TEAM=vercel" >> $GITHUB_ENV
echo "TURBO_TOKEN=${{ secrets.TURBO_TOKEN }}" >> $GITHUB_ENV
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
fetch-depth: 2 fetch-depth: 2
@@ -32,6 +31,7 @@ jobs:
with: with:
go-version: '1.13.15' go-version: '1.13.15'
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with: with:
node-version: ${{ matrix.node }} node-version: ${{ matrix.node }}
cache: 'yarn' cache: 'yarn'
@@ -39,5 +39,5 @@ jobs:
- run: yarn run build - run: yarn run build
- run: yarn test-integration-cli - run: yarn test-integration-cli
env: env:
VERCEL_TEAM_TOKEN: ${{ secrets.VERCEL_TEAM_TOKEN }} VERCEL_TEST_TOKEN: ${{ secrets.VERCEL_TEST_TOKEN }}
VERCEL_REGISTRATION_URL: ${{ secrets.VERCEL_REGISTRATION_URL }} VERCEL_TEST_REGISTRATION_URL: ${{ secrets.VERCEL_TEST_REGISTRATION_URL }}

View File

@@ -8,6 +8,11 @@ on:
- '!*' - '!*'
pull_request: pull_request:
env:
TURBO_REMOTE_ONLY: 'true'
TURBO_TEAM: 'vercel'
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
jobs: jobs:
test: test:
name: Unit name: Unit
@@ -19,12 +24,6 @@ jobs:
node: [14] node: [14]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- name: Conditionally set remote env
if: github.event.pull_request.head.repo.full_name == github.repository
run: |
echo "TURBO_REMOTE_ONLY=true" >> $GITHUB_ENV
echo "TURBO_TEAM=vercel" >> $GITHUB_ENV
echo "TURBO_TOKEN=${{ secrets.TURBO_TOKEN }}" >> $GITHUB_ENV
- uses: actions/setup-go@v3 - uses: actions/setup-go@v3
with: with:
go-version: '1.13.15' go-version: '1.13.15'
@@ -32,6 +31,7 @@ jobs:
with: with:
fetch-depth: 2 fetch-depth: 2
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with: with:
node-version: ${{ matrix.node }} node-version: ${{ matrix.node }}
cache: 'yarn' cache: 'yarn'

View File

@@ -10,6 +10,9 @@ on:
env: env:
NODE_VERSION: '14' NODE_VERSION: '14'
TURBO_REMOTE_ONLY: 'true'
TURBO_TEAM: 'vercel'
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
jobs: jobs:
setup: setup:
@@ -26,6 +29,7 @@ jobs:
with: with:
go-version: '1.13.15' go-version: '1.13.15'
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'yarn' cache: 'yarn'
@@ -55,12 +59,6 @@ jobs:
matrix: matrix:
include: ${{ fromJson(needs.setup.outputs['tests']) }} include: ${{ fromJson(needs.setup.outputs['tests']) }}
steps: steps:
- name: Conditionally set remote env
if: github.event.pull_request.head.repo.full_name == github.repository
run: |
echo "TURBO_REMOTE_ONLY=true" >> $GITHUB_ENV
echo "TURBO_TEAM=vercel" >> $GITHUB_ENV
echo "TURBO_TOKEN=${{ secrets.TURBO_TOKEN }}" >> $GITHUB_ENV
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
fetch-depth: 2 fetch-depth: 2
@@ -68,6 +66,7 @@ jobs:
with: with:
go-version: '1.13.15' go-version: '1.13.15'
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
timeout-minutes: 5 # See https://github.com/actions/cache/issues/810
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'yarn' cache: 'yarn'
@@ -87,8 +86,8 @@ jobs:
shell: bash shell: bash
env: env:
VERCEL_CLI_VERSION: ${{ needs.setup.outputs.dplUrl }}/tarballs/vercel.tgz VERCEL_CLI_VERSION: ${{ needs.setup.outputs.dplUrl }}/tarballs/vercel.tgz
VERCEL_TEAM_TOKEN: ${{ secrets.VERCEL_TEAM_TOKEN }} VERCEL_TEST_TOKEN: ${{ secrets.VERCEL_TEST_TOKEN }}
VERCEL_REGISTRATION_URL: ${{ secrets.VERCEL_REGISTRATION_URL }} VERCEL_TEST_REGISTRATION_URL: ${{ secrets.VERCEL_TEST_REGISTRATION_URL }}
FORCE_COLOR: '1' FORCE_COLOR: '1'
conclusion: conclusion:

View File

@@ -9,12 +9,12 @@
"lint": "next lint" "lint": "next lint"
}, },
"dependencies": { "dependencies": {
"next": "12.3.0", "next": "12.3.1",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0" "react-dom": "18.2.0"
}, },
"devDependencies": { "devDependencies": {
"eslint": "8.23.0", "eslint": "8.23.1",
"eslint-config-next": "12.3.0" "eslint-config-next": "12.3.1"
} }
} }

View File

@@ -3,11 +3,11 @@
"@babel/runtime-corejs3@^7.10.2": "@babel/runtime-corejs3@^7.10.2":
version "7.19.0" version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz#0df75cb8e5ecba3ca9e658898694e5326d52397f" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz#f0cbbe7edda7c4109cd253bb1dee99aba4594ad9"
integrity sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ== integrity sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==
dependencies: dependencies:
core-js-pure "^3.20.2" core-js-pure "^3.25.1"
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime@^7.10.2", "@babel/runtime@^7.18.9": "@babel/runtime@^7.10.2", "@babel/runtime@^7.18.9":
@@ -17,10 +17,10 @@
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@eslint/eslintrc@^1.3.1": "@eslint/eslintrc@^1.3.2":
version "1.3.1" version "1.3.2"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.1.tgz#de0807bfeffc37b964a7d0400e0c348ce5a2543d" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356"
integrity sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ== integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==
dependencies: dependencies:
ajv "^6.12.4" ajv "^6.12.4"
debug "^4.3.2" debug "^4.3.2"
@@ -56,82 +56,82 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@next/env@12.3.0": "@next/env@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.0.tgz#85f971fdc668cc312342761057c59cb8ab1abadf" resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.1.tgz#18266bd92de3b4aa4037b1927aa59e6f11879260"
integrity sha512-PTJpjAFVbzBQ9xXpzMTroShvD5YDIIy46jQ7d4LrWpY+/5a8H90Tm8hE3Hvkc5RBRspVo7kvEOnqQms0A+2Q6w== integrity sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg==
"@next/eslint-plugin-next@12.3.0": "@next/eslint-plugin-next@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.0.tgz#302c1f03618d5001ce92ea6826c329268759128e" resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.1.tgz#b821f27b0f175954d8d18e5d323fce040ecc79a6"
integrity sha512-jVdq1qYTNDjUtulnE8/hkPv0pHILV4jMg5La99iaY/FFm20WxVnsAZtbNnMvlPbf8dc010oO304SX9yXbg5PAw== integrity sha512-sw+lTf6r6P0j+g/n9y4qdWWI2syPqZx+uc0+B/fRENqfR3KpSid6MIKqc9gNwGhJASazEQ5b3w8h4cAET213jw==
dependencies: dependencies:
glob "7.1.7" glob "7.1.7"
"@next/swc-android-arm-eabi@12.3.0": "@next/swc-android-arm-eabi@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.0.tgz#9a934904643591cb6f66eb09803a92d2b10ada13" resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz#b15ce8ad376102a3b8c0f3c017dde050a22bb1a3"
integrity sha512-/PuirPnAKsYBw93w/7Q9hqy+KGOU9mjYprZ/faxMUJh/dc6v3rYLxkZKNG9nFPIW4QKNTCnhP40xF9hLnxO+xg== integrity sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ==
"@next/swc-android-arm64@12.3.0": "@next/swc-android-arm64@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.0.tgz#c1e3e24d0625efe88f45a2135c8f5c4dff594749" resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz#85d205f568a790a137cb3c3f720d961a2436ac9c"
integrity sha512-OaI+FhAM6P9B6Ybwbn0Zl8YwWido0lLwhDBi9WiYCh4RQmIXAyVIoIJPHo4fP05+mXaJ/k1trvDvuURvHOq2qw== integrity sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q==
"@next/swc-darwin-arm64@12.3.0": "@next/swc-darwin-arm64@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.0.tgz#37a9f971b9ad620184af69f38243a36757126fb9" resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz#b105457d6760a7916b27e46c97cb1a40547114ae"
integrity sha512-9s4d3Mhii+WFce8o8Jok7WC3Bawkr9wEUU++SJRptjU1L5tsfYJMrSYCACHLhZujziNDLyExe4Hwwsccps1sfg== integrity sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg==
"@next/swc-darwin-x64@12.3.0": "@next/swc-darwin-x64@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.0.tgz#fb017f1066c8cf2b8da49ef3588c8731d8bf1bf3" resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz#6947b39082271378896b095b6696a7791c6e32b1"
integrity sha512-2scC4MqUTwGwok+wpVxP+zWp7WcCAVOtutki2E1n99rBOTnUOX6qXkgxSy083yBN6GqwuC/dzHeN7hIKjavfRA== integrity sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA==
"@next/swc-freebsd-x64@12.3.0": "@next/swc-freebsd-x64@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.0.tgz#e7955b016f41e0f95088e3459ff4197027871fbf" resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz#2b6c36a4d84aae8b0ea0e0da9bafc696ae27085a"
integrity sha512-xAlruUREij/bFa+qsE1tmsP28t7vz02N4ZDHt2lh3uJUniE0Ne9idyIDLc1Ed0IF2RjfgOp4ZVunuS3OM0sngw== integrity sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q==
"@next/swc-linux-arm-gnueabihf@12.3.0": "@next/swc-linux-arm-gnueabihf@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.0.tgz#d2233267bffaa24378245b328f2f8a01a37eab29" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz#6e421c44285cfedac1f4631d5de330dd60b86298"
integrity sha512-jin2S4VT/cugc2dSZEUIabhYDJNgrUh7fufbdsaAezgcQzqfdfJqfxl4E9GuafzB4cbRPTaqA0V5uqbp0IyGkQ== integrity sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w==
"@next/swc-linux-arm64-gnu@12.3.0": "@next/swc-linux-arm64-gnu@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.0.tgz#149a0cb877352ab63e81cf1dd53b37f382929d2a" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz#8863f08a81f422f910af126159d2cbb9552ef717"
integrity sha512-RqJHDKe0WImeUrdR0kayTkRWgp4vD/MS7g0r6Xuf8+ellOFH7JAAJffDW3ayuVZeMYOa7RvgNFcOoWnrTUl9Nw== integrity sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ==
"@next/swc-linux-arm64-musl@12.3.0": "@next/swc-linux-arm64-musl@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.0.tgz#73ec7f121f56fd7cf99cf2b00cf41f62c4560e90" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz#0038f07cf0b259d70ae0c80890d826dfc775d9f3"
integrity sha512-nvNWoUieMjvDjpYJ/4SQe9lQs2xMj6ZRs8N+bmTrVu9leY2Fg3WD6W9p/1uU9hGO8u+OdF13wc4iRShu/WYIHg== integrity sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg==
"@next/swc-linux-x64-gnu@12.3.0": "@next/swc-linux-x64-gnu@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.0.tgz#6812e52ef21bfd091810f271dd61da11d82b66b9" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz#c66468f5e8181ffb096c537f0dbfb589baa6a9c1"
integrity sha512-4ajhIuVU9PeQCMMhdDgZTLrHmjbOUFuIyg6J19hZqwEwDTSqQyrSLkbJs2Nd7IRiM6Ul/XyrtEFCpk4k+xD2+w== integrity sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA==
"@next/swc-linux-x64-musl@12.3.0": "@next/swc-linux-x64-musl@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.0.tgz#c9e7ffb6d44da330961c1ce651c5b03a1becfe22" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz#c6269f3e96ac0395bc722ad97ce410ea5101d305"
integrity sha512-U092RBYbaGxoMAwpauePJEu2PuZSEoUCGJBvsptQr2/2XIMwAJDYM4c/M5NfYEsBr+yjvsYNsOpYfeQ88D82Yg== integrity sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg==
"@next/swc-win32-arm64-msvc@12.3.0": "@next/swc-win32-arm64-msvc@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.0.tgz#e0d9d26297f52b0d3b3c2f5138ddcce30601bc98" resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz#83c639ee969cee36ce247c3abd1d9df97b5ecade"
integrity sha512-pzSzaxjDEJe67bUok9Nxf9rykbJfHXW0owICFsPBsqHyc+cr8vpF7g9e2APTCddtVhvjkga9ILoZJ9NxWS7Yiw== integrity sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw==
"@next/swc-win32-ia32-msvc@12.3.0": "@next/swc-win32-ia32-msvc@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.0.tgz#37daeac1acc68537b8e76cd81fde96dce11f78b4" resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz#52995748b92aa8ad053440301bc2c0d9fbcf27c2"
integrity sha512-MQGUpMbYhQmTZ06a9e0hPQJnxFMwETo2WtyAotY3GEzbNCQVbCGhsvqEKcl+ZEHgShlHXUWvSffq1ZscY6gK7A== integrity sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA==
"@next/swc-win32-x64-msvc@12.3.0": "@next/swc-win32-x64-msvc@12.3.1":
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.0.tgz#c1b983316307f8f55fee491942b5d244bd2036e2" resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz#27d71a95247a9eaee03d47adee7e3bd594514136"
integrity sha512-C/nw6OgQpEULWqs+wgMHXGvlJLguPRFFGqR2TAqWBerQ8J+Sg3z1ZTqwelkSi4FoqStGuZ2UdFHIDN1ySmR1xA== integrity sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
@@ -155,9 +155,9 @@
fastq "^1.6.0" fastq "^1.6.0"
"@rushstack/eslint-patch@^1.1.3": "@rushstack/eslint-patch@^1.1.3":
version "1.1.4" version "1.2.0"
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz#0c8b74c50f29ee44f423f7416829c0bf8bb5eb27" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728"
integrity sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA== integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==
"@swc/helpers@0.4.11": "@swc/helpers@0.4.11":
version "0.4.11" version "0.4.11"
@@ -172,47 +172,47 @@
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
"@typescript-eslint/parser@^5.21.0": "@typescript-eslint/parser@^5.21.0":
version "5.36.2" version "5.38.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.2.tgz#3ddf323d3ac85a25295a55fcb9c7a49ab4680ddd" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.38.0.tgz#5a59a1ff41a7b43aacd1bb2db54f6bf1c02b2ff8"
integrity sha512-qS/Kb0yzy8sR0idFspI9Z6+t7mqk/oRjnAYfewG+VN73opAUvmYL3oPIMmgOX6CnQS6gmVIXGshlb5RY/R22pA== integrity sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==
dependencies: dependencies:
"@typescript-eslint/scope-manager" "5.36.2" "@typescript-eslint/scope-manager" "5.38.0"
"@typescript-eslint/types" "5.36.2" "@typescript-eslint/types" "5.38.0"
"@typescript-eslint/typescript-estree" "5.36.2" "@typescript-eslint/typescript-estree" "5.38.0"
debug "^4.3.4" debug "^4.3.4"
"@typescript-eslint/scope-manager@5.36.2": "@typescript-eslint/scope-manager@5.38.0":
version "5.36.2" version "5.38.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz#a75eb588a3879ae659514780831370642505d1cd" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz#8f0927024b6b24e28671352c93b393a810ab4553"
integrity sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw== integrity sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==
dependencies: dependencies:
"@typescript-eslint/types" "5.36.2" "@typescript-eslint/types" "5.38.0"
"@typescript-eslint/visitor-keys" "5.36.2" "@typescript-eslint/visitor-keys" "5.38.0"
"@typescript-eslint/types@5.36.2": "@typescript-eslint/types@5.38.0":
version "5.36.2" version "5.38.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.2.tgz#a5066e500ebcfcee36694186ccc57b955c05faf9" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.38.0.tgz#8cd15825e4874354e31800dcac321d07548b8a5f"
integrity sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ== integrity sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==
"@typescript-eslint/typescript-estree@5.36.2": "@typescript-eslint/typescript-estree@5.38.0":
version "5.36.2" version "5.38.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz#0c93418b36c53ba0bc34c61fe9405c4d1d8fe560" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz#89f86b2279815c6fb7f57d68cf9b813f0dc25d98"
integrity sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w== integrity sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==
dependencies: dependencies:
"@typescript-eslint/types" "5.36.2" "@typescript-eslint/types" "5.38.0"
"@typescript-eslint/visitor-keys" "5.36.2" "@typescript-eslint/visitor-keys" "5.38.0"
debug "^4.3.4" debug "^4.3.4"
globby "^11.1.0" globby "^11.1.0"
is-glob "^4.0.3" is-glob "^4.0.3"
semver "^7.3.7" semver "^7.3.7"
tsutils "^3.21.0" tsutils "^3.21.0"
"@typescript-eslint/visitor-keys@5.36.2": "@typescript-eslint/visitor-keys@5.38.0":
version "5.36.2" version "5.38.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz#2f8f78da0a3bad3320d2ac24965791ac39dace5a" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz#60591ca3bf78aa12b25002c0993d067c00887e34"
integrity sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A== integrity sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==
dependencies: dependencies:
"@typescript-eslint/types" "5.36.2" "@typescript-eslint/types" "5.38.0"
eslint-visitor-keys "^3.3.0" eslint-visitor-keys "^3.3.0"
acorn-jsx@^5.3.2: acorn-jsx@^5.3.2:
@@ -344,10 +344,10 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
caniuse-lite@^1.0.30001332: caniuse-lite@^1.0.30001406:
version "1.0.30001393" version "1.0.30001406"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001393.tgz#1aa161e24fe6af2e2ccda000fc2b94be0b0db356" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001406.tgz#d0146e7919635479f873b4507517b627f66ab269"
integrity sha512-N/od11RX+Gsk+1qY/jbPa0R6zJupEa0lxeBG598EbrtblxVCTJsQwbRBm6+V+rxpc5lHKdsXb9RY83cZIPLseA== integrity sha512-bWTlaXUy/rq0BBtYShc/jArYfBPjEV95euvZ8JVtO43oQExEN/WquoqpufFjNu4kSpi5cy5kMbNvzztWDfv1Jg==
chalk@^4.0.0: chalk@^4.0.0:
version "4.1.2" version "4.1.2"
@@ -374,10 +374,10 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
core-js-pure@^3.20.2: core-js-pure@^3.25.1:
version "3.25.1" version "3.25.2"
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.1.tgz#79546518ae87cc362c991d9c2d211f45107991ee" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.2.tgz#44a4fd873bdd4fecf6ca11512bcefedbe87e744a"
integrity sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A== integrity sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==
cross-spawn@^7.0.2: cross-spawn@^7.0.2:
version "7.0.3" version "7.0.3"
@@ -503,19 +503,19 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-config-next@12.3.0: eslint-config-next@12.3.1:
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.3.0.tgz#d887ab2d143fe1a2b308e9321e932a613e610800" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.3.1.tgz#5d4eb0b7903cea81fd0d5106601d3afb0a453ff4"
integrity sha512-guHSkNyKnTBB8HU35COgAMeMV0E026BiYRYvyEVVaTOeFcnU3i1EI8/Da0Rl7H3Sgua5FEvoA0vYd2s8kdIUXg== integrity sha512-EN/xwKPU6jz1G0Qi6Bd/BqMnHLyRAL0VsaQaWA7F3KkjAgZHi4f1uL1JKGWNxdQpHTW/sdGONBd0bzxUka/DJg==
dependencies: dependencies:
"@next/eslint-plugin-next" "12.3.0" "@next/eslint-plugin-next" "12.3.1"
"@rushstack/eslint-patch" "^1.1.3" "@rushstack/eslint-patch" "^1.1.3"
"@typescript-eslint/parser" "^5.21.0" "@typescript-eslint/parser" "^5.21.0"
eslint-import-resolver-node "^0.3.6" eslint-import-resolver-node "^0.3.6"
eslint-import-resolver-typescript "^2.7.1" eslint-import-resolver-typescript "^2.7.1"
eslint-plugin-import "^2.26.0" eslint-plugin-import "^2.26.0"
eslint-plugin-jsx-a11y "^6.5.1" eslint-plugin-jsx-a11y "^6.5.1"
eslint-plugin-react "^7.29.4" eslint-plugin-react "^7.31.7"
eslint-plugin-react-hooks "^4.5.0" eslint-plugin-react-hooks "^4.5.0"
eslint-import-resolver-node@^0.3.6: eslint-import-resolver-node@^0.3.6:
@@ -587,10 +587,10 @@ eslint-plugin-react-hooks@^4.5.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
eslint-plugin-react@^7.29.4: eslint-plugin-react@^7.31.7:
version "7.31.7" version "7.31.8"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.7.tgz#36fb1c611a7db5f757fce09cbbcc01682f8b0fbb" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf"
integrity sha512-8NldBTeYp/kQoTV1uT0XF6HcmDqbgZ0lNPkN0wlRw8DJKXEnaWu+oh/6gt3xIhzvQ35wB2Y545fJhIbJSZ2NNw== integrity sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==
dependencies: dependencies:
array-includes "^3.1.5" array-includes "^3.1.5"
array.prototype.flatmap "^1.3.0" array.prototype.flatmap "^1.3.0"
@@ -632,12 +632,12 @@ eslint-visitor-keys@^3.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@8.23.0: eslint@8.23.1:
version "8.23.0" version "8.23.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc"
integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA== integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==
dependencies: dependencies:
"@eslint/eslintrc" "^1.3.1" "@eslint/eslintrc" "^1.3.2"
"@humanwhocodes/config-array" "^0.10.4" "@humanwhocodes/config-array" "^0.10.4"
"@humanwhocodes/gitignore-to-minimatch" "^1.0.2" "@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
"@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/module-importer" "^1.0.1"
@@ -656,7 +656,6 @@ eslint@8.23.0:
fast-deep-equal "^3.1.3" fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1" file-entry-cache "^6.0.1"
find-up "^5.0.0" find-up "^5.0.0"
functional-red-black-tree "^1.0.1"
glob-parent "^6.0.1" glob-parent "^6.0.1"
globals "^13.15.0" globals "^13.15.0"
globby "^11.1.0" globby "^11.1.0"
@@ -665,6 +664,7 @@ eslint@8.23.0:
import-fresh "^3.0.0" import-fresh "^3.0.0"
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
is-glob "^4.0.0" is-glob "^4.0.0"
js-sdsl "^4.1.4"
js-yaml "^4.1.0" js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1" json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1" levn "^0.4.1"
@@ -716,9 +716,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-glob@^3.2.9: fast-glob@^3.2.9:
version "3.2.11" version "3.2.12"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
dependencies: dependencies:
"@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3" "@nodelib/fs.walk" "^1.2.3"
@@ -798,20 +798,15 @@ function.prototype.name@^1.1.5:
es-abstract "^1.19.0" es-abstract "^1.19.0"
functions-have-names "^1.2.2" functions-have-names "^1.2.2"
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
functions-have-names@^1.2.2: functions-have-names@^1.2.2:
version "1.2.3" version "1.2.3"
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2: get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.2:
version "1.1.2" version "1.1.3"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
dependencies: dependencies:
function-bind "^1.1.1" function-bind "^1.1.1"
has "^1.0.3" has "^1.0.3"
@@ -979,9 +974,9 @@ is-boolean-object@^1.1.0:
has-tostringtag "^1.0.0" has-tostringtag "^1.0.0"
is-callable@^1.1.4, is-callable@^1.2.4: is-callable@^1.1.4, is-callable@^1.2.4:
version "1.2.4" version "1.2.6"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.6.tgz#fd6170b0b8c7e2cc73de342ef8284a2202023c44"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== integrity sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==
is-core-module@^2.8.1, is-core-module@^2.9.0: is-core-module@^2.8.1, is-core-module@^2.9.0:
version "2.10.0" version "2.10.0"
@@ -1067,6 +1062,11 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
js-sdsl@^4.1.4:
version "4.1.4"
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6"
integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==
"js-tokens@^3.0.0 || ^4.0.0": "js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -1200,31 +1200,31 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
next@12.3.0: next@12.3.1:
version "12.3.0" version "12.3.1"
resolved "https://registry.yarnpkg.com/next/-/next-12.3.0.tgz#0e4c1ed0092544c7e8f4c998ca57cf6529e286cb" resolved "https://registry.yarnpkg.com/next/-/next-12.3.1.tgz#127b825ad2207faf869b33393ec8c75fe61e50f1"
integrity sha512-GpzI6me9V1+XYtfK0Ae9WD0mKqHyzQlGq1xH1rzNIYMASo4Tkl4rTe9jSqtBpXFhOS33KohXs9ZY38Akkhdciw== integrity sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==
dependencies: dependencies:
"@next/env" "12.3.0" "@next/env" "12.3.1"
"@swc/helpers" "0.4.11" "@swc/helpers" "0.4.11"
caniuse-lite "^1.0.30001332" caniuse-lite "^1.0.30001406"
postcss "8.4.14" postcss "8.4.14"
styled-jsx "5.0.6" styled-jsx "5.0.7"
use-sync-external-store "1.2.0" use-sync-external-store "1.2.0"
optionalDependencies: optionalDependencies:
"@next/swc-android-arm-eabi" "12.3.0" "@next/swc-android-arm-eabi" "12.3.1"
"@next/swc-android-arm64" "12.3.0" "@next/swc-android-arm64" "12.3.1"
"@next/swc-darwin-arm64" "12.3.0" "@next/swc-darwin-arm64" "12.3.1"
"@next/swc-darwin-x64" "12.3.0" "@next/swc-darwin-x64" "12.3.1"
"@next/swc-freebsd-x64" "12.3.0" "@next/swc-freebsd-x64" "12.3.1"
"@next/swc-linux-arm-gnueabihf" "12.3.0" "@next/swc-linux-arm-gnueabihf" "12.3.1"
"@next/swc-linux-arm64-gnu" "12.3.0" "@next/swc-linux-arm64-gnu" "12.3.1"
"@next/swc-linux-arm64-musl" "12.3.0" "@next/swc-linux-arm64-musl" "12.3.1"
"@next/swc-linux-x64-gnu" "12.3.0" "@next/swc-linux-x64-gnu" "12.3.1"
"@next/swc-linux-x64-musl" "12.3.0" "@next/swc-linux-x64-musl" "12.3.1"
"@next/swc-win32-arm64-msvc" "12.3.0" "@next/swc-win32-arm64-msvc" "12.3.1"
"@next/swc-win32-ia32-msvc" "12.3.0" "@next/swc-win32-ia32-msvc" "12.3.1"
"@next/swc-win32-x64-msvc" "12.3.0" "@next/swc-win32-x64-msvc" "12.3.1"
object-assign@^4.1.1: object-assign@^4.1.1:
version "4.1.1" version "4.1.1"
@@ -1574,10 +1574,10 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
styled-jsx@5.0.6: styled-jsx@5.0.7:
version "5.0.6" version "5.0.7"
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.6.tgz#fa684790a9cc3badded14badea163418fe568f77" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.7.tgz#be44afc53771b983769ac654d355ca8d019dff48"
integrity sha512-xOeROtkK5MGMDimBQ3J6iPId8q0t/BDoG5XN6oKkZClVz9ISF/hihN8OCn2LggMU6N32aXnrXBdn3auSqNS9fA== integrity sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==
supports-color@^7.1.0: supports-color@^7.1.0:
version "7.2.0" version "7.2.0"

View File

@@ -34,7 +34,7 @@
"prettier": "2.6.2", "prettier": "2.6.2",
"ts-eager": "2.0.2", "ts-eager": "2.0.2",
"ts-jest": "28.0.5", "ts-jest": "28.0.5",
"turbo": "1.3.2-canary.1" "turbo": "1.4.7"
}, },
"scripts": { "scripts": {
"lerna": "lerna", "lerna": "lerna",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/build-utils", "name": "@vercel/build-utils",
"version": "5.4.2", "version": "5.5.2",
"license": "MIT", "license": "MIT",
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.js", "types": "./dist/index.d.js",

View File

@@ -16,14 +16,19 @@ export function cloneEnv(...envs: (Env | undefined)[]): Env {
return obj; return obj;
} }
// the system path is called `Path` on Windows and Node.js will // mixin the env first
// automatically return the system path when accessing `PATH`, obj = Object.assign(obj, env);
// however we lose this proxied value when we destructure and
// thus we must explicitly copy it if (hasOwnProperty.call(env, 'Path')) {
if (hasOwnProperty.call(env, 'PATH') || hasOwnProperty.call(env, 'Path')) { // the system path is called `Path` on Windows and Node.js will
obj.PATH = env.PATH; // automatically return the system path when accessing `PATH`,
// however we lose this proxied value when we destructure and
// thus we must explicitly copy it, but we must also remove the
// `Path` property since we can't have both a `PATH` and `Path`
obj.PATH = obj.Path;
delete obj.Path;
} }
return Object.assign(obj, env); return obj;
}, {}); }, {});
} }

View File

@@ -38,6 +38,9 @@ export class EdgeFunction {
*/ */
assets?: { name: string; path: string }[]; assets?: { name: string; path: string }[];
/** The regions where the edge function will be executed on */
regions?: 'auto' | string[] | 'all' | 'default';
constructor(params: Omit<EdgeFunction, 'type'>) { constructor(params: Omit<EdgeFunction, 'type'>) {
this.type = 'EdgeFunction'; this.type = 'EdgeFunction';
this.name = params.name; this.name = params.name;
@@ -46,5 +49,6 @@ export class EdgeFunction {
this.files = params.files; this.files = params.files;
this.envVarsInUse = params.envVarsInUse; this.envVarsInUse = params.envVarsInUse;
this.assets = params.assets; this.assets = params.assets;
this.regions = params.regions;
} }
} }

View File

@@ -61,14 +61,14 @@ export function getPrettyError(obj: {
} }
return new NowBuildError({ return new NowBuildError({
code: 'DEV_VALIDATE_CONFIG', code: 'INVALID_VERCEL_CONFIG',
message: message, message: message,
link: prop ? `${docsUrl}#project/${prop.toLowerCase()}` : docsUrl, link: prop ? `${docsUrl}#project/${prop.toLowerCase()}` : docsUrl,
action: 'View Documentation', action: 'View Documentation',
}); });
} catch (e) { } catch (e) {
return new NowBuildError({ return new NowBuildError({
code: 'DEV_VALIDATE_CONFIG', code: 'INVALID_VERCEL_CONFIG',
message: `Failed to validate configuration.`, message: `Failed to validate configuration.`,
link: docsUrl, link: docsUrl,
action: 'View Documentation', action: 'View Documentation',

View File

@@ -10,7 +10,7 @@ const allOptions = [
major: 12, major: 12,
range: '12.x', range: '12.x',
runtime: 'nodejs12.x', runtime: 'nodejs12.x',
discontinueDate: new Date('2022-10-01'), discontinueDate: new Date('2022-10-03'),
}, },
{ {
major: 10, major: 10,

View File

@@ -459,6 +459,12 @@ export async function runNpmInstall(
env, env,
}); });
let commandArgs: string[]; let commandArgs: string[];
const isPotentiallyBrokenNpm =
cliType === 'npm' &&
(nodeVersion?.major === 16 ||
opts.env.PATH?.includes('/node16/bin-npm7')) &&
!args.includes('--legacy-peer-deps') &&
spawnOpts?.env?.ENABLE_EXPERIMENTAL_COREPACK !== '1';
if (cliType === 'npm') { if (cliType === 'npm') {
opts.prettyCommand = 'npm install'; opts.prettyCommand = 'npm install';
@@ -466,9 +472,8 @@ export async function runNpmInstall(
.filter(a => a !== '--prefer-offline') .filter(a => a !== '--prefer-offline')
.concat(['install', '--no-audit', '--unsafe-perm']); .concat(['install', '--no-audit', '--unsafe-perm']);
if ( if (
nodeVersion?.major === 16 && isPotentiallyBrokenNpm &&
spawnOpts?.env?.VERCEL_NPM_LEGACY_PEER_DEPS === '1' && spawnOpts?.env?.VERCEL_NPM_LEGACY_PEER_DEPS === '1'
spawnOpts?.env?.ENABLE_EXPERIMENTAL_COREPACK !== '1'
) { ) {
// Starting in npm@8.6.0, if you ran `npm install --legacy-peer-deps`, // Starting in npm@8.6.0, if you ran `npm install --legacy-peer-deps`,
// and then later ran `npm install`, it would fail. So the only way // and then later ran `npm install`, it would fail. So the only way
@@ -494,7 +499,26 @@ export async function runNpmInstall(
commandArgs.push('--production'); commandArgs.push('--production');
} }
await spawnAsync(cliType, commandArgs, opts); try {
await spawnAsync(cliType, commandArgs, opts);
} catch (_) {
const potentialErrorPath = path.join(
process.env.HOME || '/',
'.npm',
'eresolve-report.txt'
);
if (
isPotentiallyBrokenNpm &&
!commandArgs.includes('--legacy-peer-deps') &&
fs.existsSync(potentialErrorPath)
) {
console.warn(
'Warning: Retrying "Install Command" with `--legacy-peer-deps` which may accept a potentially broken dependency and slow install time.'
);
commandArgs.push('--legacy-peer-deps');
await spawnAsync(cliType, commandArgs, opts);
}
}
debug(`Install complete [${Date.now() - installTime}ms]`); debug(`Install complete [${Date.now() - installTime}ms]`);
return true; return true;
} finally { } finally {

View File

@@ -0,0 +1,2 @@
node_modules
.vercel

View File

@@ -0,0 +1,64 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
"prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"requires": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"react": {
"version": "16.8.0",
"resolved": "https://registry.npmjs.org/react/-/react-16.8.0.tgz",
"integrity": "sha512-g+nikW2D48kqgWSPwNo0NH9tIGG3DsQFlrtrQ1kj6W77z5ahyIHG0w8kPpz4Sdj6gyLnz0lEd/xsjOoGge2MYQ==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
"prop-types": "^15.6.2",
"scheduler": "^0.13.0"
}
},
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"scheduler": {
"version": "0.13.6",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz",
"integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
}
},
"swr": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz",
"integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw=="
}
}
}

View File

@@ -0,0 +1,11 @@
{
"private": true,
"scripts": {
"build": "mkdir -p public && echo 'legacy peer deps' > public/index.txt"
},
"packageManager": "npm@6.14.17",
"dependencies": {
"swr": "1.3.0",
"react": "16.8.0"
}
}

View File

@@ -0,0 +1,3 @@
{
"probes": [{ "path": "/", "mustContain": "legacy peer deps" }]
}

View File

@@ -0,0 +1,2 @@
node_modules
.vercel

View File

@@ -0,0 +1,143 @@
{
"name": "15-npm-8-legacy-peer-deps",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"dependencies": {
"react": "16.8.0",
"swr": "1.3.0"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"node_modules/react": {
"version": "16.8.0",
"resolved": "https://registry.npmjs.org/react/-/react-16.8.0.tgz",
"integrity": "sha512-g+nikW2D48kqgWSPwNo0NH9tIGG3DsQFlrtrQ1kj6W77z5ahyIHG0w8kPpz4Sdj6gyLnz0lEd/xsjOoGge2MYQ==",
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
"prop-types": "^15.6.2",
"scheduler": "^0.13.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/scheduler": {
"version": "0.13.6",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz",
"integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==",
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
}
},
"node_modules/swr": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz",
"integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==",
"peerDependencies": {
"react": "^16.11.0 || ^17.0.0 || ^18.0.0"
}
}
},
"dependencies": {
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
"prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"requires": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"react": {
"version": "16.8.0",
"resolved": "https://registry.npmjs.org/react/-/react-16.8.0.tgz",
"integrity": "sha512-g+nikW2D48kqgWSPwNo0NH9tIGG3DsQFlrtrQ1kj6W77z5ahyIHG0w8kPpz4Sdj6gyLnz0lEd/xsjOoGge2MYQ==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
"prop-types": "^15.6.2",
"scheduler": "^0.13.0"
}
},
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"scheduler": {
"version": "0.13.6",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz",
"integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
}
},
"swr": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz",
"integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw=="
}
}
}

View File

@@ -0,0 +1,11 @@
{
"private": true,
"scripts": {
"build": "mkdir -p public && echo 'legacy peer deps' > public/index.txt"
},
"packageManager": "npm@8.6.0",
"dependencies": {
"swr": "1.3.0",
"react": "16.8.0"
}
}

View File

@@ -0,0 +1,3 @@
{
"probes": [{ "path": "/", "mustContain": "legacy peer deps" }]
}

View File

@@ -20,7 +20,6 @@ it('should clone env with Path', () => {
) )
).toEqual({ ).toEqual({
foo: 'bar', foo: 'bar',
Path: 'baz',
PATH: 'baz', PATH: 'baz',
}); });
}); });
@@ -87,7 +86,6 @@ it('should overwrite PATH with last value', () => {
} }
) )
).toEqual({ ).toEqual({
Path: 'foo',
PATH: undefined, PATH: undefined,
}); });
}); });
@@ -114,7 +112,6 @@ it('should handle process.env at any argument position', () => {
) )
).toEqual({ ).toEqual({
foo: 'bar', foo: 'bar',
Path: 'baz',
PATH: 'baz', PATH: 'baz',
}); });
}); });

View File

@@ -20,6 +20,7 @@ afterEach(() => {
import path from 'path'; import path from 'path';
import { runNpmInstall, cloneEnv } from '../src'; import { runNpmInstall, cloneEnv } from '../src';
import type { Meta } from '../src/types';
function getTestSpawnOpts(env: Record<string, string>) { function getTestSpawnOpts(env: Record<string, string>) {
return { env: cloneEnv(process.env, env) }; return { env: cloneEnv(process.env, env) };
@@ -31,9 +32,9 @@ function getNodeVersion(major: number) {
it('should not include peer dependencies when missing VERCEL_NPM_LEGACY_PEER_DEPS on node16', async () => { it('should not include peer dependencies when missing VERCEL_NPM_LEGACY_PEER_DEPS on node16', async () => {
const fixture = path.join(__dirname, 'fixtures', '20-npm-7'); const fixture = path.join(__dirname, 'fixtures', '20-npm-7');
const meta = {}; const meta: Meta = {};
const spawnOpts = getTestSpawnOpts({}); const spawnOpts = getTestSpawnOpts({});
const nodeVersion = { major: 16 } as any; const nodeVersion = getNodeVersion(16);
await runNpmInstall(fixture, [], spawnOpts, meta, nodeVersion); await runNpmInstall(fixture, [], spawnOpts, meta, nodeVersion);
expect(spawnMock.mock.calls.length).toBe(1); expect(spawnMock.mock.calls.length).toBe(1);
const args = spawnMock.mock.calls[0]; const args = spawnMock.mock.calls[0];
@@ -49,7 +50,7 @@ it('should not include peer dependencies when missing VERCEL_NPM_LEGACY_PEER_DEP
it('should include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node16', async () => { it('should include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node16', async () => {
const fixture = path.join(__dirname, 'fixtures', '20-npm-7'); const fixture = path.join(__dirname, 'fixtures', '20-npm-7');
const meta = {}; const meta: Meta = {};
const spawnOpts = getTestSpawnOpts({ VERCEL_NPM_LEGACY_PEER_DEPS: '1' }); const spawnOpts = getTestSpawnOpts({ VERCEL_NPM_LEGACY_PEER_DEPS: '1' });
const nodeVersion = getNodeVersion(16); const nodeVersion = getNodeVersion(16);
await runNpmInstall(fixture, [], spawnOpts, meta, nodeVersion); await runNpmInstall(fixture, [], spawnOpts, meta, nodeVersion);
@@ -70,11 +71,38 @@ it('should include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node1
}); });
}); });
it('should not include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node14', async () => { it('should include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node14 and npm7+', async () => {
const fixture = path.join(__dirname, 'fixtures', '20-npm-7'); const fixture = path.join(__dirname, 'fixtures', '20-npm-7');
const meta = {}; const meta: Meta = {};
const spawnOpts = getTestSpawnOpts({ VERCEL_NPM_LEGACY_PEER_DEPS: '1' }); const spawnOpts = getTestSpawnOpts({ VERCEL_NPM_LEGACY_PEER_DEPS: '1' });
const nodeVersion = getNodeVersion(14); const nodeVersion = getNodeVersion(14);
console.log({ nodeVersion, path: spawnOpts.env.PATH });
await runNpmInstall(fixture, [], spawnOpts, meta, nodeVersion);
expect(spawnMock.mock.calls.length).toBe(1);
const args = spawnMock.mock.calls[0];
expect(args[0]).toEqual('npm');
expect(args[1]).toEqual([
'install',
'--no-audit',
'--unsafe-perm',
'--legacy-peer-deps',
]);
expect(args[2]).toEqual({
cwd: fixture,
prettyCommand: 'npm install',
stdio: 'inherit',
env: expect.any(Object),
});
});
it('should not include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node14 and npm6', async () => {
const fixture = path.join(__dirname, 'fixtures', '14-npm-6-legacy-peer-deps');
const meta: Meta = {};
const spawnOpts = getTestSpawnOpts({ VERCEL_NPM_LEGACY_PEER_DEPS: '1' });
const nodeVersion = getNodeVersion(14);
console.log({ nodeVersion, path: spawnOpts.env.PATH });
await runNpmInstall(fixture, [], spawnOpts, meta, nodeVersion); await runNpmInstall(fixture, [], spawnOpts, meta, nodeVersion);
expect(spawnMock.mock.calls.length).toBe(1); expect(spawnMock.mock.calls.length).toBe(1);
const args = spawnMock.mock.calls[0]; const args = spawnMock.mock.calls[0];
@@ -90,7 +118,7 @@ it('should not include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on n
it('should not include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node16 with corepack enabled', async () => { it('should not include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on node16 with corepack enabled', async () => {
const fixture = path.join(__dirname, 'fixtures', '20-npm-7'); const fixture = path.join(__dirname, 'fixtures', '20-npm-7');
const meta = {}; const meta: Meta = {};
const spawnOpts = getTestSpawnOpts({ const spawnOpts = getTestSpawnOpts({
VERCEL_NPM_LEGACY_PEER_DEPS: '1', VERCEL_NPM_LEGACY_PEER_DEPS: '1',
ENABLE_EXPERIMENTAL_COREPACK: '1', ENABLE_EXPERIMENTAL_COREPACK: '1',
@@ -108,3 +136,64 @@ it('should not include peer dependencies when VERCEL_NPM_LEGACY_PEER_DEPS=1 on n
env: expect.any(Object), env: expect.any(Object),
}); });
}); });
it('should only invoke `runNpmInstall()` once per `package.json` file (serial)', async () => {
const meta: Meta = {};
const fixture = path.join(__dirname, 'fixtures', '02-zero-config-api');
const apiDir = path.join(fixture, 'api');
const run1 = await runNpmInstall(apiDir, [], undefined, meta);
expect(run1).toEqual(true);
expect(
(meta.runNpmInstallSet as Set<string>).has(
path.join(fixture, 'package.json')
)
).toEqual(true);
const run2 = await runNpmInstall(apiDir, [], undefined, meta);
expect(run2).toEqual(false);
const run3 = await runNpmInstall(fixture, [], undefined, meta);
expect(run3).toEqual(false);
expect(spawnMock.mock.calls.length).toBe(1);
const args = spawnMock.mock.calls[0];
expect(args[0]).toEqual('yarn');
expect(args[1]).toEqual(['install']);
expect(args[2]).toEqual({
cwd: apiDir,
prettyCommand: 'yarn install',
stdio: 'inherit',
env: expect.any(Object),
});
});
it('should only invoke `runNpmInstall()` once per `package.json` file (parallel)', async () => {
const meta: Meta = {};
const fixture = path.join(__dirname, 'fixtures', '02-zero-config-api');
const apiDir = path.join(fixture, 'api');
const [run1, run2, run3] = await Promise.all([
runNpmInstall(apiDir, [], undefined, meta),
runNpmInstall(apiDir, [], undefined, meta),
runNpmInstall(fixture, [], undefined, meta),
]);
expect(run1).toEqual(true);
expect(run2).toEqual(false);
expect(run3).toEqual(false);
expect(
(meta.runNpmInstallSet as Set<string>).has(
path.join(fixture, 'package.json')
)
).toEqual(true);
expect(spawnMock.mock.calls.length).toBe(1);
const args = spawnMock.mock.calls[0];
expect(args[0]).toEqual('yarn');
expect(args[1]).toEqual(['install']);
expect(args[2]).toEqual({
cwd: apiDir,
prettyCommand: 'yarn install',
stdio: 'inherit',
env: expect.any(Object),
});
});

View File

@@ -1,7 +1,6 @@
import ms from 'ms'; import ms from 'ms';
import path from 'path'; import path from 'path';
import fs, { readlink } from 'fs-extra'; import fs, { readlink } from 'fs-extra';
import retry from 'async-retry';
import { strict as assert, strictEqual } from 'assert'; import { strict as assert, strictEqual } from 'assert';
import { createZip } from '../src/lambda'; import { createZip } from '../src/lambda';
import { getSupportedNodeVersion } from '../src/fs/node-version'; import { getSupportedNodeVersion } from '../src/fs/node-version';
@@ -16,7 +15,6 @@ import {
runPackageJsonScript, runPackageJsonScript,
scanParentDirs, scanParentDirs,
FileBlob, FileBlob,
Meta,
} from '../src'; } from '../src';
jest.setTimeout(10 * 1000); jest.setTimeout(10 * 1000);
@@ -436,8 +434,8 @@ it('should warn for deprecated versions, soon to be discontinued', async () => {
expect(warningMessages).toStrictEqual([ expect(warningMessages).toStrictEqual([
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.', 'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.', 'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-01 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.', 'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set "engines": { "node": "16.x" } in your `package.json` file to use Node.js 16.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-01 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.', 'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set Node.js Version to 16.x in your Project Settings to use Node.js 16.',
]); ]);
global.Date.now = realDateNow; global.Date.now = realDateNow;
@@ -578,53 +576,16 @@ it('should detect package.json in nested frontend', async () => {
expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json')); expect(result.packageJsonPath).toEqual(path.join(fixture, 'package.json'));
}); });
it('should only invoke `runNpmInstall()` once per `package.json` file (serial)', async () => { it('should retry npm install when peer deps invalid and npm@8 on node@16', async () => {
const meta: Meta = {}; const nodeMajor = Number(process.versions.node.split('.')[0]);
const fixture = path.join(__dirname, 'fixtures', '02-zero-config-api'); if (nodeMajor !== 16) {
const apiDir = path.join(fixture, 'api'); console.log(`Skipping test on node@${nodeMajor}`);
const retryOpts = { maxRetryTime: 1000 }; return;
let run1, run2, run3; }
await retry(async () => { const fixture = path.join(__dirname, 'fixtures', '15-npm-8-legacy-peer-deps');
run1 = await runNpmInstall(apiDir, [], undefined, meta); const nodeVersion = { major: nodeMajor } as any;
expect(run1).toEqual(true); await runNpmInstall(fixture, [], {}, {}, nodeVersion);
expect( expect(warningMessages).toStrictEqual([
(meta.runNpmInstallSet as Set<string>).has( 'Warning: Retrying "Install Command" with `--legacy-peer-deps` which may accept a potentially broken dependency and slow install time.',
path.join(fixture, 'package.json') ]);
)
).toEqual(true);
}, retryOpts);
await retry(async () => {
run2 = await runNpmInstall(apiDir, [], undefined, meta);
expect(run2).toEqual(false);
}, retryOpts);
await retry(async () => {
run3 = await runNpmInstall(fixture, [], undefined, meta);
expect(run3).toEqual(false);
}, retryOpts);
});
it('should only invoke `runNpmInstall()` once per `package.json` file (parallel)', async () => {
const meta: Meta = {};
const fixture = path.join(__dirname, 'fixtures', '02-zero-config-api');
const apiDir = path.join(fixture, 'api');
let results: [boolean, boolean, boolean] | undefined;
await retry(
async () => {
results = await Promise.all([
runNpmInstall(apiDir, [], undefined, meta),
runNpmInstall(apiDir, [], undefined, meta),
runNpmInstall(fixture, [], undefined, meta),
]);
},
{ maxRetryTime: 3000 }
);
const [run1, run2, run3] = results || [];
expect(run1).toEqual(true);
expect(run2).toEqual(false);
expect(run3).toEqual(false);
expect(
(meta.runNpmInstallSet as Set<string>).has(
path.join(fixture, 'package.json')
)
).toEqual(true);
}); });

View File

@@ -1,6 +1,6 @@
{ {
"name": "vercel", "name": "vercel",
"version": "28.2.5", "version": "28.4.4",
"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",
@@ -41,16 +41,16 @@
"node": ">= 14" "node": ">= 14"
}, },
"dependencies": { "dependencies": {
"@vercel/build-utils": "5.4.2", "@vercel/build-utils": "5.5.2",
"@vercel/go": "2.2.5", "@vercel/go": "2.2.10",
"@vercel/hydrogen": "0.0.18", "@vercel/hydrogen": "0.0.23",
"@vercel/next": "3.1.25", "@vercel/next": "3.2.0",
"@vercel/node": "2.5.14", "@vercel/node": "2.5.20",
"@vercel/python": "3.1.14", "@vercel/python": "3.1.19",
"@vercel/redwood": "1.0.23", "@vercel/redwood": "1.0.28",
"@vercel/remix": "1.0.24", "@vercel/remix": "1.0.29",
"@vercel/ruby": "1.3.31", "@vercel/ruby": "1.3.36",
"@vercel/static-build": "1.0.23", "@vercel/static-build": "1.0.28",
"update-notifier": "5.1.0" "update-notifier": "5.1.0"
}, },
"devDependencies": { "devDependencies": {
@@ -95,9 +95,9 @@
"@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.2.4", "@vercel/client": "12.2.9",
"@vercel/frameworks": "1.1.5", "@vercel/frameworks": "1.1.6",
"@vercel/fs-detectors": "3.2.0", "@vercel/fs-detectors": "3.4.0",
"@vercel/fun": "1.0.4", "@vercel/fun": "1.0.4",
"@vercel/ncc": "0.24.0", "@vercel/ncc": "0.24.0",
"@zeit/source-map-support": "0.6.2", "@zeit/source-map-support": "0.6.2",

View File

@@ -2,7 +2,6 @@ import open from 'open';
import boxen from 'boxen'; import boxen from 'boxen';
import execa from 'execa'; import execa from 'execa';
import plural from 'pluralize'; import plural from 'pluralize';
import inquirer from 'inquirer';
import { resolve } from 'path'; import { resolve } from 'path';
import chalk, { Chalk } from 'chalk'; import chalk, { Chalk } from 'chalk';
import { URLSearchParams, parse } from 'url'; import { URLSearchParams, parse } from 'url';
@@ -150,7 +149,9 @@ export default async function main(client: Client): Promise<number> {
if (badDeployment) { if (badDeployment) {
if (badDeployment instanceof Error) { if (badDeployment instanceof Error) {
badDeployment.message += ` "${bad}"`; badDeployment.message += ` when requesting bad deployment "${normalizeURL(
bad
)}"`;
output.prettyError(badDeployment); output.prettyError(badDeployment);
return 1; return 1;
} }
@@ -165,7 +166,9 @@ export default async function main(client: Client): Promise<number> {
if (goodDeployment) { if (goodDeployment) {
if (goodDeployment instanceof Error) { if (goodDeployment instanceof Error) {
goodDeployment.message += ` "${good}"`; goodDeployment.message += ` when requesting good deployment "${normalizeURL(
good
)}"`;
output.prettyError(goodDeployment); output.prettyError(goodDeployment);
return 1; return 1;
} }
@@ -226,7 +229,8 @@ export default async function main(client: Client): Promise<number> {
// If we have the "good" deployment in this chunk, then we're done // If we have the "good" deployment in this chunk, then we're done
for (let i = 0; i < newDeployments.length; i++) { for (let i = 0; i < newDeployments.length; i++) {
if (newDeployments[i].url === good) { if (newDeployments[i].url === good) {
newDeployments = newDeployments.slice(0, i + 1); // grab all deployments up until the good one
newDeployments = newDeployments.slice(0, i);
next = undefined; next = undefined;
break; break;
} }
@@ -316,7 +320,7 @@ export default async function main(client: Client): Promise<number> {
if (openEnabled) { if (openEnabled) {
await open(testUrl); await open(testUrl);
} }
const answer = await inquirer.prompt({ const answer = await client.prompt({
type: 'expand', type: 'expand',
name: 'action', name: 'action',
message: 'Select an action:', message: 'Select an action:',

View File

@@ -25,6 +25,7 @@ import {
MergeRoutesProps, MergeRoutesProps,
Route, Route,
} from '@vercel/routing-utils'; } from '@vercel/routing-utils';
import { fileNameSymbol } from '@vercel/client';
import type { VercelConfig } from '@vercel/client'; import type { VercelConfig } from '@vercel/client';
import pull from './pull'; import pull from './pull';
@@ -54,6 +55,7 @@ import { importBuilders } from '../util/build/import-builders';
import { initCorepack, cleanupCorepack } from '../util/build/corepack'; import { initCorepack, cleanupCorepack } from '../util/build/corepack';
import { sortBuilders } from '../util/build/sort-builders'; import { sortBuilders } from '../util/build/sort-builders';
import { toEnumerableError } from '../util/error'; import { toEnumerableError } from '../util/error';
import { validateConfig } from '../util/validate-config';
type BuildResult = BuildResultV2 | BuildResultV3; type BuildResult = BuildResultV2 | BuildResultV3;
@@ -232,7 +234,8 @@ export default async function main(client: Client): Promise<number> {
process.env.VERCEL = '1'; process.env.VERCEL = '1';
process.env.NOW_BUILDER = '1'; process.env.NOW_BUILDER = '1';
return await doBuild(client, project, buildsJson, cwd, outputDir); await doBuild(client, project, buildsJson, cwd, outputDir);
return 0;
} catch (err: any) { } catch (err: any) {
output.prettyError(err); output.prettyError(err);
@@ -265,23 +268,36 @@ async function doBuild(
buildsJson: BuildsManifest, buildsJson: BuildsManifest,
cwd: string, cwd: string,
outputDir: string outputDir: string
): Promise<number> { ): Promise<void> {
const { output } = client; const { output } = client;
const workPath = join(cwd, project.settings.rootDirectory || '.'); const workPath = join(cwd, project.settings.rootDirectory || '.');
// Load `package.json` and `vercel.json` files const [pkg, vercelConfig, nowConfig] = await Promise.all([
const [pkg, vercelConfig] = await Promise.all([
readJSONFile<PackageJson>(join(workPath, 'package.json')), readJSONFile<PackageJson>(join(workPath, 'package.json')),
readJSONFile<VercelConfig>(join(workPath, 'vercel.json')).then( readJSONFile<VercelConfig>(join(workPath, 'vercel.json')),
config => config || readJSONFile<VercelConfig>(join(workPath, 'now.json')) readJSONFile<VercelConfig>(join(workPath, 'now.json')),
),
]); ]);
if (pkg instanceof CantParseJSONFile) throw pkg; if (pkg instanceof CantParseJSONFile) throw pkg;
if (vercelConfig instanceof CantParseJSONFile) throw vercelConfig; if (vercelConfig instanceof CantParseJSONFile) throw vercelConfig;
if (nowConfig instanceof CantParseJSONFile) throw nowConfig;
if (vercelConfig) {
vercelConfig[fileNameSymbol] = 'vercel.json';
} else if (nowConfig) {
nowConfig[fileNameSymbol] = 'now.json';
}
const localConfig = vercelConfig || nowConfig || {};
const validateError = validateConfig(localConfig);
if (validateError) {
throw validateError;
}
const projectSettings = { const projectSettings = {
...project.settings, ...project.settings,
...pickOverrides(vercelConfig || {}), ...pickOverrides(localConfig),
}; };
// Get a list of source files // Get a list of source files
@@ -289,12 +305,12 @@ async function doBuild(
normalizePath(relative(workPath, f)) normalizePath(relative(workPath, f))
); );
const routesResult = getTransformedRoutes(vercelConfig || {}); const routesResult = getTransformedRoutes(localConfig);
if (routesResult.error) { if (routesResult.error) {
throw routesResult.error; throw routesResult.error;
} }
if (vercelConfig?.builds && vercelConfig.functions) { if (localConfig.builds && localConfig.functions) {
throw new NowBuildError({ throw new NowBuildError({
code: 'bad_request', code: 'bad_request',
message: message:
@@ -303,7 +319,7 @@ async function doBuild(
}); });
} }
let builds = vercelConfig?.builds || []; let builds = localConfig.builds || [];
let zeroConfigRoutes: Route[] = []; let zeroConfigRoutes: Route[] = [];
let isZeroConfig = false; let isZeroConfig = false;
@@ -318,7 +334,7 @@ async function doBuild(
// Detect the Vercel Builders that will need to be invoked // Detect the Vercel Builders that will need to be invoked
const detectedBuilders = await detectBuilders(files, pkg, { const detectedBuilders = await detectBuilders(files, pkg, {
...vercelConfig, ...localConfig,
projectSettings, projectSettings,
ignoreBuildScript: true, ignoreBuildScript: true,
featHandleMiss: true, featHandleMiss: true,
@@ -395,13 +411,10 @@ async function doBuild(
}) })
); );
buildsJson.builds = Array.from(buildsJsonBuilds.values()); buildsJson.builds = Array.from(buildsJsonBuilds.values());
const buildsJsonPath = join(outputDir, 'builds.json'); await fs.writeJSON(join(outputDir, 'builds.json'), buildsJson, {
const writeBuildsJsonPromise = fs.writeJSON(buildsJsonPath, buildsJson, {
spaces: 2, spaces: 2,
}); });
ops.push(writeBuildsJsonPromise);
// The `meta` config property is re-used for each Builder // The `meta` config property is re-used for each Builder
// invocation so that Builders can share state between // invocation so that Builders can share state between
// subsequent entrypoint builds. // subsequent entrypoint builds.
@@ -466,7 +479,7 @@ async function doBuild(
build, build,
builder, builder,
builderPkg, builderPkg,
vercelConfig localConfig
).then( ).then(
override => { override => {
if (override) overrides.push(override); if (override) overrides.push(override);
@@ -475,26 +488,11 @@ async function doBuild(
) )
); );
} catch (err: any) { } catch (err: any) {
output.prettyError(err);
const writeConfigJsonPromise = fs.writeJSON(
join(outputDir, 'config.json'),
{ version: 3 },
{ spaces: 2 }
);
await Promise.all([writeBuildsJsonPromise, writeConfigJsonPromise]);
const buildJsonBuild = buildsJsonBuilds.get(build); const buildJsonBuild = buildsJsonBuilds.get(build);
if (buildJsonBuild) { if (buildJsonBuild) {
buildJsonBuild.error = toEnumerableError(err); buildJsonBuild.error = toEnumerableError(err);
await fs.writeJSON(buildsJsonPath, buildsJson, {
spaces: 2,
});
} }
throw err;
return 1;
} }
} }
@@ -555,7 +553,7 @@ async function doBuild(
builds: builderRoutes, builds: builderRoutes,
}); });
const mergedImages = mergeImages(buildResults.values()); const mergedImages = mergeImages(localConfig.images, buildResults.values());
const mergedWildcard = mergeWildcard(buildResults.values()); const mergedWildcard = mergeWildcard(buildResults.values());
const mergedOverrides: Record<string, PathOverride> = const mergedOverrides: Record<string, PathOverride> =
overrides.length > 0 ? Object.assign({}, ...overrides) : undefined; overrides.length > 0 ? Object.assign({}, ...overrides) : undefined;
@@ -581,8 +579,6 @@ async function doBuild(
emoji('success') emoji('success')
)}\n` )}\n`
); );
return 0;
} }
function expandBuild(files: string[], build: Builder): Builder[] { function expandBuild(files: string[], build: Builder): Builder[] {
@@ -624,9 +620,9 @@ function expandBuild(files: string[], build: Builder): Builder[] {
} }
function mergeImages( function mergeImages(
images: BuildResultV2Typical['images'],
buildResults: Iterable<BuildResult> buildResults: Iterable<BuildResult>
): BuildResultV2Typical['images'] { ): BuildResultV2Typical['images'] {
let images: BuildResultV2Typical['images'] = undefined;
for (const result of buildResults) { for (const result of buildResults) {
if ('images' in result && result.images) { if ('images' in result && result.images) {
images = Object.assign({}, images, result.images); images = Object.assign({}, images, result.images);

View File

@@ -522,7 +522,12 @@ export default async (client: Client): Promise<number> => {
quiet, quiet,
wantsPublic: argv['--public'] || localConfig.public, wantsPublic: argv['--public'] || localConfig.public,
type: null, type: null,
nowConfig: localConfig, nowConfig: {
...localConfig,
// `images` is allowed in "vercel.json" and processed
// by `vc build`, but don't send it to the API endpoint
images: undefined,
},
regions, regions,
meta, meta,
gitMetadata, gitMetadata,

View File

@@ -23,6 +23,7 @@ import type {
} from '../types'; } from '../types';
import { sharedPromise } from './promise'; import { sharedPromise } from './promise';
import { APIError } from './errors-ts'; import { APIError } from './errors-ts';
import { normalizeError } from './is-error';
const isSAMLError = (v: any): v is SAMLError => { const isSAMLError = (v: any): v is SAMLError => {
return v && v.saml; return v && v.saml;
@@ -146,10 +147,15 @@ export default class Client extends EventEmitter implements Stdio {
const error = await responseError(res); const error = await responseError(res);
if (isSAMLError(error)) { if (isSAMLError(error)) {
// A SAML error means the token is expired, or is not try {
// designated for the requested team, so the user needs // A SAML error means the token is expired, or is not
// to re-authenticate // designated for the requested team, so the user needs
await this.reauthenticate(error); // to re-authenticate
await this.reauthenticate(error);
} catch (reauthError) {
// there's no sense in retrying
return bail(normalizeError(reauthError));
}
} else if (res.status >= 400 && res.status < 500) { } else if (res.status >= 400 && res.status < 500) {
// Any other 4xx should bail without retrying // Any other 4xx should bail without retrying
return bail(error); return bail(error);
@@ -186,7 +192,7 @@ export default class Client extends EventEmitter implements Stdio {
`Failed to re-authenticate for ${bold(error.scope)} scope` `Failed to re-authenticate for ${bold(error.scope)} scope`
); );
} }
process.exit(1); throw error;
} }
this.authConfig.token = result.token; this.authConfig.token = result.token;

View File

@@ -78,16 +78,23 @@ function getLastCommit(directory: string): Promise<git.Commit> {
export function isDirty(directory: string, output: Output): Promise<boolean> { export function isDirty(directory: string, output: Output): Promise<boolean> {
return new Promise(resolve => { return new Promise(resolve => {
exec('git status -s', { cwd: directory }, function (err, stdout, stderr) { // note: we specify the `--no-optional-locks` git flag so that `git status`
let debugMessage = `Failed to determine if Git repo has been modified:`; // does not perform any "optional" operations such as optimizing the index
if (err || stderr) { // in the background: https://git-scm.com/docs/git-status#_background_refresh
if (err) debugMessage += `\n${err}`; exec(
if (stderr) debugMessage += `\n${stderr.trim()}`; 'git --no-optional-locks status -s',
output.debug(debugMessage); { cwd: directory },
return resolve(false); function (err, stdout, stderr) {
let debugMessage = `Failed to determine if Git repo has been modified:`;
if (err || stderr) {
if (err) debugMessage += `\n${err}`;
if (stderr) debugMessage += `\n${stderr.trim()}`;
output.debug(debugMessage);
return resolve(false);
}
resolve(stdout.trim().length > 0);
} }
resolve(stdout.trim().length > 0); );
});
}); });
} }

View File

@@ -57,7 +57,7 @@ import { MissingDotenvVarsError } from '../errors-ts';
import cliPkg from '../pkg'; import cliPkg from '../pkg';
import { getVercelDirectory } from '../projects/link'; import { getVercelDirectory } from '../projects/link';
import { staticFiles as getFiles } from '../get-files'; import { staticFiles as getFiles } from '../get-files';
import { validateConfig } from './validate'; import { validateConfig } from '../validate-config';
import { devRouter, getRoutesTypes } from './router'; import { devRouter, getRoutesTypes } from './router';
import getMimeType from './mime-type'; import getMimeType from './mime-type';
import { executeBuild, getBuildMatches, shutdownBuilder } from './builder'; import { executeBuild, getBuildMatches, shutdownBuilder } from './builder';

View File

@@ -28,6 +28,16 @@ export async function writeProjectSettings(
project: Project, project: Project,
org: Org org: Org
) { ) {
let analyticsId: string | undefined;
if (
project.analytics?.id &&
(!project.analytics.disabledAt ||
(project.analytics.enabledAt &&
project.analytics.enabledAt > project.analytics.disabledAt))
) {
analyticsId = project.analytics.id;
}
const projectLinkAndSettings: ProjectLinkAndSettings = { const projectLinkAndSettings: ProjectLinkAndSettings = {
projectId: project.id, projectId: project.id,
orgId: org.id, orgId: org.id,
@@ -41,7 +51,7 @@ export async function writeProjectSettings(
rootDirectory: project.rootDirectory, rootDirectory: project.rootDirectory,
directoryListing: project.directoryListing, directoryListing: project.directoryListing,
nodeVersion: project.nodeVersion, nodeVersion: project.nodeVersion,
analyticsId: project.analytics?.id, analyticsId,
}, },
}; };
const path = join(cwd, VERCEL_DIR, VERCEL_DIR_PROJECT); const path = join(cwd, VERCEL_DIR, VERCEL_DIR_PROJECT);

View File

@@ -7,7 +7,7 @@ import {
rewritesSchema, rewritesSchema,
trailingSlashSchema, trailingSlashSchema,
} from '@vercel/routing-utils'; } from '@vercel/routing-utils';
import { VercelConfig } from './types'; import { VercelConfig } from './dev/types';
import { import {
functionsSchema, functionsSchema,
buildsSchema, buildsSchema,
@@ -16,6 +16,83 @@ import {
} from '@vercel/build-utils'; } from '@vercel/build-utils';
import { fileNameSymbol } from '@vercel/client'; import { fileNameSymbol } from '@vercel/client';
const imagesSchema = {
type: 'object',
additionalProperties: false,
required: ['sizes'],
properties: {
contentSecurityPolicy: {
type: 'string',
minLength: 1,
maxLength: 256,
},
dangerouslyAllowSVG: {
type: 'boolean',
},
domains: {
type: 'array',
minItems: 0,
maxItems: 50,
items: {
type: 'string',
minLength: 1,
maxLength: 256,
},
},
formats: {
type: 'array',
minItems: 1,
maxItems: 4,
items: {
enum: ['image/avif', 'image/webp', 'image/jpeg', 'image/png'],
},
},
minimumCacheTTL: {
type: 'integer',
minimum: 1,
maximum: 315360000,
},
remotePatterns: {
type: 'array',
minItems: 0,
maxItems: 50,
items: {
type: 'object',
additionalProperties: false,
required: ['hostname'],
properties: {
protocol: {
enum: ['http', 'https'],
},
hostname: {
type: 'string',
minLength: 1,
maxLength: 256,
},
port: {
type: 'string',
minLength: 1,
maxLength: 5,
},
pathname: {
type: 'string',
minLength: 1,
maxLength: 256,
},
},
},
},
sizes: {
type: 'array',
minItems: 1,
maxItems: 50,
items: {
type: 'number',
},
},
},
};
const vercelConfigSchema = { const vercelConfigSchema = {
type: 'object', type: 'object',
// These are not all possibilities because `vc dev` // These are not all possibilities because `vc dev`
@@ -30,6 +107,7 @@ const vercelConfigSchema = {
rewrites: rewritesSchema, rewrites: rewritesSchema,
trailingSlash: trailingSlashSchema, trailingSlash: trailingSlashSchema,
functions: functionsSchema, functions: functionsSchema,
images: imagesSchema,
}, },
}; };

View File

@@ -0,0 +1,13 @@
import generateUUID from '../vendor/generate-uuid';
export const config = {
runtime: 'experimental-edge',
};
export default async function edge(request, event) {
return new Response(
JSON.stringify({
randomString: generateUUID(),
})
);
}

View File

@@ -0,0 +1,6 @@
// This uses the `crypto` globaly,
// which will work fine in a browser or Edge Runtime environment
export default function generateUUID(message) {
return crypto.randomUUID();
}

View File

@@ -0,0 +1,8 @@
import crypto from 'crypto';
// this uses a core Node library,
// which will fail to execute in a browser or Edge Runtime context
export default function say(message) {
return crypto.generateUUID();
}

View File

@@ -0,0 +1,6 @@
{
"name": "generate-uuid",
"private": true,
"main": "index-node.js",
"browser": "index-browser.js"
}

View File

@@ -86,6 +86,7 @@ test(
testFixtureStdio('edge-function', async (testPath: any) => { testFixtureStdio('edge-function', async (testPath: any) => {
await testPath(500, '/api/edge-500-response'); await testPath(500, '/api/edge-500-response');
await testPath(200, '/api/edge-success'); await testPath(200, '/api/edge-success');
await testPath(200, '/api/edge-import-browser');
}) })
); );

View File

@@ -0,0 +1,7 @@
{
"orgId": ".",
"projectId": ".",
"settings": {
"framework": null
}
}

View File

@@ -0,0 +1 @@
<h1>Vercel</h1>

View File

@@ -0,0 +1,8 @@
{
"images": {
"sizes": [256, 384, 600, 1000],
"domains": [],
"minimumCacheTTL": 60,
"formats": ["image/avif", "image/webp"]
}
}

View File

@@ -0,0 +1,7 @@
{
"orgId": ".",
"projectId": ".",
"settings": {
"framework": null
}
}

View File

@@ -0,0 +1 @@
<h1>Vercel</h1>

View File

@@ -0,0 +1,16 @@
{
"rewrites": [
{
"source": "/one",
"destination": "/api/one"
},
{
"source": "/two",
"destination": "/api/two"
},
{
"src": "/three",
"dest": "/api/three"
}
]
}

View File

@@ -3,20 +3,26 @@ import chance from 'chance';
import { Deployment } from '@vercel/client'; import { Deployment } from '@vercel/client';
import { client } from './client'; import { client } from './client';
import { Build, User } from '../../src/types'; import { Build, User } from '../../src/types';
import type { Request, Response } from 'express';
let deployments = new Map<string, Deployment>(); let deployments = new Map<string, Deployment>();
let deploymentBuilds = new Map<Deployment, Build[]>(); let deploymentBuilds = new Map<Deployment, Build[]>();
let alreadySetupDeplomentEndpoints = false;
type State = Deployment['readyState']; type State = Deployment['readyState'];
export function useDeployment({ export function useDeployment({
creator, creator,
state = 'READY', state = 'READY',
createdAt,
}: { }: {
creator: Pick<User, 'id' | 'email' | 'name' | 'username'>; creator: Pick<User, 'id' | 'email' | 'name' | 'username'>;
state?: State; state?: State;
createdAt?: number;
}) { }) {
const createdAt = Date.now(); setupDeploymentEndpoints();
createdAt = createdAt || Date.now();
const url = new URL(chance().url()); const url = new URL(chance().url());
const name = chance().name(); const name = chance().name();
const id = `dpl_${chance().guid()}`; const id = `dpl_${chance().guid()}`;
@@ -99,6 +105,15 @@ export function useDeploymentMissingProjectSettings() {
beforeEach(() => { beforeEach(() => {
deployments = new Map(); deployments = new Map();
deploymentBuilds = new Map(); deploymentBuilds = new Map();
alreadySetupDeplomentEndpoints = false;
});
function setupDeploymentEndpoints() {
if (alreadySetupDeplomentEndpoints) {
return;
}
alreadySetupDeplomentEndpoints = true;
client.scenario.get('/:version/deployments/:id', (req, res) => { client.scenario.get('/:version/deployments/:id', (req, res) => {
const { id } = req.params; const { id } = req.params;
@@ -136,8 +151,21 @@ beforeEach(() => {
res.json({ builds }); res.json({ builds });
}); });
client.scenario.get('/:version/now/deployments', (req, res) => { function handleGetDeployments(req: Request, res: Response) {
const deploymentsList = Array.from(deployments.values()); const currentDeployments = Array.from(deployments.values()).sort(
res.json({ deployments: deploymentsList }); (a: Deployment, b: Deployment) => {
}); // sort in reverse chronological order
}); return b.createdAt - a.createdAt;
}
);
res.json({
pagination: {
count: currentDeployments.length,
},
deployments: currentDeployments,
});
}
client.scenario.get('/:version/now/deployments', handleGetDeployments);
client.scenario.get('/:version/deployments', handleGetDeployments);
}

View File

@@ -0,0 +1,55 @@
import { client } from '../../mocks/client';
import { useUser } from '../../mocks/user';
import bisect from '../../../src/commands/bisect';
import { useDeployment } from '../../mocks/deployment';
describe('bisect', () => {
it('should find the bad deployment', async () => {
const user = useUser();
const now = Date.now();
const deployment1 = useDeployment({ creator: user, createdAt: now });
const deployment2 = useDeployment({
creator: user,
createdAt: now + 10000,
});
const deployment3 = useDeployment({
creator: user,
createdAt: now + 20000,
});
// also create an extra deployment before the known good deployment
// to make sure the bisect pool doesn't include it
useDeployment({
creator: user,
createdAt: now - 30000,
});
const bisectPromise = bisect(client);
await expect(client.stderr).toOutput('Specify a URL where the bug occurs:');
client.stdin.write(`https://${deployment3.url}\n`);
await expect(client.stderr).toOutput(
'Specify a URL where the bug does not occur:'
);
client.stdin.write(`https://${deployment1.url}\n`);
await expect(client.stderr).toOutput(
'Specify the URL subpath where the bug occurs:'
);
client.stdin.write('/docs\n');
await expect(client.stderr).toOutput('Bisecting');
await expect(client.stderr).toOutput(
`Deployment URL: https://${deployment2.url}`
);
client.stdin.write('b\n');
await expect(client.stderr).toOutput(
`The first bad deployment is: https://${deployment2.url}`
);
await expect(bisectPromise).resolves.toEqual(0);
});
});

View File

@@ -750,11 +750,22 @@ describe('build', () => {
const errorBuilds = builds.builds.filter((b: any) => 'error' in b); const errorBuilds = builds.builds.filter((b: any) => 'error' in b);
expect(errorBuilds).toHaveLength(1); expect(errorBuilds).toHaveLength(1);
expect(errorBuilds[0].error.name).toEqual('Error'); expect(errorBuilds[0].error).toEqual({
expect(errorBuilds[0].error.message).toMatch(`TS1005`); name: 'Error',
expect(errorBuilds[0].error.message).toMatch(`',' expected.`); message: expect.stringContaining('TS1005'),
expect(errorBuilds[0].error.hideStackTrace).toEqual(true); stack: expect.stringContaining('api/typescript.ts'),
expect(errorBuilds[0].error.code).toEqual('NODE_TYPESCRIPT_ERROR'); hideStackTrace: true,
code: 'NODE_TYPESCRIPT_ERROR',
});
// top level "error" also contains the same error
expect(builds.error).toEqual({
name: 'Error',
message: expect.stringContaining('TS1005'),
stack: expect.stringContaining('api/typescript.ts'),
hideStackTrace: true,
code: 'NODE_TYPESCRIPT_ERROR',
});
// `config.json` contains `version` // `config.json` contains `version`
const configJson = await fs.readJSON(join(output, 'config.json')); const configJson = await fs.readJSON(join(output, 'config.json'));
@@ -921,6 +932,62 @@ describe('build', () => {
} }
}); });
it('should apply "images" configuration from `vercel.json`', async () => {
const cwd = fixture('images');
const output = join(cwd, '.vercel/output');
try {
process.chdir(cwd);
const exitCode = await build(client);
expect(exitCode).toEqual(0);
// `config.json` includes "images" from `vercel.json`
const configJson = await fs.readJSON(join(output, 'config.json'));
expect(configJson).toMatchObject({
images: {
sizes: [256, 384, 600, 1000],
domains: [],
minimumCacheTTL: 60,
formats: ['image/avif', 'image/webp'],
},
});
} finally {
process.chdir(originalCwd);
delete process.env.__VERCEL_BUILD_RUNNING;
}
});
it('should fail with invalid "rewrites" configuration from `vercel.json`', async () => {
const cwd = fixture('invalid-rewrites');
const output = join(cwd, '.vercel/output');
try {
process.chdir(cwd);
const exitCode = await build(client);
expect(exitCode).toEqual(1);
await expect(client.stderr).toOutput(
'Error: Invalid vercel.json - `rewrites[2]` should NOT have additional property `src`. Did you mean `source`?' +
'\n' +
'View Documentation: https://vercel.com/docs/configuration#project/rewrites'
);
const builds = await fs.readJSON(join(output, 'builds.json'));
expect(builds.builds).toBeUndefined();
expect(builds.error).toEqual({
name: 'Error',
message:
'Invalid vercel.json - `rewrites[2]` should NOT have additional property `src`. Did you mean `source`?',
stack: expect.stringContaining('at validateConfig'),
hideStackTrace: true,
code: 'INVALID_VERCEL_CONFIG',
link: 'https://vercel.com/docs/configuration#project/rewrites',
action: 'View Documentation',
});
const configJson = await fs.readJSON(join(output, 'config.json'));
expect(configJson.version).toBe(3);
} finally {
process.chdir(originalCwd);
delete process.env.__VERCEL_BUILD_RUNNING;
}
});
describe('should find packages with different main/module/browser keys', function () { describe('should find packages with different main/module/browser keys', function () {
let output: string; let output: string;

View File

@@ -1,4 +1,4 @@
import { validateConfig } from '../../../../src/util/dev/validate'; import { validateConfig } from '../../../../src/util/validate-config';
describe('validateConfig', () => { describe('validateConfig', () => {
it('should not error with empty config', async () => { it('should not error with empty config', async () => {

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/client", "name": "@vercel/client",
"version": "12.2.4", "version": "12.2.9",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"homepage": "https://vercel.com", "homepage": "https://vercel.com",
@@ -43,7 +43,7 @@
] ]
}, },
"dependencies": { "dependencies": {
"@vercel/build-utils": "5.4.2", "@vercel/build-utils": "5.5.2",
"@vercel/routing-utils": "2.0.2", "@vercel/routing-utils": "2.0.2",
"@zeit/fetch": "5.2.0", "@zeit/fetch": "5.2.0",
"async-retry": "1.2.3", "async-retry": "1.2.3",

View File

@@ -1,6 +1,7 @@
import type { import type {
Builder, Builder,
BuilderFunctions, BuilderFunctions,
Images,
ProjectSettings, ProjectSettings,
} from '@vercel/build-utils'; } from '@vercel/build-utils';
import type { Header, Route, Redirect, Rewrite } from '@vercel/routing-utils'; import type { Header, Route, Redirect, Rewrite } from '@vercel/routing-utils';
@@ -152,6 +153,7 @@ export interface VercelConfig {
installCommand?: string | null; installCommand?: string | null;
framework?: string | null; framework?: string | null;
outputDirectory?: string | null; outputDirectory?: string | null;
images?: Images;
} }
export interface GitMetadata { export interface GitMetadata {

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/frameworks", "name": "@vercel/frameworks",
"version": "1.1.5", "version": "1.1.6",
"main": "./dist/frameworks.js", "main": "./dist/frameworks.js",
"types": "./dist/frameworks.d.ts", "types": "./dist/frameworks.d.ts",
"files": [ "files": [

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/fs-detectors", "name": "@vercel/fs-detectors",
"version": "3.2.0", "version": "3.4.0",
"description": "Vercel filesystem detectors", "description": "Vercel filesystem detectors",
"main": "./dist/index.js", "main": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
@@ -19,7 +19,7 @@
"test-unit": "yarn test" "test-unit": "yarn test"
}, },
"dependencies": { "dependencies": {
"@vercel/frameworks": "1.1.5", "@vercel/frameworks": "1.1.6",
"@vercel/routing-utils": "2.0.2", "@vercel/routing-utils": "2.0.2",
"glob": "8.0.3", "glob": "8.0.3",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",

View File

@@ -89,33 +89,34 @@ export abstract class DetectorFilesystem {
if (!p) { if (!p) {
p = this._readdir(dirPath); p = this._readdir(dirPath);
this.readdirCache.set(dirPath, p); this.readdirCache.set(dirPath, p);
}
const directoryContent = await p; const directoryContent = await p;
const directoryFiles = new Set<string>(); const directoryFiles = new Set<string>();
for (const file of directoryContent) { for (const file of directoryContent) {
if (file.type === 'file') { if (file.type === 'file') {
// we know this file exists, mark it as so on the filesystem // we know this file exists, mark it as so on the filesystem
this.fileCache.set(file.path, Promise.resolve(true)); this.fileCache.set(file.path, Promise.resolve(true));
this.pathCache.set(file.path, Promise.resolve(true)); this.pathCache.set(file.path, Promise.resolve(true));
directoryFiles.add(file.name); directoryFiles.add(file.name);
}
}
if (options?.potentialFiles) {
// calculate the set of paths that truly do not exist
const filesThatDoNotExist = options.potentialFiles.filter(
path => !directoryFiles.has(path)
);
for (const filePath of filesThatDoNotExist) {
const fullFilePath =
dirPath === '/' ? filePath : posixPath.join(dirPath, filePath);
// we know this file does not exist, mark it as so on the filesystem
this.fileCache.set(fullFilePath, Promise.resolve(false));
this.pathCache.set(fullFilePath, Promise.resolve(false));
}
} }
} }
if (options?.potentialFiles) {
// calculate the set of paths that truly do not exist
const filesThatDoNotExist = options.potentialFiles.filter(
path => !directoryFiles.has(path)
);
for (const filePath of filesThatDoNotExist) {
const fullFilePath =
dirPath === '/' ? filePath : posixPath.join(dirPath, filePath);
// we know this file does not exist, mark it as so on the filesystem
this.fileCache.set(fullFilePath, Promise.resolve(false));
this.pathCache.set(fullFilePath, Promise.resolve(false));
}
}
return p; return p;
}; };

View File

@@ -36,6 +36,9 @@ export async function getWorkspacePackagePaths({
case 'nx': case 'nx':
results = await getNxWorkspacePackagePaths({ fs: workspaceFs }); results = await getNxWorkspacePackagePaths({ fs: workspaceFs });
break; break;
case 'rush':
results = await getRushWorkspacePackagePaths({ fs: workspaceFs });
break;
default: default:
throw new Error(`Unknown workspace implementation: ${type}`); throw new Error(`Unknown workspace implementation: ${type}`);
} }
@@ -58,6 +61,14 @@ type PnpmWorkspaces = {
packages?: string[]; packages?: string[];
}; };
type RushWorkspaces = {
projects: [
{
projectFolder: string;
}
];
};
const isWin = process.platform === 'win32'; const isWin = process.platform === 'win32';
const normalizePath = (p: string) => (isWin ? p.replace(/\\/g, '/') : p); const normalizePath = (p: string) => (isWin ? p.replace(/\\/g, '/') : p);
@@ -127,3 +138,23 @@ async function getPnpmWorkspacePackagePaths({
return getPackagePaths(packages, fs); return getPackagePaths(packages, fs);
} }
async function getRushWorkspacePackagePaths({
fs,
}: GetPackagePathOptions): Promise<string[]> {
const rushWorkspaceAsBuffer = await fs.readFile('rush.json');
const { projects = [] } = JSON.parse(
rushWorkspaceAsBuffer.toString()
) as RushWorkspaces;
if (Array.isArray(projects)) {
const packages = projects
.filter(proj => proj.projectFolder)
.map(project => project.projectFolder);
return getPackagePaths(packages, fs);
} else {
return [];
}
}

View File

@@ -12,7 +12,7 @@ export interface GetWorkspaceOptions {
cwd?: string; cwd?: string;
} }
export type WorkspaceType = 'yarn' | 'pnpm' | 'npm' | 'nx'; export type WorkspaceType = 'yarn' | 'pnpm' | 'npm' | 'nx' | 'rush';
export type Workspace = { export type Workspace = {
type: WorkspaceType; type: WorkspaceType;

View File

@@ -71,6 +71,17 @@ export const workspaceManagers: Array<
], ],
}, },
}, },
{
name: 'rush',
slug: 'rush',
detectors: {
every: [
{
path: 'rush.json',
},
],
},
},
{ {
name: 'default', name: 'default',
slug: 'yarn', slug: 'yarn',

View File

@@ -0,0 +1,15 @@
{
"name": "my-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"debug": "^4.3.2"
}
}

View File

@@ -0,0 +1,15 @@
{
"name": "my-second-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"debug": "^4.3.2"
}
}

View File

@@ -23,5 +23,14 @@
"postRushBuild": [] "postRushBuild": []
}, },
"variants": [], "variants": [],
"projects": [] "projects": [
{
"packageName": "my-app",
"projectFolder": "apps/my-app"
},
{
"packageName": "my-second-app",
"projectFolder": "apps/my-second-app"
}
]
} }

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-one",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-two",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -0,0 +1,27 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json",
"rushVersion": "5.76.1",
"pnpmVersion": "6.7.1",
"pnpmOptions": {
"useWorkspaces": true
},
"nodeSupportedVersionRange": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0",
"gitPolicy": {},
"repository": {},
"eventHooks": {
"preRushInstall": [],
"postRushInstall": [],
"preRushBuild": [],
"postRushBuild": []
},
"variants": [],
"projects": []
}

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-one",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-two",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -0,0 +1,27 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json",
"rushVersion": "5.76.1",
"pnpmVersion": "6.7.1",
"pnpmOptions": {
"useWorkspaces": true
},
"nodeSupportedVersionRange": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0",
"gitPolicy": {},
"repository": {},
"eventHooks": {
"preRushInstall": [],
"postRushInstall": [],
"preRushBuild": [],
"postRushBuild": []
},
"variants": [],
"projects": "projects"
}

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-one",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-two",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-one",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -1,5 +1,5 @@
{ {
"name": "b", "name": "app-two",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",

View File

@@ -0,0 +1,15 @@
{
"name": "my-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"debug": "^4.3.2"
}
}

View File

@@ -0,0 +1,15 @@
{
"name": "my-second-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"debug": "^4.3.2"
}
}

View File

@@ -0,0 +1,35 @@
{
"$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json",
"rushVersion": "5.76.1",
"pnpmVersion": "6.7.1",
"pnpmOptions": {
"useWorkspaces": true
},
"nodeSupportedVersionRange": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0",
"gitPolicy": {},
"repository": {},
"eventHooks": {
"preRushInstall": [],
"postRushInstall": [],
"preRushBuild": [],
"postRushBuild": []
},
"variants": [],
"projects": [
{
"packageName": "my-app"
},
{
"packageName": "my-second-app",
"projectFolder": "apps/my-second-app"
}
]
}

View File

@@ -172,6 +172,20 @@ describe('DetectorFilesystem', () => {
hasPathSpy.mock.calls.length = 0; hasPathSpy.mock.calls.length = 0;
expect(await fs.hasPath('packages/app1/package.json')).toBe(true); expect(await fs.hasPath('packages/app1/package.json')).toBe(true);
expect(hasPathSpy).not.toHaveBeenCalled(); expect(hasPathSpy).not.toHaveBeenCalled();
expect(
await fs.readdir('packages/app1', { potentialFiles: ['vercel.json'] })
).toEqual([
{
name: 'package.json',
path: 'packages/app1/package.json',
type: 'file',
},
]);
hasPathSpy.mock.calls.length = 0;
expect(await fs.hasPath('packages/app1/vercel.json')).toBe(false);
expect(hasPathSpy).not.toHaveBeenCalled();
}); });
it('should be able to write files', async () => { it('should be able to write files', async () => {

View File

@@ -18,7 +18,11 @@ describe.each<[string, string[]]>([
['42-npm-workspace-with-nx', ['/apps/app-one', '/apps/app-two']], ['42-npm-workspace-with-nx', ['/apps/app-one', '/apps/app-two']],
['43-nx-json-misshaped', []], ['43-nx-json-misshaped', []],
['44-nx-json-string', []], ['44-nx-json-string', []],
])('`getWorkspacesPackagePaths()`', (fixturePath, packagePaths) => { ['40-rush-monorepo', ['/apps/my-app', '/apps/my-second-app']],
['41-rush-monorepo-empty', []],
['42-rush-json-invalid', []],
['45-rush-no-project-folder', ['/apps/my-second-app']],
])('`getWorkspacePackagePaths()`', (fixturePath, packagePaths) => {
const testName = const testName =
packagePaths.length > 0 packagePaths.length > 0
? `should detect ${packagePaths.join()} package${ ? `should detect ${packagePaths.join()} package${

View File

@@ -46,7 +46,6 @@ interface Analyzed {
found?: boolean; found?: boolean;
packageName: string; packageName: string;
functionName: string; functionName: string;
watch: string[];
} }
interface PortInfo { interface PortInfo {
@@ -498,18 +497,8 @@ export async function build({
environment: {}, environment: {},
}); });
const watch = parsedAnalyzed.watch;
let watchSub: string[] = [];
// if `entrypoint` located in subdirectory
// we will need to concat it with return watch array
if (entrypointArr.length > 1) {
entrypointArr.pop();
watchSub = parsedAnalyzed.watch.map(file => join(...entrypointArr, file));
}
return { return {
output: lambda, output: lambda,
watch: watch.concat(watchSub),
}; };
} catch (error) { } catch (error) {
debug('Go Builder Error: ' + error); debug('Go Builder Error: ' + error);

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/go", "name": "@vercel/go",
"version": "2.2.5", "version": "2.2.10",
"license": "MIT", "license": "MIT",
"main": "./dist/index", "main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go", "homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
@@ -35,7 +35,7 @@
"@types/jest": "28.1.6", "@types/jest": "28.1.6",
"@types/node-fetch": "^2.3.0", "@types/node-fetch": "^2.3.0",
"@types/tar": "^4.0.0", "@types/tar": "^4.0.0",
"@vercel/build-utils": "5.4.2", "@vercel/build-utils": "5.5.2",
"@vercel/ncc": "0.24.0", "@vercel/ncc": "0.24.0",
"async-retry": "1.3.1", "async-retry": "1.3.1",
"execa": "^1.0.0", "execa": "^1.0.0",

View File

@@ -0,0 +1,10 @@
package handler
import (
"fmt"
"net/http"
)
func Handler2(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "from one.go")
}

View File

@@ -0,0 +1,10 @@
package handler
import (
"fmt"
"net/http"
)
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "from two.go")
}

View File

@@ -0,0 +1,3 @@
module handler
go 1.16

View File

@@ -0,0 +1,12 @@
{
"probes": [
{
"path": "/api/one",
"mustContain": "from one.go"
},
{
"path": "/api/two",
"mustContain": "from two.go"
}
]
}

View File

@@ -2,7 +2,6 @@ package main
import ( import (
"encoding/json" "encoding/json"
"flag"
"fmt" "fmt"
"go/ast" "go/ast"
"go/parser" "go/parser"
@@ -104,84 +103,6 @@ func main() {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
se := string(rf)
var files []string
var relatedFiles []string
// Add entrypoint to watchlist
relFileName, err := filepath.Rel(filepath.Dir(fileName), fileName)
if err != nil {
log.Fatal(err)
}
relatedFiles = append(relatedFiles, relFileName)
// looking for all go files that have export func
// using in entrypoint
err = filepath.Walk(filepath.Dir(fileName), visit(&files))
if err != nil {
log.Fatal(err)
}
// looking related packages
var modPath string
flag.StringVar(&modPath, "modpath", "", "module path")
flag.Parse()
if len(modPath) > 1 {
err = filepath.Walk(modPath, visit(&files))
if err != nil {
log.Fatal(err)
}
}
for _, file := range files {
absFileName, _ := filepath.Abs(fileName)
absFile, _ := filepath.Abs(file)
// if it isn't entrypoint
if absFileName != absFile {
// find all export structs and functions
pf := parse(file)
var exportedDecl []string
ast.Inspect(pf, func(n ast.Node) bool {
switch t := n.(type) {
case *ast.FuncDecl:
if t.Name.IsExported() {
exportedDecl = append(exportedDecl, t.Name.Name)
}
// find variable declarations
case *ast.TypeSpec:
// which are public
if t.Name.IsExported() {
switch t.Type.(type) {
// and are interfaces
case *ast.StructType:
exportedDecl = append(exportedDecl, t.Name.Name)
}
}
}
return true
})
for _, ed := range exportedDecl {
if strings.Contains(se, ed) {
// find relative path of related file
var basePath string
if modPath == "" {
basePath = filepath.Dir(fileName)
} else {
basePath = modPath
}
rel, err := filepath.Rel(basePath, file)
if err != nil {
log.Fatal(err)
}
relatedFiles = append(relatedFiles, rel)
}
}
}
}
parsed := parse(fileName) parsed := parse(fileName)
offset := parsed.Pos() offset := parsed.Pos()
@@ -207,7 +128,6 @@ func main() {
analyzed := analyze{ analyzed := analyze{
PackageName: parsed.Name.Name, PackageName: parsed.Name.Name,
FuncName: fn.Name.Name, FuncName: fn.Name.Name,
Watch: unique(relatedFiles),
} }
analyzedJSON, _ := json.Marshal(analyzed) analyzedJSON, _ := json.Marshal(analyzed)
fmt.Print(string(analyzedJSON)) fmt.Print(string(analyzedJSON))
@@ -229,7 +149,6 @@ func main() {
analyzed := analyze{ analyzed := analyze{
PackageName: parsed.Name.Name, PackageName: parsed.Name.Name,
FuncName: fn.Name.Name, FuncName: fn.Name.Name,
Watch: unique(relatedFiles),
} }
analyzedJSON, _ := json.Marshal(analyzed) analyzedJSON, _ := json.Marshal(analyzed)
fmt.Print(string(analyzedJSON)) fmt.Print(string(analyzedJSON))

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/hydrogen", "name": "@vercel/hydrogen",
"version": "0.0.18", "version": "0.0.23",
"license": "MIT", "license": "MIT",
"main": "./dist/index.js", "main": "./dist/index.js",
"homepage": "https://vercel.com/docs", "homepage": "https://vercel.com/docs",
@@ -21,7 +21,7 @@
"devDependencies": { "devDependencies": {
"@types/jest": "27.5.1", "@types/jest": "27.5.1",
"@types/node": "*", "@types/node": "*",
"@vercel/build-utils": "5.4.2", "@vercel/build-utils": "5.5.2",
"typescript": "4.6.4" "typescript": "4.6.4"
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/next", "name": "@vercel/next",
"version": "3.1.25", "version": "3.2.0",
"license": "MIT", "license": "MIT",
"main": "./dist/index", "main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js", "homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -44,7 +44,7 @@
"@types/semver": "6.0.0", "@types/semver": "6.0.0",
"@types/text-table": "0.2.1", "@types/text-table": "0.2.1",
"@types/webpack-sources": "3.2.0", "@types/webpack-sources": "3.2.0",
"@vercel/build-utils": "5.4.2", "@vercel/build-utils": "5.5.2",
"@vercel/nft": "0.22.1", "@vercel/nft": "0.22.1",
"@vercel/routing-utils": "2.0.2", "@vercel/routing-utils": "2.0.2",
"async-sema": "3.0.1", "async-sema": "3.0.1",

View File

@@ -1088,10 +1088,15 @@ export const build: BuildV2 = async ({
'pages' 'pages'
); );
let appDir: string | null = null;
const appPathRoutesManifest = await readJSON( const appPathRoutesManifest = await readJSON(
path.join(entryPath, outputDirectory, 'app-path-routes-manifest.json') path.join(entryPath, outputDirectory, 'app-path-routes-manifest.json')
).catch(() => null); ).catch(() => null);
if (appPathRoutesManifest) {
appDir = path.join(pagesDir, '../app');
}
const { pages, appPaths: lambdaAppPaths } = await getServerlessPages({ const { pages, appPaths: lambdaAppPaths } = await getServerlessPages({
pagesDir, pagesDir,
entryPath, entryPath,
@@ -2032,9 +2037,10 @@ export const build: BuildV2 = async ({
console.timeEnd(allLambdasLabel); console.timeEnd(allLambdasLabel);
} }
const prerenderRoute = onPrerenderRoute({ const prerenderRoute = onPrerenderRoute({
appDir,
pagesDir,
hasPages404, hasPages404,
static404Page, static404Page,
pagesDir,
pageLambdaMap, pageLambdaMap,
lambdas, lambdas,
isServerMode, isServerMode,
@@ -2042,6 +2048,7 @@ export const build: BuildV2 = async ({
entryDirectory, entryDirectory,
routesManifest, routesManifest,
prerenderManifest, prerenderManifest,
appPathRoutesManifest,
isSharedLambdas, isSharedLambdas,
canUsePreviewMode, canUsePreviewMode,
}); });

View File

@@ -881,6 +881,7 @@ export async function serverBuild({
} }
const prerenderRoute = onPrerenderRoute({ const prerenderRoute = onPrerenderRoute({
appDir,
pagesDir, pagesDir,
pageLambdaMap: {}, pageLambdaMap: {},
lambdas, lambdas,
@@ -888,6 +889,7 @@ export async function serverBuild({
entryDirectory, entryDirectory,
routesManifest, routesManifest,
prerenderManifest, prerenderManifest,
appPathRoutesManifest,
isServerMode: true, isServerMode: true,
isSharedLambdas: false, isSharedLambdas: false,
canUsePreviewMode, canUsePreviewMode,
@@ -1005,7 +1007,7 @@ export async function serverBuild({
currentRouteSrc.length - 1 currentRouteSrc.length - 1
)}${ )}${
currentRouteSrc[currentRouteSrc.length - 2] === '(' ? '' : '|' currentRouteSrc[currentRouteSrc.length - 2] === '(' ? '' : '|'
}${route})`; }${route}/?)`;
if (isLastRoute) { if (isLastRoute) {
pushRoute(currentRouteSrc); pushRoute(currentRouteSrc);
@@ -1129,6 +1131,23 @@ export async function serverBuild({
}); });
} }
if (appPathRoutesManifest) {
// create .rsc variant for app lambdas and edge functions
// to match prerenders so we can route the same when the
// __flight__ header is present
const edgeFunctions = middleware.edgeFunctions;
for (let route of Object.values(appPathRoutesManifest)) {
route = path.posix.join('./', route === '/' ? '/index' : route);
if (lambdas[route]) {
lambdas[`${route}.rsc`] = lambdas[route];
} else if (edgeFunctions[route]) {
edgeFunctions[`${route}.rsc`] = edgeFunctions[route];
}
}
}
return { return {
wildcard: wildcardConfig, wildcard: wildcardConfig,
images: images:
@@ -1367,6 +1386,22 @@ export async function serverBuild({
// to prevent a local/deploy mismatch // to prevent a local/deploy mismatch
...(!isCorrectMiddlewareOrder ? middleware.staticRoutes : []), ...(!isCorrectMiddlewareOrder ? middleware.staticRoutes : []),
...(appDir
? [
{
src: `^${path.posix.join('/', entryDirectory, '/(.*)$')}`,
has: [
{
type: 'header',
key: '__flight__',
},
],
dest: path.posix.join('/', entryDirectory, '/$1.rsc'),
check: true,
},
]
: []),
// Next.js page lambdas, `static/` folder, reserved assets, and `public/` // Next.js page lambdas, `static/` folder, reserved assets, and `public/`
// folder // folder
{ handle: 'filesystem' }, { handle: 'filesystem' },

View File

@@ -1660,10 +1660,12 @@ export const onPrerenderRouteInitial = (
}; };
type OnPrerenderRouteArgs = { type OnPrerenderRouteArgs = {
appDir: string | null;
pagesDir: string; pagesDir: string;
static404Page?: string; static404Page?: string;
hasPages404: boolean; hasPages404: boolean;
entryDirectory: string; entryDirectory: string;
appPathRoutesManifest?: Record<string, string>;
prerenderManifest: NextPrerenderedRoutes; prerenderManifest: NextPrerenderedRoutes;
isSharedLambdas: boolean; isSharedLambdas: boolean;
isServerMode: boolean; isServerMode: boolean;
@@ -1694,6 +1696,7 @@ export const onPrerenderRoute =
} }
) => { ) => {
const { const {
appDir,
pagesDir, pagesDir,
hasPages404, hasPages404,
static404Page, static404Page,
@@ -1760,44 +1763,6 @@ export const onPrerenderRoute =
const isNotFound = prerenderManifest.notFoundRoutes.includes(routeKey); const isNotFound = prerenderManifest.notFoundRoutes.includes(routeKey);
const htmlFsRef =
isBlocking || (isNotFound && !static404Page)
? // Blocking pages do not have an HTML fallback
null
: new FileFsRef({
fsPath: path.join(
pagesDir,
isFallback
? // Fallback pages have a special file.
addLocaleOrDefault(
prerenderManifest.fallbackRoutes[routeKey].fallback,
routesManifest,
locale
)
: // Otherwise, the route itself should exist as a static HTML
// file.
`${
isOmitted || isNotFound
? addLocaleOrDefault('/404', routesManifest, locale)
: routeFileNoExt
}.html`
),
});
const jsonFsRef =
// JSON data does not exist for fallback or blocking pages
isFallback || isBlocking || (isNotFound && !static404Page)
? null
: new FileFsRef({
fsPath: path.join(
pagesDir,
`${
isOmitted || isNotFound
? addLocaleOrDefault('/404.html', routesManifest, locale)
: routeFileNoExt + '.json'
}`
),
});
let initialRevalidate: false | number; let initialRevalidate: false | number;
let srcRoute: string | null; let srcRoute: string | null;
let dataRoute: string; let dataRoute: string;
@@ -1826,6 +1791,52 @@ export const onPrerenderRoute =
({ initialRevalidate, srcRoute, dataRoute } = pr); ({ initialRevalidate, srcRoute, dataRoute } = pr);
} }
let isAppPathRoute = false;
// TODO: leverage manifest to determine app paths more accurately
if (appDir && srcRoute && dataRoute.endsWith('.rsc')) {
isAppPathRoute = true;
}
const htmlFsRef =
isBlocking || (isNotFound && !static404Page)
? // Blocking pages do not have an HTML fallback
null
: new FileFsRef({
fsPath: path.join(
isAppPathRoute && appDir ? appDir : pagesDir,
isFallback
? // Fallback pages have a special file.
addLocaleOrDefault(
prerenderManifest.fallbackRoutes[routeKey].fallback,
routesManifest,
locale
)
: // Otherwise, the route itself should exist as a static HTML
// file.
`${
isOmitted || isNotFound
? addLocaleOrDefault('/404', routesManifest, locale)
: routeFileNoExt
}.html`
),
});
const jsonFsRef =
// JSON data does not exist for fallback or blocking pages
isFallback || isBlocking || (isNotFound && !static404Page)
? null
: new FileFsRef({
fsPath: path.join(
isAppPathRoute && appDir ? appDir : pagesDir,
`${
isOmitted || isNotFound
? addLocaleOrDefault('/404.html', routesManifest, locale)
: isAppPathRoute
? dataRoute
: routeFileNoExt + '.json'
}`
),
});
const outputPathPage = normalizeIndexOutput( const outputPathPage = normalizeIndexOutput(
path.posix.join(entryDirectory, routeFileNoExt), path.posix.join(entryDirectory, routeFileNoExt),
isServerMode isServerMode
@@ -2191,6 +2202,7 @@ interface BaseEdgeFunctionInfo {
page: string; page: string;
wasm?: { filePath: string; name: string }[]; wasm?: { filePath: string; name: string }[];
assets?: { filePath: string; name: string }[]; assets?: { filePath: string; name: string }[];
regions?: 'auto' | string[] | 'all' | 'default';
} }
interface EdgeFunctionInfoV1 extends BaseEdgeFunctionInfo { interface EdgeFunctionInfoV1 extends BaseEdgeFunctionInfo {
@@ -2218,7 +2230,11 @@ export async function getMiddlewareBundle({
prerenderBypassToken: string; prerenderBypassToken: string;
routesManifest: RoutesManifest; routesManifest: RoutesManifest;
isCorrectMiddlewareOrder: boolean; isCorrectMiddlewareOrder: boolean;
}) { }): Promise<{
staticRoutes: Route[];
dynamicRouteMap: Map<string, RouteWithSrc>;
edgeFunctions: Record<string, EdgeFunction>;
}> {
const middlewareManifest = await getMiddlewareManifest( const middlewareManifest = await getMiddlewareManifest(
entryPath, entryPath,
outputDirectory outputDirectory
@@ -2326,6 +2342,7 @@ export async function getMiddlewareBundle({
...wasmFiles, ...wasmFiles,
...assetFiles, ...assetFiles,
}, },
regions: edgeFunction.regions,
entrypoint: 'index.js', entrypoint: 'index.js',
envVarsInUse: edgeFunction.env, envVarsInUse: edgeFunction.env,
assets: (edgeFunction.assets ?? []).map(({ name }) => { assets: (edgeFunction.assets ?? []).map(({ name }) => {
@@ -2409,7 +2426,6 @@ export async function getMiddlewareBundle({
} }
} }
} }
return source; return source;
} }

View File

@@ -0,0 +1,10 @@
export default function Root({ children }) {
return (
<html className="this-is-another-document-html">
<head>
<title>{`hello world`}</title>
</head>
<body className="this-is-another-document-body">{children}</body>
</html>
);
}

View File

@@ -1,18 +0,0 @@
export async function getServerSideProps() {
return {
props: {
world: 'world',
},
};
}
export default function Root({ children, world }) {
return (
<html className="this-is-another-document-html">
<head>
<title>{`hello ${world}`}</title>
</head>
<body className="this-is-another-document-body">{children}</body>
</html>
);
}

View File

@@ -1,3 +1,5 @@
'client';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import style from './style.module.css'; import style from './style.module.css';

View File

@@ -1,3 +1,5 @@
'client';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import styles from './style.module.css'; import styles from './style.module.css';

View File

@@ -1,15 +1,7 @@
export async function getServerSideProps({ params }) {
return {
props: {
id: params.id,
},
};
}
export default function DeploymentsPage(props) { export default function DeploymentsPage(props) {
return ( return (
<> <>
<p>hello from app/dashboard/deployments/[id]. ID is: {props.id}</p> <p>hello from app/dashboard/deployments/[id]. ID is: {props.params.id}</p>
</> </>
); );
} }

Some files were not shown because too many files have changed in this diff Show More