From 45c652624dcc459bf35c1b2df96583dc1d420a90 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 22 Dec 2022 12:20:21 +0000 Subject: [PATCH 01/31] fix: don't use ISR for appDir pages --- demos/default/.vscode/settings.json | 4 ++ .../default/app/blog/[author]/[slug]/page.tsx | 60 ++++++++++++++++ demos/default/app/blog/[author]/layout.js | 14 ++++ demos/default/app/blog/[author]/page.js | 41 +++++++++++ demos/default/app/layout.js | 10 +++ demos/default/next.config.js | 1 + demos/default/tsconfig.json | 12 +++- package-lock.json | 70 ++++++++----------- packages/runtime/src/helpers/edge.ts | 4 ++ packages/runtime/src/helpers/files.ts | 10 ++- packages/runtime/src/helpers/redirects.ts | 8 ++- 11 files changed, 187 insertions(+), 47 deletions(-) create mode 100644 demos/default/.vscode/settings.json create mode 100644 demos/default/app/blog/[author]/[slug]/page.tsx create mode 100644 demos/default/app/blog/[author]/layout.js create mode 100644 demos/default/app/blog/[author]/page.js create mode 100644 demos/default/app/layout.js diff --git a/demos/default/.vscode/settings.json b/demos/default/.vscode/settings.json new file mode 100644 index 0000000000..d3fdae9a69 --- /dev/null +++ b/demos/default/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "typescript.tsdk": "../../node_modules/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true +} \ No newline at end of file diff --git a/demos/default/app/blog/[author]/[slug]/page.tsx b/demos/default/app/blog/[author]/[slug]/page.tsx new file mode 100644 index 0000000000..dd4b35de65 --- /dev/null +++ b/demos/default/app/blog/[author]/[slug]/page.tsx @@ -0,0 +1,60 @@ +import { notFound } from 'next/navigation' + +export const revalidate = null + +export const dynamicParams = true + +export default function Page({ params }) { + if (params.author === 'matt') { + return notFound() + } + return ( + <> +

/blog/[author]/[slug]

+

{JSON.stringify(params)}

+

{Date.now()}

+ + ) +} + +export function generateStaticParams({ params }: any) { + console.log('/blog/[author]/[slug] generateStaticParams', JSON.stringify(params)) + + switch (params.author) { + case 'erica': { + return [ + { + slug: 'first-post', + }, + ] + } + case 'sarah': { + return [ + { + slug: 'second-post', + }, + ] + } + case 'nick': { + return [ + { + slug: 'first-post', + }, + { + slug: 'second-post', + }, + ] + } + case 'rob': { + return [ + { + slug: 'second-post', + }, + ] + } + + default: { + throw new Error(`unexpected author param received ${params.author}`) + } + } +} diff --git a/demos/default/app/blog/[author]/layout.js b/demos/default/app/blog/[author]/layout.js new file mode 100644 index 0000000000..17fe74e233 --- /dev/null +++ b/demos/default/app/blog/[author]/layout.js @@ -0,0 +1,14 @@ +export default function Layout({ children, params }) { + return ( + <> +

{JSON.stringify(params)}

+ {children} + + ) +} + +export function generateStaticParams(params) { + console.log('/blog/[author] generateStaticParams', JSON.stringify(params)) + + return [{ author: 'nick' }, { author: 'sarah' }, { author: 'rob' }, { author: 'erica' }] +} diff --git a/demos/default/app/blog/[author]/page.js b/demos/default/app/blog/[author]/page.js new file mode 100644 index 0000000000..0322512be7 --- /dev/null +++ b/demos/default/app/blog/[author]/page.js @@ -0,0 +1,41 @@ +import Link from 'next/link' + +export const dynamicParams = false + +export default async function Page({ params }) { + await fetch('https://example.vercel.sh', { + next: { revalidate: 10 }, + }) + return ( + <> +

/blog/[author]

+

{JSON.stringify(params)}

+

{Date.now()}

+ + /blog/erica + +
+ + /blog/sarah + +
+ + /blog/nick + +
+ + + /blog/erica/first-post + +
+ + /blog/sarah/second-post + +
+ + /blog/nick/first-post + +
+ + ) +} diff --git a/demos/default/app/layout.js b/demos/default/app/layout.js new file mode 100644 index 0000000000..f37ea744b8 --- /dev/null +++ b/demos/default/app/layout.js @@ -0,0 +1,10 @@ +export default function Layout({ children }) { + return ( + + + my static blog + + {children} + + ) +} diff --git a/demos/default/next.config.js b/demos/default/next.config.js index 33ae770631..890533b532 100644 --- a/demos/default/next.config.js +++ b/demos/default/next.config.js @@ -84,5 +84,6 @@ module.exports = { }, experimental: { optimizeCss: false, + appDir: true, }, } diff --git a/demos/default/tsconfig.json b/demos/default/tsconfig.json index b57e49e103..389aa9583c 100644 --- a/demos/default/tsconfig.json +++ b/demos/default/tsconfig.json @@ -11,14 +11,20 @@ "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve" + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ] }, "include": [ "next-env.d.ts", "**/*.ts", - "**/*.tsx" + "**/*.tsx", + ".next/types/**/*.ts" ], "exclude": [ "node_modules" ] -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index d0d986aeca..565d09e332 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5580,13 +5580,13 @@ "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "devOptional": true + "dev": true }, "node_modules/@types/react": { "version": "18.0.26", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "devOptional": true, + "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5612,7 +5612,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "devOptional": true + "dev": true }, "node_modules/@types/semver": { "version": "7.3.13", @@ -9399,7 +9399,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "devOptional": true + "dev": true }, "node_modules/custom-routes": { "resolved": "demos/custom-routes", @@ -13729,7 +13729,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "devOptional": true + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -27757,7 +27757,7 @@ "requires": { "@netlify/edge-functions": "^2.0.0", "@types/node": "^17.0.25", - "next": "^13.0.6", + "next": "^13.0.7", "npm-run-all": "^4.1.5", "typescript": "^4.6.3" } @@ -27789,7 +27789,7 @@ "globby": "^11.0.4", "merge-stream": "^2.0.0", "moize": "^6.1.0", - "next": "^13.0.6", + "next": "^13.0.7", "node-fetch": "^2.6.6", "node-stream-zip": "^1.15.0", "npm-run-all": "^4.1.5", @@ -28587,13 +28587,13 @@ "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "devOptional": true + "dev": true }, "@types/react": { "version": "18.0.26", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", - "devOptional": true, + "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -28619,7 +28619,7 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "devOptional": true + "dev": true }, "@types/semver": { "version": "7.3.13", @@ -28939,8 +28939,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -28997,8 +28996,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "dev": true, - "requires": {} + "dev": true }, "ansi-align": { "version": "3.0.1", @@ -29605,7 +29603,7 @@ "@types/node": "^17.0.25", "husky": "^7.0.4", "if-env": "^1.0.4", - "next": "^13.0.6", + "next": "^13.0.7", "npm-run-all": "^4.1.5", "typescript": "^4.6.3" } @@ -30986,8 +30984,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.2.0.tgz", "integrity": "sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==", - "dev": true, - "requires": {} + "dev": true }, "cp-file": { "version": "10.0.0", @@ -31510,7 +31507,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "devOptional": true + "dev": true }, "custom-routes": { "version": "file:demos/custom-routes", @@ -31523,7 +31520,7 @@ "@types/react": "^18.0.25", "husky": "^7.0.4", "if-env": "^1.0.4", - "next": "^13.0.6", + "next": "^13.0.7", "npm-run-all": "^4.1.5", "typescript": "^4.7.4" } @@ -31810,7 +31807,7 @@ "critters": "^0.0.16", "husky": "^7.0.4", "if-env": "^1.0.4", - "next": "^13.0.6", + "next": "^13.0.7", "npm-run-all": "^4.1.5", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -32673,15 +32670,13 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} + "dev": true }, "eslint-config-standard": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", - "dev": true, - "requires": {} + "dev": true }, "eslint-formatter-codeframe": { "version": "7.32.1", @@ -33127,8 +33122,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-react": { "version": "7.31.10", @@ -33186,8 +33180,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-unicorn": { "version": "43.0.2", @@ -34779,7 +34772,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "devOptional": true + "dev": true }, "import-fresh": { "version": "3.3.0", @@ -35950,8 +35943,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "27.5.1", @@ -37666,7 +37658,7 @@ "@types/react": "^18.0.25", "husky": "^7.0.4", "isomorphic-unfetch": "^3.1.0", - "next": "^13.0.6", + "next": "^13.0.7", "npm-run-all": "^4.1.5", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -38193,7 +38185,7 @@ "@types/node": "^17.0.14", "@types/react": "^18.0.0", "husky": "^7.0.4", - "next": "^13.0.6", + "next": "^13.0.7", "next-auth": "^4.15.0", "nodemailer": "^6.6.3", "npm-run-all": "^4.1.5", @@ -38212,7 +38204,7 @@ "@types/node": "^17.0.25", "husky": "^7.0.4", "if-env": "^1.0.4", - "next": "^13.0.6", + "next": "^13.0.7", "npm-run-all": "^4.1.5", "typescript": "^4.6.3" } @@ -38220,7 +38212,7 @@ "next-with-edge-functions": { "version": "file:demos/next-with-edge-functions", "requires": { - "next": "^13.0.3", + "next": "^13.0.7", "react": "^18.0.2", "react-dom": "^18.0.2" } @@ -41208,7 +41200,7 @@ "@types/node": "^17.0.25", "husky": "^7.0.4", "if-env": "^1.0.4", - "next": "^13.0.6", + "next": "^13.0.7", "npm-run-all": "^4.1.5", "typescript": "^4.6.3" } @@ -42223,8 +42215,7 @@ "ws": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==" } } }, @@ -42729,8 +42720,7 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} + "dev": true }, "xdg-basedir": { "version": "4.0.0", diff --git a/packages/runtime/src/helpers/edge.ts b/packages/runtime/src/helpers/edge.ts index 927ac58783..8896bc7470 100644 --- a/packages/runtime/src/helpers/edge.ts +++ b/packages/runtime/src/helpers/edge.ts @@ -5,6 +5,7 @@ import type { NetlifyConfig, NetlifyPluginConstants } from '@netlify/build' import { greenBright } from 'chalk' import destr from 'destr' import { copy, copyFile, emptyDir, ensureDir, readJson, writeJSON, writeJson } from 'fs-extra' +import type { SsgRoute } from 'next/dist/build' import type { MiddlewareManifest } from 'next/dist/build/webpack/plugins/middleware-plugin' import type { RouteHas } from 'next/dist/lib/load-custom-routes' import { outdent } from 'outdent' @@ -70,6 +71,9 @@ const maybeLoadJson = (path: string): Promise | null => { } } +export const isAppDirRoute = ({ srcRoute }: SsgRoute, manifest: Record | null): boolean => + Boolean(manifest) && Object.values(manifest).includes(srcRoute) + export const loadMiddlewareManifest = (netlifyConfig: NetlifyConfig): Promise => maybeLoadJson(resolve(netlifyConfig.build.publish, 'server', 'middleware-manifest.json')) diff --git a/packages/runtime/src/helpers/files.ts b/packages/runtime/src/helpers/files.ts index 93f772a875..8a42f54677 100644 --- a/packages/runtime/src/helpers/files.ts +++ b/packages/runtime/src/helpers/files.ts @@ -13,6 +13,7 @@ import slash from 'slash' import { MINIMUM_REVALIDATE_SECONDS, DIVIDER } from '../constants' import { NextConfig } from './config' +import { isAppDirRoute, loadAppPathRoutesManifest } from './edge' import { Rewrites, RoutesManifest } from './types' import { findModuleFromBase } from './utils' @@ -99,17 +100,20 @@ export const moveStaticPages = async ({ join(netlifyConfig.build.publish, 'routes-manifest.json'), ) + const appPathRoutes = await loadAppPathRoutesManifest(netlifyConfig) + const isrFiles = new Set() const shortRevalidateRoutes: Array<{ Route: string; Revalidate: number }> = [] - Object.entries(prerenderManifest.routes).forEach(([route, { initialRevalidateSeconds }]) => { + Object.entries(prerenderManifest.routes).forEach(([route, ssgRoute]) => { + const { initialRevalidateSeconds } = ssgRoute if (initialRevalidateSeconds) { // Find all files used by ISR routes const trimmedPath = route === '/' ? 'index' : route.slice(1) isrFiles.add(`${trimmedPath}.html`) isrFiles.add(`${trimmedPath}.json`) - if (initialRevalidateSeconds < MINIMUM_REVALIDATE_SECONDS) { + if (initialRevalidateSeconds < MINIMUM_REVALIDATE_SECONDS && !isAppDirRoute(ssgRoute, appPathRoutes)) { shortRevalidateRoutes.push({ Route: route, Revalidate: initialRevalidateSeconds }) } } @@ -138,7 +142,7 @@ export const moveStaticPages = async ({ } } // Move all static files, except error documents and nft manifests - const pages = await globby(['{app,pages}/**/*.{html,json,rsc}', '!**/(500|404|*.js.nft).{html,json}'], { + const pages = await globby(['{app,pages}/**/*.{html,json}', '!**/(500|404|*.js.nft).{html,json}'], { cwd: outputDir, dot: true, }) diff --git a/packages/runtime/src/helpers/redirects.ts b/packages/runtime/src/helpers/redirects.ts index 3781712e95..57eff6ecf9 100644 --- a/packages/runtime/src/helpers/redirects.ts +++ b/packages/runtime/src/helpers/redirects.ts @@ -8,6 +8,7 @@ import { join } from 'pathe' import { HANDLER_FUNCTION_PATH, HIDDEN_PATHS, ODB_FUNCTION_PATH } from '../constants' +import { isAppDirRoute, loadAppPathRoutesManifest } from './edge' import { getMiddleware } from './files' import { ApiRouteConfig } from './functions' import { RoutesManifest } from './types' @@ -265,7 +266,12 @@ export const generateRedirects = async ({ netlifyConfig.redirects.push(...generateMiddlewareRewrites({ basePath, i18n, middleware, buildId })) - const staticRouteEntries = Object.entries(prerenderedStaticRoutes) + const appPathRoutes = await loadAppPathRoutesManifest(netlifyConfig) + + // appDir routes don't use ISR + const staticRouteEntries = Object.entries(prerenderedStaticRoutes).filter( + ([, route]) => !isAppDirRoute(route, appPathRoutes), + ) const is404Isr = staticRouteEntries.some( ([route, { initialRevalidateSeconds }]) => is404Route(route, i18n) && initialRevalidateSeconds !== false, From ce6c963692c989f87d45cbc8d4ffcc030e512588 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 22 Dec 2022 14:28:00 +0000 Subject: [PATCH 02/31] chore: correct redirects --- demos/default/app/blog/[author]/page.js | 4 +- packages/runtime/src/helpers/edge.ts | 7 +- packages/runtime/src/helpers/files.ts | 11 ++- packages/runtime/src/helpers/redirects.ts | 19 ++++- packages/runtime/src/helpers/utils.ts | 33 +++++---- test/__snapshots__/index.spec.js.snap | 90 ++++++++++++++++++++--- 6 files changed, 128 insertions(+), 36 deletions(-) diff --git a/demos/default/app/blog/[author]/page.js b/demos/default/app/blog/[author]/page.js index 0322512be7..39489ea91f 100644 --- a/demos/default/app/blog/[author]/page.js +++ b/demos/default/app/blog/[author]/page.js @@ -1,9 +1,7 @@ import Link from 'next/link' -export const dynamicParams = false - export default async function Page({ params }) { - await fetch('https://example.vercel.sh', { + await fetch('http://example.com', { next: { revalidate: 10 }, }) return ( diff --git a/packages/runtime/src/helpers/edge.ts b/packages/runtime/src/helpers/edge.ts index 8896bc7470..72560cdb8c 100644 --- a/packages/runtime/src/helpers/edge.ts +++ b/packages/runtime/src/helpers/edge.ts @@ -12,7 +12,7 @@ import { outdent } from 'outdent' import { getRequiredServerFiles, NextConfig } from './config' import { makeLocaleOptional, stripLookahead } from './matchers' -import { RoutesManifest } from './types' +import { DynamicRoute, RoutesManifest } from './types' // This is the format as of next@12.2 interface EdgeFunctionDefinitionV1 { @@ -71,9 +71,12 @@ const maybeLoadJson = (path: string): Promise | null => { } } -export const isAppDirRoute = ({ srcRoute }: SsgRoute, manifest: Record | null): boolean => +export const isStaticAppDirRoute = ({ srcRoute }: SsgRoute, manifest: Record | null): boolean => Boolean(manifest) && Object.values(manifest).includes(srcRoute) +export const isDynamicAppDirRoute = ({ page }: DynamicRoute, manifest: Record | null): boolean => + Boolean(manifest) && Object.values(manifest).includes(page) + export const loadMiddlewareManifest = (netlifyConfig: NetlifyConfig): Promise => maybeLoadJson(resolve(netlifyConfig.build.publish, 'server', 'middleware-manifest.json')) diff --git a/packages/runtime/src/helpers/files.ts b/packages/runtime/src/helpers/files.ts index 8a42f54677..57841eb6bd 100644 --- a/packages/runtime/src/helpers/files.ts +++ b/packages/runtime/src/helpers/files.ts @@ -13,7 +13,7 @@ import slash from 'slash' import { MINIMUM_REVALIDATE_SECONDS, DIVIDER } from '../constants' import { NextConfig } from './config' -import { isAppDirRoute, loadAppPathRoutesManifest } from './edge' +import { isStaticAppDirRoute, loadAppPathRoutesManifest } from './edge' import { Rewrites, RoutesManifest } from './types' import { findModuleFromBase } from './utils' @@ -108,12 +108,15 @@ export const moveStaticPages = async ({ Object.entries(prerenderManifest.routes).forEach(([route, ssgRoute]) => { const { initialRevalidateSeconds } = ssgRoute - if (initialRevalidateSeconds) { + const trimmedPath = route === '/' ? 'index' : route.slice(1) + + if (isStaticAppDirRoute(ssgRoute, appPathRoutes)) { + isrFiles.add(`${trimmedPath}.html`) + } else if (initialRevalidateSeconds) { // Find all files used by ISR routes - const trimmedPath = route === '/' ? 'index' : route.slice(1) isrFiles.add(`${trimmedPath}.html`) isrFiles.add(`${trimmedPath}.json`) - if (initialRevalidateSeconds < MINIMUM_REVALIDATE_SECONDS && !isAppDirRoute(ssgRoute, appPathRoutes)) { + if (initialRevalidateSeconds < MINIMUM_REVALIDATE_SECONDS) { shortRevalidateRoutes.push({ Route: route, Revalidate: initialRevalidateSeconds }) } } diff --git a/packages/runtime/src/helpers/redirects.ts b/packages/runtime/src/helpers/redirects.ts index 57eff6ecf9..8ef439a327 100644 --- a/packages/runtime/src/helpers/redirects.ts +++ b/packages/runtime/src/helpers/redirects.ts @@ -8,7 +8,7 @@ import { join } from 'pathe' import { HANDLER_FUNCTION_PATH, HIDDEN_PATHS, ODB_FUNCTION_PATH } from '../constants' -import { isAppDirRoute, loadAppPathRoutesManifest } from './edge' +import { isDynamicAppDirRoute, isStaticAppDirRoute, loadAppPathRoutesManifest } from './edge' import { getMiddleware } from './files' import { ApiRouteConfig } from './functions' import { RoutesManifest } from './types' @@ -189,6 +189,7 @@ const generateDynamicRewrites = ({ buildId, i18n, is404Isr, + appPathRoutes, }: { dynamicRoutes: RoutesManifest['dynamicRoutes'] prerenderedDynamicRoutes: PrerenderManifest['dynamicRoutes'] @@ -197,12 +198,14 @@ const generateDynamicRewrites = ({ buildId: string middleware: Array is404Isr: boolean + appPathRoutes?: Record }): { dynamicRoutesThatMatchMiddleware: Array dynamicRewrites: NetlifyConfig['redirects'] } => { const dynamicRewrites: NetlifyConfig['redirects'] = [] const dynamicRoutesThatMatchMiddleware: Array = [] + dynamicRoutes.forEach((route) => { if (isApiRoute(route.page) || is404Route(route.page, i18n)) { return @@ -210,6 +213,17 @@ const generateDynamicRewrites = ({ if (route.page in prerenderedDynamicRoutes) { if (matchesMiddleware(middleware, route.page)) { dynamicRoutesThatMatchMiddleware.push(route.page) + } else if (isDynamicAppDirRoute(route, appPathRoutes)) { + dynamicRewrites.push( + ...redirectsForNextRoute({ + route: route.page, + buildId, + basePath, + to: HANDLER_FUNCTION_PATH, + i18n, + withData: false, + }), + ) } else if (prerenderedDynamicRoutes[route.page].fallback === false && !is404Isr) { dynamicRewrites.push(...redirectsForNext404Route({ route: route.page, buildId, basePath, i18n })) } else { @@ -270,7 +284,7 @@ export const generateRedirects = async ({ // appDir routes don't use ISR const staticRouteEntries = Object.entries(prerenderedStaticRoutes).filter( - ([, route]) => !isAppDirRoute(route, appPathRoutes), + ([, route]) => !isStaticAppDirRoute(route, appPathRoutes), ) const is404Isr = staticRouteEntries.some( @@ -310,6 +324,7 @@ export const generateRedirects = async ({ buildId, i18n, is404Isr, + appPathRoutes, }) netlifyConfig.redirects.push(...dynamicRewrites) routesThatMatchMiddleware.push(...dynamicRoutesThatMatchMiddleware) diff --git a/packages/runtime/src/helpers/utils.ts b/packages/runtime/src/helpers/utils.ts index 2a12ff2a50..778ae4dd08 100644 --- a/packages/runtime/src/helpers/utils.ts +++ b/packages/runtime/src/helpers/utils.ts @@ -63,10 +63,15 @@ export const toNetlifyRoute = (nextRoute: string): Array => { ) } -export const netlifyRoutesForNextRouteWithData = ({ route, dataRoute }: { route: string; dataRoute: string }) => [ - ...toNetlifyRoute(dataRoute), - ...toNetlifyRoute(route), -] +export const generateNetlifyRoutes = ({ + route, + dataRoute, + withData = true, +}: { + route: string + dataRoute: string + withData: boolean +}) => [...(withData ? toNetlifyRoute(dataRoute) : []), ...toNetlifyRoute(route)] export const routeToDataRoute = (route: string, buildId: string, locale?: string) => `/_next/data/${buildId}${locale ? `/${locale}` : ''}${route === '/' ? '/index' : route}.json` @@ -75,14 +80,13 @@ const netlifyRoutesForNextRoute = ( route: string, buildId: string, i18n?: I18n, + withData = true, ): Array<{ redirect: string; locale: string | false }> => { if (!i18n?.locales?.length) { - return netlifyRoutesForNextRouteWithData({ route, dataRoute: routeToDataRoute(route, buildId) }).map( - (redirect) => ({ - redirect, - locale: false, - }), - ) + return generateNetlifyRoutes({ route, dataRoute: routeToDataRoute(route, buildId), withData }).map((redirect) => ({ + redirect, + locale: false, + })) } const { locales, defaultLocale } = i18n const routes = [] @@ -92,9 +96,10 @@ const netlifyRoutesForNextRoute = ( routes.push( // Default locale is served from root, not localized - ...netlifyRoutesForNextRouteWithData({ + ...generateNetlifyRoutes({ route: locale === defaultLocale ? route : `/${locale}${route}`, dataRoute, + withData, }).map((redirect) => ({ redirect, locale, @@ -117,6 +122,7 @@ export const redirectsForNextRoute = ({ i18n, status = 200, force = false, + withData = true, }: { route: string buildId: string @@ -125,8 +131,9 @@ export const redirectsForNextRoute = ({ i18n: I18n status?: number force?: boolean + withData?: boolean }): NetlifyConfig['redirects'] => - netlifyRoutesForNextRoute(route, buildId, i18n).map(({ redirect }) => ({ + netlifyRoutesForNextRoute(route, buildId, i18n, withData).map(({ redirect }) => ({ from: `${basePath}${redirect}`, to, status, @@ -168,7 +175,7 @@ export const redirectsForNextRouteWithData = ({ status?: number force?: boolean }): NetlifyConfig['redirects'] => - netlifyRoutesForNextRouteWithData({ route, dataRoute }).map((redirect) => ({ + generateNetlifyRoutes({ route, dataRoute, withData: true }).map((redirect) => ({ from: `${basePath}${redirect}`, to, status, diff --git a/test/__snapshots__/index.spec.js.snap b/test/__snapshots__/index.spec.js.snap index a3223f24f3..1d8e62212d 100644 --- a/test/__snapshots__/index.spec.js.snap +++ b/test/__snapshots__/index.spec.js.snap @@ -3,11 +3,17 @@ exports[`function helpers config dependency tracing extracts a list of all dependencies 1`] = ` Array [ ".next/package.json", + ".next/server/app/blog/[author]/[slug]/page.js", + ".next/server/app/blog/[author]/page.js", + ".next/server/chunks/1090.js", ".next/server/chunks/274.js", - ".next/server/chunks/4271.js", + ".next/server/chunks/3374.js", + ".next/server/chunks/4428.js", ".next/server/chunks/5237.js", - ".next/server/chunks/7016.js", + ".next/server/chunks/6316.js", ".next/server/chunks/7590.js", + ".next/server/chunks/8685.js", + ".next/server/chunks/8864.js", ".next/server/chunks/9097.js", ".next/server/chunks/header.js", ".next/server/pages/_app.js", @@ -55,8 +61,8 @@ exports.resolvePages = () => { try { require.resolve('../../../.next/package.json') require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/7016.js') require.resolve('../../../.next/server/chunks/7590.js') + require.resolve('../../../.next/server/chunks/8685.js') require.resolve('../../../.next/server/pages/_app.js') require.resolve('../../../.next/server/pages/_document.js') require.resolve('../../../.next/server/pages/_error.js') @@ -73,8 +79,8 @@ exports.resolvePages = () => { try { require.resolve('../../../.next/package.json') require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/7016.js') require.resolve('../../../.next/server/chunks/7590.js') + require.resolve('../../../.next/server/chunks/8685.js') require.resolve('../../../.next/server/pages/_app.js') require.resolve('../../../.next/server/pages/_document.js') require.resolve('../../../.next/server/pages/_error.js') @@ -91,11 +97,17 @@ exports[`onBuild() generates a file referencing all page sources 1`] = ` exports.resolvePages = () => { try { require.resolve('../../../.next/package.json') + require.resolve('../../../.next/server/app/blog/[author]/[slug]/page.js') + require.resolve('../../../.next/server/app/blog/[author]/page.js') + require.resolve('../../../.next/server/chunks/1090.js') require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/4271.js') + require.resolve('../../../.next/server/chunks/3374.js') + require.resolve('../../../.next/server/chunks/4428.js') require.resolve('../../../.next/server/chunks/5237.js') - require.resolve('../../../.next/server/chunks/7016.js') + require.resolve('../../../.next/server/chunks/6316.js') require.resolve('../../../.next/server/chunks/7590.js') + require.resolve('../../../.next/server/chunks/8685.js') + require.resolve('../../../.next/server/chunks/8864.js') require.resolve('../../../.next/server/chunks/9097.js') require.resolve('../../../.next/server/chunks/header.js') require.resolve('../../../.next/server/pages/_app.js') @@ -143,11 +155,17 @@ exports[`onBuild() generates a file referencing all page sources 2`] = ` exports.resolvePages = () => { try { require.resolve('../../../.next/package.json') + require.resolve('../../../.next/server/app/blog/[author]/[slug]/page.js') + require.resolve('../../../.next/server/app/blog/[author]/page.js') + require.resolve('../../../.next/server/chunks/1090.js') require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/4271.js') + require.resolve('../../../.next/server/chunks/3374.js') + require.resolve('../../../.next/server/chunks/4428.js') require.resolve('../../../.next/server/chunks/5237.js') - require.resolve('../../../.next/server/chunks/7016.js') + require.resolve('../../../.next/server/chunks/6316.js') require.resolve('../../../.next/server/chunks/7590.js') + require.resolve('../../../.next/server/chunks/8685.js') + require.resolve('../../../.next/server/chunks/8864.js') require.resolve('../../../.next/server/chunks/9097.js') require.resolve('../../../.next/server/chunks/header.js') require.resolve('../../../.next/server/pages/_app.js') @@ -195,11 +213,17 @@ exports[`onBuild() generates a file referencing all when publish dir is a subdir exports.resolvePages = () => { try { require.resolve('../../../web/.next/package.json') + require.resolve('../../../web/.next/server/app/blog/[author]/[slug]/page.js') + require.resolve('../../../web/.next/server/app/blog/[author]/page.js') + require.resolve('../../../web/.next/server/chunks/1090.js') require.resolve('../../../web/.next/server/chunks/274.js') - require.resolve('../../../web/.next/server/chunks/4271.js') + require.resolve('../../../web/.next/server/chunks/3374.js') + require.resolve('../../../web/.next/server/chunks/4428.js') require.resolve('../../../web/.next/server/chunks/5237.js') - require.resolve('../../../web/.next/server/chunks/7016.js') + require.resolve('../../../web/.next/server/chunks/6316.js') require.resolve('../../../web/.next/server/chunks/7590.js') + require.resolve('../../../web/.next/server/chunks/8685.js') + require.resolve('../../../web/.next/server/chunks/8864.js') require.resolve('../../../web/.next/server/chunks/9097.js') require.resolve('../../../web/.next/server/chunks/header.js') require.resolve('../../../web/.next/server/pages/_app.js') @@ -247,11 +271,17 @@ exports[`onBuild() generates a file referencing all when publish dir is a subdir exports.resolvePages = () => { try { require.resolve('../../../web/.next/package.json') + require.resolve('../../../web/.next/server/app/blog/[author]/[slug]/page.js') + require.resolve('../../../web/.next/server/app/blog/[author]/page.js') + require.resolve('../../../web/.next/server/chunks/1090.js') require.resolve('../../../web/.next/server/chunks/274.js') - require.resolve('../../../web/.next/server/chunks/4271.js') + require.resolve('../../../web/.next/server/chunks/3374.js') + require.resolve('../../../web/.next/server/chunks/4428.js') require.resolve('../../../web/.next/server/chunks/5237.js') - require.resolve('../../../web/.next/server/chunks/7016.js') + require.resolve('../../../web/.next/server/chunks/6316.js') require.resolve('../../../web/.next/server/chunks/7590.js') + require.resolve('../../../web/.next/server/chunks/8685.js') + require.resolve('../../../web/.next/server/chunks/8864.js') require.resolve('../../../web/.next/server/chunks/9097.js') require.resolve('../../../web/.next/server/chunks/header.js') require.resolve('../../../web/.next/server/pages/_app.js') @@ -1265,6 +1295,18 @@ Array [ "status": 404, "to": "/404.html", }, + Object { + "force": false, + "from": "/blog/:author", + "status": 200, + "to": "/.netlify/functions/___netlify-handler", + }, + Object { + "force": false, + "from": "/blog/:author/:slug", + "status": 200, + "to": "/.netlify/functions/___netlify-handler", + }, Object { "force": false, "from": "/broken-image", @@ -1319,6 +1361,18 @@ Array [ "status": 200, "to": "/.netlify/functions/___netlify-handler", }, + Object { + "force": false, + "from": "/es/blog/:author", + "status": 200, + "to": "/.netlify/functions/___netlify-handler", + }, + Object { + "force": false, + "from": "/es/blog/:author/:slug", + "status": 200, + "to": "/.netlify/functions/___netlify-handler", + }, Object { "force": false, "from": "/es/broken-image", @@ -1523,6 +1577,18 @@ Array [ "status": 200, "to": "/.netlify/functions/___netlify-handler", }, + Object { + "force": false, + "from": "/fr/blog/:author", + "status": 200, + "to": "/.netlify/functions/___netlify-handler", + }, + Object { + "force": false, + "from": "/fr/blog/:author/:slug", + "status": 200, + "to": "/.netlify/functions/___netlify-handler", + }, Object { "force": false, "from": "/fr/broken-image", From 47ca397973c50b138f7417af3169c919e56fcac6 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 22 Dec 2022 14:56:21 +0000 Subject: [PATCH 03/31] test: add e2e test --- cypress/integration/default/appdir.spec.ts | 19 +++++++++++++++++++ demos/default/pages/index.js | 6 ++++++ 2 files changed, 25 insertions(+) create mode 100644 cypress/integration/default/appdir.spec.ts diff --git a/cypress/integration/default/appdir.spec.ts b/cypress/integration/default/appdir.spec.ts new file mode 100644 index 0000000000..c6f3de74b6 --- /dev/null +++ b/cypress/integration/default/appdir.spec.ts @@ -0,0 +1,19 @@ +describe('appDir', () => { + it('renders appdir pages using SSR', () => { + cy.request('/blog/erica/first-post/').then((response) => { + expect(response.headers).to.have.property('x-nf-render-mode', 'ssr') + expect(response.headers).to.have.property('context-type', 'text/html; charset=utf-8') + }) + }) + + it('returns RSC data for RSC requests', () => { + cy.request('/blog/erica/first-post/', { + Headers: { + RSC: '1', + }, + }).then((response) => { + expect(response.headers).to.have.property('x-nf-render-mode', 'ssr') + expect(response.headers).to.have.property('context-type', 'application/octet-stream') + }) + }) +}) diff --git a/demos/default/pages/index.js b/demos/default/pages/index.js index 591f01b551..2f2945d978 100644 --- a/demos/default/pages/index.js +++ b/demos/default/pages/index.js @@ -158,6 +158,12 @@ const Index = ({ shows, nodeEnv }) => { Rewrite to static (should show getStaticProps/1) +

appDir

+
    +
  • + app dir page +
  • +

Preview mode

Preview mode:

    From bfec6350f3226310dd0f0b4c7b3b63ef90be60c7 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 22 Dec 2022 15:24:08 +0000 Subject: [PATCH 04/31] chore: fix test --- demos/default/.vscode/settings.json | 4 ---- test/e2e/app-dir/asset-prefix.test.ts | 4 +--- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 demos/default/.vscode/settings.json diff --git a/demos/default/.vscode/settings.json b/demos/default/.vscode/settings.json deleted file mode 100644 index d3fdae9a69..0000000000 --- a/demos/default/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "typescript.tsdk": "../../node_modules/typescript/lib", - "typescript.enablePromptUseWorkspaceTsdk": true -} \ No newline at end of file diff --git a/test/e2e/app-dir/asset-prefix.test.ts b/test/e2e/app-dir/asset-prefix.test.ts index 43e3384e5e..9491ed67ce 100644 --- a/test/e2e/app-dir/asset-prefix.test.ts +++ b/test/e2e/app-dir/asset-prefix.test.ts @@ -36,9 +36,7 @@ describe('app-dir assetPrefix handling', () => { redirect: 'manual', }, ) - // NTL - uses 301 instead of 308 - expect(res.status).toBe(301) - // expect(res.status).toBe(308) + expect(res.status).toBe(308) expect(res.headers.get('location')).toBe(next.url + '/a') }) From 9be92861a2874abb0bebc4b5cbcbd028e80cbcfe Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 3 Jan 2023 10:55:11 +0000 Subject: [PATCH 05/31] ci: don't run tests against 14, because appDir requires 16 --- .github/workflows/test.yml | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dd88f7f780..64edf19f88 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,12 +15,6 @@ jobs: strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest] - node-version: [14, '*'] - exclude: - - os: macOS-latest - node-version: 14 - - os: windows-latest - node-version: 14 fail-fast: false steps: @@ -32,15 +26,8 @@ jobs: check-latest: true - name: NPM Install run: npm install - - name: Switching to Node.js ${{ matrix.node-version }} to run tests - uses: actions/setup-node@v2 - if: "${{ matrix.node-version != 'lts/*' }}" - with: - node-version: ${{ matrix.node-version }} - check-latest: true - name: Linting run: npm run format:ci - if: "${{ matrix.node-version == 'lts/*' }}" - name: Run tests against next@latest run: npm test canary: @@ -50,12 +37,6 @@ jobs: strategy: matrix: os: [ubuntu-latest, macOS-latest, windows-latest] - node-version: [14, '*'] - exclude: - - os: macOS-latest - node-version: 14 - - os: windows-latest - node-version: 14 fail-fast: false if: github.ref_name == 'main' @@ -70,11 +51,5 @@ jobs: run: npm install - name: Install Next.js Canary run: npm install -D next@canary --legacy-peer-deps - - name: Switching to Node.js ${{ matrix.node-version }} to run tests - uses: actions/setup-node@v2 - if: "${{ matrix.node-version != 'lts/*' }}" - with: - node-version: ${{ matrix.node-version }} - check-latest: true - name: Run tests against next@canary run: npm test From 19cba0d5074386ee8e96c5278754276e7bb9fc8d Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 3 Jan 2023 11:01:46 +0000 Subject: [PATCH 06/31] chore: snapidoo :tada: --- package-lock.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 932b452d80..6d14a1127d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "demos/next-with-edge-functions" ], "dependencies": { - "moize": "^6.1.0", "next": "^13.0.7" }, "devDependencies": { @@ -21404,7 +21403,7 @@ "version": "1.56.2", "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.2.tgz", "integrity": "sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w==", - "devOptional": true, + "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -40343,7 +40342,7 @@ "version": "1.56.2", "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.2.tgz", "integrity": "sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w==", - "devOptional": true, + "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", From 10b798448170735858d692d45def5520086ac1f3 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 3 Jan 2023 12:56:17 +0000 Subject: [PATCH 07/31] ci: node 16 --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 64edf19f88..c42269606f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: - name: Installing with LTS Node.js uses: actions/setup-node@v2 with: - node-version: 'lts/*' + node-version: 16 check-latest: true - name: NPM Install run: npm install @@ -45,7 +45,7 @@ jobs: - name: Installing with LTS Node.js uses: actions/setup-node@v2 with: - node-version: 'lts/*' + node-version: 16 check-latest: true - name: NPM Install run: npm install From c35de7bc18c2ac0c15fac021fad0c65983c94272 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 3 Jan 2023 12:59:18 +0000 Subject: [PATCH 08/31] ci: use node 16 --- package-lock.json | 273 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) diff --git a/package-lock.json b/package-lock.json index 03c9f1ba94..e2ad074281 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24528,6 +24528,201 @@ "engines": { "node": ">=10" } + }, + "node_modules/@next/swc-android-arm-eabi": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.7.tgz", + "integrity": "sha512-QTEamOK/LCwBf05GZ261rULMbZEpE3TYdjHlXfznV+nXwTztzkBNFXwP67gv2wW44BROzgi/vrR9H8oP+J5jxg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-android-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.7.tgz", + "integrity": "sha512-wcy2H0Tl9ME8vKy2GnJZ7Mybwys+43F/Eh2Pvph7mSDpMbYBJ6iA0zeY62iYYXxlZhnAID3+h79FUqUEakkClw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.7.tgz", + "integrity": "sha512-F/mU7csN1/J2cqXJPMgTQ6MwAbc1pJ6sp6W+X0z5JEY4IFDzxKd3wRc3pCiNF7j8xW381JlNpWxhjCctnNmfaw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.7.tgz", + "integrity": "sha512-636AuRQynCPnIPRVzcCk5B7OMq9XjaYam2T0HeWUCE6y7EqEO3kxiuZ4QmN81T7A6Ydb+JnivYrLelHXmgdj6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-freebsd-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.7.tgz", + "integrity": "sha512-92XAMzNgQazowZ9t7uZmHRA5VdBl/SwEdrf5UybdfRovsxB4r3+yJWEvFaqYpSEp0gwndbwLokJdpz7OwFdL3Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm-gnueabihf": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.7.tgz", + "integrity": "sha512-3r1CWl5P6I5n5Yxip8EXv/Rfu2Cp6wVmIOpvmczyUR82j+bcMkwPAcUjNkG/vMCagS4xV7NElrcdGb39iFmfLg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.7.tgz", + "integrity": "sha512-RXo8tt6ppiwyS6hpDw3JdAjKcdVewsefxnxk9xOH4mRhMyq9V2lQx0e24X/dRiZqkx3jnWReR2WRrUlgN1UkSQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.7.tgz", + "integrity": "sha512-RWpnW+bmfXyxyY7iARbueYDGuIF+BEp3etLeYh/RUNHb9PhOHLDgJOG8haGSykud3a6CcyBI8hEjqOhoObaDpw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.7.tgz", + "integrity": "sha512-/ygUIiMMTYnbKlFs5Ba9J5k/tNxFWy8eI1bBF8UuMTvV8QJHl/aLDiA5dwsei2kk99/cu3eay62JnJXkSk3RSQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.7.tgz", + "integrity": "sha512-dLzr6AL77USJN0ejgx5AS8O8SbFlbYTzs0XwAWag4oQpUG2p3ARvxwQgYQ0Z+6EP0zIRZ/XfLkN/mhsyi3m4PA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.7.tgz", + "integrity": "sha512-+vFIVa82AwqFkpFClKT+n73fGxrhAZ2u1u3mDYEBdxO6c9U4Pj3S5tZFsGFK9kLT/bFvf/eeVOICSLCC7MSgJQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.7.tgz", + "integrity": "sha512-RNLXIhp+assD39dQY9oHhDxw+/qSJRARKhOFsHfOtf8yEfCHqcKkn3X/L+ih60ntaEqK294y1WkMk6ylotsxwA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.7.tgz", + "integrity": "sha512-kvdnlLcrnEq72ZP0lqe2Z5NqvB9N5uSCvtXJ0PhKvNncWWd0fEG9Ec9erXgwCmVlM2ytw41k9/uuQ+SVw4Pihw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } }, "dependencies": { @@ -42723,6 +42918,84 @@ "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" } + }, + "@next/swc-android-arm-eabi": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.7.tgz", + "integrity": "sha512-QTEamOK/LCwBf05GZ261rULMbZEpE3TYdjHlXfznV+nXwTztzkBNFXwP67gv2wW44BROzgi/vrR9H8oP+J5jxg==", + "optional": true + }, + "@next/swc-android-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.7.tgz", + "integrity": "sha512-wcy2H0Tl9ME8vKy2GnJZ7Mybwys+43F/Eh2Pvph7mSDpMbYBJ6iA0zeY62iYYXxlZhnAID3+h79FUqUEakkClw==", + "optional": true + }, + "@next/swc-darwin-arm64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.7.tgz", + "integrity": "sha512-F/mU7csN1/J2cqXJPMgTQ6MwAbc1pJ6sp6W+X0z5JEY4IFDzxKd3wRc3pCiNF7j8xW381JlNpWxhjCctnNmfaw==", + "optional": true + }, + "@next/swc-darwin-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.7.tgz", + "integrity": "sha512-636AuRQynCPnIPRVzcCk5B7OMq9XjaYam2T0HeWUCE6y7EqEO3kxiuZ4QmN81T7A6Ydb+JnivYrLelHXmgdj6A==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.7.tgz", + "integrity": "sha512-92XAMzNgQazowZ9t7uZmHRA5VdBl/SwEdrf5UybdfRovsxB4r3+yJWEvFaqYpSEp0gwndbwLokJdpz7OwFdL3Q==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.7.tgz", + "integrity": "sha512-3r1CWl5P6I5n5Yxip8EXv/Rfu2Cp6wVmIOpvmczyUR82j+bcMkwPAcUjNkG/vMCagS4xV7NElrcdGb39iFmfLg==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.7.tgz", + "integrity": "sha512-RXo8tt6ppiwyS6hpDw3JdAjKcdVewsefxnxk9xOH4mRhMyq9V2lQx0e24X/dRiZqkx3jnWReR2WRrUlgN1UkSQ==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.7.tgz", + "integrity": "sha512-RWpnW+bmfXyxyY7iARbueYDGuIF+BEp3etLeYh/RUNHb9PhOHLDgJOG8haGSykud3a6CcyBI8hEjqOhoObaDpw==", + "optional": true + }, + "@next/swc-linux-x64-gnu": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.7.tgz", + "integrity": "sha512-/ygUIiMMTYnbKlFs5Ba9J5k/tNxFWy8eI1bBF8UuMTvV8QJHl/aLDiA5dwsei2kk99/cu3eay62JnJXkSk3RSQ==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.7.tgz", + "integrity": "sha512-dLzr6AL77USJN0ejgx5AS8O8SbFlbYTzs0XwAWag4oQpUG2p3ARvxwQgYQ0Z+6EP0zIRZ/XfLkN/mhsyi3m4PA==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.7.tgz", + "integrity": "sha512-+vFIVa82AwqFkpFClKT+n73fGxrhAZ2u1u3mDYEBdxO6c9U4Pj3S5tZFsGFK9kLT/bFvf/eeVOICSLCC7MSgJQ==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.7.tgz", + "integrity": "sha512-RNLXIhp+assD39dQY9oHhDxw+/qSJRARKhOFsHfOtf8yEfCHqcKkn3X/L+ih60ntaEqK294y1WkMk6ylotsxwA==", + "optional": true + }, + "@next/swc-win32-x64-msvc": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.7.tgz", + "integrity": "sha512-kvdnlLcrnEq72ZP0lqe2Z5NqvB9N5uSCvtXJ0PhKvNncWWd0fEG9Ec9erXgwCmVlM2ytw41k9/uuQ+SVw4Pihw==", + "optional": true } } } From e7f205d29261aee8ecb7ddbf14fb91223344d79f Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 3 Jan 2023 13:29:45 +0000 Subject: [PATCH 09/31] ci: normalise chunk names --- test/__snapshots__/index.spec.js.snap | 112 +++++++++++++------------- test/index.spec.js | 14 ++-- 2 files changed, 64 insertions(+), 62 deletions(-) diff --git a/test/__snapshots__/index.spec.js.snap b/test/__snapshots__/index.spec.js.snap index 1d8e62212d..c1e3670857 100644 --- a/test/__snapshots__/index.spec.js.snap +++ b/test/__snapshots__/index.spec.js.snap @@ -5,16 +5,16 @@ Array [ ".next/package.json", ".next/server/app/blog/[author]/[slug]/page.js", ".next/server/app/blog/[author]/page.js", - ".next/server/chunks/1090.js", - ".next/server/chunks/274.js", - ".next/server/chunks/3374.js", - ".next/server/chunks/4428.js", - ".next/server/chunks/5237.js", - ".next/server/chunks/6316.js", - ".next/server/chunks/7590.js", - ".next/server/chunks/8685.js", - ".next/server/chunks/8864.js", - ".next/server/chunks/9097.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", + ".next/server/chunks/CHUNK_ID.js", ".next/server/chunks/header.js", ".next/server/pages/_app.js", ".next/server/pages/_document.js", @@ -60,9 +60,9 @@ exports[`onBuild() generates a file referencing all API route sources: for _api_ exports.resolvePages = () => { try { require.resolve('../../../.next/package.json') - require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/7590.js') - require.resolve('../../../.next/server/chunks/8685.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') require.resolve('../../../.next/server/pages/_app.js') require.resolve('../../../.next/server/pages/_document.js') require.resolve('../../../.next/server/pages/_error.js') @@ -78,9 +78,9 @@ exports[`onBuild() generates a file referencing all API route sources: for _api_ exports.resolvePages = () => { try { require.resolve('../../../.next/package.json') - require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/7590.js') - require.resolve('../../../.next/server/chunks/8685.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') require.resolve('../../../.next/server/pages/_app.js') require.resolve('../../../.next/server/pages/_document.js') require.resolve('../../../.next/server/pages/_error.js') @@ -99,16 +99,16 @@ exports.resolvePages = () => { require.resolve('../../../.next/package.json') require.resolve('../../../.next/server/app/blog/[author]/[slug]/page.js') require.resolve('../../../.next/server/app/blog/[author]/page.js') - require.resolve('../../../.next/server/chunks/1090.js') - require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/3374.js') - require.resolve('../../../.next/server/chunks/4428.js') - require.resolve('../../../.next/server/chunks/5237.js') - require.resolve('../../../.next/server/chunks/6316.js') - require.resolve('../../../.next/server/chunks/7590.js') - require.resolve('../../../.next/server/chunks/8685.js') - require.resolve('../../../.next/server/chunks/8864.js') - require.resolve('../../../.next/server/chunks/9097.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') require.resolve('../../../.next/server/chunks/header.js') require.resolve('../../../.next/server/pages/_app.js') require.resolve('../../../.next/server/pages/_document.js') @@ -157,16 +157,16 @@ exports.resolvePages = () => { require.resolve('../../../.next/package.json') require.resolve('../../../.next/server/app/blog/[author]/[slug]/page.js') require.resolve('../../../.next/server/app/blog/[author]/page.js') - require.resolve('../../../.next/server/chunks/1090.js') - require.resolve('../../../.next/server/chunks/274.js') - require.resolve('../../../.next/server/chunks/3374.js') - require.resolve('../../../.next/server/chunks/4428.js') - require.resolve('../../../.next/server/chunks/5237.js') - require.resolve('../../../.next/server/chunks/6316.js') - require.resolve('../../../.next/server/chunks/7590.js') - require.resolve('../../../.next/server/chunks/8685.js') - require.resolve('../../../.next/server/chunks/8864.js') - require.resolve('../../../.next/server/chunks/9097.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../.next/server/chunks/CHUNK_ID.js') require.resolve('../../../.next/server/chunks/header.js') require.resolve('../../../.next/server/pages/_app.js') require.resolve('../../../.next/server/pages/_document.js') @@ -215,16 +215,16 @@ exports.resolvePages = () => { require.resolve('../../../web/.next/package.json') require.resolve('../../../web/.next/server/app/blog/[author]/[slug]/page.js') require.resolve('../../../web/.next/server/app/blog/[author]/page.js') - require.resolve('../../../web/.next/server/chunks/1090.js') - require.resolve('../../../web/.next/server/chunks/274.js') - require.resolve('../../../web/.next/server/chunks/3374.js') - require.resolve('../../../web/.next/server/chunks/4428.js') - require.resolve('../../../web/.next/server/chunks/5237.js') - require.resolve('../../../web/.next/server/chunks/6316.js') - require.resolve('../../../web/.next/server/chunks/7590.js') - require.resolve('../../../web/.next/server/chunks/8685.js') - require.resolve('../../../web/.next/server/chunks/8864.js') - require.resolve('../../../web/.next/server/chunks/9097.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') require.resolve('../../../web/.next/server/chunks/header.js') require.resolve('../../../web/.next/server/pages/_app.js') require.resolve('../../../web/.next/server/pages/_document.js') @@ -273,16 +273,16 @@ exports.resolvePages = () => { require.resolve('../../../web/.next/package.json') require.resolve('../../../web/.next/server/app/blog/[author]/[slug]/page.js') require.resolve('../../../web/.next/server/app/blog/[author]/page.js') - require.resolve('../../../web/.next/server/chunks/1090.js') - require.resolve('../../../web/.next/server/chunks/274.js') - require.resolve('../../../web/.next/server/chunks/3374.js') - require.resolve('../../../web/.next/server/chunks/4428.js') - require.resolve('../../../web/.next/server/chunks/5237.js') - require.resolve('../../../web/.next/server/chunks/6316.js') - require.resolve('../../../web/.next/server/chunks/7590.js') - require.resolve('../../../web/.next/server/chunks/8685.js') - require.resolve('../../../web/.next/server/chunks/8864.js') - require.resolve('../../../web/.next/server/chunks/9097.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') + require.resolve('../../../web/.next/server/chunks/CHUNK_ID.js') require.resolve('../../../web/.next/server/chunks/header.js') require.resolve('../../../web/.next/server/pages/_app.js') require.resolve('../../../web/.next/server/pages/_document.js') diff --git a/test/index.spec.js b/test/index.spec.js index 49e653e1bb..b3977d8606 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -59,6 +59,8 @@ const utils = { }, } +const normalizeChunkNames = (source) => source.replaceAll(/\/chunks\/\d+\.js/g, '/chunks/CHUNK_ID.js') + const REDIRECTS = [ { source: '/:file((?!\\.well-known(?:/.*)?)(?:[^/]+/)*[^/]+\\.\\w+)/', @@ -590,7 +592,7 @@ describe('onBuild()', () => { for (const route of ['_api_hello-background-background', '_api_hello-scheduled-handler']) { const expected = path.resolve(constants.INTERNAL_FUNCTIONS_SRC, route, 'pages.js') expect(existsSync(expected)).toBeTruthy() - expect(readFileSync(expected, 'utf8')).toMatchSnapshot(`for ${route}`) + expect(normalizeChunkNames(readFileSync(expected, 'utf8'))).toMatchSnapshot(`for ${route}`) } }) @@ -602,8 +604,8 @@ describe('onBuild()', () => { expect(existsSync(handlerPagesFile)).toBeTruthy() expect(existsSync(odbHandlerPagesFile)).toBeTruthy() - expect(readFileSync(handlerPagesFile, 'utf8')).toMatchSnapshot() - expect(readFileSync(odbHandlerPagesFile, 'utf8')).toMatchSnapshot() + expect(normalizeChunkNames(readFileSync(handlerPagesFile, 'utf8'))).toMatchSnapshot() + expect(normalizeChunkNames(readFileSync(odbHandlerPagesFile, 'utf8'))).toMatchSnapshot() }) test('generates a file referencing all when publish dir is a subdirectory', async () => { @@ -619,8 +621,8 @@ describe('onBuild()', () => { const handlerPagesFile = path.join(constants.INTERNAL_FUNCTIONS_SRC, HANDLER_FUNCTION_NAME, 'pages.js') const odbHandlerPagesFile = path.join(constants.INTERNAL_FUNCTIONS_SRC, ODB_FUNCTION_NAME, 'pages.js') - expect(readFileSync(handlerPagesFile, 'utf8')).toMatchSnapshot() - expect(readFileSync(odbHandlerPagesFile, 'utf8')).toMatchSnapshot() + expect(normalizeChunkNames(readFileSync(handlerPagesFile, 'utf8'))).toMatchSnapshot() + expect(normalizeChunkNames(readFileSync(odbHandlerPagesFile, 'utf8'))).toMatchSnapshot() }) test('generates entrypoints with correct references', async () => { @@ -1279,7 +1281,7 @@ describe('function helpers', () => { await moveNextDist() await nextRuntime.onBuild(defaultArgs) const dependencies = await getAllPageDependencies(constants.PUBLISH_DIR) - expect(dependencies.map((dep) => relative(process.cwd(), dep))).toMatchSnapshot() + expect(dependencies.map((dep) => normalizeChunkNames(relative(process.cwd(), dep)))).toMatchSnapshot() }) it('extracts dependencies that exist', async () => { From 2a1442fb1ed2ddff1c46df7080d0e8cfdda06273 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 3 Jan 2023 14:16:48 +0000 Subject: [PATCH 10/31] ci: typo in test --- cypress/integration/default/appdir.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/integration/default/appdir.spec.ts b/cypress/integration/default/appdir.spec.ts index c6f3de74b6..7c921ac86b 100644 --- a/cypress/integration/default/appdir.spec.ts +++ b/cypress/integration/default/appdir.spec.ts @@ -13,7 +13,7 @@ describe('appDir', () => { }, }).then((response) => { expect(response.headers).to.have.property('x-nf-render-mode', 'ssr') - expect(response.headers).to.have.property('context-type', 'application/octet-stream') + expect(response.headers).to.have.property('content-type', 'application/octet-stream') }) }) }) From 1d5b887cfe44ee033c915280075757bf1887e740 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Tue, 3 Jan 2023 14:56:17 +0000 Subject: [PATCH 11/31] chore: use repo next version --- .github/workflows/e2e-appdir.yml | 1 - cypress/integration/default/appdir.spec.ts | 2 +- package.json | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/e2e-appdir.yml b/.github/workflows/e2e-appdir.yml index fd008522c0..9e858f7c52 100644 --- a/.github/workflows/e2e-appdir.yml +++ b/.github/workflows/e2e-appdir.yml @@ -41,7 +41,6 @@ jobs: env: NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_BOT_AUTH_TOKEN }} NETLIFY_SITE_ID: 1d5a5c76-d445-4ae5-b694-b0d3f2e2c395 - NEXT_TEST_VERSION: canary - uses: actions/upload-artifact@v3 if: ${{ always() }} name: Upload test results diff --git a/cypress/integration/default/appdir.spec.ts b/cypress/integration/default/appdir.spec.ts index 7c921ac86b..f629be10af 100644 --- a/cypress/integration/default/appdir.spec.ts +++ b/cypress/integration/default/appdir.spec.ts @@ -2,7 +2,7 @@ describe('appDir', () => { it('renders appdir pages using SSR', () => { cy.request('/blog/erica/first-post/').then((response) => { expect(response.headers).to.have.property('x-nf-render-mode', 'ssr') - expect(response.headers).to.have.property('context-type', 'text/html; charset=utf-8') + expect(response.headers).to.have.property('content-type', 'text/html; charset=utf-8') }) }) diff --git a/package.json b/package.json index 1e6110e318..7ac0e7914b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "test:next": "jest -c test/e2e/jest.config.js", "test:next:disabled": "RUN_SKIPPED_TESTS=1 jest -c test/e2e/jest.config.disabled.js", "test:next:all": "RUN_SKIPPED_TESTS=1 jest -c test/e2e/jest.config.all.js", - "test:next:appdir": "NEXT_TEST_VERSION=canary jest -c test/e2e/jest.config.appdir.js", + "test:next:appdir": "jest -c test/e2e/jest.config.appdir.js", "test:jest": "jest", "playwright:install": "playwright install --with-deps chromium", "test:jest:update": "jest --updateSnapshot", From f727d2ff209af1234b7e6c9aa6758d411e3c45d2 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 4 Jan 2023 12:20:19 +0000 Subject: [PATCH 12/31] chore: fix cypress test --- cypress/integration/default/appdir.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cypress/integration/default/appdir.spec.ts b/cypress/integration/default/appdir.spec.ts index f629be10af..b648359834 100644 --- a/cypress/integration/default/appdir.spec.ts +++ b/cypress/integration/default/appdir.spec.ts @@ -7,8 +7,9 @@ describe('appDir', () => { }) it('returns RSC data for RSC requests', () => { - cy.request('/blog/erica/first-post/', { - Headers: { + cy.request({ + url: '/blog/erica/first-post/', + headers: { RSC: '1', }, }).then((response) => { From 8c057fe522b57ad829cc555181bdfbb6ff0b7fde Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Wed, 4 Jan 2023 13:21:02 +0000 Subject: [PATCH 13/31] test: temporarily remove esm for app alias --- test/e2e/app-dir/app-alias/package.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 test/e2e/app-dir/app-alias/package.json diff --git a/test/e2e/app-dir/app-alias/package.json b/test/e2e/app-dir/app-alias/package.json deleted file mode 100644 index 3dbc1ca591..0000000000 --- a/test/e2e/app-dir/app-alias/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} From 1fed222dc9f5c82a3adedb5aafc5c2a44c393d6b Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 5 Jan 2023 11:33:39 +0000 Subject: [PATCH 14/31] chore: disable test failures --- test/e2e/app-dir/app-alias.test.ts | 8 ++++---- test/e2e/app-dir/app-static.test.ts | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/test/e2e/app-dir/app-alias.test.ts b/test/e2e/app-dir/app-alias.test.ts index 4b24e0d8c3..ca7fef7d09 100644 --- a/test/e2e/app-dir/app-alias.test.ts +++ b/test/e2e/app-dir/app-alias.test.ts @@ -6,10 +6,10 @@ import path from 'path' import { readJSON } from 'fs-extra' describe('app-dir alias handling', () => { - //if ((global as any).isNextDeploy) { - // it('should skip next deploy for now', () => {}) - // return - //} + if (!process.env.RUN_SKIPPED_TESTS) { + it('should skip for now', () => {}) + return + } let next: NextInstance diff --git a/test/e2e/app-dir/app-static.test.ts b/test/e2e/app-dir/app-static.test.ts index a1cd7116c8..780e33f69f 100644 --- a/test/e2e/app-dir/app-static.test.ts +++ b/test/e2e/app-dir/app-static.test.ts @@ -9,6 +9,8 @@ import webdriver from 'next-webdriver' const glob = promisify(globOrig) +const usuallySkip = process.env.RUN_SKIPPED_TESTS ? it : it.skip + describe('app-dir static/dynamic handling', () => { const isDev = (global as any).isNextDev @@ -196,7 +198,7 @@ describe('app-dir static/dynamic handling', () => { } }) - it('should honor dynamic = "force-static" correctly', async () => { + usuallySkip('should honor dynamic = "force-static" correctly', async () => { const res = await fetchViaHTTP(next.url, '/force-static/first') expect(res.status).toBe(200) @@ -218,7 +220,7 @@ describe('app-dir static/dynamic handling', () => { } }) - it('should honor dynamic = "force-static" correctly (lazy)', async () => { + usuallySkip('should honor dynamic = "force-static" correctly (lazy)', async () => { const res = await fetchViaHTTP(next.url, '/force-static/random') expect(res.status).toBe(200) From 9e1d5960be3a9cd065f64aacda0230bb46fb90f1 Mon Sep 17 00:00:00 2001 From: Matt Kane Date: Thu, 5 Jan 2023 11:50:32 +0000 Subject: [PATCH 15/31] chore: move disabled test --- .../app-dir/app-alias.test.ts | 8 ++--- .../app-dir/app-alias/next.config.js | 5 ++++ .../app-dir/app-alias/src/app/button/page.tsx | 10 +++++++ .../app-dir/app-alias/src/app/layout.tsx | 10 +++++++ .../app-dir/app-alias/src/app/typing/page.tsx | 11 +++++++ .../app-dir/app-alias/tsconfig.json | 29 +++++++++++++++++++ .../app-dir/app-alias/ui/button.tsx | 5 ++++ .../app-dir/app-alias/ui/style.module.css | 3 ++ 8 files changed, 77 insertions(+), 4 deletions(-) rename test/e2e/{ => disabled-tests}/app-dir/app-alias.test.ts (92%) create mode 100644 test/e2e/disabled-tests/app-dir/app-alias/next.config.js create mode 100644 test/e2e/disabled-tests/app-dir/app-alias/src/app/button/page.tsx create mode 100644 test/e2e/disabled-tests/app-dir/app-alias/src/app/layout.tsx create mode 100644 test/e2e/disabled-tests/app-dir/app-alias/src/app/typing/page.tsx create mode 100644 test/e2e/disabled-tests/app-dir/app-alias/tsconfig.json create mode 100644 test/e2e/disabled-tests/app-dir/app-alias/ui/button.tsx create mode 100644 test/e2e/disabled-tests/app-dir/app-alias/ui/style.module.css diff --git a/test/e2e/app-dir/app-alias.test.ts b/test/e2e/disabled-tests/app-dir/app-alias.test.ts similarity index 92% rename from test/e2e/app-dir/app-alias.test.ts rename to test/e2e/disabled-tests/app-dir/app-alias.test.ts index ca7fef7d09..4b24e0d8c3 100644 --- a/test/e2e/app-dir/app-alias.test.ts +++ b/test/e2e/disabled-tests/app-dir/app-alias.test.ts @@ -6,10 +6,10 @@ import path from 'path' import { readJSON } from 'fs-extra' describe('app-dir alias handling', () => { - if (!process.env.RUN_SKIPPED_TESTS) { - it('should skip for now', () => {}) - return - } + //if ((global as any).isNextDeploy) { + // it('should skip next deploy for now', () => {}) + // return + //} let next: NextInstance diff --git a/test/e2e/disabled-tests/app-dir/app-alias/next.config.js b/test/e2e/disabled-tests/app-dir/app-alias/next.config.js new file mode 100644 index 0000000000..3d6be3a00f --- /dev/null +++ b/test/e2e/disabled-tests/app-dir/app-alias/next.config.js @@ -0,0 +1,5 @@ +export default { + experimental: { + appDir: true, + }, +} diff --git a/test/e2e/disabled-tests/app-dir/app-alias/src/app/button/page.tsx b/test/e2e/disabled-tests/app-dir/app-alias/src/app/button/page.tsx new file mode 100644 index 0000000000..54c20b4f88 --- /dev/null +++ b/test/e2e/disabled-tests/app-dir/app-alias/src/app/button/page.tsx @@ -0,0 +1,10 @@ +import Button from '@/ui/button' +import React from 'react' + +export default function page() { + if ('useState' in React) { + throw new Error('React is not resolved correctly.') + } + + return +} diff --git a/test/e2e/disabled-tests/app-dir/app-alias/src/app/layout.tsx b/test/e2e/disabled-tests/app-dir/app-alias/src/app/layout.tsx new file mode 100644 index 0000000000..cbdfcab503 --- /dev/null +++ b/test/e2e/disabled-tests/app-dir/app-alias/src/app/layout.tsx @@ -0,0 +1,10 @@ +export default function Root({ children }: { children: React.ReactNode }) { + return ( + + +
    top bar
    + {children} + + + ) +} diff --git a/test/e2e/disabled-tests/app-dir/app-alias/src/app/typing/page.tsx b/test/e2e/disabled-tests/app-dir/app-alias/src/app/typing/page.tsx new file mode 100644 index 0000000000..593d8b7f4b --- /dev/null +++ b/test/e2e/disabled-tests/app-dir/app-alias/src/app/typing/page.tsx @@ -0,0 +1,11 @@ +// Typing test +// eslint-disable-next-line +function noop() { + fetch('/button', { next: { revalidate: 0 } }) + const request = new Request('/button', { next: { revalidate: 0 } }) + fetch(request) +} + +export default function page() { + return 'typing' +} diff --git a/test/e2e/disabled-tests/app-dir/app-alias/tsconfig.json b/test/e2e/disabled-tests/app-dir/app-alias/tsconfig.json new file mode 100644 index 0000000000..5939f6892d --- /dev/null +++ b/test/e2e/disabled-tests/app-dir/app-alias/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES6", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "baseUrl": ".", + "paths": { + "@/ui/*": ["ui/*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/test/e2e/disabled-tests/app-dir/app-alias/ui/button.tsx b/test/e2e/disabled-tests/app-dir/app-alias/ui/button.tsx new file mode 100644 index 0000000000..4219fce04e --- /dev/null +++ b/test/e2e/disabled-tests/app-dir/app-alias/ui/button.tsx @@ -0,0 +1,5 @@ +import styles from './style.module.css' + +export default function Button(props: any) { + return