Compare commits

..

2 Commits

Author SHA1 Message Date
Luis Meyer
7efe60d1dd [build] make esbuild watchable 2023-11-14 15:37:01 +01:00
Luis Meyer
c82399d6bf [cli] add store commands to create and list stores 2023-11-14 15:37:01 +01:00
149 changed files with 15669 additions and 53394 deletions

View File

@@ -0,0 +1,2 @@
---
---

View File

@@ -76,12 +76,3 @@ jobs:
script: |
const script = require('./utils/update-latest-release.js')
await script({ github, context })
summary:
name: Summary
runs-on: ubuntu-latest
timeout-minutes: 5
needs:
- release
steps:
- name: Check All
run: echo OK

View File

@@ -28,8 +28,7 @@ jobs:
with:
fetch-depth: 0
ref: main
- run: git fetch origin ${{ github.event.pull_request.head.sha }}:pr-${{ github.event.pull_request.number }}
- run: git checkout pr-${{ github.event.pull_request.number }}
- run: git checkout ${{ github.event.pull_request.head.ref }}
- name: install pnpm@8.3.1
run: npm i -g pnpm@8.3.1
- run: pnpm install

View File

@@ -70,11 +70,6 @@ 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/
# yarn 1.22.21 introduced a Corepack bug when running tests.
# this can be removed once https://github.com/yarnpkg/yarn/issues/9015 is resolved
- name: install yarn@1.22.19
run: npm i -g yarn@1.22.19
- name: install pnpm@8.3.1
run: npm i -g pnpm@8.3.1

View File

@@ -1 +0,0 @@
v16.20.2

1
.nvmrc
View File

@@ -1 +0,0 @@
16.20.2

View File

@@ -385,16 +385,15 @@ This is a [class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refere
This is an abstract enumeration type that is implemented by one of the following possible `String` values:
- `nodejs20.x`
- `nodejs18.x`
- `nodejs16.x`
- `go1.x`
- `java11`
- `python3.9`
- `dotnet6`
- `dotnetcore3.1`
- `ruby2.7`
- `provided.al2`
- `provided.al2023`
## `@vercel/build-utils` Helper Functions

View File

@@ -19,7 +19,7 @@
## Vercel
Vercels Frontend Cloud provides the developer experience and infrastructure to build, scale, and secure a faster, more personalized Web.
Vercel's frontend cloud gives developers frameworks, workflows, and infrastructure to build a faster, more personalized web.
## Deploy

View File

@@ -4,10 +4,4 @@
### Patch Changes
- chore: update Nuxt example ([#10869](https://github.com/vercel/vercel/pull/10869))
## null
### Patch Changes
- update examples to use at least node@16 ([#10395](https://github.com/vercel/vercel/pull/10395))

File diff suppressed because it is too large Load Diff

View File

@@ -87,7 +87,7 @@ export default function Home() {
</span>
</h2>
<p className={`m-0 max-w-[30ch] text-sm opacity-50`}>
Explore starter templates for Next.js.
Explore the Next.js 13 playground.
</p>
</a>

View File

@@ -8,7 +8,7 @@
"name": "nextjs",
"version": "0.1.0",
"dependencies": {
"next": "14.0.4",
"next": "14.0.0",
"react": "^18",
"react-dom": "^18"
},
@@ -16,11 +16,11 @@
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.0.1",
"autoprefixer": "^10",
"eslint": "^8",
"eslint-config-next": "14.0.4",
"eslint-config-next": "14.0.0",
"postcss": "^8",
"tailwindcss": "^3.3.0",
"tailwindcss": "^3",
"typescript": "^5"
}
},
@@ -46,9 +46,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.23.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz",
"integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==",
"version": "7.23.2",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
"integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -82,9 +82,9 @@
}
},
"node_modules/@eslint/eslintrc": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
"integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
@@ -105,9 +105,9 @@
}
},
"node_modules/@eslint/js": {
"version": "8.55.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz",
"integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==",
"version": "8.52.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
"integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -195,23 +195,23 @@
}
},
"node_modules/@next/env": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz",
"integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ=="
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.0.tgz",
"integrity": "sha512-cIKhxkfVELB6hFjYsbtEeTus2mwrTC+JissfZYM0n+8Fv+g8ucUfOlm3VEDtwtwydZ0Nuauv3bl0qF82nnCAqA=="
},
"node_modules/@next/eslint-plugin-next": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.4.tgz",
"integrity": "sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.0.tgz",
"integrity": "sha512-Ye37nNI09V3yt7pzuzSQtwlvuJ2CGzFszHXkcTHHZgNr7EhTMFLipn3VSJChy+e5+ahTdNApPphc3qCPUsn10A==",
"dev": true,
"dependencies": {
"glob": "7.1.7"
}
},
"node_modules/@next/swc-darwin-arm64": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz",
"integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.0.tgz",
"integrity": "sha512-HQKi159jCz4SRsPesVCiNN6tPSAFUkOuSkpJsqYTIlbHLKr1mD6be/J0TvWV6fwJekj81bZV9V/Tgx3C2HO9lA==",
"cpu": [
"arm64"
],
@@ -224,9 +224,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz",
"integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.0.tgz",
"integrity": "sha512-4YyQLMSaCgX/kgC1jjF3s3xSoBnwHuDhnF6WA1DWNEYRsbOOPWjcYhv8TKhRe2ApdOam+VfQSffC4ZD+X4u1Cg==",
"cpu": [
"x64"
],
@@ -239,9 +239,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz",
"integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.0.tgz",
"integrity": "sha512-io7fMkJ28Glj7SH8yvnlD6naIhRDnDxeE55CmpQkj3+uaA2Hko6WGY2pT5SzpQLTnGGnviK85cy8EJ2qsETj/g==",
"cpu": [
"arm64"
],
@@ -254,9 +254,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz",
"integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.0.tgz",
"integrity": "sha512-nC2h0l1Jt8LEzyQeSs/BKpXAMe0mnHIMykYALWaeddTqCv5UEN8nGO3BG8JAqW/Y8iutqJsaMe2A9itS0d/r8w==",
"cpu": [
"arm64"
],
@@ -269,9 +269,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz",
"integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.0.tgz",
"integrity": "sha512-Wf+WjXibJQ7hHXOdNOmSMW5bxeJHVf46Pwb3eLSD2L76NrytQlif9NH7JpHuFlYKCQGfKfgSYYre5rIfmnSwQw==",
"cpu": [
"x64"
],
@@ -284,9 +284,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz",
"integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.0.tgz",
"integrity": "sha512-WTZb2G7B+CTsdigcJVkRxfcAIQj7Lf0ipPNRJ3vlSadU8f0CFGv/ST+sJwF5eSwIe6dxKoX0DG6OljDBaad+rg==",
"cpu": [
"x64"
],
@@ -299,9 +299,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz",
"integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.0.tgz",
"integrity": "sha512-7R8/x6oQODmNpnWVW00rlWX90sIlwluJwcvMT6GXNIBOvEf01t3fBg0AGURNKdTJg2xNuP7TyLchCL7Lh2DTiw==",
"cpu": [
"arm64"
],
@@ -314,9 +314,9 @@
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz",
"integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.0.tgz",
"integrity": "sha512-RLK1nELvhCnxaWPF07jGU4x3tjbyx2319q43loZELqF0+iJtKutZ+Lk8SVmf/KiJkYBc7Cragadz7hb3uQvz4g==",
"cpu": [
"ia32"
],
@@ -329,9 +329,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz",
"integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.0.tgz",
"integrity": "sha512-g6hLf1SUko+hnnaywQQZzzb3BRecQsoKkF3o/C+F+dOA4w/noVAJngUVkfwF0+2/8FzNznM7ofM6TGZO9svn7w==",
"cpu": [
"x64"
],
@@ -379,9 +379,9 @@
}
},
"node_modules/@rushstack/eslint-patch": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz",
"integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==",
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz",
"integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==",
"dev": true
},
"node_modules/@swc/helpers": {
@@ -399,24 +399,24 @@
"dev": true
},
"node_modules/@types/node": {
"version": "20.10.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz",
"integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==",
"version": "20.8.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz",
"integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/prop-types": {
"version": "15.7.11",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
"integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
"version": "15.7.9",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz",
"integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==",
"dev": true
},
"node_modules/@types/react": {
"version": "18.2.42",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.42.tgz",
"integrity": "sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA==",
"version": "18.2.33",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.33.tgz",
"integrity": "sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@@ -425,30 +425,30 @@
}
},
"node_modules/@types/react-dom": {
"version": "18.2.17",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz",
"integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==",
"version": "18.2.14",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz",
"integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==",
"dev": true,
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/scheduler": {
"version": "0.16.8",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
"integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
"version": "0.16.5",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz",
"integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==",
"dev": true
},
"node_modules/@typescript-eslint/parser": {
"version": "6.13.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz",
"integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==",
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz",
"integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==",
"dev": true,
"dependencies": {
"@typescript-eslint/scope-manager": "6.13.2",
"@typescript-eslint/types": "6.13.2",
"@typescript-eslint/typescript-estree": "6.13.2",
"@typescript-eslint/visitor-keys": "6.13.2",
"@typescript-eslint/scope-manager": "6.9.0",
"@typescript-eslint/types": "6.9.0",
"@typescript-eslint/typescript-estree": "6.9.0",
"@typescript-eslint/visitor-keys": "6.9.0",
"debug": "^4.3.4"
},
"engines": {
@@ -468,13 +468,13 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "6.13.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz",
"integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==",
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz",
"integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "6.13.2",
"@typescript-eslint/visitor-keys": "6.13.2"
"@typescript-eslint/types": "6.9.0",
"@typescript-eslint/visitor-keys": "6.9.0"
},
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -485,9 +485,9 @@
}
},
"node_modules/@typescript-eslint/types": {
"version": "6.13.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz",
"integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==",
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz",
"integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==",
"dev": true,
"engines": {
"node": "^16.0.0 || >=18.0.0"
@@ -498,13 +498,13 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "6.13.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz",
"integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==",
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz",
"integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "6.13.2",
"@typescript-eslint/visitor-keys": "6.13.2",
"@typescript-eslint/types": "6.9.0",
"@typescript-eslint/visitor-keys": "6.9.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -525,12 +525,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "6.13.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz",
"integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==",
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz",
"integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "6.13.2",
"@typescript-eslint/types": "6.9.0",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
@@ -548,9 +548,9 @@
"dev": true
},
"node_modules/acorn": {
"version": "8.11.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
"integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.0.tgz",
"integrity": "sha512-hNiSyky+cuYVALBrsjB7f9gMN9P4u09JyAiMNMLaVfsmkDJuH84M1T/0pfDX/OJfGWcobd2A7ecXYzygn8wibA==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -779,9 +779,9 @@
}
},
"node_modules/ast-types-flow": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
"integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
"integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
"dev": true
},
"node_modules/asynciterator.prototype": {
@@ -843,9 +843,9 @@
}
},
"node_modules/axe-core": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz",
"integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==",
"version": "4.8.2",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz",
"integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==",
"dev": true,
"engines": {
"node": ">=4"
@@ -898,9 +898,9 @@
}
},
"node_modules/browserslist": {
"version": "4.22.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
"version": "4.22.1",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
"integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
"dev": true,
"funding": [
{
@@ -917,9 +917,9 @@
}
],
"dependencies": {
"caniuse-lite": "^1.0.30001565",
"electron-to-chromium": "^1.4.601",
"node-releases": "^2.0.14",
"caniuse-lite": "^1.0.30001541",
"electron-to-chromium": "^1.4.535",
"node-releases": "^2.0.13",
"update-browserslist-db": "^1.0.13"
},
"bin": {
@@ -973,9 +973,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001566",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz",
"integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==",
"version": "1.0.30001554",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz",
"integrity": "sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==",
"funding": [
{
"type": "opencollective",
@@ -1111,9 +1111,9 @@
}
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
"dev": true
},
"node_modules/damerau-levenshtein": {
@@ -1222,9 +1222,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.4.608",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.608.tgz",
"integrity": "sha512-J2f/3iIIm3Mo0npneITZ2UPe4B1bg8fTNrFjD8715F/k1BvbviRuqYGkET1PgprrczXYTHFvotbBOmUp6KE0uA==",
"version": "1.4.567",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.567.tgz",
"integrity": "sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -1383,15 +1383,15 @@
}
},
"node_modules/eslint": {
"version": "8.55.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz",
"integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==",
"version": "8.52.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
"integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.55.0",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "8.52.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@@ -1438,12 +1438,12 @@
}
},
"node_modules/eslint-config-next": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.0.4.tgz",
"integrity": "sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.0.0.tgz",
"integrity": "sha512-jtXeE+/pGQ3h9n11QyyuPN50kO13GO5XvjU5ZRq6W+XTpOMjyobWmK2s7aowy0FtzA49krJzYzEU9s1RMwoJ6g==",
"dev": true,
"dependencies": {
"@next/eslint-plugin-next": "14.0.4",
"@next/eslint-plugin-next": "14.0.0",
"@rushstack/eslint-patch": "^1.3.3",
"@typescript-eslint/parser": "^5.4.2 || ^6.0.0",
"eslint-import-resolver-node": "^0.3.6",
@@ -1596,27 +1596,27 @@
}
},
"node_modules/eslint-plugin-jsx-a11y": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz",
"integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==",
"version": "6.7.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
"integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.23.2",
"aria-query": "^5.3.0",
"array-includes": "^3.1.7",
"array.prototype.flatmap": "^1.3.2",
"ast-types-flow": "^0.0.8",
"axe-core": "=4.7.0",
"axobject-query": "^3.2.1",
"@babel/runtime": "^7.20.7",
"aria-query": "^5.1.3",
"array-includes": "^3.1.6",
"array.prototype.flatmap": "^1.3.1",
"ast-types-flow": "^0.0.7",
"axe-core": "^4.6.2",
"axobject-query": "^3.1.1",
"damerau-levenshtein": "^1.0.8",
"emoji-regex": "^9.2.2",
"es-iterator-helpers": "^1.0.15",
"hasown": "^2.0.0",
"jsx-ast-utils": "^3.3.5",
"language-tags": "^1.0.9",
"has": "^1.0.3",
"jsx-ast-utils": "^3.3.3",
"language-tags": "=1.0.5",
"minimatch": "^3.1.2",
"object.entries": "^1.1.7",
"object.fromentries": "^2.0.7"
"object.entries": "^1.1.6",
"object.fromentries": "^2.0.6",
"semver": "^6.3.0"
},
"engines": {
"node": ">=4.0"
@@ -1625,6 +1625,15 @@
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
}
},
"node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/eslint-plugin-react": {
"version": "7.33.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
@@ -1799,9 +1808,9 @@
"dev": true
},
"node_modules/fast-glob": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
"integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
"integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@@ -1888,9 +1897,9 @@
}
},
"node_modules/flat-cache": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz",
"integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==",
"dev": true,
"dependencies": {
"flatted": "^3.2.9",
@@ -1898,7 +1907,7 @@
"rimraf": "^3.0.2"
},
"engines": {
"node": "^10.12.0 || >=12.0.0"
"node": ">=12.0.0"
}
},
"node_modules/flatted": {
@@ -2138,6 +2147,15 @@
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
"dev": true
},
"node_modules/has": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
"integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
"dev": true,
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-bigints": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
@@ -2220,9 +2238,9 @@
}
},
"node_modules/ignore": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
"integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"dev": true,
"engines": {
"node": ">= 4"
@@ -2635,9 +2653,9 @@
}
},
"node_modules/jiti": {
"version": "1.21.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
"integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
"integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==",
"dev": true,
"bin": {
"jiti": "bin/jiti.js"
@@ -2721,15 +2739,12 @@
"dev": true
},
"node_modules/language-tags": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
"integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
"integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
"dev": true,
"dependencies": {
"language-subtag-registry": "^0.3.20"
},
"engines": {
"node": ">=0.10"
"language-subtag-registry": "~0.3.2"
}
},
"node_modules/levn": {
@@ -2865,9 +2880,9 @@
}
},
"node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
"funding": [
{
"type": "github",
@@ -2888,15 +2903,14 @@
"dev": true
},
"node_modules/next": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz",
"integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==",
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/next/-/next-14.0.0.tgz",
"integrity": "sha512-J0jHKBJpB9zd4+c153sair0sz44mbaCHxggs8ryVXSFBuBqJ8XdE9/ozoV85xGh2VnSjahwntBZZgsihL9QznA==",
"dependencies": {
"@next/env": "14.0.4",
"@next/env": "14.0.0",
"@swc/helpers": "0.5.2",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001406",
"graceful-fs": "^4.2.11",
"postcss": "8.4.31",
"styled-jsx": "5.1.1",
"watchpack": "2.4.0"
@@ -2908,15 +2922,15 @@
"node": ">=18.17.0"
},
"optionalDependencies": {
"@next/swc-darwin-arm64": "14.0.4",
"@next/swc-darwin-x64": "14.0.4",
"@next/swc-linux-arm64-gnu": "14.0.4",
"@next/swc-linux-arm64-musl": "14.0.4",
"@next/swc-linux-x64-gnu": "14.0.4",
"@next/swc-linux-x64-musl": "14.0.4",
"@next/swc-win32-arm64-msvc": "14.0.4",
"@next/swc-win32-ia32-msvc": "14.0.4",
"@next/swc-win32-x64-msvc": "14.0.4"
"@next/swc-darwin-arm64": "14.0.0",
"@next/swc-darwin-x64": "14.0.0",
"@next/swc-linux-arm64-gnu": "14.0.0",
"@next/swc-linux-arm64-musl": "14.0.0",
"@next/swc-linux-x64-gnu": "14.0.0",
"@next/swc-linux-x64-musl": "14.0.0",
"@next/swc-win32-arm64-msvc": "14.0.0",
"@next/swc-win32-ia32-msvc": "14.0.0",
"@next/swc-win32-x64-msvc": "14.0.0"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
@@ -2933,37 +2947,10 @@
}
}
},
"node_modules/next/node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
"nanoid": "^3.3.6",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/node-releases": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
"version": "2.0.13",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
"integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
"dev": true
},
"node_modules/normalize-path": {
@@ -3021,13 +3008,13 @@
}
},
"node_modules/object.assign": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
"integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
"integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"has-symbols": "^1.0.3",
"object-keys": "^1.1.1"
},
@@ -3257,10 +3244,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.32",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
"integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
"dev": true,
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"funding": [
{
"type": "opencollective",
@@ -3276,7 +3262,7 @@
}
],
"dependencies": {
"nanoid": "^3.3.7",
"nanoid": "^3.3.6",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
@@ -3321,27 +3307,21 @@
}
},
"node_modules/postcss-load-config": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
"integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
"lilconfig": "^3.0.0",
"yaml": "^2.3.4"
"lilconfig": "^2.0.5",
"yaml": "^2.1.1"
},
"engines": {
"node": ">= 14"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
@@ -3355,15 +3335,6 @@
}
}
},
"node_modules/postcss-load-config/node_modules/lilconfig": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
"integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
"dev": true,
"engines": {
"node": ">=14"
}
},
"node_modules/postcss-nested": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
@@ -3423,9 +3394,9 @@
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
"dev": true,
"engines": {
"node": ">=6"
@@ -3958,9 +3929,9 @@
}
},
"node_modules/tailwindcss": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz",
"integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==",
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz",
"integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==",
"dev": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
@@ -4167,9 +4138,9 @@
}
},
"node_modules/typescript": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -4361,9 +4332,9 @@
"dev": true
},
"node_modules/yaml": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz",
"integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==",
"dev": true,
"engines": {
"node": ">= 14"

View File

@@ -11,17 +11,17 @@
"dependencies": {
"react": "^18",
"react-dom": "^18",
"next": "14.0.4"
"next": "14.0.0"
},
"devDependencies": {
"typescript": "^5",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.0.1",
"autoprefixer": "^10",
"postcss": "^8",
"tailwindcss": "^3.3.0",
"tailwindcss": "^3",
"eslint": "^8",
"eslint-config-next": "14.0.4"
"eslint-config-next": "14.0.0"
}
}

View File

@@ -2,4 +2,4 @@
<div>
<NuxtWelcome />
</div>
</template>
</template>

View File

@@ -1,8 +1,5 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
devtools: { enabled: true },
routeRules: {
// prerender index route by default
'/': { prerender: true },
export default {
nitro: {
preset: 'vercel-edge',
},
});
};

View File

@@ -1,6 +1,5 @@
{
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
@@ -9,9 +8,6 @@
"postinstall": "nuxt prepare"
},
"devDependencies": {
"@nuxt/devtools": "^1.0.3",
"nuxt": "^3.8.2",
"vue": "^3.3.8",
"vue-router": "^4.2.5"
"nuxt": "^3.0.0"
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -1,3 +0,0 @@
{
"extends": "../.nuxt/tsconfig.server.json"
}

View File

@@ -1,4 +1,4 @@
{
// https://nuxt.com/docs/guide/concepts/typescript
// https://v3.nuxtjs.org/concepts/typescript
"extends": "./.nuxt/tsconfig.json"
}

4259
examples/nuxtjs/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@
},
"devDependencies": {
"@types/jest": "27.4.1",
"@vercel/frameworks": "2.0.5"
"@vercel/frameworks": "2.0.3"
},
"version": null
}

View File

@@ -15,21 +15,21 @@
"devDependencies": {
"@fontsource/fira-mono": "^4.5.10",
"@neoconfetti/svelte": "^1.0.0",
"@playwright/test": "^1.40.1",
"@sveltejs/adapter-vercel": "^3.1.0",
"@sveltejs/kit": "^1.30.3",
"@types/cookie": "^0.5.4",
"eslint": "^8.55.0",
"eslint-config-prettier": "^8.10.0",
"eslint-plugin-svelte": "^2.35.1",
"prettier": "^2.8.8",
"prettier-plugin-svelte": "^2.10.1",
"svelte": "^3.59.2",
"svelte-check": "^3.6.2",
"typescript": "^5.3.3",
"vite": "^4.5.1",
"vitest": "^0.25.8",
"web-vitals": "^3.5.0"
"@playwright/test": "^1.28.1",
"@sveltejs/adapter-vercel": "^3.0.0",
"@sveltejs/kit": "^1.5.0",
"@types/cookie": "^0.5.1",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte": "^2.26.0",
"prettier": "^2.8.0",
"prettier-plugin-svelte": "^2.8.1",
"svelte": "^3.54.0",
"svelte-check": "^3.0.1",
"typescript": "^5.0.0",
"vite": "^4.3.0",
"vitest": "^0.25.3",
"web-vitals": "^3.3.1"
},
"type": "module"
}

View File

@@ -1,33 +1,5 @@
# @vercel-internals/types
## 1.0.18
### Patch Changes
- Updated dependencies [[`4d63d9e95`](https://github.com/vercel/vercel/commit/4d63d9e954549d811063d259250d1865b7de2ba1)]:
- @vercel/build-utils@7.4.0
## 1.0.17
### Patch Changes
- Updated dependencies [[`dfe47f6e6`](https://github.com/vercel/vercel/commit/dfe47f6e6c1d395ae24d802f4b7c98e39b9f90f4)]:
- @vercel/build-utils@7.3.0
## 1.0.16
### Patch Changes
- Updated dependencies [[`88da7463c`](https://github.com/vercel/vercel/commit/88da7463ce12df91d49fbde85cb617030d55f558)]:
- @vercel/build-utils@7.2.5
## 1.0.15
### Patch Changes
- Updated dependencies [[`65dec5b7e`](https://github.com/vercel/vercel/commit/65dec5b7e752f4da8fe0ffdb25215170453f6f8b)]:
- @vercel/build-utils@7.2.4
## 1.0.14
### Patch Changes

View File

@@ -1,7 +1,7 @@
{
"private": true,
"name": "@vercel-internals/types",
"version": "1.0.18",
"version": "1.0.14",
"types": "index.d.ts",
"main": "index.d.ts",
"files": [
@@ -10,7 +10,7 @@
"dependencies": {
"@types/node": "14.14.31",
"@vercel-internals/constants": "1.0.4",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"@vercel/routing-utils": "3.1.0"
},
"devDependencies": {

View File

@@ -33,7 +33,7 @@
"source-map-support": "0.5.12",
"ts-eager": "2.0.2",
"ts-jest": "29.1.0",
"turbo": "1.11.2",
"turbo": "1.10.16",
"typescript": "4.9.5"
},
"scripts": {

View File

@@ -1,29 +1,5 @@
# @vercel/build-utils
## 7.4.0
### Minor Changes
- Adds new helper `getPathForPackageManager()` ([#10918](https://github.com/vercel/vercel/pull/10918))
## 7.3.0
### Minor Changes
- [cli] add `--deprecated` option to `vc project ls` command ([#10919](https://github.com/vercel/vercel/pull/10919))
## 7.2.5
### Patch Changes
- Remove Node.js v20 env var check ([#10834](https://github.com/vercel/vercel/pull/10834))
## 7.2.4
### Patch Changes
- Select Node.js version based on what's available in build-container ([#10822](https://github.com/vercel/vercel/pull/10822))
## 7.2.3
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/build-utils",
"version": "7.4.0",
"version": "7.2.3",
"license": "Apache-2.0",
"main": "./dist/index.js",
"types": "./dist/index.d.js",

View File

@@ -1,88 +1,60 @@
import { statSync } from 'fs';
import { intersects, validRange } from 'semver';
import { NodeVersion } from '../types';
import { NowBuildError } from '../errors';
import debug from '../debug';
export type NodeVersionMajor = ReturnType<typeof getOptions>[number]['major'];
export const NODE_VERSIONS: NodeVersion[] = [
{ major: 20, range: '20.x', runtime: 'nodejs20.x' },
{ major: 18, range: '18.x', runtime: 'nodejs18.x' },
{
major: 16,
range: '16.x',
runtime: 'nodejs16.x',
discontinueDate: new Date('2024-02-06'),
},
{
major: 14,
range: '14.x',
runtime: 'nodejs14.x',
discontinueDate: new Date('2023-08-15'),
},
{
major: 12,
range: '12.x',
runtime: 'nodejs12.x',
discontinueDate: new Date('2022-10-03'),
},
{
major: 10,
range: '10.x',
runtime: 'nodejs10.x',
discontinueDate: new Date('2021-04-20'),
},
{
major: 8,
range: '8.10.x',
runtime: 'nodejs8.10',
discontinueDate: new Date('2020-01-06'),
},
];
function getOptions() {
return NODE_VERSIONS;
}
function isNodeVersionAvailable(version: NodeVersion): boolean {
try {
return statSync(`/node${version.major}`).isDirectory();
} catch {
// ENOENT, or any other error, we don't care about
const options = [
{ major: 18, range: '18.x', runtime: 'nodejs18.x' },
{
major: 16,
range: '16.x',
runtime: 'nodejs16.x',
discontinueDate: new Date('2024-02-06'),
},
{
major: 14,
range: '14.x',
runtime: 'nodejs14.x',
discontinueDate: new Date('2023-08-15'),
},
{
major: 12,
range: '12.x',
runtime: 'nodejs12.x',
discontinueDate: new Date('2022-10-03'),
},
{
major: 10,
range: '10.x',
runtime: 'nodejs10.x',
discontinueDate: new Date('2021-04-20'),
},
{
major: 8,
range: '8.10.x',
runtime: 'nodejs8.10',
discontinueDate: new Date('2020-01-06'),
},
] as const;
if (process.env.VERCEL_ALLOW_NODEJS20 === '1') {
return [
{ major: 20, range: '20.x', runtime: 'nodejs20.x' },
...options,
] as const;
}
return false;
return options;
}
export function getAvailableNodeVersions(): NodeVersionMajor[] {
return getOptions()
.filter(isNodeVersionAvailable)
.map(n => n.major);
}
function getHint(isAuto = false, availableVersions?: NodeVersionMajor[]) {
const { major, range } = getLatestNodeVersion(availableVersions);
function getHint(isAuto = false) {
const { major, range } = getLatestNodeVersion();
return isAuto
? `Please set Node.js Version to ${range} in your Project Settings to use Node.js ${major}.`
: `Please set "engines": { "node": "${range}" } in your \`package.json\` file to use Node.js ${major}.`;
}
export function getLatestNodeVersion(availableVersions?: NodeVersionMajor[]) {
const all = getOptions();
if (availableVersions) {
// Return the first node version that is definitely
// available in the build-container.
for (const version of all) {
for (const major of availableVersions) {
if (version.major === major) {
return version;
}
}
}
}
// As a fallback for local `vc build` and the tests,
// return the first node version if none is found.
return all[0];
export function getLatestNodeVersion() {
return getOptions()[0];
}
export function getDiscontinuedNodeVersions(): NodeVersion[] {
@@ -91,10 +63,9 @@ export function getDiscontinuedNodeVersions(): NodeVersion[] {
export async function getSupportedNodeVersion(
engineRange: string | undefined,
isAuto = false,
availableVersions?: NodeVersionMajor[]
isAuto = false
): Promise<NodeVersion> {
let selection: NodeVersion | undefined;
let selection: NodeVersion = getLatestNodeVersion();
if (engineRange) {
const found =
@@ -103,29 +74,19 @@ export async function getSupportedNodeVersion(
// the array is already in order so return the first
// match which will be the newest version of node
selection = o;
return (
intersects(o.range, engineRange) &&
(availableVersions?.length
? availableVersions.includes(o.major)
: true)
);
return intersects(o.range, engineRange);
});
if (!found) {
throw new NowBuildError({
code: 'BUILD_UTILS_NODE_VERSION_INVALID',
link: 'http://vercel.link/node-version',
message: `Found invalid Node.js Version: "${engineRange}". ${getHint(
isAuto,
availableVersions
isAuto
)}`,
});
}
}
if (!selection) {
selection = getLatestNodeVersion(availableVersions);
}
if (isDiscontinued(selection)) {
const intro = `Node.js Version "${selection.range}" is discontinued and must be upgraded.`;
throw new NowBuildError({

View File

@@ -9,11 +9,7 @@ import { deprecate } from 'util';
import debug from '../debug';
import { NowBuildError } from '../errors';
import { Meta, PackageJson, NodeVersion, Config } from '../types';
import {
getSupportedNodeVersion,
getLatestNodeVersion,
getAvailableNodeVersions,
} from './node-version';
import { getSupportedNodeVersion, getLatestNodeVersion } from './node-version';
import { readConfigFile } from './read-config-file';
import { cloneEnv } from '../clone-env';
@@ -242,10 +238,9 @@ export async function getNodeVersion(
destPath: string,
nodeVersionFallback = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION,
config: Config = {},
meta: Meta = {},
availableVersions = getAvailableNodeVersions()
meta: Meta = {}
): Promise<NodeVersion> {
const latest = getLatestNodeVersion(availableVersions);
const latest = getLatestNodeVersion();
if (meta.isDev) {
// Use the system-installed version of `node` in PATH for `vercel dev`
return { ...latest, runtime: 'nodejs' };
@@ -271,7 +266,7 @@ export async function getNodeVersion(
nodeVersion = node;
isAuto = false;
}
return getSupportedNodeVersion(nodeVersion, isAuto, availableVersions);
return getSupportedNodeVersion(nodeVersion, isAuto);
}
export async function scanParentDirs(
@@ -516,10 +511,6 @@ export async function runNpmInstall(
}
}
/**
* Prepares the input environment based on the used package manager and lockfile
* versions.
*/
export function getEnvForPackageManager({
cliType,
lockfileVersion,
@@ -531,90 +522,7 @@ export function getEnvForPackageManager({
nodeVersion: NodeVersion | undefined;
env: { [x: string]: string | undefined };
}) {
const {
detectedLockfile,
detectedPackageManager,
path: newPath,
yarnNodeLinker,
} = getPathForPackageManager({
cliType,
lockfileVersion,
nodeVersion,
env,
});
const newEnv: { [x: string]: string | undefined } = {
...env,
};
if (newPath) {
// Ensure that the binaries of the detected package manager are at the
// beginning of the `$PATH`.
const oldPath = env.PATH + '';
newEnv.PATH = `${newPath}${path.delimiter}${oldPath}`;
}
if (yarnNodeLinker) {
newEnv.YARN_NODE_LINKER = yarnNodeLinker;
}
if (detectedLockfile && detectedPackageManager) {
// For pnpm we also show the version of the lockfile we found
const versionString =
cliType === 'pnpm' ? `version ${lockfileVersion} ` : '';
console.log(
`Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
);
if (cliType === 'bun') {
console.warn(
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions'
);
}
}
return newEnv;
}
/**
* Helper to get the binary paths that link to the used package manager.
* Note: Make sure it doesn't contain any `console.log` calls.
*/
export function getPathForPackageManager({
cliType,
lockfileVersion,
nodeVersion,
env,
}: {
cliType: CliType;
lockfileVersion: number | undefined;
nodeVersion: NodeVersion | undefined;
env: { [x: string]: string | undefined };
}): {
/**
* Which lockfile was detected.
*/
detectedLockfile: string | undefined;
/**
* Detected package manager that generated the found lockfile.
*/
detectedPackageManager: string | undefined;
/**
* Value of $PATH that includes the binaries for the detected package manager.
* Undefined if no $PATH are necessary.
*/
path: string | undefined;
/**
* Set if yarn was identified as package manager and `YARN_NODE_LINKER`
* environment variable was not found on the input environment.
*/
yarnNodeLinker: string | undefined;
} {
let detectedLockfile: string | undefined;
let detectedPackageManager: string | undefined;
let pathValue: string | undefined;
let yarnNodeLinker: string | undefined;
const newEnv: { [x: string]: string | undefined } = { ...env };
const oldPath = env.PATH + '';
const npm7 = '/node16/bin-npm7';
const pnpm7 = '/pnpm7/node_modules/.bin';
@@ -629,10 +537,9 @@ export function getPathForPackageManager({
!oldPath.includes(npm7) &&
!corepackEnabled
) {
// npm 7
pathValue = npm7;
detectedLockfile = 'package-lock.json';
detectedPackageManager = 'npm 7+';
// Ensure that npm 7 is at the beginning of the `$PATH`
newEnv.PATH = `${npm7}${path.delimiter}${oldPath}`;
console.log('Detected `package-lock.json` generated by npm 7+');
}
} else if (cliType === 'pnpm') {
if (
@@ -641,40 +548,39 @@ export function getPathForPackageManager({
!oldPath.includes(pnpm7) &&
!corepackEnabled
) {
// pnpm 7
pathValue = pnpm7;
detectedLockfile = 'pnpm-lock.yaml';
detectedPackageManager = 'pnpm 7';
// Ensure that pnpm 7 is at the beginning of the `$PATH`
newEnv.PATH = `${pnpm7}${path.delimiter}${oldPath}`;
console.log(
`Detected \`pnpm-lock.yaml\` version ${lockfileVersion} generated by pnpm 7`
);
} else if (
typeof lockfileVersion === 'number' &&
lockfileVersion >= 6 &&
!oldPath.includes(pnpm8) &&
!corepackEnabled
) {
// pnpm 8
pathValue = pnpm8;
detectedLockfile = 'pnpm-lock.yaml';
detectedPackageManager = 'pnpm 8';
// 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 if (cliType === 'bun') {
if (!oldPath.includes(bun1) && !corepackEnabled) {
// Bun 1
pathValue = bun1;
detectedLockfile = 'bun.lockb';
detectedPackageManager = 'Bun';
// Ensure that Bun 1 is at the beginning of the `$PATH`
newEnv.PATH = `${bun1}${path.delimiter}${oldPath}`;
console.log('Detected `bun.lockb` generated by Bun');
console.warn(
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions'
);
}
} else {
// Yarn v2 PnP mode may be activated, so force "node-modules" linker style
if (!env.YARN_NODE_LINKER) {
yarnNodeLinker = 'node-modules';
newEnv.YARN_NODE_LINKER = 'node-modules';
}
}
return {
detectedLockfile,
detectedPackageManager,
path: pathValue,
yarnNodeLinker,
};
return newEnv;
}
export async function runCustomInstallCommand({

View File

@@ -28,7 +28,6 @@ import {
runCustomInstallCommand,
getEnvForPackageManager,
getNodeVersion,
getPathForPackageManager,
getSpawnOptions,
getNodeBinPath,
getNodeBinPaths,
@@ -79,7 +78,6 @@ export {
runCustomInstallCommand,
getEnvForPackageManager,
getNodeVersion,
getPathForPackageManager,
getLatestNodeVersion,
getDiscontinuedNodeVersions,
getSpawnOptions,
@@ -106,5 +104,3 @@ export * from './should-serve';
export * from './schemas';
export * from './types';
export * from './errors';
export { NODE_VERSIONS } from './fs/node-version';

View File

@@ -1,34 +1,13 @@
import assert from 'assert';
import { delimiter } from 'path';
import { getEnvForPackageManager, getPathForPackageManager } from '../src';
import { getEnvForPackageManager } from '../src';
describe('Test `getEnvForPackageManager()`', () => {
let consoleLogSpy: jest.SpyInstance;
let consoleWarnSpy: jest.SpyInstance;
beforeEach(() => {
consoleLogSpy = jest.spyOn(console, 'log');
consoleWarnSpy = jest.spyOn(console, 'warn');
});
afterEach(() => {
jest.restoreAllMocks();
});
test.each<{
const cases: Array<{
name: string;
args: Parameters<typeof getEnvForPackageManager>[0];
want: unknown;
/**
* Expected output on `console.log`. Set to `null` when no output is
* expected.
*/
consoleLogOutput?: string | null;
/**
* Expected output on `console.warn`. Set to `null` when no output is
* expected.
*/
consoleWarnOutput?: string | null;
}>([
}> = [
{
name: 'should do nothing to env for npm < 6 and node < 16',
args: {
@@ -42,8 +21,6 @@ describe('Test `getEnvForPackageManager()`', () => {
want: {
FOO: 'bar',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should set path if npm 7+ is detected and node < 16',
@@ -60,8 +37,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/node16/bin-npm7${delimiter}foo`,
},
consoleLogOutput: 'Detected `package-lock.json` generated by npm 7+',
consoleWarnOutput: null,
},
{
name: 'should not set npm path if corepack enabled',
@@ -78,8 +53,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not prepend npm path again if already detected',
@@ -96,8 +69,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/node16/bin-npm7${delimiter}foo`,
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not set path if node is 16 and npm 7+ is detected',
@@ -114,8 +85,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: 'foo',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should set YARN_NODE_LINKER w/yarn if it is not already defined',
@@ -131,8 +100,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
YARN_NODE_LINKER: 'node-modules',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not set YARN_NODE_LINKER if it already exists',
@@ -149,8 +116,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
YARN_NODE_LINKER: 'exists',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should set path if pnpm 7+ is detected',
@@ -167,9 +132,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
},
consoleLogOutput:
'Detected `pnpm-lock.yaml` version 5.4 generated by pnpm 7',
consoleWarnOutput: null,
},
{
name: 'should set path if bun v1 is detected',
@@ -186,9 +148,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/bun1${delimiter}/usr/local/bin`,
},
consoleLogOutput: 'Detected `bun.lockb` generated by Bun',
consoleWarnOutput:
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions',
},
{
name: 'should not set pnpm path if corepack is enabled',
@@ -205,8 +164,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not prepend pnpm path again if already detected',
@@ -223,8 +180,6 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
{
name: 'should not set path if pnpm 6 is detected',
@@ -239,262 +194,20 @@ describe('Test `getEnvForPackageManager()`', () => {
want: {
FOO: 'bar',
},
consoleLogOutput: null,
consoleWarnOutput: null,
},
])('$name', ({ args, want, consoleLogOutput, consoleWarnOutput }) => {
expect(
getEnvForPackageManager({
cliType: args.cliType,
lockfileVersion: args.lockfileVersion,
nodeVersion: args.nodeVersion,
env: args.env,
})
).toStrictEqual(want);
];
// Check console.log output
if (typeof consoleLogOutput === 'string') {
expect(consoleLogSpy).toHaveBeenCalledWith(consoleLogOutput);
} else if (consoleLogOutput === null) {
expect(consoleLogSpy).not.toHaveBeenCalled();
}
// Check console.warn output
if (typeof consoleWarnOutput === 'string') {
expect(consoleWarnSpy).toHaveBeenCalledWith(consoleWarnOutput);
} else if (consoleLogOutput === null) {
expect(consoleWarnSpy).not.toHaveBeenCalled();
}
});
});
describe('Test `getPathForPackageManager()`', () => {
test.each<{
name: string;
args: Parameters<typeof getEnvForPackageManager>[0];
want: unknown;
}>([
{
name: 'should do nothing to env for npm < 6 and node < 16',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 1,
env: {
FOO: 'bar',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should set path if npm 7+ is detected and node < 16',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
PATH: 'foo',
},
},
want: {
detectedLockfile: 'package-lock.json',
detectedPackageManager: 'npm 7+',
path: '/node16/bin-npm7',
yarnNodeLinker: undefined,
},
},
{
name: 'should not set npm path if corepack enabled',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not prepend npm path again if already detected',
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
PATH: `/node16/bin-npm7${delimiter}foo`,
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not set path if node is 16 and npm 7+ is detected',
args: {
cliType: 'npm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
PATH: 'foo',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should set YARN_NODE_LINKER w/yarn if it is not already defined',
args: {
cliType: 'yarn',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: 'node-modules',
},
},
{
name: 'should not set YARN_NODE_LINKER if it already exists',
args: {
cliType: 'yarn',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 2,
env: {
FOO: 'bar',
YARN_NODE_LINKER: 'exists',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should set path if pnpm 7+ is detected',
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 5.4,
env: {
FOO: 'bar',
PATH: 'foo',
},
},
want: {
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 7',
path: '/pnpm7/node_modules/.bin',
yarnNodeLinker: undefined,
},
},
{
name: 'should set path if bun v1 is detected',
args: {
cliType: 'bun',
nodeVersion: { major: 18, range: '18.x', runtime: 'nodejs18.x' },
lockfileVersion: 0,
env: {
FOO: 'bar',
PATH: '/usr/local/bin',
},
},
want: {
detectedLockfile: 'bun.lockb',
detectedPackageManager: 'Bun',
path: '/bun1',
yarnNodeLinker: undefined,
},
},
{
name: 'should not set pnpm path if corepack is enabled',
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 5.4,
env: {
FOO: 'bar',
ENABLE_EXPERIMENTAL_COREPACK: '1',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not prepend pnpm path again if already detected',
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
lockfileVersion: 5.4,
env: {
FOO: 'bar',
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
{
name: 'should not set path if pnpm 6 is detected',
args: {
cliType: 'pnpm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
lockfileVersion: 5.3,
env: {
FOO: 'bar',
},
},
want: {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
yarnNodeLinker: undefined,
},
},
])('$name', ({ args, want }) => {
expect(
getPathForPackageManager({
cliType: args.cliType,
lockfileVersion: args.lockfileVersion,
nodeVersion: args.nodeVersion,
env: args.env,
})
).toStrictEqual(want);
});
for (const { name, want, args } of cases) {
it(name, () => {
assert.deepStrictEqual(
getEnvForPackageManager({
cliType: args.cliType,
lockfileVersion: args.lockfileVersion,
nodeVersion: args.nodeVersion,
env: args.env,
}),
want
);
});
}
});

View File

@@ -60,7 +60,7 @@ it('should only match supported node versions, otherwise throw an error', async
);
const autoMessage =
'Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.';
'Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.';
await expectBuilderError(
getSupportedNodeVersion('8.11.x', true),
autoMessage
@@ -80,7 +80,7 @@ it('should only match supported node versions, otherwise throw an error', async
);
const foundMessage =
'Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.';
'Please set "engines": { "node": "18.x" } in your `package.json` file to use Node.js 18.';
await expectBuilderError(
getSupportedNodeVersion('8.11.x', false),
foundMessage
@@ -101,8 +101,8 @@ it('should match all semver ranges', async () => {
// See https://docs.npmjs.com/files/package.json#engines
expect(await getSupportedNodeVersion('16.0.0')).toHaveProperty('major', 16);
expect(await getSupportedNodeVersion('16.x')).toHaveProperty('major', 16);
expect(await getSupportedNodeVersion('>=10')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('>=10.3.0')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('>=10')).toHaveProperty('major', 18);
expect(await getSupportedNodeVersion('>=10.3.0')).toHaveProperty('major', 18);
expect(await getSupportedNodeVersion('16.5.0 - 16.9.0')).toHaveProperty(
'major',
16
@@ -120,33 +120,11 @@ it('should match all semver ranges', async () => {
});
it('should allow nodejs18.x', async () => {
expect(getLatestNodeVersion()).toHaveProperty('major', 18);
expect(await getSupportedNodeVersion('18.x')).toHaveProperty('major', 18);
expect(await getSupportedNodeVersion('18')).toHaveProperty('major', 18);
expect(await getSupportedNodeVersion('18.1.0')).toHaveProperty('major', 18);
});
it('should allow nodejs20.x', async () => {
expect(getLatestNodeVersion()).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('20.x')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('20')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('20.1.0')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('>=18')).toHaveProperty('major', 20);
});
it('should not allow nodejs20.x when not available', async () => {
// Simulates AL2 build-container
await expect(
getSupportedNodeVersion('20.x', true, [14, 16, 18])
).rejects.toThrow(
'Found invalid Node.js Version: "20.x". Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.'
);
});
it('should not allow nodejs18.x when not available', async () => {
// Simulates AL2023 build-container
await expect(getSupportedNodeVersion('18.x', true, [20])).rejects.toThrow(
'Found invalid Node.js Version: "18.x". Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.'
);
expect(await getSupportedNodeVersion('>=16')).toHaveProperty('major', 18);
});
it('should ignore node version in vercel dev getNodeVersion()', async () => {
@@ -215,7 +193,7 @@ it('should warn when package.json engines is greater than', async () => {
{},
{}
)
).toHaveProperty('range', '20.x');
).toHaveProperty('range', '18.x');
expect(warningMessages).toStrictEqual([
'Warning: Detected "engines": { "node": ">=16" } in your `package.json` that will automatically upgrade when a new major Node.js Version is released. Learn More: http://vercel.link/node-version',
]);
@@ -254,17 +232,7 @@ it('should not warn when package.json engines matches project setting from confi
});
it('should get latest node version', async () => {
expect(getLatestNodeVersion()).toHaveProperty('major', 20);
});
it('should get latest node version with Node 18.x in build-container', async () => {
// Simulates AL2 build-container
expect(getLatestNodeVersion([14, 16, 18])).toHaveProperty('major', 18);
});
it('should get latest node version with Node 20.x in build-container', async () => {
// Simulates AL2023 build-container
expect(getLatestNodeVersion([20])).toHaveProperty('major', 20);
expect(getLatestNodeVersion()).toHaveProperty('major', 18);
});
it('should throw for discontinued versions', async () => {
@@ -332,19 +300,36 @@ it('should warn for deprecated versions, soon to be discontinued', async () => {
16
);
expect(warningMessages).toStrictEqual([
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-02-06 will fail to build. Please set "engines": { "node": "20.x" } in your `package.json` file to use Node.js 20.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-02-06 will fail to build. Please set Node.js Version to 20.x in your Project Settings to use Node.js 20.',
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set "engines": { "node": "18.x" } in your `package.json` file to use Node.js 18.',
'Error: Node.js version 10.x has reached End-of-Life. Deployments created on or after 2021-04-20 will fail to build. Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set "engines": { "node": "18.x" } in your `package.json` file to use Node.js 18.',
'Error: Node.js version 12.x has reached End-of-Life. Deployments created on or after 2022-10-03 will fail to build. Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set "engines": { "node": "18.x" } in your `package.json` file to use Node.js 18.',
'Error: Node.js version 14.x has reached End-of-Life. Deployments created on or after 2023-08-15 will fail to build. Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-02-06 will fail to build. Please set "engines": { "node": "18.x" } in your `package.json` file to use Node.js 18.',
'Error: Node.js version 16.x has reached End-of-Life. Deployments created on or after 2024-02-06 will fail to build. Please set Node.js Version to 18.x in your Project Settings to use Node.js 18.',
]);
global.Date.now = realDateNow;
});
it('should only allow nodejs20.x when env var is set', async () => {
try {
expect(getLatestNodeVersion()).toHaveProperty('major', 18);
await expect(getSupportedNodeVersion('20.x')).rejects.toThrow();
process.env.VERCEL_ALLOW_NODEJS20 = '1';
expect(getLatestNodeVersion()).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('20.x')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('20')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('20.1.0')).toHaveProperty('major', 20);
expect(await getSupportedNodeVersion('>=16')).toHaveProperty('major', 20);
} finally {
delete process.env.VERCEL_ALLOW_NODEJS20;
}
});
it('should support initialHeaders and initialStatus correctly', async () => {
new Prerender({
expiration: 1,

View File

@@ -1,100 +1,5 @@
# vercel
## 33.0.0
### Major Changes
- [cli] replace `--deprecated` with `--update-required` in `vc project ls` ([#10965](https://github.com/vercel/vercel/pull/10965))
### Patch Changes
- Fix `vercel bisect` selecting too many deployments ([#10956](https://github.com/vercel/vercel/pull/10956))
- Updated dependencies [[`6a9002f22`](https://github.com/vercel/vercel/commit/6a9002f2296c5ccce4522c0fa9a8938c3d7a4849), [`4d63d9e95`](https://github.com/vercel/vercel/commit/4d63d9e954549d811063d259250d1865b7de2ba1)]:
- @vercel/remix-builder@2.0.15
- @vercel/build-utils@7.4.0
- @vercel/static-build@2.0.15
- @vercel/node@3.0.13
## 32.7.2
### Patch Changes
- [cli] Use new `deprecated` query param in projects api for `vc project ls --deprecated` ([#10938](https://github.com/vercel/vercel/pull/10938))
## 32.7.1
### Patch Changes
- [cli] double page limit for vc project ls --deprecated ([#10932](https://github.com/vercel/vercel/pull/10932))
- Updated dependencies [[`d09dd1794`](https://github.com/vercel/vercel/commit/d09dd1794b5ffa28c15d3ad2880b90db2f4c06f0)]:
- @vercel/remix-builder@2.0.14
## 32.7.0
### Minor Changes
- [cli] add `--deprecated` option to `vc project ls` command ([#10919](https://github.com/vercel/vercel/pull/10919))
### Patch Changes
- Remove some debug statements and make log into warning ([#10926](https://github.com/vercel/vercel/pull/10926))
- Updated dependencies [[`3cede43ca`](https://github.com/vercel/vercel/commit/3cede43ca7ea3aec3ff33864b7d33da57891ddb2), [`dfe47f6e6`](https://github.com/vercel/vercel/commit/dfe47f6e6c1d395ae24d802f4b7c98e39b9f90f4), [`1dbb22bb6`](https://github.com/vercel/vercel/commit/1dbb22bb6d33657faa78376f527fe350188c5257), [`204c3592c`](https://github.com/vercel/vercel/commit/204c3592c78fc544e62f0210b0e7e1e4cd382a0c)]:
- @vercel/ruby@2.0.4
- @vercel/build-utils@7.3.0
- @vercel/remix-builder@2.0.13
- @vercel/node@3.0.12
- @vercel/static-build@2.0.14
## 32.6.1
### Patch Changes
- Revert "forbids globally installed @vercel/speed-insights and @vercel/analytics (#10848)" ([#10895](https://github.com/vercel/vercel/pull/10895))
## 32.6.0
### Minor Changes
- forbids globally installed @vercel/speed-insights and @vercel/analytics ([#10848](https://github.com/vercel/vercel/pull/10848))
### Patch Changes
- [cli] Fix behavior for combination of northstar user + team scope provided to cli as an argument. ([#10884](https://github.com/vercel/vercel/pull/10884))
- Updated dependencies [[`4edfcd74b`](https://github.com/vercel/vercel/commit/4edfcd74b6dfd8e9cbc05a71d47578051a2a7d63), [`0e9bb30fd`](https://github.com/vercel/vercel/commit/0e9bb30fd285492beadc365bece2ab1df67b387b), [`ca2cbf06f`](https://github.com/vercel/vercel/commit/ca2cbf06fbf252e23aff6e007d0df5ffc243b56e), [`c52bdf775`](https://github.com/vercel/vercel/commit/c52bdf77585dfa41b25cabe2f9403827d0964169)]:
- @vercel/remix-builder@2.0.12
- @vercel/static-build@2.0.13
- @vercel/go@3.0.4
## 32.5.6
### Patch Changes
- Updated dependencies [[`ffd2f34c6`](https://github.com/vercel/vercel/commit/ffd2f34c6c3d53bbb673aa3241845abc50e67c5e), [`4636ae54c`](https://github.com/vercel/vercel/commit/4636ae54c6c17709c1a058169cdca19c3df73ddb)]:
- @vercel/next@4.0.15
- @vercel/ruby@2.0.3
## 32.5.5
### Patch Changes
- Updated dependencies [[`88da7463c`](https://github.com/vercel/vercel/commit/88da7463ce12df91d49fbde85cb617030d55f558)]:
- @vercel/build-utils@7.2.5
- @vercel/node@3.0.11
- @vercel/static-build@2.0.12
## 32.5.4
### Patch Changes
- Updated dependencies [[`65dec5b7e`](https://github.com/vercel/vercel/commit/65dec5b7e752f4da8fe0ffdb25215170453f6f8b)]:
- @vercel/build-utils@7.2.4
- @vercel/node@3.0.10
- @vercel/static-build@2.0.11
## 32.5.3
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "33.0.0",
"version": "32.5.3",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -17,6 +17,7 @@
"test-dev": "pnpm test test/dev/",
"coverage": "codecov",
"build": "node scripts/build.mjs",
"watch": "node scripts/build.mjs --watch",
"dev": "ts-node ./src/index.ts",
"type-check": "tsc --noEmit"
},
@@ -31,17 +32,17 @@
"node": ">= 16"
},
"dependencies": {
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"@vercel/fun": "1.1.0",
"@vercel/go": "3.0.4",
"@vercel/go": "3.0.3",
"@vercel/hydrogen": "1.0.1",
"@vercel/next": "4.0.15",
"@vercel/node": "3.0.13",
"@vercel/next": "4.0.14",
"@vercel/node": "3.0.9",
"@vercel/python": "4.1.0",
"@vercel/redwood": "2.0.5",
"@vercel/remix-builder": "2.0.15",
"@vercel/ruby": "2.0.4",
"@vercel/static-build": "2.0.15",
"@vercel/remix-builder": "2.0.11",
"@vercel/ruby": "2.0.2",
"@vercel/static-build": "2.0.10",
"chokidar": "3.3.1"
},
"devDependencies": {
@@ -88,11 +89,11 @@
"@types/yauzl-promise": "2.1.0",
"@vercel-internals/constants": "1.0.4",
"@vercel-internals/get-package-json": "1.0.0",
"@vercel-internals/types": "1.0.18",
"@vercel/client": "13.0.11",
"@vercel-internals/types": "1.0.14",
"@vercel/client": "13.0.7",
"@vercel/error-utils": "2.0.2",
"@vercel/frameworks": "2.0.5",
"@vercel/fs-detectors": "5.1.5",
"@vercel/frameworks": "2.0.3",
"@vercel/fs-detectors": "5.1.3",
"@vercel/routing-utils": "3.1.0",
"ajv": "6.12.2",
"alpha-sort": "2.0.1",

View File

@@ -40,6 +40,7 @@ export const help = () => `
projects Manages your Projects
rm | remove [id] Removes a deployment
secrets [name] Manages your global Secrets, for use in Environment Variables
stores Manages your Stores
teams Manages your teams
whoami Shows the username of the currently logged in user

View File

@@ -188,18 +188,15 @@ export default async function bisect(client: Client): Promise<number> {
let newDeployments = chunk.deployments;
// If we have the "good" deployment in this chunk, then we're done
let hasGood = false;
for (let i = 0; i < newDeployments.length; i++) {
if (newDeployments[i].url === good) {
// grab all deployments up until the good one
newDeployments = newDeployments.slice(0, i);
hasGood = true;
break;
}
}
deployments = deployments.concat(newDeployments);
if (hasGood) break;
}
if (!deployments.length) {

View File

@@ -38,4 +38,5 @@ export default new Map([
['team', 'teams'],
['teams', 'teams'],
['whoami', 'whoami'],
['stores', 'stores'],
]);

View File

@@ -15,17 +15,7 @@ export const projectCommand: Command = {
name: 'ls',
description: 'Show all projects in the selected scope',
arguments: [],
options: [
{
name: 'update-required',
description: 'A list of projects affected by an upcoming deprecation',
argument: 'update-required',
shorthand: null,
type: 'boolean',
deprecated: false,
multi: false,
},
],
options: [],
examples: [],
},
{

View File

@@ -23,7 +23,6 @@ export default async function main(client: Client) {
argv = getArgs(client.argv.slice(2), {
'--next': Number,
'-N': '--next',
'--update-required': Boolean,
});
} catch (error) {
handleError(error);

View File

@@ -6,7 +6,6 @@ import Client from '../../util/client';
import getCommandFlags from '../../util/get-command-flags';
import { getCommandName } from '../../util/pkg-name';
import strlen from '../../util/strlen';
import { NODE_VERSIONS } from '@vercel/build-utils';
export default async function list(
client: Client,
@@ -28,19 +27,14 @@ export default async function list(
output.spinner(`Fetching projects in ${chalk.bold(contextName)}`);
let projectsUrl = `/v4/projects/?limit=20`;
const deprecated = argv['--update-required'] || false;
if (deprecated) {
projectsUrl += `&deprecated=${deprecated}`;
}
let projectsUrl = '/v4/projects/?limit=20';
const next = argv['--next'] || false;
if (next) {
projectsUrl += `&until=${next}`;
}
let {
const {
projects: projectList,
pagination,
}: {
@@ -54,34 +48,10 @@ export default async function list(
const elapsed = ms(Date.now() - start);
if (deprecated) {
const upcomingDeprecationVersionsList = [];
for (const nodeVersion of NODE_VERSIONS) {
if (
nodeVersion.discontinueDate &&
nodeVersion.discontinueDate.valueOf() > Date.now()
) {
upcomingDeprecationVersionsList.push(nodeVersion.range);
}
}
output.warn(
`The following Node.js versions will be deprecated soon: ${upcomingDeprecationVersionsList.join(
', '
)}. Please upgrade your projects immediately.`
);
output.log(
`For more information visit: https://vercel.com/docs/functions/serverless-functions/runtimes/node-js#node.js-version`
);
}
output.log(
`${
projectList.length > 0 ? 'Projects' : 'No projects'
} found under ${chalk.bold(contextName)} ${
deprecated ? 'that are using a deprecated Node.js version' : '\b'
} ${chalk.gray(`[${elapsed}]`)}`
} found under ${chalk.bold(contextName)} ${chalk.gray(`[${elapsed}]`)}`
);
if (projectList.length > 0) {

View File

@@ -0,0 +1,62 @@
import { Command } from '../help';
import { packageName } from '../../util/pkg-name';
export const storesCommand: Command = {
name: 'stores',
description: 'CRUD commands for stores.',
arguments: [
{
name: 'command',
required: true,
},
],
subcommands: [
{
name: 'create',
description: 'Create a new store',
arguments: [],
options: [
{
name: 'type',
description: 'Set the store type to create',
shorthand: 't',
type: 'string',
deprecated: false,
multi: false,
},
{
name: 'name',
description: 'Set the name of your new store',
shorthand: 'n',
type: 'string',
deprecated: false,
multi: false,
},
],
examples: [
{
name: 'Create a new store',
value: [`${packageName} store create`],
},
],
},
{
name: 'list',
description: 'List all your stores',
arguments: [],
options: [],
examples: [],
},
],
options: [
{
name: 'yes',
description: 'Skip the confirmation prompts',
shorthand: 'y',
type: 'boolean',
deprecated: false,
multi: false,
},
],
examples: [],
};

View File

@@ -0,0 +1,183 @@
import type { ProjectLinked, ProjectNotLinked } from '@vercel-internals/types';
import Client from '../../util/client';
import list from '../../util/input/list';
import text from '../../util/input/text';
import { createStore } from '../../util/stores/create-store';
import { linkStore } from '../../util/stores/link-store';
type Options = {
'--type': string;
'--name': string;
};
type CreateOptions = {
client: Client;
projectLink: ProjectLinked | ProjectNotLinked;
opts: Partial<Options>;
};
const VALID_STORE_TYPES = { blob: 'blob', kv: 'kv', postgres: 'postgres' };
function validStoreType(storetype: string) {
return Object.values(VALID_STORE_TYPES).includes(storetype);
}
async function inquireStoreType({
client,
opts,
}: CreateOptions): Promise<string | undefined> {
const storeType =
opts['--type'] ??
(await list(client, {
choices: [
{
name: 'Blob - Fast object storage',
value: VALID_STORE_TYPES.blob,
short: VALID_STORE_TYPES.blob,
},
{
name: 'KV - Durable Redis',
value: VALID_STORE_TYPES.kv,
short: VALID_STORE_TYPES.kv,
},
{
name: 'Postgres - Serverless SQL',
value: VALID_STORE_TYPES.postgres,
short: VALID_STORE_TYPES.postgres,
},
],
message: 'What kind of store do you want to create?',
}));
if (!validStoreType(storeType)) {
const validTypes = Object.values(VALID_STORE_TYPES).join(', ');
client.output.error(
`Received invalid store type '${storeType}'. Valid types are: ${validTypes}.`
);
return;
}
if (!storeType) {
client.output.log('Canceled');
return;
}
return storeType;
}
function validStoreName(storename: string) {
return storename.length > 5;
}
async function inquireStoreName(
storeType: string,
{ opts, client, projectLink }: CreateOptions
): Promise<string | undefined> {
const name =
opts['--name'] ??
(await text({
label: 'Select a store name: ',
validateValue: validStoreName,
initialValue:
projectLink.status === 'linked'
? `${projectLink.project.name}-${storeType}`
: `my-${storeType}-store`,
}));
if (!validStoreName(name)) {
client.output.error(
`Invalid store name '${name}'. Store names must be at least 6 characters long.`
);
return;
}
if (!name) {
client.output.log('No name input');
return;
}
return name;
}
const POSTGRES_REGIONS = [
'aws-us-east-1',
'aws-us-east-2',
'aws-us-west-2',
'aws-eu-central-1',
'aws-ap-southeast-1',
];
async function creaetPostgresStore(name: string, { client }: CreateOptions) {
const { region } = await client.prompt({
type: 'list',
name: 'region',
message:
'In which region should your database reads and writes take place?',
choices: POSTGRES_REGIONS,
default: POSTGRES_REGIONS[0],
});
return createStore({ client, payload: { name, region }, type: 'postgres' });
}
async function maybeLinkStore(
{ id, name }: { id: string; name: string },
{ client, projectLink }: CreateOptions
): Promise<boolean> {
if (projectLink.status === 'not_linked') {
client.output.print(
`\nYou can link the store later in the Vercel dashboard.`
);
return true;
}
const linked = await linkStore({ client, link: projectLink, name, id });
if (!linked) {
client.output.error('Failed to link store');
return false;
}
return true;
}
export async function create(options: CreateOptions) {
const { client } = options;
const type = await inquireStoreType(options);
if (!type) {
return 1;
}
const name = await inquireStoreName(type, options);
if (!name) {
return 1;
}
let result;
switch (type) {
case 'blob':
result = await createStore({ client, payload: { name }, type: 'blob' });
break;
case 'kv':
result = await createStore({ client, payload: { name }, type: 'redis' });
break;
case 'postgres':
result = await creaetPostgresStore(name, options);
}
if (!result) {
return 1;
}
const linked = await maybeLinkStore(result, options);
if (!linked) {
return 1;
}
return 0;
}

View File

@@ -0,0 +1,70 @@
import Client from '../../util/client';
import getArgs from '../../util/get-args';
import getInvalidSubcommand from '../../util/get-invalid-subcommand';
import getSubcommand from '../../util/get-subcommand';
import handleError from '../../util/handle-error';
import { getLinkedProject } from '../../util/projects/link';
import { help } from '../help';
import { storesCommand } from './command';
import { create } from './create';
import { list } from './list';
const COMMAND_CONFIG = {
create: ['create'],
list: ['list', 'ls'],
};
export const STORAGE_API_PATH = '/v1/storage';
export default async function main(client: Client) {
let argv;
try {
argv = getArgs(client.argv.slice(2), {
'--name': String,
'--n': '--name',
'--type': String,
'--t': '--type',
});
} catch (error) {
handleError(error);
return 1;
}
if (argv['--help']) {
client.output.print(
help(storesCommand, { columns: client.stderr.columns })
);
return 2;
}
const subArgs = argv._.slice(1);
const { subcommand } = getSubcommand(subArgs, COMMAND_CONFIG);
const { cwd, output } = client;
const link = await getLinkedProject(client, cwd);
if (link.status === 'error') {
return link.exitCode;
}
if (link.status === 'linked') {
client.config.currentTeam =
link.org.type === 'team' ? link.org.id : undefined;
}
switch (subcommand) {
case 'create':
return create({ opts: argv, client, projectLink: link });
case 'list':
return list({ client });
default:
output.error(getInvalidSubcommand(COMMAND_CONFIG));
client.output.print(
help(storesCommand, { columns: client.stderr.columns })
);
return 2;
}
}

View File

@@ -0,0 +1,26 @@
import Client from '../../util/client';
import { listStores } from '../../util/stores/list-stores';
import table from 'text-table';
type ListOptions = {
client: Client;
};
export async function list({ client }: ListOptions) {
const stores = await listStores({ client });
if (!stores) {
return 1;
}
client.output.print(
`\n${table([
['Type', 'Name', 'Id'],
...stores
.sort((a, b) => (a.type > b.type ? 1 : -1))
.map(store => [store.type, store.name, store.id]),
])}\n`
);
return 0;
}

View File

@@ -597,6 +597,9 @@ const main = async () => {
case 'whoami':
func = require('./commands/whoami').default;
break;
case 'stores':
func = require('./commands/stores').default;
break;
default:
func = null;
break;

View File

@@ -4,12 +4,12 @@ export const defaultGlobalConfig: GlobalConfig = {
'// Note':
'This is your Vercel config file. For more information see the global configuration documentation.',
'// Docs':
'https://vercel.com/docs/projects/project-configuration/global-configuration#config.json',
'https://vercel.com/docs/project-configuration#global-configuration/config-json',
collectMetrics: true,
};
export const defaultAuthConfig: AuthConfig = {
'// Note': 'This is your Vercel credentials file. DO NOT SHARE!',
'// Docs':
'https://vercel.com/docs/projects/project-configuration/global-configuration#auth.json',
'https://vercel.com/docs/project-configuration#global-configuration/auth-json',
};

View File

@@ -43,13 +43,10 @@ export default async function selectOrg(
})),
];
const defaultChoiceIndex = Math.max(
choices.findIndex(choice => choice.value.id === currentTeam),
0
);
const defaultOrgIndex = teams.findIndex(team => team.id === currentTeam) + 1;
if (autoConfirm) {
return choices[defaultChoiceIndex].value;
return choices[defaultOrgIndex].value;
}
const answers = await client.prompt({
@@ -57,7 +54,7 @@ export default async function selectOrg(
name: 'org',
message: question,
choices,
default: defaultChoiceIndex,
default: defaultOrgIndex,
});
const org = answers.org;

View File

@@ -0,0 +1,50 @@
import chalk from 'chalk';
import { JSONObject } from '@vercel-internals/types';
import { STORAGE_API_PATH } from '../../commands/stores';
import Client from '../client';
import stamp from '../output/stamp';
type CreateBlobResponse = {
store: {
id: string;
name: string;
};
};
export async function createStore(options: {
client: Client;
type: 'blob' | 'redis' | 'postgres';
payload: JSONObject;
}) {
const { client, type, payload } = options;
const pullStamp = stamp();
client.output.spinner('creating Blob store');
try {
const { store } = await client.fetch<CreateBlobResponse>(
`${STORAGE_API_PATH}/stores/${type}`,
{ method: 'POST', body: payload }
);
client.output.success(
`Created blob store ${chalk.bold(store.name)} ${chalk.gray(pullStamp())}`
);
return {
id: store.id,
name: store.name,
};
} catch (error) {
if (error instanceof Error) {
client.output.error(`Failed to create store: ${error.message}`);
return;
}
client.output.error(`Failed to create store: ${error}`);
}
}

View File

@@ -0,0 +1,63 @@
import chalk from 'chalk';
import { ProjectLinked } from '@vercel-internals/types';
import Client from '../client';
import { STORAGE_API_PATH } from '../../commands/stores';
import confirm from '../input/confirm';
import { getCommandName } from '../pkg-name';
export async function linkStore(options: {
name: string;
id: string;
client: Client;
link: ProjectLinked;
}) {
const {
client,
name,
id,
link: { project, org },
} = options;
const shouldLink = await confirm(
client,
`Should the ${chalk.bold(name)} store be linked to the ${chalk.bold(
project.name
)} project?`,
true
);
if (!shouldLink) {
return false;
}
try {
client.output.spinner('linking store');
await client.fetch(`${STORAGE_API_PATH}/stores/${id}/connections`, {
accountId: org.id,
method: 'POST',
body: {
projectId: project.id,
envVarEnvironments: ['production', 'preview', 'development'],
},
});
} catch {
return false;
}
client.output.success(
`Linked blob store ${chalk.bold(name)} to project ${chalk.bold(
project.name
)}\n`
);
client.output.print(
`Run ${getCommandName(
'env pull'
)} to download the newly created env variables.`
);
return true;
}

View File

@@ -0,0 +1,32 @@
import Client from '../client';
import { STORAGE_API_PATH } from '../../commands/stores';
type ListStoresResponse = {
stores: {
name: string;
id: string;
createdAt: number;
type: string;
}[];
};
export async function listStores(options: { client: Client }) {
const { client } = options;
client.output.spinner('fetching store list');
try {
const response = await client.fetch<ListStoresResponse>(
`${STORAGE_API_PATH}/stores`
);
return response.stores;
} catch (error) {
if (error instanceof Error) {
client.output.error(`Failed to fetch blob list: ${error.message}`);
return;
}
client.output.error(`Failed to fetch blob list: ${error}`);
}
}

View File

@@ -238,59 +238,51 @@ test('[vc build] should build project with corepack and select npm@8.1.0', async
});
test('[vc build] should build project with corepack and select pnpm@7.1.0', async () => {
try {
process.env.ENABLE_EXPERIMENTAL_COREPACK = '1';
const directory = await setupE2EFixture('vc-build-corepack-pnpm');
const before = await exec(directory, 'pnpm', ['--version']);
const output = await execCli(binaryPath, ['build'], { cwd: directory });
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toMatch(/Build Completed/gm);
const after = await exec(directory, 'pnpm', ['--version']);
// Ensure global pnpm didn't change
expect(before.stdout).toBe(after.stdout);
// Ensure version is correct
expect(
await fs.readFile(
path.join(directory, '.vercel/output/static/index.txt'),
'utf8'
)
).toBe('7.1.0\n');
// Ensure corepack will be cached
const contents = fs.readdirSync(
path.join(directory, '.vercel/cache/corepack')
);
expect(contents).toEqual(['home', 'shim']);
} finally {
delete process.env.ENABLE_EXPERIMENTAL_COREPACK;
}
process.env.ENABLE_EXPERIMENTAL_COREPACK = '1';
const directory = await setupE2EFixture('vc-build-corepack-pnpm');
const before = await exec(directory, 'pnpm', ['--version']);
const output = await execCli(binaryPath, ['build'], { cwd: directory });
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toMatch(/Build Completed/gm);
const after = await exec(directory, 'pnpm', ['--version']);
// Ensure global pnpm didn't change
expect(before.stdout).toBe(after.stdout);
// Ensure version is correct
expect(
await fs.readFile(
path.join(directory, '.vercel/output/static/index.txt'),
'utf8'
)
).toBe('7.1.0\n');
// Ensure corepack will be cached
const contents = fs.readdirSync(
path.join(directory, '.vercel/cache/corepack')
);
expect(contents).toEqual(['home', 'shim']);
});
test('[vc build] should build project with corepack and select yarn@2.4.3', async () => {
try {
process.env.ENABLE_EXPERIMENTAL_COREPACK = '1';
const directory = await setupE2EFixture('vc-build-corepack-yarn');
const before = await exec(directory, 'yarn', ['--version']);
const output = await execCli(binaryPath, ['build'], { cwd: directory });
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toMatch(/Build Completed/gm);
const after = await exec(directory, 'yarn', ['--version']);
// Ensure global yarn didn't change
expect(before.stdout).toBe(after.stdout);
// Ensure version is correct
expect(
await fs.readFile(
path.join(directory, '.vercel/output/static/index.txt'),
'utf8'
)
).toBe('2.4.3\n');
// Ensure corepack will be cached
const contents = fs.readdirSync(
path.join(directory, '.vercel/cache/corepack')
);
expect(contents).toEqual(['home', 'shim']);
} finally {
delete process.env.ENABLE_EXPERIMENTAL_COREPACK;
}
process.env.ENABLE_EXPERIMENTAL_COREPACK = '1';
const directory = await setupE2EFixture('vc-build-corepack-yarn');
const before = await exec(directory, 'yarn', ['--version']);
const output = await execCli(binaryPath, ['build'], { cwd: directory });
expect(output.exitCode, formatOutput(output)).toBe(0);
expect(output.stderr).toMatch(/Build Completed/gm);
const after = await exec(directory, 'yarn', ['--version']);
// Ensure global yarn didn't change
expect(before.stdout).toBe(after.stdout);
// Ensure version is correct
expect(
await fs.readFile(
path.join(directory, '.vercel/output/static/index.txt'),
'utf8'
)
).toBe('2.4.3\n');
// Ensure corepack will be cached
const contents = fs.readdirSync(
path.join(directory, '.vercel/cache/corepack')
);
expect(contents).toEqual(['home', 'shim']);
});
test('[vc dev] should print help from `vc develop --help`', async () => {

View File

@@ -353,7 +353,7 @@ export function useProject(
});
client.scenario.get(`/v4/projects`, (req, res) => {
res.json({
projects: [project],
projects: [defaultProject],
pagination: null,
});
});

View File

@@ -5,7 +5,10 @@ import { useTeams } from '../../mocks/team';
import { defaultProject, useProject } from '../../mocks/project';
import { client } from '../../mocks/client';
import type { Project } from '@vercel-internals/types';
import { parseSpacedTableRow } from '../../helpers/parse-table';
import {
pluckIdentifiersFromDeploymentList,
parseSpacedTableRow,
} from '../../helpers/parse-table';
describe('project', () => {
describe('list', () => {
@@ -25,7 +28,8 @@ describe('project', () => {
expect(line.value).toEqual(`Fetching projects in ${user.username}`);
line = await lines.next();
expect(line.value).toContain(user.username);
const { org } = pluckIdentifiersFromDeploymentList(line.value!);
expect(org).toEqual(user.username);
// empty line
line = await lines.next();
@@ -45,55 +49,6 @@ describe('project', () => {
expect(data).toEqual([project.project.name, 'https://foobar.com']);
});
it('should list projects running on an soon-to-be-deprecated Node.js version', async () => {
jest.useFakeTimers().setSystemTime(new Date('2023-12-08'));
const user = useUser();
useTeams('team_dummy');
const project = useProject({
...defaultProject,
nodeVersion: '16.x',
});
client.setArgv('project', 'ls', '--update-required');
await projects(client);
const lines = createLineIterator(client.stderr);
let line = await lines.next();
expect(line.value).toEqual(`Fetching projects in ${user.username}`);
line = await lines.next();
expect(line.value).toEqual(
'WARN! The following Node.js versions will be deprecated soon: 16.x. Please upgrade your projects immediately.'
);
line = await lines.next();
expect(line.value).toEqual(
'> For more information visit: https://vercel.com/docs/functions/serverless-functions/runtimes/node-js#node.js-version'
);
line = await lines.next();
expect(line.value).toContain(user.username);
// empty line
line = await lines.next();
expect(line.value).toEqual('');
line = await lines.next();
const header = parseSpacedTableRow(line.value!);
expect(header).toEqual([
'Project Name',
'Latest Production URL',
'Updated',
]);
line = await lines.next();
const data = parseSpacedTableRow(line.value!);
data.pop();
expect(data).toEqual([project.project.name, 'https://foobar.com']);
jest.clearAllTimers();
});
it('should list projects when there is no production deployment', async () => {
const user = useUser();
useTeams('team_dummy');
@@ -111,7 +66,8 @@ describe('project', () => {
expect(line.value).toEqual(`Fetching projects in ${user.username}`);
line = await lines.next();
expect(line.value).toContain(user.username);
const { org } = pluckIdentifiersFromDeploymentList(line.value!);
expect(org).toEqual(user.username);
// empty line
line = await lines.next();

View File

@@ -4,19 +4,10 @@ import { useTeams } from '../../../mocks/team';
import { useUser } from '../../../mocks/user';
describe('selectOrg', () => {
let user;
let team;
beforeEach(() => {
team = useTeams()[0];
});
describe('non-northstar', () => {
beforeEach(() => {
user = useUser();
});
it('should allow selecting user', async () => {
const user = useUser();
useTeams();
const selectOrgPromise = selectOrg(client, 'Select the scope');
await expect(client.stderr).toOutput(user.name);
client.stdin.write('\r'); // Return key
@@ -24,71 +15,26 @@ describe('selectOrg', () => {
});
it('should allow selecting team', async () => {
useUser();
const team = useTeams()[0];
const selectOrgPromise = selectOrg(client, 'Select the scope');
await expect(client.stderr).toOutput('Select the scope');
client.stdin.write('\x1B[B'); // Down arrow
client.stdin.write('\r'); // Return key
await expect(selectOrgPromise).resolves.toHaveProperty('id', team.id);
});
it('automatically selects the correct scope when autoconfirm flag is passed', async () => {
const selectOrgPromise = selectOrg(client, 'Select the scope', true);
await expect(selectOrgPromise).resolves.toHaveProperty('id', user.id);
});
describe('with a selected team scope', () => {
beforeEach(() => {
client.config.currentTeam = team.id;
});
afterEach(() => {
delete client.config.currentTeam;
});
it('should allow selecting user', async () => {
const selectOrgPromise = selectOrg(client, 'Select the scope');
await expect(client.stderr).toOutput(user.name);
client.stdin.write('\r'); // Return key
await expect(selectOrgPromise).resolves.toHaveProperty('id', team.id);
});
it('should allow selecting team', async () => {
const selectOrgPromise = selectOrg(client, 'Select the scope');
await expect(client.stderr).toOutput('Select the scope');
client.stdin.write('\x1B[B'); // Down arrow
client.stdin.write('\r'); // Return key
await expect(selectOrgPromise).resolves.toHaveProperty('id', user.id);
});
it('automatically selects the correct scope when autoconfirm flag is passed', async () => {
const selectOrgPromise = selectOrg(client, 'Select the scope', true);
await expect(selectOrgPromise).resolves.toHaveProperty('id', team.id);
});
});
});
describe('northstar', () => {
beforeEach(() => {
user = useUser({
it('should not allow selecting user', async () => {
const user = useUser({
version: 'northstar',
});
client.config.currentTeam = team.id;
});
afterEach(() => {
delete client.config.currentTeam;
});
it('should not allow selecting user', async () => {
const team = useTeams()[0];
const selectOrgPromise = selectOrg(client, 'Select the scope');
await expect(client.stderr).not.toOutput(user.name);
client.stdin.write('\r'); // Return key
await expect(selectOrgPromise).resolves.toHaveProperty('id', team.id);
});
it('automatically selects the correct scope when autoconfirm flag is passed', async () => {
const selectOrgPromise = selectOrg(client, 'Select the scope', true);
await expect(selectOrgPromise).resolves.toHaveProperty('id', team.id);
});
});
});

View File

@@ -1,33 +1,5 @@
# @vercel/client
## 13.0.11
### Patch Changes
- Updated dependencies [[`4d63d9e95`](https://github.com/vercel/vercel/commit/4d63d9e954549d811063d259250d1865b7de2ba1)]:
- @vercel/build-utils@7.4.0
## 13.0.10
### Patch Changes
- Updated dependencies [[`dfe47f6e6`](https://github.com/vercel/vercel/commit/dfe47f6e6c1d395ae24d802f4b7c98e39b9f90f4)]:
- @vercel/build-utils@7.3.0
## 13.0.9
### Patch Changes
- Updated dependencies [[`88da7463c`](https://github.com/vercel/vercel/commit/88da7463ce12df91d49fbde85cb617030d55f558)]:
- @vercel/build-utils@7.2.5
## 13.0.8
### Patch Changes
- Updated dependencies [[`65dec5b7e`](https://github.com/vercel/vercel/commit/65dec5b7e752f4da8fe0ffdb25215170453f6f8b)]:
- @vercel/build-utils@7.2.4
## 13.0.7
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/client",
"version": "13.0.11",
"version": "13.0.7",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"homepage": "https://vercel.com",
@@ -37,7 +37,7 @@
"typescript": "4.9.5"
},
"dependencies": {
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"@vercel/routing-utils": "3.1.0",
"@zeit/fetch": "5.2.0",
"async-retry": "1.2.3",

View File

@@ -1,17 +1,5 @@
# @vercel/frameworks
## 2.0.5
### Patch Changes
- This new screenshot matches the template. It removes the version number so this screenshot will not go stale. ([#10921](https://github.com/vercel/vercel/pull/10921))
## 2.0.4
### Patch Changes
- Update placeholder for Nuxt to be correct command. ([#10873](https://github.com/vercel/vercel/pull/10873))
## 2.0.3
### Patch Changes

View File

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

View File

@@ -66,7 +66,7 @@ export const frameworks = [
darkModeLogo:
'https://api-frameworks.vercel.sh/framework-logos/next-dark.svg',
screenshot:
'https://assets.vercel.com/image/upload/v1701461207/front/import/nextjs.png',
'https://assets.vercel.com/image/upload/v1673027027/front/import/nextjs.png',
tagline:
'Next.js makes you productive with React instantly — whether you want to build static or dynamic sites.',
description: 'A Next.js app and a Serverless Function API.',
@@ -1456,8 +1456,8 @@ export const frameworks = [
'`yarn install`, `pnpm install`, `npm install`, or `bun install`',
},
buildCommand: {
placeholder: '`npm run build` or `nuxt build`',
value: 'nuxt build',
placeholder: '`npm run build` or `nuxt generate`',
value: 'nuxt generate',
},
devCommand: {
value: 'nuxt',

View File

@@ -1,19 +1,5 @@
# @vercel/fs-detectors
## 5.1.5
### Patch Changes
- Updated dependencies [[`e6aaf79d0`](https://github.com/vercel/vercel/commit/e6aaf79d04fafd032d9a28143b02d28766add415)]:
- @vercel/frameworks@2.0.5
## 5.1.4
### Patch Changes
- Updated dependencies [[`a8934da62`](https://github.com/vercel/vercel/commit/a8934da6232b66a98e9ce43ebf5342eac664d40d)]:
- @vercel/frameworks@2.0.4
## 5.1.3
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/fs-detectors",
"version": "5.1.5",
"version": "5.1.3",
"description": "Vercel filesystem detectors",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -22,7 +22,7 @@
},
"dependencies": {
"@vercel/error-utils": "2.0.2",
"@vercel/frameworks": "2.0.5",
"@vercel/frameworks": "2.0.3",
"@vercel/routing-utils": "3.1.0",
"glob": "8.0.3",
"js-yaml": "4.1.0",
@@ -37,7 +37,7 @@
"@types/minimatch": "3.0.5",
"@types/node": "14.18.33",
"@types/semver": "7.3.10",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"jest-junit": "16.0.0",
"typescript": "4.9.5"
}

View File

@@ -1,35 +1,5 @@
# @vercel/gatsby-plugin-vercel-builder
## 2.0.13
### Patch Changes
- Add support for "rewrites" ([#10954](https://github.com/vercel/vercel/pull/10954))
- Updated dependencies [[`4d63d9e95`](https://github.com/vercel/vercel/commit/4d63d9e954549d811063d259250d1865b7de2ba1)]:
- @vercel/build-utils@7.4.0
## 2.0.12
### Patch Changes
- Updated dependencies [[`dfe47f6e6`](https://github.com/vercel/vercel/commit/dfe47f6e6c1d395ae24d802f4b7c98e39b9f90f4)]:
- @vercel/build-utils@7.3.0
## 2.0.11
### Patch Changes
- Updated dependencies [[`88da7463c`](https://github.com/vercel/vercel/commit/88da7463ce12df91d49fbde85cb617030d55f558)]:
- @vercel/build-utils@7.2.5
## 2.0.10
### Patch Changes
- Updated dependencies [[`65dec5b7e`](https://github.com/vercel/vercel/commit/65dec5b7e752f4da8fe0ffdb25215170453f6f8b)]:
- @vercel/build-utils@7.2.4
## 2.0.9
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/gatsby-plugin-vercel-builder",
"version": "2.0.13",
"version": "2.0.9",
"main": "dist/index.js",
"files": [
"dist",
@@ -20,7 +20,7 @@
},
"dependencies": {
"@sinclair/typebox": "0.25.24",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"@vercel/routing-utils": "3.1.0",
"esbuild": "0.14.47",
"etag": "1.8.1",

View File

@@ -1,8 +1,4 @@
import {
getTransformedRoutes,
type Redirect,
type Rewrite,
} from '@vercel/routing-utils';
import { getTransformedRoutes } from '@vercel/routing-utils';
import { writeJson } from 'fs-extra';
import { validateGatsbyState } from './schemas';
import {
@@ -35,7 +31,7 @@ export async function generateVercelBuildOutputAPI3Output({
if (validateGatsbyState.Check(state)) {
console.log('▲ Creating Vercel build output');
const { pages, functions, config: gatsbyConfig } = state;
const { pages, redirects, functions, config: gatsbyConfig } = state;
const { pathPrefix = '' } = gatsbyConfig;
const ssrRoutes = pages
@@ -64,36 +60,14 @@ export async function generateVercelBuildOutputAPI3Output({
trailingSlash = false;
}
const redirects: Redirect[] = [];
const rewrites: Rewrite[] = [];
for (const {
fromPath,
toPath,
isPermanent,
statusCode,
} of state.redirects) {
if (statusCode === 200) {
// A `statusCode` of 200 on `createRedirect()` creates a rewrite (i.e. a reverse proxy)
// https://www.gatsbyjs.com/docs/how-to/cloud/working-with-redirects-and-rewrites/#rewrites-and-reverse-proxies
rewrites.push({
source: fromPath,
destination: toPath,
});
} else {
redirects.push({
source: fromPath,
destination: toPath,
permanent: isPermanent,
});
}
}
const routes =
getTransformedRoutes({
trailingSlash,
redirects,
rewrites,
redirects: redirects.map(({ fromPath, toPath, isPermanent }) => ({
source: fromPath,
destination: toPath,
permanent: isPermanent,
})),
}).routes || [];
routes.push({

View File

@@ -31,7 +31,6 @@ const GatsbyRedirectSchema = Type.Object({
fromPath: Type.String(),
toPath: Type.String(),
isPermanent: Type.Optional(Type.Boolean()),
statusCode: Type.Optional(Type.Number()),
});
export type GatsbyRedirect = Static<typeof GatsbyRedirectSchema>;

View File

@@ -1,11 +1,5 @@
# @vercel/go
## 3.0.4
### Patch Changes
- Set Lambda runtime to "provided.al2" ([#10880](https://github.com/vercel/vercel/pull/10880))
## 3.0.3
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/go",
"version": "3.0.4",
"version": "3.0.3",
"license": "Apache-2.0",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
@@ -29,7 +29,7 @@
"@types/node-fetch": "^2.3.0",
"@types/tar": "6.1.5",
"@types/yauzl-promise": "2.1.0",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"async-retry": "1.3.3",
"execa": "^1.0.0",
"fs-extra": "^7.0.0",

View File

@@ -50,7 +50,7 @@ export { shouldServe };
// we need our `main.go` to be called something else
const MAIN_GO_FILENAME = 'main__vc__go__.go';
const HANDLER_FILENAME = `bootstrap${OUT_EXTENSION}`;
const HANDLER_FILENAME = `handler${OUT_EXTENSION}`;
interface PortInfo {
port: number;
@@ -249,14 +249,10 @@ export async function build({
await buildHandlerWithGoMod(buildOptions);
}
const runtime =
process.env.VERCEL_USE_GO_PROVIDED_RUNTIME === '1'
? 'provided.al2'
: 'go1.x';
const lambda = new Lambda({
files: { ...(await glob('**', outDir)), ...includedFiles },
handler: HANDLER_FILENAME,
runtime,
runtime: 'go1.x',
supportsWrapper: true,
environment: {},
});

View File

@@ -26,7 +26,7 @@
"devDependencies": {
"@types/jest": "27.5.1",
"@types/node": "14.18.33",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"execa": "3.2.0",
"fs-extra": "11.1.0",
"jest-junit": "16.0.0"

View File

@@ -1,11 +1,5 @@
# @vercel/next
## 4.0.15
### Patch Changes
- ensure function configs work for paths inside of route groups ([#10855](https://github.com/vercel/vercel/pull/10855))
## 4.0.14
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/next",
"version": "4.0.15",
"version": "4.0.14",
"license": "Apache-2.0",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
@@ -40,7 +40,7 @@
"@types/semver": "6.0.0",
"@types/text-table": "0.2.1",
"@types/webpack-sources": "3.2.0",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"@vercel/routing-utils": "3.1.0",
"async-sema": "3.0.1",
"buffer-crc32": "0.2.13",

View File

@@ -875,7 +875,6 @@ export async function serverBuild({
initialPseudoLayerUncompressed: uncompressedInitialSize,
internalPages,
pageExtensions,
inversedAppPathManifest,
});
const appRouteHandlersLambdaGroups = await getPageLambdaGroups({
@@ -893,7 +892,6 @@ export async function serverBuild({
initialPseudoLayerUncompressed: uncompressedInitialSize,
internalPages,
pageExtensions,
inversedAppPathManifest,
});
for (const group of appRouterLambdaGroups) {

View File

@@ -1501,7 +1501,6 @@ export async function getPageLambdaGroups({
lambdaCompressedByteLimit,
internalPages,
pageExtensions,
inversedAppPathManifest,
}: {
entryPath: string;
config: Config;
@@ -1523,7 +1522,6 @@ export async function getPageLambdaGroups({
lambdaCompressedByteLimit: number;
internalPages: string[];
pageExtensions?: string[];
inversedAppPathManifest?: Record<string, string>;
}) {
const groups: Array<LambdaGroup> = [];
@@ -1543,15 +1541,9 @@ export async function getPageLambdaGroups({
}
if (config && config.functions) {
// `pages` are normalized without route groups (e.g., /app/(group)/page.js).
// we keep track of that mapping in `inversedAppPathManifest`
// `getSourceFilePathFromPage` needs to use the path from source to properly match the config
const pageFromManifest = inversedAppPathManifest?.[routeName];
const sourceFile = await getSourceFilePathFromPage({
workPath: entryPath,
// since this function is used by both `pages` and `app`, the manifest might not be provided
// so fallback to normal behavior of just checking the `page`.
page: pageFromManifest ?? page,
page,
pageExtensions,
});

View File

@@ -1,4 +0,0 @@
export const GET = req => {
console.log(req.url);
return new Response('hello world');
};

View File

@@ -1,11 +0,0 @@
export default function Page({params}) {
return (
<>
<p>
Catch All Page. Params:{' '}
<span id="catch-all-page-params">{JSON.stringify(params)}</span>
</p>
{children}
</>
);
}

View File

@@ -171,7 +171,7 @@
// should match /_next file after rewrite
{
"path": "/hidden/_next/__NEXT_SCRIPT__(/hello)",
"status": 200
"mustContain": "createElement"
},
// should allow redirecting to external resource
{

View File

@@ -85,27 +85,15 @@ if (parseInt(process.versions.node.split('.')[0], 10) >= 16) {
expect(buildResult.output['dashboard/changelog']).toBeDefined();
expect(buildResult.output['dashboard/deployments/[id]']).toBeDefined();
// ensure that function configs are properly applied across pages & app dir outputs
[
// pages dir route handler
'api/hello',
// app dir route handler
'api/hello-again',
// app dir route handler inside of a group
'api/hello-again/with-group',
// server component inside of a group
'dynamic-group/[slug]',
'dynamic-group/[slug].rsc',
// server component
'dynamic/[category]/[id]',
'dynamic/[category]/[id].rsc',
].forEach(fnKey => {
expect(buildResult.output[fnKey]).toBeDefined();
expect(buildResult.output[fnKey].type).toBe('Lambda');
expect(buildResult.output[fnKey].memory).toBe(512);
expect(buildResult.output[fnKey].maxDuration).toBe(5);
});
expect(buildResult.output['api/hello']).toBeDefined();
expect(buildResult.output['api/hello'].type).toBe('Lambda');
expect(buildResult.output['api/hello'].memory).toBe(512);
expect(buildResult.output['api/hello'].maxDuration).toBe(5);
expect(buildResult.output['api/hello-again']).toBeDefined();
expect(buildResult.output['api/hello-again'].type).toBe('Lambda');
expect(buildResult.output['api/hello-again'].memory).toBe(512);
expect(buildResult.output['api/hello-again'].maxDuration).toBe(5);
expect(
buildResult.output['api/hello-again'].supportsResponseStreaming
).toBe(true);

View File

@@ -1,33 +1,5 @@
# @vercel/node
## 3.0.13
### Patch Changes
- Updated dependencies [[`4d63d9e95`](https://github.com/vercel/vercel/commit/4d63d9e954549d811063d259250d1865b7de2ba1)]:
- @vercel/build-utils@7.4.0
## 3.0.12
### Patch Changes
- Updated dependencies [[`dfe47f6e6`](https://github.com/vercel/vercel/commit/dfe47f6e6c1d395ae24d802f4b7c98e39b9f90f4)]:
- @vercel/build-utils@7.3.0
## 3.0.11
### Patch Changes
- Updated dependencies [[`88da7463c`](https://github.com/vercel/vercel/commit/88da7463ce12df91d49fbde85cb617030d55f558)]:
- @vercel/build-utils@7.2.5
## 3.0.10
### Patch Changes
- Updated dependencies [[`65dec5b7e`](https://github.com/vercel/vercel/commit/65dec5b7e752f4da8fe0ffdb25215170453f6f8b)]:
- @vercel/build-utils@7.2.4
## 3.0.9
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/node",
"version": "3.0.13",
"version": "3.0.9",
"license": "Apache-2.0",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
@@ -24,7 +24,7 @@
"@edge-runtime/primitives": "4.0.5",
"@edge-runtime/vm": "3.1.7",
"@types/node": "14.18.33",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"@vercel/error-utils": "2.0.2",
"@vercel/nft": "0.24.2",
"@vercel/static-config": "3.0.0",

View File

@@ -26,7 +26,7 @@
"@types/jest": "27.4.1",
"@types/node": "14.18.33",
"@types/which": "3.0.0",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"execa": "^1.0.0",
"fs-extra": "11.1.1",
"jest-junit": "16.0.0",

View File

@@ -28,7 +28,7 @@
"@types/aws-lambda": "8.10.19",
"@types/node": "14.18.33",
"@types/semver": "6.0.0",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"execa": "3.2.0",
"fs-extra": "11.1.0",
"jest-junit": "16.0.0"

View File

@@ -1,31 +1,5 @@
# @vercel/remix-builder
## 2.0.15
### Patch Changes
- Update `@remix-run/dev` fork to v2.4.0 ([#10943](https://github.com/vercel/vercel/pull/10943))
## 2.0.14
### Patch Changes
- Reinstall dependencies during `prepareCache()` ([#10922](https://github.com/vercel/vercel/pull/10922))
## 2.0.13
### Patch Changes
- Update `@remix-run/dev` fork to v2.3.1 ([#10908](https://github.com/vercel/vercel/pull/10908))
## 2.0.12
### Patch Changes
- Fix issue where `npm install` was not properly injecting forked compiler ([#10819](https://github.com/vercel/vercel/pull/10819))
- Simplify static directory resolution and apply `publicPath` to routes. ([#10685](https://github.com/vercel/vercel/pull/10685))
## 2.0.11
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/remix-builder",
"version": "2.0.15",
"version": "2.0.11",
"license": "Apache-2.0",
"main": "./dist/index.js",
"homepage": "https://vercel.com/docs",
@@ -26,11 +26,11 @@
"ts-morph": "12.0.0"
},
"devDependencies": {
"@remix-run/dev": "npm:@vercel/remix-run-dev@2.4.0",
"@remix-run/dev": "npm:@vercel/remix-run-dev@2.2.0",
"@types/jest": "27.5.1",
"@types/node": "14.18.33",
"@types/semver": "7.3.13",
"@vercel/build-utils": "7.4.0",
"@vercel/build-utils": "7.2.3",
"jest-junit": "16.0.0",
"path-to-regexp": "6.2.1",
"semver": "7.5.2"

View File

@@ -1,6 +1,6 @@
import { Project } from 'ts-morph';
import { readFileSync, promises as fs } from 'fs';
import { basename, dirname, extname, join, posix, relative, sep } from 'path';
import { basename, dirname, extname, join, relative, sep } from 'path';
import {
debug,
download,
@@ -13,7 +13,6 @@ import {
glob,
EdgeFunction,
NodejsLambda,
rename,
runNpmInstall,
runPackageJsonScript,
scanParentDirs,
@@ -41,6 +40,7 @@ import {
ResolvedEdgeRouteConfig,
findEntry,
chdirAndReadConfig,
addDependencies,
resolveSemverMinMax,
ensureResolvable,
isESM,
@@ -104,17 +104,15 @@ export const build: BuildV2 = async ({
meta
);
const { cliType, packageJsonPath, lockfileVersion, lockfilePath } =
await scanParentDirs(entrypointFsDirname);
const { cliType, packageJsonPath, lockfileVersion } = await scanParentDirs(
entrypointFsDirname
);
if (!packageJsonPath) {
throw new Error('Failed to locate `package.json` file in your project');
}
const [lockfileRaw, pkgRaw] = await Promise.all([
lockfilePath ? fs.readFile(lockfilePath) : null,
fs.readFile(packageJsonPath, 'utf8'),
]);
const pkgRaw = await fs.readFile(packageJsonPath, 'utf8');
const pkg = JSON.parse(pkgRaw);
const spawnOpts = getSpawnOptions(meta, nodeVersion);
@@ -168,7 +166,7 @@ export const build: BuildV2 = async ({
const { serverEntryPoint, appDirectory } = remixConfig;
const remixRoutes = Object.values(remixConfig.routes);
let depsModified = false;
const depsToAdd: string[] = [];
const remixRunDevPkgVersion: string | undefined =
pkg.dependencies?.['@remix-run/dev'] ||
@@ -186,15 +184,9 @@ export const build: BuildV2 = async ({
REMIX_RUN_DEV_MAX_VERSION,
remixVersion
);
// Remove `@remix-run/dev`, add `@vercel/remix-run-dev`
if (pkg.devDependencies['@remix-run/dev']) {
delete pkg.devDependencies['@remix-run/dev'];
pkg.devDependencies['@vercel/remix-run-dev'] = remixDevForkVersion;
} else {
delete pkg.dependencies['@remix-run/dev'];
pkg.dependencies['@vercel/remix-run-dev'] = remixDevForkVersion;
}
depsModified = true;
depsToAdd.push(
`@remix-run/dev@npm:@vercel/remix-run-dev@${remixDevForkVersion}`
);
}
// `app/entry.server.tsx` and `app/entry.client.tsx` are optional in Remix,
@@ -217,34 +209,15 @@ export const build: BuildV2 = async ({
REMIX_RUN_DEV_MAX_VERSION,
remixVersion
);
pkg.dependencies['@vercel/remix'] = vercelRemixVersion;
depsModified = true;
depsToAdd.push(`@vercel/remix@${vercelRemixVersion}`);
}
}
if (depsModified) {
await fs.writeFile(packageJsonPath, JSON.stringify(pkg, null, 2) + '\n');
// Bypass `--frozen-lockfile` enforcement by removing
// env vars that are considered to be CI
const nonCiEnv = { ...spawnOpts.env };
delete nonCiEnv.CI;
delete nonCiEnv.VERCEL;
delete nonCiEnv.NOW_BUILDER;
// Purposefully not passing `meta` here to avoid
// the optimization that prevents `npm install`
// from running a second time
await runNpmInstall(
entrypointFsDirname,
[],
{
...spawnOpts,
env: nonCiEnv,
},
undefined,
nodeVersion
);
if (depsToAdd.length) {
await addDependencies(cliType, depsToAdd, {
...spawnOpts,
cwd: entrypointFsDirname,
});
}
const userEntryClientFile = findEntry(
@@ -425,7 +398,9 @@ module.exports = config;`;
cleanupOps.push(
fs
.rename(renamedRemixConfigPath, remixConfigPath)
.then(() => debug(`Restored original "${remixConfigPath}" file`))
.then(() =>
debug(`Restored original "${basename(remixConfigPath)}" file`)
)
);
}
// Restore original server entrypoint if it was modified (for Hydrogen v2)
@@ -433,24 +408,11 @@ module.exports = config;`;
cleanupOps.push(
fs
.writeFile(serverEntryPointAbs, originalServerEntryPoint)
.then(() => debug(`Restored original "${serverEntryPointAbs}" file`))
.then(() =>
debug(`Restored original "${basename(serverEntryPointAbs!)}" file`)
)
);
}
// Restore original `package.json` file and lockfile
if (depsModified) {
cleanupOps.push(
fs
.writeFile(packageJsonPath, pkgRaw)
.then(() => debug(`Restored original "${packageJsonPath}" file`))
);
if (lockfilePath && lockfileRaw) {
cleanupOps.push(
fs
.writeFile(lockfilePath, lockfileRaw)
.then(() => debug(`Restored original "${lockfilePath}" file`))
);
}
}
await Promise.all(cleanupOps);
}
@@ -466,11 +428,16 @@ module.exports = config;`;
: null,
]);
const staticDir = join(entrypointFsDirname, 'public');
const [staticFiles, buildAssets, ...functions] = await Promise.all([
const staticDir = join(
remixConfig.assetsBuildDirectory,
...remixConfig.publicPath
.replace(/^\/|\/$/g, '')
.split('/')
// eslint-disable-next-line @typescript-eslint/no-unused-vars
.map(_ => '..')
);
const [staticFiles, ...functions] = await Promise.all([
glob('**', staticDir),
glob('**', remixConfig.assetsBuildDirectory),
...serverBundles.map(bundle => {
const firstRoute = remixConfig.routes[bundle.routes[0]];
const config = resolvedConfigsMap.get(firstRoute) ?? {
@@ -500,17 +467,10 @@ module.exports = config;`;
}),
]);
const transformedBuildAssets = rename(buildAssets, name => {
return posix.join('./', remixConfig.publicPath, name);
});
const output: BuildResultV2Typical['output'] = {
...staticFiles,
...transformedBuildAssets,
};
const output: BuildResultV2Typical['output'] = staticFiles;
const routes: any[] = [
{
src: `^/${remixConfig.publicPath.replace(/^\/|\/$/g, '')}/(.*)$`,
src: '^/build/(.*)$',
headers: { 'cache-control': 'public, max-age=31536000, immutable' },
continue: true,
},

View File

@@ -1,9 +1,4 @@
import {
getNodeVersion,
getSpawnOptions,
glob,
runNpmInstall,
} from '@vercel/build-utils';
import { glob } from '@vercel/build-utils';
import { dirname, join, relative } from 'path';
import { require_, chdirAndReadConfig } from './utils';
import type { PrepareCache } from '@vercel/build-utils';
@@ -12,32 +7,10 @@ export const prepareCache: PrepareCache = async ({
entrypoint,
repoRootPath,
workPath,
config,
}) => {
const root = repoRootPath || workPath;
const mountpoint = dirname(entrypoint);
const entrypointFsDirname = join(workPath, mountpoint);
// Because the `node_modules` directory was modified to install
// the forked Remix compiler, re-install to the "fresh" dependencies
// state before the cache gets created.
const nodeVersion = await getNodeVersion(
entrypointFsDirname,
undefined,
config
);
const spawnOpts = getSpawnOptions({}, nodeVersion);
await runNpmInstall(
entrypointFsDirname,
[],
{
...spawnOpts,
stdio: 'ignore',
},
undefined,
nodeVersion
);
const packageJsonPath = join(entrypointFsDirname, 'package.json');
const remixRunDevPath = dirname(
require_.resolve('@remix-run/dev/package.json', {

View File

@@ -1,8 +1,9 @@
import semver from 'semver';
import { execSync } from 'child_process';
import { existsSync, promises as fs } from 'fs';
import { basename, dirname, join, relative, resolve, sep } from 'path';
import { pathToRegexp, Key } from 'path-to-regexp';
import { debug } from '@vercel/build-utils';
import { debug, spawnAsync } from '@vercel/build-utils';
import { walkParentDirs } from '@vercel/build-utils';
import { createRequire } from 'module';
import type {
@@ -11,6 +12,10 @@ import type {
} from '@remix-run/dev/dist/config/routes';
import type { RemixConfig } from '@remix-run/dev/dist/config';
import type { BaseFunctionConfig } from '@vercel/static-config';
import type {
CliType,
SpawnOptionsExtended,
} from '@vercel/build-utils/dist/fs/run-user-scripts';
export const require_ = createRequire(__filename);
@@ -255,6 +260,65 @@ export async function chdirAndReadConfig(
return remixConfig;
}
export interface AddDependenciesOptions extends SpawnOptionsExtended {
saveDev?: boolean;
}
/**
* Runs `npm i ${name}` / `pnpm i ${name}` / `yarn add ${name}`.
*/
export function addDependencies(
cliType: CliType,
names: string[],
opts: AddDependenciesOptions = {}
) {
debug('Installing additional dependencies:');
for (const name of names) {
debug(` - ${name}`);
}
const args: string[] = [];
switch (cliType) {
case 'npm':
case 'pnpm':
args.push('install');
if (opts.saveDev) {
args.push('--save-dev');
}
// Don't fail if pnpm is being run at the workspace root
if (cliType === 'pnpm' && opts.cwd) {
if (existsSync(join(opts.cwd, 'pnpm-workspace.yaml'))) {
args.push('--workspace-root');
}
}
break;
case 'bun':
case 'yarn':
args.push('add');
if (opts.saveDev) {
args.push('--dev');
}
if (cliType === 'yarn') {
const yarnVersion = execSync('yarn -v', { encoding: 'utf8' }).trim();
const isYarnV1 = semver.satisfies(yarnVersion, '1');
if (isYarnV1) {
// Ignoring workspace check is only needed on Yarn v1
args.push('--ignore-workspace-root-check');
}
}
break;
default: {
const n: never = cliType;
throw new Error(`Unexpected package manager: ${n}`);
}
}
return spawnAsync(cliType, args.concat(names), opts);
}
export function resolveSemverMinMax(
min: string,
max: string,

View File

@@ -1,7 +1,6 @@
{
"probes": [
{ "path": "/", "mustContain": "Welcome to Remix" },
{ "path": "/edge", "mustContain": "Welcome to Remix@Edge" },
{ "path": "/remix.svg", "mustContain": "<svg" }
{ "path": "/edge", "mustContain": "Welcome to Remix@Edge" }
]
}

View File

@@ -1,6 +0,0 @@
<svg viewBox="0 0 800 800" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M700 0H100C44.772 0 0 44.772 0 100v600c0 55.228 44.772 100 100 100h600c55.228 0 100-44.772 100-100V100C800 44.772 755.228 0 700 0Z" fill="#212121"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M587.947 527.768c4.254 54.65 4.254 80.268 4.254 108.232H465.756c0-6.091.109-11.663.219-17.313.342-17.564.699-35.88-2.147-72.868-3.761-54.152-27.08-66.185-69.957-66.185H195v-98.525h204.889c54.16 0 81.241-16.476 81.241-60.098 0-38.357-27.081-61.601-81.241-61.601H195V163h227.456C545.069 163 606 220.912 606 313.42c0 69.193-42.877 114.319-100.799 121.84 48.895 9.777 77.48 37.605 82.746 92.508Z" fill="#fff"/>
<path d="M195 636v-73.447h133.697c22.332 0 27.181 16.563 27.181 26.441V636H195Z" fill="#fff"/>
<path d="M194.5 636v.5h161.878v-47.506c0-5.006-1.226-11.734-5.315-17.224-4.108-5.515-11.059-9.717-22.366-9.717H194.5V636Z" stroke="#fff" stroke-opacity=".8"/>
</svg>

Before

Width:  |  Height:  |  Size: 958 B

View File

@@ -1,6 +0,0 @@
node_modules
site/.cache
site/build
site/asset-pub
.env
.vercel

View File

@@ -1 +0,0 @@
Hello World!

View File

@@ -1 +0,0 @@
This file is not public

View File

@@ -1,10 +0,0 @@
{
"probes": [
{ "path": "/", "mustContain": "Welcome to Remix" },
{ "path": "/edge", "mustContain": "Welcome to Remix@Edge" },
{ "path": "/blog/foo", "mustContain": "Blog Page" },
{ "path": "/hello.txt", "mustContain": "Hello World!" },
{ "path": "/private.txt", "status": 404 },
{ "path": "/common/private.txt", "status": 404 }
]
}

View File

@@ -1,33 +0,0 @@
import { cssBundleHref } from "@remix-run/css-bundle";
import type { LinksFunction } from "@vercel/remix";
import {
Links,
LiveReload,
Meta,
Outlet,
Scripts,
ScrollRestoration,
} from "@remix-run/react";
export const links: LinksFunction = () => [
...(cssBundleHref ? [{ rel: "stylesheet", href: cssBundleHref }] : []),
];
export default function App() {
return (
<html lang="en">
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<Meta />
<Links />
</head>
<body>
<Outlet />
<ScrollRestoration />
<Scripts />
<LiveReload />
</body>
</html>
);
}

View File

@@ -1,16 +0,0 @@
import type { MetaFunction } from "@vercel/remix";
export const meta: MetaFunction = () => {
return [
{ title: "New Remix App" },
{ name: "description", content: "Welcome to Remix!" },
];
};
export default function Index() {
return (
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.8" }}>
<h1>Welcome to Remix</h1>
</div>
);
}

View File

@@ -1,11 +0,0 @@
import type { MetaFunction } from "@vercel/remix";
export const meta: MetaFunction = () => [{ title: "Blog Page | New Remix App" }];
export default function Blog() {
return (
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.4" }}>
<h1>Blog Page</h1>
</div>
);
}

View File

@@ -1,13 +0,0 @@
import type { MetaFunction } from "@vercel/remix";
export const config = { runtime: "edge" };
export const meta: MetaFunction = () => [{ title: "Remix@Edge | New Remix App" }];
export default function Edge() {
return (
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.4" }}>
<h1>Welcome to Remix@Edge</h1>
</div>
);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,31 +0,0 @@
{
"name": "my-remix-app",
"private": true,
"sideEffects": false,
"type": "module",
"scripts": {
"build": "remix build",
"dev": "remix dev --manual",
"start": "remix-serve ./build/index.js",
"typecheck": "tsc"
},
"dependencies": {
"@remix-run/css-bundle": "^2.2.0",
"@remix-run/node": "^2.2.0",
"@remix-run/react": "^2.2.0",
"@remix-run/serve": "^2.2.0",
"@vercel/remix": "^2.2.0",
"isbot": "^3.7.1",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@remix-run/dev": "^2.2.0",
"@types/react": "^18.2.37",
"@types/react-dom": "^18.2.15",
"typescript": "^5.2.2"
},
"engines": {
"node": ">=18.0.0"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

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