mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-11 12:57:46 +00:00
Compare commits
46 Commits
@vercel/py
...
@vercel/no
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a7fa1526c | ||
|
|
64b15d2409 | ||
|
|
40f73e7978 | ||
|
|
4c9ca27195 | ||
|
|
a847ef43fd | ||
|
|
3b466232a9 | ||
|
|
efdeea9db2 | ||
|
|
ab9915af32 | ||
|
|
d6dc27638c | ||
|
|
0fb0601d19 | ||
|
|
ce25dec97d | ||
|
|
20bd71ce70 | ||
|
|
4c77dab5cb | ||
|
|
151b0dfb63 | ||
|
|
42e9bbea5b | ||
|
|
c0471302e9 | ||
|
|
b2c68f1301 | ||
|
|
9712640fe3 | ||
|
|
0dd3711f63 | ||
|
|
4b657debed | ||
|
|
ffdca76155 | ||
|
|
af7b34aa45 | ||
|
|
e210977a9c | ||
|
|
1c2ef37173 | ||
|
|
65bbcd3e62 | ||
|
|
5caf73380d | ||
|
|
395929b36a | ||
|
|
0e235a926a | ||
|
|
f1bdc0bfd1 | ||
|
|
59ca86365c | ||
|
|
13d54b2095 | ||
|
|
bada86b8d6 | ||
|
|
7ec377757d | ||
|
|
8040c8806b | ||
|
|
2b1c8d89d4 | ||
|
|
c5e9ccfacf | ||
|
|
66fe3db888 | ||
|
|
765ec05cea | ||
|
|
413706d72a | ||
|
|
9bc8817f92 | ||
|
|
9da41dcafa | ||
|
|
f1ab5704f1 | ||
|
|
d8cf3e8831 | ||
|
|
c06209901c | ||
|
|
f20756344e | ||
|
|
21a440b832 |
10
.github/DISCUSSION_TEMPLATE/general.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/general.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Description
|
||||
validations:
|
||||
required: true
|
||||
10
.github/DISCUSSION_TEMPLATE/help.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/help.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions/categories/help)
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Problem Description
|
||||
validations:
|
||||
required: true
|
||||
10
.github/DISCUSSION_TEMPLATE/ideas.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/ideas.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions/categories/ideas)
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Idea
|
||||
validations:
|
||||
required: true
|
||||
10
.github/DISCUSSION_TEMPLATE/polls.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/polls.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Description
|
||||
validations:
|
||||
required: true
|
||||
10
.github/DISCUSSION_TEMPLATE/show-and-tell.yml
vendored
Normal file
10
.github/DISCUSSION_TEMPLATE/show-and-tell.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> **Note**: For discussions not related to Vercel CLI or Runtimes, please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Description
|
||||
validations:
|
||||
required: true
|
||||
5
.github/DISCUSSION_TEMPLATE/temporary.yml
vendored
Normal file
5
.github/DISCUSSION_TEMPLATE/temporary.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> **Note**: This category should not be used for new discussions. Please visit the [Vercel Community](https://github.com/orgs/vercel/discussions)
|
||||
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -4,8 +4,8 @@ contact_links:
|
||||
url: https://vercel.com/support/request
|
||||
about: Report a bug using the Vercel support form
|
||||
- name: Feature Request
|
||||
url: https://github.com/vercel/vercel/discussions/new?category=ideas
|
||||
url: https://github.com/orgs/vercel/discussions/new?category=ideas
|
||||
about: Share ideas for new features
|
||||
- name: Ask a Question
|
||||
url: https://github.com/vercel/vercel/discussions/new?category=help
|
||||
url: https://github.com/orgs/vercel/discussions/new?category=help
|
||||
about: Ask the community for help
|
||||
|
||||
4
.github/workflows/label-feature-request.yml
vendored
4
.github/workflows/label-feature-request.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
body: |
|
||||
Thank you for taking the time to created this request!
|
||||
|
||||
|
||||
We added it to our backlog but need to discuss design/architecture before we can accept a PR.
|
||||
|
||||
|
||||
Please let us know if you would be interested in sending a PR once we approve the design.
|
||||
|
||||
6
.github/workflows/label-support.yml
vendored
6
.github/workflows/label-support.yml
vendored
@@ -16,9 +16,9 @@ jobs:
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
comment: |
|
||||
Thank you so much for filing this issue.
|
||||
|
||||
|
||||
We do try to keep issues in this repository focused on the vercel command line and related code.
|
||||
|
||||
|
||||
At this point we think that this issue is best handled by our friendly Vercel support team. They can be found by contacting them at: https://vercel.com/help#issues
|
||||
|
||||
|
||||
If you think closing of this is a mistake, then please re-open this issue and we'll take another look :bow:
|
||||
|
||||
6
.github/workflows/label-triaged.yml
vendored
6
.github/workflows/label-triaged.yml
vendored
@@ -16,9 +16,9 @@ jobs:
|
||||
issue-number: ${{ github.event.issue.number }}
|
||||
body: |
|
||||
Thank you for taking the time to file this issue!
|
||||
|
||||
|
||||
We have confirmed this is a bug and added it to our backlog.
|
||||
|
||||
|
||||
We don't have a timeline for when this issue will be fixed, but we will accept a Pull Request with a fix and a test.
|
||||
|
||||
|
||||
See the [contributing guidelines](https://github.com/vercel/vercel/blob/main/.github/CONTRIBUTING.md) for more info.
|
||||
|
||||
97
.github/workflows/publish.yml
vendored
97
.github/workflows/publish.yml
vendored
@@ -3,9 +3,9 @@ name: Publish
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- main
|
||||
tags:
|
||||
- '!*'
|
||||
- '!*'
|
||||
|
||||
env:
|
||||
TURBO_REMOTE_ONLY: 'true'
|
||||
@@ -17,50 +17,51 @@ jobs:
|
||||
name: Publish
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
id-token: write
|
||||
contents: write
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Check Release
|
||||
id: check-release
|
||||
run: |
|
||||
tag="$(git describe --tags --exact-match 2> /dev/null || :)"
|
||||
if [[ -z "$tag" ]];
|
||||
then
|
||||
echo "IS_RELEASE=false" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "IS_RELEASE=true" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
- name: Setup Go
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: '1.13.15'
|
||||
- name: Setup Node
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
- name: install npm@9
|
||||
run: npm i -g npm@9
|
||||
- name: install pnpm@7.24.2
|
||||
run: npm i -g pnpm@7.24.2
|
||||
- name: Install
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
run: pnpm install
|
||||
- name: Build
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
run: pnpm build
|
||||
env:
|
||||
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||
- name: Publish
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
run: pnpm publish-from-github
|
||||
env:
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }}
|
||||
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Check Release
|
||||
id: check-release
|
||||
run: |
|
||||
tag="$(git describe --tags --exact-match 2> /dev/null || :)"
|
||||
if [[ -z "$tag" ]];
|
||||
then
|
||||
echo "IS_RELEASE=false" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "IS_RELEASE=true" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
- name: Setup Go
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: '1.13.15'
|
||||
- name: Setup Node
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
- name: install npm@9
|
||||
run: npm i -g npm@9
|
||||
- name: install pnpm@7.24.2
|
||||
run: npm i -g pnpm@7.24.2
|
||||
- name: Install
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
run: pnpm install
|
||||
- name: Build
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
run: pnpm build
|
||||
env:
|
||||
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||
- name: Publish
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
run: pnpm publish-from-github
|
||||
env:
|
||||
NPM_CONFIG_PROVENANCE: 'true'
|
||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }}
|
||||
GA_TRACKING_ID: ${{ secrets.GA_TRACKING_ID }}
|
||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||
|
||||
7
.github/workflows/test-integration-cli.yml
vendored
7
.github/workflows/test-integration-cli.yml
vendored
@@ -3,9 +3,9 @@ name: CLI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- main
|
||||
tags:
|
||||
- '!*'
|
||||
- '!*'
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
@@ -31,9 +31,6 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: '1.18'
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
|
||||
35
.github/workflows/test-lint.yml
vendored
Normal file
35
.github/workflows/test-lint.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
name: Lint
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
tags:
|
||||
- '!*'
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
TURBO_REMOTE_ONLY: 'true'
|
||||
TURBO_TEAM: 'vercel'
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
NODE_VERSION: '16'
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Lint
|
||||
timeout-minutes: 10
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
- name: install pnpm@7.24.2
|
||||
run: npm i -g pnpm@7.24.2
|
||||
- run: pnpm install
|
||||
- run: pnpm run lint
|
||||
- run: pnpm run prettier-check
|
||||
50
.github/workflows/test-unit.yml
vendored
50
.github/workflows/test-unit.yml
vendored
@@ -1,50 +0,0 @@
|
||||
name: Unit
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
tags:
|
||||
- '!*'
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
TURBO_REMOTE_ONLY: 'true'
|
||||
TURBO_TEAM: 'vercel'
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Unit
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
node: [16]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: '1.13.15'
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
- name: install pnpm@7.24.2
|
||||
run: npm i -g pnpm@7.24.2
|
||||
- run: pnpm install
|
||||
- run: pnpm run build
|
||||
- run: pnpm run lint
|
||||
if: matrix.os == 'ubuntu-latest' && matrix.node == 14 # only run lint once
|
||||
- run: pnpm run test-unit
|
||||
- run: pnpm -C packages/cli run coverage
|
||||
if: matrix.os == 'ubuntu-latest' && matrix.node == 14 # only run coverage once
|
||||
env:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
10
.github/workflows/test.yml
vendored
10
.github/workflows/test.yml
vendored
@@ -3,9 +3,9 @@ name: Tests
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- main
|
||||
tags:
|
||||
- '!*'
|
||||
- '!*'
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
@@ -29,9 +29,6 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: '1.13.15'
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
@@ -66,9 +63,6 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: '1.13.15'
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
2
.github/workflows/update-remix-run-dev.yml
vendored
2
.github/workflows/update-remix-run-dev.yml
vendored
@@ -5,7 +5,7 @@ on:
|
||||
inputs:
|
||||
new-version:
|
||||
type: string
|
||||
description: "Optional version to update @remix-run/dev to inside of @vercel/remix"
|
||||
description: 'Optional version to update @remix-run/dev to inside of @vercel/remix-builder'
|
||||
|
||||
jobs:
|
||||
update-remix-run-dev:
|
||||
|
||||
@@ -7,3 +7,28 @@ examples/sveltekit-1
|
||||
|
||||
# gatsby-plugin-vercel-analytics
|
||||
packages/gatsby-plugin-vercel-analytics
|
||||
|
||||
# ignore directories that are not source code
|
||||
node_modules
|
||||
dist
|
||||
pnpm-lock.yaml
|
||||
.vscode
|
||||
.DS_Store
|
||||
.next
|
||||
.vercel
|
||||
.turbo
|
||||
.eslintcache
|
||||
.output
|
||||
.vercel_build_output
|
||||
.vercel
|
||||
coverage
|
||||
turbo-cache-key.json
|
||||
/examples
|
||||
/public
|
||||
packages/*/dist
|
||||
packages/*/node_modules
|
||||
packages/**/test/fixtures
|
||||
packages/**/test/dev/fixtures
|
||||
packages/**/test/build-fixtures
|
||||
packages/**/test/cache-fixtures
|
||||
|
||||
|
||||
@@ -79,18 +79,23 @@ project. An example use-case is that `@vercel/node` uses this function to cache
|
||||
the `node_modules` directory, making it faster to install npm dependencies for
|
||||
future builds.
|
||||
|
||||
> Note: Only files within the repo root directory can be cached.
|
||||
|
||||
**Example:**
|
||||
|
||||
```typescript
|
||||
import { PrepareCacheOptions } from '@vercel/build-utils';
|
||||
import { relative } from 'path';
|
||||
import { glob, PrepareCache } from '@vercel/build-utils';
|
||||
|
||||
export async function prepareCache(options: PrepareCacheOptions) {
|
||||
export const prepareCache: PrepareCache = async ({
|
||||
workPath,
|
||||
repoRootPath,
|
||||
}) => {
|
||||
// Create a mapping of file names and `File` object instances to cache here…
|
||||
|
||||
return {
|
||||
'path-to-file': File,
|
||||
};
|
||||
}
|
||||
const rootDirectory = relative(repoRootPath, workPath);
|
||||
const cache = await glob(`${rootDirectory}/some/dir/**`, repoRootPath);
|
||||
return cache;
|
||||
};
|
||||
```
|
||||
|
||||
### `shouldServe()`
|
||||
|
||||
@@ -51,8 +51,11 @@ export async function getGitHubRepoInfo(repo: Repo) {
|
||||
data.subdir = repo.path.slice(subdirPath.length).split('/');
|
||||
}
|
||||
|
||||
if (data.id === 'vercel/vercel' && data.subdir && data.subdir[0] === 'examples') {
|
||||
|
||||
if (
|
||||
data.id === 'vercel/vercel' &&
|
||||
data.subdir &&
|
||||
data.subdir[0] === 'examples'
|
||||
) {
|
||||
// from our examples, add `homepage` and `description` fields
|
||||
const example = data.subdir[1];
|
||||
const exampleList = await getExampleList();
|
||||
|
||||
@@ -33,7 +33,12 @@ async function main() {
|
||||
});
|
||||
|
||||
const existingExamples = exampleDirs
|
||||
.filter(dir => dir.isDirectory())
|
||||
.filter(
|
||||
dir =>
|
||||
dir.isDirectory() &&
|
||||
dir.name !== 'node_modules' &&
|
||||
dir.name !== '__tests__'
|
||||
)
|
||||
.map(dir => ({
|
||||
name: dir.name,
|
||||
visible: true,
|
||||
|
||||
10
codecov.yml
10
codecov.yml
@@ -1,10 +0,0 @@
|
||||
codecov:
|
||||
require_ci_to_pass: yes
|
||||
|
||||
coverage:
|
||||
status:
|
||||
project: off
|
||||
patch: off
|
||||
|
||||
fixes:
|
||||
- "::packages/cli/" # move root e.g., "path/" => "after/path/"
|
||||
@@ -38,9 +38,9 @@ All commands are run from the root of the project, from a terminal:
|
||||
|
||||
| Command | Action |
|
||||
| :--------------------- | :------------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:3000` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
|
||||
| `npm run astro --help` | Get help using the Astro CLI |
|
||||
| `pnpm install` | Installs dependencies |
|
||||
| `pnpm run dev` | Starts local dev server at `localhost:3000` |
|
||||
| `pnpm run build` | Build your production site to `./dist/` |
|
||||
| `pnpm run preview` | Preview your build locally, before deploying |
|
||||
| `pnpm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
|
||||
| `pnpm run astro --help` | Get help using the Astro CLI |
|
||||
|
||||
202
examples/nextjs/package-lock.json
generated
202
examples/nextjs/package-lock.json
generated
@@ -9,8 +9,8 @@
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"eslint": "8.35.0",
|
||||
"eslint-config-next": "13.2.3",
|
||||
"next": "13.2.3",
|
||||
"eslint-config-next": "13.2.4",
|
||||
"next": "13.2.4",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0"
|
||||
}
|
||||
@@ -87,22 +87,22 @@
|
||||
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
|
||||
},
|
||||
"node_modules/@next/env": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.3.tgz",
|
||||
"integrity": "sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow=="
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz",
|
||||
"integrity": "sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA=="
|
||||
},
|
||||
"node_modules/@next/eslint-plugin-next": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.3.tgz",
|
||||
"integrity": "sha512-QmMPItnU7VeojI1KnuwL9SLFWEwmaNHNlnOGpoTwdLoSiP9sc8KYiAHWEc4/44L+cAdCxcZYvn7frcRNP5l84Q==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz",
|
||||
"integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==",
|
||||
"dependencies": {
|
||||
"glob": "7.1.7"
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-android-arm-eabi": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.3.tgz",
|
||||
"integrity": "sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz",
|
||||
"integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -115,9 +115,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-android-arm64": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.3.tgz",
|
||||
"integrity": "sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz",
|
||||
"integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -130,9 +130,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-darwin-arm64": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.3.tgz",
|
||||
"integrity": "sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz",
|
||||
"integrity": "sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -145,9 +145,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-darwin-x64": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.3.tgz",
|
||||
"integrity": "sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz",
|
||||
"integrity": "sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -160,9 +160,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-freebsd-x64": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.3.tgz",
|
||||
"integrity": "sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz",
|
||||
"integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -175,9 +175,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm-gnueabihf": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.3.tgz",
|
||||
"integrity": "sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz",
|
||||
"integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -190,9 +190,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-gnu": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.3.tgz",
|
||||
"integrity": "sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz",
|
||||
"integrity": "sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -205,9 +205,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-musl": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.3.tgz",
|
||||
"integrity": "sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz",
|
||||
"integrity": "sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -220,9 +220,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-gnu": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.3.tgz",
|
||||
"integrity": "sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz",
|
||||
"integrity": "sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -235,9 +235,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-musl": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.3.tgz",
|
||||
"integrity": "sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz",
|
||||
"integrity": "sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -250,9 +250,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-arm64-msvc": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.3.tgz",
|
||||
"integrity": "sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz",
|
||||
"integrity": "sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -265,9 +265,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-ia32-msvc": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.3.tgz",
|
||||
"integrity": "sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz",
|
||||
"integrity": "sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -280,9 +280,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-x64-msvc": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.3.tgz",
|
||||
"integrity": "sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz",
|
||||
"integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -364,13 +364,13 @@
|
||||
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
|
||||
},
|
||||
"node_modules/@typescript-eslint/parser": {
|
||||
"version": "5.54.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz",
|
||||
"integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==",
|
||||
"version": "5.54.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz",
|
||||
"integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "5.54.0",
|
||||
"@typescript-eslint/types": "5.54.0",
|
||||
"@typescript-eslint/typescript-estree": "5.54.0",
|
||||
"@typescript-eslint/scope-manager": "5.54.1",
|
||||
"@typescript-eslint/types": "5.54.1",
|
||||
"@typescript-eslint/typescript-estree": "5.54.1",
|
||||
"debug": "^4.3.4"
|
||||
},
|
||||
"engines": {
|
||||
@@ -390,12 +390,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/scope-manager": {
|
||||
"version": "5.54.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz",
|
||||
"integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==",
|
||||
"version": "5.54.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz",
|
||||
"integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.54.0",
|
||||
"@typescript-eslint/visitor-keys": "5.54.0"
|
||||
"@typescript-eslint/types": "5.54.1",
|
||||
"@typescript-eslint/visitor-keys": "5.54.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
@@ -406,9 +406,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/types": {
|
||||
"version": "5.54.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz",
|
||||
"integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==",
|
||||
"version": "5.54.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz",
|
||||
"integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==",
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
},
|
||||
@@ -418,12 +418,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/typescript-estree": {
|
||||
"version": "5.54.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz",
|
||||
"integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==",
|
||||
"version": "5.54.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz",
|
||||
"integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.54.0",
|
||||
"@typescript-eslint/visitor-keys": "5.54.0",
|
||||
"@typescript-eslint/types": "5.54.1",
|
||||
"@typescript-eslint/visitor-keys": "5.54.1",
|
||||
"debug": "^4.3.4",
|
||||
"globby": "^11.1.0",
|
||||
"is-glob": "^4.0.3",
|
||||
@@ -444,11 +444,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/visitor-keys": {
|
||||
"version": "5.54.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz",
|
||||
"integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==",
|
||||
"version": "5.54.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz",
|
||||
"integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.54.0",
|
||||
"@typescript-eslint/types": "5.54.1",
|
||||
"eslint-visitor-keys": "^3.3.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -678,9 +678,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001458",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz",
|
||||
"integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==",
|
||||
"version": "1.0.30001464",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz",
|
||||
"integrity": "sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -1031,11 +1031,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-config-next": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.3.tgz",
|
||||
"integrity": "sha512-kPulHiQEHGei9hIaaNGygHRc0UzlWM+3euOmYbxNkd2Nbhci5rrCDeMBMPSV8xgUssphDGmwDHWbk4VZz3rlZQ==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz",
|
||||
"integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==",
|
||||
"dependencies": {
|
||||
"@next/eslint-plugin-next": "13.2.3",
|
||||
"@next/eslint-plugin-next": "13.2.4",
|
||||
"@rushstack/eslint-patch": "^1.1.3",
|
||||
"@typescript-eslint/parser": "^5.42.0",
|
||||
"eslint-import-resolver-node": "^0.3.6",
|
||||
@@ -1378,9 +1378,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/esquery": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
|
||||
"integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
|
||||
"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
|
||||
"dependencies": {
|
||||
"estraverse": "^5.1.0"
|
||||
},
|
||||
@@ -1853,12 +1853,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/is-array-buffer": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
|
||||
"integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
|
||||
"integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
"get-intrinsic": "^1.1.3",
|
||||
"get-intrinsic": "^1.2.0",
|
||||
"is-typed-array": "^1.1.10"
|
||||
},
|
||||
"funding": {
|
||||
@@ -2326,11 +2326,11 @@
|
||||
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
|
||||
},
|
||||
"node_modules/next": {
|
||||
"version": "13.2.3",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-13.2.3.tgz",
|
||||
"integrity": "sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==",
|
||||
"version": "13.2.4",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-13.2.4.tgz",
|
||||
"integrity": "sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==",
|
||||
"dependencies": {
|
||||
"@next/env": "13.2.3",
|
||||
"@next/env": "13.2.4",
|
||||
"@swc/helpers": "0.4.14",
|
||||
"caniuse-lite": "^1.0.30001406",
|
||||
"postcss": "8.4.14",
|
||||
@@ -2343,19 +2343,19 @@
|
||||
"node": ">=14.6.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@next/swc-android-arm-eabi": "13.2.3",
|
||||
"@next/swc-android-arm64": "13.2.3",
|
||||
"@next/swc-darwin-arm64": "13.2.3",
|
||||
"@next/swc-darwin-x64": "13.2.3",
|
||||
"@next/swc-freebsd-x64": "13.2.3",
|
||||
"@next/swc-linux-arm-gnueabihf": "13.2.3",
|
||||
"@next/swc-linux-arm64-gnu": "13.2.3",
|
||||
"@next/swc-linux-arm64-musl": "13.2.3",
|
||||
"@next/swc-linux-x64-gnu": "13.2.3",
|
||||
"@next/swc-linux-x64-musl": "13.2.3",
|
||||
"@next/swc-win32-arm64-msvc": "13.2.3",
|
||||
"@next/swc-win32-ia32-msvc": "13.2.3",
|
||||
"@next/swc-win32-x64-msvc": "13.2.3"
|
||||
"@next/swc-android-arm-eabi": "13.2.4",
|
||||
"@next/swc-android-arm64": "13.2.4",
|
||||
"@next/swc-darwin-arm64": "13.2.4",
|
||||
"@next/swc-darwin-x64": "13.2.4",
|
||||
"@next/swc-freebsd-x64": "13.2.4",
|
||||
"@next/swc-linux-arm-gnueabihf": "13.2.4",
|
||||
"@next/swc-linux-arm64-gnu": "13.2.4",
|
||||
"@next/swc-linux-arm64-musl": "13.2.4",
|
||||
"@next/swc-linux-x64-gnu": "13.2.4",
|
||||
"@next/swc-linux-x64-musl": "13.2.4",
|
||||
"@next/swc-win32-arm64-msvc": "13.2.4",
|
||||
"@next/swc-win32-ia32-msvc": "13.2.4",
|
||||
"@next/swc-win32-x64-msvc": "13.2.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@opentelemetry/api": "^1.4.0",
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"eslint": "8.35.0",
|
||||
"eslint-config-next": "13.2.3",
|
||||
"next": "13.2.3",
|
||||
"eslint-config-next": "13.2.4",
|
||||
"next": "13.2.4",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0"
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
import handleRequest from "@vercel/remix-entry-server";
|
||||
import { RemixServer } from "@remix-run/react";
|
||||
import type { EntryContext } from "@remix-run/server-runtime";
|
||||
|
||||
export default function (
|
||||
request: Request,
|
||||
responseStatusCode: number,
|
||||
responseHeaders: Headers,
|
||||
remixContext: EntryContext
|
||||
) {
|
||||
const remixServer = <RemixServer context={remixContext} url={request.url} />;
|
||||
return handleRequest(
|
||||
request,
|
||||
responseStatusCode,
|
||||
responseHeaders,
|
||||
remixServer
|
||||
);
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { MetaFunction } from "@remix-run/node";
|
||||
import type { MetaFunction } from "@vercel/remix";
|
||||
import {
|
||||
Links,
|
||||
LiveReload,
|
||||
|
||||
@@ -6,18 +6,17 @@
|
||||
"dev": "remix dev"
|
||||
},
|
||||
"dependencies": {
|
||||
"@remix-run/node": "^1.13.0",
|
||||
"@remix-run/react": "^1.13.0",
|
||||
"@remix-run/serve": "^1.13.0",
|
||||
"@remix-run/server-runtime": "^1.13.0",
|
||||
"@vercel/analytics": "^0.1.10",
|
||||
"@vercel/remix-entry-server": "^0.1.0",
|
||||
"@remix-run/node": "^1.14.3",
|
||||
"@remix-run/react": "^1.14.3",
|
||||
"@remix-run/serve": "^1.14.3",
|
||||
"@vercel/analytics": "^0.1.11",
|
||||
"@vercel/remix": "1.14.3-patch.1",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@remix-run/dev": "^1.13.0",
|
||||
"@remix-run/eslint-config": "^1.13.0",
|
||||
"@remix-run/dev": "^1.14.3",
|
||||
"@remix-run/eslint-config": "^1.14.3",
|
||||
"@types/react": "^18.0.25",
|
||||
"@types/react-dom": "^18.0.11",
|
||||
"eslint": "^8.28.0",
|
||||
|
||||
164
examples/remix/pnpm-lock.yaml
generated
164
examples/remix/pnpm-lock.yaml
generated
@@ -4,32 +4,30 @@ importers:
|
||||
|
||||
.:
|
||||
specifiers:
|
||||
'@remix-run/dev': ^1.13.0
|
||||
'@remix-run/eslint-config': ^1.13.0
|
||||
'@remix-run/node': ^1.13.0
|
||||
'@remix-run/react': ^1.13.0
|
||||
'@remix-run/serve': ^1.13.0
|
||||
'@remix-run/server-runtime': ^1.13.0
|
||||
'@remix-run/dev': ^1.14.3
|
||||
'@remix-run/eslint-config': ^1.14.3
|
||||
'@remix-run/node': ^1.14.3
|
||||
'@remix-run/react': ^1.14.3
|
||||
'@remix-run/serve': ^1.14.3
|
||||
'@types/react': ^18.0.25
|
||||
'@types/react-dom': ^18.0.11
|
||||
'@vercel/analytics': ^0.1.10
|
||||
'@vercel/remix-entry-server': ^0.1.0
|
||||
'@vercel/analytics': ^0.1.11
|
||||
'@vercel/remix': 1.14.3-patch.1
|
||||
eslint: ^8.28.0
|
||||
react: ^18.2.0
|
||||
react-dom: ^18.2.0
|
||||
typescript: ^4.9.3
|
||||
dependencies:
|
||||
'@remix-run/node': 1.13.0
|
||||
'@remix-run/react': 1.13.0_biqbaboplfbrettd7655fr4n2y
|
||||
'@remix-run/serve': 1.13.0
|
||||
'@remix-run/server-runtime': 1.13.0
|
||||
'@vercel/analytics': 0.1.10_react@18.2.0
|
||||
'@vercel/remix-entry-server': 0.1.0_react@18.2.0
|
||||
'@remix-run/node': 1.14.3
|
||||
'@remix-run/react': 1.14.3_biqbaboplfbrettd7655fr4n2y
|
||||
'@remix-run/serve': 1.14.3
|
||||
'@vercel/analytics': 0.1.11_react@18.2.0
|
||||
'@vercel/remix': 1.14.3-patch.1_biqbaboplfbrettd7655fr4n2y
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0_react@18.2.0
|
||||
devDependencies:
|
||||
'@remix-run/dev': 1.13.0_@remix-run+serve@1.13.0
|
||||
'@remix-run/eslint-config': 1.13.0_km5ddj7uwb23cqeymeyvzjsfb4
|
||||
'@remix-run/dev': 1.14.3_@remix-run+serve@1.14.3
|
||||
'@remix-run/eslint-config': 1.14.3_km5ddj7uwb23cqeymeyvzjsfb4
|
||||
'@types/react': 18.0.28
|
||||
'@types/react-dom': 18.0.11
|
||||
eslint: 8.34.0
|
||||
@@ -1665,12 +1663,12 @@ packages:
|
||||
tslib: 2.5.0
|
||||
dev: true
|
||||
|
||||
/@remix-run/dev/1.13.0_@remix-run+serve@1.13.0:
|
||||
resolution: {integrity: sha512-hPqUjM9RRcz3inBOWqP3GKhggVz0a0ikWaRZpdKrhpQNCNiF6Hunbx876mJERj2YrmIzJ05eoeQmmdF6xcr4qg==}
|
||||
/@remix-run/dev/1.14.3_@remix-run+serve@1.14.3:
|
||||
resolution: {integrity: sha512-46mmwiA/k9YDkg0UrP90UB3azVVWRXw16NLHRSbZiaaYe8XgUkddEtBnH/nBp/IrVCtzUL3LObplUe5sFk5Z9Q==}
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
'@remix-run/serve': ^1.13.0
|
||||
'@remix-run/serve': ^1.14.3
|
||||
peerDependenciesMeta:
|
||||
'@remix-run/serve':
|
||||
optional: true
|
||||
@@ -1686,8 +1684,8 @@ packages:
|
||||
'@babel/types': 7.20.7
|
||||
'@esbuild-plugins/node-modules-polyfill': 0.1.4_esbuild@0.16.3
|
||||
'@npmcli/package-json': 2.0.0
|
||||
'@remix-run/serve': 1.13.0
|
||||
'@remix-run/server-runtime': 1.13.0
|
||||
'@remix-run/serve': 1.14.3
|
||||
'@remix-run/server-runtime': 1.14.3
|
||||
'@vanilla-extract/integration': 6.1.0
|
||||
arg: 5.0.2
|
||||
cacache: 15.3.0
|
||||
@@ -1718,6 +1716,7 @@ packages:
|
||||
prettier: 2.7.1
|
||||
pretty-ms: 7.0.1
|
||||
proxy-agent: 5.0.0
|
||||
react-refresh: 0.14.0
|
||||
recast: 0.21.5
|
||||
remark-frontmatter: 4.0.1
|
||||
remark-mdx-frontmatter: 1.1.1
|
||||
@@ -1736,8 +1735,8 @@ packages:
|
||||
- utf-8-validate
|
||||
dev: true
|
||||
|
||||
/@remix-run/eslint-config/1.13.0_km5ddj7uwb23cqeymeyvzjsfb4:
|
||||
resolution: {integrity: sha512-qz/N99D/q1mQefZl2X+p11xVk03r6aFDMvk/4mG+8IrMRU4BqMJ/bF53/CUOveSzvzLua4Pfi2wmqF+deHw0GQ==}
|
||||
/@remix-run/eslint-config/1.14.3_km5ddj7uwb23cqeymeyvzjsfb4:
|
||||
resolution: {integrity: sha512-Yy4PYSvAehj31LmkDA+lS5yCPL1lR9O04gMIo0xwHT2o59pF4QU54lEAvJJH+9MI0byZUI/v9DoGz1oGIb44IA==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
peerDependencies:
|
||||
eslint: ^8.0.0
|
||||
@@ -1772,35 +1771,20 @@ packages:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/@remix-run/express/1.13.0_express@4.18.2:
|
||||
resolution: {integrity: sha512-MX80PdQu3k1HlQsHlUjPBZe5rpTdn4FqZ5Fg4d85cVi+GMfu3x8n8hB0xbCDLhmRbKTR01PQ01j3UUNtsWWikg==}
|
||||
/@remix-run/express/1.14.3_express@4.18.2:
|
||||
resolution: {integrity: sha512-v3TT+zBFSnOiVTHNiLp5A783UVYyZYbePxmPhvoe9JwHCmzVDA9mfyxYgDl/8NPDtYS+dAPU7mQ+aE1M5MXc7g==}
|
||||
engines: {node: '>=14'}
|
||||
peerDependencies:
|
||||
express: ^4.17.1
|
||||
dependencies:
|
||||
'@remix-run/node': 1.13.0
|
||||
'@remix-run/node': 1.14.3
|
||||
express: 4.18.2
|
||||
|
||||
/@remix-run/node/1.12.0:
|
||||
resolution: {integrity: sha512-WiyRTEQKTUTf3Z3ke5DOwx+fjCkeD8ilI9kbRws1bG3xfdugaDrV9ra76DOZcrYlmVwjwtKE3mVDSRFtiYTTMw==}
|
||||
/@remix-run/node/1.14.3:
|
||||
resolution: {integrity: sha512-Mq0wUtgJtGwMQEBr/8p9XpdPBm7N+lby5CEbW6IKV59UC9N3VMGY3snfrsphBCq3sNZfbhIpaDdu2W+8EoqfnQ==}
|
||||
engines: {node: '>=14'}
|
||||
dependencies:
|
||||
'@remix-run/server-runtime': 1.12.0
|
||||
'@remix-run/web-fetch': 4.3.2
|
||||
'@remix-run/web-file': 3.0.2
|
||||
'@remix-run/web-stream': 1.0.3
|
||||
'@web3-storage/multipart-parser': 1.0.0
|
||||
abort-controller: 3.0.0
|
||||
cookie-signature: 1.2.0
|
||||
source-map-support: 0.5.21
|
||||
stream-slice: 0.1.2
|
||||
dev: false
|
||||
|
||||
/@remix-run/node/1.13.0:
|
||||
resolution: {integrity: sha512-FDvPGaoDyon8UGYQ9DroLtiX8vFa0efBQQSHV3az0s7HbUpugw7BcA6NBW5pIs2z5sszCCeRbAgSIXcETLzfhw==}
|
||||
engines: {node: '>=14'}
|
||||
dependencies:
|
||||
'@remix-run/server-runtime': 1.13.0
|
||||
'@remix-run/server-runtime': 1.14.3
|
||||
'@remix-run/web-fetch': 4.3.2
|
||||
'@remix-run/web-file': 3.0.2
|
||||
'@remix-run/web-stream': 1.0.3
|
||||
@@ -1810,59 +1794,41 @@ packages:
|
||||
source-map-support: 0.5.21
|
||||
stream-slice: 0.1.2
|
||||
|
||||
/@remix-run/react/1.13.0_biqbaboplfbrettd7655fr4n2y:
|
||||
resolution: {integrity: sha512-LT9TStmMavBlLqRG8u5Ku8bxdYcpIbqpmh44/f2Fyw8RvdaRCYYMkuUXsr8bhOqftaEZMFLqFhi19NWY/18DLA==}
|
||||
/@remix-run/react/1.14.3_biqbaboplfbrettd7655fr4n2y:
|
||||
resolution: {integrity: sha512-dvwIx+9ZdE/9LHe8Rjos9gEOdQFLvC0dojCnKlsUIwfGhyjKE4wOHfqS9mZcmKFCvOFDakcZDallLNGaj0mEYg==}
|
||||
engines: {node: '>=14'}
|
||||
peerDependencies:
|
||||
react: '>=16.8'
|
||||
react-dom: '>=16.8'
|
||||
dependencies:
|
||||
'@remix-run/router': 1.3.2
|
||||
'@remix-run/router': 1.3.3
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0_react@18.2.0
|
||||
react-router-dom: 6.8.1_biqbaboplfbrettd7655fr4n2y
|
||||
react-router-dom: 6.8.2_biqbaboplfbrettd7655fr4n2y
|
||||
use-sync-external-store: 1.2.0_react@18.2.0
|
||||
dev: false
|
||||
|
||||
/@remix-run/router/1.3.1:
|
||||
resolution: {integrity: sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw==}
|
||||
engines: {node: '>=14'}
|
||||
dev: false
|
||||
|
||||
/@remix-run/router/1.3.2:
|
||||
resolution: {integrity: sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==}
|
||||
/@remix-run/router/1.3.3:
|
||||
resolution: {integrity: sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
/@remix-run/serve/1.13.0:
|
||||
resolution: {integrity: sha512-ondApr1ZUbQR6iy1iGvdarBGqvTZdET4wSNFb2+2NrbxW9Y9E3RZ7q+5M5/iiuy1qbdqubqsoq2N7uFk+gDGxw==}
|
||||
/@remix-run/serve/1.14.3:
|
||||
resolution: {integrity: sha512-5So5+PtAaYZq3hc45snkCKIOh51Z45WvhHpRgB0ZsOuhUf6p9UAY9LQk7GRNvkcqL9LChE3LQ9O4gPqnUiZgpA==}
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
'@remix-run/express': 1.13.0_express@4.18.2
|
||||
'@remix-run/express': 1.14.3_express@4.18.2
|
||||
compression: 1.7.4
|
||||
express: 4.18.2
|
||||
morgan: 1.10.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
/@remix-run/server-runtime/1.12.0:
|
||||
resolution: {integrity: sha512-7I0165Ns/ffPfCEfuiqD58lMderTn2s/sew1xJ34ONa21mG/7+5T7diHIgxKST8rS3816JPmlwSqUaHgwbmO6Q==}
|
||||
/@remix-run/server-runtime/1.14.3:
|
||||
resolution: {integrity: sha512-qh8sxfLj/XW1u6rluN7yIgbvMCoKrVacYGUiPM7g0VHk8h8MlZGAIUfsWM45Poxo3X0uLhNuqqxMaPWldKawIQ==}
|
||||
engines: {node: '>=14'}
|
||||
dependencies:
|
||||
'@remix-run/router': 1.3.1
|
||||
'@types/cookie': 0.4.1
|
||||
'@types/react': 18.0.28
|
||||
'@web3-storage/multipart-parser': 1.0.0
|
||||
cookie: 0.4.2
|
||||
set-cookie-parser: 2.5.1
|
||||
source-map: 0.7.4
|
||||
dev: false
|
||||
|
||||
/@remix-run/server-runtime/1.13.0:
|
||||
resolution: {integrity: sha512-gjIW3XCeIlOt3rrOZMD6HixQydRgs1SwYjP99ZAVruG2+gNq/tL2OusMFYTLvtWrybt215tPROyF/6iTLsaO3g==}
|
||||
engines: {node: '>=14'}
|
||||
dependencies:
|
||||
'@remix-run/router': 1.3.2
|
||||
'@remix-run/router': 1.3.3
|
||||
'@types/cookie': 0.4.1
|
||||
'@types/react': 18.0.28
|
||||
'@web3-storage/multipart-parser': 1.0.0
|
||||
@@ -2252,21 +2218,24 @@ packages:
|
||||
resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==}
|
||||
dev: true
|
||||
|
||||
/@vercel/analytics/0.1.10_react@18.2.0:
|
||||
resolution: {integrity: sha512-jjJ8GzcPnQp0cMxpfYoUycMRBtDiaIeyVjZPiEPe99Dj1PdjMzAFYEASiV/hpNsXHkpcNYCveDFh6jnmh0YSDQ==}
|
||||
/@vercel/analytics/0.1.11_react@18.2.0:
|
||||
resolution: {integrity: sha512-mj5CPR02y0BRs1tN3oZcBNAX9a8NxsIUl9vElDPcqxnMfP0RbRc9fI9Ud7+QDg/1Izvt5uMumsr+6YsmVHcyuw==}
|
||||
peerDependencies:
|
||||
react: ^16.8||^17||^18
|
||||
dependencies:
|
||||
react: 18.2.0
|
||||
dev: false
|
||||
|
||||
/@vercel/remix-entry-server/0.1.0_react@18.2.0:
|
||||
resolution: {integrity: sha512-ux1pcYvcPXAUXQuSH4fwNfkrzYYemFpdc3r4lF3L3PBE5doGhYDuBdTfXZpWl1M5zXi6VAbK6V6qkD33iZWGDA==}
|
||||
/@vercel/remix/1.14.3-patch.1_biqbaboplfbrettd7655fr4n2y:
|
||||
resolution: {integrity: sha512-TBI/FS77HYZqjbgeABi7Rbg7RVQ1YLHcXm4/zroV4zl0nVbcXM2jVR3SXm0EuQKze+NZ0p3VBUz4I/xocTvq0w==}
|
||||
engines: {node: '>=14'}
|
||||
peerDependencies:
|
||||
react: ^18.0.0
|
||||
react: '*'
|
||||
react-dom: '*'
|
||||
dependencies:
|
||||
'@remix-run/node': 1.12.0
|
||||
isbot: 3.6.5
|
||||
'@remix-run/node': 1.14.3
|
||||
'@remix-run/server-runtime': 1.14.3
|
||||
isbot: 3.6.6
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0_react@18.2.0
|
||||
dev: false
|
||||
@@ -3092,7 +3061,7 @@ packages:
|
||||
dev: true
|
||||
|
||||
/ee-first/1.1.1:
|
||||
resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
|
||||
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
|
||||
|
||||
/electron-to-chromium/1.4.296:
|
||||
resolution: {integrity: sha512-i/6Q+Y9bluDa2a0NbMvdtG5TuS/1Fr3TKK8L+7UUL9QjRS5iFJzCC3r70xjyOnLiYG8qGV4/mMpe6HuAbdJW4w==}
|
||||
@@ -3901,7 +3870,7 @@ packages:
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
/fresh/0.5.2:
|
||||
resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=}
|
||||
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
/fs-constants/1.0.0:
|
||||
@@ -4638,8 +4607,8 @@ packages:
|
||||
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
|
||||
dev: true
|
||||
|
||||
/isbot/3.6.5:
|
||||
resolution: {integrity: sha512-BchONELXt6yMad++BwGpa0oQxo/uD0keL7N15cYVf0A1oMIoNQ79OqeYdPMFWDrNhCqCbRuw9Y9F3QBjvAxZ5g==}
|
||||
/isbot/3.6.6:
|
||||
resolution: {integrity: sha512-98aGl1Spbx1led422YFrusDJ4ZutSNOymb2avZ2V4BCCjF3MqAF2k+J2zoaLYahubaFkb+3UyvbVDVlk/Ngrew==}
|
||||
engines: {node: '>=12'}
|
||||
dev: false
|
||||
|
||||
@@ -5006,11 +4975,11 @@ packages:
|
||||
dev: true
|
||||
|
||||
/media-typer/0.3.0:
|
||||
resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
|
||||
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
/merge-descriptors/1.0.1:
|
||||
resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=}
|
||||
resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
|
||||
|
||||
/merge-stream/2.0.0:
|
||||
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
|
||||
@@ -6057,26 +6026,31 @@ packages:
|
||||
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
|
||||
dev: true
|
||||
|
||||
/react-router-dom/6.8.1_biqbaboplfbrettd7655fr4n2y:
|
||||
resolution: {integrity: sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==}
|
||||
/react-refresh/0.14.0:
|
||||
resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/react-router-dom/6.8.2_biqbaboplfbrettd7655fr4n2y:
|
||||
resolution: {integrity: sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg==}
|
||||
engines: {node: '>=14'}
|
||||
peerDependencies:
|
||||
react: '>=16.8'
|
||||
react-dom: '>=16.8'
|
||||
dependencies:
|
||||
'@remix-run/router': 1.3.2
|
||||
'@remix-run/router': 1.3.3
|
||||
react: 18.2.0
|
||||
react-dom: 18.2.0_react@18.2.0
|
||||
react-router: 6.8.1_react@18.2.0
|
||||
react-router: 6.8.2_react@18.2.0
|
||||
dev: false
|
||||
|
||||
/react-router/6.8.1_react@18.2.0:
|
||||
resolution: {integrity: sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==}
|
||||
/react-router/6.8.2_react@18.2.0:
|
||||
resolution: {integrity: sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw==}
|
||||
engines: {node: '>=14'}
|
||||
peerDependencies:
|
||||
react: '>=16.8'
|
||||
dependencies:
|
||||
'@remix-run/router': 1.3.2
|
||||
'@remix-run/router': 1.3.3
|
||||
react: 18.2.0
|
||||
dev: false
|
||||
|
||||
@@ -6993,7 +6967,7 @@ packages:
|
||||
which-typed-array: 1.1.9
|
||||
|
||||
/utils-merge/1.0.1:
|
||||
resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=}
|
||||
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
|
||||
engines: {node: '>= 0.4.0'}
|
||||
|
||||
/uvu/0.5.6:
|
||||
|
||||
2
examples/remix/remix.env.d.ts
vendored
2
examples/remix/remix.env.d.ts
vendored
@@ -1,2 +1,2 @@
|
||||
/// <reference types="@remix-run/dev" />
|
||||
/// <reference types="@remix-run/node" />
|
||||
/// <reference types="@vercel/remix" />
|
||||
|
||||
11
internals/tsconfig/package.json
Normal file
11
internals/tsconfig/package.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/tsconfig",
|
||||
"description": "Node.js tsconfig file based on `@vercel/style-guide`",
|
||||
"files": [
|
||||
"tsconfig.json"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@vercel/style-guide": "4.0.2"
|
||||
}
|
||||
}
|
||||
12
internals/tsconfig/tsconfig.json
Normal file
12
internals/tsconfig/tsconfig.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"extends": "@vercel/style-guide/typescript",
|
||||
"compilerOptions": {
|
||||
"declaration": true,
|
||||
"allowJs": true,
|
||||
"moduleResolution": "node",
|
||||
"module": "commonjs",
|
||||
"lib": ["ES2020"],
|
||||
"resolveJsonModule": true,
|
||||
"sourceMap": true
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,9 @@
|
||||
"name": "@vercel-internals/types",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc -p tsconfig.json"
|
||||
},
|
||||
@@ -11,6 +14,7 @@
|
||||
"@vercel/routing-utils": "2.1.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"typescript": "4.9.4"
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel/style-guide/typescript",
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"declaration": true
|
||||
"outDir": "./dist"
|
||||
},
|
||||
"include": ["index.ts"]
|
||||
}
|
||||
|
||||
17
internals/utils/package.json
Normal file
17
internals/utils/package.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/utils",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc -p tsconfig.json"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"typescript": "4.9.4"
|
||||
}
|
||||
}
|
||||
0
internals/utils/src/index.ts
Normal file
0
internals/utils/src/index.ts
Normal file
7
internals/utils/tsconfig.json
Normal file
7
internals/utils/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
13
package.json
13
package.json
@@ -32,7 +32,7 @@
|
||||
"source-map-support": "0.5.12",
|
||||
"ts-eager": "2.0.2",
|
||||
"ts-jest": "28.0.5",
|
||||
"turbo": "1.8.3"
|
||||
"turbo": "1.8.5"
|
||||
},
|
||||
"scripts": {
|
||||
"lerna": "lerna",
|
||||
@@ -42,15 +42,16 @@
|
||||
"publish-canary": "git checkout main && git pull && lerna version prerelease --preid canary --message \"Publish Canary\" --exact",
|
||||
"publish-from-github": "./utils/publish.sh",
|
||||
"changelog": "node utils/changelog.js",
|
||||
"build": "node utils/gen.js && turbo run build",
|
||||
"build": "node utils/gen.js && turbo --no-update-notifier run build",
|
||||
"vercel-build": "pnpm build && pnpm run pack && cd api && node -r ts-eager/register ./_lib/script/build.ts",
|
||||
"pre-commit": "lint-staged",
|
||||
"test": "jest --rootDir=\"test\" --testPathPattern=\"\\.test.js\"",
|
||||
"test-unit": "pnpm test && node utils/gen.js && turbo run test-unit",
|
||||
"test-cli": "node utils/gen.js && turbo run test-cli",
|
||||
"test-e2e": "node utils/gen.js && turbo run test-e2e",
|
||||
"test-dev": "node utils/gen.js && turbo run test-dev",
|
||||
"test-unit": "pnpm test && node utils/gen.js && turbo --no-update-notifier run test-unit",
|
||||
"test-cli": "node utils/gen.js && turbo --no-update-notifier run test-cli",
|
||||
"test-e2e": "node utils/gen.js && turbo --no-update-notifier run test-e2e",
|
||||
"test-dev": "node utils/gen.js && turbo --no-update-notifier run test-dev",
|
||||
"lint": "eslint . --cache --ext .ts,.js",
|
||||
"prettier-check": "prettier --check .",
|
||||
"prepare": "husky install",
|
||||
"pack": "cd utils && node -r ts-eager/register ./pack.ts"
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/build-utils",
|
||||
"version": "6.3.3",
|
||||
"version": "6.5.0",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.js",
|
||||
|
||||
79
packages/build-utils/src/hard-link-dir.ts
Normal file
79
packages/build-utils/src/hard-link-dir.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
// Source: https://github.com/pnpm/pnpm/blob/b38d711f3892a473e20e69dd32ca7e1b439efaec/fs/hard-link-dir/src/index.ts#L4
|
||||
// LICENSE (MIT): https://github.com/pnpm/pnpm/blob/b38d711f3892a473e20e69dd32ca7e1b439efaec/LICENSE
|
||||
|
||||
import path from 'path';
|
||||
import { promises as fs } from 'fs';
|
||||
|
||||
export async function hardLinkDir(src: string, destDirs: string[]) {
|
||||
if (destDirs.length === 0) return;
|
||||
// Don't try to hard link the source directory to itself
|
||||
destDirs = destDirs.filter(destDir => path.relative(destDir, src) !== '');
|
||||
const files = await fs.readdir(src);
|
||||
await Promise.all(
|
||||
files.map(async file => {
|
||||
if (file === 'node_modules') return;
|
||||
const srcFile = path.join(src, file);
|
||||
if ((await fs.lstat(srcFile)).isDirectory()) {
|
||||
const destSubdirs = await Promise.all(
|
||||
destDirs.map(async destDir => {
|
||||
const destSubdir = path.join(destDir, file);
|
||||
try {
|
||||
await fs.mkdir(destSubdir, { recursive: true });
|
||||
} catch (err: any) {
|
||||
// eslint-disable-line
|
||||
if (err.code !== 'EEXIST') throw err;
|
||||
}
|
||||
return destSubdir;
|
||||
})
|
||||
);
|
||||
await hardLinkDir(srcFile, destSubdirs);
|
||||
return;
|
||||
}
|
||||
await Promise.all(
|
||||
destDirs.map(async destDir => {
|
||||
const destFile = path.join(destDir, file);
|
||||
try {
|
||||
await linkOrCopyFile(srcFile, destFile);
|
||||
} catch (err: any) {
|
||||
// eslint-disable-line
|
||||
if (err.code === 'ENOENT') {
|
||||
// Ignore broken symlinks
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
})
|
||||
);
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
async function linkOrCopyFile(srcFile: string, destFile: string) {
|
||||
try {
|
||||
await linkOrCopy(srcFile, destFile);
|
||||
} catch (err: any) {
|
||||
// eslint-disable-line
|
||||
if (err.code === 'ENOENT') {
|
||||
await fs.mkdir(path.dirname(destFile), { recursive: true });
|
||||
await linkOrCopy(srcFile, destFile);
|
||||
return;
|
||||
}
|
||||
if (err.code !== 'EEXIST') {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This function could be optimized because we don't really need to try linking again
|
||||
* if linking failed once.
|
||||
*/
|
||||
async function linkOrCopy(srcFile: string, destFile: string) {
|
||||
try {
|
||||
await fs.link(srcFile, destFile);
|
||||
} catch (err: any) {
|
||||
// eslint-disable-line
|
||||
if (err.code !== 'EXDEV') throw err;
|
||||
await fs.copyFile(srcFile, destFile);
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,7 @@ import getIgnoreFilter from './get-ignore-filter';
|
||||
import { getPlatformEnv } from './get-platform-env';
|
||||
import { getPrefixedEnvVars } from './get-prefixed-env-vars';
|
||||
import { cloneEnv } from './clone-env';
|
||||
import { hardLinkDir } from './hard-link-dir';
|
||||
|
||||
export {
|
||||
FileBlob,
|
||||
@@ -86,6 +87,7 @@ export {
|
||||
scanParentDirs,
|
||||
getIgnoreFilter,
|
||||
cloneEnv,
|
||||
hardLinkDir,
|
||||
};
|
||||
|
||||
export { EdgeFunction } from './edge-function';
|
||||
|
||||
@@ -11,6 +11,7 @@ interface PrerenderOptions {
|
||||
initialHeaders?: Record<string, string>;
|
||||
initialStatus?: number;
|
||||
passQuery?: boolean;
|
||||
sourcePath?: string;
|
||||
}
|
||||
|
||||
export class Prerender {
|
||||
@@ -24,6 +25,7 @@ export class Prerender {
|
||||
public initialHeaders?: Record<string, string>;
|
||||
public initialStatus?: number;
|
||||
public passQuery?: boolean;
|
||||
public sourcePath?: string;
|
||||
|
||||
constructor({
|
||||
expiration,
|
||||
@@ -35,9 +37,11 @@ export class Prerender {
|
||||
initialHeaders,
|
||||
initialStatus,
|
||||
passQuery,
|
||||
sourcePath,
|
||||
}: PrerenderOptions) {
|
||||
this.type = 'Prerender';
|
||||
this.expiration = expiration;
|
||||
this.sourcePath = sourcePath;
|
||||
|
||||
this.lambda = lambda;
|
||||
if (this.lambda) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vercel",
|
||||
"version": "28.16.14",
|
||||
"version": "28.18.1",
|
||||
"preferGlobal": true,
|
||||
"license": "Apache-2.0",
|
||||
"description": "The command-line interface for Vercel",
|
||||
@@ -14,7 +14,7 @@
|
||||
"preinstall": "node ./scripts/preinstall.js",
|
||||
"test": "jest --env node --verbose --bail",
|
||||
"test-unit": "pnpm test test/unit/",
|
||||
"test-cli": "rimraf test/fixtures/integration && ava test/integration.js --serial --fail-fast --verbose",
|
||||
"test-cli": "rimraf test/fixtures/integration && pnpm test test/integration.test.ts",
|
||||
"test-dev": "pnpm test test/dev/",
|
||||
"coverage": "codecov",
|
||||
"build": "ts-node ./scripts/build.ts",
|
||||
@@ -28,29 +28,20 @@
|
||||
"dist",
|
||||
"scripts/preinstall.js"
|
||||
],
|
||||
"ava": {
|
||||
"extensions": [
|
||||
"ts"
|
||||
],
|
||||
"require": [
|
||||
"ts-node/register/transpile-only",
|
||||
"esm"
|
||||
]
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 14"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "6.3.3",
|
||||
"@vercel/go": "2.3.10",
|
||||
"@vercel/hydrogen": "0.0.56",
|
||||
"@vercel/next": "3.6.5",
|
||||
"@vercel/node": "2.9.11",
|
||||
"@vercel/python": "3.1.52",
|
||||
"@vercel/redwood": "1.1.8",
|
||||
"@vercel/remix": "1.6.1",
|
||||
"@vercel/ruby": "1.3.69",
|
||||
"@vercel/static-build": "1.3.15"
|
||||
"@vercel/build-utils": "6.5.0",
|
||||
"@vercel/go": "2.4.1",
|
||||
"@vercel/hydrogen": "0.0.59",
|
||||
"@vercel/next": "3.7.1",
|
||||
"@vercel/node": "2.10.0",
|
||||
"@vercel/python": "3.1.55",
|
||||
"@vercel/redwood": "1.1.11",
|
||||
"@vercel/remix-builder": "1.8.1",
|
||||
"@vercel/ruby": "1.3.72",
|
||||
"@vercel/static-build": "1.3.19"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@alex_neo/jest-expect-message": "1.0.5",
|
||||
@@ -94,13 +85,13 @@
|
||||
"@types/write-json-file": "2.2.1",
|
||||
"@types/yauzl-promise": "2.1.0",
|
||||
"@vercel-internals/types": "*",
|
||||
"@vercel/client": "12.4.3",
|
||||
"@vercel/client": "12.4.6",
|
||||
"@vercel/error-utils": "1.0.8",
|
||||
"@vercel/frameworks": "1.3.2",
|
||||
"@vercel/fs-detectors": "3.8.3",
|
||||
"@vercel/frameworks": "1.3.3",
|
||||
"@vercel/fs-detectors": "3.8.6",
|
||||
"@vercel/fun": "1.0.4",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"@vercel/routing-utils": "2.1.10",
|
||||
"@vercel/routing-utils": "2.1.11",
|
||||
"@zeit/source-map-support": "0.6.2",
|
||||
"ajv": "6.12.2",
|
||||
"alpha-sort": "2.0.1",
|
||||
@@ -110,7 +101,6 @@
|
||||
"async-listen": "1.2.0",
|
||||
"async-retry": "1.1.3",
|
||||
"async-sema": "2.1.4",
|
||||
"ava": "2.2.0",
|
||||
"bytes": "3.0.0",
|
||||
"chalk": "4.1.0",
|
||||
"chance": "1.1.7",
|
||||
|
||||
@@ -36,9 +36,7 @@ async function main() {
|
||||
const def = await readFile(fnPath.replace(/\.js$/, '.tsdef'), 'utf8');
|
||||
const interfaceName = def.match(/interface (\w+)/)[1];
|
||||
|
||||
const lines = require(fnPath)
|
||||
.toString()
|
||||
.split('\n');
|
||||
const lines = require(fnPath).toString().split('\n');
|
||||
let errorHtmlStart = -1;
|
||||
let errorHtmlEnd = -1;
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import fs from 'fs-extra';
|
||||
import chalk from 'chalk';
|
||||
import dotenv from 'dotenv';
|
||||
import { join, normalize, relative, resolve } from 'path';
|
||||
import { join, normalize, relative, resolve, sep } from 'path';
|
||||
import {
|
||||
getDiscontinuedNodeVersions,
|
||||
normalizePath,
|
||||
@@ -296,13 +296,15 @@ async function doBuild(
|
||||
cwd: string,
|
||||
outputDir: string
|
||||
): Promise<void> {
|
||||
const { output } = client;
|
||||
const { localConfigPath, output } = client;
|
||||
|
||||
const workPath = join(cwd, project.settings.rootDirectory || '.');
|
||||
|
||||
const [pkg, vercelConfig, nowConfig] = await Promise.all([
|
||||
readJSONFile<PackageJson>(join(workPath, 'package.json')),
|
||||
readJSONFile<VercelConfig>(join(workPath, 'vercel.json')),
|
||||
readJSONFile<VercelConfig>(
|
||||
localConfigPath || join(workPath, 'vercel.json')
|
||||
),
|
||||
readJSONFile<VercelConfig>(join(workPath, 'now.json')),
|
||||
]);
|
||||
|
||||
@@ -710,7 +712,9 @@ function expandBuild(files: string[], build: Builder): Builder[] {
|
||||
});
|
||||
}
|
||||
|
||||
let src = normalize(build.src || '**');
|
||||
let src = normalize(build.src || '**')
|
||||
.split(sep)
|
||||
.join('/');
|
||||
if (src === '.' || src === './') {
|
||||
throw new NowBuildError({
|
||||
code: `invalid_build_specification`,
|
||||
|
||||
6
packages/cli/src/commands/env/add.ts
vendored
6
packages/cli/src/commands/env/add.ts
vendored
@@ -1,5 +1,9 @@
|
||||
import chalk from 'chalk';
|
||||
import { ProjectEnvTarget, Project, ProjectEnvType } from '@vercel-internals/types';
|
||||
import {
|
||||
ProjectEnvTarget,
|
||||
Project,
|
||||
ProjectEnvType,
|
||||
} from '@vercel-internals/types';
|
||||
import { Output } from '../../util/output';
|
||||
import Client from '../../util/client';
|
||||
import stamp from '../../util/output/stamp';
|
||||
|
||||
6
packages/cli/src/commands/env/ls.ts
vendored
6
packages/cli/src/commands/env/ls.ts
vendored
@@ -1,7 +1,11 @@
|
||||
import chalk from 'chalk';
|
||||
import ms from 'ms';
|
||||
import { Output } from '../../util/output';
|
||||
import { Project, ProjectEnvVariable, ProjectEnvType } from '@vercel-internals/types';
|
||||
import {
|
||||
Project,
|
||||
ProjectEnvVariable,
|
||||
ProjectEnvType,
|
||||
} from '@vercel-internals/types';
|
||||
import Client from '../../util/client';
|
||||
import formatTable from '../../util/format-table';
|
||||
import getEnvRecords from '../../util/env/get-env-records';
|
||||
|
||||
@@ -267,6 +267,7 @@ const main = async () => {
|
||||
config,
|
||||
authConfig,
|
||||
localConfig,
|
||||
localConfigPath,
|
||||
argv: process.argv,
|
||||
});
|
||||
|
||||
@@ -280,7 +281,12 @@ const main = async () => {
|
||||
GLOBAL_COMMANDS.has(targetOrSubcommand) ||
|
||||
commands.has(targetOrSubcommand);
|
||||
|
||||
if (targetPathExists && subcommandExists && !argv['--cwd']) {
|
||||
if (
|
||||
targetPathExists &&
|
||||
subcommandExists &&
|
||||
!argv['--cwd'] &&
|
||||
!process.env.NOW_BUILDER
|
||||
) {
|
||||
output.warn(
|
||||
`Did you mean to deploy the subdirectory "${targetOrSubcommand}"? ` +
|
||||
`Use \`vc --cwd ${targetOrSubcommand}\` instead.`
|
||||
|
||||
@@ -50,9 +50,7 @@ export async function setMonorepoDefaultSettings(
|
||||
const { monorepoManager, ...commands } = result;
|
||||
|
||||
output.log(
|
||||
`Automatically detected ${title(
|
||||
monorepoManager
|
||||
)} monorepo manager. Attempting to assign default settings.`
|
||||
`Detected ${title(monorepoManager)}. Adjusting default settings...`
|
||||
);
|
||||
|
||||
if (commands.buildCommand) {
|
||||
|
||||
@@ -20,10 +20,7 @@ export default function getWildcardCNSForAlias(alias: string) {
|
||||
|
||||
const secondLevel =
|
||||
subdomain && subdomain.includes('.')
|
||||
? subdomain
|
||||
.split('.')
|
||||
.slice(1)
|
||||
.join('.')
|
||||
? subdomain.split('.').slice(1).join('.')
|
||||
: null;
|
||||
|
||||
const root = secondLevel ? `${secondLevel}.${domain}` : domain;
|
||||
|
||||
@@ -43,6 +43,7 @@ export interface ClientOptions extends Stdio {
|
||||
output: Output;
|
||||
config: GlobalConfig;
|
||||
localConfig?: VercelConfig;
|
||||
localConfigPath?: string;
|
||||
}
|
||||
|
||||
export const isJSONObject = (v: any): v is JSONObject => {
|
||||
@@ -59,6 +60,7 @@ export default class Client extends EventEmitter implements Stdio {
|
||||
output: Output;
|
||||
config: GlobalConfig;
|
||||
localConfig?: VercelConfig;
|
||||
localConfigPath?: string;
|
||||
prompt!: inquirer.PromptModule;
|
||||
private requestIdCounter: number;
|
||||
|
||||
@@ -73,6 +75,7 @@ export default class Client extends EventEmitter implements Stdio {
|
||||
this.output = opts.output;
|
||||
this.config = opts.config;
|
||||
this.localConfig = opts.localConfig;
|
||||
this.localConfigPath = opts.localConfigPath;
|
||||
this.requestIdCounter = 1;
|
||||
this._createPromptModule();
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ export default function createPollingFn<R>(
|
||||
future: (...args: any[]) => Promise<R>,
|
||||
sleepTime: number
|
||||
) {
|
||||
return async function*(...args: any[]) {
|
||||
return async function* (...args: any[]) {
|
||||
while (true) {
|
||||
yield await future(...args);
|
||||
await sleep(sleepTime);
|
||||
|
||||
@@ -8,7 +8,7 @@ export default async function deleteDNSRecordById(
|
||||
return client.fetch(
|
||||
`/v3/domains/${encodeURIComponent(domain)}/records/${recordId}`,
|
||||
{
|
||||
method: 'DELETE'
|
||||
method: 'DELETE',
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ export default function parseAddArgs(
|
||||
if (domain && rest.length === 0) {
|
||||
return {
|
||||
domain,
|
||||
data: null
|
||||
data: null,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ export default function parseAddArgs(
|
||||
if (type === 'MX' && args.length === 5) {
|
||||
return {
|
||||
domain,
|
||||
data: { name, type, value, mxPriority: Number(args[4]) }
|
||||
data: { name, type, value, mxPriority: Number(args[4]) },
|
||||
};
|
||||
}
|
||||
|
||||
@@ -40,9 +40,9 @@ export default function parseAddArgs(
|
||||
priority: Number(value),
|
||||
weight: Number(args[4]),
|
||||
port: Number(args[5]),
|
||||
target: args[6]
|
||||
}
|
||||
}
|
||||
target: args[6],
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -52,8 +52,8 @@ export default function parseAddArgs(
|
||||
data: {
|
||||
name,
|
||||
type,
|
||||
value
|
||||
}
|
||||
value,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ export default async function getAuthCode(code?: string) {
|
||||
}
|
||||
return textInput({
|
||||
label: `- Transfer auth code: `,
|
||||
validateValue: isValidAuthCode
|
||||
validateValue: isValidAuthCode,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,6 @@ export default function formatDNSTable(
|
||||
return table([HEADER, ...rows], {
|
||||
align: ['l', 'l', 'l'],
|
||||
hsep: ' '.repeat(8),
|
||||
stringLength: strlen
|
||||
stringLength: strlen,
|
||||
}).replace(/^(.*)/gm, `${extraSpace}$1`);
|
||||
}
|
||||
|
||||
@@ -22,19 +22,23 @@ export default function formatNSTable(
|
||||
sortedCurrent[i] || chalk.gray('-'),
|
||||
sortedIntended[i] === sortedCurrent[i]
|
||||
? chalk.green(chars.tick)
|
||||
: chalk.red(chars.cross)
|
||||
: chalk.red(chars.cross),
|
||||
]);
|
||||
}
|
||||
|
||||
return table(
|
||||
[
|
||||
[chalk.gray('Intended Nameservers'), chalk.gray('Current Nameservers'), ''],
|
||||
...rows
|
||||
[
|
||||
chalk.gray('Intended Nameservers'),
|
||||
chalk.gray('Current Nameservers'),
|
||||
'',
|
||||
],
|
||||
...rows,
|
||||
],
|
||||
{
|
||||
align: ['l', 'l', 'l', 'l'],
|
||||
hsep: ' '.repeat(4),
|
||||
stringLength: strlen
|
||||
stringLength: strlen,
|
||||
}
|
||||
).replace(/^(.*)/gm, `${extraSpace}$1`);
|
||||
}
|
||||
|
||||
@@ -7,4 +7,3 @@ export function getDistTag(version: string): string {
|
||||
}
|
||||
return 'latest';
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,9 @@ export function getPaginationOpts(opts: PaginationOptions) {
|
||||
typeof limit === 'number' &&
|
||||
(!Number.isInteger(limit) || limit > 100 || limit < 1)
|
||||
) {
|
||||
throw new Error('Please provide an integer from 1 to 100 for option --limit');
|
||||
throw new Error(
|
||||
'Please provide an integer from 1 to 100 for option --limit'
|
||||
);
|
||||
}
|
||||
|
||||
return [nextTimestamp, limit];
|
||||
|
||||
@@ -14,6 +14,6 @@ export default function getSubcommand(
|
||||
}
|
||||
return {
|
||||
subcommand: config.default,
|
||||
args: cliArgs
|
||||
args: cliArgs,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -290,7 +290,8 @@ export default class Now extends EventEmitter {
|
||||
|
||||
if (
|
||||
error.errorCode === 'BUILD_FAILED' ||
|
||||
error.errorCode === 'UNEXPECTED_ERROR'
|
||||
error.errorCode === 'UNEXPECTED_ERROR' ||
|
||||
error.errorCode.includes('BUILD_UTILS_SPAWN_')
|
||||
) {
|
||||
return new BuildError({
|
||||
message: error.errorMessage,
|
||||
@@ -298,7 +299,7 @@ export default class Now extends EventEmitter {
|
||||
});
|
||||
}
|
||||
|
||||
return new Error(error.message);
|
||||
return new Error(error.message || error.errorMessage);
|
||||
}
|
||||
|
||||
async listSecrets(next?: number, testWarningFlag?: boolean) {
|
||||
|
||||
@@ -11,7 +11,7 @@ function didYouMean(input: string, list: string[], threshold: number = 0.5) {
|
||||
const found = rated.filter(item => item[0] > threshold);
|
||||
if (found.length) {
|
||||
const highestRated = found.reduce((accu, curr) => {
|
||||
return accu[0] > curr[0] ? accu : curr
|
||||
return accu[0] > curr[0] ? accu : curr;
|
||||
});
|
||||
return highestRated[1];
|
||||
}
|
||||
@@ -23,6 +23,7 @@ function didYouMean(input: string, list: string[], threshold: number = 0.5) {
|
||||
function dashAwareDistance(word: string, dashWord: string) {
|
||||
const fullDistance = distance(word, dashWord);
|
||||
const distances = dashWord.split('-').map(w => distance(w, word));
|
||||
const meanDistance = distances.reduce((accu, curr) => accu + curr) / distances.length;
|
||||
const meanDistance =
|
||||
distances.reduce((accu, curr) => accu + curr) / distances.length;
|
||||
return fullDistance > meanDistance ? fullDistance : meanDistance;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ export class NowError<C, Meta> extends Error {
|
||||
constructor({
|
||||
code,
|
||||
message,
|
||||
meta
|
||||
meta,
|
||||
}: {
|
||||
code: C;
|
||||
message: string;
|
||||
|
||||
@@ -2,4 +2,4 @@ import chalk from 'chalk';
|
||||
|
||||
export default function highlight(text: string): string {
|
||||
return chalk.bold.underline(text);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
export default function success (msg: string): string {
|
||||
export default function success(msg: string): string {
|
||||
return `${chalk.cyan('> Success!')} ${msg}`;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ export default async function* raceAsyncGenerators(...args: any[]) {
|
||||
yield new Promise(resolve => {
|
||||
let resolved = false;
|
||||
nextPromises.forEach((nextPromise, idx) => {
|
||||
nextPromise.then(({ value, done }: { value: any, done: boolean }) => {
|
||||
nextPromise.then(({ value, done }: { value: any; done: boolean }) => {
|
||||
if (!resolved) {
|
||||
resolved = true;
|
||||
resolve(value);
|
||||
@@ -15,7 +15,7 @@ export default async function* raceAsyncGenerators(...args: any[]) {
|
||||
} else {
|
||||
nextPromises = [
|
||||
...nextPromises.slice(0, idx),
|
||||
...nextPromises.slice(idx + 1)
|
||||
...nextPromises.slice(idx + 1),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ test('[vercel dev] throws an error when an edge function has no response', async
|
||||
expect(await res.status).toBe(500);
|
||||
expect(await res.text()).toMatch('FUNCTION_INVOCATION_FAILED');
|
||||
expect(stdout).toMatch(
|
||||
/Error from API Route \/api\/edge-no-response: Edge Function "api\/edge-no-response.js" did not return a response./g
|
||||
/Error from API Route \/api\/edge-no-response: Edge Function did not return a response./g
|
||||
);
|
||||
} finally {
|
||||
await dev.kill();
|
||||
@@ -304,12 +304,12 @@ test('[vercel dev] should handle missing handler errors thrown in edge functions
|
||||
);
|
||||
validateResponseHeaders(res);
|
||||
|
||||
const { stdout } = await dev.kill();
|
||||
const { stderr } = await dev.kill();
|
||||
|
||||
expect(await res.text()).toMatch(
|
||||
/<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g
|
||||
);
|
||||
expect(stdout).toMatch(
|
||||
expect(stderr).toMatch(
|
||||
/No default export was found. Add a default export to handle requests./g
|
||||
);
|
||||
} finally {
|
||||
|
||||
@@ -12,7 +12,7 @@ const {
|
||||
} = require('../../../../test/lib/deployment/now-deploy');
|
||||
const { spawnSync, execFileSync } = require('child_process');
|
||||
|
||||
jest.setTimeout(6 * 60 * 1000);
|
||||
jest.setTimeout(10 * 60 * 1000);
|
||||
|
||||
const isCI = !!process.env.CI;
|
||||
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
||||
|
||||
7
packages/cli/test/fixtures/unit/commands/build/local-config/.vercel/project.json
vendored
Normal file
7
packages/cli/test/fixtures/unit/commands/build/local-config/.vercel/project.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"orgId": ".",
|
||||
"projectId": ".",
|
||||
"settings": {
|
||||
"framework": null
|
||||
}
|
||||
}
|
||||
1
packages/cli/test/fixtures/unit/commands/build/local-config/main.html
vendored
Normal file
1
packages/cli/test/fixtures/unit/commands/build/local-config/main.html
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<h1>hello main</h1>
|
||||
1
packages/cli/test/fixtures/unit/commands/build/local-config/test.html
vendored
Normal file
1
packages/cli/test/fixtures/unit/commands/build/local-config/test.html
vendored
Normal file
@@ -0,0 +1 @@
|
||||
<h1>hello test</h1>
|
||||
15
packages/cli/test/fixtures/unit/commands/build/local-config/vercel-test.json
vendored
Normal file
15
packages/cli/test/fixtures/unit/commands/build/local-config/vercel-test.json
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "secondary",
|
||||
"builds": [
|
||||
{
|
||||
"src": "test.html",
|
||||
"use": "@vercel/static"
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"src": "/another-test",
|
||||
"dest": "/test.html"
|
||||
}
|
||||
]
|
||||
}
|
||||
15
packages/cli/test/fixtures/unit/commands/build/local-config/vercel.json
vendored
Normal file
15
packages/cli/test/fixtures/unit/commands/build/local-config/vercel.json
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "original",
|
||||
"builds": [
|
||||
{
|
||||
"src": "main.html",
|
||||
"use": "@vercel/static"
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"src": "/another-main",
|
||||
"dest": "/main.html"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -96,7 +96,15 @@ module.exports = async function prepare(session, binaryPath, tmpFixturesDir) {
|
||||
),
|
||||
},
|
||||
'dev-fail-on-recursion-command': {
|
||||
'package.json': '{}',
|
||||
'package.json': JSON.stringify({
|
||||
scripts: {
|
||||
build: 'echo "build script"',
|
||||
},
|
||||
}),
|
||||
'vercel.json': JSON.stringify({
|
||||
version: 2,
|
||||
devCommand: `${binaryPath} dev`,
|
||||
}),
|
||||
},
|
||||
'build-fail-on-recursion-command': {
|
||||
'package.json': '{}',
|
||||
@@ -176,12 +184,12 @@ module.exports = async function prepare(session, binaryPath, tmpFixturesDir) {
|
||||
'local-config-v2': {
|
||||
[`main-${session}.html`]: '<h1>hello main</h1>',
|
||||
[`test-${session}.html`]: '<h1>hello test</h1>',
|
||||
'now.json': JSON.stringify({
|
||||
'vercel.json': JSON.stringify({
|
||||
name: 'original',
|
||||
builds: [{ src: `main-${session}.html`, use: '@vercel/static' }],
|
||||
routes: [{ src: '/another-main', dest: `/main-${session}.html` }],
|
||||
}),
|
||||
'now-test.json': JSON.stringify({
|
||||
'vercel-test.json': JSON.stringify({
|
||||
name: 'secondary',
|
||||
builds: [{ src: `test-${session}.html`, use: '@vercel/static' }],
|
||||
routes: [{ src: '/another-test', dest: `/test-${session}.html` }],
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,3 @@
|
||||
import ms from 'ms';
|
||||
import fs from 'fs-extra';
|
||||
import { join } from 'path';
|
||||
import { getWriteableDirectory } from '@vercel/build-utils';
|
||||
@@ -8,7 +7,7 @@ import { defaultProject, useProject } from '../../../mocks/project';
|
||||
import { useTeams } from '../../../mocks/team';
|
||||
import { useUser } from '../../../mocks/user';
|
||||
|
||||
jest.setTimeout(ms('1 minute'));
|
||||
jest.setTimeout(2 * 60 * 1000);
|
||||
|
||||
const fixture = (name: string) =>
|
||||
join(__dirname, '../../../fixtures/unit/commands/build', name);
|
||||
@@ -1263,4 +1262,46 @@ describe('build', () => {
|
||||
expect(packageDistFiles).toContain('dist-module.js');
|
||||
});
|
||||
});
|
||||
|
||||
it('should use --local-config over default vercel.json', async () => {
|
||||
const cwd = fixture('local-config');
|
||||
const output = join(cwd, '.vercel/output');
|
||||
try {
|
||||
client.stdout.pipe(process.stdout);
|
||||
client.stderr.pipe(process.stderr);
|
||||
|
||||
process.chdir(cwd);
|
||||
let exitCode = await build(client);
|
||||
delete process.env.__VERCEL_BUILD_RUNNING;
|
||||
expect(exitCode).toEqual(0);
|
||||
|
||||
let config = await fs.readJSON(join(output, 'config.json'));
|
||||
expect(config.routes).toContainEqual({
|
||||
src: '^/another-main$',
|
||||
dest: '/main.html',
|
||||
});
|
||||
expect(config.routes).not.toContainEqual({
|
||||
src: '^/another-test$',
|
||||
dest: '/test.html',
|
||||
});
|
||||
|
||||
client.localConfigPath = 'vercel-test.json';
|
||||
exitCode = await build(client);
|
||||
expect(exitCode).toEqual(0);
|
||||
|
||||
config = await fs.readJSON(join(output, 'config.json'));
|
||||
expect(config.routes).not.toContainEqual({
|
||||
src: '^/another-main$',
|
||||
dest: '/main.html',
|
||||
});
|
||||
expect(config.routes).toContainEqual({
|
||||
src: '^/another-test$',
|
||||
dest: '/test.html',
|
||||
});
|
||||
} finally {
|
||||
process.chdir(originalCwd);
|
||||
delete client.localConfigPath;
|
||||
delete process.env.__VERCEL_BUILD_RUNNING;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,6 +3,8 @@ import { emoji } from '../../../src/util/emoji';
|
||||
import { client } from '../../mocks/client';
|
||||
import { useUser } from '../../mocks/user';
|
||||
|
||||
jest.setTimeout(10000);
|
||||
|
||||
describe('login', () => {
|
||||
it('should not allow the `--token` flag', async () => {
|
||||
client.setArgv('login', '--token', 'foo');
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import ms from 'ms';
|
||||
import { join } from 'path';
|
||||
import { remove } from 'fs-extra';
|
||||
import { getWriteableDirectory } from '@vercel/build-utils';
|
||||
@@ -10,7 +9,7 @@ import {
|
||||
import vercelNextPkg from '@vercel/next/package.json';
|
||||
import vercelNodePkg from '@vercel/node/package.json';
|
||||
|
||||
jest.setTimeout(ms('30 seconds'));
|
||||
jest.setTimeout(60 * 1000);
|
||||
|
||||
const repoRoot = join(__dirname, '../../../../../..');
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ describe('sortBuilders()', () => {
|
||||
},
|
||||
{
|
||||
name: 'should sort @vercel/remix from end to beginning',
|
||||
input: ['@vercel/python', '@vercel/node', '@vercel/remix'],
|
||||
output: ['@vercel/remix', '@vercel/python', '@vercel/node'],
|
||||
input: ['@vercel/python', '@vercel/node', '@vercel/remix-builder'],
|
||||
output: ['@vercel/remix-builder', '@vercel/python', '@vercel/node'],
|
||||
},
|
||||
{
|
||||
name: 'should sort @vercel/redwood from beginning to beginning',
|
||||
|
||||
@@ -15,6 +15,8 @@ import { useUser } from '../../../mocks/user';
|
||||
import { defaultProject, useProject } from '../../../mocks/project';
|
||||
import { Project } from '@vercel-internals/types';
|
||||
|
||||
jest.setTimeout(10 * 1000);
|
||||
|
||||
const fixture = (name: string) =>
|
||||
join(__dirname, '../../../fixtures/unit/create-git-meta', name);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/client",
|
||||
"version": "12.4.3",
|
||||
"version": "12.4.6",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"homepage": "https://vercel.com",
|
||||
@@ -43,8 +43,8 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "6.3.3",
|
||||
"@vercel/routing-utils": "2.1.10",
|
||||
"@vercel/build-utils": "6.5.0",
|
||||
"@vercel/routing-utils": "2.1.11",
|
||||
"@zeit/fetch": "5.2.0",
|
||||
"async-retry": "1.2.3",
|
||||
"async-sema": "3.0.0",
|
||||
|
||||
@@ -30,19 +30,19 @@ export interface Deployment {
|
||||
public: boolean;
|
||||
ownerId: string;
|
||||
readyState:
|
||||
| 'INITIALIZING'
|
||||
| 'ANALYZING'
|
||||
| 'BUILDING'
|
||||
| 'DEPLOYING'
|
||||
| 'READY'
|
||||
| 'ERROR';
|
||||
| 'INITIALIZING'
|
||||
| 'ANALYZING'
|
||||
| 'BUILDING'
|
||||
| 'DEPLOYING'
|
||||
| 'READY'
|
||||
| 'ERROR';
|
||||
state?:
|
||||
| 'INITIALIZING'
|
||||
| 'ANALYZING'
|
||||
| 'BUILDING'
|
||||
| 'DEPLOYING'
|
||||
| 'READY'
|
||||
| 'ERROR';
|
||||
| 'INITIALIZING'
|
||||
| 'ANALYZING'
|
||||
| 'BUILDING'
|
||||
| 'DEPLOYING'
|
||||
| 'READY'
|
||||
| 'ERROR';
|
||||
createdAt: string;
|
||||
createdIn: string;
|
||||
env: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/frameworks",
|
||||
"version": "1.3.2",
|
||||
"version": "1.3.3",
|
||||
"main": "./dist/frameworks.js",
|
||||
"types": "./dist/frameworks.d.ts",
|
||||
"files": [
|
||||
@@ -21,7 +21,7 @@
|
||||
"@types/js-yaml": "3.12.1",
|
||||
"@types/node": "14.18.33",
|
||||
"@types/node-fetch": "2.5.8",
|
||||
"@vercel/routing-utils": "2.1.10",
|
||||
"@vercel/routing-utils": "2.1.11",
|
||||
"ajv": "6.12.2",
|
||||
"typescript": "4.3.4"
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ export const frameworks = [
|
||||
description: 'A new Remix app — the result of running `npx create-remix`.',
|
||||
website: 'https://remix.run',
|
||||
sort: 6,
|
||||
useRuntime: { src: 'package.json', use: '@vercel/remix' },
|
||||
useRuntime: { src: 'package.json', use: '@vercel/remix-builder' },
|
||||
ignoreRuntimes: ['@vercel/node'],
|
||||
detectors: {
|
||||
some: [
|
||||
|
||||
@@ -30,7 +30,7 @@ export async function readConfigFile<T>(
|
||||
if (name.endsWith('.json')) {
|
||||
return JSON.parse(str) as T;
|
||||
} else if (name.endsWith('.toml')) {
|
||||
return (toml.parse(str) as unknown) as T;
|
||||
return toml.parse(str) as unknown as T;
|
||||
} else if (name.endsWith('.yaml') || name.endsWith('.yml')) {
|
||||
return yaml.safeLoad(str, { filename: name }) as T;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/fs-detectors",
|
||||
"version": "3.8.3",
|
||||
"version": "3.8.6",
|
||||
"description": "Vercel filesystem detectors",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -20,8 +20,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/error-utils": "1.0.8",
|
||||
"@vercel/frameworks": "1.3.2",
|
||||
"@vercel/routing-utils": "2.1.10",
|
||||
"@vercel/frameworks": "1.3.3",
|
||||
"@vercel/routing-utils": "2.1.11",
|
||||
"glob": "8.0.3",
|
||||
"js-yaml": "4.1.0",
|
||||
"json5": "2.2.2",
|
||||
@@ -35,7 +35,7 @@
|
||||
"@types/minimatch": "3.0.5",
|
||||
"@types/node": "14.18.33",
|
||||
"@types/semver": "7.3.10",
|
||||
"@vercel/build-utils": "6.3.3",
|
||||
"@vercel/build-utils": "6.5.0",
|
||||
"typescript": "4.3.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/gatsby-plugin-vercel-builder",
|
||||
"version": "1.2.0",
|
||||
"version": "1.2.4",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist",
|
||||
@@ -15,9 +15,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@sinclair/typebox": "0.25.24",
|
||||
"@vercel/build-utils": "6.3.3",
|
||||
"@vercel/node": "2.9.11",
|
||||
"@vercel/routing-utils": "2.1.10",
|
||||
"@vercel/build-utils": "6.5.0",
|
||||
"@vercel/node": "2.10.0",
|
||||
"@vercel/routing-utils": "2.1.11",
|
||||
"esbuild": "0.14.47",
|
||||
"etag": "1.8.1",
|
||||
"fs-extra": "11.1.0"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { join, dirname } from 'path';
|
||||
import { copy, move, ensureDir } from 'fs-extra';
|
||||
import { join } from 'path';
|
||||
import { hardLinkDir } from '@vercel/build-utils';
|
||||
|
||||
export async function createStaticDir(prefix?: string) {
|
||||
const publicDir = join(process.cwd(), 'public');
|
||||
@@ -10,14 +10,13 @@ export async function createStaticDir(prefix?: string) {
|
||||
'static',
|
||||
prefix ?? ''
|
||||
);
|
||||
await ensureDir(dirname(targetDir));
|
||||
|
||||
try {
|
||||
await move(publicDir, targetDir);
|
||||
await hardLinkDir(publicDir, [targetDir]);
|
||||
} catch (err: any) {
|
||||
console.error(
|
||||
`Failed to move "public" dir from "${publicDir}" to "${targetDir}". Copying instead.`,
|
||||
err
|
||||
console.error(err);
|
||||
throw new Error(
|
||||
`Failed to hardlink (or copy) "public" dir files from "${publicDir}" to "${targetDir}".`
|
||||
);
|
||||
await copy(publicDir, targetDir);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,33 @@
|
||||
import tar from 'tar';
|
||||
import execa from 'execa';
|
||||
import fetch from 'node-fetch';
|
||||
import { mkdirp, pathExists, readFile } from 'fs-extra';
|
||||
import { join, delimiter } from 'path';
|
||||
import {
|
||||
createWriteStream,
|
||||
mkdirp,
|
||||
pathExists,
|
||||
readFile,
|
||||
remove,
|
||||
symlink,
|
||||
} from 'fs-extra';
|
||||
import { join, delimiter, dirname } from 'path';
|
||||
import stringArgv from 'string-argv';
|
||||
import { debug } from '@vercel/build-utils';
|
||||
import { cloneEnv, debug } from '@vercel/build-utils';
|
||||
import { pipeline } from 'stream';
|
||||
import { promisify } from 'util';
|
||||
import { tmpdir } from 'os';
|
||||
import yauzl from 'yauzl-promise';
|
||||
import XDGAppPaths from 'xdg-app-paths';
|
||||
import type { Env } from '@vercel/build-utils';
|
||||
|
||||
const streamPipeline = promisify(pipeline);
|
||||
|
||||
const versionMap = new Map([
|
||||
['1.19', '1.19.5'],
|
||||
['1.18', '1.18.1'],
|
||||
['1.17', '1.17.3'],
|
||||
['1.16', '1.16.10'],
|
||||
['1.15', '1.15.8'],
|
||||
['1.20', '1.20.1'],
|
||||
['1.19', '1.19.6'],
|
||||
['1.18', '1.18.10'],
|
||||
['1.17', '1.17.13'],
|
||||
['1.16', '1.16.15'],
|
||||
['1.15', '1.15.15'],
|
||||
['1.14', '1.14.15'],
|
||||
['1.13', '1.13.15'],
|
||||
]);
|
||||
@@ -20,17 +37,27 @@ const archMap = new Map([
|
||||
]);
|
||||
const platformMap = new Map([['win32', 'windows']]);
|
||||
export const cacheDir = join('.vercel', 'cache', 'golang');
|
||||
const getGoDir = (workPath: string) => join(workPath, cacheDir);
|
||||
const GO_FLAGS = process.platform === 'win32' ? [] : ['-ldflags', '-s -w'];
|
||||
const GO_MIN_VERSION = 13;
|
||||
const getPlatform = (p: string) => platformMap.get(p) || p;
|
||||
const getArch = (a: string) => archMap.get(a) || a;
|
||||
const getGoUrl = (version: string, platform: string, arch: string) => {
|
||||
|
||||
function getGoUrl(version: string) {
|
||||
const { arch, platform } = process;
|
||||
const goArch = getArch(arch);
|
||||
const goPlatform = getPlatform(platform);
|
||||
const ext = platform === 'win32' ? 'zip' : 'tar.gz';
|
||||
return `https://dl.google.com/go/go${version}.${goPlatform}-${goArch}.${ext}`;
|
||||
};
|
||||
const filename = `go${version}.${goPlatform}-${goArch}.${ext}`;
|
||||
return {
|
||||
filename,
|
||||
url: `https://dl.google.com/go/${filename}`,
|
||||
};
|
||||
}
|
||||
|
||||
export const goGlobalCachePath = join(
|
||||
XDGAppPaths('com.vercel.cli').cache(),
|
||||
'golang'
|
||||
);
|
||||
|
||||
export const OUT_EXTENSION = process.platform === 'win32' ? '.exe' : '';
|
||||
|
||||
@@ -39,39 +66,31 @@ export async function getAnalyzedEntrypoint(
|
||||
filePath: string,
|
||||
modulePath: string
|
||||
) {
|
||||
debug('Analyzing entrypoint %o with modulePath %o', filePath, modulePath);
|
||||
const bin = join(__dirname, `analyze${OUT_EXTENSION}`);
|
||||
|
||||
const isAnalyzeExist = await pathExists(bin);
|
||||
if (!isAnalyzeExist) {
|
||||
debug(`Building analyze bin: ${bin}`);
|
||||
const src = join(__dirname, 'util', 'analyze.go');
|
||||
const go = await downloadGo(workPath, modulePath);
|
||||
const go = await createGo({
|
||||
modulePath,
|
||||
workPath,
|
||||
});
|
||||
await go.build(src, bin);
|
||||
}
|
||||
|
||||
debug(`Analyzing entrypoint ${filePath} with modulePath ${modulePath}`);
|
||||
const args = [`-modpath=${modulePath}`, filePath];
|
||||
|
||||
const analyzed = await execa.stdout(bin, args);
|
||||
debug('Analyzed entrypoint %o', analyzed);
|
||||
debug(`Analyzed entrypoint ${analyzed}`);
|
||||
return analyzed;
|
||||
}
|
||||
|
||||
// Creates a `$GOPATH` directory tree, as per `go help gopath` instructions.
|
||||
// Without this, `go` won't recognize the `$GOPATH`.
|
||||
function createGoPathTree(goPath: string, platform: string, arch: string) {
|
||||
const tuple = `${getPlatform(platform)}_${getArch(arch)}`;
|
||||
debug('Creating GOPATH directory structure for %o (%s)', goPath, tuple);
|
||||
return Promise.all([
|
||||
mkdirp(join(goPath, 'bin')),
|
||||
mkdirp(join(goPath, 'pkg', tuple)),
|
||||
]);
|
||||
}
|
||||
|
||||
class GoWrapper {
|
||||
private env: { [key: string]: string };
|
||||
private env: Env;
|
||||
private opts: execa.Options;
|
||||
|
||||
constructor(env: { [key: string]: string }, opts: execa.Options = {}) {
|
||||
constructor(env: Env, opts: execa.Options = {}) {
|
||||
if (!opts.cwd) {
|
||||
opts.cwd = process.cwd();
|
||||
}
|
||||
@@ -81,8 +100,12 @@ class GoWrapper {
|
||||
|
||||
private execute(...args: string[]) {
|
||||
const { opts, env } = this;
|
||||
debug('Exec %o', `go ${args.join(' ')}`);
|
||||
return execa('go', args, { stdio: 'pipe', ...opts, env });
|
||||
debug(
|
||||
`Exec: go ${args
|
||||
.map(a => (a.includes(' ') ? `"${a}"` : a))
|
||||
.join(' ')} CWD=${opts.cwd}`
|
||||
);
|
||||
return execa('go', args, { stdio: 'inherit', ...opts, env });
|
||||
}
|
||||
|
||||
mod() {
|
||||
@@ -92,16 +115,16 @@ class GoWrapper {
|
||||
get(src?: string) {
|
||||
const args = ['get'];
|
||||
if (src) {
|
||||
debug('Fetching `go` dependencies for file %o', src);
|
||||
debug(`Fetching 'go' dependencies for file ${src}`);
|
||||
args.push(src);
|
||||
} else {
|
||||
debug('Fetching `go` dependencies for cwd %o', this.opts.cwd);
|
||||
debug(`Fetching 'go' dependencies for cwd ${this.opts.cwd}`);
|
||||
}
|
||||
return this.execute(...args);
|
||||
}
|
||||
|
||||
build(src: string | string[], dest: string) {
|
||||
debug('Building optimized `go` binary %o -> %o', src, dest);
|
||||
debug(`Building optimized 'go' binary ${src} -> ${dest}`);
|
||||
const sources = Array.isArray(src) ? src : [src];
|
||||
|
||||
const flags = process.env.GO_BUILD_FLAGS
|
||||
@@ -112,72 +135,222 @@ class GoWrapper {
|
||||
}
|
||||
}
|
||||
|
||||
export async function createGo(
|
||||
workPath: string,
|
||||
goPath: string,
|
||||
platform = process.platform,
|
||||
arch = process.arch,
|
||||
opts: execa.Options = {},
|
||||
goMod = false
|
||||
) {
|
||||
const binPath = join(getGoDir(workPath), 'bin');
|
||||
debug(`Adding ${binPath} to PATH`);
|
||||
const path = `${binPath}${delimiter}${process.env.PATH}`;
|
||||
const env: { [key: string]: string } = {
|
||||
...process.env,
|
||||
PATH: path,
|
||||
GOPATH: goPath,
|
||||
...opts.env,
|
||||
};
|
||||
if (goMod) {
|
||||
env.GO111MODULE = 'on';
|
||||
type CreateGoOptions = {
|
||||
modulePath?: string;
|
||||
opts?: execa.Options;
|
||||
workPath: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes a `GoWrapper` instance.
|
||||
*
|
||||
* This function determines the Go version to use by first looking in the
|
||||
* `go.mod`, if exists, otherwise uses the latest version from the version
|
||||
* map.
|
||||
*
|
||||
* Next it will attempt to find the desired Go version by checking the
|
||||
* following locations:
|
||||
* 1. The "local" project cache directory (e.g. `.vercel/cache/golang`)
|
||||
* 2. The "global" cache directory (e.g. `~/.cache/com.vercel.com/golang`)
|
||||
* 3. The system PATH
|
||||
*
|
||||
* If the Go version is not found, it's downloaded and installed in the
|
||||
* global cache directory so it can be shared across projects. When using
|
||||
* Linux or macOS, it creates a symlink from the global cache to the local
|
||||
* cache directory so that `prepareCache` will persist it.
|
||||
*
|
||||
* @param modulePath The path possibly containing a `go.mod` file
|
||||
* @param opts `execa` options (`cwd`, `env`, `stdio`, etc)
|
||||
* @param workPath The path to the project to be built
|
||||
* @returns An initialized `GoWrapper` instance
|
||||
*/
|
||||
export async function createGo({
|
||||
modulePath,
|
||||
opts = {},
|
||||
workPath,
|
||||
}: CreateGoOptions): Promise<GoWrapper> {
|
||||
// parse the `go.mod`, if exists
|
||||
let goPreferredVersion: string | undefined;
|
||||
if (modulePath) {
|
||||
goPreferredVersion = await parseGoModVersion(modulePath);
|
||||
}
|
||||
await createGoPathTree(goPath, platform, arch);
|
||||
|
||||
// default to newest (first) supported go version
|
||||
const goSelectedVersion =
|
||||
goPreferredVersion || Array.from(versionMap.values())[0];
|
||||
|
||||
const env = cloneEnv(process.env, opts.env);
|
||||
const { PATH } = env;
|
||||
const { platform } = process;
|
||||
const goGlobalCacheDir = join(
|
||||
goGlobalCachePath,
|
||||
`${goSelectedVersion}_${platform}_${process.arch}`
|
||||
);
|
||||
const goCacheDir = join(workPath, cacheDir);
|
||||
|
||||
if (goPreferredVersion) {
|
||||
debug(`Preferred go version ${goPreferredVersion} (from go.mod)`);
|
||||
env.GO111MODULE = 'on';
|
||||
} else {
|
||||
debug(
|
||||
`Preferred go version ${goSelectedVersion} (latest from version map)`
|
||||
);
|
||||
}
|
||||
|
||||
const setGoEnv = async (goDir: string | null) => {
|
||||
if (platform !== 'win32' && goDir === goGlobalCacheDir) {
|
||||
debug(`Symlinking ${goDir} -> ${goCacheDir}`);
|
||||
await remove(goCacheDir);
|
||||
await mkdirp(dirname(goCacheDir));
|
||||
await symlink(goDir, goCacheDir);
|
||||
goDir = goCacheDir;
|
||||
}
|
||||
env.GOROOT = goDir || undefined;
|
||||
env.PATH = goDir ? `${join(goDir, 'bin')}${delimiter}${PATH}` : PATH;
|
||||
};
|
||||
|
||||
// try each of these Go directories looking for the version we need
|
||||
const goDirs = {
|
||||
'local cache': goCacheDir,
|
||||
'global cache': goGlobalCacheDir,
|
||||
'system PATH': null,
|
||||
};
|
||||
|
||||
for (const [label, goDir] of Object.entries(goDirs)) {
|
||||
try {
|
||||
const goBinDir = goDir && join(goDir, 'bin');
|
||||
if (goBinDir && !(await pathExists(goBinDir))) {
|
||||
debug(`Go not found in ${label}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
env.GOROOT = goDir || undefined;
|
||||
env.PATH = goBinDir || PATH;
|
||||
|
||||
const { stdout } = await execa('go', ['version'], { env });
|
||||
const { minor, short, version } = parseGoVersionString(stdout);
|
||||
|
||||
if (minor < GO_MIN_VERSION) {
|
||||
debug(`Found go ${version} in ${label}, but version is unsupported`);
|
||||
}
|
||||
if (version === goSelectedVersion || short === goSelectedVersion) {
|
||||
console.log(`Selected go ${version} (from ${label})`);
|
||||
|
||||
await setGoEnv(goDir);
|
||||
return new GoWrapper(env, opts);
|
||||
} else {
|
||||
debug(`Found go ${version} in ${label}, but need ${goSelectedVersion}`);
|
||||
}
|
||||
} catch {
|
||||
debug(`Go not found in ${label}`);
|
||||
}
|
||||
}
|
||||
|
||||
// we need to download and cache the desired `go` version
|
||||
await download({
|
||||
dest: goGlobalCacheDir,
|
||||
version: goSelectedVersion,
|
||||
});
|
||||
|
||||
await setGoEnv(goGlobalCacheDir);
|
||||
return new GoWrapper(env, opts);
|
||||
}
|
||||
|
||||
export async function downloadGo(workPath: string, modulePath: string) {
|
||||
const dir = getGoDir(workPath);
|
||||
const { platform, arch } = process;
|
||||
const version = await parseGoVersion(modulePath);
|
||||
/**
|
||||
* Download and installs the Go distribution.
|
||||
*
|
||||
* @param dest The directory to install Go into. If directory exists, it is
|
||||
* first deleted before installing.
|
||||
* @param version The Go version to download
|
||||
*/
|
||||
async function download({ dest, version }: { dest: string; version: string }) {
|
||||
const { filename, url } = getGoUrl(version);
|
||||
console.log(`Downloading go: ${url}`);
|
||||
const res = await fetch(url);
|
||||
|
||||
// Check if `go` is already installed in user's `$PATH`
|
||||
const { failed, stdout } = await execa('go', ['version'], { reject: false });
|
||||
|
||||
if (!failed && parseInt(stdout.split('.')[1]) >= GO_MIN_VERSION) {
|
||||
debug('Using system installed version of `go`: %o', stdout.trim());
|
||||
return createGo(workPath, dir, platform, arch);
|
||||
if (!res.ok) {
|
||||
throw new Error(`Failed to download: ${url} (${res.status})`);
|
||||
}
|
||||
|
||||
// Check `go` bin in cacheDir
|
||||
const isGoExist = await pathExists(join(dir, 'bin'));
|
||||
if (!isGoExist) {
|
||||
debug('Installing `go` v%s to %o for %s %s', version, dir, platform, arch);
|
||||
const url = getGoUrl(version, platform, arch);
|
||||
debug('Downloading `go` URL: %o', url);
|
||||
const res = await fetch(url);
|
||||
debug(`Installing go ${version} to ${dest}`);
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Failed to download: ${url} (${res.status})`);
|
||||
await remove(dest);
|
||||
await mkdirp(dest);
|
||||
|
||||
if (/\.zip$/.test(filename)) {
|
||||
const zipFile = join(tmpdir(), filename);
|
||||
try {
|
||||
await streamPipeline(res.body, createWriteStream(zipFile));
|
||||
const zip = await yauzl.open(zipFile);
|
||||
let entry = await zip.readEntry();
|
||||
while (entry) {
|
||||
const fileName = entry.fileName.split('/').slice(1).join('/');
|
||||
|
||||
if (fileName) {
|
||||
const destPath = join(dest, fileName);
|
||||
|
||||
if (/\/$/.test(fileName)) {
|
||||
await mkdirp(destPath);
|
||||
} else {
|
||||
const [entryStream] = await Promise.all([
|
||||
entry.openReadStream(),
|
||||
mkdirp(dirname(destPath)),
|
||||
]);
|
||||
const out = createWriteStream(destPath);
|
||||
await streamPipeline(entryStream, out);
|
||||
}
|
||||
}
|
||||
|
||||
entry = await zip.readEntry();
|
||||
}
|
||||
} finally {
|
||||
await remove(zipFile);
|
||||
}
|
||||
|
||||
// TODO: use a zip extractor when `ext === "zip"`
|
||||
await mkdirp(dir);
|
||||
await new Promise((resolve, reject) => {
|
||||
res.body
|
||||
.on('error', reject)
|
||||
.pipe(tar.extract({ cwd: dir, strip: 1 }))
|
||||
.on('error', reject)
|
||||
.on('finish', resolve);
|
||||
});
|
||||
return;
|
||||
}
|
||||
return createGo(workPath, dir, platform, arch);
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
res.body
|
||||
.on('error', reject)
|
||||
.pipe(tar.extract({ cwd: dest, strip: 1 }))
|
||||
.on('error', reject)
|
||||
.on('finish', resolve);
|
||||
});
|
||||
}
|
||||
|
||||
async function parseGoVersion(modulePath: string): Promise<string> {
|
||||
// default to newest (first)
|
||||
let version = Array.from(versionMap.values())[0];
|
||||
const goVersionRegExp = /(\d+)\.(\d+)(?:\.(\d+))?/;
|
||||
|
||||
/**
|
||||
* Parses the raw output from `go version` and returns the version parts.
|
||||
*
|
||||
* @param goVersionOutput The output from `go version`
|
||||
*/
|
||||
function parseGoVersionString(goVersionOutput: string) {
|
||||
const matches = goVersionOutput.match(goVersionRegExp) || [];
|
||||
const major = parseInt(matches[1], 10);
|
||||
const minor = parseInt(matches[2], 10);
|
||||
const patch = parseInt(matches[3] || '0', 10);
|
||||
return {
|
||||
version: `${major}.${minor}.${patch}`,
|
||||
short: `${major}.${minor}`,
|
||||
major,
|
||||
minor,
|
||||
patch,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to parse the preferred Go version from the `go.mod` file.
|
||||
*
|
||||
* @param modulePath The directory containing the `go.mod` file
|
||||
* @returns
|
||||
*/
|
||||
async function parseGoModVersion(
|
||||
modulePath: string
|
||||
): Promise<string | undefined> {
|
||||
let version;
|
||||
const file = join(modulePath, 'go.mod');
|
||||
|
||||
try {
|
||||
const content = await readFile(file, 'utf8');
|
||||
const matches = /^go (\d+)\.(\d+)\.?$/gm.exec(content) || [];
|
||||
@@ -189,7 +362,7 @@ async function parseGoVersion(modulePath: string): Promise<string> {
|
||||
} else {
|
||||
console.log(`Warning: Unknown Go version in ${file}`);
|
||||
}
|
||||
} catch (err) {
|
||||
} catch (err: any) {
|
||||
if (err.code === 'ENOENT') {
|
||||
debug(`File not found: ${file}`);
|
||||
} else {
|
||||
@@ -197,6 +370,5 @@ async function parseGoVersion(modulePath: string): Promise<string> {
|
||||
}
|
||||
}
|
||||
|
||||
debug(`Selected Go version ${version}`);
|
||||
return version;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module main
|
||||
|
||||
go 1.18
|
||||
go 1.20
|
||||
|
||||
// This file exists to allow debugging of Go files within this package,
|
||||
// such as `util/analyze.go`.
|
||||
|
||||
@@ -1,19 +1,22 @@
|
||||
import execa from 'execa';
|
||||
import retry from 'async-retry';
|
||||
import { homedir, tmpdir } from 'os';
|
||||
import { execFileSync, spawn } from 'child_process';
|
||||
import { spawn } from 'child_process';
|
||||
import { Readable } from 'stream';
|
||||
import once from '@tootallnate/once';
|
||||
import { join, dirname, basename, normalize, sep } from 'path';
|
||||
import { join, dirname, basename, normalize, posix, sep } from 'path';
|
||||
import {
|
||||
readFile,
|
||||
writeFile,
|
||||
lstat,
|
||||
pathExists,
|
||||
mkdirp,
|
||||
move,
|
||||
readlink,
|
||||
remove,
|
||||
rmdir,
|
||||
readdir,
|
||||
unlink,
|
||||
} from 'fs-extra';
|
||||
import {
|
||||
BuildOptions,
|
||||
@@ -33,19 +36,20 @@ import {
|
||||
const TMP = tmpdir();
|
||||
|
||||
import {
|
||||
cacheDir,
|
||||
createGo,
|
||||
getAnalyzedEntrypoint,
|
||||
cacheDir,
|
||||
OUT_EXTENSION,
|
||||
} from './go-helpers';
|
||||
|
||||
const handlerFileName = `handler${OUT_EXTENSION}`;
|
||||
|
||||
export { shouldServe };
|
||||
|
||||
interface Analyzed {
|
||||
found?: boolean;
|
||||
packageName: string;
|
||||
functionName: string;
|
||||
packageName: string;
|
||||
watch?: boolean;
|
||||
}
|
||||
|
||||
interface PortInfo {
|
||||
@@ -147,7 +151,7 @@ export async function build({
|
||||
}
|
||||
|
||||
const entrypointAbsolute = join(workPath, entrypoint);
|
||||
const entrypointArr = entrypoint.split(sep);
|
||||
const entrypointArr = entrypoint.split(posix.sep);
|
||||
|
||||
debug(`Parsing AST for "${entrypoint}"`);
|
||||
let analyzed: string;
|
||||
@@ -163,7 +167,7 @@ export async function build({
|
||||
dirname(goModAbsPath)
|
||||
);
|
||||
} catch (err) {
|
||||
console.log(`Failed to parse AST for "${entrypoint}"`);
|
||||
console.error(`Failed to parse AST for "${entrypoint}"`);
|
||||
throw err;
|
||||
}
|
||||
|
||||
@@ -173,7 +177,7 @@ export async function build({
|
||||
Learn more: https://vercel.com/docs/runtimes#official-runtimes/go
|
||||
`
|
||||
);
|
||||
console.log(err.message);
|
||||
console.error(err.message);
|
||||
throw err;
|
||||
}
|
||||
|
||||
@@ -289,18 +293,19 @@ export async function build({
|
||||
// we need our `main.go` to be called something else
|
||||
const mainGoFileName = 'main__vc__go__.go';
|
||||
|
||||
if (packageName !== 'main') {
|
||||
const go = await createGo(
|
||||
workPath,
|
||||
goPath,
|
||||
process.platform,
|
||||
process.arch,
|
||||
{
|
||||
cwd: entrypointDirname,
|
||||
stdio: 'inherit',
|
||||
const go = await createGo({
|
||||
modulePath: goModPath,
|
||||
opts: {
|
||||
cwd: entrypointDirname,
|
||||
env: {
|
||||
GOARCH: 'amd64',
|
||||
GOOS: 'linux',
|
||||
},
|
||||
true
|
||||
);
|
||||
},
|
||||
workPath,
|
||||
});
|
||||
|
||||
if (packageName !== 'main') {
|
||||
if (!isGoModExist) {
|
||||
try {
|
||||
const defaultGoModContent = `module ${packageName}`;
|
||||
@@ -321,7 +326,7 @@ export async function build({
|
||||
from: join(entrypointDirname, 'go.sum'),
|
||||
});
|
||||
} catch (err) {
|
||||
console.log(`Failed to create default go.mod for ${packageName}`);
|
||||
console.error(`Failed to create default go.mod for ${packageName}`);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
@@ -353,6 +358,7 @@ export async function build({
|
||||
if (isGoModExist && isGoModInRootDir) {
|
||||
debug('[mod-root] Write main file to ' + downloadPath);
|
||||
await writeFile(join(downloadPath, mainGoFileName), mainModGoContents);
|
||||
|
||||
undoFileActions.push({
|
||||
to: undefined, // delete
|
||||
from: join(downloadPath, mainGoFileName),
|
||||
@@ -403,7 +409,7 @@ export async function build({
|
||||
undoDirectoryCreation.push(dirname(finalDestination));
|
||||
}
|
||||
} catch (err) {
|
||||
console.log('Failed to move entry to package folder');
|
||||
console.error('Failed to move entry to package folder');
|
||||
throw err;
|
||||
}
|
||||
|
||||
@@ -421,7 +427,7 @@ export async function build({
|
||||
// ensure go.mod up-to-date
|
||||
await go.mod();
|
||||
} catch (err) {
|
||||
console.log('failed to `go mod tidy`');
|
||||
console.error('failed to `go mod tidy`');
|
||||
throw err;
|
||||
}
|
||||
|
||||
@@ -433,23 +439,13 @@ export async function build({
|
||||
|
||||
await go.build(src, destPath);
|
||||
} catch (err) {
|
||||
console.log('failed to `go build`');
|
||||
console.error('failed to `go build`');
|
||||
throw err;
|
||||
}
|
||||
} else {
|
||||
// legacy mode
|
||||
// we need `main.go` in the same dir as the entrypoint,
|
||||
// otherwise `go build` will refuse to build
|
||||
const go = await createGo(
|
||||
workPath,
|
||||
goPath,
|
||||
process.platform,
|
||||
process.arch,
|
||||
{
|
||||
cwd: entrypointDirname,
|
||||
},
|
||||
false
|
||||
);
|
||||
const originalMainGoContents = await readFile(
|
||||
join(__dirname, 'main.go'),
|
||||
'utf8'
|
||||
@@ -472,7 +468,7 @@ export async function build({
|
||||
try {
|
||||
await go.get();
|
||||
} catch (err) {
|
||||
console.log('Failed to `go get`');
|
||||
console.error('Failed to `go get`');
|
||||
throw err;
|
||||
}
|
||||
|
||||
@@ -485,7 +481,7 @@ export async function build({
|
||||
].map(file => normalize(file));
|
||||
await go.build(src, destPath);
|
||||
} catch (err) {
|
||||
console.log('failed to `go build`');
|
||||
console.error('failed to `go build`');
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
@@ -513,7 +509,9 @@ export async function build({
|
||||
undoFunctionRenames
|
||||
);
|
||||
} catch (error) {
|
||||
console.log(`Build cleanup failed: ${error.message}`);
|
||||
if (error instanceof Error) {
|
||||
console.error(`Build cleanup failed: ${error.message}`);
|
||||
}
|
||||
debug('Cleanup Error: ' + error);
|
||||
}
|
||||
}
|
||||
@@ -640,6 +638,19 @@ async function copyDevServer(
|
||||
await writeFile(join(dest, 'vercel-dev-server-main.go'), patched);
|
||||
}
|
||||
|
||||
async function writeDefaultGoMod(
|
||||
entrypointDirname: string,
|
||||
packageName: string
|
||||
) {
|
||||
const defaultGoModContent = `module ${packageName}`;
|
||||
|
||||
await writeFile(
|
||||
join(entrypointDirname, 'go.mod'),
|
||||
defaultGoModContent,
|
||||
'utf-8'
|
||||
);
|
||||
}
|
||||
|
||||
export async function startDevServer(
|
||||
opts: StartDevServerOptions
|
||||
): Promise<StartDevServerResult> {
|
||||
@@ -678,6 +689,7 @@ Learn more: https://vercel.com/docs/runtimes#official-runtimes/go`
|
||||
await Promise.all([
|
||||
copyEntrypoint(entrypointWithExt, tmpPackage),
|
||||
copyDevServer(analyzed.functionName, tmpPackage),
|
||||
goModAbsPathDir ? null : writeDefaultGoMod(tmp, analyzed.packageName),
|
||||
]);
|
||||
|
||||
const portFile = join(
|
||||
@@ -693,13 +705,22 @@ Learn more: https://vercel.com/docs/runtimes#official-runtimes/go`
|
||||
process.platform === 'win32' ? '.exe' : ''
|
||||
}`;
|
||||
|
||||
debug(`SPAWNING go build -o ${executable} ./... CWD=${tmp}`);
|
||||
execFileSync('go', ['build', '-o', executable, './...'], {
|
||||
cwd: tmp,
|
||||
env,
|
||||
stdio: 'inherit',
|
||||
});
|
||||
// Note: We must run `go build`, then manually spawn the dev server instead
|
||||
// of spawning `go run`. See https://github.com/vercel/vercel/pull/8718 for
|
||||
// more info.
|
||||
|
||||
// build the dev server
|
||||
const go = await createGo({
|
||||
modulePath: goModAbsPathDir,
|
||||
opts: {
|
||||
cwd: tmp,
|
||||
env,
|
||||
},
|
||||
workPath,
|
||||
});
|
||||
await go.build('./...', executable);
|
||||
|
||||
// run the dev server
|
||||
debug(`SPAWNING ${executable} CWD=${tmp}`);
|
||||
const child = spawn(executable, [], {
|
||||
cwd: tmp,
|
||||
@@ -770,10 +791,10 @@ async function waitForPortFile_(opts: {
|
||||
try {
|
||||
const port = Number(await readFile(opts.portFile, 'ascii'));
|
||||
retry(() => remove(opts.portFile)).catch((err: Error) => {
|
||||
console.error('Could not delete port file: %j: %s', opts.portFile, err);
|
||||
console.error(`Could not delete port file: ${opts.portFile}: ${err}`);
|
||||
});
|
||||
return { port };
|
||||
} catch (err) {
|
||||
} catch (err: any) {
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
@@ -784,6 +805,25 @@ async function waitForPortFile_(opts: {
|
||||
export async function prepareCache({
|
||||
workPath,
|
||||
}: PrepareCacheOptions): Promise<Files> {
|
||||
// When building the project for the first time, there won't be a cache and
|
||||
// `createGo()` will have downloaded Go to the global cache directory, then
|
||||
// symlinked it to the local `cacheDir`.
|
||||
//
|
||||
// If we detect the `cacheDir` is a symlink, unlink it, then move the global
|
||||
// cache directory into the local cache directory so that it can be
|
||||
// persisted.
|
||||
//
|
||||
// On the next build, the local cache will be restored and `createGo()` will
|
||||
// use it unless the preferred Go version changed in the `go.mod`.
|
||||
const goCacheDir = join(workPath, cacheDir);
|
||||
const stat = await lstat(goCacheDir);
|
||||
if (stat.isSymbolicLink()) {
|
||||
const goGlobalCacheDir = await readlink(goCacheDir);
|
||||
debug(`Preparing cache by moving ${goGlobalCacheDir} -> ${goCacheDir}`);
|
||||
await unlink(goCacheDir);
|
||||
await move(goGlobalCacheDir, goCacheDir);
|
||||
}
|
||||
|
||||
const cache = await glob(`${cacheDir}/**`, workPath);
|
||||
return cache;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/go",
|
||||
"version": "2.3.10",
|
||||
"version": "2.4.1",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
|
||||
@@ -36,7 +36,8 @@
|
||||
"@types/node": "14.18.33",
|
||||
"@types/node-fetch": "^2.3.0",
|
||||
"@types/tar": "^4.0.0",
|
||||
"@vercel/build-utils": "6.3.3",
|
||||
"@types/yauzl-promise": "2.1.0",
|
||||
"@vercel/build-utils": "6.5.0",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"async-retry": "1.3.1",
|
||||
"execa": "^1.0.0",
|
||||
@@ -44,6 +45,8 @@
|
||||
"node-fetch": "^2.2.1",
|
||||
"string-argv": "0.3.1",
|
||||
"tar": "4.4.6",
|
||||
"typescript": "4.3.4"
|
||||
"typescript": "4.3.4",
|
||||
"xdg-app-paths": "5.1.0",
|
||||
"yauzl-promise": "2.1.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
{ "src": "subdirectory/index.go", "use": "@vercel/go" }
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:go1.19.5:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/", "mustContain": "cow:go1.20.1:RANDOMNESS_PLACEHOLDER" },
|
||||
{
|
||||
"path": "/subdirectory",
|
||||
"mustContain": "subcow:go1.19.5:RANDOMNESS_PLACEHOLDER"
|
||||
"mustContain": "subcow:go1.20.1:RANDOMNESS_PLACEHOLDER"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
3
packages/go/test/fixtures/10-go-mod-newer/go.mod
vendored
Normal file
3
packages/go/test/fixtures/10-go-mod-newer/go.mod
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
module go-mod
|
||||
|
||||
go 1.19
|
||||
12
packages/go/test/fixtures/10-go-mod-newer/index.go
vendored
Normal file
12
packages/go/test/fixtures/10-go-mod-newer/index.go
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
// Handler func
|
||||
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "version:%s:RANDOMNESS_PLACEHOLDER", runtime.Version())
|
||||
}
|
||||
7
packages/go/test/fixtures/10-go-mod-newer/vercel.json
vendored
Normal file
7
packages/go/test/fixtures/10-go-mod-newer/vercel.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [{ "src": "index.go", "use": "@vercel/go" }],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "version:go1.19.6:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
@@ -2,6 +2,6 @@
|
||||
"version": 2,
|
||||
"builds": [{ "src": "index.go", "use": "@vercel/go" }],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "version:go1.15.8:RANDOMNESS_PLACEHOLDER" }
|
||||
{ "path": "/", "mustContain": "version:go1.15.15:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/hydrogen",
|
||||
"version": "0.0.56",
|
||||
"version": "0.0.59",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -21,8 +21,8 @@
|
||||
"devDependencies": {
|
||||
"@types/jest": "27.5.1",
|
||||
"@types/node": "14.18.33",
|
||||
"@vercel/build-utils": "6.3.3",
|
||||
"@vercel/static-config": "2.0.13",
|
||||
"@vercel/build-utils": "6.5.0",
|
||||
"@vercel/static-config": "2.0.14",
|
||||
"execa": "3.2.0",
|
||||
"fs-extra": "11.1.0",
|
||||
"ts-morph": "12.0.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/next",
|
||||
"version": "3.6.5",
|
||||
"version": "3.7.1",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
|
||||
@@ -45,9 +45,9 @@
|
||||
"@types/semver": "6.0.0",
|
||||
"@types/text-table": "0.2.1",
|
||||
"@types/webpack-sources": "3.2.0",
|
||||
"@vercel/build-utils": "6.3.3",
|
||||
"@vercel/build-utils": "6.5.0",
|
||||
"@vercel/nft": "0.22.5",
|
||||
"@vercel/routing-utils": "2.1.10",
|
||||
"@vercel/routing-utils": "2.1.11",
|
||||
"async-sema": "3.0.1",
|
||||
"buffer-crc32": "0.2.13",
|
||||
"bytes": "3.1.2",
|
||||
|
||||
@@ -410,7 +410,6 @@ export const build: BuildV2 = async ({
|
||||
|
||||
const env: typeof process.env = { ...spawnOpts.env };
|
||||
env.NEXT_EDGE_RUNTIME_PROVIDER = 'vercel';
|
||||
env.NEXT_PUBLIC_EDGE_RUNTIME_PROVIDER = env.NEXT_EDGE_RUNTIME_PROVIDER;
|
||||
|
||||
if (target) {
|
||||
// Since version v10.0.8-canary.15 of Next.js the NEXT_PRIVATE_TARGET env
|
||||
@@ -418,13 +417,11 @@ export const build: BuildV2 = async ({
|
||||
// this helps us catch cases where we can't locate the next.config.js
|
||||
// correctly
|
||||
env.NEXT_PRIVATE_TARGET = target;
|
||||
env.NEXT_PUBLIC_TARGET = target;
|
||||
}
|
||||
// Only NEXT_PUBLIC_ is considered for turbo/nx cache keys
|
||||
// and caches may not have the correct trace root so we
|
||||
// need to ensure this included in the cache key
|
||||
env.NEXT_PRIVATE_OUTPUT_TRACE_ROOT = baseDir;
|
||||
env.NEXT_PUBLIC_OUTPUT_TRACE_ROOT = baseDir;
|
||||
|
||||
if (isServerMode) {
|
||||
// when testing with jest NODE_ENV will be set to test so ensure
|
||||
|
||||
@@ -1557,6 +1557,15 @@ export async function serverBuild({
|
||||
// to allow checking non-prefixed lambda outputs
|
||||
...(i18n
|
||||
? [
|
||||
{
|
||||
src: path.posix.join(
|
||||
'/',
|
||||
entryDirectory,
|
||||
escapeStringRegexp(i18n.defaultLocale)
|
||||
),
|
||||
dest: '/',
|
||||
check: true,
|
||||
},
|
||||
{
|
||||
src: `^${path.posix.join('/', entryDirectory)}/?(?:${i18n.locales
|
||||
.map(locale => escapeStringRegexp(locale))
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user