mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-11 12:57:46 +00:00
Compare commits
25 Commits
@vercel/ne
...
@vercel/py
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b37ac5f798 | ||
|
|
01ad4c4c8e | ||
|
|
577fd3e979 | ||
|
|
d649a3c931 | ||
|
|
a036b03398 | ||
|
|
1a6a030df5 | ||
|
|
fc8b68eda2 | ||
|
|
9ecc89a3c7 | ||
|
|
2a4e066163 | ||
|
|
a19447f9cd | ||
|
|
dd032e8efa | ||
|
|
b8079b8521 | ||
|
|
f875825893 | ||
|
|
3ac4540202 | ||
|
|
0bbf826213 | ||
|
|
f7dd553239 | ||
|
|
71b9ac6976 | ||
|
|
191f63d03b | ||
|
|
b11210e9ed | ||
|
|
164d392f56 | ||
|
|
9b1c30913f | ||
|
|
5d387517b1 | ||
|
|
97e0eb370e | ||
|
|
fa154098c8 | ||
|
|
6405a20dd3 |
11
.github/CONTRIBUTING.md
vendored
11
.github/CONTRIBUTING.md
vendored
@@ -23,6 +23,17 @@ yarn test-unit
|
||||
|
||||
Make sure all the tests pass before making changes.
|
||||
|
||||
### Running Vercel CLI Changes
|
||||
|
||||
You can use `yarn dev` from the `cli` package to invoke Vercel CLI with local changes:
|
||||
|
||||
```
|
||||
cd ./packages/cli
|
||||
yarn dev <cli-commands...>
|
||||
```
|
||||
|
||||
See [CLI Local Development](../packages/cli#local-development) for more details.
|
||||
|
||||
## Verifying your change
|
||||
|
||||
Once you are done with your changes (we even suggest doing it along the way), make sure all the tests still pass by running:
|
||||
|
||||
@@ -33,6 +33,14 @@ For details on how to use Vercel, check out our [documentation](https://vercel.c
|
||||
|
||||
## Contributing
|
||||
|
||||
This project uses [yarn](https://yarnpkg.com/) to install dependencies and run scripts.
|
||||
|
||||
You can use the `dev` script to run local changes as if you were invoking Vercel CLI. For example, `vercel deploy --cwd=/path/to/project` could be run with local changes with `yarn dev deploy --cwd=/path/to/project`.
|
||||
|
||||
See the [Contributing Guidelines](./.github/CONTRIBUTING.md) for more details.
|
||||
|
||||
## Reference
|
||||
|
||||
- [Code of Conduct](./.github/CODE_OF_CONDUCT.md)
|
||||
- [Contributing Guidelines](./.github/CONTRIBUTING.md)
|
||||
- [Apache 2.0 License](./LICENSE)
|
||||
|
||||
@@ -27,7 +27,7 @@ Serverless:
|
||||
- Runs `npm run now-build`
|
||||
- Does not run `npm install --production` as the output from the build is all that's needed to bundle lambdas.
|
||||
- No runtime dependencies, meaning smaller lambda functions
|
||||
- Optimized for fast [cold start](https://vercel.com/blog/serverless-ssr#cold-start)
|
||||
- Optimized for fast cold start
|
||||
|
||||
#### Possible Ways to Fix It
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = nextConfig;
|
||||
module.exports = nextConfig
|
||||
|
||||
516
examples/nextjs/package-lock.json
generated
516
examples/nextjs/package-lock.json
generated
@@ -8,9 +8,9 @@
|
||||
"name": "nextjs",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"eslint": "8.27.0",
|
||||
"eslint-config-next": "13.0.4",
|
||||
"next": "13.0.4",
|
||||
"eslint": "8.28.0",
|
||||
"eslint-config-next": "13.0.5",
|
||||
"next": "13.0.5",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0"
|
||||
}
|
||||
@@ -91,22 +91,22 @@
|
||||
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
|
||||
},
|
||||
"node_modules/@next/env": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.4.tgz",
|
||||
"integrity": "sha512-N5Z3bdxBzoxrC5bwykDFITzdWuwDteOdZ+7nxixY+I1XpRX8/iQYbw2wuXMdqdfBGm2NNUpAqg8YF2e4oAC2UQ=="
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.5.tgz",
|
||||
"integrity": "sha512-F3KLtiDrUslAZhTYTh8Zk5ZaavbYwLUn3NYPBnOjAXU8hWm0QVGVzKIOuURQ098ofRU4e9oglf3Sj9pFx5nI5w=="
|
||||
},
|
||||
"node_modules/@next/eslint-plugin-next": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.4.tgz",
|
||||
"integrity": "sha512-jZ4urKT+aO9QHm3ttihrIQscQISDSKK8isAom750+EySn9o3LCSkTdPGBtvBqY7Yku+NqhfQempR5J58DqTaVg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.5.tgz",
|
||||
"integrity": "sha512-H9U9B1dFnCDmylDZ6/dYt95Ie1Iu+SLBMcO6rkIGIDcj5UK+DNyMiWm83xWBZ1gREM8cfp5Srv1g6wqf8pM4lw==",
|
||||
"dependencies": {
|
||||
"glob": "7.1.7"
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-android-arm-eabi": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.4.tgz",
|
||||
"integrity": "sha512-SD9H+/zuV3L0oHIhsDdFkDqFtg6pIHtqRUPlsrNdOsmWXgMlSzxBmwt2ta4kyrazS62BQu7XRUG++ZyODS7AWg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.5.tgz",
|
||||
"integrity": "sha512-YO691dxHlviy6H0eghgwqn+5kU9J3iQnKERHTDSppqjjGDBl6ab4wz9XfI5AhljjkaTg3TknHoIEWFDoZ4Ve8g==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -119,9 +119,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-android-arm64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.4.tgz",
|
||||
"integrity": "sha512-F8W5WcBbdn/zBoy32/mQiefs9DNsT12CTSSVCsO8GvQR7GjJU+uduQ4drKcSDoDLuAFULc2jDN06Circq4vuQg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.5.tgz",
|
||||
"integrity": "sha512-ugbwffkUmp8cd2afehDC8LtQeFUxElRUBBngfB5UYSWBx18HW4OgzkPFIY8jUBH16zifvGZWXbICXJWDHrOLtw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -134,9 +134,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-darwin-arm64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.4.tgz",
|
||||
"integrity": "sha512-/lajev+9GSie+rRTl5z8skW9RJwZ+TwMKLzzM24TbDk8lUjqPTyJZ/cU0NDj8J7VQAZ6EehACSh9rcJeBRtLuA==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.5.tgz",
|
||||
"integrity": "sha512-mshlh8QOtOalfZbc17uNAftWgqHTKnrv6QUwBe+mpGz04eqsSUzVz1JGZEdIkmuDxOz00cK2NPoc+VHDXh99IQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -149,9 +149,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-darwin-x64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.4.tgz",
|
||||
"integrity": "sha512-HK4b2rFiju8d40GTL/jH9U6OQ7BYA2MeEHs7Dm7Rp7kwQtLzP3z6osdQS8er20tIFHDE4b+oVBy03ZUQkHf0Pg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.5.tgz",
|
||||
"integrity": "sha512-SfigOKW4Z2UB3ruUPyvrlDIkcJq1hiw1wvYApWugD+tQsAkYZKEoz+/8emCmeYZ6Gwgi1WHV+z52Oj8u7bEHPg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -164,9 +164,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-freebsd-x64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.4.tgz",
|
||||
"integrity": "sha512-xBvIGLaGzZtgJfRRJ2DBN82DQCJ/O7jkXyBp8X/vHefPWyVXVqF6C68Rv8ADp11thPpf8WpjkvDDLb9AuWHQUA==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.5.tgz",
|
||||
"integrity": "sha512-0NJg8HZr4yG8ynmMGFXQf+Mahvq4ZgBmUwSlLXXymgxEQgH17erH/LoR69uITtW+KTsALgk9axEt5AAabM4ucg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -179,9 +179,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm-gnueabihf": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.4.tgz",
|
||||
"integrity": "sha512-s13pxNp9deKmmxEGTp1MoL1e4nf4wbEymEaHgFxUlhoR1OD9tK8oTNrQphQePJgVjzcWmRGH/dX7O9mVkHbU/g==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.5.tgz",
|
||||
"integrity": "sha512-Cye+h3oDT3NDWjACMlRaolL8fokpKie34FlPj9nfoW7bYKmoMBY1d4IO/GgBF+5xEl7HkH0Ny/qex63vQ0pN+A==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@@ -194,9 +194,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-gnu": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.4.tgz",
|
||||
"integrity": "sha512-Lklo65usNzoYwjX51CpDKOepWVZBdwO49/Jz3djxiYUr2lRtpDVnlfwCvzN+47j3BMVMWtC2ndIi8Q4s3J0v4g==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.5.tgz",
|
||||
"integrity": "sha512-5BfDS/VoRDR5QUGG9oedOCEZGmV2zxUVFYLUJVPMSMeIgqkjxWQBiG2BUHZI6/LGk9yvHmjx7BTvtBCLtRg6IQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -209,9 +209,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-arm64-musl": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.4.tgz",
|
||||
"integrity": "sha512-+3BXtXBwjVhd5lahDe5nKZ7EwD6hE/oLFQkITCvgxymU5qYHGlLFyF52/lyw8qhyxoCr7mMVsUFhlCzVwCfNjg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.5.tgz",
|
||||
"integrity": "sha512-xenvqlXz+KxVKAB1YR723gnVNszpsCvKZkiFFaAYqDGJ502YuqU2fwLsaSm/ASRizNcBYeo9HPLTyc3r/9cdMQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -224,9 +224,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-gnu": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.4.tgz",
|
||||
"integrity": "sha512-QB8qoZrvHhZsz62nUrTKlp5IiZ8I7KZsaa6437H/W/NOZHLGJjCxROnhUjLvKVe/T5P86pjya2SUOUqWAjz4Pg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.5.tgz",
|
||||
"integrity": "sha512-9Ahi1bbdXwhrWQmOyoTod23/hhK05da/FzodiNqd6drrMl1y7+RujoEcU8Dtw3H1mGWB+yuTlWo8B4Iba8hqiQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -239,9 +239,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-linux-x64-musl": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.4.tgz",
|
||||
"integrity": "sha512-WaahF6DYUQRg1QqIMcuOu2ZsFhS3aC5iWeQyeptMHklP9wb4FfTNmBArKHknX/GXD8P9gI38WTAHJ25cc0zVwg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.5.tgz",
|
||||
"integrity": "sha512-V+1mnh49qmS9fOZxVRbzjhBEz9IUGJ7AQ80JPWAYQM5LI4TxfdiF4APLPvJ52rOmNeTqnVz1bbKtVOso+7EZ4w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -254,9 +254,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-arm64-msvc": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.4.tgz",
|
||||
"integrity": "sha512-FD+k1j2jeY0aKcqcpzFKfTsv55PPmIZ5GKDyPjjV5AO6XvQ4nALwWl4JwizjH2426TfLXObb+C3MH0bl9Ok1Kw==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.5.tgz",
|
||||
"integrity": "sha512-wRE9rkp7I+/3Jf2T9PFIJOKq3adMWYEFkPOA7XAkUfYbQHlDJm/U5cVCWUsKByyQq5RThwufI91sgd19MfxRxg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -269,9 +269,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-ia32-msvc": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.4.tgz",
|
||||
"integrity": "sha512-+Q/Q8Ydvz3X3U84CyZdNv1HC7fE43k+xB8C6b3IFmWGa5Tu2tfskQ2FsUNBrYreZjhFC/894J3rVQ6Vj6Auugg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.5.tgz",
|
||||
"integrity": "sha512-Q1XQSLEhFuFhkKFdJIGt7cYQ4T3u6P5wrtUNreg5M+7P+fjSiC8+X+Vjcw+oebaacsdl0pWZlK+oACGafush1w==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@@ -284,9 +284,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@next/swc-win32-x64-msvc": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.4.tgz",
|
||||
"integrity": "sha512-vXtbo9N1FdtZZRcv4BliU28tTYrkb1EnVpUiiFFe88I6kS9aZVTMY9Z/OtDR52rl1JF1hgs9sL/59D/TQqSATQ==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.5.tgz",
|
||||
"integrity": "sha512-t5gRblrwwiNZP6cT7NkxlgxrFgHWtv9ei5vUraCLgBqzvIsa7X+PnarZUeQCXqz6Jg9JSGGT9j8lvzD97UqeJQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@@ -355,9 +355,9 @@
|
||||
"integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
|
||||
},
|
||||
"node_modules/@swc/helpers": {
|
||||
"version": "0.4.11",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz",
|
||||
"integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==",
|
||||
"version": "0.4.14",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
|
||||
"integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==",
|
||||
"dependencies": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
@@ -368,13 +368,13 @@
|
||||
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
|
||||
},
|
||||
"node_modules/@typescript-eslint/parser": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz",
|
||||
"integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.44.0.tgz",
|
||||
"integrity": "sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "5.43.0",
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/typescript-estree": "5.43.0",
|
||||
"@typescript-eslint/scope-manager": "5.44.0",
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"@typescript-eslint/typescript-estree": "5.44.0",
|
||||
"debug": "^4.3.4"
|
||||
},
|
||||
"engines": {
|
||||
@@ -394,12 +394,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/scope-manager": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz",
|
||||
"integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz",
|
||||
"integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/visitor-keys": "5.43.0"
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"@typescript-eslint/visitor-keys": "5.44.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
@@ -410,9 +410,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/types": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz",
|
||||
"integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz",
|
||||
"integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==",
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
},
|
||||
@@ -422,12 +422,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/typescript-estree": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz",
|
||||
"integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz",
|
||||
"integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/visitor-keys": "5.43.0",
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"@typescript-eslint/visitor-keys": "5.44.0",
|
||||
"debug": "^4.3.4",
|
||||
"globby": "^11.1.0",
|
||||
"is-glob": "^4.0.3",
|
||||
@@ -448,11 +448,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/visitor-keys": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz",
|
||||
"integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz",
|
||||
"integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==",
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"eslint-visitor-keys": "^3.3.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -596,6 +596,18 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/array.prototype.tosorted": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
|
||||
"integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.1.4",
|
||||
"es-abstract": "^1.20.4",
|
||||
"es-shim-unscopables": "^1.0.0",
|
||||
"get-intrinsic": "^1.1.3"
|
||||
}
|
||||
},
|
||||
"node_modules/ast-types-flow": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
|
||||
@@ -660,9 +672,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001431",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz",
|
||||
"integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==",
|
||||
"version": "1.0.30001434",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
|
||||
"integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -815,9 +827,9 @@
|
||||
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
|
||||
},
|
||||
"node_modules/enhanced-resolve": {
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
|
||||
"integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
|
||||
"version": "5.12.0",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
|
||||
"integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.2.0"
|
||||
@@ -899,9 +911,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "8.27.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz",
|
||||
"integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==",
|
||||
"version": "8.28.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz",
|
||||
"integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==",
|
||||
"dependencies": {
|
||||
"@eslint/eslintrc": "^1.3.3",
|
||||
"@humanwhocodes/config-array": "^0.11.6",
|
||||
@@ -954,11 +966,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-config-next": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.4.tgz",
|
||||
"integrity": "sha512-moEC7BW2TK7JKq3QfnaauqRjWzVcEf71gp5DbClpFPHM6QXE0u0uVvSTiHlmOgtCe1vyWAO+AhF87ZITd8mIDw==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.5.tgz",
|
||||
"integrity": "sha512-lge94W7ME6kNCO96eCykq5GbKbllzmcDNDhh1/llMCRgNPl0+GIQ8dOoM0I7uRQVW56VmTXFybJFXgow11a5pg==",
|
||||
"dependencies": {
|
||||
"@next/eslint-plugin-next": "13.0.4",
|
||||
"@next/eslint-plugin-next": "13.0.5",
|
||||
"@rushstack/eslint-patch": "^1.1.3",
|
||||
"@typescript-eslint/parser": "^5.42.0",
|
||||
"eslint-import-resolver-node": "^0.3.6",
|
||||
@@ -1157,24 +1169,25 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-react": {
|
||||
"version": "7.31.10",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz",
|
||||
"integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==",
|
||||
"version": "7.31.11",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz",
|
||||
"integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==",
|
||||
"dependencies": {
|
||||
"array-includes": "^3.1.5",
|
||||
"array.prototype.flatmap": "^1.3.0",
|
||||
"array-includes": "^3.1.6",
|
||||
"array.prototype.flatmap": "^1.3.1",
|
||||
"array.prototype.tosorted": "^1.1.1",
|
||||
"doctrine": "^2.1.0",
|
||||
"estraverse": "^5.3.0",
|
||||
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
|
||||
"minimatch": "^3.1.2",
|
||||
"object.entries": "^1.1.5",
|
||||
"object.fromentries": "^2.0.5",
|
||||
"object.hasown": "^1.1.1",
|
||||
"object.values": "^1.1.5",
|
||||
"object.entries": "^1.1.6",
|
||||
"object.fromentries": "^2.0.6",
|
||||
"object.hasown": "^1.1.2",
|
||||
"object.values": "^1.1.6",
|
||||
"prop-types": "^15.8.1",
|
||||
"resolve": "^2.0.0-next.3",
|
||||
"semver": "^6.3.0",
|
||||
"string.prototype.matchall": "^4.0.7"
|
||||
"string.prototype.matchall": "^4.0.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
@@ -1924,9 +1937,13 @@
|
||||
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
|
||||
},
|
||||
"node_modules/js-sdsl": {
|
||||
"version": "4.1.5",
|
||||
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
|
||||
"integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q=="
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
|
||||
"integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/js-sdsl"
|
||||
}
|
||||
},
|
||||
"node_modules/js-tokens": {
|
||||
"version": "4.0.0",
|
||||
@@ -2104,16 +2121,15 @@
|
||||
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
|
||||
},
|
||||
"node_modules/next": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-13.0.4.tgz",
|
||||
"integrity": "sha512-4P0MvbjPCI1E/UPL1GrTXtYlgFnbBbY3JQ+AMY8jYE2SwyvCWctEJySoRjveznAHjrl6TIjuAJeB8u1c2StYUQ==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-13.0.5.tgz",
|
||||
"integrity": "sha512-awpc3DkphyKydwCotcBnuKwh6hMqkT5xdiBK4OatJtOZurDPBYLP62jtM2be/4OunpmwIbsS0Eyv+ZGU97ciEg==",
|
||||
"dependencies": {
|
||||
"@next/env": "13.0.4",
|
||||
"@swc/helpers": "0.4.11",
|
||||
"@next/env": "13.0.5",
|
||||
"@swc/helpers": "0.4.14",
|
||||
"caniuse-lite": "^1.0.30001406",
|
||||
"postcss": "8.4.14",
|
||||
"styled-jsx": "5.1.0",
|
||||
"use-sync-external-store": "1.2.0"
|
||||
"styled-jsx": "5.1.0"
|
||||
},
|
||||
"bin": {
|
||||
"next": "dist/bin/next"
|
||||
@@ -2122,19 +2138,19 @@
|
||||
"node": ">=14.6.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@next/swc-android-arm-eabi": "13.0.4",
|
||||
"@next/swc-android-arm64": "13.0.4",
|
||||
"@next/swc-darwin-arm64": "13.0.4",
|
||||
"@next/swc-darwin-x64": "13.0.4",
|
||||
"@next/swc-freebsd-x64": "13.0.4",
|
||||
"@next/swc-linux-arm-gnueabihf": "13.0.4",
|
||||
"@next/swc-linux-arm64-gnu": "13.0.4",
|
||||
"@next/swc-linux-arm64-musl": "13.0.4",
|
||||
"@next/swc-linux-x64-gnu": "13.0.4",
|
||||
"@next/swc-linux-x64-musl": "13.0.4",
|
||||
"@next/swc-win32-arm64-msvc": "13.0.4",
|
||||
"@next/swc-win32-ia32-msvc": "13.0.4",
|
||||
"@next/swc-win32-x64-msvc": "13.0.4"
|
||||
"@next/swc-android-arm-eabi": "13.0.5",
|
||||
"@next/swc-android-arm64": "13.0.5",
|
||||
"@next/swc-darwin-arm64": "13.0.5",
|
||||
"@next/swc-darwin-x64": "13.0.5",
|
||||
"@next/swc-freebsd-x64": "13.0.5",
|
||||
"@next/swc-linux-arm-gnueabihf": "13.0.5",
|
||||
"@next/swc-linux-arm64-gnu": "13.0.5",
|
||||
"@next/swc-linux-arm64-musl": "13.0.5",
|
||||
"@next/swc-linux-x64-gnu": "13.0.5",
|
||||
"@next/swc-linux-x64-musl": "13.0.5",
|
||||
"@next/swc-win32-arm64-msvc": "13.0.5",
|
||||
"@next/swc-win32-ia32-msvc": "13.0.5",
|
||||
"@next/swc-win32-x64-msvc": "13.0.5"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"fibers": ">= 3.1.0",
|
||||
@@ -2923,14 +2939,6 @@
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/use-sync-external-store": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
|
||||
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
|
||||
"peerDependencies": {
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/which": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||
@@ -3045,94 +3053,94 @@
|
||||
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
|
||||
},
|
||||
"@next/env": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.4.tgz",
|
||||
"integrity": "sha512-N5Z3bdxBzoxrC5bwykDFITzdWuwDteOdZ+7nxixY+I1XpRX8/iQYbw2wuXMdqdfBGm2NNUpAqg8YF2e4oAC2UQ=="
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.5.tgz",
|
||||
"integrity": "sha512-F3KLtiDrUslAZhTYTh8Zk5ZaavbYwLUn3NYPBnOjAXU8hWm0QVGVzKIOuURQ098ofRU4e9oglf3Sj9pFx5nI5w=="
|
||||
},
|
||||
"@next/eslint-plugin-next": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.4.tgz",
|
||||
"integrity": "sha512-jZ4urKT+aO9QHm3ttihrIQscQISDSKK8isAom750+EySn9o3LCSkTdPGBtvBqY7Yku+NqhfQempR5J58DqTaVg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.5.tgz",
|
||||
"integrity": "sha512-H9U9B1dFnCDmylDZ6/dYt95Ie1Iu+SLBMcO6rkIGIDcj5UK+DNyMiWm83xWBZ1gREM8cfp5Srv1g6wqf8pM4lw==",
|
||||
"requires": {
|
||||
"glob": "7.1.7"
|
||||
}
|
||||
},
|
||||
"@next/swc-android-arm-eabi": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.4.tgz",
|
||||
"integrity": "sha512-SD9H+/zuV3L0oHIhsDdFkDqFtg6pIHtqRUPlsrNdOsmWXgMlSzxBmwt2ta4kyrazS62BQu7XRUG++ZyODS7AWg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.5.tgz",
|
||||
"integrity": "sha512-YO691dxHlviy6H0eghgwqn+5kU9J3iQnKERHTDSppqjjGDBl6ab4wz9XfI5AhljjkaTg3TknHoIEWFDoZ4Ve8g==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-android-arm64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.4.tgz",
|
||||
"integrity": "sha512-F8W5WcBbdn/zBoy32/mQiefs9DNsT12CTSSVCsO8GvQR7GjJU+uduQ4drKcSDoDLuAFULc2jDN06Circq4vuQg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.5.tgz",
|
||||
"integrity": "sha512-ugbwffkUmp8cd2afehDC8LtQeFUxElRUBBngfB5UYSWBx18HW4OgzkPFIY8jUBH16zifvGZWXbICXJWDHrOLtw==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-darwin-arm64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.4.tgz",
|
||||
"integrity": "sha512-/lajev+9GSie+rRTl5z8skW9RJwZ+TwMKLzzM24TbDk8lUjqPTyJZ/cU0NDj8J7VQAZ6EehACSh9rcJeBRtLuA==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.5.tgz",
|
||||
"integrity": "sha512-mshlh8QOtOalfZbc17uNAftWgqHTKnrv6QUwBe+mpGz04eqsSUzVz1JGZEdIkmuDxOz00cK2NPoc+VHDXh99IQ==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-darwin-x64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.4.tgz",
|
||||
"integrity": "sha512-HK4b2rFiju8d40GTL/jH9U6OQ7BYA2MeEHs7Dm7Rp7kwQtLzP3z6osdQS8er20tIFHDE4b+oVBy03ZUQkHf0Pg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.5.tgz",
|
||||
"integrity": "sha512-SfigOKW4Z2UB3ruUPyvrlDIkcJq1hiw1wvYApWugD+tQsAkYZKEoz+/8emCmeYZ6Gwgi1WHV+z52Oj8u7bEHPg==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-freebsd-x64": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.4.tgz",
|
||||
"integrity": "sha512-xBvIGLaGzZtgJfRRJ2DBN82DQCJ/O7jkXyBp8X/vHefPWyVXVqF6C68Rv8ADp11thPpf8WpjkvDDLb9AuWHQUA==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.5.tgz",
|
||||
"integrity": "sha512-0NJg8HZr4yG8ynmMGFXQf+Mahvq4ZgBmUwSlLXXymgxEQgH17erH/LoR69uITtW+KTsALgk9axEt5AAabM4ucg==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-linux-arm-gnueabihf": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.4.tgz",
|
||||
"integrity": "sha512-s13pxNp9deKmmxEGTp1MoL1e4nf4wbEymEaHgFxUlhoR1OD9tK8oTNrQphQePJgVjzcWmRGH/dX7O9mVkHbU/g==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.5.tgz",
|
||||
"integrity": "sha512-Cye+h3oDT3NDWjACMlRaolL8fokpKie34FlPj9nfoW7bYKmoMBY1d4IO/GgBF+5xEl7HkH0Ny/qex63vQ0pN+A==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-linux-arm64-gnu": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.4.tgz",
|
||||
"integrity": "sha512-Lklo65usNzoYwjX51CpDKOepWVZBdwO49/Jz3djxiYUr2lRtpDVnlfwCvzN+47j3BMVMWtC2ndIi8Q4s3J0v4g==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.5.tgz",
|
||||
"integrity": "sha512-5BfDS/VoRDR5QUGG9oedOCEZGmV2zxUVFYLUJVPMSMeIgqkjxWQBiG2BUHZI6/LGk9yvHmjx7BTvtBCLtRg6IQ==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-linux-arm64-musl": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.4.tgz",
|
||||
"integrity": "sha512-+3BXtXBwjVhd5lahDe5nKZ7EwD6hE/oLFQkITCvgxymU5qYHGlLFyF52/lyw8qhyxoCr7mMVsUFhlCzVwCfNjg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.5.tgz",
|
||||
"integrity": "sha512-xenvqlXz+KxVKAB1YR723gnVNszpsCvKZkiFFaAYqDGJ502YuqU2fwLsaSm/ASRizNcBYeo9HPLTyc3r/9cdMQ==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-linux-x64-gnu": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.4.tgz",
|
||||
"integrity": "sha512-QB8qoZrvHhZsz62nUrTKlp5IiZ8I7KZsaa6437H/W/NOZHLGJjCxROnhUjLvKVe/T5P86pjya2SUOUqWAjz4Pg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.5.tgz",
|
||||
"integrity": "sha512-9Ahi1bbdXwhrWQmOyoTod23/hhK05da/FzodiNqd6drrMl1y7+RujoEcU8Dtw3H1mGWB+yuTlWo8B4Iba8hqiQ==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-linux-x64-musl": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.4.tgz",
|
||||
"integrity": "sha512-WaahF6DYUQRg1QqIMcuOu2ZsFhS3aC5iWeQyeptMHklP9wb4FfTNmBArKHknX/GXD8P9gI38WTAHJ25cc0zVwg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.5.tgz",
|
||||
"integrity": "sha512-V+1mnh49qmS9fOZxVRbzjhBEz9IUGJ7AQ80JPWAYQM5LI4TxfdiF4APLPvJ52rOmNeTqnVz1bbKtVOso+7EZ4w==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-win32-arm64-msvc": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.4.tgz",
|
||||
"integrity": "sha512-FD+k1j2jeY0aKcqcpzFKfTsv55PPmIZ5GKDyPjjV5AO6XvQ4nALwWl4JwizjH2426TfLXObb+C3MH0bl9Ok1Kw==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.5.tgz",
|
||||
"integrity": "sha512-wRE9rkp7I+/3Jf2T9PFIJOKq3adMWYEFkPOA7XAkUfYbQHlDJm/U5cVCWUsKByyQq5RThwufI91sgd19MfxRxg==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-win32-ia32-msvc": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.4.tgz",
|
||||
"integrity": "sha512-+Q/Q8Ydvz3X3U84CyZdNv1HC7fE43k+xB8C6b3IFmWGa5Tu2tfskQ2FsUNBrYreZjhFC/894J3rVQ6Vj6Auugg==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.5.tgz",
|
||||
"integrity": "sha512-Q1XQSLEhFuFhkKFdJIGt7cYQ4T3u6P5wrtUNreg5M+7P+fjSiC8+X+Vjcw+oebaacsdl0pWZlK+oACGafush1w==",
|
||||
"optional": true
|
||||
},
|
||||
"@next/swc-win32-x64-msvc": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.4.tgz",
|
||||
"integrity": "sha512-vXtbo9N1FdtZZRcv4BliU28tTYrkb1EnVpUiiFFe88I6kS9aZVTMY9Z/OtDR52rl1JF1hgs9sL/59D/TQqSATQ==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.5.tgz",
|
||||
"integrity": "sha512-t5gRblrwwiNZP6cT7NkxlgxrFgHWtv9ei5vUraCLgBqzvIsa7X+PnarZUeQCXqz6Jg9JSGGT9j8lvzD97UqeJQ==",
|
||||
"optional": true
|
||||
},
|
||||
"@nodelib/fs.scandir": {
|
||||
@@ -3177,9 +3185,9 @@
|
||||
"integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
|
||||
},
|
||||
"@swc/helpers": {
|
||||
"version": "0.4.11",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz",
|
||||
"integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==",
|
||||
"version": "0.4.14",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
|
||||
"integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==",
|
||||
"requires": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
@@ -3190,37 +3198,37 @@
|
||||
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
|
||||
},
|
||||
"@typescript-eslint/parser": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz",
|
||||
"integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.44.0.tgz",
|
||||
"integrity": "sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==",
|
||||
"requires": {
|
||||
"@typescript-eslint/scope-manager": "5.43.0",
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/typescript-estree": "5.43.0",
|
||||
"@typescript-eslint/scope-manager": "5.44.0",
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"@typescript-eslint/typescript-estree": "5.44.0",
|
||||
"debug": "^4.3.4"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/scope-manager": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz",
|
||||
"integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz",
|
||||
"integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==",
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/visitor-keys": "5.43.0"
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"@typescript-eslint/visitor-keys": "5.44.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/types": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz",
|
||||
"integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg=="
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz",
|
||||
"integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ=="
|
||||
},
|
||||
"@typescript-eslint/typescript-estree": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz",
|
||||
"integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz",
|
||||
"integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==",
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/visitor-keys": "5.43.0",
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"@typescript-eslint/visitor-keys": "5.44.0",
|
||||
"debug": "^4.3.4",
|
||||
"globby": "^11.1.0",
|
||||
"is-glob": "^4.0.3",
|
||||
@@ -3229,11 +3237,11 @@
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/visitor-keys": {
|
||||
"version": "5.43.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz",
|
||||
"integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==",
|
||||
"version": "5.44.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz",
|
||||
"integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==",
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.43.0",
|
||||
"@typescript-eslint/types": "5.44.0",
|
||||
"eslint-visitor-keys": "^3.3.0"
|
||||
}
|
||||
},
|
||||
@@ -3325,6 +3333,18 @@
|
||||
"es-shim-unscopables": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"array.prototype.tosorted": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
|
||||
"integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
|
||||
"requires": {
|
||||
"call-bind": "^1.0.2",
|
||||
"define-properties": "^1.1.4",
|
||||
"es-abstract": "^1.20.4",
|
||||
"es-shim-unscopables": "^1.0.0",
|
||||
"get-intrinsic": "^1.1.3"
|
||||
}
|
||||
},
|
||||
"ast-types-flow": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
|
||||
@@ -3377,9 +3397,9 @@
|
||||
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
|
||||
},
|
||||
"caniuse-lite": {
|
||||
"version": "1.0.30001431",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz",
|
||||
"integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ=="
|
||||
"version": "1.0.30001434",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
|
||||
"integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA=="
|
||||
},
|
||||
"chalk": {
|
||||
"version": "4.1.2",
|
||||
@@ -3482,9 +3502,9 @@
|
||||
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
|
||||
},
|
||||
"enhanced-resolve": {
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
|
||||
"integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
|
||||
"version": "5.12.0",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
|
||||
"integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
|
||||
"requires": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.2.0"
|
||||
@@ -3545,9 +3565,9 @@
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
|
||||
},
|
||||
"eslint": {
|
||||
"version": "8.27.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz",
|
||||
"integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==",
|
||||
"version": "8.28.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz",
|
||||
"integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==",
|
||||
"requires": {
|
||||
"@eslint/eslintrc": "^1.3.3",
|
||||
"@humanwhocodes/config-array": "^0.11.6",
|
||||
@@ -3591,11 +3611,11 @@
|
||||
}
|
||||
},
|
||||
"eslint-config-next": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.4.tgz",
|
||||
"integrity": "sha512-moEC7BW2TK7JKq3QfnaauqRjWzVcEf71gp5DbClpFPHM6QXE0u0uVvSTiHlmOgtCe1vyWAO+AhF87ZITd8mIDw==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.5.tgz",
|
||||
"integrity": "sha512-lge94W7ME6kNCO96eCykq5GbKbllzmcDNDhh1/llMCRgNPl0+GIQ8dOoM0I7uRQVW56VmTXFybJFXgow11a5pg==",
|
||||
"requires": {
|
||||
"@next/eslint-plugin-next": "13.0.4",
|
||||
"@next/eslint-plugin-next": "13.0.5",
|
||||
"@rushstack/eslint-patch": "^1.1.3",
|
||||
"@typescript-eslint/parser": "^5.42.0",
|
||||
"eslint-import-resolver-node": "^0.3.6",
|
||||
@@ -3747,24 +3767,25 @@
|
||||
}
|
||||
},
|
||||
"eslint-plugin-react": {
|
||||
"version": "7.31.10",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz",
|
||||
"integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==",
|
||||
"version": "7.31.11",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz",
|
||||
"integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==",
|
||||
"requires": {
|
||||
"array-includes": "^3.1.5",
|
||||
"array.prototype.flatmap": "^1.3.0",
|
||||
"array-includes": "^3.1.6",
|
||||
"array.prototype.flatmap": "^1.3.1",
|
||||
"array.prototype.tosorted": "^1.1.1",
|
||||
"doctrine": "^2.1.0",
|
||||
"estraverse": "^5.3.0",
|
||||
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
|
||||
"minimatch": "^3.1.2",
|
||||
"object.entries": "^1.1.5",
|
||||
"object.fromentries": "^2.0.5",
|
||||
"object.hasown": "^1.1.1",
|
||||
"object.values": "^1.1.5",
|
||||
"object.entries": "^1.1.6",
|
||||
"object.fromentries": "^2.0.6",
|
||||
"object.hasown": "^1.1.2",
|
||||
"object.values": "^1.1.6",
|
||||
"prop-types": "^15.8.1",
|
||||
"resolve": "^2.0.0-next.3",
|
||||
"semver": "^6.3.0",
|
||||
"string.prototype.matchall": "^4.0.7"
|
||||
"string.prototype.matchall": "^4.0.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"doctrine": {
|
||||
@@ -4275,9 +4296,9 @@
|
||||
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
|
||||
},
|
||||
"js-sdsl": {
|
||||
"version": "4.1.5",
|
||||
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
|
||||
"integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q=="
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
|
||||
"integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ=="
|
||||
},
|
||||
"js-tokens": {
|
||||
"version": "4.0.0",
|
||||
@@ -4413,29 +4434,28 @@
|
||||
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
|
||||
},
|
||||
"next": {
|
||||
"version": "13.0.4",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-13.0.4.tgz",
|
||||
"integrity": "sha512-4P0MvbjPCI1E/UPL1GrTXtYlgFnbBbY3JQ+AMY8jYE2SwyvCWctEJySoRjveznAHjrl6TIjuAJeB8u1c2StYUQ==",
|
||||
"version": "13.0.5",
|
||||
"resolved": "https://registry.npmjs.org/next/-/next-13.0.5.tgz",
|
||||
"integrity": "sha512-awpc3DkphyKydwCotcBnuKwh6hMqkT5xdiBK4OatJtOZurDPBYLP62jtM2be/4OunpmwIbsS0Eyv+ZGU97ciEg==",
|
||||
"requires": {
|
||||
"@next/env": "13.0.4",
|
||||
"@next/swc-android-arm-eabi": "13.0.4",
|
||||
"@next/swc-android-arm64": "13.0.4",
|
||||
"@next/swc-darwin-arm64": "13.0.4",
|
||||
"@next/swc-darwin-x64": "13.0.4",
|
||||
"@next/swc-freebsd-x64": "13.0.4",
|
||||
"@next/swc-linux-arm-gnueabihf": "13.0.4",
|
||||
"@next/swc-linux-arm64-gnu": "13.0.4",
|
||||
"@next/swc-linux-arm64-musl": "13.0.4",
|
||||
"@next/swc-linux-x64-gnu": "13.0.4",
|
||||
"@next/swc-linux-x64-musl": "13.0.4",
|
||||
"@next/swc-win32-arm64-msvc": "13.0.4",
|
||||
"@next/swc-win32-ia32-msvc": "13.0.4",
|
||||
"@next/swc-win32-x64-msvc": "13.0.4",
|
||||
"@swc/helpers": "0.4.11",
|
||||
"@next/env": "13.0.5",
|
||||
"@next/swc-android-arm-eabi": "13.0.5",
|
||||
"@next/swc-android-arm64": "13.0.5",
|
||||
"@next/swc-darwin-arm64": "13.0.5",
|
||||
"@next/swc-darwin-x64": "13.0.5",
|
||||
"@next/swc-freebsd-x64": "13.0.5",
|
||||
"@next/swc-linux-arm-gnueabihf": "13.0.5",
|
||||
"@next/swc-linux-arm64-gnu": "13.0.5",
|
||||
"@next/swc-linux-arm64-musl": "13.0.5",
|
||||
"@next/swc-linux-x64-gnu": "13.0.5",
|
||||
"@next/swc-linux-x64-musl": "13.0.5",
|
||||
"@next/swc-win32-arm64-msvc": "13.0.5",
|
||||
"@next/swc-win32-ia32-msvc": "13.0.5",
|
||||
"@next/swc-win32-x64-msvc": "13.0.5",
|
||||
"@swc/helpers": "0.4.14",
|
||||
"caniuse-lite": "^1.0.30001406",
|
||||
"postcss": "8.4.14",
|
||||
"styled-jsx": "5.1.0",
|
||||
"use-sync-external-store": "1.2.0"
|
||||
"styled-jsx": "5.1.0"
|
||||
}
|
||||
},
|
||||
"object-assign": {
|
||||
@@ -4944,12 +4964,6 @@
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"use-sync-external-store": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
|
||||
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
|
||||
"requires": {}
|
||||
},
|
||||
"which": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"eslint": "8.27.0",
|
||||
"eslint-config-next": "13.0.4",
|
||||
"next": "13.0.4",
|
||||
"eslint": "8.28.0",
|
||||
"eslint-config-next": "13.0.5",
|
||||
"next": "13.0.5",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import '../styles/globals.css';
|
||||
import '../styles/globals.css'
|
||||
|
||||
function MyApp({ Component, pageProps }) {
|
||||
return <Component {...pageProps} />;
|
||||
return <Component {...pageProps} />
|
||||
}
|
||||
|
||||
export default MyApp;
|
||||
export default MyApp
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
|
||||
|
||||
export default function handler(req, res) {
|
||||
res.status(200).json({ name: 'John Doe' });
|
||||
res.status(200).json({ name: 'John Doe' })
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import Head from 'next/head';
|
||||
import Image from 'next/image';
|
||||
import styles from '../styles/Home.module.css';
|
||||
import Head from 'next/head'
|
||||
import Image from 'next/image'
|
||||
import styles from '../styles/Home.module.css'
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
@@ -67,5 +67,5 @@ export default function Home() {
|
||||
</a>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
2
examples/vitepress/.gitignore
vendored
Normal file
2
examples/vitepress/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.vercel
|
||||
node_modules
|
||||
49
examples/vitepress/README.md
Normal file
49
examples/vitepress/README.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# VitePress
|
||||
|
||||
This directory is a brief example of a [VitePress](https://vitepress.vuejs.org/) site that can be deployed to Vercel with zero-configuration.
|
||||
|
||||
## Setup
|
||||
|
||||
Install the dependencies
|
||||
|
||||
```bash
|
||||
$ yarn install
|
||||
```
|
||||
|
||||
## Deploy Your Own
|
||||
|
||||
[](https://vercel.com/new/clone?repository-url=https://github.com/vercel/vercel/tree/main/examples/vitepress&template=vitepress)
|
||||
|
||||
_Live Example: https://vitepress-starter-template.vercel.app_
|
||||
|
||||
## Setup
|
||||
|
||||
Install the dependencies:
|
||||
|
||||
```bash
|
||||
$ yarn install
|
||||
```
|
||||
|
||||
### Development
|
||||
|
||||
Start the development server
|
||||
|
||||
```bash
|
||||
$ yarn dev
|
||||
```
|
||||
|
||||
### Build the project
|
||||
|
||||
Build for production
|
||||
|
||||
```bash
|
||||
$ yarn build
|
||||
```
|
||||
|
||||
### Deploy
|
||||
|
||||
Deploy your VitePress application to Vercel
|
||||
|
||||
```bash
|
||||
$ vercel
|
||||
```
|
||||
3
examples/vitepress/docs/about.md
Normal file
3
examples/vitepress/docs/about.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# About
|
||||
|
||||
Lorem ipsum
|
||||
3
examples/vitepress/docs/index.md
Normal file
3
examples/vitepress/docs/index.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Hello VitePress
|
||||
|
||||
Lorem ipsum
|
||||
15
examples/vitepress/package.json
Normal file
15
examples/vitepress/package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "vitepress-template",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"vitepress": "1.0.0-alpha.29",
|
||||
"vue": "3.2.45"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "vitepress dev docs",
|
||||
"build": "vitepress build docs",
|
||||
"serve": "vitepress serve docs"
|
||||
}
|
||||
}
|
||||
626
examples/vitepress/yarn.lock
Normal file
626
examples/vitepress/yarn.lock
Normal file
@@ -0,0 +1,626 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@algolia/autocomplete-core@1.7.2":
|
||||
version "1.7.2"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz#8abbed88082f611997538760dffcb43b33b1fd1d"
|
||||
integrity sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==
|
||||
dependencies:
|
||||
"@algolia/autocomplete-shared" "1.7.2"
|
||||
|
||||
"@algolia/autocomplete-preset-algolia@1.7.2":
|
||||
version "1.7.2"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz#9cd4f64b3d64399657ee2dc2b7e0a939e0713a26"
|
||||
integrity sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==
|
||||
dependencies:
|
||||
"@algolia/autocomplete-shared" "1.7.2"
|
||||
|
||||
"@algolia/autocomplete-shared@1.7.2":
|
||||
version "1.7.2"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz#daa23280e78d3b42ae9564d12470ae034db51a89"
|
||||
integrity sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==
|
||||
|
||||
"@algolia/cache-browser-local-storage@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz#ffacb9230119f77de1a6f163b83680be999110e4"
|
||||
integrity sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg==
|
||||
dependencies:
|
||||
"@algolia/cache-common" "4.13.1"
|
||||
|
||||
"@algolia/cache-common@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.13.1.tgz#c933fdec9f73b4f7c69d5751edc92eee4a63d76b"
|
||||
integrity sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA==
|
||||
|
||||
"@algolia/cache-in-memory@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz#c19baa67b4597e1a93e987350613ab3b88768832"
|
||||
integrity sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ==
|
||||
dependencies:
|
||||
"@algolia/cache-common" "4.13.1"
|
||||
|
||||
"@algolia/client-account@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.13.1.tgz#fea591943665477a23922ab31863ad0732e26c66"
|
||||
integrity sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ==
|
||||
dependencies:
|
||||
"@algolia/client-common" "4.13.1"
|
||||
"@algolia/client-search" "4.13.1"
|
||||
"@algolia/transporter" "4.13.1"
|
||||
|
||||
"@algolia/client-analytics@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.13.1.tgz#5275956b2d0d16997148f2085f1701b6c39ecc32"
|
||||
integrity sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA==
|
||||
dependencies:
|
||||
"@algolia/client-common" "4.13.1"
|
||||
"@algolia/client-search" "4.13.1"
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
"@algolia/transporter" "4.13.1"
|
||||
|
||||
"@algolia/client-common@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.13.1.tgz#3bf9e3586f20ef85bbb56ccca390f7dbe57c8f4f"
|
||||
integrity sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg==
|
||||
dependencies:
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
"@algolia/transporter" "4.13.1"
|
||||
|
||||
"@algolia/client-personalization@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.13.1.tgz#438a1f58576ef19c4ad4addb8417bdacfe2fce2e"
|
||||
integrity sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w==
|
||||
dependencies:
|
||||
"@algolia/client-common" "4.13.1"
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
"@algolia/transporter" "4.13.1"
|
||||
|
||||
"@algolia/client-search@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.13.1.tgz#5501deed01e23c33d4aaa9f9eb96a849f0fce313"
|
||||
integrity sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A==
|
||||
dependencies:
|
||||
"@algolia/client-common" "4.13.1"
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
"@algolia/transporter" "4.13.1"
|
||||
|
||||
"@algolia/logger-common@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.13.1.tgz#4221378e701e3f1eacaa051bcd4ba1f25ddfaf4d"
|
||||
integrity sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw==
|
||||
|
||||
"@algolia/logger-console@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.13.1.tgz#423d358e4992dd4bceab0d9a4e99d1fd68107043"
|
||||
integrity sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA==
|
||||
dependencies:
|
||||
"@algolia/logger-common" "4.13.1"
|
||||
|
||||
"@algolia/requester-browser-xhr@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz#f8ea79233cf6f0392feaf31e35a6b40d68c5bc9e"
|
||||
integrity sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA==
|
||||
dependencies:
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
|
||||
"@algolia/requester-common@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.13.1.tgz#daea143d15ab6ed3909c4c45877f1b6c36a16179"
|
||||
integrity sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w==
|
||||
|
||||
"@algolia/requester-node-http@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz#32c63d4c009f22d97e396406de7af9b66fb8e89d"
|
||||
integrity sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw==
|
||||
dependencies:
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
|
||||
"@algolia/transporter@4.13.1":
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.13.1.tgz#509e03e9145102843d5be4a031c521f692d4e8d6"
|
||||
integrity sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw==
|
||||
dependencies:
|
||||
"@algolia/cache-common" "4.13.1"
|
||||
"@algolia/logger-common" "4.13.1"
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
|
||||
"@babel/parser@^7.16.4":
|
||||
version "7.18.8"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.8.tgz#822146080ac9c62dac0823bb3489622e0bc1cbdf"
|
||||
integrity sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==
|
||||
|
||||
"@docsearch/css@3.3.0", "@docsearch/css@^3.3.0":
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.3.0.tgz#d698e48302d12240d7c2f7452ccb2d2239a8cd80"
|
||||
integrity sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==
|
||||
|
||||
"@docsearch/js@^3.3.0":
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.3.0.tgz#c8f614b722cc8a6375e83f9c27557e9398d6a4d4"
|
||||
integrity sha512-oFXWRPNvPxAzBhnFJ9UCFIYZiQNc3Yrv6912nZHw/UIGxsyzKpNRZgHq8HDk1niYmOSoLKtVFcxkccpQmYGFyg==
|
||||
dependencies:
|
||||
"@docsearch/react" "3.3.0"
|
||||
preact "^10.0.0"
|
||||
|
||||
"@docsearch/react@3.3.0":
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.3.0.tgz#b8ac8e7f49b9bf2f96d34c24bc1cfd097ec0eead"
|
||||
integrity sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==
|
||||
dependencies:
|
||||
"@algolia/autocomplete-core" "1.7.2"
|
||||
"@algolia/autocomplete-preset-algolia" "1.7.2"
|
||||
"@docsearch/css" "3.3.0"
|
||||
algoliasearch "^4.0.0"
|
||||
|
||||
"@esbuild/android-arm@0.15.15":
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.15.tgz#35b3cc0f9e69cb53932d44f60b99dd440335d2f0"
|
||||
integrity sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==
|
||||
|
||||
"@esbuild/linux-loong64@0.15.15":
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz#32c65517a09320b62530867345222fde7794fbe1"
|
||||
integrity sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==
|
||||
|
||||
"@types/web-bluetooth@^0.0.16":
|
||||
version "0.0.16"
|
||||
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8"
|
||||
integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
|
||||
|
||||
"@vitejs/plugin-vue@^3.2.0":
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz#a1484089dd85d6528f435743f84cdd0d215bbb54"
|
||||
integrity sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==
|
||||
|
||||
"@vue/compiler-core@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b"
|
||||
integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.16.4"
|
||||
"@vue/shared" "3.2.45"
|
||||
estree-walker "^2.0.2"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-dom@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce"
|
||||
integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==
|
||||
dependencies:
|
||||
"@vue/compiler-core" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/compiler-sfc@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70"
|
||||
integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.16.4"
|
||||
"@vue/compiler-core" "3.2.45"
|
||||
"@vue/compiler-dom" "3.2.45"
|
||||
"@vue/compiler-ssr" "3.2.45"
|
||||
"@vue/reactivity-transform" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.25.7"
|
||||
postcss "^8.1.10"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-ssr@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz#bd20604b6e64ea15344d5b6278c4141191c983b2"
|
||||
integrity sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==
|
||||
dependencies:
|
||||
"@vue/compiler-dom" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/devtools-api@^6.4.5":
|
||||
version "6.4.5"
|
||||
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz#d54e844c1adbb1e677c81c665ecef1a2b4bb8380"
|
||||
integrity sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==
|
||||
|
||||
"@vue/reactivity-transform@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d"
|
||||
integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.16.4"
|
||||
"@vue/compiler-core" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.25.7"
|
||||
|
||||
"@vue/reactivity@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.45.tgz#412a45b574de601be5a4a5d9a8cbd4dee4662ff0"
|
||||
integrity sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==
|
||||
dependencies:
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/runtime-core@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz#7ad7ef9b2519d41062a30c6fa001ec43ac549c7f"
|
||||
integrity sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==
|
||||
dependencies:
|
||||
"@vue/reactivity" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/runtime-dom@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz#1a2ef6ee2ad876206fbbe2a884554bba2d0faf59"
|
||||
integrity sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==
|
||||
dependencies:
|
||||
"@vue/runtime-core" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
csstype "^2.6.8"
|
||||
|
||||
"@vue/server-renderer@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz#ca9306a0c12b0530a1a250e44f4a0abac6b81f3f"
|
||||
integrity sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==
|
||||
dependencies:
|
||||
"@vue/compiler-ssr" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
|
||||
"@vue/shared@3.2.45":
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2"
|
||||
integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==
|
||||
|
||||
"@vueuse/core@^9.4.0":
|
||||
version "9.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.5.0.tgz#6726e952e8f92b465457d3bc95deb385aacd9a41"
|
||||
integrity sha512-6GsWBsJHEb3sYw15mbLrcbslAVY45pkzjJYTKYKCXv88z7srAF0VEW0q+oXKsl58tCbqooplInahXFg8Yo1m4w==
|
||||
dependencies:
|
||||
"@types/web-bluetooth" "^0.0.16"
|
||||
"@vueuse/metadata" "9.5.0"
|
||||
"@vueuse/shared" "9.5.0"
|
||||
vue-demi "*"
|
||||
|
||||
"@vueuse/metadata@9.5.0":
|
||||
version "9.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.5.0.tgz#b01c84230261ddee4d439ae5d9c21343dc5ae565"
|
||||
integrity sha512-4M1AyPZmIv41pym+K5+4wup3bKuYebbH8w8BROY1hmT7rIwcyS4tEL+UsGz0Hiu1FCOxcoBrwtAizc0YmBJjyQ==
|
||||
|
||||
"@vueuse/shared@9.5.0":
|
||||
version "9.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.5.0.tgz#f5306548af0dc9f2b3a0d4da74e62bfdd6211241"
|
||||
integrity sha512-HnnCWU1Vg9CVWRCcI8ohDKDRB2Sc4bTgT1XAIaoLSfVHHn+TKbrox6pd3klCSw4UDxkhDfOk8cAdcK+Z5KleCA==
|
||||
dependencies:
|
||||
vue-demi "*"
|
||||
|
||||
algoliasearch@^4.0.0:
|
||||
version "4.13.1"
|
||||
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.13.1.tgz#54195c41c9e4bd13ed64982248cf49d4576974fe"
|
||||
integrity sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA==
|
||||
dependencies:
|
||||
"@algolia/cache-browser-local-storage" "4.13.1"
|
||||
"@algolia/cache-common" "4.13.1"
|
||||
"@algolia/cache-in-memory" "4.13.1"
|
||||
"@algolia/client-account" "4.13.1"
|
||||
"@algolia/client-analytics" "4.13.1"
|
||||
"@algolia/client-common" "4.13.1"
|
||||
"@algolia/client-personalization" "4.13.1"
|
||||
"@algolia/client-search" "4.13.1"
|
||||
"@algolia/logger-common" "4.13.1"
|
||||
"@algolia/logger-console" "4.13.1"
|
||||
"@algolia/requester-browser-xhr" "4.13.1"
|
||||
"@algolia/requester-common" "4.13.1"
|
||||
"@algolia/requester-node-http" "4.13.1"
|
||||
"@algolia/transporter" "4.13.1"
|
||||
|
||||
body-scroll-lock@4.0.0-beta.0:
|
||||
version "4.0.0-beta.0"
|
||||
resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz#4f78789d10e6388115c0460cd6d7d4dd2bbc4f7e"
|
||||
integrity sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==
|
||||
|
||||
csstype@^2.6.8:
|
||||
version "2.6.20"
|
||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
|
||||
integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
|
||||
|
||||
esbuild-android-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz#fd959b034dd761d14e13dda6214b6948841ff4ff"
|
||||
integrity sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==
|
||||
|
||||
esbuild-android-arm64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz#9733b71cf0229b4356f106a455b2cfdf7884aa59"
|
||||
integrity sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==
|
||||
|
||||
esbuild-darwin-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz#fc3482fdf5e798dbc0b8b2fe13287d257a45efc6"
|
||||
integrity sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==
|
||||
|
||||
esbuild-darwin-arm64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz#e922ec387c00fa84d664e14b5722fe13613f4adc"
|
||||
integrity sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==
|
||||
|
||||
esbuild-freebsd-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz#69a42d79137d7d3ea718414c432bc10e8bb97c68"
|
||||
integrity sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==
|
||||
|
||||
esbuild-freebsd-arm64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz#63b6d0dd492f7394f8d07a0e2b931151eb9d60c4"
|
||||
integrity sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==
|
||||
|
||||
esbuild-linux-32@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz#7f295795fd7e61ea57d1135f717424a6771a7472"
|
||||
integrity sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==
|
||||
|
||||
esbuild-linux-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz#11a430a86403b0411ca0a355b891f1cb8c4c4ec6"
|
||||
integrity sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==
|
||||
|
||||
esbuild-linux-arm64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz#b65f9a2c60e8e5b62f6cfd392cd0410f22e8c390"
|
||||
integrity sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==
|
||||
|
||||
esbuild-linux-arm@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz#c8e13e45a0a6f0cb145ce13ae26ce1d2551d9bcc"
|
||||
integrity sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==
|
||||
|
||||
esbuild-linux-mips64le@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz#d4c24d47e43966fcac748c90621be7edd53456c0"
|
||||
integrity sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==
|
||||
|
||||
esbuild-linux-ppc64le@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz#2eba53fe2282438ceca5471bdb57ba2e00216ed6"
|
||||
integrity sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==
|
||||
|
||||
esbuild-linux-riscv64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz#1afa8dfe55a6c312f1904ee608b81417205f5027"
|
||||
integrity sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==
|
||||
|
||||
esbuild-linux-s390x@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz#1f7b3c4429c8ca99920ba6bf356ccc5b38fabd34"
|
||||
integrity sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==
|
||||
|
||||
esbuild-netbsd-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz#d72c7155686c938c1aff126209b689c22823347c"
|
||||
integrity sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==
|
||||
|
||||
esbuild-openbsd-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz#761bd87ecab97386948eaf667a065cb0ecaa0f76"
|
||||
integrity sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==
|
||||
|
||||
esbuild-sunos-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz#07e04cbf9747f281a967d09230a158a1be5b530c"
|
||||
integrity sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==
|
||||
|
||||
esbuild-windows-32@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz#130d1982cc41fb67461e9f8a65c6ebd13a1f35bb"
|
||||
integrity sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==
|
||||
|
||||
esbuild-windows-64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz#638bdf495c109c1882e8b0529cb8e2fea11383fb"
|
||||
integrity sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==
|
||||
|
||||
esbuild-windows-arm64@0.15.15:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz#5a277ce10de999d2a6465fc92a8c2a2d207ebd31"
|
||||
integrity sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==
|
||||
|
||||
esbuild@^0.15.9:
|
||||
version "0.15.15"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.15.tgz#503b70bdc18d72d8fc2962ed3ab9219249e58bbe"
|
||||
integrity sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==
|
||||
optionalDependencies:
|
||||
"@esbuild/android-arm" "0.15.15"
|
||||
"@esbuild/linux-loong64" "0.15.15"
|
||||
esbuild-android-64 "0.15.15"
|
||||
esbuild-android-arm64 "0.15.15"
|
||||
esbuild-darwin-64 "0.15.15"
|
||||
esbuild-darwin-arm64 "0.15.15"
|
||||
esbuild-freebsd-64 "0.15.15"
|
||||
esbuild-freebsd-arm64 "0.15.15"
|
||||
esbuild-linux-32 "0.15.15"
|
||||
esbuild-linux-64 "0.15.15"
|
||||
esbuild-linux-arm "0.15.15"
|
||||
esbuild-linux-arm64 "0.15.15"
|
||||
esbuild-linux-mips64le "0.15.15"
|
||||
esbuild-linux-ppc64le "0.15.15"
|
||||
esbuild-linux-riscv64 "0.15.15"
|
||||
esbuild-linux-s390x "0.15.15"
|
||||
esbuild-netbsd-64 "0.15.15"
|
||||
esbuild-openbsd-64 "0.15.15"
|
||||
esbuild-sunos-64 "0.15.15"
|
||||
esbuild-windows-32 "0.15.15"
|
||||
esbuild-windows-64 "0.15.15"
|
||||
esbuild-windows-arm64 "0.15.15"
|
||||
|
||||
estree-walker@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
|
||||
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
|
||||
|
||||
fsevents@~2.3.2:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
|
||||
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
|
||||
|
||||
function-bind@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
||||
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
||||
|
||||
has@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
||||
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
|
||||
dependencies:
|
||||
function-bind "^1.1.1"
|
||||
|
||||
is-core-module@^2.9.0:
|
||||
version "2.9.0"
|
||||
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
|
||||
integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
|
||||
dependencies:
|
||||
has "^1.0.3"
|
||||
|
||||
jsonc-parser@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d"
|
||||
integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==
|
||||
|
||||
magic-string@^0.25.7:
|
||||
version "0.25.9"
|
||||
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
|
||||
integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
|
||||
dependencies:
|
||||
sourcemap-codec "^1.4.8"
|
||||
|
||||
nanoid@^3.3.4:
|
||||
version "3.3.4"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
|
||||
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
|
||||
|
||||
path-parse@^1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
||||
|
||||
picocolors@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
||||
|
||||
postcss@^8.1.10:
|
||||
version "8.4.14"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
|
||||
integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
|
||||
dependencies:
|
||||
nanoid "^3.3.4"
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
postcss@^8.4.18:
|
||||
version "8.4.19"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc"
|
||||
integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==
|
||||
dependencies:
|
||||
nanoid "^3.3.4"
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
preact@^10.0.0:
|
||||
version "10.10.0"
|
||||
resolved "https://registry.yarnpkg.com/preact/-/preact-10.10.0.tgz#7434750a24b59dae1957d95dc0aa47a4a8e9a180"
|
||||
integrity sha512-fszkg1iJJjq68I4lI8ZsmBiaoQiQHbxf1lNq+72EmC/mZOsFF5zn3k1yv9QGoFgIXzgsdSKtYymLJsrJPoamjQ==
|
||||
|
||||
resolve@^1.22.1:
|
||||
version "1.22.1"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
|
||||
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
|
||||
dependencies:
|
||||
is-core-module "^2.9.0"
|
||||
path-parse "^1.0.7"
|
||||
supports-preserve-symlinks-flag "^1.0.0"
|
||||
|
||||
rollup@^2.79.1:
|
||||
version "2.79.1"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
|
||||
integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
shiki@^0.11.1:
|
||||
version "0.11.1"
|
||||
resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.11.1.tgz#df0f719e7ab592c484d8b73ec10e215a503ab8cc"
|
||||
integrity sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==
|
||||
dependencies:
|
||||
jsonc-parser "^3.0.0"
|
||||
vscode-oniguruma "^1.6.1"
|
||||
vscode-textmate "^6.0.0"
|
||||
|
||||
source-map-js@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||
|
||||
source-map@^0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
sourcemap-codec@^1.4.8:
|
||||
version "1.4.8"
|
||||
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
|
||||
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
|
||||
|
||||
supports-preserve-symlinks-flag@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||
|
||||
vite@^3.2.3:
|
||||
version "3.2.4"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.4.tgz#d8c7892dd4268064e04fffbe7d866207dd24166e"
|
||||
integrity sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==
|
||||
dependencies:
|
||||
esbuild "^0.15.9"
|
||||
postcss "^8.4.18"
|
||||
resolve "^1.22.1"
|
||||
rollup "^2.79.1"
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
vitepress@1.0.0-alpha.29:
|
||||
version "1.0.0-alpha.29"
|
||||
resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.0.0-alpha.29.tgz#9c4a4012efe2b37e223dfaa4dab03ee9fa777d1e"
|
||||
integrity sha512-oaRaeMLcN9M3Bxz97fFVF6Gzm3Aqtb0CijTt5TOW0XPzNPuKA0YpFnsmS97gdKmA+VztM6itRJ8K7JJuU0VS3g==
|
||||
dependencies:
|
||||
"@docsearch/css" "^3.3.0"
|
||||
"@docsearch/js" "^3.3.0"
|
||||
"@vitejs/plugin-vue" "^3.2.0"
|
||||
"@vue/devtools-api" "^6.4.5"
|
||||
"@vueuse/core" "^9.4.0"
|
||||
body-scroll-lock "4.0.0-beta.0"
|
||||
shiki "^0.11.1"
|
||||
vite "^3.2.3"
|
||||
vue "^3.2.41"
|
||||
|
||||
vscode-oniguruma@^1.6.1:
|
||||
version "1.6.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607"
|
||||
integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==
|
||||
|
||||
vscode-textmate@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz#a3777197235036814ac9a92451492f2748589210"
|
||||
integrity sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==
|
||||
|
||||
vue-demi@*:
|
||||
version "0.13.4"
|
||||
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.4.tgz#fcb320892d78d3a7ec227024776f77d9a5c4831d"
|
||||
integrity sha512-KP4lq9uSz0KZbaqCllRhnxMV3mYRsRWJfdsAhZyt5bV5O1RTpoeDptBRV9NOa/JgOpfaA9ane88VF7OjWNK/DA==
|
||||
|
||||
vue@3.2.45, vue@^3.2.41:
|
||||
version "3.2.45"
|
||||
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.45.tgz#94a116784447eb7dbd892167784619fef379b3c8"
|
||||
integrity sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==
|
||||
dependencies:
|
||||
"@vue/compiler-dom" "3.2.45"
|
||||
"@vue/compiler-sfc" "3.2.45"
|
||||
"@vue/runtime-dom" "3.2.45"
|
||||
"@vue/server-renderer" "3.2.45"
|
||||
"@vue/shared" "3.2.45"
|
||||
13
examples/vuepress/.gitignore
vendored
Executable file
13
examples/vuepress/.gitignore
vendored
Executable file
@@ -0,0 +1,13 @@
|
||||
pids
|
||||
logs
|
||||
node_modules
|
||||
npm-debug.log
|
||||
coverage/
|
||||
run
|
||||
dist
|
||||
.DS_Store
|
||||
.nyc_output
|
||||
.basement
|
||||
config.local.js
|
||||
basement_dist
|
||||
.vercel
|
||||
41
examples/vuepress/README.md
Normal file
41
examples/vuepress/README.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# VuePress
|
||||
|
||||
This directory is a brief example of a [VuePress](https://vuepress.vuejs.org/) site that can be deployed to Vercel with zero-configuration.
|
||||
|
||||
## Deploy Your Own
|
||||
|
||||
[](https://vercel.com/new/clone?repository-url=https://github.com/vercel/vercel/tree/main/examples/vuepress&template=vuepress)
|
||||
|
||||
_Live Example: https://vuepress-starter-template.vercel.app_
|
||||
|
||||
## Setup
|
||||
|
||||
Install the dependencies:
|
||||
|
||||
```bash
|
||||
$ yarn install
|
||||
```
|
||||
|
||||
### Development
|
||||
|
||||
Start the development server
|
||||
|
||||
```bash
|
||||
$ yarn dev
|
||||
```
|
||||
|
||||
### Build the project
|
||||
|
||||
Build for production
|
||||
|
||||
```bash
|
||||
$ yarn build
|
||||
```
|
||||
|
||||
### Deploy
|
||||
|
||||
Deploy your VuePress application to Vercel
|
||||
|
||||
```bash
|
||||
$ vercel
|
||||
```
|
||||
13
examples/vuepress/package.json
Executable file
13
examples/vuepress/package.json
Executable file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vuepress dev src",
|
||||
"build": "vuepress build src"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0 <18.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"vuepress": "1.9.7"
|
||||
}
|
||||
}
|
||||
15
examples/vuepress/src/config/README.md
Executable file
15
examples/vuepress/src/config/README.md
Executable file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
sidebar: auto
|
||||
---
|
||||
|
||||
# Config
|
||||
|
||||
## foo
|
||||
|
||||
- Type: `string`
|
||||
- Default: `/`
|
||||
|
||||
## bar
|
||||
|
||||
- Type: `string`
|
||||
- Default: `/`
|
||||
5
examples/vuepress/src/guide/README.md
Executable file
5
examples/vuepress/src/guide/README.md
Executable file
@@ -0,0 +1,5 @@
|
||||
# Introduction
|
||||
|
||||
VuePress is composed of two parts: a [minimalistic static site generator](https://github.com/vuejs/vuepress/tree/master/packages/%40vuepress/core) with a Vue-powered [theming system](https://v1.vuepress.vuejs.org/theme/) and [Plugin API](https://v1.vuepress.vuejs.org/plugin/), and a [default theme](https://v1.vuepress.vuejs.org/theme/default-theme-config.html) optimized for writing technical documentation. It was created to support the documentation needs of Vue's own sub projects.
|
||||
|
||||
Each page generated by VuePress has its own pre-rendered static HTML, providing great loading performance and is SEO-friendly. Once the page is loaded, however, Vue takes over the static content and turns it into a full Single-Page Application (SPA). Additional pages are fetched on demand as the user navigates around the site.
|
||||
9
examples/vuepress/src/guide/using-vue.md
Executable file
9
examples/vuepress/src/guide/using-vue.md
Executable file
@@ -0,0 +1,9 @@
|
||||
# Using Vue in Markdown
|
||||
|
||||
## Browser API Access Restrictions
|
||||
|
||||
Because VuePress applications are server-rendered in Node.js when generating static builds, any Vue usage must conform to the [universal code requirements](https://ssr.vuejs.org/en/universal.html). In short, make sure to only access Browser / DOM APIs in `beforeMount` or `mounted` hooks.
|
||||
|
||||
If you are using or demoing components that are not SSR friendly (for example containing custom directives), you can wrap them inside the built-in `<ClientOnly>` component:
|
||||
|
||||
##
|
||||
15
examples/vuepress/src/index.md
Executable file
15
examples/vuepress/src/index.md
Executable file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
home: true
|
||||
heroImage: https://v1.vuepress.vuejs.org/hero.png
|
||||
tagline:
|
||||
actionText: Quick Start →
|
||||
actionLink: /guide/
|
||||
features:
|
||||
- title: Feature 1 Title
|
||||
details: Feature 1 Description
|
||||
- title: Feature 2 Title
|
||||
details: Feature 2 Description
|
||||
- title: Feature 3 Title
|
||||
details: Feature 3 Description
|
||||
footer: Made by with ❤️
|
||||
---
|
||||
8462
examples/vuepress/yarn.lock
Normal file
8462
examples/vuepress/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/build-utils",
|
||||
"version": "5.5.9",
|
||||
"version": "5.7.0",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.js",
|
||||
|
||||
@@ -24,6 +24,7 @@ export interface LambdaOptionsBase {
|
||||
supportsMultiPayloads?: boolean;
|
||||
supportsWrapper?: boolean;
|
||||
experimentalResponseStreaming?: boolean;
|
||||
operationType?: string;
|
||||
}
|
||||
|
||||
export interface LambdaOptionsWithFiles extends LambdaOptionsBase {
|
||||
@@ -47,6 +48,12 @@ interface GetLambdaOptionsFromFunctionOptions {
|
||||
|
||||
export class Lambda {
|
||||
type: 'Lambda';
|
||||
/**
|
||||
* This is a label for the type of Lambda a framework is producing.
|
||||
* The value can be any string that makes sense for a given framework.
|
||||
* Examples: "API", "ISR", "SSR", "SSG", "Render", "Resource"
|
||||
*/
|
||||
operationType?: string;
|
||||
files?: Files;
|
||||
handler: string;
|
||||
runtime: string;
|
||||
@@ -75,6 +82,7 @@ export class Lambda {
|
||||
supportsMultiPayloads,
|
||||
supportsWrapper,
|
||||
experimentalResponseStreaming,
|
||||
operationType,
|
||||
} = opts;
|
||||
if ('files' in opts) {
|
||||
assert(typeof opts.files === 'object', '"files" must be an object');
|
||||
@@ -123,7 +131,9 @@ export class Lambda {
|
||||
'"regions" is not a string Array'
|
||||
);
|
||||
}
|
||||
|
||||
this.type = 'Lambda';
|
||||
this.operationType = operationType;
|
||||
this.files = 'files' in opts ? opts.files : undefined;
|
||||
this.handler = handler;
|
||||
this.runtime = runtime;
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Lambda } from './lambda';
|
||||
|
||||
interface PrerenderOptions {
|
||||
expiration: number | false;
|
||||
lambda: Lambda;
|
||||
lambda?: Lambda;
|
||||
fallback: File | null;
|
||||
group?: number;
|
||||
bypassToken?: string | null /* optional to be non-breaking change */;
|
||||
@@ -15,7 +15,7 @@ interface PrerenderOptions {
|
||||
export class Prerender {
|
||||
public type: 'Prerender';
|
||||
public expiration: number | false;
|
||||
public lambda: Lambda;
|
||||
public lambda?: Lambda;
|
||||
public fallback: File | null;
|
||||
public group?: number;
|
||||
public bypassToken: string | null;
|
||||
@@ -35,7 +35,12 @@ export class Prerender {
|
||||
}: PrerenderOptions) {
|
||||
this.type = 'Prerender';
|
||||
this.expiration = expiration;
|
||||
|
||||
this.lambda = lambda;
|
||||
if (this.lambda) {
|
||||
// "ISR" is the platform default lambda label for prerender functions
|
||||
this.lambda.operationType = this.lambda.operationType || 'ISR';
|
||||
}
|
||||
|
||||
if (
|
||||
typeof group !== 'undefined' &&
|
||||
|
||||
@@ -425,6 +425,9 @@ export interface BuildResultV2Typical {
|
||||
domain: string;
|
||||
value: string;
|
||||
}>;
|
||||
framework?: {
|
||||
version: string;
|
||||
};
|
||||
}
|
||||
|
||||
export type BuildResultV2 = BuildResultV2Typical | BuildResultBuildOutput;
|
||||
|
||||
2
packages/build-utils/test/unit.test.ts
vendored
2
packages/build-utils/test/unit.test.ts
vendored
@@ -15,6 +15,7 @@ import {
|
||||
runPackageJsonScript,
|
||||
scanParentDirs,
|
||||
FileBlob,
|
||||
Prerender,
|
||||
} from '../src';
|
||||
|
||||
jest.setTimeout(10 * 1000);
|
||||
@@ -442,7 +443,6 @@ it('should warn for deprecated versions, soon to be discontinued', async () => {
|
||||
});
|
||||
|
||||
it('should support initialHeaders and initialStatus correctly', async () => {
|
||||
const { Prerender } = require('@vercel/build-utils/dist/prerender.js');
|
||||
new Prerender({
|
||||
expiration: 1,
|
||||
fallback: null,
|
||||
|
||||
@@ -51,6 +51,8 @@ At this point you can make modifications to the CLI source code and test them ou
|
||||
cd packages/cli
|
||||
```
|
||||
|
||||
### `yarn dev <cli-commands...>`
|
||||
|
||||
From within the `packages/cli` directory, you can use the "dev" script to quickly execute Vercel CLI from its TypeScript source code directly (without having to manually compile first). For example:
|
||||
|
||||
```bash
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vercel",
|
||||
"version": "28.5.6",
|
||||
"version": "28.7.1",
|
||||
"preferGlobal": true,
|
||||
"license": "Apache-2.0",
|
||||
"description": "The command-line interface for Vercel",
|
||||
@@ -41,18 +41,16 @@
|
||||
"node": ">= 14"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "5.5.9",
|
||||
"@vercel/go": "2.2.17",
|
||||
"@vercel/hydrogen": "0.0.31",
|
||||
"@vercel/next": "3.2.13",
|
||||
"@vercel/node": "2.6.4",
|
||||
"@vercel/python": "3.1.27",
|
||||
"@vercel/redwood": "1.0.37",
|
||||
"@vercel/remix": "1.0.37",
|
||||
"@vercel/ruby": "1.3.43",
|
||||
"@vercel/static-build": "1.0.39",
|
||||
"json5": "2.2.1",
|
||||
"update-notifier": "5.1.0"
|
||||
"@vercel/build-utils": "5.7.0",
|
||||
"@vercel/go": "2.2.19",
|
||||
"@vercel/hydrogen": "0.0.33",
|
||||
"@vercel/next": "3.3.2",
|
||||
"@vercel/node": "2.7.1",
|
||||
"@vercel/python": "3.1.29",
|
||||
"@vercel/redwood": "1.0.39",
|
||||
"@vercel/remix": "1.1.1",
|
||||
"@vercel/ruby": "1.3.45",
|
||||
"@vercel/static-build": "1.0.42"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@alex_neo/jest-expect-message": "1.0.5",
|
||||
@@ -96,10 +94,10 @@
|
||||
"@types/which": "1.3.2",
|
||||
"@types/write-json-file": "2.2.1",
|
||||
"@types/yauzl-promise": "2.1.0",
|
||||
"@vercel/client": "12.2.19",
|
||||
"@vercel/client": "12.2.21",
|
||||
"@vercel/error-utils": "1.0.3",
|
||||
"@vercel/frameworks": "1.1.12",
|
||||
"@vercel/fs-detectors": "3.5.2",
|
||||
"@vercel/frameworks": "1.1.14",
|
||||
"@vercel/fs-detectors": "3.5.4",
|
||||
"@vercel/fun": "1.0.4",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"@zeit/source-map-support": "0.6.2",
|
||||
@@ -142,6 +140,7 @@
|
||||
"is-port-reachable": "3.1.0",
|
||||
"is-url": "1.2.2",
|
||||
"jaro-winkler": "0.2.8",
|
||||
"json5": "2.2.1",
|
||||
"jsonlines": "0.1.1",
|
||||
"line-async-iterator": "3.0.0",
|
||||
"load-json-file": "3.0.0",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import cpy from 'cpy';
|
||||
import execa from 'execa';
|
||||
import { join } from 'path';
|
||||
import { remove, writeFile } from 'fs-extra';
|
||||
import { remove, readJSON, writeFile } from 'fs-extra';
|
||||
|
||||
const dirRoot = join(__dirname, '..');
|
||||
const distRoot = join(dirRoot, 'dist');
|
||||
@@ -43,15 +43,15 @@ async function main() {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
|
||||
const pkg = await readJSON(join(dirRoot, 'package.json'));
|
||||
const dependencies = Object.keys(pkg?.dependencies ?? {});
|
||||
// Do the initial `ncc` build
|
||||
console.log();
|
||||
const args = [
|
||||
'ncc',
|
||||
'build',
|
||||
'--external',
|
||||
'update-notifier',
|
||||
'src/index.ts',
|
||||
];
|
||||
console.log('Dependencies:', dependencies);
|
||||
const externs = [];
|
||||
for (const dep of dependencies) {
|
||||
externs.push('--external', dep);
|
||||
}
|
||||
const args = ['ncc', 'build', 'src/index.ts', ...externs];
|
||||
await execa('yarn', args, { stdio: 'inherit', cwd: dirRoot });
|
||||
|
||||
// `ncc` has some issues with `@vercel/fun`'s runtime files:
|
||||
@@ -78,6 +78,10 @@ async function main() {
|
||||
// Band-aid to bundle stuff that `ncc` neglects to bundle
|
||||
await cpy(join(dirRoot, 'src/util/projects/VERCEL_DIR_README.txt'), distRoot);
|
||||
await cpy(join(dirRoot, 'src/util/dev/builder-worker.js'), distRoot);
|
||||
await cpy(
|
||||
join(dirRoot, 'src/util/get-latest-version/get-latest-worker.js'),
|
||||
distRoot
|
||||
);
|
||||
|
||||
console.log('Finished building Vercel CLI');
|
||||
}
|
||||
|
||||
@@ -130,7 +130,6 @@ export default async function main(client: Client): Promise<number> {
|
||||
|
||||
// Parse CLI args
|
||||
const argv = getArgs(client.argv.slice(2), {
|
||||
'--cwd': String,
|
||||
'--output': String,
|
||||
'--prod': Boolean,
|
||||
'--yes': Boolean,
|
||||
@@ -141,10 +140,6 @@ export default async function main(client: Client): Promise<number> {
|
||||
return 2;
|
||||
}
|
||||
|
||||
// Set the working directory if necessary
|
||||
if (argv['--cwd']) {
|
||||
process.chdir(argv['--cwd']);
|
||||
}
|
||||
const cwd = process.cwd();
|
||||
|
||||
// Build `target` influences which environment variables will be used
|
||||
|
||||
@@ -23,6 +23,7 @@ export const help = () => `
|
||||
login [email] Logs into your account or creates a new one
|
||||
logout Logs out of your account
|
||||
pull [path] Pull your Project Settings from the cloud
|
||||
rollback [url|id] Quickly revert back to a previous deployment [beta]
|
||||
switch [scope] Switches between teams and your personal account
|
||||
|
||||
${chalk.dim('Advanced')}
|
||||
|
||||
@@ -33,6 +33,7 @@ export default async function dev(
|
||||
if (link.status === 'not_linked' && !process.env.__VERCEL_SKIP_DEV_CMD) {
|
||||
link = await setupAndLink(client, cwd, {
|
||||
autoConfirm: opts['--yes'],
|
||||
link,
|
||||
successEmoji: 'link',
|
||||
setupMsg: 'Set up and develop',
|
||||
});
|
||||
|
||||
@@ -29,6 +29,7 @@ export default new Map([
|
||||
['pull', 'pull'],
|
||||
['remove', 'remove'],
|
||||
['rm', 'remove'],
|
||||
['rollback', 'rollback'],
|
||||
['secret', 'secrets'],
|
||||
['secrets', 'secrets'],
|
||||
['switch', 'teams'],
|
||||
|
||||
@@ -147,6 +147,7 @@ export default async function main(client: Client) {
|
||||
if (status === 'not_linked' && !app) {
|
||||
const linkedProject = await ensureLink('list', client, path, {
|
||||
autoConfirm,
|
||||
link,
|
||||
});
|
||||
if (typeof linkedProject === 'number') {
|
||||
return linkedProject;
|
||||
|
||||
@@ -18,7 +18,7 @@ import getDeploymentsByProjectId, {
|
||||
import { getPkgName, getCommandName } from '../util/pkg-name';
|
||||
import getArgs from '../util/get-args';
|
||||
import handleError from '../util/handle-error';
|
||||
import Client from '../util/client';
|
||||
import type Client from '../util/client';
|
||||
import { Output } from '../util/output';
|
||||
import { Alias, Project } from '../types';
|
||||
import { NowError } from '../util/now-error';
|
||||
|
||||
122
packages/cli/src/commands/rollback.ts
Normal file
122
packages/cli/src/commands/rollback.ts
Normal file
@@ -0,0 +1,122 @@
|
||||
import chalk from 'chalk';
|
||||
import type Client from '../util/client';
|
||||
import { ensureLink } from '../util/link/ensure-link';
|
||||
import getArgs from '../util/get-args';
|
||||
import { getPkgName } from '../util/pkg-name';
|
||||
import handleError from '../util/handle-error';
|
||||
import logo from '../util/output/logo';
|
||||
import ms from 'ms';
|
||||
import requestRollback from '../util/rollback/request-rollback';
|
||||
import rollbackStatus from '../util/rollback/status';
|
||||
import validatePaths from '../util/validate-paths';
|
||||
|
||||
const help = () => {
|
||||
console.log(`
|
||||
${chalk.bold(
|
||||
`${logo} ${getPkgName()} rollback`
|
||||
)} [deploymentId|deploymentName]
|
||||
|
||||
Quickly revert back to a previous deployment.
|
||||
|
||||
${chalk.dim('Options:')}
|
||||
|
||||
-h, --help Output usage information
|
||||
-A ${chalk.bold.underline('FILE')}, --local-config=${chalk.bold.underline(
|
||||
'FILE'
|
||||
)} Path to the local ${'`vercel.json`'} file
|
||||
-Q ${chalk.bold.underline('DIR')}, --global-config=${chalk.bold.underline(
|
||||
'DIR'
|
||||
)} Path to the global ${'`.vercel`'} directory
|
||||
-d, --debug Debug mode [off]
|
||||
-t ${chalk.bold.underline('TOKEN')}, --token=${chalk.bold.underline(
|
||||
'TOKEN'
|
||||
)} Login token
|
||||
--timeout=${chalk.bold.underline(
|
||||
'TIME'
|
||||
)} Time to wait for rollback completion [3m]
|
||||
-y, --yes Skip questions when setting up new project using default scope and settings
|
||||
|
||||
${chalk.dim('Examples:')}
|
||||
|
||||
${chalk.gray('–')} Show the status of any current pending rollbacks
|
||||
|
||||
${chalk.cyan(`$ ${getPkgName()} rollback`)}
|
||||
${chalk.cyan(`$ ${getPkgName()} rollback status`)}
|
||||
${chalk.cyan(`$ ${getPkgName()} rollback status --timeout 30s`)}
|
||||
|
||||
${chalk.gray('–')} Rollback a deployment using id or url
|
||||
|
||||
${chalk.cyan(`$ ${getPkgName()} rollback <deployment id/url>`)}
|
||||
`);
|
||||
};
|
||||
|
||||
/**
|
||||
* `vc rollback` command
|
||||
* @param {Client} client
|
||||
* @returns {Promise<number>} Resolves an exit code; 0 on success
|
||||
*/
|
||||
export default async (client: Client): Promise<number> => {
|
||||
let argv;
|
||||
try {
|
||||
argv = getArgs(client.argv.slice(2), {
|
||||
'--debug': Boolean,
|
||||
'-d': '--debug',
|
||||
'--timeout': String,
|
||||
'--yes': Boolean,
|
||||
'-y': '--yes',
|
||||
});
|
||||
} catch (err) {
|
||||
handleError(err);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (argv['--help'] || argv._[0] === 'help') {
|
||||
help();
|
||||
return 2;
|
||||
}
|
||||
|
||||
// ensure the current directory is good
|
||||
const cwd = argv['--cwd'] || process.cwd();
|
||||
const pathValidation = await validatePaths(client, [cwd]);
|
||||
if (!pathValidation.valid) {
|
||||
return pathValidation.exitCode;
|
||||
}
|
||||
|
||||
// ensure the current directory is a linked project
|
||||
const linkedProject = await ensureLink(
|
||||
'rollback',
|
||||
client,
|
||||
pathValidation.path,
|
||||
{
|
||||
autoConfirm: Boolean(argv['--yes']),
|
||||
}
|
||||
);
|
||||
if (typeof linkedProject === 'number') {
|
||||
return linkedProject;
|
||||
}
|
||||
|
||||
// validate the timeout
|
||||
let timeout = argv['--timeout'];
|
||||
if (timeout && ms(timeout) === undefined) {
|
||||
client.output.error(`Invalid timeout "${timeout}"`);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const { project } = linkedProject;
|
||||
const actionOrDeployId = argv._[1] || 'status';
|
||||
|
||||
if (actionOrDeployId === 'status') {
|
||||
return await rollbackStatus({
|
||||
client,
|
||||
project,
|
||||
timeout,
|
||||
});
|
||||
}
|
||||
|
||||
return await requestRollback({
|
||||
client,
|
||||
deployId: actionOrDeployId,
|
||||
project,
|
||||
timeout,
|
||||
});
|
||||
};
|
||||
@@ -18,7 +18,7 @@ import sourceMap from '@zeit/source-map-support';
|
||||
import { mkdirp } from 'fs-extra';
|
||||
import chalk from 'chalk';
|
||||
import epipebomb from 'epipebomb';
|
||||
import updateNotifier from 'update-notifier';
|
||||
import getLatestVersion from './util/get-latest-version';
|
||||
import { URL } from 'url';
|
||||
import * as Sentry from '@sentry/node';
|
||||
import hp from './util/humanize-path';
|
||||
@@ -55,13 +55,6 @@ import { VercelConfig } from '@vercel/client';
|
||||
|
||||
const isCanary = pkg.version.includes('canary');
|
||||
|
||||
// Checks for available update and returns an instance
|
||||
const notifier = updateNotifier({
|
||||
pkg,
|
||||
distTag: isCanary ? 'canary' : 'latest',
|
||||
updateCheckInterval: 1000 * 60 * 60 * 24 * 7, // 1 week
|
||||
});
|
||||
|
||||
const VERCEL_DIR = getGlobalPathConfig();
|
||||
const VERCEL_CONFIG_PATH = configFiles.getConfigFilePath();
|
||||
const VERCEL_AUTH_CONFIG_PATH = configFiles.getAuthConfigFilePath();
|
||||
@@ -149,22 +142,30 @@ const main = async () => {
|
||||
}
|
||||
|
||||
// Print update information, if available
|
||||
if (notifier.update && notifier.update.latest !== pkg.version && isTTY) {
|
||||
const { latest } = notifier.update;
|
||||
console.log(
|
||||
info(
|
||||
`${chalk.black.bgCyan('UPDATE AVAILABLE')} ` +
|
||||
`Run ${cmd(
|
||||
await getUpdateCommand()
|
||||
)} to install ${getTitleName()} CLI ${latest}`
|
||||
)
|
||||
);
|
||||
if (isTTY && !process.env.NO_UPDATE_NOTIFIER) {
|
||||
// Check if an update is available. If so, `latest` will contain a string
|
||||
// of the latest version, otherwise `undefined`.
|
||||
const latest = getLatestVersion({
|
||||
distTag: isCanary ? 'canary' : 'latest',
|
||||
output,
|
||||
pkg,
|
||||
});
|
||||
if (latest) {
|
||||
console.log(
|
||||
info(
|
||||
`${chalk.black.bgCyan('UPDATE AVAILABLE')} ` +
|
||||
`Run ${cmd(
|
||||
await getUpdateCommand()
|
||||
)} to install ${getTitleName()} CLI ${latest}`
|
||||
)
|
||||
);
|
||||
|
||||
console.log(
|
||||
info(
|
||||
`Changelog: https://github.com/vercel/vercel/releases/tag/vercel@${latest}`
|
||||
)
|
||||
);
|
||||
console.log(
|
||||
`${info(
|
||||
`Changelog: https://github.com/vercel/vercel/releases/tag/vercel@${latest}`
|
||||
)}\n`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// The second argument to the command can be:
|
||||
@@ -174,7 +175,7 @@ const main = async () => {
|
||||
const targetOrSubcommand = argv._[2];
|
||||
|
||||
// Currently no beta commands - add here as needed
|
||||
const betaCommands: string[] = [];
|
||||
const betaCommands: string[] = ['rollback'];
|
||||
if (betaCommands.includes(targetOrSubcommand)) {
|
||||
console.log(
|
||||
`${chalk.grey(
|
||||
@@ -555,6 +556,9 @@ const main = async () => {
|
||||
case 'remove':
|
||||
func = require('./commands/remove').default;
|
||||
break;
|
||||
case 'rollback':
|
||||
func = require('./commands/rollback').default;
|
||||
break;
|
||||
case 'secrets':
|
||||
func = require('./commands/secrets').default;
|
||||
break;
|
||||
|
||||
@@ -287,6 +287,7 @@ export interface Project extends ProjectSettings {
|
||||
link?: ProjectLinkData;
|
||||
alias?: ProjectAliasTarget[];
|
||||
latestDeployments?: Partial<Deployment>[];
|
||||
lastRollbackTarget: RollbackTarget | null;
|
||||
}
|
||||
|
||||
export interface Org {
|
||||
@@ -321,6 +322,20 @@ export type ProjectLinkResult =
|
||||
| 'MISSING_PROJECT_SETTINGS';
|
||||
};
|
||||
|
||||
export type RollbackJobStatus =
|
||||
| 'pending'
|
||||
| 'in-progress'
|
||||
| 'succeeded'
|
||||
| 'failed'
|
||||
| 'skipped';
|
||||
|
||||
export interface RollbackTarget {
|
||||
fromDeploymentId: string;
|
||||
jobStatus: RollbackJobStatus;
|
||||
requestedAt: number;
|
||||
toDeploymentId: string;
|
||||
}
|
||||
|
||||
export interface Token {
|
||||
id: string;
|
||||
name: string;
|
||||
|
||||
@@ -121,6 +121,12 @@ async function writeBuildResultV2(
|
||||
if (isLambda(output)) {
|
||||
await writeLambda(outputDir, output, normalizedPath, undefined, lambdas);
|
||||
} else if (isPrerender(output)) {
|
||||
if (!output.lambda) {
|
||||
throw new Error(
|
||||
`Invalid Prerender with no "lambda" property: ${normalizedPath}`
|
||||
);
|
||||
}
|
||||
|
||||
await writeLambda(
|
||||
outputDir,
|
||||
output.lambda,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import Client from '../client';
|
||||
import type Client from '../client';
|
||||
import toHost from '../to-host';
|
||||
import { Deployment } from '../../types';
|
||||
import {
|
||||
|
||||
@@ -1,4 +1,14 @@
|
||||
<main>
|
||||
{{? it.error_code == 'EDGE_FUNCTION_INVOCATION_FAILED' }}
|
||||
<p class="error-title error-title-guilty">
|
||||
<strong>This Edge Function</strong><span> has crashed.</span>
|
||||
</p>
|
||||
{{? }}
|
||||
{{? it.error_code == 'FUNCTION_INVOCATION_FAILED' }}
|
||||
<p class="error-title error-title-guilty">
|
||||
<strong>This Serverless Function</strong><span> has crashed.</span>
|
||||
</p>
|
||||
{{? }}
|
||||
<p class="devinfo-container">
|
||||
<span class="error-code"><strong>{{= it.http_status_code }}</strong>: {{! it.http_status_description }}</span>
|
||||
{{? it.error_code }}
|
||||
@@ -6,4 +16,11 @@
|
||||
{{?}}
|
||||
<span class="devinfo-line">ID: <code>{{! it.request_id }}</code>
|
||||
</p>
|
||||
<p>
|
||||
<ul>
|
||||
<li>
|
||||
Check the logs in your terminal window to see the application error.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
</main>
|
||||
|
||||
@@ -6,4 +6,6 @@
|
||||
{{?}}
|
||||
<span class="devinfo-line">ID: <code>{{! it.request_id }}</code>
|
||||
</p>
|
||||
|
||||
<a href="https://vercel.link/404"><div class="note">Click here to learn more about this error.</div></a>
|
||||
</main>
|
||||
|
||||
@@ -1,38 +1,4 @@
|
||||
<header>
|
||||
<div class="header-item first{{? it.app_error }} active{{?}}">
|
||||
<svg class="header-item-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
{{? it.app_error }}
|
||||
<circle cx="8" cy="8" r="8" fill="#FF0080" />
|
||||
{{??}}
|
||||
<circle cx="8" cy="8" r="7.5" stroke="#CCCCCC" />
|
||||
{{?}}
|
||||
</svg>
|
||||
<div class="header-item-content">
|
||||
<h1>Application Error</h1>
|
||||
<p>The error occurred in the hosted application</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-item{{? !it.app_error }} active{{?}}">
|
||||
<svg class="header-item-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
{{? !it.app_error }}
|
||||
<circle cx="8" cy="8" r="8" fill="#FF0080" />
|
||||
{{??}}
|
||||
<circle cx="8" cy="8" r="7.5" stroke="#CCCCCC" />
|
||||
{{?}}
|
||||
</svg>
|
||||
<div class="header-item-content">
|
||||
<h1>Platform Error</h1>
|
||||
<p>The error occurred in the infrastructure layer</p>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<main>
|
||||
<p>
|
||||
<h1 class="error-title">{{! it.title }}</h1>
|
||||
{{? it.subtitle }}
|
||||
<p>{{! it.subtitle }}</p>
|
||||
{{?}}
|
||||
</p>
|
||||
<p class="devinfo-container">
|
||||
<span class="error-code"><strong>{{= it.http_status_code }}</strong>: {{! it.http_status_description }}</span>
|
||||
{{? it.error_code }}
|
||||
@@ -40,22 +6,11 @@
|
||||
{{?}}
|
||||
<span class="devinfo-line">ID: <code>{{! it.request_id }}</code>
|
||||
</p>
|
||||
{{? it.app_error }}
|
||||
<p>
|
||||
<ul>
|
||||
<li>
|
||||
Check the logs in your terminal window to see the application error.
|
||||
</li>
|
||||
</ul>
|
||||
<a target="_blank" href="https://vercel.com/docs/error/application/{{= it.error_code }}" class="docs-link" rel="noopener noreferrer">Developer Documentation →</a>
|
||||
</p>
|
||||
{{??}}
|
||||
<p>
|
||||
<ul>
|
||||
<li>
|
||||
Please open a <a target="_blank" href="https://github.com/vercel/vercel/issues/new/choose">GitHub issue</a> describing the problem you are experiencing with <code>vercel dev</code>.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
{{?}}
|
||||
</main>
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
<style>
|
||||
html {
|
||||
font-size: 62.5%;
|
||||
box-sizing: border-box
|
||||
box-sizing: border-box;
|
||||
height: -webkit-fill-available
|
||||
}
|
||||
|
||||
*,
|
||||
@@ -29,7 +30,9 @@
|
||||
text-rendering: optimizeLegibility;
|
||||
hyphens: auto;
|
||||
height: 100vh;
|
||||
height: -webkit-fill-available;
|
||||
max-height: 100vh;
|
||||
max-height: -webkit-fill-available;
|
||||
margin: 0
|
||||
}
|
||||
|
||||
@@ -88,7 +91,7 @@
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
min-height: 100vh
|
||||
min-height: 100%
|
||||
}
|
||||
|
||||
main {
|
||||
@@ -103,11 +106,17 @@
|
||||
|
||||
.error-title {
|
||||
font-size: 2rem;
|
||||
border-left: 2px solid #ff0080;
|
||||
padding-left: 22px;
|
||||
line-height: 1.5;
|
||||
margin-bottom: 24px;
|
||||
font-weight: 500
|
||||
}
|
||||
|
||||
.error-title-guilty {
|
||||
border-left: 2px solid #ED367F;
|
||||
}
|
||||
|
||||
.error-title-innocent {
|
||||
border-left: 2px solid #59B89C;
|
||||
}
|
||||
|
||||
main p {
|
||||
@@ -222,11 +231,16 @@
|
||||
margin-left: .8rem
|
||||
}
|
||||
|
||||
.note {
|
||||
padding: 8pt 16pt;
|
||||
border-radius: 5px;
|
||||
border: 1px solid #0070f3;
|
||||
font-size: 14px;
|
||||
line-height: 1.8;
|
||||
color: #0070f3;
|
||||
}
|
||||
|
||||
@media (max-width:500px) {
|
||||
.devinfo-container .devinfo-line {
|
||||
display: flex;
|
||||
flex-direction: column
|
||||
}
|
||||
.devinfo-container .devinfo-line code {
|
||||
margin-top: .4rem
|
||||
}
|
||||
@@ -253,25 +267,18 @@
|
||||
font-size: 1.4rem;
|
||||
line-height: 1.55;
|
||||
}
|
||||
footer {
|
||||
display: none;
|
||||
}
|
||||
.note {
|
||||
margin-top: 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
{{=it.view}}
|
||||
<footer>
|
||||
<a href="https://vercel.com" target="_blank" rel="noopener noreferrer">Powered by
|
||||
<svg height="20" viewBox="0 0 131 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17.0669.0 34.1338 29.5211H0L17.0669.0z" fill="#000"></path>
|
||||
<path d="M73.6183 15.6831C73.6183 10.932 70.1127 7.61091 65.0849 7.61091 60.057 7.61091 56.5514 10.932 56.5514 15.6831 56.5514 20.3419 60.3338 23.7553 65.5461 23.7553 68.406 23.7553 70.9891 22.6944 72.6497 20.757L69.513 18.9581C68.5444 19.9268 67.1144 20.5264 65.5461 20.5264 63.2398 20.5264 61.2563 19.281 60.5644 17.3898L60.4261 17.0669H73.4799C73.5722 16.6056 73.6183 16.1444 73.6183 15.6831zM60.3799 14.2993 60.4722 14.0225C61.0718 12.0391 62.8246 10.8398 65.0387 10.8398 67.2989 10.8398 69.0056 12.0391 69.6053 14.0225L69.6975 14.2993H60.3799z" fill="#000"></path>
|
||||
<path d="M123.297 15.6831C123.297 10.932 119.791 7.61091 114.763 7.61091 109.736 7.61091 106.23 10.932 106.23 15.6831 106.23 20.3419 110.012 23.7553 115.225 23.7553 118.085 23.7553 120.668 22.6944 122.328 20.757L119.192 18.9581C118.223 19.9268 116.793 20.5264 115.225 20.5264 112.918 20.5264 110.935 19.281 110.243 17.3898L110.105 17.0669H123.158C123.251 16.6056 123.297 16.1444 123.297 15.6831zM110.058 14.2993 110.151 14.0225C110.75 12.0391 112.503 10.8398 114.717 10.8398 116.977 10.8398 118.684 12.0391 119.284 14.0225L119.376 14.2993H110.058z" fill="#000"></path>
|
||||
<path d="M101.156 13.0539 104.293 11.2549C102.817 8.94858 100.187 7.65703 97.0046 7.65703 91.9768 7.65703 88.4711 10.9782 88.4711 15.7292 88.4711 20.4803 91.9768 23.8014 97.0046 23.8014 100.187 23.8014 102.817 22.5098 104.293 20.2035L101.156 18.4046C100.326 19.7884 98.8497 20.5725 97.0046 20.5725 94.0986 20.5725 92.1613 18.6352 92.1613 15.7292 92.1613 12.8232 94.0986 10.8859 97.0046 10.8859 98.8035 10.8859 100.326 11.6701 101.156 13.0539z" fill="#000"></path>
|
||||
<path d="M130.216 2.5831H126.526V23.3401H130.216V2.5831z" fill="#000"></path>
|
||||
<path d="M59.2729 2.5831H55.0292L46.9109 16.6056 38.7926 2.5831H34.5028L46.9109 23.9859 59.2729 2.5831z" fill="#000"></path>
|
||||
<path d="M85.3806 11.9007C85.7958 11.9007 86.2109 11.9468 86.6261 12.0391V8.1183C83.4894 8.21056 80.5373 9.96338 80.5373 12.1313V8.1183H76.8472V23.3401H80.5373V16.744C80.5373 13.8841 82.5208 11.9007 85.3806 11.9007z" fill="#000"></path>
|
||||
</svg>
|
||||
</a>
|
||||
</footer>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
@@ -571,7 +571,7 @@ export class DeploymentNotFound extends NowError<
|
||||
super({
|
||||
code: 'DEPLOYMENT_NOT_FOUND',
|
||||
meta: { id, context },
|
||||
message: `Can't find the deployment ${id} under the context ${context}`,
|
||||
message: `Can't find the deployment "${id}" under the context "${context}"`,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
186
packages/cli/src/util/get-latest-version/get-latest-worker.js
Normal file
186
packages/cli/src/util/get-latest-version/get-latest-worker.js
Normal file
@@ -0,0 +1,186 @@
|
||||
/**
|
||||
* This file is spawned in the background and checks npm for the latest version
|
||||
* of the CLI, then writes the version to the cache file.
|
||||
*
|
||||
* NOTE: Since this file runs asynchronously in the background, it's possible
|
||||
* for multiple instances of this file to be running at the same time leading
|
||||
* to a race condition where the most recent instance will overwrite the
|
||||
* previous cache file resetting the `notified` flag and cause the update
|
||||
* notification to appear for multiple consequetive commands. Not the end of
|
||||
* the world, but something to be aware of.
|
||||
*/
|
||||
|
||||
const fetch = require('node-fetch');
|
||||
const fs = require('fs-extra');
|
||||
const path = require('path');
|
||||
const { Agent: HttpsAgent } = require('https');
|
||||
const { bold, gray, red } = require('chalk');
|
||||
const { format, inspect } = require('util');
|
||||
|
||||
/**
|
||||
* An simple output helper which accumulates error and debug log messages in
|
||||
* memory for potential persistance to disk while immediately outputting errors
|
||||
* and debug messages, when the `--debug` flag is set, to `stderr`.
|
||||
*/
|
||||
class WorkerOutput {
|
||||
debugLog = [];
|
||||
logFile = null;
|
||||
|
||||
constructor({ debug = true }) {
|
||||
this.debugOutputEnabled = debug;
|
||||
}
|
||||
|
||||
debug(...args) {
|
||||
this.print('debug', args);
|
||||
}
|
||||
|
||||
error(...args) {
|
||||
this.print('error', args);
|
||||
}
|
||||
|
||||
print(type, args) {
|
||||
const str = format(
|
||||
...args.map(s => (typeof s === 'string' ? s : inspect(s)))
|
||||
);
|
||||
this.debugLog.push(`[${new Date().toISOString()}] [${type}] ${str}`);
|
||||
if (type === 'debug' && this.debugOutputEnabled) {
|
||||
console.error(
|
||||
`${gray('>')} ${bold('[debug]')} ${gray(
|
||||
`[${new Date().toISOString()}]`
|
||||
)} ${str}`
|
||||
);
|
||||
} else if (type === 'error') {
|
||||
console.error(`${red(`Error:`)} ${str}`);
|
||||
}
|
||||
}
|
||||
|
||||
setLogFile(file) {
|
||||
// wire up the exit handler the first time the log file is set
|
||||
if (this.logFile === null) {
|
||||
process.on('exit', () => {
|
||||
if (this.debugLog.length) {
|
||||
fs.outputFileSync(this.logFile, this.debugLog.join('\n'));
|
||||
}
|
||||
});
|
||||
}
|
||||
this.logFile = file;
|
||||
}
|
||||
}
|
||||
|
||||
const output = new WorkerOutput({
|
||||
// enable the debug logging if the `--debug` is set or if this worker script
|
||||
// was directly executed
|
||||
debug: process.argv.includes('--debug') || !process.connected,
|
||||
});
|
||||
|
||||
process.on('unhandledRejection', err => {
|
||||
output.error('Exiting worker due to unhandled rejection:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
// this timer will prevent this worker process from running longer than 10s
|
||||
const timer = setTimeout(() => {
|
||||
output.error('Worker timed out after 10 seconds');
|
||||
process.exit(1);
|
||||
}, 10000);
|
||||
|
||||
// wait for the parent to give us the work payload
|
||||
process.once('message', async msg => {
|
||||
output.debug('Received message from parent:', msg);
|
||||
|
||||
output.debug('Disconnecting from parent');
|
||||
process.disconnect();
|
||||
|
||||
const { cacheFile, distTag, name, updateCheckInterval } = msg;
|
||||
const cacheFileParsed = path.parse(cacheFile);
|
||||
await fs.mkdirp(cacheFileParsed.dir);
|
||||
|
||||
output.setLogFile(
|
||||
path.join(cacheFileParsed.dir, `${cacheFileParsed.name}.log`)
|
||||
);
|
||||
|
||||
const lockFile = path.join(
|
||||
cacheFileParsed.dir,
|
||||
`${cacheFileParsed.name}.lock`
|
||||
);
|
||||
|
||||
try {
|
||||
// check for a lock file and either bail if running or write our pid and continue
|
||||
output.debug(`Checking lock file: ${lockFile}`);
|
||||
if (await isRunning(lockFile)) {
|
||||
output.debug('Worker already running, exiting');
|
||||
process.exit(1);
|
||||
}
|
||||
output.debug(`Initializing lock file with pid ${process.pid}`);
|
||||
await fs.writeFile(lockFile, String(process.pid), 'utf-8');
|
||||
|
||||
// fetch the latest version from npm
|
||||
const agent = new HttpsAgent({
|
||||
keepAlive: true,
|
||||
maxSockets: 15, // See: `npm config get maxsockets`
|
||||
});
|
||||
const headers = {
|
||||
accept:
|
||||
'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*',
|
||||
};
|
||||
const url = `https://registry.npmjs.org/${name}`;
|
||||
output.debug(`Fetching ${url}`);
|
||||
const res = await fetch(url, { agent, headers });
|
||||
const json = await res.json();
|
||||
const tags = json['dist-tags'];
|
||||
const version = tags[distTag];
|
||||
|
||||
if (version) {
|
||||
output.debug(`Found dist tag "${distTag}" with version "${version}"`);
|
||||
} else {
|
||||
output.error(`Dist tag "${distTag}" not found`);
|
||||
output.debug('Available dist tags:', Object.keys(tags));
|
||||
}
|
||||
|
||||
output.debug(`Writing cache file: ${cacheFile}`);
|
||||
await fs.outputJSON(cacheFile, {
|
||||
expireAt: Date.now() + updateCheckInterval,
|
||||
notified: false,
|
||||
version,
|
||||
});
|
||||
} catch (err) {
|
||||
output.error(`Failed to get package info:`, err);
|
||||
} finally {
|
||||
clearTimeout(timer);
|
||||
|
||||
output.debug(`Releasing lock file: ${lockFile}`);
|
||||
await fs.remove(lockFile);
|
||||
|
||||
output.debug(`Worker finished successfully!`);
|
||||
|
||||
// force the worker to exit
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
|
||||
// signal the parent process we're ready
|
||||
if (process.connected) {
|
||||
output.debug("Notifying parent we're ready");
|
||||
process.send({ type: 'ready' });
|
||||
} else {
|
||||
console.error('No IPC bridge detected, exiting');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
async function isRunning(lockFile) {
|
||||
try {
|
||||
const pid = parseInt(await fs.readFile(lockFile, 'utf-8'));
|
||||
output.debug(`Found lock file with pid: ${pid}`);
|
||||
|
||||
// checks for existence of a process; throws if not found
|
||||
process.kill(pid, 0);
|
||||
|
||||
// process is still running
|
||||
return true;
|
||||
} catch (err) {
|
||||
// lock file does not exist or process is not running and pid is stale
|
||||
output.debug(`Resetting lock file: ${err.toString()}`);
|
||||
await fs.remove(lockFile);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
151
packages/cli/src/util/get-latest-version/index.ts
Normal file
151
packages/cli/src/util/get-latest-version/index.ts
Normal file
@@ -0,0 +1,151 @@
|
||||
import semver from 'semver';
|
||||
import XDGAppPaths from 'xdg-app-paths';
|
||||
import { dirname, parse as parsePath, resolve as resolvePath } from 'path';
|
||||
import type { Output } from '../output';
|
||||
import { existsSync, outputJSONSync, readJSONSync } from 'fs-extra';
|
||||
import type { PackageJson } from '@vercel/build-utils';
|
||||
import { spawn } from 'child_process';
|
||||
|
||||
interface GetLatestVersionOptions {
|
||||
cacheDir?: string;
|
||||
distTag?: string;
|
||||
output?: Output;
|
||||
pkg: PackageJson;
|
||||
updateCheckInterval?: number;
|
||||
}
|
||||
|
||||
interface PackageInfoCache {
|
||||
version: string;
|
||||
expireAt: number;
|
||||
notified: boolean;
|
||||
}
|
||||
|
||||
interface GetLatestWorkerPayload {
|
||||
cacheFile?: string;
|
||||
distTag?: string;
|
||||
updateCheckInterval?: number;
|
||||
name?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if it needs to check for a newer CLI version and returns the last
|
||||
* detected version. The version could be stale, but still newer than the
|
||||
* current version.
|
||||
*
|
||||
* @returns {String|undefined} If a newer version is found, then the lastest
|
||||
* version, otherwise `undefined`.
|
||||
*/
|
||||
export default function getLatestVersion({
|
||||
cacheDir = XDGAppPaths('com.vercel.cli').cache(),
|
||||
distTag = 'latest',
|
||||
output,
|
||||
pkg,
|
||||
updateCheckInterval = 1000 * 60 * 60 * 24 * 7, // 1 week
|
||||
}: GetLatestVersionOptions): string | undefined {
|
||||
if (
|
||||
!pkg ||
|
||||
typeof pkg !== 'object' ||
|
||||
!pkg.name ||
|
||||
typeof pkg.name !== 'string'
|
||||
) {
|
||||
throw new TypeError('Expected package to be an object with a package name');
|
||||
}
|
||||
|
||||
const cacheFile = resolvePath(
|
||||
cacheDir,
|
||||
'package-updates',
|
||||
`${pkg.name}-${distTag}.json`
|
||||
);
|
||||
|
||||
let cache: PackageInfoCache | undefined;
|
||||
try {
|
||||
cache = readJSONSync(cacheFile);
|
||||
} catch (err: any) {
|
||||
// cache does not exist or malformed
|
||||
if (err.code !== 'ENOENT') {
|
||||
output?.debug(`Error reading latest package cache file: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (!cache || cache.expireAt < Date.now()) {
|
||||
spawnWorker(
|
||||
{
|
||||
cacheFile,
|
||||
distTag,
|
||||
updateCheckInterval,
|
||||
name: pkg.name,
|
||||
},
|
||||
output
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
cache &&
|
||||
!cache.notified &&
|
||||
pkg.version &&
|
||||
semver.lt(pkg.version, cache.version)
|
||||
) {
|
||||
cache.notified = true;
|
||||
outputJSONSync(cacheFile, cache);
|
||||
return cache.version;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Spawn the worker, wait for the worker to report it's ready, then signal the
|
||||
* worker to fetch the latest version.
|
||||
*/
|
||||
function spawnWorker(
|
||||
payload: GetLatestWorkerPayload,
|
||||
output: Output | undefined
|
||||
) {
|
||||
// we need to find the update worker script since the location is
|
||||
// different based on production vs tests
|
||||
let dir = dirname(__filename);
|
||||
let script = resolvePath(dir, 'dist', 'get-latest-worker.js');
|
||||
const { root } = parsePath(dir);
|
||||
while (!existsSync(script)) {
|
||||
dir = dirname(dir);
|
||||
if (dir === root) {
|
||||
// didn't find it, bail
|
||||
output?.debug('Failed to find the get latest worker script!');
|
||||
return;
|
||||
}
|
||||
script = resolvePath(dir, 'dist', 'get-latest-worker.js');
|
||||
}
|
||||
|
||||
// spawn the worker with an IPC channel
|
||||
output?.debug(`Spawning ${script}`);
|
||||
const args = [script];
|
||||
if (output?.debugEnabled) {
|
||||
args.push('--debug');
|
||||
}
|
||||
const worker = spawn(process.execPath, args, {
|
||||
stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
|
||||
windowsHide: true,
|
||||
});
|
||||
|
||||
// we allow the child 2 seconds to let us know it's ready before we give up
|
||||
const workerReadyTimer = setTimeout(() => worker.kill(), 2000);
|
||||
|
||||
// listen for an early on close error, but then we remove it when unref
|
||||
const onClose = (code: number) => {
|
||||
output?.debug(`Get latest worker exited (code ${code})`);
|
||||
};
|
||||
worker.on('close', onClose);
|
||||
|
||||
// generally, the parent won't be around long enough to handle a non-zero
|
||||
// worker process exit code
|
||||
worker.on('error', err => {
|
||||
output?.log(`Failed to spawn get latest worker: ${err.stack}`);
|
||||
});
|
||||
|
||||
// wait for the worker to start and notify us it is ready
|
||||
worker.once('message', () => {
|
||||
clearTimeout(workerReadyTimer);
|
||||
|
||||
worker.removeListener('close', onClose);
|
||||
worker.send(payload);
|
||||
worker.unref();
|
||||
});
|
||||
}
|
||||
@@ -259,7 +259,7 @@ export default class Now extends EventEmitter {
|
||||
const { key } = error;
|
||||
err.message =
|
||||
`The env key ${key} has an invalid type: ${typeof env[key]}. ` +
|
||||
'Please supply a String or a Number (https://err.sh/vercel-cli/env-value-invalid-type)';
|
||||
'Please supply a String or a Number (https://err.sh/vercel/env-value-invalid-type)';
|
||||
} else if (code === 'unreferenced_build_specifications') {
|
||||
const count = unreferencedBuildSpecs.length;
|
||||
const prefix = count === 1 ? 'build' : 'builds';
|
||||
|
||||
@@ -32,7 +32,11 @@ export async function ensureLink(
|
||||
cwd: string,
|
||||
opts: SetupAndLinkOptions
|
||||
): Promise<LinkResult | number> {
|
||||
let link = await getLinkedProject(client, cwd);
|
||||
let { link } = opts;
|
||||
if (!link) {
|
||||
link = await getLinkedProject(client, cwd);
|
||||
opts.link = link;
|
||||
}
|
||||
|
||||
if (
|
||||
(link.status === 'linked' && opts.forceDelete) ||
|
||||
|
||||
@@ -30,8 +30,9 @@ import Now, { CreateOptions } from '../index';
|
||||
import { isAPIError } from '../errors-ts';
|
||||
|
||||
export interface SetupAndLinkOptions {
|
||||
forceDelete?: boolean;
|
||||
autoConfirm?: boolean;
|
||||
forceDelete?: boolean;
|
||||
link?: ProjectLinkResult;
|
||||
successEmoji?: EmojiLabel;
|
||||
setupMsg?: string;
|
||||
projectName?: string;
|
||||
@@ -41,8 +42,9 @@ export default async function setupAndLink(
|
||||
client: Client,
|
||||
path: string,
|
||||
{
|
||||
forceDelete = false,
|
||||
autoConfirm = false,
|
||||
forceDelete = false,
|
||||
link,
|
||||
successEmoji = 'link',
|
||||
setupMsg = 'Set up',
|
||||
projectName,
|
||||
@@ -56,7 +58,9 @@ export default async function setupAndLink(
|
||||
output.error(`Expected directory but found file: ${path}`);
|
||||
return { status: 'error', exitCode: 1, reason: 'PATH_IS_FILE' };
|
||||
}
|
||||
const link = await getLinkedProject(client, path);
|
||||
if (!link) {
|
||||
link = await getLinkedProject(client, path);
|
||||
}
|
||||
const isTTY = client.stdin.isTTY;
|
||||
const quiet = !isTTY;
|
||||
let rootDirectory: string | null = null;
|
||||
|
||||
@@ -186,15 +186,14 @@ export async function getLinkedProject(
|
||||
})})\n`
|
||||
);
|
||||
return { status: 'error', exitCode: 1 };
|
||||
} else {
|
||||
output.print(
|
||||
prependEmoji(
|
||||
'Your Project was either deleted, transferred to a new Team, or you don’t have access to it anymore.\n',
|
||||
emoji('warning')
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
output.print(
|
||||
prependEmoji(
|
||||
'Your Project was either deleted, transferred to a new Team, or you don’t have access to it anymore.\n',
|
||||
emoji('warning')
|
||||
)
|
||||
);
|
||||
return { status: 'not_linked', org: null, project: null };
|
||||
}
|
||||
|
||||
|
||||
38
packages/cli/src/util/rollback/get-deployment-info.ts
Normal file
38
packages/cli/src/util/rollback/get-deployment-info.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import type Client from '../client';
|
||||
import type { Deployment } from '../../types';
|
||||
import getDeploymentByIdOrHost from '../deploy/get-deployment-by-id-or-host';
|
||||
import handleCertError from '../certs/handle-cert-error';
|
||||
|
||||
/**
|
||||
* Attempts to find the deployment by name or id.
|
||||
* @param {Client} client - The Vercel client instance
|
||||
* @param {string} contextName - The scope name
|
||||
* @param {string} deployId - The deployment name or id to rollback
|
||||
* @returns {Promise<Deployment>} Resolves an exit code or deployment info
|
||||
*/
|
||||
export default async function getDeploymentInfo(
|
||||
client: Client,
|
||||
contextName: string,
|
||||
deployId: string
|
||||
): Promise<Deployment> {
|
||||
const deployment = handleCertError(
|
||||
client.output,
|
||||
await getDeploymentByIdOrHost(client, contextName, deployId)
|
||||
);
|
||||
|
||||
if (deployment === 1) {
|
||||
throw new Error(
|
||||
`Failed to get deployment "${deployId}" in scope "${contextName}"`
|
||||
);
|
||||
}
|
||||
|
||||
if (deployment instanceof Error) {
|
||||
throw deployment;
|
||||
}
|
||||
|
||||
if (!deployment) {
|
||||
throw new Error(`Couldn't find the deployment "${deployId}"`);
|
||||
}
|
||||
|
||||
return deployment;
|
||||
}
|
||||
19
packages/cli/src/util/rollback/render-alias-status.ts
Normal file
19
packages/cli/src/util/rollback/render-alias-status.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
/**
|
||||
* Stylize the alias status label.
|
||||
* @param {AliasStatus} status - The status label
|
||||
* @returns {string}
|
||||
*/
|
||||
export default function renderAliasStatus(status: string): string {
|
||||
if (status === 'completed') {
|
||||
return chalk.green(status);
|
||||
}
|
||||
if (status === 'failed') {
|
||||
return chalk.red(status);
|
||||
}
|
||||
if (status === 'skipped') {
|
||||
return chalk.gray(status);
|
||||
}
|
||||
return chalk.yellow(status);
|
||||
}
|
||||
85
packages/cli/src/util/rollback/request-rollback.ts
Normal file
85
packages/cli/src/util/rollback/request-rollback.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
import chalk from 'chalk';
|
||||
import type Client from '../client';
|
||||
import { getCommandName } from '../pkg-name';
|
||||
import getDeploymentInfo from './get-deployment-info';
|
||||
import getScope from '../get-scope';
|
||||
import { isValidName } from '../is-valid-name';
|
||||
import ms from 'ms';
|
||||
import type { Project } from '../../types';
|
||||
import rollbackStatus from './status';
|
||||
|
||||
/**
|
||||
* Requests a rollback and waits for it complete.
|
||||
* @param {Client} client - The Vercel client instance
|
||||
* @param {string} deployId - The deployment name or id to rollback
|
||||
* @param {Project} project - Project info instance
|
||||
* @param {string} [timeout] - Time to poll for succeeded/failed state
|
||||
* @returns {Promise<number>} Resolves an exit code; 0 on success
|
||||
*/
|
||||
export default async function requestRollback({
|
||||
client,
|
||||
deployId,
|
||||
project,
|
||||
timeout,
|
||||
}: {
|
||||
client: Client;
|
||||
deployId: string;
|
||||
project: Project;
|
||||
timeout?: string;
|
||||
}): Promise<number> {
|
||||
const { output } = client;
|
||||
const { contextName } = await getScope(client);
|
||||
|
||||
if (!isValidName(deployId)) {
|
||||
output.error(
|
||||
`The provided argument "${deployId}" is not a valid deployment or project`
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
output.spinner(
|
||||
`Fetching deployment "${deployId}" in ${chalk.bold(contextName)}…`
|
||||
);
|
||||
|
||||
let deployment;
|
||||
try {
|
||||
deployment = await getDeploymentInfo(client, contextName, deployId);
|
||||
} catch (err: any) {
|
||||
output.error(err?.toString() || err);
|
||||
return 1;
|
||||
} finally {
|
||||
output.stopSpinner();
|
||||
// re-render the spinner text because it goes so fast
|
||||
output.log(
|
||||
`Fetching deployment "${deployId}" in ${chalk.bold(contextName)}…`
|
||||
);
|
||||
}
|
||||
|
||||
// create the rollback
|
||||
await client.fetch<any>(
|
||||
`/v9/projects/${project.id}/rollback/${deployment.uid}`,
|
||||
{
|
||||
body: {}, // required
|
||||
method: 'POST',
|
||||
}
|
||||
);
|
||||
|
||||
if (timeout !== undefined && ms(timeout) === 0) {
|
||||
output.log(
|
||||
`Successfully requested rollback of ${chalk.bold(project.name)} to ${
|
||||
deployment.url
|
||||
} (${deployment.uid})`
|
||||
);
|
||||
output.log(`To check rollback status, run ${getCommandName('rollback')}.`);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// check the status
|
||||
return await rollbackStatus({
|
||||
client,
|
||||
contextName,
|
||||
deployment,
|
||||
project,
|
||||
timeout,
|
||||
});
|
||||
}
|
||||
255
packages/cli/src/util/rollback/status.ts
Normal file
255
packages/cli/src/util/rollback/status.ts
Normal file
@@ -0,0 +1,255 @@
|
||||
import chalk from 'chalk';
|
||||
import type Client from '../client';
|
||||
import type {
|
||||
Deployment,
|
||||
PaginationOptions,
|
||||
Project,
|
||||
RollbackTarget,
|
||||
} from '../../types';
|
||||
import elapsed from '../output/elapsed';
|
||||
import formatDate from '../format-date';
|
||||
import getDeploymentInfo from './get-deployment-info';
|
||||
import getScope from '../get-scope';
|
||||
import ms from 'ms';
|
||||
import renderAliasStatus from './render-alias-status';
|
||||
import sleep from '../sleep';
|
||||
|
||||
interface RollbackAlias {
|
||||
alias: {
|
||||
alias: string;
|
||||
deploymentId: string;
|
||||
};
|
||||
id: string;
|
||||
status: 'completed' | 'in-progress' | 'pending' | 'failed';
|
||||
}
|
||||
|
||||
interface RollbackAliasesResponse {
|
||||
aliases: RollbackAlias[];
|
||||
pagination: PaginationOptions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Continuously checks a deployment status until it has succeeded, failed, or
|
||||
* taken longer than the timeout (default 3 minutes).
|
||||
* @param {Client} client - The Vercel client instance
|
||||
* @param {string} [contextName] - The scope name; if not specified, it will be
|
||||
* extracted from the `client`
|
||||
* @param {Deployment} [deployment] - Info about the deployment which is used
|
||||
* to display different output following a rollback request
|
||||
* @param {Project} project - Project info instance
|
||||
* @param {string} [timeout] - Milliseconds to poll for succeeded/failed state
|
||||
* @returns {Promise<number>} Resolves an exit code; 0 on success
|
||||
*/
|
||||
export default async function rollbackStatus({
|
||||
client,
|
||||
contextName,
|
||||
deployment,
|
||||
project,
|
||||
timeout = '3m',
|
||||
}: {
|
||||
client: Client;
|
||||
contextName?: string;
|
||||
deployment?: Deployment;
|
||||
project: Project;
|
||||
timeout?: string;
|
||||
}): Promise<number> {
|
||||
const { output } = client;
|
||||
const recentThreshold = Date.now() - ms('3m');
|
||||
const rollbackTimeout = Date.now() + ms(timeout);
|
||||
let counter = 0;
|
||||
let spinnerMessage = deployment
|
||||
? 'Rollback in progress'
|
||||
: `Checking rollback status of ${project.name}`;
|
||||
|
||||
const check = async () => {
|
||||
const { lastRollbackTarget } = await client.fetch<any>(
|
||||
`/v9/projects/${project.id}?rollbackInfo=true`
|
||||
);
|
||||
return lastRollbackTarget;
|
||||
};
|
||||
|
||||
if (!contextName) {
|
||||
({ contextName } = await getScope(client));
|
||||
}
|
||||
|
||||
try {
|
||||
output.spinner(`${spinnerMessage}…`);
|
||||
|
||||
// continuously loop until the rollback has explicitly succeeded, failed,
|
||||
// or timed out
|
||||
for (;;) {
|
||||
const { jobStatus, requestedAt, toDeploymentId }: RollbackTarget =
|
||||
(await check()) ?? {};
|
||||
|
||||
if (
|
||||
!jobStatus ||
|
||||
(jobStatus !== 'in-progress' && jobStatus !== 'pending')
|
||||
) {
|
||||
output.stopSpinner();
|
||||
output.log(`${spinnerMessage}…`);
|
||||
}
|
||||
|
||||
if (!jobStatus || requestedAt < recentThreshold) {
|
||||
output.log('No deployment rollback in progress');
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (jobStatus === 'skipped') {
|
||||
output.log('Rollback was skipped');
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (jobStatus === 'succeeded') {
|
||||
return await renderJobSucceeded({
|
||||
client,
|
||||
contextName,
|
||||
performingRollback: !!deployment,
|
||||
requestedAt,
|
||||
project,
|
||||
toDeploymentId,
|
||||
});
|
||||
}
|
||||
|
||||
if (jobStatus === 'failed') {
|
||||
return await renderJobFailed({
|
||||
client,
|
||||
contextName,
|
||||
deployment,
|
||||
project,
|
||||
toDeploymentId,
|
||||
});
|
||||
}
|
||||
|
||||
// lastly, if we're not pending/in-progress, then we don't know what
|
||||
// the status is, so bail
|
||||
if (jobStatus !== 'pending' && jobStatus !== 'in-progress') {
|
||||
output.log(`Unknown rollback status "${jobStatus}"`);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// check if we have been running for too long
|
||||
if (requestedAt < recentThreshold || Date.now() >= rollbackTimeout) {
|
||||
output.log(
|
||||
`The rollback exceeded its deadline - rerun ${chalk.bold(
|
||||
`vercel rollback ${toDeploymentId}`
|
||||
)} to try again`
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// if we've done our first poll and not rolling back, then print the
|
||||
// requested at date/time
|
||||
if (counter++ === 0 && !deployment) {
|
||||
spinnerMessage += ` requested at ${formatDate(requestedAt)}`;
|
||||
}
|
||||
output.spinner(`${spinnerMessage}…`);
|
||||
|
||||
await sleep(250);
|
||||
}
|
||||
} finally {
|
||||
output.stopSpinner();
|
||||
}
|
||||
}
|
||||
|
||||
async function renderJobFailed({
|
||||
client,
|
||||
contextName,
|
||||
deployment,
|
||||
project,
|
||||
toDeploymentId,
|
||||
}: {
|
||||
client: Client;
|
||||
contextName: string;
|
||||
deployment?: Deployment;
|
||||
project: Project;
|
||||
toDeploymentId: string;
|
||||
}) {
|
||||
const { output } = client;
|
||||
|
||||
try {
|
||||
const name = (
|
||||
deployment ||
|
||||
(await getDeploymentInfo(client, contextName, toDeploymentId))
|
||||
)?.url;
|
||||
output.error(
|
||||
`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`
|
||||
);
|
||||
} catch (e) {
|
||||
output.error(
|
||||
`Failed to remap all aliases to the requested deployment ${toDeploymentId}`
|
||||
);
|
||||
}
|
||||
|
||||
// aliases are paginated, so continuously loop until all of them have been
|
||||
// fetched
|
||||
let nextTimestamp;
|
||||
for (;;) {
|
||||
let url = `/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;
|
||||
if (nextTimestamp) {
|
||||
url += `&until=${nextTimestamp}`;
|
||||
}
|
||||
|
||||
const { aliases, pagination } = await client.fetch<RollbackAliasesResponse>(
|
||||
url
|
||||
);
|
||||
|
||||
for (const { alias, status } of aliases) {
|
||||
output.log(
|
||||
` ${renderAliasStatus(status).padEnd(11)} ${alias.alias} (${
|
||||
alias.deploymentId
|
||||
})`
|
||||
);
|
||||
}
|
||||
|
||||
if (pagination?.next) {
|
||||
nextTimestamp = pagination.next;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
async function renderJobSucceeded({
|
||||
client,
|
||||
contextName,
|
||||
performingRollback,
|
||||
project,
|
||||
requestedAt,
|
||||
toDeploymentId,
|
||||
}: {
|
||||
client: Client;
|
||||
contextName: string;
|
||||
performingRollback: boolean;
|
||||
project: Project;
|
||||
requestedAt: number;
|
||||
toDeploymentId: string;
|
||||
}) {
|
||||
const { output } = client;
|
||||
|
||||
let deploymentInfo = '';
|
||||
try {
|
||||
const deployment = await getDeploymentInfo(
|
||||
client,
|
||||
contextName,
|
||||
toDeploymentId
|
||||
);
|
||||
deploymentInfo = `${chalk.bold(deployment.url)} (${toDeploymentId})`;
|
||||
} catch (err: any) {
|
||||
output.debug(
|
||||
`Failed to get deployment url for ${toDeploymentId}: ${
|
||||
err?.toString() || err
|
||||
}`
|
||||
);
|
||||
deploymentInfo = chalk.bold(toDeploymentId);
|
||||
}
|
||||
|
||||
const duration = performingRollback ? elapsed(Date.now() - requestedAt) : '';
|
||||
output.log(
|
||||
`Success! ${chalk.bold(
|
||||
project.name
|
||||
)} was rolled back to ${deploymentInfo} ${duration}`
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
@@ -143,6 +143,7 @@ async function runNpmInstall(fixturePath) {
|
||||
await execa('yarn', ['install'], {
|
||||
cwd: fixturePath,
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
BIN
packages/cli/test/fixtures/unit/create-git-meta/not-dirty/git/index
generated
vendored
BIN
packages/cli/test/fixtures/unit/create-git-meta/not-dirty/git/index
generated
vendored
Binary file not shown.
3
packages/cli/test/fixtures/unit/vercel-rollback/.gitignore
vendored
Normal file
3
packages/cli/test/fixtures/unit/vercel-rollback/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
.next
|
||||
yarn.lock
|
||||
!.vercel
|
||||
4
packages/cli/test/fixtures/unit/vercel-rollback/.vercel/project.json
vendored
Normal file
4
packages/cli/test/fixtures/unit/vercel-rollback/.vercel/project.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"orgId": "team_dummy",
|
||||
"projectId": "vercel-rollback"
|
||||
}
|
||||
12
packages/cli/test/fixtures/unit/vercel-rollback/package.json
vendored
Normal file
12
packages/cli/test/fixtures/unit/vercel-rollback/package.json
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"scripts": {
|
||||
"build": "next build",
|
||||
"dev": "next",
|
||||
"now-build": "next build"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "^8.0.0",
|
||||
"react": "^16.7.0",
|
||||
"react-dom": "^16.7.0"
|
||||
}
|
||||
}
|
||||
11
packages/cli/test/fixtures/unit/vercel-rollback/pages/index.js
vendored
Normal file
11
packages/cli/test/fixtures/unit/vercel-rollback/pages/index.js
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
import { withRouter } from 'next/router';
|
||||
|
||||
function Index({ router }) {
|
||||
const data = {
|
||||
pathname: router.pathname,
|
||||
query: router.query,
|
||||
};
|
||||
return <div>{JSON.stringify(data)}</div>;
|
||||
}
|
||||
|
||||
export default withRouter(Index);
|
||||
10
packages/cli/test/fixtures/unit/vercel-rollback/vercel.json
vendored
Normal file
10
packages/cli/test/fixtures/unit/vercel-rollback/vercel.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "vercel-rollback",
|
||||
"routes": [
|
||||
{
|
||||
"src": "/(.*)",
|
||||
"dest": "/index?route-param=b"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -140,6 +140,51 @@ function setupDeploymentEndpoints() {
|
||||
res.json(deployment);
|
||||
});
|
||||
|
||||
client.scenario.get('/v5/now/deployments/:id', (req, res) => {
|
||||
const { id } = req.params;
|
||||
const { url } = req.query;
|
||||
let deployment;
|
||||
if (id === 'get') {
|
||||
if (typeof url !== 'string') {
|
||||
res.statusCode = 400;
|
||||
return res.json({ error: { code: 'bad_request' } });
|
||||
}
|
||||
deployment = Array.from(deployments.values()).find(d => {
|
||||
return d.url === url;
|
||||
});
|
||||
} else {
|
||||
// lookup by ID
|
||||
deployment = deployments.get(id);
|
||||
}
|
||||
if (!deployment) {
|
||||
res.statusCode = 404;
|
||||
return res.json({
|
||||
error: { code: 'not_found', message: 'Deployment not found', id },
|
||||
});
|
||||
}
|
||||
res.json({
|
||||
uid: deployment.id,
|
||||
url: deployment.url,
|
||||
name: '',
|
||||
type: 'LAMBDAS',
|
||||
state: 'READY',
|
||||
version: deployment.version,
|
||||
created: deployment.createdAt,
|
||||
ready: deployment.ready,
|
||||
buildingAt: deployment.buildingAt,
|
||||
creator: {
|
||||
uid: deployment.creator?.uid,
|
||||
username: deployment.creator?.username,
|
||||
},
|
||||
target: deployment.target,
|
||||
ownerId: undefined, // ?
|
||||
projectId: undefined, // ?
|
||||
inspectorUrl: deployment.inspectorUrl,
|
||||
meta: {},
|
||||
alias: deployment.alias,
|
||||
});
|
||||
});
|
||||
|
||||
client.scenario.get('/:version/deployments/:id/builds', (req, res) => {
|
||||
const { id } = req.params;
|
||||
const deployment = deployments.get(id);
|
||||
|
||||
@@ -23,36 +23,42 @@ export async function toOutput(
|
||||
return new Promise(resolve => {
|
||||
let output = '';
|
||||
let timeoutId = setTimeout(onTimeout, timeout);
|
||||
|
||||
const message = () => {
|
||||
const labelExpected = 'Expected output';
|
||||
const labelReceived = 'Received output';
|
||||
const printLabel = getLabelPrinter(labelExpected, labelReceived);
|
||||
const hint =
|
||||
matcherHint(matcherName, 'stream', 'test', matcherHintOptions) + '\n\n';
|
||||
return (
|
||||
hint +
|
||||
printLabel(labelExpected) +
|
||||
(isNot ? 'not ' : '') +
|
||||
printExpected(test) +
|
||||
'\n' +
|
||||
printLabel(labelReceived) +
|
||||
(isNot ? ' ' : '') +
|
||||
printReceived(output)
|
||||
);
|
||||
};
|
||||
const hint =
|
||||
matcherHint(matcherName, 'stream', 'test', matcherHintOptions) + '\n\n';
|
||||
|
||||
function onData(data: string) {
|
||||
output += data;
|
||||
if (output.includes(test)) {
|
||||
cleanup();
|
||||
resolve({ pass: true, message });
|
||||
resolve({
|
||||
pass: true,
|
||||
message() {
|
||||
const labelExpected = 'Expected output';
|
||||
const labelReceived = 'Received output';
|
||||
const printLabel = getLabelPrinter(labelExpected, labelReceived);
|
||||
return (
|
||||
hint +
|
||||
printLabel(labelExpected) +
|
||||
(isNot ? 'not ' : '') +
|
||||
printExpected(test) +
|
||||
'\n' +
|
||||
printLabel(labelReceived) +
|
||||
(isNot ? ' ' : '') +
|
||||
printReceived(output)
|
||||
);
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function onTimeout() {
|
||||
cleanup();
|
||||
resolve({ pass: false, message });
|
||||
resolve({
|
||||
pass: false,
|
||||
message() {
|
||||
return `${hint}Timed out waiting ${timeout} ms for output`;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function cleanup() {
|
||||
|
||||
@@ -130,6 +130,7 @@ export const defaultProject = {
|
||||
userId: 'K4amb7K9dAt5R2vBJWF32bmY',
|
||||
},
|
||||
],
|
||||
lastRollbackTarget: null,
|
||||
alias: [
|
||||
{
|
||||
domain: 'foobar.com',
|
||||
|
||||
372
packages/cli/test/unit/commands/rollback.test.ts
Normal file
372
packages/cli/test/unit/commands/rollback.test.ts
Normal file
@@ -0,0 +1,372 @@
|
||||
import chalk from 'chalk';
|
||||
import { client } from '../../mocks/client';
|
||||
import { defaultProject, useProject } from '../../mocks/project';
|
||||
import { Request, Response } from 'express';
|
||||
import rollback from '../../../src/commands/rollback';
|
||||
import { RollbackJobStatus, RollbackTarget } from '../../../src/types';
|
||||
import { setupFixture } from '../../helpers/setup-fixture';
|
||||
import { useDeployment } from '../../mocks/deployment';
|
||||
import { useTeams } from '../../mocks/team';
|
||||
import { useUser } from '../../mocks/user';
|
||||
import sleep from '../../../src/util/sleep';
|
||||
|
||||
jest.setTimeout(60000);
|
||||
|
||||
describe('rollback', () => {
|
||||
it('should error if cwd is invalid', async () => {
|
||||
client.setArgv('rollback', '--cwd', __filename);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput(
|
||||
'Error: Support for single file deployments has been removed.'
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(1);
|
||||
});
|
||||
|
||||
it('should error if timeout is invalid', async () => {
|
||||
const { cwd } = initRollbackTest();
|
||||
client.setArgv('rollback', '--yes', '--cwd', cwd, '--timeout', 'foo');
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Error: Invalid timeout "foo"');
|
||||
await expect(exitCodePromise).resolves.toEqual(1);
|
||||
});
|
||||
|
||||
it('should error if invalid deployment name', async () => {
|
||||
const { cwd } = initRollbackTest();
|
||||
client.setArgv('rollback', '????', '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
'Error: The provided argument "????" is not a valid deployment or project'
|
||||
);
|
||||
await expect(exitCodePromise).resolves.toEqual(1);
|
||||
});
|
||||
|
||||
it('should error if deployment not found', async () => {
|
||||
const { cwd } = initRollbackTest();
|
||||
client.setArgv('rollback', 'foo', '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput('Fetching deployment "foo" in ');
|
||||
await expect(client.stderr).toOutput(
|
||||
'Error: Error: Can\'t find the deployment "foo" under the context'
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(1);
|
||||
});
|
||||
|
||||
it('should show status when not rolling back', async () => {
|
||||
const { cwd } = initRollbackTest();
|
||||
client.setArgv('rollback', '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
'Checking rollback status of vercel-rollback'
|
||||
);
|
||||
await expect(client.stderr).toOutput('No deployment rollback in progress');
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(0);
|
||||
});
|
||||
|
||||
it('should rollback by deployment id', async () => {
|
||||
const { cwd, previousDeployment } = initRollbackTest();
|
||||
client.setArgv('rollback', previousDeployment.id, '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Fetching deployment "${previousDeployment.id}" in ${previousDeployment.creator?.username}`
|
||||
);
|
||||
await expect(client.stderr).toOutput('Rollback in progress');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Success! ${chalk.bold('vercel-rollback')} was rolled back to ${
|
||||
previousDeployment.url
|
||||
} (${previousDeployment.id})`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(0);
|
||||
});
|
||||
|
||||
it('should rollback by deployment url', async () => {
|
||||
const { cwd, previousDeployment } = initRollbackTest();
|
||||
client.setArgv('rollback', previousDeployment.url, '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Fetching deployment "${previousDeployment.url}" in ${previousDeployment.creator?.username}`
|
||||
);
|
||||
await expect(client.stderr).toOutput('Rollback in progress');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Success! ${chalk.bold('vercel-rollback')} was rolled back to ${
|
||||
previousDeployment.url
|
||||
} (${previousDeployment.id})`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(0);
|
||||
});
|
||||
|
||||
it('should get status while rolling back', async () => {
|
||||
const { cwd, previousDeployment, project } = initRollbackTest({
|
||||
rollbackPollCount: 10,
|
||||
});
|
||||
|
||||
// start the rollback
|
||||
client.setArgv('rollback', previousDeployment.id, '--yes', '--cwd', cwd);
|
||||
rollback(client);
|
||||
|
||||
// need to wait for the rollback request to be accepted
|
||||
await sleep(500);
|
||||
|
||||
// get the status
|
||||
client.setArgv('rollback', '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Checking rollback status of ${project.name}`
|
||||
);
|
||||
await expect(client.stderr).toOutput(
|
||||
`Success! ${chalk.bold('vercel-rollback')} was rolled back to ${
|
||||
previousDeployment.url
|
||||
} (${previousDeployment.id})`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(0);
|
||||
});
|
||||
|
||||
it('should error if rollback request fails', async () => {
|
||||
const { cwd, previousDeployment } = initRollbackTest({
|
||||
rollbackPollCount: 10,
|
||||
rollbackStatusCode: 500,
|
||||
});
|
||||
|
||||
client.setArgv('rollback', previousDeployment.id, '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Fetching deployment "${previousDeployment.id}" in ${previousDeployment.creator?.username}`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).rejects.toThrow('Response Error (500)');
|
||||
});
|
||||
|
||||
it('should error if rollback fails (no aliases)', async () => {
|
||||
const { cwd, previousDeployment } = initRollbackTest({
|
||||
rollbackJobStatus: 'failed',
|
||||
});
|
||||
client.setArgv('rollback', previousDeployment.id, '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Fetching deployment "${previousDeployment.id}" in ${previousDeployment.creator?.username}`
|
||||
);
|
||||
await expect(client.stderr).toOutput('Rollback in progress');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Error: Failed to remap all aliases to the requested deployment ${previousDeployment.url} (${previousDeployment.id})`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(1);
|
||||
});
|
||||
|
||||
it('should error if rollback fails (with aliases)', async () => {
|
||||
const { cwd, previousDeployment } = initRollbackTest({
|
||||
rollbackAliases: [
|
||||
{
|
||||
alias: { alias: 'foo', deploymentId: 'foo_123' },
|
||||
status: 'completed',
|
||||
},
|
||||
{
|
||||
alias: { alias: 'bar', deploymentId: 'bar_123' },
|
||||
status: 'failed',
|
||||
},
|
||||
],
|
||||
rollbackJobStatus: 'failed',
|
||||
});
|
||||
client.setArgv('rollback', previousDeployment.id, '--yes', '--cwd', cwd);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Fetching deployment "${previousDeployment.id}" in ${previousDeployment.creator?.username}`
|
||||
);
|
||||
await expect(client.stderr).toOutput('Rollback in progress');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Error: Failed to remap all aliases to the requested deployment ${previousDeployment.url} (${previousDeployment.id})`
|
||||
);
|
||||
await expect(client.stderr).toOutput(
|
||||
` ${chalk.green('completed')} foo (foo_123)`
|
||||
);
|
||||
await expect(client.stderr).toOutput(
|
||||
` ${chalk.red('failed')} bar (bar_123)`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(1);
|
||||
});
|
||||
|
||||
it('should error if deployment times out', async () => {
|
||||
const { cwd, previousDeployment } = initRollbackTest({
|
||||
rollbackPollCount: 10,
|
||||
});
|
||||
client.setArgv(
|
||||
'rollback',
|
||||
previousDeployment.id,
|
||||
'--yes',
|
||||
'--cwd',
|
||||
cwd,
|
||||
'--timeout',
|
||||
'2s'
|
||||
);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Fetching deployment "${previousDeployment.id}" in ${previousDeployment.creator?.username}`
|
||||
);
|
||||
await expect(client.stderr).toOutput('Rollback in progress');
|
||||
await expect(client.stderr).toOutput(
|
||||
`The rollback exceeded its deadline - rerun ${chalk.bold(
|
||||
`vercel rollback ${previousDeployment.id}`
|
||||
)} to try again`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(1);
|
||||
});
|
||||
|
||||
it('should immediately exit after requesting rollback', async () => {
|
||||
const { cwd, previousDeployment } = initRollbackTest();
|
||||
client.setArgv(
|
||||
'rollback',
|
||||
previousDeployment.id,
|
||||
'--yes',
|
||||
'--cwd',
|
||||
cwd,
|
||||
'--timeout',
|
||||
'0'
|
||||
);
|
||||
const exitCodePromise = rollback(client);
|
||||
|
||||
await expect(client.stderr).toOutput('Retrieving project…');
|
||||
await expect(client.stderr).toOutput(
|
||||
`Fetching deployment "${previousDeployment.id}" in ${previousDeployment.creator?.username}`
|
||||
);
|
||||
await expect(client.stderr).toOutput(
|
||||
`Successfully requested rollback of ${chalk.bold('vercel-rollback')} to ${
|
||||
previousDeployment.url
|
||||
} (${previousDeployment.id})`
|
||||
);
|
||||
|
||||
await expect(exitCodePromise).resolves.toEqual(0);
|
||||
});
|
||||
});
|
||||
|
||||
type RollbackAlias = {
|
||||
alias: {
|
||||
alias: string;
|
||||
deploymentId: string;
|
||||
};
|
||||
status: string;
|
||||
};
|
||||
|
||||
function initRollbackTest({
|
||||
rollbackAliases = [],
|
||||
rollbackJobStatus = 'succeeded',
|
||||
rollbackPollCount = 2,
|
||||
rollbackStatusCode,
|
||||
}: {
|
||||
rollbackAliases?: RollbackAlias[];
|
||||
rollbackJobStatus?: RollbackJobStatus;
|
||||
rollbackPollCount?: number;
|
||||
rollbackStatusCode?: number;
|
||||
} = {}) {
|
||||
const cwd = setupFixture('vercel-rollback');
|
||||
const user = useUser();
|
||||
useTeams('team_dummy');
|
||||
const { project } = useProject({
|
||||
...defaultProject,
|
||||
id: 'vercel-rollback',
|
||||
name: 'vercel-rollback',
|
||||
});
|
||||
|
||||
const currentDeployment = useDeployment({ creator: user });
|
||||
const previousDeployment = useDeployment({ creator: user });
|
||||
let lastRollbackTarget: RollbackTarget | null = null;
|
||||
|
||||
client.scenario.post(
|
||||
'/:version/projects/:project/rollback/:id',
|
||||
(req: Request, res: Response) => {
|
||||
const { id } = req.params;
|
||||
if (previousDeployment.id !== id) {
|
||||
res.statusCode = 404;
|
||||
res.json({
|
||||
error: { code: 'not_found', message: 'Deployment not found', id },
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (rollbackStatusCode === 500) {
|
||||
res.statusCode = 500;
|
||||
res.end('Server error');
|
||||
return;
|
||||
}
|
||||
|
||||
lastRollbackTarget = {
|
||||
fromDeploymentId: currentDeployment.id,
|
||||
jobStatus: 'in-progress',
|
||||
requestedAt: Date.now(),
|
||||
toDeploymentId: id,
|
||||
};
|
||||
res.statusCode = 201;
|
||||
res.end();
|
||||
}
|
||||
);
|
||||
|
||||
let counter = 0;
|
||||
|
||||
client.scenario.get(`/v9/projects/${project.id}`, (req, res) => {
|
||||
const data = { ...project };
|
||||
if (req.query?.rollbackInfo === 'true') {
|
||||
if (lastRollbackTarget && counter++ > rollbackPollCount) {
|
||||
lastRollbackTarget.jobStatus = rollbackJobStatus;
|
||||
}
|
||||
data.lastRollbackTarget = lastRollbackTarget;
|
||||
}
|
||||
res.json(data);
|
||||
});
|
||||
|
||||
client.scenario.get(`/:version/now/deployments/get`, (req, res) => {
|
||||
const { url } = req.query;
|
||||
if (url === previousDeployment.url) {
|
||||
res.json({ id: previousDeployment.id });
|
||||
} else {
|
||||
res.statusCode = 404;
|
||||
res.json({
|
||||
error: { code: 'not_found', message: 'Deployment not found' },
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
client.scenario.get(
|
||||
'/:version/projects/:project/rollback/aliases',
|
||||
(req, res) => {
|
||||
res.json({
|
||||
aliases: rollbackAliases,
|
||||
pagination: null,
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
return {
|
||||
cwd,
|
||||
project,
|
||||
currentDeployment,
|
||||
previousDeployment,
|
||||
};
|
||||
}
|
||||
140
packages/cli/test/unit/util/get-latest-version.test.ts
Normal file
140
packages/cli/test/unit/util/get-latest-version.test.ts
Normal file
@@ -0,0 +1,140 @@
|
||||
import fs from 'fs-extra';
|
||||
import sleep from '../../../src/util/sleep';
|
||||
import tmp from 'tmp-promise';
|
||||
import getLatestVersion from '../../../src/util/get-latest-version';
|
||||
import { join } from 'path';
|
||||
|
||||
tmp.setGracefulCleanup();
|
||||
|
||||
const cacheDir = tmp.tmpNameSync({
|
||||
prefix: 'test-vercel-cli-get-latest-version-',
|
||||
});
|
||||
|
||||
const cacheFile = join(cacheDir, 'package-updates', 'vercel-latest.json');
|
||||
|
||||
const pkg = {
|
||||
name: 'vercel',
|
||||
version: '27.3.0',
|
||||
};
|
||||
|
||||
const versionRE = /^\d+\.\d+\.\d+$/;
|
||||
|
||||
describe('get latest version', () => {
|
||||
afterEach(() => fs.remove(cacheDir));
|
||||
|
||||
it('should find newer version async', async () => {
|
||||
// 1. first call, no cache file
|
||||
let latest = getLatestVersion({
|
||||
cacheDir,
|
||||
pkg,
|
||||
});
|
||||
expect(latest).toEqual(undefined);
|
||||
|
||||
await waitForCacheFile();
|
||||
|
||||
let cache = await fs.readJSON(cacheFile);
|
||||
expect(typeof cache).toEqual('object');
|
||||
expect(typeof cache.expireAt).toEqual('number');
|
||||
expect(cache.expireAt).toBeGreaterThan(Date.now());
|
||||
expect(typeof cache.version).toEqual('string');
|
||||
expect(cache.version).toEqual(expect.stringMatching(versionRE));
|
||||
expect(cache.notified).toEqual(false);
|
||||
|
||||
// 2. call again and this time it'll return the version from the cache
|
||||
latest = getLatestVersion({
|
||||
cacheDir,
|
||||
pkg,
|
||||
});
|
||||
expect(typeof latest).toBe('string');
|
||||
expect(latest).toEqual(expect.stringMatching(versionRE));
|
||||
|
||||
cache = await fs.readJSON(cacheFile);
|
||||
expect(cache.version).toEqual(expect.stringMatching(versionRE));
|
||||
expect(cache.notified).toEqual(true);
|
||||
|
||||
// 3. notification already done, should skip
|
||||
latest = getLatestVersion({
|
||||
cacheDir,
|
||||
pkg,
|
||||
});
|
||||
expect(latest).toEqual(undefined);
|
||||
});
|
||||
|
||||
it('should not find a newer version', async () => {
|
||||
// 1. first call, no cache file
|
||||
let latest = getLatestVersion({
|
||||
cacheDir,
|
||||
updateCheckInterval: 1,
|
||||
pkg: {
|
||||
...pkg,
|
||||
version: '999.0.0',
|
||||
},
|
||||
});
|
||||
expect(latest).toEqual(undefined);
|
||||
|
||||
await waitForCacheFile();
|
||||
|
||||
// 2. call again and should recheck and still not find a new version
|
||||
latest = getLatestVersion({
|
||||
cacheDir,
|
||||
updateCheckInterval: 1,
|
||||
pkg: {
|
||||
...pkg,
|
||||
version: '999.0.0',
|
||||
},
|
||||
});
|
||||
expect(latest).toEqual(undefined);
|
||||
});
|
||||
|
||||
it('should not check twice', async () => {
|
||||
// 1. first call, no cache file
|
||||
let latest = getLatestVersion({
|
||||
cacheDir,
|
||||
updateCheckInterval: 1,
|
||||
pkg,
|
||||
});
|
||||
expect(latest).toEqual(undefined);
|
||||
|
||||
// 2. immediately call again, but should hopefully still be undefined
|
||||
latest = getLatestVersion({
|
||||
cacheDir,
|
||||
updateCheckInterval: 1,
|
||||
pkg,
|
||||
});
|
||||
expect(latest).toEqual(undefined);
|
||||
|
||||
await waitForCacheFile();
|
||||
|
||||
// 3. call again and should recheck and find a new version
|
||||
latest = getLatestVersion({
|
||||
cacheDir,
|
||||
updateCheckInterval: 1,
|
||||
pkg,
|
||||
});
|
||||
expect(typeof latest).toBe('string');
|
||||
expect(latest).toEqual(expect.stringMatching(versionRE));
|
||||
});
|
||||
|
||||
it('should error if no arguments are passed in', () => {
|
||||
expect(() => getLatestVersion(undefined as any)).toThrow(TypeError);
|
||||
});
|
||||
|
||||
it('should error package is invalid', () => {
|
||||
expect(() => getLatestVersion({} as any)).toThrow(TypeError);
|
||||
expect(() => getLatestVersion({ pkg: null as any })).toThrow(TypeError);
|
||||
expect(() => getLatestVersion({ pkg: {} })).toThrow(TypeError);
|
||||
expect(() => getLatestVersion({ pkg: { name: null as any } })).toThrow(
|
||||
TypeError
|
||||
);
|
||||
expect(() => getLatestVersion({ pkg: { name: '' } })).toThrow(TypeError);
|
||||
});
|
||||
});
|
||||
|
||||
async function waitForCacheFile() {
|
||||
for (let i = 0; i < 20; i++) {
|
||||
await sleep(100);
|
||||
if (await fs.pathExists(cacheFile)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/client",
|
||||
"version": "12.2.19",
|
||||
"version": "12.2.21",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"homepage": "https://vercel.com",
|
||||
@@ -43,7 +43,7 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "5.5.9",
|
||||
"@vercel/build-utils": "5.7.0",
|
||||
"@vercel/routing-utils": "2.1.3",
|
||||
"@zeit/fetch": "5.2.0",
|
||||
"async-retry": "1.2.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/frameworks",
|
||||
"version": "1.1.12",
|
||||
"version": "1.1.14",
|
||||
"main": "./dist/frameworks.js",
|
||||
"types": "./dist/frameworks.d.ts",
|
||||
"files": [
|
||||
|
||||
@@ -18,22 +18,20 @@ const { readdir, readFile, unlink } = promises;
|
||||
|
||||
export const frameworks = [
|
||||
{
|
||||
name: 'Blitz.js',
|
||||
name: 'Blitz.js (Legacy)',
|
||||
slug: 'blitzjs',
|
||||
demo: 'https://blitz-template.vercel.app',
|
||||
logo: 'https://api-frameworks.vercel.sh/framework-logos/blitz.svg',
|
||||
tagline: 'Blitz.js: The Fullstack React Framework',
|
||||
description:
|
||||
'A brand new Blitz.js app - the result of running `npx blitz new`.',
|
||||
'A brand new Blitz.js app - the result of running `npx blitz@0.45.4 new`.',
|
||||
website: 'https://blitzjs.com',
|
||||
envPrefix: 'NEXT_PUBLIC_',
|
||||
useRuntime: { src: 'package.json', use: '@vercel/next' },
|
||||
detectors: {
|
||||
every: [
|
||||
{
|
||||
path: 'package.json',
|
||||
matchContent:
|
||||
'"(dev)?(d|D)ependencies":\\s*{[^}]*"blitz":\\s*".+?"[^}]*}',
|
||||
path: 'blitz.config.(js|ts)',
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -269,17 +267,10 @@ export const frameworks = [
|
||||
getOutputDirName: async () => 'dist',
|
||||
defaultRoutes: [
|
||||
{
|
||||
src: '^/dist/(.*)$',
|
||||
src: '^/assets/(.*)$',
|
||||
headers: { 'cache-control': 'public, max-age=31536000, immutable' },
|
||||
continue: true,
|
||||
},
|
||||
{
|
||||
handle: 'filesystem',
|
||||
},
|
||||
{
|
||||
src: '/(.*)',
|
||||
dest: '/index.html',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -1728,6 +1719,74 @@ export const frameworks = [
|
||||
dependency: 'vite',
|
||||
getOutputDirName: async () => 'dist',
|
||||
},
|
||||
{
|
||||
name: 'VitePress',
|
||||
slug: 'vitepress',
|
||||
demo: 'https://vitepress-starter-template.vercel.app/',
|
||||
logo: 'https://api-frameworks.vercel.sh/framework-logos/vite.svg',
|
||||
tagline: "VitePress is VuePress' little brother, built on top of Vite.",
|
||||
description: 'VuePress on top of Vite',
|
||||
website: 'https://vitepress.vuejs.org/',
|
||||
detectors: {
|
||||
every: [
|
||||
{
|
||||
path: 'package.json',
|
||||
matchContent:
|
||||
'"(dev)?(d|D)ependencies":\\s*{[^}]*vitepress:\\s*".+?"[^}]*}',
|
||||
},
|
||||
],
|
||||
},
|
||||
settings: {
|
||||
installCommand: {
|
||||
placeholder: '`yarn install`, `pnpm install`, or `npm install`',
|
||||
},
|
||||
buildCommand: {
|
||||
placeholder: '`npm run build` or `vitepress build docs`',
|
||||
value: 'vitepress build docs',
|
||||
},
|
||||
devCommand: {
|
||||
value: 'vitepress dev docs --port $PORT',
|
||||
},
|
||||
outputDirectory: {
|
||||
value: 'docs/.vitepress/dist',
|
||||
},
|
||||
},
|
||||
getOutputDirName: async () => '.vitepress/dist',
|
||||
},
|
||||
{
|
||||
name: 'VuePress',
|
||||
slug: 'vuepress',
|
||||
demo: 'https://vuepress-starter-template.vercel.app',
|
||||
logo: 'https://api-frameworks.vercel.sh/framework-logos/vuepress.png',
|
||||
tagline: 'Vue-powered Static Site Generator',
|
||||
description: 'Vue-powered Static Site Generator',
|
||||
website: 'https://vuepress.vuejs.org/',
|
||||
detectors: {
|
||||
every: [
|
||||
{
|
||||
path: 'package.json',
|
||||
matchContent:
|
||||
'"(dev)?(d|D)ependencies":\\s*{[^}]*vuepress:\\s*".+?"[^}]*}',
|
||||
},
|
||||
],
|
||||
},
|
||||
settings: {
|
||||
installCommand: {
|
||||
placeholder: '`yarn install`, `pnpm install`, or `npm install`',
|
||||
},
|
||||
buildCommand: {
|
||||
placeholder: '`npm run build` or `vuepress build src`',
|
||||
value: 'vuepress build src',
|
||||
},
|
||||
devCommand: {
|
||||
value: 'vuepress dev src --port $PORT',
|
||||
},
|
||||
outputDirectory: {
|
||||
value: 'src/.vuepress/dist',
|
||||
},
|
||||
},
|
||||
getOutputDirName: async () => 'src/.vuepress/dist',
|
||||
},
|
||||
{
|
||||
name: 'Parcel',
|
||||
slug: 'parcel',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/fs-detectors",
|
||||
"version": "3.5.2",
|
||||
"version": "3.5.4",
|
||||
"description": "Vercel filesystem detectors",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -20,7 +20,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/error-utils": "1.0.3",
|
||||
"@vercel/frameworks": "1.1.12",
|
||||
"@vercel/frameworks": "1.1.14",
|
||||
"@vercel/routing-utils": "2.1.3",
|
||||
"glob": "8.0.3",
|
||||
"js-yaml": "4.1.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/go",
|
||||
"version": "2.2.17",
|
||||
"version": "2.2.19",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/go",
|
||||
@@ -35,7 +35,7 @@
|
||||
"@types/jest": "28.1.6",
|
||||
"@types/node-fetch": "^2.3.0",
|
||||
"@types/tar": "^4.0.0",
|
||||
"@vercel/build-utils": "5.5.9",
|
||||
"@vercel/build-utils": "5.7.0",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"async-retry": "1.3.1",
|
||||
"execa": "^1.0.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/hydrogen",
|
||||
"version": "0.0.31",
|
||||
"version": "0.0.33",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -21,7 +21,7 @@
|
||||
"devDependencies": {
|
||||
"@types/jest": "27.5.1",
|
||||
"@types/node": "14.18.33",
|
||||
"@vercel/build-utils": "5.5.9",
|
||||
"@vercel/build-utils": "5.7.0",
|
||||
"@vercel/static-config": "2.0.6",
|
||||
"typescript": "4.6.4"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/next",
|
||||
"version": "3.2.13",
|
||||
"version": "3.3.2",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
|
||||
@@ -34,6 +34,7 @@
|
||||
"devDependencies": {
|
||||
"@types/aws-lambda": "8.10.19",
|
||||
"@types/buffer-crc32": "0.2.0",
|
||||
"@types/bytes": "3.1.1",
|
||||
"@types/convert-source-map": "1.5.2",
|
||||
"@types/find-up": "4.0.0",
|
||||
"@types/fs-extra": "8.0.0",
|
||||
@@ -44,11 +45,12 @@
|
||||
"@types/semver": "6.0.0",
|
||||
"@types/text-table": "0.2.1",
|
||||
"@types/webpack-sources": "3.2.0",
|
||||
"@vercel/build-utils": "5.5.9",
|
||||
"@vercel/build-utils": "5.7.0",
|
||||
"@vercel/nft": "0.22.1",
|
||||
"@vercel/routing-utils": "2.1.3",
|
||||
"async-sema": "3.0.1",
|
||||
"buffer-crc32": "0.2.13",
|
||||
"bytes": "3.1.2",
|
||||
"cheerio": "1.0.0-rc.10",
|
||||
"convert-source-map": "1.8.0",
|
||||
"esbuild": "0.12.22",
|
||||
|
||||
@@ -4,4 +4,4 @@ const MIB = 1024 * KIB;
|
||||
/**
|
||||
* The maximum size of a *compressed* edge function.
|
||||
*/
|
||||
export const EDGE_FUNCTION_SIZE_LIMIT = MIB;
|
||||
export const EDGE_FUNCTION_SIZE_LIMIT = 4 * MIB;
|
||||
|
||||
@@ -6,7 +6,7 @@ import { join } from 'path';
|
||||
import { EDGE_FUNCTION_SIZE_LIMIT } from './constants';
|
||||
import zlib from 'zlib';
|
||||
import { promisify } from 'util';
|
||||
import bytes from 'pretty-bytes';
|
||||
import { prettyBytes } from '../utils';
|
||||
|
||||
// @ts-expect-error this is a prebuilt file, based on `../../scripts/build-edge-function-template.js`
|
||||
import template from '../../dist/___get-nextjs-edge-function.js';
|
||||
@@ -44,7 +44,9 @@ export async function getNextjsEdgeFunctionSource(
|
||||
* We validate at this point because we want to verify against user code.
|
||||
* It should not count the Worker wrapper nor the Next.js wrapper.
|
||||
*/
|
||||
const wasmFiles = (wasm ?? []).map(({ filePath }) => join(outputDir, filePath));
|
||||
const wasmFiles = (wasm ?? []).map(({ filePath }) =>
|
||||
join(outputDir, filePath)
|
||||
);
|
||||
await validateSize(text, wasmFiles);
|
||||
|
||||
// Wrap to fake module.exports
|
||||
@@ -83,9 +85,9 @@ async function validateSize(script: string, wasmFiles: string[]) {
|
||||
const gzipped = await gzip(content);
|
||||
if (gzipped.length > EDGE_FUNCTION_SIZE_LIMIT) {
|
||||
throw new Error(
|
||||
`Exceeds maximum edge function size: ${bytes(
|
||||
`Exceeds maximum edge function size: ${prettyBytes(
|
||||
gzipped.length
|
||||
)} / ${bytes(EDGE_FUNCTION_SIZE_LIMIT)}`
|
||||
)} / ${prettyBytes(EDGE_FUNCTION_SIZE_LIMIT)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1072,6 +1072,7 @@ export const build: BuildV2 = async ({
|
||||
handler: '___next_launcher.cjs',
|
||||
runtime: nodeVersion.runtime,
|
||||
...lambdaOptions,
|
||||
operationType: 'SSR',
|
||||
shouldAddHelpers: false,
|
||||
shouldAddSourcemapSupport: false,
|
||||
supportsMultiPayloads: !!process.env.NEXT_PRIVATE_MULTI_PAYLOAD,
|
||||
|
||||
@@ -1421,10 +1421,14 @@ export async function serverBuild({
|
||||
},
|
||||
],
|
||||
dest: path.posix.join('/', entryDirectory, '/index.rsc'),
|
||||
check: true,
|
||||
continue: true,
|
||||
},
|
||||
{
|
||||
src: `^${path.posix.join('/', entryDirectory, '/(.*)$')}`,
|
||||
src: `^${path.posix.join(
|
||||
'/',
|
||||
entryDirectory,
|
||||
'/((?!.+\\.rsc).+)$'
|
||||
)}`,
|
||||
has: [
|
||||
{
|
||||
type: 'header',
|
||||
@@ -1432,7 +1436,7 @@ export async function serverBuild({
|
||||
},
|
||||
],
|
||||
dest: path.posix.join('/', entryDirectory, '/$1.rsc'),
|
||||
check: true,
|
||||
continue: true,
|
||||
},
|
||||
]
|
||||
: []),
|
||||
|
||||
@@ -39,9 +39,13 @@ import { getNextjsEdgeFunctionSource } from './edge-function-source/get-edge-fun
|
||||
import type { LambdaOptionsWithFiles } from '@vercel/build-utils/dist/lambda';
|
||||
import { stringifySourceMap } from './sourcemapped';
|
||||
import type { RawSourceMap } from 'source-map';
|
||||
import bytes from 'bytes';
|
||||
|
||||
type stringMap = { [key: string]: string };
|
||||
|
||||
const _prettyBytes = (n: number) => bytes(n, { unitSeparator: ' ' });
|
||||
export { _prettyBytes as prettyBytes }
|
||||
|
||||
// Identify /[param]/ in route string
|
||||
// eslint-disable-next-line no-useless-escape
|
||||
const TEST_DYNAMIC_ROUTE = /\/\[[^\/]+?\](?=\/|$)/;
|
||||
@@ -1815,13 +1819,16 @@ export const onPrerenderRoute =
|
||||
isAppPathRoute = true;
|
||||
}
|
||||
|
||||
const isOmittedOrNotFound = isOmitted || isNotFound;
|
||||
const htmlFsRef =
|
||||
isBlocking || (isNotFound && !static404Page)
|
||||
? // Blocking pages do not have an HTML fallback
|
||||
null
|
||||
: new FileFsRef({
|
||||
fsPath: path.join(
|
||||
isAppPathRoute && appDir ? appDir : pagesDir,
|
||||
isAppPathRoute && !isOmittedOrNotFound && appDir
|
||||
? appDir
|
||||
: pagesDir,
|
||||
isFallback
|
||||
? // Fallback pages have a special file.
|
||||
addLocaleOrDefault(
|
||||
@@ -1832,7 +1839,7 @@ export const onPrerenderRoute =
|
||||
: // Otherwise, the route itself should exist as a static HTML
|
||||
// file.
|
||||
`${
|
||||
isOmitted || isNotFound
|
||||
isOmittedOrNotFound
|
||||
? addLocaleOrDefault('/404', routesManifest, locale)
|
||||
: routeFileNoExt
|
||||
}.html`
|
||||
@@ -1844,9 +1851,11 @@ export const onPrerenderRoute =
|
||||
? null
|
||||
: new FileFsRef({
|
||||
fsPath: path.join(
|
||||
isAppPathRoute && appDir ? appDir : pagesDir,
|
||||
isAppPathRoute && !isOmittedOrNotFound && appDir
|
||||
? appDir
|
||||
: pagesDir,
|
||||
`${
|
||||
isOmitted || isNotFound
|
||||
isOmittedOrNotFound
|
||||
? addLocaleOrDefault('/404.html', routesManifest, locale)
|
||||
: isAppPathRoute
|
||||
? dataRoute
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "experimental",
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
@@ -41,7 +41,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
@@ -65,7 +65,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
}
|
||||
]
|
||||
|
||||
10
packages/next/test/fixtures/00-app-dir/app/ssg/page.js
vendored
Normal file
10
packages/next/test/fixtures/00-app-dir/app/ssg/page.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
export const revalidate = 3;
|
||||
|
||||
export default function Page() {
|
||||
return (
|
||||
<>
|
||||
<p>hello from /ssg</p>
|
||||
<p>{Date.now()}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -5,4 +5,12 @@ export function middleware(request) {
|
||||
// TODO: this does not copy __flight__ and __flight_router_state_tree__
|
||||
return NextResponse.rewrite(new URL('/dashboard', request.url));
|
||||
}
|
||||
|
||||
if (
|
||||
request.nextUrl.pathname === '/ssg' &&
|
||||
request.nextUrl.searchParams.get('override')
|
||||
) {
|
||||
request.nextUrl.pathname = '/overridden';
|
||||
return NextResponse.redirect(request.nextUrl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,46 @@
|
||||
}
|
||||
],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/ssg",
|
||||
"status": 200,
|
||||
"mustContain": "hello from /ssg",
|
||||
"responseHeaders": {
|
||||
"vary": "RSC, Next-Router-State-Tree, Next-Router-Prefetch"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/ssg",
|
||||
"status": 200,
|
||||
"responseHeaders": {
|
||||
"vary": "RSC, Next-Router-State-Tree, Next-Router-Prefetch"
|
||||
},
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
"path": "/ssg?override=1",
|
||||
"status": 307,
|
||||
"responseHeaders": {
|
||||
"location": "/overridden/"
|
||||
},
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/ssg?override=1",
|
||||
"status": 307,
|
||||
"responseHeaders": {
|
||||
"location": "/overridden/"
|
||||
},
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/dashboard/deployments/123/settings",
|
||||
"status": 200,
|
||||
@@ -23,7 +63,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
@@ -43,7 +83,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
@@ -60,7 +100,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
@@ -110,7 +150,7 @@
|
||||
"headers": {
|
||||
"RSC": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustContain": ":{",
|
||||
"mustNotContain": "<html"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
"build": "next build",
|
||||
"start": "next start"
|
||||
},
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "10.1.3",
|
||||
"react": "17.0.2",
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"name": "notfound-deploy-test",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "9.5.5",
|
||||
"react": "17.0.2",
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "9.5.3",
|
||||
"react": "16.13.1",
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"scripts": {
|
||||
"build": "next build"
|
||||
},
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "8.0.3",
|
||||
"react": "latest",
|
||||
|
||||
4726
packages/next/test/fixtures/00-legacy-routes-nested/apps/app/yarn.lock
vendored
Normal file
4726
packages/next/test/fixtures/00-legacy-routes-nested/apps/app/yarn.lock
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "10.0.5",
|
||||
"react": "latest",
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
"build": "next build",
|
||||
"now-build": "next build"
|
||||
},
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "10.0.8",
|
||||
"react": "latest",
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "10.0.8",
|
||||
"react": "latest",
|
||||
|
||||
1553
packages/next/test/fixtures/00-shared-lambdas-invalid-node-env/yarn.lock
vendored
Normal file
1553
packages/next/test/fixtures/00-shared-lambdas-invalid-node-env/yarn.lock
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"engines": {
|
||||
"node": "16.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "10.0.8",
|
||||
"react": "^16.8.6",
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
"scripts": {
|
||||
"build": "next build"
|
||||
},
|
||||
"engines": {
|
||||
"node": "14.x"
|
||||
},
|
||||
"dependencies": {
|
||||
"chrome-aws-lambda": "8.0.0",
|
||||
"firebase": "8.3.0",
|
||||
|
||||
10
packages/next/test/fixtures/01-app-dir-static/app/blog/[slug]/layout.js
vendored
Normal file
10
packages/next/test/fixtures/01-app-dir-static/app/blog/[slug]/layout.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
export default function Layout({ children }) {
|
||||
return (
|
||||
<html>
|
||||
<head>
|
||||
<title>{`01-app-dir-static`}</title>
|
||||
</head>
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user