Compare commits

..

5 Commits

Author SHA1 Message Date
Erika Rowland
2fa8af9136 minor change to test failure 2024-05-29 13:25:38 -07:00
Sean Massa
2090719c39 Merge branch 'endangeredmassa/reject-mismatch-corepack' of https://github.com/vercel/vercel into endangeredmassa/reject-mismatch-corepack 2024-05-15 18:34:39 -05:00
Sean Massa
11813250ce fix value used in error 2024-05-15 18:33:55 -05:00
Sean Massa
58bec9aa01 Create lemon-bears-talk.md 2024-05-15 17:08:35 -05:00
Sean Massa
dd199896ab reject mismatched corepack and detected package managers 2024-05-15 17:06:18 -05:00
117 changed files with 442 additions and 346 deletions

View File

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

View File

@@ -0,0 +1,5 @@
---
"@vercel/build-utils": patch
---
reject mismatched corepack and detected package managers

View File

@@ -63,21 +63,16 @@ updates:
allow:
- dependency-name: '@remix-run*'
- dependency-name: '@shopify*'
- dependency-name: 'remix*'
ignore:
- dependency-name: '@remix-run*'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
- dependency-name: 'remix*'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
- dependency-name: '@shopify*'
update-types:
['version-update:semver-major', 'version-update:semver-patch']
groups:
core:
patterns:
- 'remix*'
- '@remix-run*'
- '@shopify*'
update-types:

View File

@@ -20,6 +20,12 @@ import { cloneEnv } from '../clone-env';
// Only allow one `runNpmInstall()` invocation to run concurrently
const runNpmInstallSema = new Sema(1);
const NO_OVERRIDE = {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
};
export type CliType = 'yarn' | 'npm' | 'pnpm' | 'bun';
export interface ScanParentDirsResult {
@@ -557,9 +563,6 @@ export function getEnvForPackageManager({
nodeVersion: NodeVersion | undefined;
env: { [x: string]: string | undefined };
}) {
const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
const corepackEnabled = corepackFlagged && Boolean(packageJsonPackageManager);
const {
detectedLockfile,
detectedPackageManager,
@@ -567,10 +570,12 @@ export function getEnvForPackageManager({
} = getPathOverrideForPackageManager({
cliType,
lockfileVersion,
corepackEnabled,
corepackPackageManager: packageJsonPackageManager,
nodeVersion,
});
const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
const corepackEnabled = corepackFlagged && Boolean(packageJsonPackageManager);
if (corepackEnabled) {
debug(
`Detected corepack use for "${packageJsonPackageManager}". Not overriding package manager version.`
@@ -629,12 +634,9 @@ type DetectedPnpmVersion =
| 'corepack_enabled';
function detectPnpmVersion(
lockfileVersion: number | undefined,
corepackEnabled: boolean
lockfileVersion: number | undefined
): DetectedPnpmVersion {
switch (true) {
case corepackEnabled:
return 'corepack_enabled';
case lockfileVersion === undefined:
return 'not found';
case lockfileVersion === 5.3:
@@ -665,12 +667,12 @@ function shouldUseNpm7(
export function getPathOverrideForPackageManager({
cliType,
lockfileVersion,
corepackEnabled,
corepackPackageManager,
nodeVersion,
}: {
cliType: CliType;
lockfileVersion: number | undefined;
corepackEnabled: boolean;
corepackPackageManager: string | undefined;
nodeVersion: NodeVersion | undefined;
}): {
/**
@@ -683,73 +685,164 @@ export function getPathOverrideForPackageManager({
detectedPackageManager: string | undefined;
/**
* Value of $PATH that includes the binaries for the detected package manager.
* Undefined if no $PATH are necessary.
* `undefined` if no $PATH are necessary.
*/
path: string | undefined;
} {
const no_override = {
detectedLockfile: undefined,
detectedPackageManager: undefined,
path: undefined,
};
const detectedPackageManger = detectPackageManager(
cliType,
lockfileVersion,
nodeVersion
);
if (!detectedPackageManger) {
return NO_OVERRIDE;
}
if (!corepackPackageManager) {
return detectedPackageManger;
}
if (
validateVersionOverlap(
detectedPackageManger.detectedPackageManager,
corepackPackageManager
)
) {
// corepack is going to take care of it; do nothing special
return NO_OVERRIDE;
}
throw new Error(
`Detected package manager (by lockfile) "${detectedPackageManger.detectedPackageManager}" does not match intended corepack package manager "${corepackPackageManager}". Update your lockfile or "package.json#packageManager" values to match.`
);
}
function validateVersionOverlap(
detectedPackageManger: string,
corepackPackageManager: string
) {
const validatedDetectedPackageManger = validateVersionSpecifier(
detectedPackageManger
);
if (!validatedDetectedPackageManger) {
throw new Error(
`Detected package manager "${detectedPackageManger}" is not a valid semver value.`
);
}
const validatedCorepackPackageManager = validateVersionSpecifier(
corepackPackageManager
);
if (!validatedCorepackPackageManager) {
throw new Error(
`Intended corepack defined package manager "${corepackPackageManager}" is not a valid semver value.`
);
}
if (
validatedDetectedPackageManger.packageName !==
validatedCorepackPackageManager.packageName
) {
throw new Error(
`Detected package manager "${validatedDetectedPackageManger.packageName}" does not match intended corepack defined package manager "${validatedCorepackPackageManager.packageName}". Change your lockfile or "package.json#packageManager" value to match.`
);
}
return intersects(
validatedDetectedPackageManger.packageVersionRange,
validatedCorepackPackageManager.packageVersionRange
);
}
function validateVersionSpecifier(version: string) {
if (!version) {
return undefined;
}
const [before, after, ...extra] = version.split('@');
if (extra.length) {
// should not have more than one `@`
return undefined;
}
if (!before) {
// should have a package before the `@`
return undefined;
}
if (!after) {
// should have a version after the `@`
return undefined;
}
if (!validRange(after)) {
// the version after the `@` should be a valid semver value
return undefined;
}
return {
packageName: before,
packageVersionRange: after,
};
}
function detectPackageManager(
cliType: CliType,
lockfileVersion: number | undefined,
nodeVersion: NodeVersion | undefined
) {
switch (cliType) {
case 'npm':
switch (true) {
case corepackEnabled:
return no_override;
case shouldUseNpm7(lockfileVersion, nodeVersion):
return {
path: '/node16/bin-npm7',
detectedLockfile: 'package-lock.json',
detectedPackageManager: 'npm 7+',
detectedPackageManager: 'npm@7.x',
};
default:
return no_override;
return undefined;
}
case 'pnpm':
switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
case 'corepack_enabled':
return no_override;
switch (detectPnpmVersion(lockfileVersion)) {
case 'pnpm 7':
// pnpm 7
return {
path: '/pnpm7/node_modules/.bin',
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 7',
detectedPackageManager: 'pnpm@7.x',
};
case 'pnpm 8':
// pnpm 8
return {
path: '/pnpm8/node_modules/.bin',
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 8',
detectedPackageManager: 'pnpm@8.x',
};
case 'pnpm 9':
// pnpm 9
return {
path: '/pnpm9/node_modules/.bin',
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 9',
detectedPackageManager: 'pnpm@9.x',
};
case 'pnpm 6':
default:
return no_override;
return undefined;
}
case 'bun':
switch (true) {
case corepackEnabled:
return no_override;
default:
// Bun 1
return {
path: '/bun1',
detectedLockfile: 'bun.lockb',
detectedPackageManager: 'Bun',
detectedPackageManager: 'bun@1.x',
};
}
case 'yarn':
return no_override;
return undefined;
}
}
@@ -793,13 +886,19 @@ export function getPathForPackageManager({
// broken behavior.
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === '1';
const overrides = getPathOverrideForPackageManager({
let overrides = getPathOverrideForPackageManager({
cliType,
lockfileVersion,
corepackEnabled,
corepackPackageManager: undefined,
nodeVersion,
});
if (corepackEnabled) {
// this is essentially always overriding the value of `override`, but that's what was happening
// in this deprecated function before
overrides = NO_OVERRIDE;
}
const alreadyInPath = (newPath: string) => {
const oldPath = env.PATH ?? '';
return oldPath.split(path.delimiter).includes(newPath);

View File

@@ -63,7 +63,7 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/node16/bin-npm7${delimiter}foo`,
},
consoleLogOutput: 'Detected `package-lock.json` generated by npm 7+',
consoleLogOutput: 'Detected `package-lock.json` generated by npm@7.x',
consoleWarnOutput: null,
},
{
@@ -71,7 +71,7 @@ describe('Test `getEnvForPackageManager()`', () => {
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
packageJsonPackageManager: 'pnpm@latest',
packageJsonPackageManager: 'npm@*',
lockfileVersion: 2,
env: {
FOO: 'bar',
@@ -177,7 +177,7 @@ describe('Test `getEnvForPackageManager()`', () => {
PATH: `/pnpm7/node_modules/.bin${delimiter}foo`,
},
consoleLogOutput:
'Detected `pnpm-lock.yaml` version 5.4 generated by pnpm 7',
'Detected `pnpm-lock.yaml` version 5.4 generated by pnpm@7.x',
consoleWarnOutput: null,
},
{
@@ -197,7 +197,7 @@ describe('Test `getEnvForPackageManager()`', () => {
PATH: `/pnpm8/node_modules/.bin${delimiter}foo`,
},
consoleLogOutput:
'Detected `pnpm-lock.yaml` version 6 generated by pnpm 8',
'Detected `pnpm-lock.yaml` version 6 generated by pnpm@8.x',
consoleWarnOutput: null,
},
{
@@ -217,7 +217,7 @@ describe('Test `getEnvForPackageManager()`', () => {
PATH: `/pnpm9/node_modules/.bin${delimiter}foo`,
},
consoleLogOutput:
'Detected `pnpm-lock.yaml` version 9 generated by pnpm 9',
'Detected `pnpm-lock.yaml` version 9 generated by pnpm@9.x',
consoleWarnOutput: null,
},
{
@@ -236,7 +236,7 @@ describe('Test `getEnvForPackageManager()`', () => {
FOO: 'bar',
PATH: `/bun1${delimiter}/usr/local/bin`,
},
consoleLogOutput: 'Detected `bun.lockb` generated by Bun',
consoleLogOutput: 'Detected `bun.lockb` generated by bun@1.x',
consoleWarnOutput:
'Warning: Bun is used as a package manager at build time only, not at runtime with Functions',
},
@@ -245,7 +245,7 @@ describe('Test `getEnvForPackageManager()`', () => {
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
packageJsonPackageManager: 'npm@latest',
packageJsonPackageManager: 'pnpm@*',
lockfileVersion: 5.4,
env: {
FOO: 'bar',
@@ -342,7 +342,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
},
want: {
detectedLockfile: 'package-lock.json',
detectedPackageManager: 'npm 7+',
detectedPackageManager: 'npm@7.x',
path: '/node16/bin-npm7',
},
},
@@ -351,7 +351,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
args: {
cliType: 'npm',
nodeVersion: { major: 14, range: '14.x', runtime: 'nodejs14.x' },
packageJsonPackageManager: 'pnpm@latest',
packageJsonPackageManager: 'npm@*',
lockfileVersion: 2,
env: {
FOO: 'bar',
@@ -415,7 +415,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
},
want: {
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 7',
detectedPackageManager: 'pnpm@7.x',
path: '/pnpm7/node_modules/.bin',
},
},
@@ -433,7 +433,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
},
want: {
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 8',
detectedPackageManager: 'pnpm@8.x',
path: '/pnpm8/node_modules/.bin',
},
},
@@ -451,7 +451,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
},
want: {
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 9',
detectedPackageManager: 'pnpm@9.x',
path: '/pnpm9/node_modules/.bin',
},
},
@@ -469,7 +469,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
},
want: {
detectedLockfile: 'bun.lockb',
detectedPackageManager: 'Bun',
detectedPackageManager: 'bun@1.x',
path: '/bun1',
},
},
@@ -478,7 +478,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
args: {
cliType: 'pnpm',
nodeVersion: { major: 16, range: '16.x', runtime: 'nodejs16.x' },
packageJsonPackageManager: 'npm@latest',
packageJsonPackageManager: 'pnpm@*',
lockfileVersion: 5.4,
env: {
FOO: 'bar',
@@ -496,8 +496,7 @@ describe('Test `getPathOverrideForPackageManager()`', () => {
getPathOverrideForPackageManager({
cliType: args.cliType,
lockfileVersion: args.lockfileVersion,
// naive assumption that enabling corepack as a feature means it's used, but this is fine for tests
corepackEnabled: Boolean(args.env.ENABLE_EXPERIMENTAL_COREPACK),
corepackPackageManager: args.packageJsonPackageManager,
nodeVersion: args.nodeVersion,
})
).toStrictEqual(want);
@@ -540,7 +539,7 @@ describe('Test `getPathForPackageManager()`', () => {
},
want: {
detectedLockfile: 'package-lock.json',
detectedPackageManager: 'npm 7+',
detectedPackageManager: 'npm@7.x',
path: '/node16/bin-npm7',
yarnNodeLinker: undefined,
},
@@ -647,7 +646,7 @@ describe('Test `getPathForPackageManager()`', () => {
},
want: {
detectedLockfile: 'pnpm-lock.yaml',
detectedPackageManager: 'pnpm 7',
detectedPackageManager: 'pnpm@7.x',
path: '/pnpm7/node_modules/.bin',
yarnNodeLinker: undefined,
},
@@ -665,7 +664,7 @@ describe('Test `getPathForPackageManager()`', () => {
},
want: {
detectedLockfile: 'bun.lockb',
detectedPackageManager: 'Bun',
detectedPackageManager: 'bun@1.x',
path: '/bun1',
yarnNodeLinker: undefined,
},

View File

@@ -1,14 +1,5 @@
# vercel
## 34.2.1
### Patch Changes
- Support incremental PPR for large applications ([#11625](https://github.com/vercel/vercel/pull/11625))
- Updated dependencies [[`73e558913`](https://github.com/vercel/vercel/commit/73e558913ab30ba097d7536a12fa8a7c967479f0)]:
- @vercel/next@4.2.12
## 34.2.0
### Minor Changes

View File

@@ -1,6 +1,6 @@
{
"name": "vercel",
"version": "34.2.1",
"version": "34.2.0",
"preferGlobal": true,
"license": "Apache-2.0",
"description": "The command-line interface for Vercel",
@@ -36,7 +36,7 @@
"@vercel/fun": "1.1.0",
"@vercel/go": "3.1.1",
"@vercel/hydrogen": "1.0.2",
"@vercel/next": "4.2.12",
"@vercel/next": "4.2.11",
"@vercel/node": "3.1.5",
"@vercel/python": "4.2.0",
"@vercel/redwood": "2.0.9",

View File

@@ -1,11 +1,5 @@
# @vercel/next
## 4.2.12
### Patch Changes
- Support incremental PPR for large applications ([#11625](https://github.com/vercel/vercel/pull/11625))
## 4.2.11
### Patch Changes

View File

@@ -1,6 +1,6 @@
{
"name": "@vercel/next",
"version": "4.2.12",
"version": "4.2.11",
"license": "Apache-2.0",
"main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/next-js",

View File

@@ -1358,11 +1358,6 @@ export const build: BuildV2 = async ({
experimentalPPRRoutes.add(route);
}
const isAppPPREnabled = requiredServerFilesManifest
? requiredServerFilesManifest.config.experimental?.ppr === true ||
requiredServerFilesManifest.config.experimental?.ppr === 'incremental'
: false;
if (requiredServerFilesManifest) {
if (!routesManifest) {
throw new Error(
@@ -1418,7 +1413,6 @@ export const build: BuildV2 = async ({
hasIsr500Page,
variantsManifest,
experimentalPPRRoutes,
isAppPPREnabled,
});
}
@@ -1938,7 +1932,7 @@ export const build: BuildV2 = async ({
canUsePreviewMode,
bypassToken: prerenderManifest.bypassToken || '',
isServerMode,
isAppPPREnabled: false,
experimentalPPRRoutes,
hasActionOutputSupport: false,
}).then(arr =>
localizeDynamicRoutes(
@@ -1969,7 +1963,7 @@ export const build: BuildV2 = async ({
canUsePreviewMode,
bypassToken: prerenderManifest.bypassToken || '',
isServerMode,
isAppPPREnabled: false,
experimentalPPRRoutes,
hasActionOutputSupport: false,
}).then(arr =>
arr.map(route => {

View File

@@ -144,7 +144,6 @@ export async function serverBuild({
requiredServerFilesManifest,
variantsManifest,
experimentalPPRRoutes,
isAppPPREnabled,
}: {
appPathRoutesManifest?: Record<string, string>;
dynamicPages: string[];
@@ -186,15 +185,7 @@ export async function serverBuild({
requiredServerFilesManifest: NextRequiredServerFilesManifest;
variantsManifest: VariantsManifest | null;
experimentalPPRRoutes: ReadonlySet<string>;
isAppPPREnabled: boolean;
}): Promise<BuildResult> {
if (isAppPPREnabled) {
debug(
'experimentalPPRRoutes',
JSON.stringify(Array.from(experimentalPPRRoutes))
);
}
lambdaPages = Object.assign({}, lambdaPages, lambdaAppPaths);
const experimentalAllowBundling = Boolean(
@@ -226,6 +217,12 @@ export async function serverBuild({
}
}
const experimental = {
ppr:
requiredServerFilesManifest.config.experimental?.ppr === true ||
requiredServerFilesManifest.config.experimental?.ppr === 'incremental',
};
let appRscPrefetches: UnwrapPromise<ReturnType<typeof glob>> = {};
let appBuildTraces: UnwrapPromise<ReturnType<typeof glob>> = {};
let appDir: string | null = null;
@@ -233,7 +230,7 @@ export async function serverBuild({
if (appPathRoutesManifest) {
appDir = path.join(pagesDir, '../app');
appBuildTraces = await glob('**/*.js.nft.json', appDir);
appRscPrefetches = isAppPPREnabled
appRscPrefetches = experimental.ppr
? {}
: await glob(`**/*${RSC_PREFETCH_SUFFIX}`, appDir);
@@ -254,7 +251,7 @@ export async function serverBuild({
if (rewrite.src && rewrite.dest) {
rewrite.src = rewrite.src.replace(
/\/?\(\?:\/\)\?/,
`(?<rscsuff>${isAppPPREnabled ? '(\\.prefetch)?' : ''}\\.rsc)?(?:/)?`
`(?<rscsuff>${experimental.ppr ? '(\\.prefetch)?' : ''}\\.rsc)?(?:/)?`
);
let destQueryIndex = rewrite.dest.indexOf('?');
@@ -937,6 +934,9 @@ export async function serverBuild({
const appRouterStreamingActionLambdaGroups: LambdaGroup[] = [];
for (const group of appRouterLambdaGroups) {
if (!group.isPrerenders || group.isExperimentalPPR) {
group.isStreaming = true;
}
group.isAppRouter = true;
// We create a streaming variant of the Prerender lambda group
@@ -951,6 +951,9 @@ export async function serverBuild({
}
for (const group of appRouteHandlersLambdaGroups) {
if (!group.isPrerenders) {
group.isStreaming = true;
}
group.isAppRouter = true;
group.isAppRouteHandler = true;
}
@@ -981,24 +984,18 @@ export async function serverBuild({
apiLambdaGroups: apiLambdaGroups.map(group => ({
pages: group.pages,
isPrerender: group.isPrerenders,
isStreaming: group.isStreaming,
isExperimentalPPR: group.isExperimentalPPR,
pseudoLayerBytes: group.pseudoLayerBytes,
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
})),
pageLambdaGroups: pageLambdaGroups.map(group => ({
pages: group.pages,
isPrerender: group.isPrerenders,
isStreaming: group.isStreaming,
isExperimentalPPR: group.isExperimentalPPR,
pseudoLayerBytes: group.pseudoLayerBytes,
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
})),
appRouterLambdaGroups: appRouterLambdaGroups.map(group => ({
pages: group.pages,
isPrerender: group.isPrerenders,
isStreaming: group.isStreaming,
isExperimentalPPR: group.isExperimentalPPR,
pseudoLayerBytes: group.pseudoLayerBytes,
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
})),
@@ -1006,8 +1003,6 @@ export async function serverBuild({
appRouterStreamingActionLambdaGroups.map(group => ({
pages: group.pages,
isPrerender: group.isPrerenders,
isStreaming: group.isStreaming,
isExperimentalPPR: group.isExperimentalPPR,
pseudoLayerBytes: group.pseudoLayerBytes,
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
})),
@@ -1015,8 +1010,6 @@ export async function serverBuild({
group => ({
pages: group.pages,
isPrerender: group.isPrerenders,
isStreaming: group.isStreaming,
isExperimentalPPR: group.isExperimentalPPR,
pseudoLayerBytes: group.pseudoLayerBytes,
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
})
@@ -1196,10 +1189,15 @@ export async function serverBuild({
const lambda = await createLambdaFromPseudoLayers(options);
// This is a PPR lambda if it's an App Page with the PPR experimental flag
// enabled.
const isPPR =
experimental.ppr && group.isAppRouter && !group.isAppRouteHandler;
// If PPR is enabled and this is an App Page, create the non-streaming
// lambda for the page for revalidation.
let revalidate: NodejsLambda | undefined;
if (group.isExperimentalPPR) {
if (isPPR) {
if (!options.isStreaming) {
throw new Error("Invariant: PPR lambda isn't streaming");
}
@@ -1216,11 +1214,14 @@ export async function serverBuild({
// This is the name of the page, where the root is `index`.
const pageName = pageFilename.replace(/\.js$/, '');
// This is the name of the page prefixed with a `/`, where the root is
// `/index`.
const pagePath = path.posix.join('/', pageName);
// This is the routable pathname for the page, where the root is `/`.
const pagePathname = normalizePage(pageName);
const pagePathname = pagePath === '/index' ? '/' : pagePath;
let isPrerender = prerenderRoutes.has(pagePathname);
const isRoutePPREnabled = experimentalPPRRoutes.has(pagePathname);
if (!isPrerender && routesManifest?.i18n) {
isPrerender = routesManifest.i18n.locales.some(locale => {
@@ -1238,7 +1239,7 @@ export async function serverBuild({
}
// If this is a PPR page, then we should prefix the output name.
if (isRoutePPREnabled) {
if (isPPR) {
if (!revalidate) {
throw new Error("Invariant: PPR lambda isn't set");
}
@@ -1319,13 +1320,6 @@ export async function serverBuild({
console.timeEnd(lambdaCreationLabel);
}
if (isAppPPREnabled) {
debug(
'experimentalStreamingLambdaPaths',
JSON.stringify(Array.from(experimentalStreamingLambdaPaths))
);
}
const prerenderRoute = onPrerenderRoute({
appDir,
pagesDir,
@@ -1413,7 +1407,7 @@ export async function serverBuild({
bypassToken: prerenderManifest.bypassToken || '',
isServerMode: true,
dynamicMiddlewareRouteMap: middleware.dynamicRouteMap,
isAppPPREnabled,
experimentalPPRRoutes,
hasActionOutputSupport,
}).then(arr =>
localizeDynamicRoutes(
@@ -1595,7 +1589,7 @@ export async function serverBuild({
if (lambdas[pathname]) {
lambdas[`${pathname}.rsc`] = lambdas[pathname];
if (isAppPPREnabled) {
if (experimental.ppr) {
lambdas[`${pathname}${RSC_PREFETCH_SUFFIX}`] = lambdas[pathname];
}
}
@@ -1603,7 +1597,7 @@ export async function serverBuild({
if (edgeFunctions[pathname]) {
edgeFunctions[`${pathname}.rsc`] = edgeFunctions[pathname];
if (isAppPPREnabled) {
if (experimental.ppr) {
edgeFunctions[`${pathname}${RSC_PREFETCH_SUFFIX}`] =
edgeFunctions[pathname];
}
@@ -1622,7 +1616,7 @@ export async function serverBuild({
'RSC, Next-Router-State-Tree, Next-Router-Prefetch';
const appNotFoundPath = path.posix.join('.', entryDirectory, '_not-found');
if (isAppPPREnabled && !rscPrefetchHeader) {
if (experimental.ppr && !rscPrefetchHeader) {
throw new Error("Invariant: cannot use PPR without 'rsc.prefetchHeader'");
}
@@ -1630,7 +1624,7 @@ export async function serverBuild({
// all the routes that support it (and are listed) have configured lambdas.
// This only applies to routes that do not have fallbacks enabled (these are
// routes that have `dynamicParams = false` defined.
if (isAppPPREnabled) {
if (experimental.ppr) {
for (const { srcRoute, dataRoute, experimentalPPR } of Object.values(
prerenderManifest.staticRoutes
)) {
@@ -1913,7 +1907,7 @@ export async function serverBuild({
...(appDir
? [
...(rscPrefetchHeader && isAppPPREnabled
...(rscPrefetchHeader && experimental.ppr
? [
{
src: `^${path.posix.join('/', entryDirectory, '/')}`,

View File

@@ -192,12 +192,8 @@ function normalizePage(page: string): string {
if (!page.startsWith('/')) {
page = `/${page}`;
}
// Replace the `/index` with `/`
if (page === '/index') {
page = '/';
}
// remove '/index' from the end
page = page.replace(/\/index$/, '/');
return page;
}
@@ -324,8 +320,8 @@ export async function getDynamicRoutes({
bypassToken,
isServerMode,
dynamicMiddlewareRouteMap,
experimentalPPRRoutes,
hasActionOutputSupport,
isAppPPREnabled,
}: {
entryPath: string;
entryDirectory: string;
@@ -337,8 +333,8 @@ export async function getDynamicRoutes({
bypassToken?: string;
isServerMode?: boolean;
dynamicMiddlewareRouteMap?: ReadonlyMap<string, RouteWithSrc>;
experimentalPPRRoutes: ReadonlySet<string>;
hasActionOutputSupport: boolean;
isAppPPREnabled: boolean;
}): Promise<RouteWithSrc[]> {
if (routesManifest) {
switch (routesManifest.version) {
@@ -412,7 +408,7 @@ export async function getDynamicRoutes({
];
}
if (isAppPPREnabled) {
if (experimentalPPRRoutes.has(page)) {
let dest = route.dest?.replace(/($|\?)/, '.prefetch.rsc$1');
if (page === '/' || page === '/index') {
@@ -1508,9 +1504,9 @@ export type LambdaGroup = {
maxDuration?: number;
isAppRouter?: boolean;
isAppRouteHandler?: boolean;
readonly isStreaming: boolean;
readonly isPrerenders: boolean;
readonly isExperimentalPPR: boolean;
isStreaming?: boolean;
isPrerenders?: boolean;
isExperimentalPPR?: boolean;
isActionLambda?: boolean;
isPages?: boolean;
isApiLambda: boolean;
@@ -1565,7 +1561,6 @@ export async function getPageLambdaGroups({
const routeName = normalizePage(page.replace(/\.js$/, ''));
const isPrerenderRoute = prerenderRoutes.has(routeName);
const isExperimentalPPR = experimentalPPRRoutes?.has(routeName) ?? false;
const isStreaming = !isPrerenderRoute || isExperimentalPPR;
let opts: { memory?: number; maxDuration?: number } = {};
@@ -1637,7 +1632,6 @@ export async function getPageLambdaGroups({
...opts,
isPrerenders: isPrerenderRoute,
isExperimentalPPR,
isStreaming,
isApiLambda: !!isApiPage(page),
pseudoLayerBytes: initialPseudoLayer.pseudoLayerBytes,
pseudoLayerUncompressedBytes: initialPseudoLayerUncompressed,
@@ -2225,6 +2219,22 @@ export const onPrerenderRoute =
initialStatus = 404;
}
/**
* If the route key had an `/index` suffix added, we need to note it so we
* can remove it from the output path later accurately.
*/
let addedIndexSuffix = false;
if (isAppPathRoute) {
// for literal index routes we need to append an additional /index
// due to the proxy's normalizing for /index routes
if (routeKey !== '/index' && routeKey.endsWith('/index')) {
routeKey = `${routeKey}/index`;
routeFileNoExt = routeKey;
addedIndexSuffix = true;
}
}
let outputPathPage = path.posix.join(entryDirectory, routeFileNoExt);
if (!isAppPathRoute) {
@@ -2418,7 +2428,7 @@ export const onPrerenderRoute =
// static route first, then try the srcRoute if it doesn't exist. If we
// can't find it at all, this constitutes an error.
experimentalStreamingLambdaPath = experimentalStreamingLambdaPaths.get(
pathnameToOutputName(entryDirectory, routeKey)
pathnameToOutputName(entryDirectory, routeKey, addedIndexSuffix)
);
if (!experimentalStreamingLambdaPath && srcRoute) {
experimentalStreamingLambdaPath =
@@ -2679,10 +2689,19 @@ export function getNextServerPath(nextVersion: string) {
: 'next/dist/next-server/server';
}
function pathnameToOutputName(entryDirectory: string, pathname: string) {
function pathnameToOutputName(
entryDirectory: string,
pathname: string,
addedIndexSuffix = false
) {
if (pathname === '/') {
pathname = '/index';
}
// If the `/index` was added for a route that ended in `/index` we need to
// strip the second one off before joining it with the entryDirectory.
else if (addedIndexSuffix) {
pathname = pathname.replace(/\/index$/, '');
}
return path.posix.join(entryDirectory, pathname);
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true,
"scripts": {

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -7,8 +7,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,3 +1,7 @@
export const metadata = {
metadataBase: new URL(process.env.VERCEL_PROJECT_PRODUCTION_URL ?? 'http://localhost:3000'),
};
export default function Root({ children }) {
return (
<html className="this-is-the-document-html">

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -7,8 +7,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"devDependencies": {
"@types/node": "20.4.5",

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -10,8 +10,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -5,8 +5,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -6,8 +6,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -9,8 +9,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -8,8 +8,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -8,8 +8,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -8,8 +8,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521",
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430",
"typescript": "4.9.5"
},
"devDependencies": {

View File

@@ -5,8 +5,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -5,8 +5,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -5,8 +5,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"scripts": {
"dev": "next dev",

View File

@@ -4,8 +4,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -3,8 +3,8 @@
"private": true,
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"scripts": {
"build": "next build website-preview"

View File

@@ -3,7 +3,7 @@
"private": true,
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
}
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -4,8 +4,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -6,7 +6,7 @@
]
},
"overrides": {
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
}
}

View File

@@ -8,7 +8,7 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
}
}

View File

@@ -8,7 +8,7 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
}
}

View File

@@ -6,7 +6,7 @@
]
},
"overrides": {
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
}
}

View File

@@ -8,7 +8,7 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
}
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -7,8 +7,8 @@
"chrome-aws-lambda": "8.0.0",
"firebase": "8.3.0",
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -4,8 +4,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -9,8 +9,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"scripts": {
"vercel-build": "next build"

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -4,8 +4,8 @@
"@types/node": "^12.12.56",
"@types/react": "^16.9.49",
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521",
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430",
"typescript": "4.9.5"
},
"ignoreNextjsUpdates": true

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -4,8 +4,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -4,8 +4,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -4,8 +4,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -9,8 +9,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -9,8 +9,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -9,8 +9,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -10,8 +10,8 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

View File

@@ -9,7 +9,7 @@
},
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
}
}

View File

@@ -1,8 +1,8 @@
{
"dependencies": {
"next": "canary",
"react": "19.0.0-rc-81c5ff2e04-20240521",
"react-dom": "19.0.0-rc-81c5ff2e04-20240521"
"react": "19.0.0-beta-4508873393-20240430",
"react-dom": "19.0.0-beta-4508873393-20240430"
},
"ignoreNextjsUpdates": true
}

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