mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-30 19:00:11 +00:00
Compare commits
37 Commits
@vercel/ru
...
refactor/a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a5a63d6f7 | ||
|
|
07a09b7880 | ||
|
|
b62c40586a | ||
|
|
d07eb34e38 | ||
|
|
46d0503361 | ||
|
|
349df907a8 | ||
|
|
e5f5ba0ae8 | ||
|
|
b2ccbf4881 | ||
|
|
434c794713 | ||
|
|
d8f5052d9a | ||
|
|
10d14488db | ||
|
|
c29f2b2fbd | ||
|
|
46348201b4 | ||
|
|
509926545e | ||
|
|
70c8b32cf0 | ||
|
|
54514a44af | ||
|
|
0db8fadf74 | ||
|
|
6f01e5ab75 | ||
|
|
78d45f9e7e | ||
|
|
22e1a6a9ce | ||
|
|
8391734b5e | ||
|
|
6a7fa1526c | ||
|
|
64b15d2409 | ||
|
|
40f73e7978 | ||
|
|
4c9ca27195 | ||
|
|
a847ef43fd | ||
|
|
3b466232a9 | ||
|
|
efdeea9db2 | ||
|
|
ab9915af32 | ||
|
|
d6dc27638c | ||
|
|
0fb0601d19 | ||
|
|
ce25dec97d | ||
|
|
20bd71ce70 | ||
|
|
4c77dab5cb | ||
|
|
151b0dfb63 | ||
|
|
42e9bbea5b | ||
|
|
c0471302e9 |
@@ -8,7 +8,7 @@ on:
|
||||
- cron: '0 0 * * 0'
|
||||
|
||||
jobs:
|
||||
create-pull-request:
|
||||
update-gatsby-fixtures:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -16,9 +16,12 @@ jobs:
|
||||
# 0 means fetch all commits so we can commit and push in the script below
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 14
|
||||
- name: Enable corepack
|
||||
run: corepack enable pnpm
|
||||
- name: Create Pull Request
|
||||
- name: Update Gatsby Fixtures
|
||||
uses: actions/github-script@v6
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
5
.github/workflows/publish.yml
vendored
5
.github/workflows/publish.yml
vendored
@@ -46,8 +46,8 @@ jobs:
|
||||
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 pnpm@7.31.0
|
||||
run: npm i -g pnpm@7.31.0
|
||||
- name: Install
|
||||
if: ${{ steps.check-release.outputs.IS_RELEASE == 'true' }}
|
||||
run: pnpm install
|
||||
@@ -61,6 +61,7 @@ jobs:
|
||||
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 }}
|
||||
|
||||
44
.github/workflows/test-integration-cli.yml
vendored
44
.github/workflows/test-integration-cli.yml
vendored
@@ -1,44 +0,0 @@
|
||||
name: CLI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
tags:
|
||||
- '!*'
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
TURBO_REMOTE_ONLY: 'true'
|
||||
TURBO_TEAM: 'vercel'
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: CLI
|
||||
timeout-minutes: 40
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
node: [16]
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
- name: install pnpm@7.24.2
|
||||
run: npm i -g pnpm@7.24.2
|
||||
- run: pnpm install
|
||||
- run: pnpm run build
|
||||
- run: pnpm test-cli
|
||||
env:
|
||||
VERCEL_TEST_TOKEN: ${{ secrets.VERCEL_TEST_TOKEN }}
|
||||
VERCEL_TEST_REGISTRATION_URL: ${{ secrets.VERCEL_TEST_REGISTRATION_URL }}
|
||||
4
.github/workflows/test-lint.yml
vendored
4
.github/workflows/test-lint.yml
vendored
@@ -28,8 +28,8 @@ jobs:
|
||||
- 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
|
||||
- name: install pnpm@7.31.0
|
||||
run: npm i -g pnpm@7.31.0
|
||||
- run: pnpm install
|
||||
- run: pnpm run lint
|
||||
- run: pnpm run prettier-check
|
||||
|
||||
8
.github/workflows/test.yml
vendored
8
.github/workflows/test.yml
vendored
@@ -32,8 +32,8 @@ jobs:
|
||||
- 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
|
||||
- name: install pnpm@7.31.0
|
||||
run: npm i -g pnpm@7.31.0
|
||||
- run: pnpm install
|
||||
- id: set-tests
|
||||
run: |
|
||||
@@ -71,8 +71,8 @@ jobs:
|
||||
if: matrix.runner == 'macos-latest'
|
||||
run: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/cli/test/dev/fixtures/08-hugo/
|
||||
|
||||
- name: install pnpm@7.24.2
|
||||
run: npm i -g pnpm@7.24.2
|
||||
- name: install pnpm@7.31.0
|
||||
run: npm i -g pnpm@7.31.0
|
||||
|
||||
- run: pnpm install
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
import { RemixBrowser } from "@remix-run/react";
|
||||
import { startTransition, StrictMode } from "react";
|
||||
import { hydrateRoot } from "react-dom/client";
|
||||
|
||||
function hydrate() {
|
||||
startTransition(() => {
|
||||
hydrateRoot(
|
||||
document,
|
||||
<StrictMode>
|
||||
<RemixBrowser />
|
||||
</StrictMode>
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
if (typeof requestIdleCallback === "function") {
|
||||
requestIdleCallback(hydrate);
|
||||
} else {
|
||||
// Safari doesn't support requestIdleCallback
|
||||
// https://caniuse.com/requestidlecallback
|
||||
setTimeout(hydrate, 1);
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
28
internals/config-utils/package.json
Normal file
28
internals/config-utils/package.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/config-utils",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/node": "14.14.31",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"ts-jest": "29.1.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
}
|
||||
}
|
||||
28
internals/constants/package.json
Normal file
28
internals/constants/package.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/constants",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/node": "14.14.31",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"ts-jest": "29.1.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
}
|
||||
}
|
||||
7
internals/constants/src/index.ts
Normal file
7
internals/constants/src/index.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export const VERCEL = 'vercel';
|
||||
export const VERCEL_TITLE = 'Vercel';
|
||||
export const VERCEL_LOGO = '▲';
|
||||
export const NOW = 'now';
|
||||
export const NOW_TITLE = 'Now';
|
||||
|
||||
export * from './user-agent';
|
||||
13
internals/constants/src/user-agent.ts
Normal file
13
internals/constants/src/user-agent.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { platform, release } from 'os';
|
||||
|
||||
const getOSVersion = () => {
|
||||
if (platform() === 'win32') {
|
||||
return `(Windows NT ${release()})`;
|
||||
} else if (platform() === 'darwin') {
|
||||
return `(Macintosh; Intel MAC OS X ${release()})`;
|
||||
} else if (platform() === 'linux') {
|
||||
return `(X11; Linux ${release()})`;
|
||||
}
|
||||
};
|
||||
|
||||
export const userAgent = `Mozilla/5.0 ${getOSVersion()}`;
|
||||
7
internals/constants/tsconfig.json
Normal file
7
internals/constants/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
28
internals/emoji/package.json
Normal file
28
internals/emoji/package.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/emoji",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/node": "14.14.31",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"ts-jest": "29.1.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
}
|
||||
}
|
||||
0
internals/emoji/test/index.test.ts
Normal file
0
internals/emoji/test/index.test.ts
Normal file
7
internals/emoji/tsconfig.json
Normal file
7
internals/emoji/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
36
internals/error-utils/package.json
Normal file
36
internals/error-utils/package.json
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/error-utils",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bytes": "3.1.1",
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/node": "14.14.31",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"node-fetch": "3.3.1",
|
||||
"ts-jest": "29.1.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel-internals/output": "workspace:*",
|
||||
"@vercel-internals/output-utils": "workspace:*",
|
||||
"bytes": "3.1.2",
|
||||
"chalk": "4.1.0"
|
||||
}
|
||||
}
|
||||
44
internals/error-utils/src/api-error.ts
Normal file
44
internals/error-utils/src/api-error.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
import { isError } from './error-utils';
|
||||
import type { Response } from 'node-fetch';
|
||||
|
||||
/**
|
||||
* This error is thrown when there is an API error with a payload. The error
|
||||
* body includes the data that came in the payload plus status and a server
|
||||
* message. When it's a rate limit error in includes `retryAfter`
|
||||
*/
|
||||
export class APIError extends Error {
|
||||
status: number;
|
||||
serverMessage: string;
|
||||
link?: string;
|
||||
slug?: string;
|
||||
action?: string;
|
||||
retryAfter: number | null | 'never';
|
||||
[key: string]: any;
|
||||
|
||||
constructor(message: string, response: Response, body?: Record<string, unknown>) {
|
||||
super();
|
||||
this.message = `${message} (${response.status})`;
|
||||
this.status = response.status;
|
||||
this.serverMessage = message;
|
||||
this.retryAfter = null;
|
||||
|
||||
if (body) {
|
||||
for (const field of Object.keys(body)) {
|
||||
if (field !== 'message') {
|
||||
this[field] = body[field];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (response.status === 429) {
|
||||
const retryAfter = response.headers.get('Retry-After');
|
||||
if (retryAfter) {
|
||||
this.retryAfter = parseInt(retryAfter, 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function isAPIError(v: unknown): v is APIError {
|
||||
return isError(v) && 'status' in v;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import chalk from 'chalk';
|
||||
import { metrics, shouldCollectMetrics } from '../metrics';
|
||||
import { APIError } from '../errors-ts';
|
||||
import renderLink from './link';
|
||||
import { APIError } from './api-error';
|
||||
import { link as renderLink } from '@vercel-internals/output-utils';
|
||||
|
||||
let metric: ReturnType<typeof metrics>;
|
||||
|
||||
81
internals/error-utils/src/error-utils.ts
Normal file
81
internals/error-utils/src/error-utils.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
export interface SpawnError extends NodeJS.ErrnoException {
|
||||
spawnargs: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple type guard for objects.
|
||||
*
|
||||
* @param obj - A possible object
|
||||
*/
|
||||
export const isObject = (obj: unknown): obj is Record<string, unknown> =>
|
||||
typeof obj === 'object' && obj !== null;
|
||||
|
||||
/**
|
||||
* A type guard for `try...catch` errors.
|
||||
*
|
||||
* This function is based on:
|
||||
* https://github.com/stdlib-js/assert-is-error
|
||||
*/
|
||||
export const isError = (error: unknown): error is Error => {
|
||||
if (!isObject(error)) return false;
|
||||
|
||||
// Check for `Error` objects instantiated within the current global context.
|
||||
if (error instanceof Error) return true;
|
||||
|
||||
// Walk the prototype tree until we find a matching object.
|
||||
while (error) {
|
||||
if (Object.prototype.toString.call(error) === '[object Error]') return true;
|
||||
error = Object.getPrototypeOf(error);
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
export const isErrnoException = (
|
||||
error: unknown
|
||||
): error is NodeJS.ErrnoException => {
|
||||
return isError(error) && 'code' in error;
|
||||
};
|
||||
|
||||
interface ErrorLike {
|
||||
message: string;
|
||||
name?: string;
|
||||
stack?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* A type guard for error-like objects.
|
||||
*/
|
||||
export const isErrorLike = (error: unknown): error is ErrorLike =>
|
||||
isObject(error) && 'message' in error;
|
||||
|
||||
/**
|
||||
* Parses errors to string, useful for getting the error message in a
|
||||
* `try...catch` statement.
|
||||
*/
|
||||
export const errorToString = (error: unknown, fallback?: string): string => {
|
||||
if (isError(error) || isErrorLike(error)) return error.message;
|
||||
|
||||
if (typeof error === 'string') return error;
|
||||
|
||||
return fallback ?? 'An unknown error has ocurred.';
|
||||
};
|
||||
|
||||
/**
|
||||
* Normalizes unknown errors to the Error type, useful for working with errors
|
||||
* in a `try...catch` statement.
|
||||
*/
|
||||
export const normalizeError = (error: unknown): Error => {
|
||||
if (isError(error)) return error;
|
||||
|
||||
const errorMessage = errorToString(error);
|
||||
|
||||
// Copy over additional properties if the object is error-like.
|
||||
return isErrorLike(error)
|
||||
? Object.assign(new Error(errorMessage), error)
|
||||
: new Error(errorMessage);
|
||||
};
|
||||
|
||||
export function isSpawnError(v: unknown): v is SpawnError {
|
||||
return isErrnoException(v) && 'spawnargs' in v;
|
||||
}
|
||||
47
internals/error-utils/src/handle-error.ts
Normal file
47
internals/error-utils/src/handle-error.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import bytes from 'bytes';
|
||||
import errorOutput from './error-output';
|
||||
import { APIError } from './api-error';
|
||||
import { getCommandName, info } from '../../output-utils/dist';
|
||||
|
||||
export default function handleError(error: unknown, { debug = false } = {}) {
|
||||
// Coerce Strings to Error instances
|
||||
if (typeof error === 'string') {
|
||||
error = new Error(error);
|
||||
}
|
||||
|
||||
const apiError = error as APIError;
|
||||
const { message, stack, status, code, sizeLimit } = apiError;
|
||||
|
||||
if (debug) {
|
||||
console.log(`> [debug] handling error: ${stack}`);
|
||||
}
|
||||
|
||||
if (status === 403) {
|
||||
console.error(
|
||||
errorOutput(
|
||||
message ||
|
||||
`Authentication error. Run ${getCommandName(
|
||||
'login'
|
||||
)} to log-in again.`
|
||||
)
|
||||
);
|
||||
} else if (status === 429) {
|
||||
// Rate limited: display the message from the server-side,
|
||||
// which contains more details
|
||||
console.error(errorOutput(message));
|
||||
} else if (code === 'size_limit_exceeded') {
|
||||
console.error(
|
||||
errorOutput(`File size limit exceeded (${bytes(sizeLimit)})`)
|
||||
);
|
||||
} else if (message) {
|
||||
console.error(errorOutput(apiError));
|
||||
} else if (status === 500) {
|
||||
console.error(errorOutput('Unexpected server error. Please retry.'));
|
||||
} else if (code === 'USER_ABORT') {
|
||||
info('Canceled');
|
||||
} else {
|
||||
console.error(
|
||||
errorOutput(`Unexpected error. Please try again later. (${message})`)
|
||||
);
|
||||
}
|
||||
}
|
||||
6
internals/error-utils/src/index.ts
Normal file
6
internals/error-utils/src/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export * from './api-error';
|
||||
export * from './now-errors';
|
||||
export * from './response-error';
|
||||
export * from './now-build-error';
|
||||
export * from './error-utils';
|
||||
export * from './error-output';
|
||||
1100
internals/error-utils/src/now-errors.ts
Normal file
1100
internals/error-utils/src/now-errors.ts
Normal file
File diff suppressed because it is too large
Load Diff
104
internals/error-utils/src/response-error.ts
Normal file
104
internals/error-utils/src/response-error.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import type { Response } from 'node-fetch';
|
||||
|
||||
export interface ResponseError extends Error {
|
||||
status: number;
|
||||
serverMessage: string;
|
||||
retryAfter?: number;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
export async function responseError(
|
||||
res: Response,
|
||||
fallbackMessage: string | null = null,
|
||||
parsedBody = {}
|
||||
) {
|
||||
let message = '';
|
||||
let bodyError;
|
||||
|
||||
if (res.status >= 400 && res.status < 500) {
|
||||
let body;
|
||||
|
||||
try {
|
||||
body = await res.json();
|
||||
} catch (err) {
|
||||
body = parsedBody;
|
||||
}
|
||||
|
||||
// Some APIs wrongly return `err` instead of `error`
|
||||
// TODO - Use error-utils here
|
||||
// @ts-expect-error
|
||||
bodyError = body.error || body.err || {};
|
||||
message = bodyError.message;
|
||||
}
|
||||
|
||||
if (!message) {
|
||||
message = fallbackMessage === null ? 'Response Error' : fallbackMessage;
|
||||
}
|
||||
|
||||
const err = new Error(`${message} (${res.status})`) as ResponseError;
|
||||
|
||||
err.status = res.status;
|
||||
err.serverMessage = message;
|
||||
|
||||
// Copy every field that was added manually to the error
|
||||
if (bodyError) {
|
||||
for (const field of Object.keys(bodyError)) {
|
||||
if (field !== 'message') {
|
||||
err[field] = bodyError[field];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (res.status === 429) {
|
||||
const retryAfter = res.headers.get('Retry-After');
|
||||
|
||||
if (retryAfter) {
|
||||
err.retryAfter = parseInt(retryAfter, 10);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
export async function responseErrorMessage(
|
||||
res: Response,
|
||||
fallbackMessage: string | null = null
|
||||
) {
|
||||
let message;
|
||||
|
||||
if (res.status >= 400 && res.status < 500) {
|
||||
let body;
|
||||
|
||||
try {
|
||||
body = await res.json();
|
||||
} catch (err) {
|
||||
body = {};
|
||||
}
|
||||
|
||||
// Some APIs wrongly return `err` instead of `error`
|
||||
// TODO - Use error-utils here
|
||||
// @ts-expect-error
|
||||
message = (body.error || body.err || {}).message;
|
||||
}
|
||||
|
||||
if (message == null) {
|
||||
message = fallbackMessage === null ? 'Response Error' : fallbackMessage;
|
||||
}
|
||||
|
||||
return `${message} (${res.status})`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new Object with enumerable properties that match
|
||||
* the provided `err` instance, for use with `JSON.stringify()`.
|
||||
*/
|
||||
export function toEnumerableError<E extends Partial<Error>>(err: E) {
|
||||
const enumerable: {
|
||||
[K in keyof E]?: E[K];
|
||||
} = {};
|
||||
enumerable.name = err.name;
|
||||
for (const key of Object.getOwnPropertyNames(err) as (keyof E)[]) {
|
||||
enumerable[key] = err[key];
|
||||
}
|
||||
return enumerable;
|
||||
}
|
||||
148
internals/error-utils/test/error-utils.test.ts
Normal file
148
internals/error-utils/test/error-utils.test.ts
Normal file
@@ -0,0 +1,148 @@
|
||||
import fs from 'node:fs';
|
||||
import {
|
||||
isObject,
|
||||
isError,
|
||||
isErrnoException,
|
||||
isErrorLike,
|
||||
normalizeError,
|
||||
isSpawnError,
|
||||
errorToString,
|
||||
} from '../src';
|
||||
|
||||
const ARRAY: any[] = [];
|
||||
const BIGINT = 1n;
|
||||
const BOOLEAN = true;
|
||||
const FUNCTION = () => {};
|
||||
const NULL = null;
|
||||
const NUMBER = 0;
|
||||
const OBJECT = {};
|
||||
const STRING = '';
|
||||
const SYMBOL = Symbol('');
|
||||
const UNDEFINED = undefined;
|
||||
|
||||
class CLASS {} // `CLASS` is a function and `new CLASS()` is an Object
|
||||
|
||||
test('isObject returns true for objects only', () => {
|
||||
for (const item of [ARRAY, new CLASS(), OBJECT]) {
|
||||
expect(isObject(item)).toBe(true);
|
||||
}
|
||||
for (const item of [
|
||||
BIGINT,
|
||||
BOOLEAN,
|
||||
CLASS,
|
||||
FUNCTION,
|
||||
NULL,
|
||||
NUMBER,
|
||||
STRING,
|
||||
SYMBOL,
|
||||
UNDEFINED,
|
||||
]) {
|
||||
expect(isObject(item)).toBe(false);
|
||||
}
|
||||
});
|
||||
|
||||
test('isError returns true for Error instances only', () => {
|
||||
for (const error of [
|
||||
new Error(),
|
||||
new EvalError(),
|
||||
new RangeError(),
|
||||
new ReferenceError(),
|
||||
new SyntaxError(),
|
||||
new TypeError(),
|
||||
new URIError(),
|
||||
]) {
|
||||
expect(isError(error)).toBe(true);
|
||||
}
|
||||
for (const item of [
|
||||
ARRAY,
|
||||
BIGINT,
|
||||
BOOLEAN,
|
||||
CLASS,
|
||||
new CLASS(),
|
||||
FUNCTION,
|
||||
NULL,
|
||||
NUMBER,
|
||||
OBJECT,
|
||||
STRING,
|
||||
SYMBOL,
|
||||
UNDEFINED,
|
||||
]) {
|
||||
expect(isError(item)).toBe(false);
|
||||
}
|
||||
});
|
||||
|
||||
test('isError returns true for objects with a nested Error prototype', () => {
|
||||
class Foo {}
|
||||
const err = new Error();
|
||||
Object.setPrototypeOf(err, Foo.prototype);
|
||||
expect(isError(err)).toBe(true);
|
||||
});
|
||||
|
||||
test('isErrnoException returns true for NodeJS.ErrnoException only', () => {
|
||||
try {
|
||||
fs.statSync('./i-definitely-do-not-exist');
|
||||
fail();
|
||||
} catch (err) {
|
||||
expect(isErrnoException(err)).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
test('isErrorLike returns true when object is like an error', () => {
|
||||
expect(isErrorLike(new Error())).toBe(true);
|
||||
expect(isErrorLike({ message: '' })).toBe(true);
|
||||
expect(isErrorLike({})).toBe(false);
|
||||
});
|
||||
|
||||
describe('errorToString', () => {
|
||||
const message = 'message';
|
||||
test('return `message` when first argument is an error', () => {
|
||||
expect(errorToString(new Error(message))).toStrictEqual(message);
|
||||
});
|
||||
test('returns `message` when first argument is error like', () => {
|
||||
expect(errorToString({ message })).toStrictEqual(message);
|
||||
});
|
||||
test('returns first argument when it is a string', () => {
|
||||
expect(errorToString(message)).toStrictEqual(message);
|
||||
});
|
||||
test('returns second argument when first argument is not an error, error like, nor a string', () => {
|
||||
expect(errorToString(null, message)).toStrictEqual(message);
|
||||
});
|
||||
test('returns default fallback message when first argument is not an error, error like, nor a string, and the second argument is not provided', () => {
|
||||
expect(errorToString(null)).toStrictEqual('An unknown error has ocurred.');
|
||||
});
|
||||
});
|
||||
|
||||
describe('normalizeError', () => {
|
||||
const message = 'message';
|
||||
test('returns first argument if it is an error', () => {
|
||||
expect(normalizeError(new Error(message))).toStrictEqual(
|
||||
new Error(message)
|
||||
);
|
||||
});
|
||||
test('returns a new error if argument is not error like', () => {
|
||||
expect(normalizeError(message)).toStrictEqual(new Error(message));
|
||||
});
|
||||
test('returns a new error if argument is not error like', () => {
|
||||
expect(normalizeError({ message })).toStrictEqual(new Error(message));
|
||||
});
|
||||
test('returns a new error with fallback message if argument is not error like nor a string.', () => {
|
||||
expect(normalizeError(null)).toStrictEqual(
|
||||
new Error('An unknown error has ocurred.')
|
||||
);
|
||||
});
|
||||
test('returns an Error with the input object assigned to it', () => {
|
||||
expect(normalizeError({ message, prop: 'value' })).toStrictEqual(
|
||||
Object.assign(new Error(message), { prop: 'value' })
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
test('isSpawnError', () => {
|
||||
const spawnError = new Error('spawn error');
|
||||
Object.assign(spawnError, {
|
||||
code: 'SPAWN_ERROR',
|
||||
spawnargs: ['a', 'b', 'c'],
|
||||
});
|
||||
expect(isSpawnError(spawnError)).toBe(true);
|
||||
expect(isSpawnError(new Error('not spawn error'))).toBe(false);
|
||||
});
|
||||
0
internals/error-utils/test/index.test.ts
Normal file
0
internals/error-utils/test/index.test.ts
Normal file
7
internals/error-utils/tsconfig.json
Normal file
7
internals/error-utils/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
28
internals/get-package-json/package.json
Normal file
28
internals/get-package-json/package.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/get-package-json",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/node": "14.14.31",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"ts-jest": "29.1.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
}
|
||||
}
|
||||
58
internals/get-package-json/src/index.ts
Normal file
58
internals/get-package-json/src/index.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const cache = new Map();
|
||||
|
||||
function getPackageJSONPath(dir: string) {
|
||||
return path.join(dir, 'package.json');
|
||||
}
|
||||
|
||||
function captureCallerCallSite() {
|
||||
const _prepareStackTrace = Error.prepareStackTrace;
|
||||
|
||||
let callSite;
|
||||
try {
|
||||
Error.prepareStackTrace = (_, stack) => stack;
|
||||
|
||||
// The `stack` reference above is of type `Array<NodeJS.CallSite>`
|
||||
const callSites = new Error().stack as unknown as Array<NodeJS.CallSite>;
|
||||
|
||||
// TypeScript rule noUncheckedIndexedAccess makes `callSites[2]` potentially
|
||||
// undefined; however, we can safely assert it is not undefined as the
|
||||
// callstack will always have at least 3 entries, the first being this
|
||||
// function, the second being `getPackageJSON`, and the third wherever its
|
||||
// being called from.
|
||||
callSite = callSites[2]!;
|
||||
} finally {
|
||||
Error.prepareStackTrace = _prepareStackTrace;
|
||||
}
|
||||
|
||||
return callSite;
|
||||
}
|
||||
|
||||
export function getPackageJSON() {
|
||||
const callSite = captureCallerCallSite();
|
||||
// Get the file name of where this function was called. It is guaranteed that
|
||||
// the only way for `getFileName` to return `undefined` is if this function is
|
||||
// called using `eval` thus it is safe to assert `filePath` is defined at this
|
||||
// point.
|
||||
const filePath = (callSite.getFileName() ||
|
||||
callSite.getEvalOrigin()) as string;
|
||||
|
||||
let rootDir = path.dirname(filePath);
|
||||
|
||||
let packageJSONPath = getPackageJSONPath(rootDir);
|
||||
while (!fs.existsSync(packageJSONPath)) {
|
||||
rootDir = path.join(rootDir, '..');
|
||||
packageJSONPath = getPackageJSONPath(rootDir);
|
||||
}
|
||||
|
||||
let packageJSON = cache.get(packageJSONPath);
|
||||
|
||||
if (!packageJSON) {
|
||||
packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, 'utf-8'));
|
||||
cache.set(packageJSONPath, packageJSON);
|
||||
}
|
||||
|
||||
return packageJSON;
|
||||
}
|
||||
7
internals/get-package-json/tests/tsconfig.json
Normal file
7
internals/get-package-json/tests/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"noEmit": true
|
||||
},
|
||||
"include": ["./**/*.ts"]
|
||||
}
|
||||
20
internals/get-package-json/tests/unit/cache.test.ts
Normal file
20
internals/get-package-json/tests/unit/cache.test.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { getPackageJSON } from '../../src/index';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
test('getPackageJSON caches read operations', () => {
|
||||
const expected = JSON.parse(
|
||||
fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8')
|
||||
);
|
||||
expect(expected.name).toBe('@vercel-internals/get-package-json');
|
||||
|
||||
const readFileSyncSpy = jest.spyOn(fs, 'readFileSync');
|
||||
|
||||
const actual = getPackageJSON();
|
||||
expect(actual).toStrictEqual(expected);
|
||||
expect(readFileSyncSpy).toBeCalledTimes(1);
|
||||
|
||||
const cacheHit = getPackageJSON();
|
||||
expect(cacheHit).toStrictEqual(expected);
|
||||
expect(readFileSyncSpy).toBeCalledTimes(1);
|
||||
});
|
||||
@@ -0,0 +1,12 @@
|
||||
import { getPackageJSON } from '../../../../../src/index';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
test('getPackageJSON should return the package.json', () => {
|
||||
const expected = JSON.parse(
|
||||
fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8')
|
||||
);
|
||||
expect(expected.name).toBe('deeply-nested');
|
||||
const actual = getPackageJSON();
|
||||
expect(actual).toStrictEqual(expected);
|
||||
});
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "deeply-nested",
|
||||
"private": true
|
||||
}
|
||||
12
internals/get-package-json/tests/unit/getPackageJSON.test.ts
Normal file
12
internals/get-package-json/tests/unit/getPackageJSON.test.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { getPackageJSON } from '../../src/index';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
test('getPackageJSON should return the package.json', () => {
|
||||
const expected = JSON.parse(
|
||||
fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8')
|
||||
);
|
||||
expect(expected.name).toBe('@vercel-internals/get-package-json');
|
||||
const actual = getPackageJSON();
|
||||
expect(actual).toStrictEqual(expected);
|
||||
});
|
||||
@@ -0,0 +1,12 @@
|
||||
import { getPackageJSON } from '../../../src/index';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
test('getPackageJSON should return the package.json', () => {
|
||||
const expected = JSON.parse(
|
||||
fs.readFileSync(path.join(__dirname, 'package.json'), 'utf-8')
|
||||
);
|
||||
expect(expected.name).toBe('nested');
|
||||
const actual = getPackageJSON();
|
||||
expect(actual).toStrictEqual(expected);
|
||||
});
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "nested",
|
||||
"private": true
|
||||
}
|
||||
7
internals/get-package-json/tsconfig.json
Normal file
7
internals/get-package-json/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
34
internals/metrics/package.json
Normal file
34
internals/metrics/package.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/metrics",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "ts-node ./scripts/build.ts && tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/node": "14.18.33",
|
||||
"@types/universal-analytics": "0.4.2",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"ts-jest": "29.1.0",
|
||||
"ts-node": "10.9.1",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel-internals/constants": "*",
|
||||
"universal-analytics": "0.4.20"
|
||||
}
|
||||
}
|
||||
47
internals/metrics/scripts/build.ts
Normal file
47
internals/metrics/scripts/build.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { join } from 'path';
|
||||
import { writeFile } from 'fs/promises';
|
||||
|
||||
const dirRoot = join(__dirname, '..');
|
||||
|
||||
async function createConstants() {
|
||||
console.log('Creating constants.ts');
|
||||
const filename = join(dirRoot, 'src/constants.ts');
|
||||
const contents = `// This file is auto-generated
|
||||
export const GA_TRACKING_ID: string | undefined = ${envToString(
|
||||
'GA_TRACKING_ID'
|
||||
)};
|
||||
export const SENTRY_DSN: string | undefined = ${envToString('SENTRY_DSN')};
|
||||
`;
|
||||
await writeFile(filename, contents, 'utf8');
|
||||
}
|
||||
|
||||
function envToString(key: string) {
|
||||
const value = process.env[key];
|
||||
if (!value) {
|
||||
console.log(`- Constant ${key} is not assigned`);
|
||||
}
|
||||
return JSON.stringify(value);
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// Read the secrets from GitHub Actions and generate a file.
|
||||
// During local development, these secrets will be empty.
|
||||
await createConstants();
|
||||
}
|
||||
|
||||
|
||||
process.on('unhandledRejection', (reason: any, promise: Promise<any>) => {
|
||||
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
process.on('uncaughtException', err => {
|
||||
console.error('Uncaught Exception:');
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
main().catch(err => {
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
});
|
||||
37
internals/metrics/src/index.ts
Normal file
37
internals/metrics/src/index.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import crypto from 'crypto';
|
||||
import ua from 'universal-analytics';
|
||||
import { getPlatformEnv } from '@vercel/build-utils';
|
||||
import userAgent from '@vercel-internals/constants';
|
||||
import { GA_TRACKING_ID } from './constants';
|
||||
import * as configFiles from './config/files';
|
||||
|
||||
const config: any = configFiles.getConfigFilePath();
|
||||
|
||||
export const shouldCollectMetrics =
|
||||
(config.collectMetrics === undefined || config.collectMetrics === true) &&
|
||||
getPlatformEnv('CLI_COLLECT_METRICS') !== '0' &&
|
||||
GA_TRACKING_ID;
|
||||
|
||||
export const metrics = (): ua.Visitor => {
|
||||
const token =
|
||||
typeof config.token === 'string'
|
||||
? config.token
|
||||
: process.platform + process.arch;
|
||||
const salt =
|
||||
(process.env.USER || '') +
|
||||
(process.env.LANG || '') +
|
||||
(process.env.SHELL || '');
|
||||
const hash = crypto
|
||||
.pbkdf2Sync(token, salt, 100, 64, 'sha512')
|
||||
.toString('hex')
|
||||
.substring(0, 24);
|
||||
|
||||
return ua(GA_TRACKING_ID || '', {
|
||||
cid: hash,
|
||||
strictCidFormat: false,
|
||||
uid: hash,
|
||||
headers: {
|
||||
'User-Agent': userAgent,
|
||||
},
|
||||
});
|
||||
};
|
||||
7
internals/metrics/tsconfig.json
Normal file
7
internals/metrics/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
44
internals/output-utils/package.json
Normal file
44
internals/output-utils/package.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/output-utils",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bytes": "3.1.1",
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/ms": "0.7.31",
|
||||
"@types/node": "14.14.31",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/routing-utils": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"ts-jest": "29.1.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel-internals/constants": "*",
|
||||
"@vercel-internals/emoji": "*",
|
||||
"@vercel-internals/error-utils": "*",
|
||||
"@vercel-internals/types": "*",
|
||||
"ansi-escapes": "4.3.2",
|
||||
"bytes": "3.1.2",
|
||||
"chalk": "4.1.0",
|
||||
"ms": "2.1.2",
|
||||
"ora": "3.4.0",
|
||||
"strip-ansi": "6.0.1",
|
||||
"supports-hyperlinks": "2.2.0"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
import chalk from 'chalk';
|
||||
import bytes from 'bytes';
|
||||
import { isReady, isFailed } from '../build-state';
|
||||
import { Build, BuildOutput } from '@vercel-internals/types';
|
||||
|
||||
export interface Times {
|
||||
@@ -219,7 +218,7 @@ export default (builds: Build[], times: Times) => {
|
||||
const final = [];
|
||||
let finalBuildsLength = path.length;
|
||||
let lengthWithoutRootPaths = path.length;
|
||||
let hiddenBuildGroup: Build[] = [];
|
||||
const hiddenBuildGroup: Build[] = [];
|
||||
|
||||
// Ungroup the root files
|
||||
path = (() => {
|
||||
@@ -314,3 +313,9 @@ export default (builds: Build[], times: Times) => {
|
||||
toPrint: `${final.join('')}`,
|
||||
};
|
||||
};
|
||||
|
||||
export const isReady = ({ readyState }: Pick<Build, 'readyState'>) =>
|
||||
readyState === 'READY';
|
||||
|
||||
export const isFailed = ({ readyState }: Pick<Build, 'readyState'>) =>
|
||||
readyState.endsWith('_ERROR') || readyState === 'ERROR';
|
||||
@@ -7,7 +7,7 @@ import chalk from 'chalk';
|
||||
* @param time Number of ms
|
||||
* @param ago Boolean to indicate if we should append `ago`
|
||||
*/
|
||||
export default function elapsed(time: number, ago: boolean = false): string {
|
||||
export default function elapsed(time: number, ago = false): string {
|
||||
return chalk.gray(
|
||||
`[${time < 1000 ? `${time}ms` : ms(time)}${ago ? ' ago' : ''}]`
|
||||
);
|
||||
9
internals/output-utils/src/get-command-name.ts
Normal file
9
internals/output-utils/src/get-command-name.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { VERCEL } from '@vercel-internals/constants';
|
||||
import cmd from './cmd';
|
||||
export function getCommandName (subcommands?: string): string {
|
||||
let vercel = VERCEL;
|
||||
if (subcommands) {
|
||||
vercel = `${vercel} ${subcommands}`;
|
||||
}
|
||||
return cmd(vercel);
|
||||
}
|
||||
30
internals/output-utils/src/index.ts
Normal file
30
internals/output-utils/src/index.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
export * from './box';
|
||||
export {default as box} from './box';
|
||||
export * from './builds';
|
||||
export {default as builds} from './builds';
|
||||
export {default as chars} from './chars';
|
||||
export {default as cmd} from './cmd';
|
||||
export {default as code} from './code';
|
||||
export * from './color-name-cache';
|
||||
export {default as elapsed} from './elapsed';
|
||||
export {default as ellipsis} from './ellipsis';
|
||||
export {default as eraseLines} from './erase-lines';
|
||||
export * from './get-command-name';
|
||||
export {default as highlight} from './highlight';
|
||||
export {default as indent} from './indent';
|
||||
export {default as info} from './info';
|
||||
export {default as joinWords} from './join-words';
|
||||
export {default as link} from './link';
|
||||
export {default as listItem} from './list-item';
|
||||
export {default as note} from './note';
|
||||
export {default as ok} from './ok';
|
||||
export {default as param} from './param';
|
||||
export * from './progress';
|
||||
export {default as ready} from './ready';
|
||||
export {default as routes} from './routes';
|
||||
export {default as stamp} from './stamp';
|
||||
export {default as success} from './success';
|
||||
export {default as table} from './table';
|
||||
export {default as uid} from './uid';
|
||||
export * from './wait';
|
||||
export {default as wait} from './wait';
|
||||
@@ -1,5 +1,5 @@
|
||||
import chalk from 'chalk';
|
||||
import { Route } from '@vercel/routing-utils';
|
||||
import type { Route } from '@vercel/routing-utils';
|
||||
|
||||
const longestProperty = (routes: Route[], name: keyof Route): number => {
|
||||
const longestItem = routes.sort((a, b) => {
|
||||
@@ -9,7 +9,7 @@ export interface StopSpinner {
|
||||
|
||||
export default function wait(
|
||||
opts: ora.Options,
|
||||
delay: number = 300
|
||||
delay = 300
|
||||
): StopSpinner {
|
||||
let text = opts.text;
|
||||
let spinner: ora.Ora | null = null;
|
||||
8
internals/output-utils/tsconfig.json
Normal file
8
internals/output-utils/tsconfig.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"noUncheckedIndexedAccess": false
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
37
internals/output/package.json
Normal file
37
internals/output/package.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@vercel-internals/output",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"test": "jest --env node --verbose --runInBand --bail",
|
||||
"test-unit": "pnpm test tests/unit"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "29.5.0",
|
||||
"@types/node": "14.14.31",
|
||||
"@vercel-internals/tsconfig": "*",
|
||||
"@vercel/style-guide": "4.0.2",
|
||||
"jest": "29.5.0",
|
||||
"ts-jest": "29.1.0",
|
||||
"typescript": "4.9.4"
|
||||
},
|
||||
"jest": {
|
||||
"verbose": true,
|
||||
"preset": "ts-jest",
|
||||
"testEnvironment": "node"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel-internals/emoji": "*",
|
||||
"@vercel-internals/error-utils": "*",
|
||||
"@vercel-internals/output-utils": "*",
|
||||
"@vercel-internals/types": "*",
|
||||
"ansi-escapes": "4.3.2",
|
||||
"chalk": "4.1.0",
|
||||
"supports-hyperlinks": "2.2.0"
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,10 @@
|
||||
import chalk from 'chalk';
|
||||
import * as ansiEscapes from 'ansi-escapes';
|
||||
import { supportsHyperlink as detectSupportsHyperlink } from 'supports-hyperlinks';
|
||||
import renderLink from './link';
|
||||
import wait, { StopSpinner } from './wait';
|
||||
import { link as renderLink, wait, StopSpinner } from '@vercel-internals/output-utils';
|
||||
import type { WritableTTY } from '@vercel-internals/types';
|
||||
import { errorToString } from '@vercel/error-utils';
|
||||
import { removeEmoji } from '../emoji';
|
||||
import { errorToString } from '@vercel-internals/errors';
|
||||
import { removeEmoji } from '@vercel-internals/emoji';
|
||||
|
||||
const IS_TEST = process.env.NODE_ENV === 'test';
|
||||
|
||||
@@ -133,7 +132,7 @@ export class Output {
|
||||
}
|
||||
};
|
||||
|
||||
spinner = (message: string, delay: number = 300): void => {
|
||||
spinner = (message: string, delay = 300): void => {
|
||||
if (this.debugEnabled) {
|
||||
this.debug(`Spinner invoked (${message}) with a ${delay}ms delay`);
|
||||
return;
|
||||
7
internals/output/tsconfig.json
Normal file
7
internals/output/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "@vercel-internals/tsconfig",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
},
|
||||
"include": ["types/**/*", "src/**/*"]
|
||||
}
|
||||
4
internals/output/types/supports-hyperlinks/index.d.ts
vendored
Normal file
4
internals/output/types/supports-hyperlinks/index.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
declare module 'supports-hyperlinks' {
|
||||
import { Writable } from 'stream';
|
||||
export function supportsHyperlink(stream: Writable): boolean;
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"declaration": true,
|
||||
"allowJs": true,
|
||||
"moduleResolution": "node",
|
||||
"target": "ES2020",
|
||||
"module": "commonjs",
|
||||
"lib": ["ES2020"],
|
||||
"resolveJsonModule": true,
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
14
package.json
14
package.json
@@ -3,7 +3,7 @@
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"license": "Apache-2.0",
|
||||
"packageManager": "pnpm@7.24.2",
|
||||
"packageManager": "pnpm@7.31.0",
|
||||
"dependencies": {
|
||||
"lerna": "5.6.2"
|
||||
},
|
||||
@@ -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,14 +42,14 @@
|
||||
"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",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/build-utils",
|
||||
"version": "6.4.0",
|
||||
"version": "6.7.0",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.js",
|
||||
|
||||
@@ -487,6 +487,7 @@ export function getEnvForPackageManager({
|
||||
const oldPath = env.PATH + '';
|
||||
const npm7 = '/node16/bin-npm7';
|
||||
const pnpm7 = '/pnpm7/node_modules/.bin';
|
||||
const pnpm8 = '/pnpm8/node_modules/.bin';
|
||||
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
|
||||
if (cliType === 'npm') {
|
||||
if (
|
||||
@@ -509,7 +510,20 @@ export function getEnvForPackageManager({
|
||||
) {
|
||||
// Ensure that pnpm 7 is at the beginning of the `$PATH`
|
||||
newEnv.PATH = `${pnpm7}${path.delimiter}${oldPath}`;
|
||||
console.log('Detected `pnpm-lock.yaml` generated by pnpm 7...');
|
||||
console.log(
|
||||
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 7...`
|
||||
);
|
||||
} else if (
|
||||
typeof lockfileVersion === 'number' &&
|
||||
lockfileVersion >= 6 &&
|
||||
!oldPath.includes(pnpm8) &&
|
||||
!corepackEnabled
|
||||
) {
|
||||
// Ensure that pnpm 8 is at the beginning of the `$PATH`
|
||||
newEnv.PATH = `${pnpm8}${path.delimiter}${oldPath}`;
|
||||
console.log(
|
||||
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 8...`
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
|
||||
|
||||
@@ -14,10 +14,11 @@ export function getPrefixedEnvVars({
|
||||
envs: Envs;
|
||||
}): Envs {
|
||||
const vercelSystemEnvPrefix = 'VERCEL_';
|
||||
const allowed = ['VERCEL_URL', 'VERCEL_ENV', 'VERCEL_REGION'];
|
||||
const newEnvs: Envs = {};
|
||||
if (envPrefix && envs.VERCEL_URL) {
|
||||
Object.keys(envs)
|
||||
.filter(key => key.startsWith(vercelSystemEnvPrefix))
|
||||
.filter(key => allowed.includes(key) || key.startsWith('VERCEL_GIT_'))
|
||||
.forEach(key => {
|
||||
const newKey = `${envPrefix}${key}`;
|
||||
if (!(newKey in envs)) {
|
||||
|
||||
@@ -23,6 +23,10 @@ export interface LambdaOptionsBase {
|
||||
regions?: string[];
|
||||
supportsMultiPayloads?: boolean;
|
||||
supportsWrapper?: boolean;
|
||||
supportsResponseStreaming?: boolean;
|
||||
/**
|
||||
* @deprecated Use the `supportsResponseStreaming` property instead.
|
||||
*/
|
||||
experimentalResponseStreaming?: boolean;
|
||||
operationType?: string;
|
||||
framework?: FunctionFramework;
|
||||
@@ -69,7 +73,7 @@ export class Lambda {
|
||||
zipBuffer?: Buffer;
|
||||
supportsMultiPayloads?: boolean;
|
||||
supportsWrapper?: boolean;
|
||||
experimentalResponseStreaming?: boolean;
|
||||
supportsResponseStreaming?: boolean;
|
||||
framework?: FunctionFramework;
|
||||
|
||||
constructor(opts: LambdaOptions) {
|
||||
@@ -83,6 +87,7 @@ export class Lambda {
|
||||
regions,
|
||||
supportsMultiPayloads,
|
||||
supportsWrapper,
|
||||
supportsResponseStreaming,
|
||||
experimentalResponseStreaming,
|
||||
operationType,
|
||||
framework,
|
||||
@@ -162,7 +167,8 @@ export class Lambda {
|
||||
this.zipBuffer = 'zipBuffer' in opts ? opts.zipBuffer : undefined;
|
||||
this.supportsMultiPayloads = supportsMultiPayloads;
|
||||
this.supportsWrapper = supportsWrapper;
|
||||
this.experimentalResponseStreaming = experimentalResponseStreaming;
|
||||
this.supportsResponseStreaming =
|
||||
supportsResponseStreaming ?? experimentalResponseStreaming;
|
||||
this.framework = framework;
|
||||
}
|
||||
|
||||
@@ -181,6 +187,16 @@ export class Lambda {
|
||||
}
|
||||
return zipBuffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use the `supportsResponseStreaming` property instead.
|
||||
*/
|
||||
get experimentalResponseStreaming(): boolean | undefined {
|
||||
return this.supportsResponseStreaming;
|
||||
}
|
||||
set experimentalResponseStreaming(v: boolean | undefined) {
|
||||
this.supportsResponseStreaming = v;
|
||||
}
|
||||
}
|
||||
|
||||
const sema = new Sema(10);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
"probes": [
|
||||
{
|
||||
"path": "/",
|
||||
"mustContain": "pnpm version: 6",
|
||||
"logMustContain": "pnpm run build"
|
||||
"mustContain": "pnpm version: 7"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
9
packages/build-utils/test/fixtures/27-pnpm-v7/package.json
vendored
Normal file
9
packages/build-utils/test/fixtures/27-pnpm-v7/package.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "mkdir -p public && (printf \"pnpm version: \" && pnpm -v) > public/index.txt"
|
||||
},
|
||||
"dependencies": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
}
|
||||
21
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-lock.yaml
generated
vendored
Normal file
21
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-lock.yaml
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
lockfileVersion: 5.4
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
specifiers:
|
||||
once: ^1.4.0
|
||||
dependencies:
|
||||
once: 1.4.0
|
||||
|
||||
packages:
|
||||
|
||||
/once/1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
dev: false
|
||||
|
||||
/wrappy/1.0.2:
|
||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||
dev: false
|
||||
1
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-workspace.yaml
vendored
Normal file
1
packages/build-utils/test/fixtures/27-pnpm-v7/pnpm-workspace.yaml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
# Empty so this is treated as its own pnpm workspace
|
||||
8
packages/build-utils/test/fixtures/27-pnpm-v7/probes.json
vendored
Normal file
8
packages/build-utils/test/fixtures/27-pnpm-v7/probes.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"probes": [
|
||||
{
|
||||
"path": "/",
|
||||
"mustContain": "pnpm version: 7"
|
||||
}
|
||||
]
|
||||
}
|
||||
9
packages/build-utils/test/fixtures/28-pnpm-v8/package.json
vendored
Normal file
9
packages/build-utils/test/fixtures/28-pnpm-v8/package.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "mkdir -p public && (printf \"pnpm version: \" && pnpm -v) > public/index.txt"
|
||||
},
|
||||
"dependencies": {
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
}
|
||||
21
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-lock.yaml
generated
vendored
Normal file
21
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-lock.yaml
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
lockfileVersion: '6.0'
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
once:
|
||||
specifier: ^1.4.0
|
||||
version: 1.4.0
|
||||
|
||||
packages:
|
||||
|
||||
/once@1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
dev: false
|
||||
|
||||
/wrappy@1.0.2:
|
||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||
dev: false
|
||||
1
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-workspace.yaml
vendored
Normal file
1
packages/build-utils/test/fixtures/28-pnpm-v8/pnpm-workspace.yaml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
# Empty so this is treated as its own pnpm workspace
|
||||
8
packages/build-utils/test/fixtures/28-pnpm-v8/probes.json
vendored
Normal file
8
packages/build-utils/test/fixtures/28-pnpm-v8/probes.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"probes": [
|
||||
{
|
||||
"path": "/",
|
||||
"mustContain": "pnpm version: 8"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -14,6 +14,7 @@ describe('Test `getPrefixedEnvVars()`', () => {
|
||||
VERCEL: '1',
|
||||
VERCEL_URL: 'example.vercel.sh',
|
||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||
VERCEL_ARTIFACTS_TOKEN: 'abc123',
|
||||
FOO: 'bar',
|
||||
},
|
||||
},
|
||||
@@ -28,6 +29,7 @@ describe('Test `getPrefixedEnvVars()`', () => {
|
||||
envPrefix: 'GATSBY_',
|
||||
envs: {
|
||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||
VERCEL_ARTIFACTS_TOKEN: 'abc123',
|
||||
FOO: 'bar',
|
||||
VERCEL_URL: 'example.vercel.sh',
|
||||
VERCEL_ENV: 'production',
|
||||
@@ -51,6 +53,7 @@ describe('Test `getPrefixedEnvVars()`', () => {
|
||||
USER_ENV_VAR_NOT_VERCEL: 'example.com',
|
||||
FOO: 'bar',
|
||||
BLARG_VERCEL_THING: 'fake',
|
||||
VERCEL_ARTIFACTS_TOKEN: 'abc123',
|
||||
},
|
||||
},
|
||||
want: {},
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user