mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-26 11:49:15 +00:00
Compare commits
14 Commits
vercel@28.
...
@vercel/no
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40f38948a0 | ||
|
|
87eba56063 | ||
|
|
d0a5676c26 | ||
|
|
da9fa997ed | ||
|
|
3d79a9d4d4 | ||
|
|
ae13c5ee92 | ||
|
|
ad654139df | ||
|
|
74f8414e12 | ||
|
|
65c2860e14 | ||
|
|
3b5b397b35 | ||
|
|
051e061176 | ||
|
|
30d46321cc | ||
|
|
c2563535ea | ||
|
|
5f2bed4f24 |
1
.github/CONTRIBUTING.md
vendored
1
.github/CONTRIBUTING.md
vendored
@@ -13,6 +13,7 @@ To get started, execute the following:
|
||||
```
|
||||
git clone https://github.com/vercel/vercel
|
||||
cd vercel
|
||||
corepack enable
|
||||
yarn install
|
||||
yarn bootstrap
|
||||
yarn build
|
||||
|
||||
4
.github/workflows/publish.yml
vendored
4
.github/workflows/publish.yml
vendored
@@ -18,7 +18,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v1
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Check Release
|
||||
id: check-release
|
||||
run: |
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"license": "Apache-2.0",
|
||||
"packageManager": "yarn@1.22.19",
|
||||
"workspaces": {
|
||||
"packages": [
|
||||
"packages/*"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/build-utils",
|
||||
"version": "5.5.4",
|
||||
"version": "5.5.5",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.js",
|
||||
|
||||
@@ -251,33 +251,24 @@ export async function getNodeVersion(
|
||||
meta: Meta = {}
|
||||
): Promise<NodeVersion> {
|
||||
const latest = getLatestNodeVersion();
|
||||
if (meta && meta.isDev) {
|
||||
if (meta.isDev) {
|
||||
// Use the system-installed version of `node` in PATH for `vercel dev`
|
||||
return { ...latest, runtime: 'nodejs' };
|
||||
}
|
||||
const { packageJson } = await scanParentDirs(destPath, true);
|
||||
let { nodeVersion } = config;
|
||||
let isAuto = true;
|
||||
if (packageJson && packageJson.engines && packageJson.engines.node) {
|
||||
if (packageJson?.engines?.node) {
|
||||
const { node } = packageJson.engines;
|
||||
if (
|
||||
nodeVersion &&
|
||||
validRange(node) &&
|
||||
!intersects(nodeVersion, node) &&
|
||||
!meta.isDev
|
||||
) {
|
||||
if (nodeVersion && validRange(node) && !intersects(nodeVersion, node)) {
|
||||
console.warn(
|
||||
`Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${nodeVersion}") will not apply. Learn More: http://vercel.link/node-version`
|
||||
);
|
||||
} else if (coerce(node)?.raw === node && !meta.isDev) {
|
||||
} else if (coerce(node)?.raw === node) {
|
||||
console.warn(
|
||||
`Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` with major.minor.patch, but only major Node.js Version can be selected. Learn More: http://vercel.link/node-version`
|
||||
);
|
||||
} else if (
|
||||
validRange(node) &&
|
||||
intersects(`${latest.major + 1}.x`, node) &&
|
||||
!meta.isDev
|
||||
) {
|
||||
} else if (validRange(node) && intersects(`${latest.major + 1}.x`, node)) {
|
||||
console.warn(
|
||||
`Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` that will automatically upgrade when a new major Node.js Version is released. Learn More: http://vercel.link/node-version`
|
||||
);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vercel",
|
||||
"version": "28.4.8",
|
||||
"version": "28.4.11",
|
||||
"preferGlobal": true,
|
||||
"license": "Apache-2.0",
|
||||
"description": "The command-line interface for Vercel",
|
||||
@@ -41,16 +41,16 @@
|
||||
"node": ">= 14"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/go": "2.2.12",
|
||||
"@vercel/hydrogen": "0.0.25",
|
||||
"@vercel/next": "3.2.3",
|
||||
"@vercel/node": "2.5.22",
|
||||
"@vercel/python": "3.1.21",
|
||||
"@vercel/redwood": "1.0.30",
|
||||
"@vercel/remix": "1.0.31",
|
||||
"@vercel/ruby": "1.3.38",
|
||||
"@vercel/static-build": "1.0.30",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/go": "2.2.13",
|
||||
"@vercel/hydrogen": "0.0.26",
|
||||
"@vercel/next": "3.2.5",
|
||||
"@vercel/node": "2.5.25",
|
||||
"@vercel/python": "3.1.22",
|
||||
"@vercel/redwood": "1.0.31",
|
||||
"@vercel/remix": "1.0.32",
|
||||
"@vercel/ruby": "1.3.39",
|
||||
"@vercel/static-build": "1.0.32",
|
||||
"update-notifier": "5.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -95,9 +95,9 @@
|
||||
"@types/which": "1.3.2",
|
||||
"@types/write-json-file": "2.2.1",
|
||||
"@types/yauzl-promise": "2.1.0",
|
||||
"@vercel/client": "12.2.12",
|
||||
"@vercel/frameworks": "1.1.6",
|
||||
"@vercel/fs-detectors": "3.4.2",
|
||||
"@vercel/client": "12.2.13",
|
||||
"@vercel/frameworks": "1.1.8",
|
||||
"@vercel/fs-detectors": "3.4.5",
|
||||
"@vercel/fun": "1.0.4",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"@zeit/source-map-support": "0.6.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/client",
|
||||
"version": "12.2.12",
|
||||
"version": "12.2.13",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"homepage": "https://vercel.com",
|
||||
@@ -43,7 +43,7 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"@zeit/fetch": "5.2.0",
|
||||
"async-retry": "1.2.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/frameworks",
|
||||
"version": "1.1.6",
|
||||
"version": "1.1.8",
|
||||
"main": "./dist/frameworks.js",
|
||||
"types": "./dist/frameworks.d.ts",
|
||||
"files": [
|
||||
|
||||
@@ -1792,9 +1792,15 @@ export const frameworks = [
|
||||
{
|
||||
path: 'sanity.config.js',
|
||||
},
|
||||
{
|
||||
path: 'sanity.config.jsx',
|
||||
},
|
||||
{
|
||||
path: 'sanity.config.ts',
|
||||
},
|
||||
{
|
||||
path: 'sanity.config.tsx',
|
||||
},
|
||||
],
|
||||
},
|
||||
settings: {
|
||||
@@ -1834,10 +1840,13 @@ export const frameworks = [
|
||||
website: 'https://hydrogen.shopify.dev',
|
||||
useRuntime: { src: 'package.json', use: '@vercel/hydrogen' },
|
||||
detectors: {
|
||||
every: [
|
||||
some: [
|
||||
{
|
||||
path: 'hydrogen.config.js',
|
||||
},
|
||||
{
|
||||
path: 'hydrogen.config.ts',
|
||||
},
|
||||
],
|
||||
},
|
||||
settings: {
|
||||
|
||||
35
packages/fs-detectors/logos/turborepo-dark.svg
Normal file
35
packages/fs-detectors/logos/turborepo-dark.svg
Normal file
@@ -0,0 +1,35 @@
|
||||
<svg width="100" height="125" viewBox="0 0 100 125" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M40 0.0374222C25.8531 -0.46154 11.7078 4.02912 0 13.5094L7.80471 18C17.0735 11.0146 28.7797 8.02081 40 8.51977V0.0374222Z" fill="url(#paint0_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M82 19.1224C72.2699 8.83673 59.6211 2.46939 46 1V9.32653C57.6764 11.2857 67.8927 16.6735 76.1626 25L82 19.1224Z" fill="url(#paint1_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M100 60C99.5253 47 94.7753 34 86.701 23L81 29C87.6503 38.5001 91.451 49 91.9256 60H100Z" fill="url(#paint2_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M86.701 102C94.7753 91.2973 99.5253 78.6487 100 66H91.9256C91.451 76.7027 87.6503 86.9189 81 96.1621L86.701 102Z" fill="url(#paint3_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M46 124C59.135 122.531 72.2699 116.163 82 105.878L76.1626 100C67.8927 108.816 57.1886 114.204 46 115.673V124Z" fill="url(#paint4_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 111.491C11.7078 120.971 25.8531 125.461 40 124.963V116.48C28.7797 116.979 17.561 113.985 7.80471 107L0 111.491Z" fill="url(#paint5_linear_8_11)"/>
|
||||
<path d="M19.9222 63C19.9222 65.6382 20.4182 68.0713 21.4084 70.299C22.3987 72.5267 23.7403 74.4614 25.4299 76.103C27.1196 77.7446 29.0732 79.0343 31.2875 79.9724C33.5605 80.8518 35.9495 81.2915 38.4563 81.2915C40.963 81.2915 43.3235 80.8518 45.5377 79.9724C47.8108 79.0343 49.793 77.7446 51.4826 76.103C53.2311 74.4614 54.6014 72.5267 55.5916 70.299C56.5819 68.0713 57.0778 65.6382 57.0778 63C57.0778 60.3618 56.5819 57.9288 55.5916 55.701C54.6014 53.4733 53.2311 51.5386 51.4826 49.897C49.793 48.2554 47.8108 46.995 45.5377 46.1156C43.3235 45.1775 40.963 44.7085 38.4563 44.7085C35.9495 44.7085 33.5605 45.1775 31.2875 46.1156C29.0732 46.995 27.1196 48.2554 25.4299 49.897C23.7403 51.5386 22.3987 53.4733 21.4084 55.701C20.4182 57.9288 19.9222 60.3618 19.9222 63ZM2 63C2 58.0754 2.90283 53.5025 4.71018 49.2814C6.51753 45.0016 9.02263 41.2789 12.2288 38.1131C15.4349 34.9472 19.2513 32.4849 23.6814 30.7261C28.1687 28.9087 33.0947 28 38.4563 28C43.7606 28 48.6565 28.9087 53.1437 30.7261C57.631 32.4849 61.4777 34.9472 64.6838 38.1131C67.9471 41.2789 70.4825 45.0016 72.2899 49.2814C74.0972 53.5025 75 58.0754 75 63C75 67.9246 74.0972 72.5267 72.2899 76.8065C70.4825 81.0276 67.9471 84.7211 64.6838 87.8869C61.4777 91.0528 57.631 93.5443 53.1437 95.3618C48.6565 97.1206 43.7606 98 38.4563 98C33.0947 98 28.1687 97.1206 23.6814 95.3618C19.2513 93.5443 15.4349 91.0528 12.2288 87.8869C9.02263 84.7211 6.51753 81.0276 4.71018 76.8065C2.90283 72.5267 2 67.9246 2 63Z" fill="white"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_8_11" x1="49.5117" y1="-6.94291e-08" x2="49.5117" y2="125.813" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_8_11" x1="50.135" y1="0.473494" x2="50.135" y2="123.975" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_8_11" x1="51.7888" y1="-0.0373877" x2="51.7888" y2="126.037" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_8_11" x1="51.7888" y1="1.74712" x2="51.7888" y2="124.415" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_8_11" x1="50.135" y1="1.02464" x2="50.135" y2="124.526" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_8_11" x1="49.5117" y1="-0.812955" x2="49.5117" y2="125" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
@@ -1,39 +1,35 @@
|
||||
<svg width="100" height="123" viewBox="0 0 100 123" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_644_604)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M40.7308 0.260348C26.6277 -0.225939 12.5263 4.15064 0.854706 13.3901L8.63524 17.7666C17.8753 10.9587 29.5452 8.04094 40.7308 8.52722V0.260348Z" fill="url(#paint0_linear_644_604)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M82.0649 18.7394C72.3389 8.52736 59.6954 2.20563 46.08 0.746765V9.01364C57.7515 10.9588 67.9635 16.3079 76.23 24.5748L82.0649 18.7394Z" fill="url(#paint1_linear_644_604)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M99.5712 58.6147C99.0853 45.9712 94.2222 33.3277 85.9557 22.6295L80.1191 28.4649C86.9277 37.7045 90.8188 47.9165 91.3048 58.6147H99.5712Z" fill="url(#paint2_linear_644_604)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M85.9557 100.435C94.2222 89.7371 99.0853 77.0938 99.5712 64.4503H91.3048C90.8188 75.1486 86.9277 85.3605 80.1191 94.5999L85.9557 100.435Z" fill="url(#paint3_linear_644_604)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M46.08 122.318C59.2094 120.859 72.3389 114.538 82.0649 104.326L76.23 98.4903C67.9635 107.243 57.2639 112.593 46.08 114.051V122.318Z" fill="url(#paint4_linear_644_604)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.854706 109.675C12.5263 118.914 26.6277 123.291 40.7308 122.805V114.538C29.5452 115.024 18.3613 112.106 8.63524 105.298L0.854706 109.675Z" fill="url(#paint5_linear_644_604)"/>
|
||||
</g>
|
||||
<svg width="100" height="125" viewBox="0 0 100 125" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M40 0.0374222C25.8531 -0.46154 11.7078 4.02912 0 13.5094L7.80471 18C17.0735 11.0146 28.7797 8.02081 40 8.51977V0.0374222Z" fill="url(#paint0_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M82 19.1224C72.2699 8.83673 59.6211 2.46939 46 1V9.32653C57.6764 11.2857 67.8927 16.6735 76.1626 25L82 19.1224Z" fill="url(#paint1_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M100 60C99.5253 47 94.7753 34 86.701 23L81 29C87.6503 38.5001 91.451 49 91.9256 60H100Z" fill="url(#paint2_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M86.701 102C94.7753 91.2973 99.5253 78.6487 100 66H91.9256C91.451 76.7027 87.6503 86.9189 81 96.1621L86.701 102Z" fill="url(#paint3_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M46 124C59.135 122.531 72.2699 116.163 82 105.878L76.1626 100C67.8927 108.816 57.1886 114.204 46 115.673V124Z" fill="url(#paint4_linear_8_11)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 111.491C11.7078 120.971 25.8531 125.461 40 124.963V116.48C28.7797 116.979 17.561 113.985 7.80471 107L0 111.491Z" fill="url(#paint5_linear_8_11)"/>
|
||||
<path d="M19.9222 63C19.9222 65.6382 20.4182 68.0713 21.4084 70.299C22.3987 72.5267 23.7403 74.4614 25.4299 76.103C27.1196 77.7446 29.0732 79.0343 31.2875 79.9724C33.5605 80.8518 35.9495 81.2915 38.4563 81.2915C40.963 81.2915 43.3235 80.8518 45.5377 79.9724C47.8108 79.0343 49.793 77.7446 51.4826 76.103C53.2311 74.4614 54.6014 72.5267 55.5916 70.299C56.5819 68.0713 57.0778 65.6382 57.0778 63C57.0778 60.3618 56.5819 57.9288 55.5916 55.701C54.6014 53.4733 53.2311 51.5386 51.4826 49.897C49.793 48.2554 47.8108 46.995 45.5377 46.1156C43.3235 45.1775 40.963 44.7085 38.4563 44.7085C35.9495 44.7085 33.5605 45.1775 31.2875 46.1156C29.0732 46.995 27.1196 48.2554 25.4299 49.897C23.7403 51.5386 22.3987 53.4733 21.4084 55.701C20.4182 57.9288 19.9222 60.3618 19.9222 63ZM2 63C2 58.0754 2.90283 53.5025 4.71018 49.2814C6.51753 45.0016 9.02263 41.2789 12.2288 38.1131C15.4349 34.9472 19.2513 32.4849 23.6814 30.7261C28.1687 28.9087 33.0947 28 38.4563 28C43.7606 28 48.6565 28.9087 53.1437 30.7261C57.631 32.4849 61.4777 34.9472 64.6838 38.1131C67.9471 41.2789 70.4825 45.0016 72.2899 49.2814C74.0972 53.5025 75 58.0754 75 63C75 67.9246 74.0972 72.5267 72.2899 76.8065C70.4825 81.0276 67.9471 84.7211 64.6838 87.8869C61.4777 91.0528 57.631 93.5443 53.1437 95.3618C48.6565 97.1206 43.7606 98 38.4563 98C33.0947 98 28.1687 97.1206 23.6814 95.3618C19.2513 93.5443 15.4349 91.0528 12.2288 87.8869C9.02263 84.7211 6.51753 81.0276 4.71018 76.8065C2.90283 72.5267 2 67.9246 2 63Z" fill="black"/>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_644_604" x1="50.213" y1="0.223877" x2="50.213" y2="122.841" gradientUnits="userSpaceOnUse">
|
||||
<linearGradient id="paint0_linear_8_11" x1="49.5117" y1="-6.94291e-08" x2="49.5117" y2="125.813" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_644_604" x1="50.2132" y1="0.224031" x2="50.2132" y2="122.841" gradientUnits="userSpaceOnUse">
|
||||
<linearGradient id="paint1_linear_8_11" x1="50.135" y1="0.473494" x2="50.135" y2="123.975" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_644_604" x1="50.2129" y1="0.223859" x2="50.2129" y2="122.841" gradientUnits="userSpaceOnUse">
|
||||
<linearGradient id="paint2_linear_8_11" x1="51.7888" y1="-0.0373877" x2="51.7888" y2="126.037" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear_644_604" x1="50.2129" y1="0.223916" x2="50.2129" y2="122.841" gradientUnits="userSpaceOnUse">
|
||||
<linearGradient id="paint3_linear_8_11" x1="51.7888" y1="1.74712" x2="51.7888" y2="124.415" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear_644_604" x1="50.2132" y1="0.223833" x2="50.2132" y2="122.841" gradientUnits="userSpaceOnUse">
|
||||
<linearGradient id="paint4_linear_8_11" x1="50.135" y1="1.02464" x2="50.135" y2="124.526" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear_644_604" x1="50.213" y1="0.224042" x2="50.213" y2="122.841" gradientUnits="userSpaceOnUse">
|
||||
<linearGradient id="paint5_linear_8_11" x1="49.5117" y1="-0.812955" x2="49.5117" y2="125" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1E90FF"/>
|
||||
<stop offset="1" stop-color="#FF1E56"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_644_604">
|
||||
<rect width="100" height="123" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.9 KiB |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/fs-detectors",
|
||||
"version": "3.4.2",
|
||||
"version": "3.4.5",
|
||||
"description": "Vercel filesystem detectors",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -19,7 +19,7 @@
|
||||
"test-unit": "yarn test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vercel/frameworks": "1.1.6",
|
||||
"@vercel/frameworks": "1.1.8",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"glob": "8.0.3",
|
||||
"js-yaml": "4.1.0",
|
||||
|
||||
@@ -20,6 +20,8 @@ export const monorepoManagers: Array<
|
||||
name: 'Turborepo',
|
||||
slug: 'turbo',
|
||||
logo: 'https://api-frameworks.vercel.sh/monorepo-logos/turborepo.svg',
|
||||
darkModeLogo:
|
||||
'https://api-frameworks.vercel.sh/monorepo-logos/turborepo-dark.svg',
|
||||
detectors: {
|
||||
some: [
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/go",
|
||||
"version": "2.2.12",
|
||||
"version": "2.2.13",
|
||||
"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.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"async-retry": "1.3.1",
|
||||
"execa": "^1.0.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/hydrogen",
|
||||
"version": "0.0.25",
|
||||
"version": "0.0.26",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -21,7 +21,7 @@
|
||||
"devDependencies": {
|
||||
"@types/jest": "27.5.1",
|
||||
"@types/node": "*",
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"typescript": "4.6.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/next",
|
||||
"version": "3.2.3",
|
||||
"version": "3.2.5",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",
|
||||
@@ -44,7 +44,7 @@
|
||||
"@types/semver": "6.0.0",
|
||||
"@types/text-table": "0.2.1",
|
||||
"@types/webpack-sources": "3.2.0",
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/nft": "0.22.1",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"async-sema": "3.0.1",
|
||||
|
||||
@@ -970,7 +970,9 @@ export async function serverBuild({
|
||||
// routes since only the status is being modified and we don't want
|
||||
// to exceed the routes limit
|
||||
const starterRouteSrc = `^${
|
||||
entryDirectory !== '.' ? path.posix.join('/', entryDirectory, '()') : '()'
|
||||
entryDirectory !== '.'
|
||||
? `${path.posix.join('/', entryDirectory)}()`
|
||||
: '()'
|
||||
}`;
|
||||
let currentRouteSrc = starterRouteSrc;
|
||||
|
||||
@@ -1142,7 +1144,8 @@ export async function serverBuild({
|
||||
|
||||
if (lambdas[route]) {
|
||||
lambdas[`${route}.rsc`] = lambdas[route];
|
||||
} else if (edgeFunctions[route]) {
|
||||
}
|
||||
if (edgeFunctions[route]) {
|
||||
edgeFunctions[`${route}.rsc`] = edgeFunctions[route];
|
||||
}
|
||||
}
|
||||
@@ -1400,6 +1403,17 @@ export async function serverBuild({
|
||||
|
||||
...(appDir
|
||||
? [
|
||||
{
|
||||
src: `^${path.posix.join('/', entryDirectory, '/')}`,
|
||||
has: [
|
||||
{
|
||||
type: 'header',
|
||||
key: '__rsc__',
|
||||
},
|
||||
],
|
||||
dest: path.posix.join('/', entryDirectory, '/index.rsc'),
|
||||
check: true,
|
||||
},
|
||||
{
|
||||
src: `^${path.posix.join('/', entryDirectory, '/(.*)$')}`,
|
||||
has: [
|
||||
@@ -1509,18 +1523,31 @@ export async function serverBuild({
|
||||
dynamicRoutes
|
||||
.map(route => {
|
||||
route = Object.assign({}, route);
|
||||
let normalizedSrc = route.src;
|
||||
|
||||
if (routesManifest.basePath) {
|
||||
normalizedSrc = normalizedSrc.replace(
|
||||
new RegExp(
|
||||
`\\^${escapeStringRegexp(routesManifest.basePath)}`
|
||||
),
|
||||
'^'
|
||||
);
|
||||
}
|
||||
|
||||
route.src = path.posix.join(
|
||||
'^/',
|
||||
entryDirectory,
|
||||
'_next/data/',
|
||||
escapedBuildId,
|
||||
route.src.replace(/(^\^|\$$)/g, '') + '.json$'
|
||||
normalizedSrc
|
||||
.replace(/\^\(\?:\/\(\?</, '(?:(?<')
|
||||
.replace(/(^\^|\$$)/g, '') + '.json$'
|
||||
);
|
||||
|
||||
const { pathname, search } = new URL(
|
||||
route.dest || '/',
|
||||
'http://n'
|
||||
);
|
||||
const parsedDestination = new URL(route.dest || '/', 'http://n');
|
||||
let pathname = parsedDestination.pathname;
|
||||
const search = parsedDestination.search;
|
||||
|
||||
let isPrerender = !!prerenders[path.join('./', pathname)];
|
||||
|
||||
if (routesManifest.i18n) {
|
||||
@@ -1537,9 +1564,17 @@ export async function serverBuild({
|
||||
}
|
||||
|
||||
if (isPrerender) {
|
||||
route.dest = `/_next/data/${buildId}${pathname}.json${
|
||||
search || ''
|
||||
}`;
|
||||
if (routesManifest.basePath) {
|
||||
pathname = pathname.replace(
|
||||
new RegExp(
|
||||
`^${escapeStringRegexp(routesManifest.basePath)}`
|
||||
),
|
||||
''
|
||||
);
|
||||
}
|
||||
route.dest = `${
|
||||
routesManifest.basePath || ''
|
||||
}/_next/data/${buildId}${pathname}.json${search || ''}`;
|
||||
}
|
||||
return route;
|
||||
})
|
||||
@@ -1612,6 +1647,18 @@ export async function serverBuild({
|
||||
continue: true,
|
||||
important: true,
|
||||
},
|
||||
...(appDir
|
||||
? [
|
||||
{
|
||||
src: path.posix.join('/', entryDirectory, '/(.*).rsc$'),
|
||||
headers: {
|
||||
'content-type': 'application/octet-stream',
|
||||
},
|
||||
continue: true,
|
||||
important: true,
|
||||
},
|
||||
]
|
||||
: []),
|
||||
|
||||
// TODO: remove below workaround when `/` is allowed to be output
|
||||
// different than `/index`
|
||||
|
||||
10
packages/next/test/fixtures/00-app-dir-edge/app/layout.js
vendored
Normal file
10
packages/next/test/fixtures/00-app-dir-edge/app/layout.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
export default function Root({ children }) {
|
||||
return (
|
||||
<html>
|
||||
<head>
|
||||
<title>test app</title>
|
||||
</head>
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
12
packages/next/test/fixtures/00-app-dir-edge/index.test.js
vendored
Normal file
12
packages/next/test/fixtures/00-app-dir-edge/index.test.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
/* eslint-env jest */
|
||||
const path = require('path');
|
||||
const { deployAndTest } = require('../../utils');
|
||||
|
||||
const ctx = {};
|
||||
|
||||
describe(`${__dirname.split(path.sep).pop()}`, () => {
|
||||
it('should deploy and pass probe checks', async () => {
|
||||
const info = await deployAndTest(__dirname);
|
||||
Object.assign(ctx, info);
|
||||
});
|
||||
});
|
||||
@@ -10,6 +10,49 @@
|
||||
"path": "/edge",
|
||||
"status": 200,
|
||||
"mustContain": "edge"
|
||||
},
|
||||
{
|
||||
"path": "/edge",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"__rsc__": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
"path": "/edge",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"__rsc__": "1"
|
||||
},
|
||||
"responseHeaders": {
|
||||
"content-type": "application/octet-stream"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/",
|
||||
"status": 200,
|
||||
"mustContain": "page"
|
||||
},
|
||||
{
|
||||
"path": "/",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"__rsc__": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
"path": "/",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"__rsc__": "1"
|
||||
},
|
||||
"responseHeaders": {
|
||||
"content-type": "application/octet-stream"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
'client';
|
||||
'use client';
|
||||
|
||||
import { useState, useEffect } from 'react';
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
'client';
|
||||
'use client';
|
||||
|
||||
import { useState, useEffect } from 'react';
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
'client';
|
||||
'use client';
|
||||
|
||||
export default function LazyComponent() {
|
||||
return (
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
'client';
|
||||
'use client';
|
||||
|
||||
import { useState, lazy } from 'react';
|
||||
|
||||
const Lazy = lazy(() => import('./lazy.js'));
|
||||
|
||||
export function ClientComponent() {
|
||||
let [state] = useState('client');
|
||||
let [state] = useState('use client');
|
||||
return (
|
||||
<>
|
||||
<Lazy />
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
'client';
|
||||
'use client';
|
||||
|
||||
export default function ShouldNotServeClientDotJs(props) {
|
||||
return (
|
||||
|
||||
@@ -20,18 +20,26 @@
|
||||
"mustContain": "M1:{",
|
||||
"mustNotContain": "<html"
|
||||
},
|
||||
{
|
||||
"path": "/dashboard",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"__rsc__": "1"
|
||||
},
|
||||
"responseHeaders": {
|
||||
"content-type": "application/octet-stream"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/dashboard/another",
|
||||
"status": 200,
|
||||
"mustContain": "hello from newroot/dashboard/another"
|
||||
},
|
||||
// TODO: uncomment after this is fixed upstream
|
||||
// x-ref: https://vercel.slack.com/archives/C035J346QQL/p1663820032810519?thread_ts=1663775935.504379&cid=C035J346QQL
|
||||
// {
|
||||
// "path": "/dashboard/deployments/123",
|
||||
// "status": 200,
|
||||
// "mustContain": "hello from app/dashboard/deployments/[id]. ID is: <!-- -->123"
|
||||
// },
|
||||
{
|
||||
"path": "/dashboard/deployments/123",
|
||||
"status": 200,
|
||||
"mustContain": "hello from app/dashboard/deployments/[id]. ID is: <!-- -->123"
|
||||
},
|
||||
{
|
||||
"path": "/",
|
||||
"status": 200,
|
||||
@@ -42,16 +50,24 @@
|
||||
"status": 200,
|
||||
"mustContain": "hello from pages/blog/[slug]"
|
||||
},
|
||||
// TODO: uncomment after this is fixed upstream
|
||||
// {
|
||||
// "path": "/dynamic/category-1/id-1",
|
||||
// "status": 200,
|
||||
// "mustContain": "{"category":"category-1","id":"id-1"}"
|
||||
// },
|
||||
{
|
||||
"path": "/dynamic/category-1/id-1",
|
||||
"status": 200,
|
||||
"mustContain": "{"category":"category-1","id":"id-1"}"
|
||||
},
|
||||
{
|
||||
"path": "/dashboard/changelog",
|
||||
"status": 200,
|
||||
"mustContain": "hello from app/dashboard/changelog"
|
||||
},
|
||||
{
|
||||
"path": "/",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"__rsc__": "1"
|
||||
},
|
||||
"mustContain": "M1:{",
|
||||
"mustNotContain": "<html"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
127
packages/next/test/fixtures/00-middleware-base-path/index.test.js
vendored
Normal file
127
packages/next/test/fixtures/00-middleware-base-path/index.test.js
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
const path = require('path');
|
||||
const cheerio = require('cheerio');
|
||||
const { deployAndTest, check } = require('../../utils');
|
||||
const fetch = require('../../../../../test/lib/deployment/fetch-retry');
|
||||
|
||||
describe(`${__dirname.split(path.sep).pop()}`, () => {
|
||||
let ctx = {};
|
||||
|
||||
it('should deploy and pass probe checks', async () => {
|
||||
const info = await deployAndTest(__dirname);
|
||||
Object.assign(ctx, info);
|
||||
});
|
||||
|
||||
it('should revalidate content correctly for middleware rewrite', async () => {
|
||||
const propsFromHtml = async () => {
|
||||
let res = await fetch(
|
||||
`${ctx.deploymentUrl}/docs/rewrite-to-another-site`
|
||||
);
|
||||
let $ = cheerio.load(await res.text());
|
||||
let props = JSON.parse($('#props').text());
|
||||
return props;
|
||||
};
|
||||
let props = await propsFromHtml();
|
||||
expect(isNaN(props.now)).toBe(false);
|
||||
|
||||
const { pageProps: data } = await fetch(
|
||||
`${ctx.deploymentUrl}/docs/_next/data/testing-build-id/rewrite-to-another-site.json`
|
||||
).then(res => res.json());
|
||||
|
||||
expect(isNaN(data.now)).toBe(false);
|
||||
|
||||
const revalidateRes = await fetch(
|
||||
`${ctx.deploymentUrl}/docs/api/revalidate?urlPath=/docs/_sites/test-revalidate`
|
||||
);
|
||||
expect(revalidateRes.status).toBe(200);
|
||||
expect(await revalidateRes.json()).toEqual({ revalidated: true });
|
||||
|
||||
await check(async () => {
|
||||
const newProps = await propsFromHtml();
|
||||
console.log({ props, newProps });
|
||||
|
||||
if (isNaN(newProps.now)) {
|
||||
throw new Error();
|
||||
}
|
||||
return newProps.now !== props.now
|
||||
? 'success'
|
||||
: JSON.stringify({
|
||||
newProps,
|
||||
props,
|
||||
});
|
||||
}, 'success');
|
||||
|
||||
await check(async () => {
|
||||
const { pageProps: newData } = await fetch(
|
||||
`${ctx.deploymentUrl}/docs/_next/data/testing-build-id/rewrite-to-another-site.json`
|
||||
).then(res => res.json());
|
||||
|
||||
console.log({ newData, data });
|
||||
|
||||
if (isNaN(newData.now)) {
|
||||
throw new Error();
|
||||
}
|
||||
return newData.now !== data.now
|
||||
? 'success'
|
||||
: JSON.stringify({
|
||||
newData,
|
||||
data,
|
||||
});
|
||||
}, 'success');
|
||||
});
|
||||
|
||||
it('should revalidate content correctly for optional catch-all route', async () => {
|
||||
const propsFromHtml = async () => {
|
||||
let res = await fetch(`${ctx.deploymentUrl}/docs/financial`);
|
||||
let $ = cheerio.load(await res.text());
|
||||
let props = JSON.parse($('#props').text());
|
||||
return props;
|
||||
};
|
||||
let props = await propsFromHtml();
|
||||
expect(isNaN(props.now)).toBe(false);
|
||||
|
||||
const { pageProps: data } = await fetch(
|
||||
`${ctx.deploymentUrl}/docs/_next/data/testing-build-id/financial.json?slug=financial`
|
||||
).then(res => res.json());
|
||||
|
||||
expect(isNaN(data.now)).toBe(false);
|
||||
|
||||
const revalidateRes = await fetch(
|
||||
`${ctx.deploymentUrl}/docs/api/revalidate?urlPath=/docs/financial`
|
||||
);
|
||||
expect(revalidateRes.status).toBe(200);
|
||||
expect(await revalidateRes.json()).toEqual({ revalidated: true });
|
||||
|
||||
await check(async () => {
|
||||
const newProps = await propsFromHtml();
|
||||
console.log({ props, newProps });
|
||||
|
||||
if (isNaN(newProps.now)) {
|
||||
throw new Error();
|
||||
}
|
||||
return newProps.now !== props.now
|
||||
? 'success'
|
||||
: JSON.stringify({
|
||||
newProps,
|
||||
props,
|
||||
});
|
||||
}, 'success');
|
||||
|
||||
await check(async () => {
|
||||
const { pageProps: newData } = await fetch(
|
||||
`${ctx.deploymentUrl}/docs/_next/data/testing-build-id/financial.json?slug=financial`
|
||||
).then(res => res.json());
|
||||
|
||||
console.log({ newData, data });
|
||||
|
||||
if (isNaN(newData.now)) {
|
||||
throw new Error();
|
||||
}
|
||||
return newData.now !== data.now
|
||||
? 'success'
|
||||
: JSON.stringify({
|
||||
newData,
|
||||
data,
|
||||
});
|
||||
}, 'success');
|
||||
});
|
||||
});
|
||||
253
packages/next/test/fixtures/00-middleware-base-path/middleware.js
vendored
Normal file
253
packages/next/test/fixtures/00-middleware-base-path/middleware.js
vendored
Normal file
@@ -0,0 +1,253 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
const ALLOWED = ['allowed'];
|
||||
|
||||
export const config = {
|
||||
matcher: [
|
||||
'/dynamic/:path*',
|
||||
'/_sites/:path*',
|
||||
'/:teamId/:slug',
|
||||
'/:path*',
|
||||
'/',
|
||||
],
|
||||
};
|
||||
|
||||
export function middleware(request) {
|
||||
const url = request.nextUrl;
|
||||
const pathname = url.pathname;
|
||||
|
||||
if (process.env.FOO) {
|
||||
console.log(`Includes env variable ${process.env.FOO}`);
|
||||
}
|
||||
|
||||
if (url.pathname === '/redirect-me') {
|
||||
url.pathname = '/from-middleware';
|
||||
return NextResponse.redirect(url, 307);
|
||||
}
|
||||
|
||||
if (url.pathname === '/next') {
|
||||
return NextResponse.next();
|
||||
}
|
||||
|
||||
if (url.pathname === '/version') {
|
||||
return NextResponse.json({
|
||||
enumerable: Object.keys(self).includes('VercelRuntime'),
|
||||
version: self.VercelRuntime.version,
|
||||
});
|
||||
}
|
||||
|
||||
if (url.pathname === '/globals') {
|
||||
const globalThisKeys = Object.keys(globalThis);
|
||||
const globalKeys = globalThisKeys.reduce((acc, globalName) => {
|
||||
const key = globalName.toString();
|
||||
if (global[key]) acc.push(key);
|
||||
return acc;
|
||||
}, []);
|
||||
|
||||
const res = NextResponse.next();
|
||||
res.headers.set(
|
||||
'data',
|
||||
JSON.stringify({ globals: globalKeys, globalThis: globalThisKeys })
|
||||
);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (url.pathname === '/log') {
|
||||
console.log('hi there');
|
||||
return;
|
||||
}
|
||||
|
||||
if (url.pathname === '/somewhere') {
|
||||
url.pathname = '/from-middleware';
|
||||
return NextResponse.redirect(url);
|
||||
}
|
||||
|
||||
if (url.pathname === '/logs') {
|
||||
console.clear();
|
||||
for (let i = 0; i < 3; i++) console.count();
|
||||
console.count('test');
|
||||
console.count('test');
|
||||
console.dir({ hello: 'world' });
|
||||
console.log('hello');
|
||||
console.log('world');
|
||||
return;
|
||||
}
|
||||
|
||||
if (url.pathname === '/greetings') {
|
||||
const data = { message: 'hello world!' };
|
||||
const res = NextResponse.next();
|
||||
res.headers.set('x-example', 'edge');
|
||||
res.headers.set('data', JSON.stringify(data));
|
||||
return res;
|
||||
}
|
||||
|
||||
if (url.pathname === '/rewrite-me-to-about') {
|
||||
url.pathname = '/about';
|
||||
url.searchParams.set('middleware', 'foo');
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
|
||||
if (url.pathname === '/rewrite-to-site') {
|
||||
url.pathname = '/_sites/subdomain-1';
|
||||
console.log('rewriting to', url.pathname, url.href);
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
|
||||
if (url.pathname === '/rewrite-to-another-site') {
|
||||
url.pathname = '/_sites/test-revalidate';
|
||||
console.log('rewriting to', url.pathname, url.href);
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
|
||||
if (url.pathname === '/redirect-me-to-about') {
|
||||
url.pathname = '/about';
|
||||
url.searchParams.set('middleware', 'foo');
|
||||
return Response.redirect(url);
|
||||
}
|
||||
|
||||
if (url.pathname === '/rewrite-absolute') {
|
||||
return NextResponse.rewrite('https://example.vercel.sh/foo?foo=bar');
|
||||
}
|
||||
|
||||
if (url.pathname === '/rewrite-relative') {
|
||||
url.pathname = '/foo';
|
||||
url.searchParams.set('foo', 'bar');
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
|
||||
if (url.pathname === '/redirect-absolute') {
|
||||
return Response.redirect('https://vercel.com');
|
||||
}
|
||||
|
||||
if (url.pathname === '/redirect-301') {
|
||||
url.pathname = '/greetings';
|
||||
return NextResponse.redirect(url, 301);
|
||||
}
|
||||
|
||||
if (url.pathname === '/reflect') {
|
||||
const res = NextResponse.next();
|
||||
res.headers.set(
|
||||
'data',
|
||||
JSON.stringify({
|
||||
geo: request.geo,
|
||||
headers: Object.fromEntries(request.headers),
|
||||
ip: request.ip,
|
||||
method: request.method,
|
||||
nextUrl: {
|
||||
hash: request.nextUrl.hash,
|
||||
hostname: request.nextUrl.hostname,
|
||||
pathname: request.nextUrl.pathname,
|
||||
port: request.nextUrl.port,
|
||||
protocol: request.nextUrl.protocol,
|
||||
search: request.nextUrl.search,
|
||||
},
|
||||
url: request.url,
|
||||
})
|
||||
);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (url.pathname === '/stream-response') {
|
||||
const { readable, writable } = new TransformStream();
|
||||
const waitUntil = (async () => {
|
||||
const enc = new TextEncoder();
|
||||
const writer = writable.getWriter();
|
||||
writer.write(enc.encode('this is a streamed '));
|
||||
writer.write(enc.encode('response '));
|
||||
return writer.close();
|
||||
})();
|
||||
|
||||
return {
|
||||
waitUntil,
|
||||
response: NextResponse.next(),
|
||||
};
|
||||
}
|
||||
|
||||
if (url.pathname === '/throw-error') {
|
||||
const error = new Error('oh no!');
|
||||
console.log('This is not worker.js');
|
||||
console.error(error);
|
||||
return new Promise((_, reject) => reject(error));
|
||||
}
|
||||
|
||||
if (url.pathname === '/throw-error-internal') {
|
||||
function myFunctionName() {
|
||||
throw new Error('Oh no!');
|
||||
}
|
||||
|
||||
function anotherFunction() {
|
||||
return myFunctionName();
|
||||
}
|
||||
|
||||
try {
|
||||
anotherFunction();
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
|
||||
return new Promise((_, reject) => reject(new Error('oh no!')));
|
||||
}
|
||||
|
||||
if (url.pathname === '/unhandledrejection') {
|
||||
Promise.reject(new TypeError('captured unhandledrejection error.'));
|
||||
return NextResponse.next();
|
||||
}
|
||||
|
||||
if (pathname.startsWith('/query-params')) {
|
||||
if (pathname.endsWith('/clear')) {
|
||||
const strategy =
|
||||
url.searchParams.get('strategy') === 'rewrite' ? 'rewrite' : 'redirect';
|
||||
|
||||
for (const key of [...url.searchParams.keys()]) {
|
||||
if (!ALLOWED.includes(key)) {
|
||||
url.searchParams.delete(key);
|
||||
}
|
||||
}
|
||||
|
||||
const newPath = url.pathname.replace(/\/clear$/, '');
|
||||
url.pathname = newPath;
|
||||
|
||||
if (strategy === 'redirect') {
|
||||
return NextResponse.redirect(url);
|
||||
} else {
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
}
|
||||
|
||||
const obj = Object.fromEntries([...url.searchParams.entries()]);
|
||||
|
||||
const res = NextResponse.next();
|
||||
res.headers.set('data', JSON.stringify(obj));
|
||||
return res;
|
||||
}
|
||||
|
||||
if (pathname.startsWith('/home')) {
|
||||
if (!request.cookies.get('bucket')) {
|
||||
const bucket = Math.random() >= 0.5 ? 'a' : 'b';
|
||||
url.pathname = `/home/${bucket}`;
|
||||
const response = NextResponse.rewrite(url);
|
||||
response.cookies.set('bucket', bucket);
|
||||
return response;
|
||||
}
|
||||
|
||||
url.pathname = `/home/${request.cookies.get('bucket')}`;
|
||||
return NextResponse.rewrite(url);
|
||||
}
|
||||
|
||||
if (pathname.startsWith('/fetch-subrequest')) {
|
||||
const destinationUrl =
|
||||
url.searchParams.get('url') || 'https://example.vercel.sh';
|
||||
return fetch(destinationUrl, { headers: request.headers });
|
||||
}
|
||||
|
||||
if (url.pathname === '/dynamic/greet') {
|
||||
const res = NextResponse.next();
|
||||
res.headers.set(
|
||||
'data',
|
||||
JSON.stringify({
|
||||
message: url.searchParams.get('greeting') || 'Hi friend',
|
||||
})
|
||||
);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
39
packages/next/test/fixtures/00-middleware-base-path/next.config.js
vendored
Normal file
39
packages/next/test/fixtures/00-middleware-base-path/next.config.js
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
module.exports = {
|
||||
generateBuildId() {
|
||||
return 'testing-build-id';
|
||||
},
|
||||
basePath: '/docs',
|
||||
redirects() {
|
||||
return [
|
||||
{
|
||||
source: '/redirect-me',
|
||||
destination: '/from-next-config',
|
||||
permanent: false,
|
||||
},
|
||||
];
|
||||
},
|
||||
rewrites() {
|
||||
return {
|
||||
beforeFiles: [
|
||||
{
|
||||
source: '/rewrite-before-files',
|
||||
destination: '/somewhere',
|
||||
},
|
||||
],
|
||||
afterFiles: [
|
||||
{
|
||||
source: '/after-file-rewrite',
|
||||
destination: '/about',
|
||||
},
|
||||
{
|
||||
source: '/after-file-rewrite-auto-static',
|
||||
destination: '/home/a',
|
||||
},
|
||||
{
|
||||
source: '/after-file-rewrite-auto-static-dynamic',
|
||||
destination: '/dynamic/first',
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
};
|
||||
11
packages/next/test/fixtures/00-middleware-base-path/package.json
vendored
Normal file
11
packages/next/test/fixtures/00-middleware-base-path/package.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "canary",
|
||||
"react": "latest",
|
||||
"react-dom": "latest"
|
||||
}
|
||||
}
|
||||
111
packages/next/test/fixtures/00-middleware-base-path/pages/[[...slug]].js
vendored
Normal file
111
packages/next/test/fixtures/00-middleware-base-path/pages/[[...slug]].js
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
import Link from 'next/link';
|
||||
|
||||
export default function Page(props) {
|
||||
if (!props.params.slug) {
|
||||
return (
|
||||
<div>
|
||||
<h1>Demo</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<Link href="/home">
|
||||
<a>A/B Testing</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/rewrite-me-to-about">
|
||||
<a>Rewrite to existing page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/redirect-me-to-about">
|
||||
<a>Redirect to existing page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/rewrite">
|
||||
<a>Rewrite to external site</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/redirect">
|
||||
<a>Redirect to external site</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/greetings">
|
||||
<a>Respond with JSON</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/stream-response">
|
||||
<a>Respond with Stream</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/dynamic/greet?greeting=hola">
|
||||
<a>Dynamic Nested Middleware</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/eval">
|
||||
<a>do a eval</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/logs">
|
||||
<a>print some logs</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/fetch">
|
||||
<a>perform a fetch</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/throw-error">
|
||||
<a>throw an error</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/throw-error-internal">
|
||||
<a>throw a controller error</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/timeout">
|
||||
<a>simulate timeout</a>
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<p id="page">[[..slug]]</p>
|
||||
<p id="props">{JSON.stringify(props)}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return {
|
||||
paths: ['/somewhere'],
|
||||
fallback: 'blocking',
|
||||
};
|
||||
}
|
||||
|
||||
export function getStaticProps({ params }) {
|
||||
if (params.slug?.[0] === 'somewhere' && params.slug.length === 1) {
|
||||
return {
|
||||
notFound: true,
|
||||
};
|
||||
}
|
||||
return {
|
||||
props: {
|
||||
params,
|
||||
now: Date.now(),
|
||||
},
|
||||
};
|
||||
}
|
||||
3
packages/next/test/fixtures/00-middleware-base-path/pages/[teamId]/[slug].js
vendored
Normal file
3
packages/next/test/fixtures/00-middleware-base-path/pages/[teamId]/[slug].js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function Page() {
|
||||
return <p>/[teamId]/[slug]</p>;
|
||||
}
|
||||
31
packages/next/test/fixtures/00-middleware-base-path/pages/_sites/[site].js
vendored
Normal file
31
packages/next/test/fixtures/00-middleware-base-path/pages/_sites/[site].js
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
export default function Page(props) {
|
||||
return (
|
||||
<>
|
||||
<p>/_sites/[site]</p>
|
||||
<p id="props">{JSON.stringify(props)}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export function getStaticProps({ params }) {
|
||||
return {
|
||||
props: {
|
||||
params,
|
||||
now: Date.now(),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return {
|
||||
paths: [
|
||||
{
|
||||
params: { site: 'subdomain-1' },
|
||||
},
|
||||
{
|
||||
params: { site: 'subdomain-2' },
|
||||
},
|
||||
],
|
||||
fallback: 'blocking',
|
||||
};
|
||||
}
|
||||
17
packages/next/test/fixtures/00-middleware-base-path/pages/about.js
vendored
Normal file
17
packages/next/test/fixtures/00-middleware-base-path/pages/about.js
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
export default function Main({ message, middleware }) {
|
||||
return (
|
||||
<div>
|
||||
<h1 className="title">About Page</h1>
|
||||
<p className={message}>{message}</p>
|
||||
<p className="middleware">{middleware}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export const getServerSideProps = ({ query }) => ({
|
||||
props: {
|
||||
middleware: query.middleware || '',
|
||||
message: query.message || '',
|
||||
page: 'about',
|
||||
},
|
||||
});
|
||||
4
packages/next/test/fixtures/00-middleware-base-path/pages/api/revalidate.js
vendored
Normal file
4
packages/next/test/fixtures/00-middleware-base-path/pages/api/revalidate.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
export default async function handler(req, res) {
|
||||
await res.revalidate(req.query.urlPath);
|
||||
res.json({ revalidated: true });
|
||||
}
|
||||
3
packages/next/test/fixtures/00-middleware-base-path/pages/dynamic/[id]/index.js
vendored
Normal file
3
packages/next/test/fixtures/00-middleware-base-path/pages/dynamic/[id]/index.js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function Index() {
|
||||
return <p className="title">Dynamic route</p>;
|
||||
}
|
||||
3
packages/next/test/fixtures/00-middleware-base-path/pages/dynamic/static.js
vendored
Normal file
3
packages/next/test/fixtures/00-middleware-base-path/pages/dynamic/static.js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function Index() {
|
||||
return <p className="title">static route</p>;
|
||||
}
|
||||
16
packages/next/test/fixtures/00-middleware-base-path/pages/fetch-subrequest/index.js
vendored
Normal file
16
packages/next/test/fixtures/00-middleware-base-path/pages/fetch-subrequest/index.js
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
export default function Main({ message, middleware }) {
|
||||
return (
|
||||
<div>
|
||||
<h1 className="title">About Page</h1>
|
||||
<p className={message}>{message}</p>
|
||||
<p className="middleware">{middleware}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export const getServerSideProps = ({ query }) => ({
|
||||
props: {
|
||||
middleware: query.middleware || '',
|
||||
message: query.message || '',
|
||||
},
|
||||
});
|
||||
3
packages/next/test/fixtures/00-middleware-base-path/pages/home/a.js
vendored
Normal file
3
packages/next/test/fixtures/00-middleware-base-path/pages/home/a.js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function Home() {
|
||||
return <h1>Home A</h1>;
|
||||
}
|
||||
3
packages/next/test/fixtures/00-middleware-base-path/pages/home/b.js
vendored
Normal file
3
packages/next/test/fixtures/00-middleware-base-path/pages/home/b.js
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function Home() {
|
||||
return <h1>Home B</h1>;
|
||||
}
|
||||
120
packages/next/test/fixtures/00-middleware-base-path/vercel.json
vendored
Normal file
120
packages/next/test/fixtures/00-middleware-base-path/vercel.json
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{
|
||||
"src": "package.json",
|
||||
"use": "@vercel/next"
|
||||
}
|
||||
],
|
||||
"probes": [
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/dynamic/static.json",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"x-nextjs-data": 1
|
||||
},
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/dynamic/static"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/team-1/slug-1.json",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"x-nextjs-data": 1
|
||||
},
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/[teamId]/[slug]"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/dynamic/id-1.json",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"x-nextjs-data": 1
|
||||
},
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/dynamic/[id]"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/rewrite-to-site.json",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"x-nextjs-data": 1
|
||||
},
|
||||
"mustContain": "site\":\"subdomain-1\"",
|
||||
"mustNotContain": "<html>"
|
||||
},
|
||||
{
|
||||
"path": "/docs/redirect-me",
|
||||
"status": 307,
|
||||
"responseHeaders": {
|
||||
"Location": "/from-next-config/"
|
||||
},
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/docs/rewrite-before-files",
|
||||
"status": 404,
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/docs/somewhere",
|
||||
"status": 307,
|
||||
"responseHeaders": {
|
||||
"Location": "/from-middleware/"
|
||||
},
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/docs/after-file-rewrite",
|
||||
"status": 200,
|
||||
"mustContain": "About Page"
|
||||
},
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/after-file-rewrite.json",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"x-nextjs-data": "1"
|
||||
},
|
||||
"mustContain": "page\":\"about\""
|
||||
},
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/after-file-rewrite-auto-static-dynamic.json",
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"x-nextjs-data": "1"
|
||||
},
|
||||
"responseHeaders": {
|
||||
"x-matched-path": "/dynamic/[id]"
|
||||
},
|
||||
"mustContain": "{}"
|
||||
},
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/redirect-me.json",
|
||||
"status": 307,
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
},
|
||||
"responseHeaders": {
|
||||
"Location": "/from-middleware/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "/docs/_next/data/testing-build-id/_sites/subdomain-1.json",
|
||||
"status": 200,
|
||||
"fetchOptions": {
|
||||
"redirect": "manual"
|
||||
},
|
||||
"mustNotContain": "<html>",
|
||||
"mustContain": "\"site\":\"subdomain-1\""
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -66,4 +66,60 @@ describe(`${__dirname.split(path.sep).pop()}`, () => {
|
||||
});
|
||||
}, 'success');
|
||||
});
|
||||
|
||||
it('should revalidate content correctly for optional catch-all route', async () => {
|
||||
const propsFromHtml = async () => {
|
||||
let res = await fetch(`${ctx.deploymentUrl}/financial`);
|
||||
let $ = cheerio.load(await res.text());
|
||||
let props = JSON.parse($('#props').text());
|
||||
return props;
|
||||
};
|
||||
let props = await propsFromHtml();
|
||||
expect(isNaN(props.now)).toBe(false);
|
||||
|
||||
const { pageProps: data } = await fetch(
|
||||
`${ctx.deploymentUrl}/_next/data/testing-build-id/financial.json?slug=financial`
|
||||
).then(res => res.json());
|
||||
|
||||
expect(isNaN(data.now)).toBe(false);
|
||||
|
||||
const revalidateRes = await fetch(
|
||||
`${ctx.deploymentUrl}/api/revalidate?urlPath=/financial`
|
||||
);
|
||||
expect(revalidateRes.status).toBe(200);
|
||||
expect(await revalidateRes.json()).toEqual({ revalidated: true });
|
||||
|
||||
await check(async () => {
|
||||
const newProps = await propsFromHtml();
|
||||
console.log({ props, newProps });
|
||||
|
||||
if (isNaN(newProps.now)) {
|
||||
throw new Error();
|
||||
}
|
||||
return newProps.now !== props.now
|
||||
? 'success'
|
||||
: JSON.stringify({
|
||||
newProps,
|
||||
props,
|
||||
});
|
||||
}, 'success');
|
||||
|
||||
await check(async () => {
|
||||
const { pageProps: newData } = await fetch(
|
||||
`${ctx.deploymentUrl}/_next/data/testing-build-id/financial.json?slug=financial`
|
||||
).then(res => res.json());
|
||||
|
||||
console.log({ newData, data });
|
||||
|
||||
if (isNaN(newData.now)) {
|
||||
throw new Error();
|
||||
}
|
||||
return newData.now !== data.now
|
||||
? 'success'
|
||||
: JSON.stringify({
|
||||
newData,
|
||||
data,
|
||||
});
|
||||
}, 'success');
|
||||
});
|
||||
});
|
||||
|
||||
111
packages/next/test/fixtures/00-middleware/pages/[[...slug]].js
vendored
Normal file
111
packages/next/test/fixtures/00-middleware/pages/[[...slug]].js
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
import Link from 'next/link';
|
||||
|
||||
export default function Page(props) {
|
||||
if (!props.params.slug) {
|
||||
return (
|
||||
<div>
|
||||
<h1>Demo</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<Link href="/home">
|
||||
<a>A/B Testing</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/rewrite-me-to-about">
|
||||
<a>Rewrite to existing page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/redirect-me-to-about">
|
||||
<a>Redirect to existing page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/rewrite">
|
||||
<a>Rewrite to external site</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/redirect">
|
||||
<a>Redirect to external site</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/greetings">
|
||||
<a>Respond with JSON</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/stream-response">
|
||||
<a>Respond with Stream</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/dynamic/greet?greeting=hola">
|
||||
<a>Dynamic Nested Middleware</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/eval">
|
||||
<a>do a eval</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/logs">
|
||||
<a>print some logs</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/fetch">
|
||||
<a>perform a fetch</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/throw-error">
|
||||
<a>throw an error</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/throw-error-internal">
|
||||
<a>throw a controller error</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/timeout">
|
||||
<a>simulate timeout</a>
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<p id="page">[[..slug]]</p>
|
||||
<p id="props">{JSON.stringify(props)}</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export function getStaticPaths() {
|
||||
return {
|
||||
paths: ['/somewhere'],
|
||||
fallback: 'blocking',
|
||||
};
|
||||
}
|
||||
|
||||
export function getStaticProps({ params }) {
|
||||
if (params.slug?.[0] === 'somewhere' && params.slug.length === 1) {
|
||||
return {
|
||||
notFound: true,
|
||||
};
|
||||
}
|
||||
return {
|
||||
props: {
|
||||
params,
|
||||
now: Date.now(),
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
import Link from 'next/link';
|
||||
|
||||
export default function Index() {
|
||||
return (
|
||||
<div>
|
||||
<h1>Demo</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<Link href="/home">
|
||||
<a>A/B Testing</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/rewrite-me-to-about">
|
||||
<a>Rewrite to existing page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/redirect-me-to-about">
|
||||
<a>Redirect to existing page</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/rewrite">
|
||||
<a>Rewrite to external site</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/redirect">
|
||||
<a>Redirect to external site</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/greetings">
|
||||
<a>Respond with JSON</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/stream-response">
|
||||
<a>Respond with Stream</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/dynamic/greet?greeting=hola">
|
||||
<a>Dynamic Nested Middleware</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/eval">
|
||||
<a>do a eval</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/logs">
|
||||
<a>print some logs</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/fetch">
|
||||
<a>perform a fetch</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/throw-error">
|
||||
<a>throw an error</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/throw-error-internal">
|
||||
<a>throw a controller error</a>
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/timeout">
|
||||
<a>simulate timeout</a>
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/node",
|
||||
"version": "2.5.22",
|
||||
"version": "2.5.25",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
|
||||
@@ -31,10 +31,10 @@
|
||||
"dependencies": {
|
||||
"@edge-runtime/vm": "1.1.0-beta.36",
|
||||
"@types/node": "*",
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/node-bridge": "3.0.0",
|
||||
"@vercel/static-config": "2.0.3",
|
||||
"edge-runtime": "1.1.0-beta.37",
|
||||
"edge-runtime": "1.1.0-beta.38",
|
||||
"esbuild": "0.14.47",
|
||||
"exit-hook": "2.2.1",
|
||||
"node-fetch": "2.6.7",
|
||||
|
||||
@@ -20,7 +20,7 @@ export type VercelResponse = ServerResponse & {
|
||||
export type VercelApiHandler = (
|
||||
req: VercelRequest,
|
||||
res: VercelResponse
|
||||
) => void;
|
||||
) => void | Promise<void>;
|
||||
|
||||
/** @deprecated Use VercelRequestCookies instead. */
|
||||
export type NowRequestCookies = VercelRequestCookies;
|
||||
|
||||
@@ -141,9 +141,11 @@ export function register(opts: Options = {}): Register {
|
||||
//eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
const ts: typeof _ts = require_(compiler);
|
||||
if (compiler.startsWith(nowNodeBase)) {
|
||||
console.log('Using TypeScript ' + ts.version + ' (no local tsconfig.json)');
|
||||
console.log(
|
||||
`Using built-in TypeScript ${ts.version} since "typescript" missing from "devDependencies"`
|
||||
);
|
||||
} else {
|
||||
console.log('Using TypeScript ' + ts.version + ' (local user-provided)');
|
||||
console.log(`Using TypeScript ${ts.version} (local user-provided)`);
|
||||
}
|
||||
const transformers = options.transformers || undefined;
|
||||
const readFile = options.readFile || ts.sys.readFile;
|
||||
|
||||
8
packages/node/test/fixtures/15-helpers/ts/async-handler.ts
vendored
Normal file
8
packages/node/test/fixtures/15-helpers/ts/async-handler.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import { VercelApiHandler } from './types';
|
||||
|
||||
const listener: VercelApiHandler = async (req, res) => {
|
||||
res.status(200);
|
||||
res.send('hello:RANDOMNESS_PLACEHOLDER');
|
||||
};
|
||||
|
||||
export default listener;
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/python",
|
||||
"version": "3.1.21",
|
||||
"version": "3.1.22",
|
||||
"main": "./dist/index.js",
|
||||
"license": "MIT",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/python",
|
||||
@@ -22,7 +22,7 @@
|
||||
"devDependencies": {
|
||||
"@types/execa": "^0.9.0",
|
||||
"@types/jest": "27.4.1",
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"execa": "^1.0.0",
|
||||
"typescript": "4.3.4"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/redwood",
|
||||
"version": "1.0.30",
|
||||
"version": "1.0.31",
|
||||
"main": "./dist/index.js",
|
||||
"license": "MIT",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -27,6 +27,6 @@
|
||||
"@types/aws-lambda": "8.10.19",
|
||||
"@types/node": "*",
|
||||
"@types/semver": "6.0.0",
|
||||
"@vercel/build-utils": "5.5.4"
|
||||
"@vercel/build-utils": "5.5.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/remix",
|
||||
"version": "1.0.31",
|
||||
"version": "1.0.32",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"homepage": "https://vercel.com/docs",
|
||||
@@ -25,7 +25,7 @@
|
||||
"devDependencies": {
|
||||
"@types/jest": "27.5.1",
|
||||
"@types/node": "*",
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"typescript": "4.6.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@vercel/ruby",
|
||||
"author": "Nathan Cahill <nathan@nathancahill.com>",
|
||||
"version": "1.3.38",
|
||||
"version": "1.3.39",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/ruby",
|
||||
@@ -22,7 +22,7 @@
|
||||
"devDependencies": {
|
||||
"@types/fs-extra": "8.0.0",
|
||||
"@types/semver": "6.0.0",
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"execa": "2.0.4",
|
||||
"fs-extra": "^7.0.1",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@vercel/static-build",
|
||||
"version": "1.0.30",
|
||||
"version": "1.0.32",
|
||||
"license": "MIT",
|
||||
"main": "./dist/index",
|
||||
"homepage": "https://vercel.com/docs/build-step",
|
||||
@@ -36,8 +36,8 @@
|
||||
"@types/ms": "0.7.31",
|
||||
"@types/node-fetch": "2.5.4",
|
||||
"@types/promise-timeout": "1.3.0",
|
||||
"@vercel/build-utils": "5.5.4",
|
||||
"@vercel/frameworks": "1.1.6",
|
||||
"@vercel/build-utils": "5.5.5",
|
||||
"@vercel/frameworks": "1.1.8",
|
||||
"@vercel/ncc": "0.24.0",
|
||||
"@vercel/routing-utils": "2.0.2",
|
||||
"fs-extra": "10.0.0",
|
||||
|
||||
@@ -5473,10 +5473,10 @@ ecc-jsbn@~0.1.1:
|
||||
jsbn "~0.1.0"
|
||||
safer-buffer "^2.1.0"
|
||||
|
||||
edge-runtime@1.1.0-beta.37:
|
||||
version "1.1.0-beta.37"
|
||||
resolved "https://registry.yarnpkg.com/edge-runtime/-/edge-runtime-1.1.0-beta.37.tgz#e88eafba4f3630990468bb53efca6f48d76063c4"
|
||||
integrity sha512-IP0xYNmp0XXoXVnrAf/e67224ZkMUUBMyUUohVxWWI5XdyetIGRNWp3GifDy3LpbuE02yv42rgtoE+tm+whcLA==
|
||||
edge-runtime@1.1.0-beta.38:
|
||||
version "1.1.0-beta.38"
|
||||
resolved "https://registry.yarnpkg.com/edge-runtime/-/edge-runtime-1.1.0-beta.38.tgz#f15f136a553e342744aae1a345368bc2c6298a4e"
|
||||
integrity sha512-MY6/XcnGGuvLmwAR6PQizjhW/ABjVnmpJQmhJRacmo7K7LhuevszrPFVf0GmwVrr9PUahrvgmZYydQLSTpS5AA==
|
||||
dependencies:
|
||||
"@edge-runtime/format" "1.1.0-beta.33"
|
||||
"@edge-runtime/vm" "1.1.0-beta.36"
|
||||
|
||||
Reference in New Issue
Block a user