mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-10 21:07:48 +00:00
[next] Correct output file tracing and limit calculation (#10631)
While investigating build times noticed that our lambda creation times were increasing linearly with the number of pages which is unexpected since there are mostly shared dependencies. After further investigation it seems we were falling back to our legacy manual `nodeFileTrace` calls in the builder when we shouldn't have been. Also noticed we were still doing the un-necessary reading/calculating for uncompressed lambda sizes which is as discussed previously isn't required and the only limit we need to keep enforcing is the uncompressed size which is a lot less expensive to compute. As a further optimization this adds proper usage of our lstat cache/sema where it wasn't previously and proper parallelizing where applicable. These changes reduce tracing/lambda creation times by 3-5x in larger applications and can fix edge cases where we weren't leveraging our more accurate traces from the build. Before: ```sh Traced Next.js server files in: 444.05ms Created all serverless functions in: 1:36.311 (m:ss.mmm) Collected static files (public/, static/, .next/static): 241.47ms ``` After: ```sh Traced Next.js server files in: 10.4ms Created all serverless functions in: 43.684s Collected static files (public/, static/, .next/static): 250.828ms ```
This commit is contained in:
5
.changeset/bright-dolls-drop.md
Normal file
5
.changeset/bright-dolls-drop.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'@vercel/next': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Correct output file tracing and limit calculation
|
||||||
@@ -10,5 +10,3 @@ export const EDGE_FUNCTION_SIZE_LIMIT = 4 * MIB;
|
|||||||
export const MAX_UNCOMPRESSED_LAMBDA_SIZE = 250 * MIB;
|
export const MAX_UNCOMPRESSED_LAMBDA_SIZE = 250 * MIB;
|
||||||
|
|
||||||
export const LAMBDA_RESERVED_UNCOMPRESSED_SIZE = 2.5 * MIB;
|
export const LAMBDA_RESERVED_UNCOMPRESSED_SIZE = 2.5 * MIB;
|
||||||
|
|
||||||
export const LAMBDA_RESERVED_COMPRESSED_SIZE = 250 * KIB;
|
|
||||||
|
|||||||
@@ -1449,6 +1449,8 @@ export const build: BuildV2 = async ({
|
|||||||
let tracedPseudoLayer: PseudoLayerResult | undefined;
|
let tracedPseudoLayer: PseudoLayerResult | undefined;
|
||||||
const apiPages: string[] = [];
|
const apiPages: string[] = [];
|
||||||
const nonApiPages: string[] = [];
|
const nonApiPages: string[] = [];
|
||||||
|
const lstatSema = new Sema(25);
|
||||||
|
const lstatResults: { [key: string]: ReturnType<typeof lstat> } = {};
|
||||||
|
|
||||||
for (const page of pageKeys) {
|
for (const page of pageKeys) {
|
||||||
const pagePath = pages[page].fsPath;
|
const pagePath = pages[page].fsPath;
|
||||||
@@ -1464,7 +1466,11 @@ export const build: BuildV2 = async ({
|
|||||||
|
|
||||||
compressedPages[page] = (
|
compressedPages[page] = (
|
||||||
await createPseudoLayer({
|
await createPseudoLayer({
|
||||||
|
files: {
|
||||||
[page]: pages[page],
|
[page]: pages[page],
|
||||||
|
},
|
||||||
|
lstatResults,
|
||||||
|
lstatSema,
|
||||||
})
|
})
|
||||||
).pseudoLayer[page] as PseudoFile;
|
).pseudoLayer[page] as PseudoFile;
|
||||||
}
|
}
|
||||||
@@ -1482,8 +1488,6 @@ export const build: BuildV2 = async ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const nftCache = Object.create(null);
|
const nftCache = Object.create(null);
|
||||||
const lstatSema = new Sema(25);
|
|
||||||
const lstatResults: { [key: string]: ReturnType<typeof lstat> } = {};
|
|
||||||
const pathsToTrace = mergedPageKeys.map(page => pages[page].fsPath);
|
const pathsToTrace = mergedPageKeys.map(page => pages[page].fsPath);
|
||||||
|
|
||||||
const result = await nodeFileTrace(pathsToTrace, {
|
const result = await nodeFileTrace(pathsToTrace, {
|
||||||
@@ -1512,15 +1516,16 @@ export const build: BuildV2 = async ({
|
|||||||
const reasons = result.reasons;
|
const reasons = result.reasons;
|
||||||
|
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
Array.from(fileList).map(
|
Array.from(fileList).map(async file => {
|
||||||
collectTracedFiles(
|
await collectTracedFiles(
|
||||||
|
file,
|
||||||
baseDir,
|
baseDir,
|
||||||
lstatResults,
|
lstatResults,
|
||||||
lstatSema,
|
lstatSema,
|
||||||
reasons,
|
reasons,
|
||||||
tracedFiles
|
tracedFiles
|
||||||
)
|
);
|
||||||
)
|
})
|
||||||
);
|
);
|
||||||
pageTraces[page] = tracedFiles;
|
pageTraces[page] = tracedFiles;
|
||||||
}
|
}
|
||||||
@@ -1536,12 +1541,14 @@ export const build: BuildV2 = async ({
|
|||||||
if (hasLambdas) {
|
if (hasLambdas) {
|
||||||
console.time(zippingLabel);
|
console.time(zippingLabel);
|
||||||
}
|
}
|
||||||
tracedPseudoLayer = await createPseudoLayer(
|
tracedPseudoLayer = await createPseudoLayer({
|
||||||
mergedPageKeys.reduce((prev, page) => {
|
files: mergedPageKeys.reduce((prev, page) => {
|
||||||
Object.assign(prev, pageTraces[page]);
|
Object.assign(prev, pageTraces[page]);
|
||||||
return prev;
|
return prev;
|
||||||
}, {})
|
}, {}),
|
||||||
);
|
lstatResults,
|
||||||
|
lstatSema,
|
||||||
|
});
|
||||||
|
|
||||||
if (hasLambdas) {
|
if (hasLambdas) {
|
||||||
console.timeEnd(zippingLabel);
|
console.timeEnd(zippingLabel);
|
||||||
|
|||||||
@@ -111,7 +111,6 @@ export async function serverBuild({
|
|||||||
omittedPrerenderRoutes,
|
omittedPrerenderRoutes,
|
||||||
trailingSlashRedirects,
|
trailingSlashRedirects,
|
||||||
isCorrectLocaleAPIRoutes,
|
isCorrectLocaleAPIRoutes,
|
||||||
lambdaCompressedByteLimit,
|
|
||||||
requiredServerFilesManifest,
|
requiredServerFilesManifest,
|
||||||
variantsManifest,
|
variantsManifest,
|
||||||
}: {
|
}: {
|
||||||
@@ -149,7 +148,6 @@ export async function serverBuild({
|
|||||||
hasIsr500Page: boolean;
|
hasIsr500Page: boolean;
|
||||||
trailingSlashRedirects: Route[];
|
trailingSlashRedirects: Route[];
|
||||||
routesManifest: RoutesManifest;
|
routesManifest: RoutesManifest;
|
||||||
lambdaCompressedByteLimit: number;
|
|
||||||
isCorrectLocaleAPIRoutes: boolean;
|
isCorrectLocaleAPIRoutes: boolean;
|
||||||
imagesManifest?: NextImagesManifest;
|
imagesManifest?: NextImagesManifest;
|
||||||
prerenderManifest: NextPrerenderedRoutes;
|
prerenderManifest: NextPrerenderedRoutes;
|
||||||
@@ -303,7 +301,6 @@ export async function serverBuild({
|
|||||||
|
|
||||||
if (hasLambdas) {
|
if (hasLambdas) {
|
||||||
const initialTracingLabel = 'Traced Next.js server files in';
|
const initialTracingLabel = 'Traced Next.js server files in';
|
||||||
|
|
||||||
console.time(initialTracingLabel);
|
console.time(initialTracingLabel);
|
||||||
|
|
||||||
const initialTracedFiles: {
|
const initialTracedFiles: {
|
||||||
@@ -412,19 +409,24 @@ export async function serverBuild({
|
|||||||
|
|
||||||
debug('collecting initial Next.js server files');
|
debug('collecting initial Next.js server files');
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
initialFileList.map(
|
initialFileList.map(async file => {
|
||||||
collectTracedFiles(
|
await collectTracedFiles(
|
||||||
|
file,
|
||||||
baseDir,
|
baseDir,
|
||||||
lstatResults,
|
lstatResults,
|
||||||
lstatSema,
|
lstatSema,
|
||||||
initialFileReasons,
|
initialFileReasons,
|
||||||
initialTracedFiles
|
initialTracedFiles
|
||||||
)
|
);
|
||||||
)
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
debug('creating initial pseudo layer');
|
debug('creating initial pseudo layer');
|
||||||
const initialPseudoLayer = await createPseudoLayer(initialTracedFiles);
|
const initialPseudoLayer = await createPseudoLayer({
|
||||||
|
files: initialTracedFiles,
|
||||||
|
lstatResults,
|
||||||
|
lstatSema,
|
||||||
|
});
|
||||||
console.timeEnd(initialTracingLabel);
|
console.timeEnd(initialTracingLabel);
|
||||||
|
|
||||||
const lambdaCreationLabel = 'Created all serverless functions in';
|
const lambdaCreationLabel = 'Created all serverless functions in';
|
||||||
@@ -435,18 +437,18 @@ export async function serverBuild({
|
|||||||
const appRouterPages: string[] = [];
|
const appRouterPages: string[] = [];
|
||||||
const appRouteHandlers: string[] = [];
|
const appRouteHandlers: string[] = [];
|
||||||
|
|
||||||
lambdaPageKeys.forEach(page => {
|
for (const page of lambdaPageKeys) {
|
||||||
if (
|
if (
|
||||||
internalPages.includes(page) &&
|
internalPages.includes(page) &&
|
||||||
page !== '404.js' &&
|
page !== '404.js' &&
|
||||||
!(page === '_error.js' && !(static404Page || lambdaPages['404.js']))
|
!(page === '_error.js' && !(static404Page || lambdaPages['404.js']))
|
||||||
) {
|
) {
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
const pathname = page.replace(/\.js$/, '');
|
const pathname = page.replace(/\.js$/, '');
|
||||||
|
|
||||||
if (nonLambdaSsgPages.has(pathname)) {
|
if (nonLambdaSsgPages.has(pathname)) {
|
||||||
return;
|
continue;
|
||||||
}
|
}
|
||||||
const normalizedPathname = normalizePage(pathname);
|
const normalizedPathname = normalizePage(pathname);
|
||||||
|
|
||||||
@@ -465,7 +467,7 @@ export async function serverBuild({
|
|||||||
} else {
|
} else {
|
||||||
nonApiPages.push(page);
|
nonApiPages.push(page);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
const requiredFiles: { [key: string]: FileFsRef } = {};
|
const requiredFiles: { [key: string]: FileFsRef } = {};
|
||||||
|
|
||||||
@@ -557,39 +559,30 @@ export async function serverBuild({
|
|||||||
|
|
||||||
// add required files and internal pages to initial pseudo layer
|
// add required files and internal pages to initial pseudo layer
|
||||||
// so that we account for these in the size of each page group
|
// so that we account for these in the size of each page group
|
||||||
const requiredFilesLayer = await createPseudoLayer(requiredFiles);
|
const requiredFilesLayer = await createPseudoLayer({
|
||||||
|
files: requiredFiles,
|
||||||
|
lstatResults,
|
||||||
|
lstatSema,
|
||||||
|
});
|
||||||
Object.assign(
|
Object.assign(
|
||||||
initialPseudoLayer.pseudoLayer,
|
initialPseudoLayer.pseudoLayer,
|
||||||
requiredFilesLayer.pseudoLayer
|
requiredFilesLayer.pseudoLayer
|
||||||
);
|
);
|
||||||
initialPseudoLayer.pseudoLayerBytes += requiredFilesLayer.pseudoLayerBytes;
|
initialPseudoLayer.pseudoLayerBytes += requiredFilesLayer.pseudoLayerBytes;
|
||||||
|
|
||||||
const uncompressedInitialSize = Object.keys(
|
|
||||||
initialPseudoLayer.pseudoLayer
|
|
||||||
).reduce((prev, cur) => {
|
|
||||||
const file = initialPseudoLayer.pseudoLayer[cur] as PseudoFile;
|
|
||||||
return prev + file.uncompressedSize || 0;
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
debug(
|
debug(
|
||||||
JSON.stringify(
|
JSON.stringify(
|
||||||
{
|
{
|
||||||
uncompressedInitialSize,
|
initializeSizeUncompressed: initialPseudoLayer.pseudoLayerBytes,
|
||||||
compressedInitialSize: initialPseudoLayer.pseudoLayerBytes,
|
|
||||||
},
|
},
|
||||||
null,
|
null,
|
||||||
2
|
2
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (initialPseudoLayer.pseudoLayerBytes > MAX_UNCOMPRESSED_LAMBDA_SIZE) {
|
||||||
initialPseudoLayer.pseudoLayerBytes > lambdaCompressedByteLimit ||
|
|
||||||
uncompressedInitialSize > MAX_UNCOMPRESSED_LAMBDA_SIZE
|
|
||||||
) {
|
|
||||||
console.log(
|
console.log(
|
||||||
`Warning: Max serverless function size of ${prettyBytes(
|
`Warning: Max serverless function size of ${prettyBytes(
|
||||||
lambdaCompressedByteLimit
|
|
||||||
)} compressed or ${prettyBytes(
|
|
||||||
MAX_UNCOMPRESSED_LAMBDA_SIZE
|
MAX_UNCOMPRESSED_LAMBDA_SIZE
|
||||||
)} uncompressed reached`
|
)} uncompressed reached`
|
||||||
);
|
);
|
||||||
@@ -598,12 +591,11 @@ export async function serverBuild({
|
|||||||
[],
|
[],
|
||||||
initialPseudoLayer.pseudoLayer,
|
initialPseudoLayer.pseudoLayer,
|
||||||
initialPseudoLayer.pseudoLayerBytes,
|
initialPseudoLayer.pseudoLayerBytes,
|
||||||
uncompressedInitialSize,
|
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
|
||||||
throw new NowBuildError({
|
throw new NowBuildError({
|
||||||
message: `Required files read using Node.js fs library and node_modules exceed max lambda size of ${lambdaCompressedByteLimit} bytes`,
|
message: `Required files read using Node.js fs library and node_modules exceed max lambda size of ${MAX_UNCOMPRESSED_LAMBDA_SIZE} bytes`,
|
||||||
code: 'NEXT_REQUIRED_FILES_LIMIT',
|
code: 'NEXT_REQUIRED_FILES_LIMIT',
|
||||||
link: 'https://vercel.com/docs/platform/limits#serverless-function-size',
|
link: 'https://vercel.com/docs/platform/limits#serverless-function-size',
|
||||||
});
|
});
|
||||||
@@ -681,16 +673,15 @@ export async function serverBuild({
|
|||||||
return originalPagePath;
|
return originalPagePath;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getBuildTraceFile = (page: string) => {
|
const getBuildTraceFile = (page: string) =>
|
||||||
return (
|
pageBuildTraces[page + '.nft.json'] || appBuildTraces[page + '.nft.json'];
|
||||||
pageBuildTraces[page + '.nft.json'] ||
|
|
||||||
appBuildTraces[page + '.nft.json']
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const pathsToTrace: string[] = mergedPageKeys
|
const pathsToTrace: string[] = mergedPageKeys
|
||||||
.map(page => {
|
.map(page => {
|
||||||
if (!getBuildTraceFile(page)) {
|
const originalPagePath = getOriginalPagePath(page);
|
||||||
|
const pageBuildTrace = getBuildTraceFile(originalPagePath);
|
||||||
|
|
||||||
|
if (!pageBuildTrace) {
|
||||||
return lambdaPages[page].fsPath;
|
return lambdaPages[page].fsPath;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -700,6 +691,10 @@ export async function serverBuild({
|
|||||||
let parentFilesMap: Map<string, Set<string>> | undefined;
|
let parentFilesMap: Map<string, Set<string>> | undefined;
|
||||||
|
|
||||||
if (pathsToTrace.length > 0) {
|
if (pathsToTrace.length > 0) {
|
||||||
|
console.warn(
|
||||||
|
`Warning: running tracing as trace files were not present for:\n`,
|
||||||
|
JSON.stringify(pathsToTrace, null, 2)
|
||||||
|
);
|
||||||
traceResult = await nodeFileTrace(pathsToTrace, {
|
traceResult = await nodeFileTrace(pathsToTrace, {
|
||||||
base: baseDir,
|
base: baseDir,
|
||||||
cache: traceCache,
|
cache: traceCache,
|
||||||
@@ -783,31 +778,39 @@ export async function serverBuild({
|
|||||||
reasons = traceResult?.reasons || new Map();
|
reasons = traceResult?.reasons || new Map();
|
||||||
}
|
}
|
||||||
|
|
||||||
await Promise.all(
|
await Promise.all([
|
||||||
fileList.map(
|
createPseudoLayer({
|
||||||
collectTracedFiles(
|
files: {
|
||||||
|
[page]: lambdaPages[page],
|
||||||
|
},
|
||||||
|
lstatResults,
|
||||||
|
lstatSema,
|
||||||
|
}).then(res => {
|
||||||
|
compressedPages[page] = res.pseudoLayer[page] as PseudoFile;
|
||||||
|
}),
|
||||||
|
...fileList.map(async file => {
|
||||||
|
await collectTracedFiles(
|
||||||
|
file,
|
||||||
baseDir,
|
baseDir,
|
||||||
lstatResults,
|
lstatResults,
|
||||||
lstatSema,
|
lstatSema,
|
||||||
reasons,
|
reasons,
|
||||||
tracedFiles
|
tracedFiles
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
pageTraces[page] = tracedFiles;
|
pageTraces[page] = tracedFiles;
|
||||||
compressedPages[page] = (
|
|
||||||
await createPseudoLayer({
|
|
||||||
[page]: lambdaPages[page],
|
|
||||||
})
|
|
||||||
).pseudoLayer[page] as PseudoFile;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const tracedPseudoLayer = await createPseudoLayer(
|
const tracedPseudoLayer = await createPseudoLayer({
|
||||||
mergedPageKeys.reduce((prev, page) => {
|
files: mergedPageKeys.reduce((prev, page) => {
|
||||||
Object.assign(prev, pageTraces[page]);
|
Object.assign(prev, pageTraces[page]);
|
||||||
return prev;
|
return prev;
|
||||||
}, {})
|
}, {}),
|
||||||
);
|
lstatResults,
|
||||||
|
lstatSema,
|
||||||
|
});
|
||||||
|
|
||||||
const pageExtensions = requiredServerFilesManifest.config?.pageExtensions;
|
const pageExtensions = requiredServerFilesManifest.config?.pageExtensions;
|
||||||
|
|
||||||
@@ -821,8 +824,6 @@ export async function serverBuild({
|
|||||||
compressedPages,
|
compressedPages,
|
||||||
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
||||||
initialPseudoLayer,
|
initialPseudoLayer,
|
||||||
lambdaCompressedByteLimit,
|
|
||||||
initialPseudoLayerUncompressed: uncompressedInitialSize,
|
|
||||||
internalPages,
|
internalPages,
|
||||||
pageExtensions,
|
pageExtensions,
|
||||||
});
|
});
|
||||||
@@ -841,8 +842,6 @@ export async function serverBuild({
|
|||||||
compressedPages,
|
compressedPages,
|
||||||
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
||||||
initialPseudoLayer,
|
initialPseudoLayer,
|
||||||
lambdaCompressedByteLimit,
|
|
||||||
initialPseudoLayerUncompressed: uncompressedInitialSize,
|
|
||||||
internalPages,
|
internalPages,
|
||||||
pageExtensions,
|
pageExtensions,
|
||||||
});
|
});
|
||||||
@@ -857,8 +856,6 @@ export async function serverBuild({
|
|||||||
compressedPages,
|
compressedPages,
|
||||||
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
||||||
initialPseudoLayer,
|
initialPseudoLayer,
|
||||||
lambdaCompressedByteLimit,
|
|
||||||
initialPseudoLayerUncompressed: uncompressedInitialSize,
|
|
||||||
internalPages,
|
internalPages,
|
||||||
pageExtensions,
|
pageExtensions,
|
||||||
});
|
});
|
||||||
@@ -888,8 +885,6 @@ export async function serverBuild({
|
|||||||
compressedPages,
|
compressedPages,
|
||||||
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
tracedPseudoLayer: tracedPseudoLayer.pseudoLayer,
|
||||||
initialPseudoLayer,
|
initialPseudoLayer,
|
||||||
initialPseudoLayerUncompressed: uncompressedInitialSize,
|
|
||||||
lambdaCompressedByteLimit,
|
|
||||||
internalPages,
|
internalPages,
|
||||||
pageExtensions,
|
pageExtensions,
|
||||||
});
|
});
|
||||||
@@ -905,26 +900,22 @@ export async function serverBuild({
|
|||||||
pages: group.pages,
|
pages: group.pages,
|
||||||
isPrerender: group.isPrerenders,
|
isPrerender: group.isPrerenders,
|
||||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
|
||||||
})),
|
})),
|
||||||
pageLambdaGroups: pageLambdaGroups.map(group => ({
|
pageLambdaGroups: pageLambdaGroups.map(group => ({
|
||||||
pages: group.pages,
|
pages: group.pages,
|
||||||
isPrerender: group.isPrerenders,
|
isPrerender: group.isPrerenders,
|
||||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
|
||||||
})),
|
})),
|
||||||
appRouterLambdaGroups: appRouterLambdaGroups.map(group => ({
|
appRouterLambdaGroups: appRouterLambdaGroups.map(group => ({
|
||||||
pages: group.pages,
|
pages: group.pages,
|
||||||
isPrerender: group.isPrerenders,
|
isPrerender: group.isPrerenders,
|
||||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
|
||||||
})),
|
})),
|
||||||
appRouteHandlersLambdaGroups: appRouteHandlersLambdaGroups.map(
|
appRouteHandlersLambdaGroups: appRouteHandlersLambdaGroups.map(
|
||||||
group => ({
|
group => ({
|
||||||
pages: group.pages,
|
pages: group.pages,
|
||||||
isPrerender: group.isPrerenders,
|
isPrerender: group.isPrerenders,
|
||||||
pseudoLayerBytes: group.pseudoLayerBytes,
|
pseudoLayerBytes: group.pseudoLayerBytes,
|
||||||
uncompressedLayerBytes: group.pseudoLayerUncompressedBytes,
|
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
nextServerLayerSize: initialPseudoLayer.pseudoLayerBytes,
|
nextServerLayerSize: initialPseudoLayer.pseudoLayerBytes,
|
||||||
@@ -940,13 +931,10 @@ export async function serverBuild({
|
|||||||
...appRouteHandlersLambdaGroups,
|
...appRouteHandlersLambdaGroups,
|
||||||
];
|
];
|
||||||
|
|
||||||
await detectLambdaLimitExceeding(
|
await detectLambdaLimitExceeding(combinedGroups, compressedPages);
|
||||||
combinedGroups,
|
|
||||||
lambdaCompressedByteLimit,
|
|
||||||
compressedPages
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const group of combinedGroups) {
|
await Promise.all(
|
||||||
|
combinedGroups.map(async group => {
|
||||||
const groupPageFiles: { [key: string]: PseudoFile } = {};
|
const groupPageFiles: { [key: string]: PseudoFile } = {};
|
||||||
|
|
||||||
for (const page of [...group.pages, ...internalPages]) {
|
for (const page of [...group.pages, ...internalPages]) {
|
||||||
@@ -1016,8 +1004,12 @@ export async function serverBuild({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const launcherFiles: { [name: string]: FileFsRef | FileBlob } = {
|
const launcherFiles: { [name: string]: FileFsRef | FileBlob } = {
|
||||||
[path.join(path.relative(baseDir, projectDir), '___next_launcher.cjs')]:
|
[path.join(
|
||||||
new FileBlob({ data: group.isAppRouter ? appLauncher : launcher }),
|
path.relative(baseDir, projectDir),
|
||||||
|
'___next_launcher.cjs'
|
||||||
|
)]: new FileBlob({
|
||||||
|
data: group.isAppRouter ? appLauncher : launcher,
|
||||||
|
}),
|
||||||
};
|
};
|
||||||
const operationType = getOperationType({ group, prerenderManifest });
|
const operationType = getOperationType({ group, prerenderManifest });
|
||||||
|
|
||||||
@@ -1083,7 +1075,8 @@ export async function serverBuild({
|
|||||||
lambdas[outputName] = lambda;
|
lambdas[outputName] = lambda;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
);
|
||||||
console.timeEnd(lambdaCreationLabel);
|
console.timeEnd(lambdaCreationLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import {
|
|||||||
Prerender,
|
Prerender,
|
||||||
getLambdaOptionsFromFunction,
|
getLambdaOptionsFromFunction,
|
||||||
getPlatformEnv,
|
getPlatformEnv,
|
||||||
streamToBuffer,
|
|
||||||
NowBuildError,
|
NowBuildError,
|
||||||
isSymbolicLink,
|
isSymbolicLink,
|
||||||
NodejsLambda,
|
NodejsLambda,
|
||||||
@@ -25,11 +24,9 @@ import type {
|
|||||||
RouteWithSrc,
|
RouteWithSrc,
|
||||||
} from '@vercel/routing-utils';
|
} from '@vercel/routing-utils';
|
||||||
import { Sema } from 'async-sema';
|
import { Sema } from 'async-sema';
|
||||||
import crc32 from 'buffer-crc32';
|
|
||||||
import fs, { lstat, stat } from 'fs-extra';
|
import fs, { lstat, stat } from 'fs-extra';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import semver from 'semver';
|
import semver from 'semver';
|
||||||
import zlib from 'zlib';
|
|
||||||
import url from 'url';
|
import url from 'url';
|
||||||
import { createRequire } from 'module';
|
import { createRequire } from 'module';
|
||||||
import escapeStringRegexp from 'escape-string-regexp';
|
import escapeStringRegexp from 'escape-string-regexp';
|
||||||
@@ -44,7 +41,6 @@ import {
|
|||||||
MIB,
|
MIB,
|
||||||
KIB,
|
KIB,
|
||||||
MAX_UNCOMPRESSED_LAMBDA_SIZE,
|
MAX_UNCOMPRESSED_LAMBDA_SIZE,
|
||||||
LAMBDA_RESERVED_COMPRESSED_SIZE,
|
|
||||||
LAMBDA_RESERVED_UNCOMPRESSED_SIZE,
|
LAMBDA_RESERVED_UNCOMPRESSED_SIZE,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
@@ -677,15 +673,14 @@ export function getFilesMapFromReasons(
|
|||||||
return parentFilesMap;
|
return parentFilesMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const collectTracedFiles =
|
export const collectTracedFiles = async (
|
||||||
(
|
file: string,
|
||||||
baseDir: string,
|
baseDir: string,
|
||||||
lstatResults: { [key: string]: ReturnType<typeof lstat> },
|
lstatResults: { [key: string]: ReturnType<typeof lstat> },
|
||||||
lstatSema: Sema,
|
lstatSema: Sema,
|
||||||
reasons: NodeFileTraceReasons,
|
reasons: NodeFileTraceReasons,
|
||||||
files: { [filePath: string]: FileFsRef }
|
files: { [filePath: string]: FileFsRef }
|
||||||
) =>
|
) => {
|
||||||
async (file: string) => {
|
|
||||||
const reason = reasons.get(file);
|
const reason = reasons.get(file);
|
||||||
if (reason && reason.type.includes('initial')) {
|
if (reason && reason.type.includes('initial')) {
|
||||||
// Initial files are manually added to the lambda later
|
// Initial files are manually added to the lambda later
|
||||||
@@ -705,7 +700,7 @@ export const collectTracedFiles =
|
|||||||
fsPath: path.join(baseDir, file),
|
fsPath: path.join(baseDir, file),
|
||||||
mode,
|
mode,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ExperimentalTraceVersion = `9.0.4-canary.1`;
|
export const ExperimentalTraceVersion = `9.0.4-canary.1`;
|
||||||
|
|
||||||
@@ -716,8 +711,6 @@ export type PseudoLayer = {
|
|||||||
export type PseudoFile = {
|
export type PseudoFile = {
|
||||||
file: FileFsRef;
|
file: FileFsRef;
|
||||||
isSymlink: false;
|
isSymlink: false;
|
||||||
crc32: number;
|
|
||||||
compBuffer: Buffer;
|
|
||||||
uncompressedSize: number;
|
uncompressedSize: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -727,31 +720,29 @@ export type PseudoSymbolicLink = {
|
|||||||
symlinkTarget: string;
|
symlinkTarget: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
const compressBuffer = (buf: Buffer): Promise<Buffer> => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
zlib.deflateRaw(
|
|
||||||
buf,
|
|
||||||
{ level: zlib.constants.Z_BEST_COMPRESSION },
|
|
||||||
(err, compBuf) => {
|
|
||||||
if (err) return reject(err);
|
|
||||||
resolve(compBuf);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export type PseudoLayerResult = {
|
export type PseudoLayerResult = {
|
||||||
pseudoLayer: PseudoLayer;
|
pseudoLayer: PseudoLayer;
|
||||||
pseudoLayerBytes: number;
|
pseudoLayerBytes: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function createPseudoLayer(files: {
|
export async function createPseudoLayer({
|
||||||
|
files,
|
||||||
|
lstatSema,
|
||||||
|
lstatResults,
|
||||||
|
}: {
|
||||||
|
lstatSema: Sema;
|
||||||
|
lstatResults: { [key: string]: ReturnType<typeof lstat> };
|
||||||
|
files: {
|
||||||
[fileName: string]: FileFsRef;
|
[fileName: string]: FileFsRef;
|
||||||
|
};
|
||||||
}): Promise<PseudoLayerResult> {
|
}): Promise<PseudoLayerResult> {
|
||||||
const pseudoLayer: PseudoLayer = {};
|
|
||||||
let pseudoLayerBytes = 0;
|
let pseudoLayerBytes = 0;
|
||||||
|
const pseudoLayer: PseudoLayer = {};
|
||||||
|
const fileNames = Object.keys(files);
|
||||||
|
|
||||||
for (const fileName of Object.keys(files)) {
|
await Promise.all(
|
||||||
|
fileNames.map(async fileName => {
|
||||||
|
await lstatSema.acquire();
|
||||||
const file = files[fileName];
|
const file = files[fileName];
|
||||||
|
|
||||||
if (isSymbolicLink(file.mode)) {
|
if (isSymbolicLink(file.mode)) {
|
||||||
@@ -762,19 +753,24 @@ export async function createPseudoLayer(files: {
|
|||||||
symlinkTarget,
|
symlinkTarget,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
const origBuffer = await streamToBuffer(file.toStream());
|
if (!lstatResults[file.fsPath]) {
|
||||||
const compBuffer = await compressBuffer(origBuffer);
|
lstatResults[file.fsPath] = lstatSema
|
||||||
pseudoLayerBytes += compBuffer.byteLength;
|
.acquire()
|
||||||
|
.then(() => lstat(file.fsPath))
|
||||||
|
.finally(() => lstatSema.release());
|
||||||
|
}
|
||||||
|
const { size } = await lstatResults[file.fsPath];
|
||||||
|
|
||||||
|
pseudoLayerBytes += size;
|
||||||
pseudoLayer[fileName] = {
|
pseudoLayer[fileName] = {
|
||||||
file,
|
file,
|
||||||
compBuffer,
|
|
||||||
isSymlink: false,
|
isSymlink: false,
|
||||||
crc32: crc32.unsigned(origBuffer),
|
uncompressedSize: size,
|
||||||
uncompressedSize: origBuffer.byteLength,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
lstatSema.release();
|
||||||
|
})
|
||||||
|
);
|
||||||
return { pseudoLayer, pseudoLayerBytes };
|
return { pseudoLayer, pseudoLayerBytes };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -784,10 +780,6 @@ interface CreateLambdaFromPseudoLayersOptions extends LambdaOptionsWithFiles {
|
|||||||
nextVersion?: string;
|
nextVersion?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
// measured with 1, 2, 5, 10, and `os.cpus().length || 5`
|
|
||||||
// and sema(1) produced the best results
|
|
||||||
const createLambdaSema = new Sema(1);
|
|
||||||
|
|
||||||
export async function createLambdaFromPseudoLayers({
|
export async function createLambdaFromPseudoLayers({
|
||||||
files: baseFiles,
|
files: baseFiles,
|
||||||
layers,
|
layers,
|
||||||
@@ -795,8 +787,6 @@ export async function createLambdaFromPseudoLayers({
|
|||||||
nextVersion,
|
nextVersion,
|
||||||
...lambdaOptions
|
...lambdaOptions
|
||||||
}: CreateLambdaFromPseudoLayersOptions) {
|
}: CreateLambdaFromPseudoLayersOptions) {
|
||||||
await createLambdaSema.acquire();
|
|
||||||
|
|
||||||
const files: Files = {};
|
const files: Files = {};
|
||||||
const addedFiles = new Set();
|
const addedFiles = new Set();
|
||||||
|
|
||||||
@@ -823,8 +813,6 @@ export async function createLambdaFromPseudoLayers({
|
|||||||
addedFiles.add(fileName);
|
addedFiles.add(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
createLambdaSema.release();
|
|
||||||
|
|
||||||
return new NodejsLambda({
|
return new NodejsLambda({
|
||||||
...lambdaOptions,
|
...lambdaOptions,
|
||||||
...(isStreaming
|
...(isStreaming
|
||||||
@@ -1421,7 +1409,6 @@ export type LambdaGroup = {
|
|||||||
isApiLambda: boolean;
|
isApiLambda: boolean;
|
||||||
pseudoLayer: PseudoLayer;
|
pseudoLayer: PseudoLayer;
|
||||||
pseudoLayerBytes: number;
|
pseudoLayerBytes: number;
|
||||||
pseudoLayerUncompressedBytes: number;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export async function getPageLambdaGroups({
|
export async function getPageLambdaGroups({
|
||||||
@@ -1434,8 +1421,6 @@ export async function getPageLambdaGroups({
|
|||||||
compressedPages,
|
compressedPages,
|
||||||
tracedPseudoLayer,
|
tracedPseudoLayer,
|
||||||
initialPseudoLayer,
|
initialPseudoLayer,
|
||||||
initialPseudoLayerUncompressed,
|
|
||||||
lambdaCompressedByteLimit,
|
|
||||||
internalPages,
|
internalPages,
|
||||||
pageExtensions,
|
pageExtensions,
|
||||||
}: {
|
}: {
|
||||||
@@ -1454,8 +1439,6 @@ export async function getPageLambdaGroups({
|
|||||||
};
|
};
|
||||||
tracedPseudoLayer: PseudoLayer;
|
tracedPseudoLayer: PseudoLayer;
|
||||||
initialPseudoLayer: PseudoLayerResult;
|
initialPseudoLayer: PseudoLayerResult;
|
||||||
initialPseudoLayerUncompressed: number;
|
|
||||||
lambdaCompressedByteLimit: number;
|
|
||||||
internalPages: string[];
|
internalPages: string[];
|
||||||
pageExtensions?: string[];
|
pageExtensions?: string[];
|
||||||
}) {
|
}) {
|
||||||
@@ -1497,19 +1480,16 @@ export async function getPageLambdaGroups({
|
|||||||
group.isPrerenders === isPrerenderRoute;
|
group.isPrerenders === isPrerenderRoute;
|
||||||
|
|
||||||
if (matches) {
|
if (matches) {
|
||||||
let newTracedFilesSize = group.pseudoLayerBytes;
|
let newTracedFilesUncompressedSize = group.pseudoLayerBytes;
|
||||||
let newTracedFilesUncompressedSize = group.pseudoLayerUncompressedBytes;
|
|
||||||
|
|
||||||
for (const newPage of newPages) {
|
for (const newPage of newPages) {
|
||||||
Object.keys(pageTraces[newPage] || {}).map(file => {
|
Object.keys(pageTraces[newPage] || {}).map(file => {
|
||||||
if (!group.pseudoLayer[file]) {
|
if (!group.pseudoLayer[file]) {
|
||||||
const item = tracedPseudoLayer[file] as PseudoFile;
|
const item = tracedPseudoLayer[file] as PseudoFile;
|
||||||
|
|
||||||
newTracedFilesSize += item.compBuffer?.byteLength || 0;
|
|
||||||
newTracedFilesUncompressedSize += item.uncompressedSize || 0;
|
newTracedFilesUncompressedSize += item.uncompressedSize || 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
newTracedFilesSize += compressedPages[newPage].compBuffer.byteLength;
|
|
||||||
newTracedFilesUncompressedSize +=
|
newTracedFilesUncompressedSize +=
|
||||||
compressedPages[newPage].uncompressedSize;
|
compressedPages[newPage].uncompressedSize;
|
||||||
}
|
}
|
||||||
@@ -1517,11 +1497,8 @@ export async function getPageLambdaGroups({
|
|||||||
const underUncompressedLimit =
|
const underUncompressedLimit =
|
||||||
newTracedFilesUncompressedSize <
|
newTracedFilesUncompressedSize <
|
||||||
MAX_UNCOMPRESSED_LAMBDA_SIZE - LAMBDA_RESERVED_UNCOMPRESSED_SIZE;
|
MAX_UNCOMPRESSED_LAMBDA_SIZE - LAMBDA_RESERVED_UNCOMPRESSED_SIZE;
|
||||||
const underCompressedLimit =
|
|
||||||
newTracedFilesSize <
|
|
||||||
lambdaCompressedByteLimit - LAMBDA_RESERVED_COMPRESSED_SIZE;
|
|
||||||
|
|
||||||
return underUncompressedLimit && underCompressedLimit;
|
return underUncompressedLimit;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
@@ -1535,7 +1512,6 @@ export async function getPageLambdaGroups({
|
|||||||
isPrerenders: isPrerenderRoute,
|
isPrerenders: isPrerenderRoute,
|
||||||
isApiLambda: !!isApiPage(page),
|
isApiLambda: !!isApiPage(page),
|
||||||
pseudoLayerBytes: initialPseudoLayer.pseudoLayerBytes,
|
pseudoLayerBytes: initialPseudoLayer.pseudoLayerBytes,
|
||||||
pseudoLayerUncompressedBytes: initialPseudoLayerUncompressed,
|
|
||||||
pseudoLayer: Object.assign({}, initialPseudoLayer.pseudoLayer),
|
pseudoLayer: Object.assign({}, initialPseudoLayer.pseudoLayer),
|
||||||
};
|
};
|
||||||
groups.push(newGroup);
|
groups.push(newGroup);
|
||||||
@@ -1545,21 +1521,16 @@ export async function getPageLambdaGroups({
|
|||||||
for (const newPage of newPages) {
|
for (const newPage of newPages) {
|
||||||
Object.keys(pageTraces[newPage] || {}).map(file => {
|
Object.keys(pageTraces[newPage] || {}).map(file => {
|
||||||
const pseudoItem = tracedPseudoLayer[file] as PseudoFile;
|
const pseudoItem = tracedPseudoLayer[file] as PseudoFile;
|
||||||
const compressedSize = pseudoItem?.compBuffer?.byteLength || 0;
|
|
||||||
|
|
||||||
if (!matchingGroup!.pseudoLayer[file]) {
|
if (!matchingGroup!.pseudoLayer[file]) {
|
||||||
matchingGroup!.pseudoLayer[file] = pseudoItem;
|
matchingGroup!.pseudoLayer[file] = pseudoItem;
|
||||||
matchingGroup!.pseudoLayerBytes += compressedSize;
|
matchingGroup!.pseudoLayerBytes += pseudoItem.uncompressedSize || 0;
|
||||||
matchingGroup!.pseudoLayerUncompressedBytes +=
|
|
||||||
pseudoItem.uncompressedSize || 0;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// ensure the page file itself is accounted for when grouping as
|
// ensure the page file itself is accounted for when grouping as
|
||||||
// large pages can be created that can push the group over the limit
|
// large pages can be created that can push the group over the limit
|
||||||
matchingGroup!.pseudoLayerBytes +=
|
matchingGroup!.pseudoLayerBytes +=
|
||||||
compressedPages[newPage].compBuffer.byteLength;
|
|
||||||
matchingGroup!.pseudoLayerUncompressedBytes +=
|
|
||||||
compressedPages[newPage].uncompressedSize;
|
compressedPages[newPage].uncompressedSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1571,7 +1542,6 @@ export const outputFunctionFileSizeInfo = (
|
|||||||
pages: string[],
|
pages: string[],
|
||||||
pseudoLayer: PseudoLayer,
|
pseudoLayer: PseudoLayer,
|
||||||
pseudoLayerBytes: number,
|
pseudoLayerBytes: number,
|
||||||
pseudoLayerUncompressedBytes: number,
|
|
||||||
compressedPages: {
|
compressedPages: {
|
||||||
[page: string]: PseudoFile;
|
[page: string]: PseudoFile;
|
||||||
}
|
}
|
||||||
@@ -1583,15 +1553,10 @@ export const outputFunctionFileSizeInfo = (
|
|||||||
', '
|
', '
|
||||||
)}`
|
)}`
|
||||||
);
|
);
|
||||||
exceededLimitOutput.push([
|
exceededLimitOutput.push(['Large Dependencies', 'Uncompressed size']);
|
||||||
'Large Dependencies',
|
|
||||||
'Uncompressed size',
|
|
||||||
'Compressed size',
|
|
||||||
]);
|
|
||||||
|
|
||||||
const dependencies: {
|
const dependencies: {
|
||||||
[key: string]: {
|
[key: string]: {
|
||||||
compressed: number;
|
|
||||||
uncompressed: number;
|
uncompressed: number;
|
||||||
};
|
};
|
||||||
} = {};
|
} = {};
|
||||||
@@ -1603,19 +1568,16 @@ export const outputFunctionFileSizeInfo = (
|
|||||||
|
|
||||||
if (!dependencies[depKey]) {
|
if (!dependencies[depKey]) {
|
||||||
dependencies[depKey] = {
|
dependencies[depKey] = {
|
||||||
compressed: 0,
|
|
||||||
uncompressed: 0,
|
uncompressed: 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies[depKey].compressed += fileItem.compBuffer.byteLength;
|
|
||||||
dependencies[depKey].uncompressed += fileItem.uncompressedSize;
|
dependencies[depKey].uncompressed += fileItem.uncompressedSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const page of pages) {
|
for (const page of pages) {
|
||||||
dependencies[`pages/${page}`] = {
|
dependencies[`pages/${page}`] = {
|
||||||
compressed: compressedPages[page].compBuffer.byteLength,
|
|
||||||
uncompressed: compressedPages[page].uncompressedSize,
|
uncompressed: compressedPages[page].uncompressedSize,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1627,10 +1589,10 @@ export const outputFunctionFileSizeInfo = (
|
|||||||
const aDep = dependencies[a];
|
const aDep = dependencies[a];
|
||||||
const bDep = dependencies[b];
|
const bDep = dependencies[b];
|
||||||
|
|
||||||
if (aDep.compressed > bDep.compressed) {
|
if (aDep.uncompressed > bDep.uncompressed) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (aDep.compressed < bDep.compressed) {
|
if (aDep.uncompressed < bDep.uncompressed) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1638,15 +1600,11 @@ export const outputFunctionFileSizeInfo = (
|
|||||||
.forEach(depKey => {
|
.forEach(depKey => {
|
||||||
const dep = dependencies[depKey];
|
const dep = dependencies[depKey];
|
||||||
|
|
||||||
if (dep.compressed < 100 * KIB && dep.uncompressed < 500 * KIB) {
|
if (dep.uncompressed < 500 * KIB) {
|
||||||
// ignore smaller dependencies to reduce noise
|
// ignore smaller dependencies to reduce noise
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
exceededLimitOutput.push([
|
exceededLimitOutput.push([depKey, prettyBytes(dep.uncompressed)]);
|
||||||
depKey,
|
|
||||||
prettyBytes(dep.uncompressed),
|
|
||||||
prettyBytes(dep.compressed),
|
|
||||||
]);
|
|
||||||
numLargeDependencies += 1;
|
numLargeDependencies += 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1657,11 +1615,7 @@ export const outputFunctionFileSizeInfo = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
exceededLimitOutput.push([]);
|
exceededLimitOutput.push([]);
|
||||||
exceededLimitOutput.push([
|
exceededLimitOutput.push(['All dependencies', prettyBytes(pseudoLayerBytes)]);
|
||||||
'All dependencies',
|
|
||||||
prettyBytes(pseudoLayerUncompressedBytes),
|
|
||||||
prettyBytes(pseudoLayerBytes),
|
|
||||||
]);
|
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
textTable(exceededLimitOutput, {
|
textTable(exceededLimitOutput, {
|
||||||
@@ -1672,13 +1626,11 @@ export const outputFunctionFileSizeInfo = (
|
|||||||
|
|
||||||
export const detectLambdaLimitExceeding = async (
|
export const detectLambdaLimitExceeding = async (
|
||||||
lambdaGroups: LambdaGroup[],
|
lambdaGroups: LambdaGroup[],
|
||||||
compressedSizeLimit: number,
|
|
||||||
compressedPages: {
|
compressedPages: {
|
||||||
[page: string]: PseudoFile;
|
[page: string]: PseudoFile;
|
||||||
}
|
}
|
||||||
) => {
|
) => {
|
||||||
// show debug info if within 5 MB of exceeding the limit
|
// show debug info if within 5 MB of exceeding the limit
|
||||||
const COMPRESSED_SIZE_LIMIT_CLOSE = compressedSizeLimit - 5 * MIB;
|
|
||||||
const UNCOMPRESSED_SIZE_LIMIT_CLOSE = MAX_UNCOMPRESSED_LAMBDA_SIZE - 5 * MIB;
|
const UNCOMPRESSED_SIZE_LIMIT_CLOSE = MAX_UNCOMPRESSED_LAMBDA_SIZE - 5 * MIB;
|
||||||
|
|
||||||
let numExceededLimit = 0;
|
let numExceededLimit = 0;
|
||||||
@@ -1688,13 +1640,9 @@ export const detectLambdaLimitExceeding = async (
|
|||||||
// pre-iterate to see if we are going to exceed the limit
|
// pre-iterate to see if we are going to exceed the limit
|
||||||
// or only get close so our first log line can be correct
|
// or only get close so our first log line can be correct
|
||||||
const filteredGroups = lambdaGroups.filter(group => {
|
const filteredGroups = lambdaGroups.filter(group => {
|
||||||
const exceededLimit =
|
const exceededLimit = group.pseudoLayerBytes > MAX_UNCOMPRESSED_LAMBDA_SIZE;
|
||||||
group.pseudoLayerBytes > compressedSizeLimit ||
|
|
||||||
group.pseudoLayerUncompressedBytes > MAX_UNCOMPRESSED_LAMBDA_SIZE;
|
|
||||||
|
|
||||||
const closeToLimit =
|
const closeToLimit = group.pseudoLayerBytes > UNCOMPRESSED_SIZE_LIMIT_CLOSE;
|
||||||
group.pseudoLayerBytes > COMPRESSED_SIZE_LIMIT_CLOSE ||
|
|
||||||
group.pseudoLayerUncompressedBytes > UNCOMPRESSED_SIZE_LIMIT_CLOSE;
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
closeToLimit ||
|
closeToLimit ||
|
||||||
@@ -1717,8 +1665,6 @@ export const detectLambdaLimitExceeding = async (
|
|||||||
if (numExceededLimit || numCloseToLimit) {
|
if (numExceededLimit || numCloseToLimit) {
|
||||||
console.log(
|
console.log(
|
||||||
`Warning: Max serverless function size of ${prettyBytes(
|
`Warning: Max serverless function size of ${prettyBytes(
|
||||||
compressedSizeLimit
|
|
||||||
)} compressed or ${prettyBytes(
|
|
||||||
MAX_UNCOMPRESSED_LAMBDA_SIZE
|
MAX_UNCOMPRESSED_LAMBDA_SIZE
|
||||||
)} uncompressed${numExceededLimit ? '' : ' almost'} reached`
|
)} uncompressed${numExceededLimit ? '' : ' almost'} reached`
|
||||||
);
|
);
|
||||||
@@ -1732,7 +1678,6 @@ export const detectLambdaLimitExceeding = async (
|
|||||||
group.pages,
|
group.pages,
|
||||||
group.pseudoLayer,
|
group.pseudoLayer,
|
||||||
group.pseudoLayerBytes,
|
group.pseudoLayerBytes,
|
||||||
group.pseudoLayerUncompressedBytes,
|
|
||||||
compressedPages
|
compressedPages
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -2567,15 +2512,14 @@ export function normalizeEdgeFunctionPath(
|
|||||||
appPathRoutesManifest[ogRoute] ||
|
appPathRoutesManifest[ogRoute] ||
|
||||||
shortPath.replace(/(^|\/)(page|route)$/, '')
|
shortPath.replace(/(^|\/)(page|route)$/, '')
|
||||||
).replace(/^\//, '');
|
).replace(/^\//, '');
|
||||||
|
|
||||||
if (!shortPath || shortPath === '/') {
|
|
||||||
shortPath = 'index';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shortPath.startsWith('pages/')) {
|
if (shortPath.startsWith('pages/')) {
|
||||||
shortPath = shortPath.replace(/^pages\//, '');
|
shortPath = shortPath.replace(/^pages\//, '');
|
||||||
}
|
}
|
||||||
|
if (!shortPath || shortPath === '/') {
|
||||||
|
shortPath = 'index';
|
||||||
|
}
|
||||||
|
|
||||||
return shortPath;
|
return shortPath;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -245,6 +245,8 @@ it('Should invoke build command with serverless-no-config', async () => {
|
|||||||
).toBeFalsy();
|
).toBeFalsy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// TODO: should we delete these tests, they are unreliable as size can fluctuate
|
||||||
|
// and also requires creating massive lambdas (> 250MB) to test
|
||||||
// eslint-disable-next-line jest/no-disabled-tests
|
// eslint-disable-next-line jest/no-disabled-tests
|
||||||
it.skip('Should not exceed function limit for large dependencies (server build)', async () => {
|
it.skip('Should not exceed function limit for large dependencies (server build)', async () => {
|
||||||
let logs = '';
|
let logs = '';
|
||||||
@@ -350,7 +352,8 @@ it.skip('Should not exceed function limit for large dependencies (shared lambda)
|
|||||||
expect(logs).toContain('node_modules/chrome-aws-lambda/bin');
|
expect(logs).toContain('node_modules/chrome-aws-lambda/bin');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should provide lambda info when limit is hit (server build)', async () => {
|
// eslint-disable-next-line jest/no-disabled-tests
|
||||||
|
it.skip('Should provide lambda info when limit is hit (server build)', async () => {
|
||||||
let logs = '';
|
let logs = '';
|
||||||
|
|
||||||
const origLog = console.log;
|
const origLog = console.log;
|
||||||
@@ -373,7 +376,7 @@ it('Should provide lambda info when limit is hit (server build)', async () => {
|
|||||||
'Max serverless function size was exceeded for 2 functions'
|
'Max serverless function size was exceeded for 2 functions'
|
||||||
);
|
);
|
||||||
expect(logs).toContain(
|
expect(logs).toContain(
|
||||||
'Max serverless function size of 50 MB compressed or 250 MB uncompressed reached'
|
'Max serverless function size of 250 MB uncompressed reached'
|
||||||
);
|
);
|
||||||
expect(logs).toContain(`Serverless Function's page: api/both.js`);
|
expect(logs).toContain(`Serverless Function's page: api/both.js`);
|
||||||
expect(logs).toMatch(
|
expect(logs).toMatch(
|
||||||
@@ -387,7 +390,8 @@ it('Should provide lambda info when limit is hit (server build)', async () => {
|
|||||||
expect(logs).toMatch(/big-image-2/);
|
expect(logs).toMatch(/big-image-2/);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should provide lambda info when limit is hit (shared lambdas)', async () => {
|
// eslint-disable-next-line jest/no-disabled-tests
|
||||||
|
it.skip('Should provide lambda info when limit is hit (shared lambdas)', async () => {
|
||||||
let logs = '';
|
let logs = '';
|
||||||
|
|
||||||
const origLog = console.log;
|
const origLog = console.log;
|
||||||
@@ -410,7 +414,7 @@ it('Should provide lambda info when limit is hit (shared lambdas)', async () =>
|
|||||||
'Max serverless function size was exceeded for 1 function'
|
'Max serverless function size was exceeded for 1 function'
|
||||||
);
|
);
|
||||||
expect(logs).toContain(
|
expect(logs).toContain(
|
||||||
'Max serverless function size of 50 MB compressed or 250 MB uncompressed reached'
|
'Max serverless function size of 250 MB uncompressed reached'
|
||||||
);
|
);
|
||||||
expect(logs).toContain(`Serverless Function's page: api/both.js`);
|
expect(logs).toContain(`Serverless Function's page: api/both.js`);
|
||||||
expect(logs).toMatch(
|
expect(logs).toMatch(
|
||||||
@@ -422,7 +426,8 @@ it('Should provide lambda info when limit is hit (shared lambdas)', async () =>
|
|||||||
expect(logs).toMatch(/node_modules\/@firebase\/firestore.*?\d{1}.*?MB/);
|
expect(logs).toMatch(/node_modules\/@firebase\/firestore.*?\d{1}.*?MB/);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should provide lambda info when limit is hit for internal pages (server build)', async () => {
|
// eslint-disable-next-line jest/no-disabled-tests
|
||||||
|
it.skip('Should provide lambda info when limit is hit for internal pages (server build)', async () => {
|
||||||
let logs = '';
|
let logs = '';
|
||||||
|
|
||||||
const origLog = console.log;
|
const origLog = console.log;
|
||||||
@@ -442,7 +447,7 @@ it('Should provide lambda info when limit is hit for internal pages (server buil
|
|||||||
console.log = origLog;
|
console.log = origLog;
|
||||||
|
|
||||||
expect(logs).toContain(
|
expect(logs).toContain(
|
||||||
'Max serverless function size of 50 MB compressed or 250 MB uncompressed reached'
|
'Max serverless function size of 250 MB uncompressed reached'
|
||||||
);
|
);
|
||||||
// expect(logs).toContain(`Serverless Function's page: api/firebase.js`);
|
// expect(logs).toContain(`Serverless Function's page: api/firebase.js`);
|
||||||
expect(logs).toContain(`Serverless Function's page: api/chrome.js`);
|
expect(logs).toContain(`Serverless Function's page: api/chrome.js`);
|
||||||
@@ -458,7 +463,8 @@ it('Should provide lambda info when limit is hit for internal pages (server buil
|
|||||||
expect(logs).toMatch(/public\/big-image-2\.jpg/);
|
expect(logs).toMatch(/public\/big-image-2\.jpg/);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should provide lambda info when limit is hit (uncompressed)', async () => {
|
// eslint-disable-next-line jest/no-disabled-tests
|
||||||
|
it.skip('Should provide lambda info when limit is hit (uncompressed)', async () => {
|
||||||
let logs = '';
|
let logs = '';
|
||||||
|
|
||||||
const origLog = console.log;
|
const origLog = console.log;
|
||||||
@@ -481,7 +487,7 @@ it('Should provide lambda info when limit is hit (uncompressed)', async () => {
|
|||||||
'Max serverless function size was exceeded for 1 function'
|
'Max serverless function size was exceeded for 1 function'
|
||||||
);
|
);
|
||||||
expect(logs).toContain(
|
expect(logs).toContain(
|
||||||
'Max serverless function size of 50 MB compressed or 250 MB uncompressed reached'
|
'Max serverless function size of 250 MB uncompressed reached'
|
||||||
);
|
);
|
||||||
expect(logs).toContain(`Serverless Function's page: api/hello.js`);
|
expect(logs).toContain(`Serverless Function's page: api/hello.js`);
|
||||||
expect(logs).toMatch(
|
expect(logs).toMatch(
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ describe(`${__dirname.split(path.sep).pop()}`, () => {
|
|||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
const { output, routes } = await build({
|
const { output, routes } = await build({
|
||||||
config: {},
|
config: {
|
||||||
|
installCommand: 'yarn',
|
||||||
|
},
|
||||||
entrypoint: 'package.json',
|
entrypoint: 'package.json',
|
||||||
files,
|
files,
|
||||||
meta: {
|
meta: {
|
||||||
|
|||||||
@@ -1,184 +0,0 @@
|
|||||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
||||||
# yarn lockfile v1
|
|
||||||
|
|
||||||
|
|
||||||
"@next/env@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-12.3.1.tgz#18266bd92de3b4aa4037b1927aa59e6f11879260"
|
|
||||||
integrity sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg==
|
|
||||||
|
|
||||||
"@next/swc-android-arm-eabi@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz#b15ce8ad376102a3b8c0f3c017dde050a22bb1a3"
|
|
||||||
integrity sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ==
|
|
||||||
|
|
||||||
"@next/swc-android-arm64@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz#85d205f568a790a137cb3c3f720d961a2436ac9c"
|
|
||||||
integrity sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q==
|
|
||||||
|
|
||||||
"@next/swc-darwin-arm64@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz#b105457d6760a7916b27e46c97cb1a40547114ae"
|
|
||||||
integrity sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg==
|
|
||||||
|
|
||||||
"@next/swc-darwin-x64@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz#6947b39082271378896b095b6696a7791c6e32b1"
|
|
||||||
integrity sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA==
|
|
||||||
|
|
||||||
"@next/swc-freebsd-x64@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz#2b6c36a4d84aae8b0ea0e0da9bafc696ae27085a"
|
|
||||||
integrity sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm-gnueabihf@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz#6e421c44285cfedac1f4631d5de330dd60b86298"
|
|
||||||
integrity sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-gnu@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz#8863f08a81f422f910af126159d2cbb9552ef717"
|
|
||||||
integrity sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-musl@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz#0038f07cf0b259d70ae0c80890d826dfc775d9f3"
|
|
||||||
integrity sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-gnu@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz#c66468f5e8181ffb096c537f0dbfb589baa6a9c1"
|
|
||||||
integrity sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-musl@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz#c6269f3e96ac0395bc722ad97ce410ea5101d305"
|
|
||||||
integrity sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg==
|
|
||||||
|
|
||||||
"@next/swc-win32-arm64-msvc@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz#83c639ee969cee36ce247c3abd1d9df97b5ecade"
|
|
||||||
integrity sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw==
|
|
||||||
|
|
||||||
"@next/swc-win32-ia32-msvc@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz#52995748b92aa8ad053440301bc2c0d9fbcf27c2"
|
|
||||||
integrity sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA==
|
|
||||||
|
|
||||||
"@next/swc-win32-x64-msvc@12.3.1":
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz#27d71a95247a9eaee03d47adee7e3bd594514136"
|
|
||||||
integrity sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==
|
|
||||||
|
|
||||||
"@swc/helpers@0.4.11":
|
|
||||||
version "0.4.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.11.tgz#db23a376761b3d31c26502122f349a21b592c8de"
|
|
||||||
integrity sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
caniuse-lite@^1.0.30001406:
|
|
||||||
version "1.0.30001409"
|
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001409.tgz#6135da9dcab34cd9761d9cdb12a68e6740c5e96e"
|
|
||||||
integrity sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ==
|
|
||||||
|
|
||||||
"js-tokens@^3.0.0 || ^4.0.0":
|
|
||||||
version "4.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
|
||||||
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
|
||||||
|
|
||||||
loose-envify@^1.1.0:
|
|
||||||
version "1.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
|
||||||
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
|
||||||
dependencies:
|
|
||||||
js-tokens "^3.0.0 || ^4.0.0"
|
|
||||||
|
|
||||||
nanoid@^3.3.4:
|
|
||||||
version "3.3.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
|
|
||||||
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
|
|
||||||
|
|
||||||
next@latest:
|
|
||||||
version "12.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/next/-/next-12.3.1.tgz#127b825ad2207faf869b33393ec8c75fe61e50f1"
|
|
||||||
integrity sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==
|
|
||||||
dependencies:
|
|
||||||
"@next/env" "12.3.1"
|
|
||||||
"@swc/helpers" "0.4.11"
|
|
||||||
caniuse-lite "^1.0.30001406"
|
|
||||||
postcss "8.4.14"
|
|
||||||
styled-jsx "5.0.7"
|
|
||||||
use-sync-external-store "1.2.0"
|
|
||||||
optionalDependencies:
|
|
||||||
"@next/swc-android-arm-eabi" "12.3.1"
|
|
||||||
"@next/swc-android-arm64" "12.3.1"
|
|
||||||
"@next/swc-darwin-arm64" "12.3.1"
|
|
||||||
"@next/swc-darwin-x64" "12.3.1"
|
|
||||||
"@next/swc-freebsd-x64" "12.3.1"
|
|
||||||
"@next/swc-linux-arm-gnueabihf" "12.3.1"
|
|
||||||
"@next/swc-linux-arm64-gnu" "12.3.1"
|
|
||||||
"@next/swc-linux-arm64-musl" "12.3.1"
|
|
||||||
"@next/swc-linux-x64-gnu" "12.3.1"
|
|
||||||
"@next/swc-linux-x64-musl" "12.3.1"
|
|
||||||
"@next/swc-win32-arm64-msvc" "12.3.1"
|
|
||||||
"@next/swc-win32-ia32-msvc" "12.3.1"
|
|
||||||
"@next/swc-win32-x64-msvc" "12.3.1"
|
|
||||||
|
|
||||||
picocolors@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
|
||||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
|
||||||
|
|
||||||
postcss@8.4.14:
|
|
||||||
version "8.4.14"
|
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
|
|
||||||
integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
|
|
||||||
dependencies:
|
|
||||||
nanoid "^3.3.4"
|
|
||||||
picocolors "^1.0.0"
|
|
||||||
source-map-js "^1.0.2"
|
|
||||||
|
|
||||||
react-dom@latest:
|
|
||||||
version "18.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
|
|
||||||
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
scheduler "^0.23.0"
|
|
||||||
|
|
||||||
react@latest:
|
|
||||||
version "18.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
|
|
||||||
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
|
|
||||||
scheduler@^0.23.0:
|
|
||||||
version "0.23.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
|
|
||||||
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
|
|
||||||
source-map-js@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
|
||||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
|
||||||
|
|
||||||
styled-jsx@5.0.7:
|
|
||||||
version "5.0.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.7.tgz#be44afc53771b983769ac654d355ca8d019dff48"
|
|
||||||
integrity sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==
|
|
||||||
|
|
||||||
tslib@^2.4.0:
|
|
||||||
version "2.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
|
|
||||||
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
|
|
||||||
|
|
||||||
use-sync-external-store@1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
|
|
||||||
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
|
|
||||||
@@ -35,7 +35,9 @@ describe(`${__dirname.split(path.sep).pop()}`, () => {
|
|||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
const { output } = await build({
|
const { output } = await build({
|
||||||
config: {},
|
config: {
|
||||||
|
installCommand: 'yarn',
|
||||||
|
},
|
||||||
entrypoint: 'package.json',
|
entrypoint: 'package.json',
|
||||||
files,
|
files,
|
||||||
meta: {
|
meta: {
|
||||||
|
|||||||
@@ -1,191 +0,0 @@
|
|||||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
||||||
# yarn lockfile v1
|
|
||||||
|
|
||||||
|
|
||||||
"@next/env@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.0.1.tgz#0361e203c7bfbc7b69679ec48f7b45a8f4cb1c2c"
|
|
||||||
integrity sha512-gK60YoFae3s8qi5UgIzbvxOhsh5gKyEaiKH5+kLBUYXLlrPyWJR2xKBj2WqvHkO7wDX7/Hed3DAqjSpU4ijIvQ==
|
|
||||||
|
|
||||||
"@next/swc-android-arm-eabi@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.1.tgz#7ce2a7b6576845bc6d7f55504bf9b82a0d9a2792"
|
|
||||||
integrity sha512-M28QSbohZlNXNn//HY6lV2T3YaMzG58Jwr0YwOdVmOQv6i+7lu6xe3GqQu4kdqInqhLrBXnL+nabFuGTVSHtTg==
|
|
||||||
|
|
||||||
"@next/swc-android-arm64@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.0.1.tgz#85a13d7667042394939741be218076e4e83a45a2"
|
|
||||||
integrity sha512-szmO/i6GoHcPXcbhUKhwBMETWHNXH3ITz9wfxwOOFBNKdDU8pjKsHL88lg28aOiQYZSU1sxu1v1p9KY5kJIZCg==
|
|
||||||
|
|
||||||
"@next/swc-darwin-arm64@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.1.tgz#d615d286127bb096a8950a9d7180fcc5d307614d"
|
|
||||||
integrity sha512-O1RxCaiDNOjGZmdAp6SQoHUITt9aVDQXoR3lZ/TloI/NKRAyAV4u0KUUofK+KaZeHOmVTnPUaQuCyZSc3i1x5Q==
|
|
||||||
|
|
||||||
"@next/swc-darwin-x64@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.1.tgz#f410beb8cbe0e82562226309f8ec8924cc6cb410"
|
|
||||||
integrity sha512-8E6BY/VO+QqQkthhoWgB8mJMw1NcN9Vhl2OwEwxv8jy2r3zjeU+WNRxz4y8RLbcY0R1h+vHlXuP0mLnuac84tQ==
|
|
||||||
|
|
||||||
"@next/swc-freebsd-x64@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.1.tgz#16eb9652d3f638305ca16b558408f5bc5eb6edde"
|
|
||||||
integrity sha512-ocwoOxm2KVwF50RyoAT+2RQPLlkyoF7sAqzMUVgj+S6+DTkY3iwH+Zpo0XAk2pnqT9qguOrKnEpq9EIx//+K7Q==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm-gnueabihf@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.1.tgz#0da0700ccf654f813b4c86d057a998598a2fd427"
|
|
||||||
integrity sha512-yO7e3zITfGol/N6lPQnmIRi0WyuILBMXrvH6EdmWzzqMDJFfTCII6l+B6gMO5WVDCTQUGQlQRNZ7sFqWR4I71g==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-gnu@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.1.tgz#f34759cd41086f5b8b582081b2af54f67dc544ae"
|
|
||||||
integrity sha512-OEs6WDPDI8RyM8SjOqTDMqMBfOlU97VnW6ZMXUvzUTyH0K9c7NF+cn7UMu+I4tKFN0uJ9WQs/6TYaFBGkgoVVA==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-musl@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.1.tgz#bcfbf1cdfb9f4d632e7ebd67fd62b768cdd08cb7"
|
|
||||||
integrity sha512-y5ypFK0Y3urZSFoQxbtDqvKsBx026sz+Fm+xHlPWlGHNZrbs3Q812iONjcZTo09QwRMk5X86iMWBRxV18xMhaw==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-gnu@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.1.tgz#ed77528d4a3195d5e57d5d94d12cb2206c2b19ac"
|
|
||||||
integrity sha512-XDIHEE6SU8VCF+dUVntD6PDv6RK31N0forx9kucZBYirbe8vCZ+Yx8hYgvtIaGrTcWtGxibxmND0pIuHDq8H5g==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-musl@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.1.tgz#74cda49229d2a7fa421fee6b7dcd621a57934a5e"
|
|
||||||
integrity sha512-yxIOuuz5EOx0F1FDtsyzaLgnDym0Ysxv8CWeJyDTKKmt9BVyITg6q/cD+RP9bEkT1TQi+PYXIMATSz675Q82xw==
|
|
||||||
|
|
||||||
"@next/swc-win32-arm64-msvc@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.1.tgz#15d6add92aa897148d6c45749bf9d2eacee87197"
|
|
||||||
integrity sha512-+ucLe2qgQzP+FM94jD4ns6LDGyMFaX9k3lVHqu/tsQCy2giMymbport4y4p77mYcXEMlDaHMzlHgOQyHRniWFA==
|
|
||||||
|
|
||||||
"@next/swc-win32-ia32-msvc@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.1.tgz#e0c57902fe75327d092abb1ef19657775fe26f85"
|
|
||||||
integrity sha512-Krr/qGN7OB35oZuvMAZKoXDt2IapynIWLh5A5rz6AODb7f/ZJqyAuZSK12vOa2zKdobS36Qm4IlxxBqn9c00MA==
|
|
||||||
|
|
||||||
"@next/swc-win32-x64-msvc@13.0.1":
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.1.tgz#469dde61519f6a310874af93ee5969f1d5ff6d03"
|
|
||||||
integrity sha512-t/0G33t/6VGWZUGCOT7rG42qqvf/x+MrFp1CU+8CN6PrjSSL57R5bqkXfubV9t4eCEnUxVP+5Hn3MoEXEebtEw==
|
|
||||||
|
|
||||||
"@swc/helpers@0.4.11":
|
|
||||||
version "0.4.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.11.tgz#db23a376761b3d31c26502122f349a21b592c8de"
|
|
||||||
integrity sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
caniuse-lite@^1.0.30001406:
|
|
||||||
version "1.0.30001429"
|
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz#70cdae959096756a85713b36dd9cb82e62325639"
|
|
||||||
integrity sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==
|
|
||||||
|
|
||||||
client-only@0.0.1:
|
|
||||||
version "0.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
|
|
||||||
integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
|
|
||||||
|
|
||||||
"js-tokens@^3.0.0 || ^4.0.0":
|
|
||||||
version "4.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
|
||||||
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
|
||||||
|
|
||||||
loose-envify@^1.1.0:
|
|
||||||
version "1.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
|
||||||
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
|
||||||
dependencies:
|
|
||||||
js-tokens "^3.0.0 || ^4.0.0"
|
|
||||||
|
|
||||||
nanoid@^3.3.4:
|
|
||||||
version "3.3.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
|
|
||||||
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
|
|
||||||
|
|
||||||
next@latest:
|
|
||||||
version "13.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/next/-/next-13.0.1.tgz#8b4fc9998e58f503bdecb92f06fe6f850ac260d0"
|
|
||||||
integrity sha512-ErCNBPIeZMKFn6hX+ZBSlqZVgJIeitEqhGTuQUNmYXJ07/A71DZ7AJI8eyHYUdBb686LUpV1/oBdTq9RpzRVPg==
|
|
||||||
dependencies:
|
|
||||||
"@next/env" "13.0.1"
|
|
||||||
"@swc/helpers" "0.4.11"
|
|
||||||
caniuse-lite "^1.0.30001406"
|
|
||||||
postcss "8.4.14"
|
|
||||||
styled-jsx "5.1.0"
|
|
||||||
use-sync-external-store "1.2.0"
|
|
||||||
optionalDependencies:
|
|
||||||
"@next/swc-android-arm-eabi" "13.0.1"
|
|
||||||
"@next/swc-android-arm64" "13.0.1"
|
|
||||||
"@next/swc-darwin-arm64" "13.0.1"
|
|
||||||
"@next/swc-darwin-x64" "13.0.1"
|
|
||||||
"@next/swc-freebsd-x64" "13.0.1"
|
|
||||||
"@next/swc-linux-arm-gnueabihf" "13.0.1"
|
|
||||||
"@next/swc-linux-arm64-gnu" "13.0.1"
|
|
||||||
"@next/swc-linux-arm64-musl" "13.0.1"
|
|
||||||
"@next/swc-linux-x64-gnu" "13.0.1"
|
|
||||||
"@next/swc-linux-x64-musl" "13.0.1"
|
|
||||||
"@next/swc-win32-arm64-msvc" "13.0.1"
|
|
||||||
"@next/swc-win32-ia32-msvc" "13.0.1"
|
|
||||||
"@next/swc-win32-x64-msvc" "13.0.1"
|
|
||||||
|
|
||||||
picocolors@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
|
||||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
|
||||||
|
|
||||||
postcss@8.4.14:
|
|
||||||
version "8.4.14"
|
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
|
|
||||||
integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
|
|
||||||
dependencies:
|
|
||||||
nanoid "^3.3.4"
|
|
||||||
picocolors "^1.0.0"
|
|
||||||
source-map-js "^1.0.2"
|
|
||||||
|
|
||||||
react-dom@latest:
|
|
||||||
version "18.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
|
|
||||||
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
scheduler "^0.23.0"
|
|
||||||
|
|
||||||
react@latest:
|
|
||||||
version "18.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
|
|
||||||
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
|
|
||||||
scheduler@^0.23.0:
|
|
||||||
version "0.23.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
|
|
||||||
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
|
|
||||||
source-map-js@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
|
||||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
|
||||||
|
|
||||||
styled-jsx@5.1.0:
|
|
||||||
version "5.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.0.tgz#4a5622ab9714bd3fcfaeec292aa555871f057563"
|
|
||||||
integrity sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==
|
|
||||||
dependencies:
|
|
||||||
client-only "0.0.1"
|
|
||||||
|
|
||||||
tslib@^2.4.0:
|
|
||||||
version "2.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
|
|
||||||
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
|
|
||||||
|
|
||||||
use-sync-external-store@1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
|
|
||||||
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
||||||
# yarn lockfile v1
|
|
||||||
|
|
||||||
|
|
||||||
"@next/env@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.1.6.tgz#c4925609f16142ded1a5cb833359ab17359b7a93"
|
|
||||||
integrity sha512-s+W9Fdqh5MFk6ECrbnVmmAOwxKQuhGMT7xXHrkYIBMBcTiOqNWhv5KbJIboKR5STXxNXl32hllnvKaffzFaWQg==
|
|
||||||
|
|
||||||
"@next/swc-android-arm-eabi@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.1.6.tgz#d766dfc10e27814d947b20f052067c239913dbcc"
|
|
||||||
integrity sha512-F3/6Z8LH/pGlPzR1AcjPFxx35mPqjE5xZcf+IL+KgbW9tMkp7CYi1y7qKrEWU7W4AumxX/8OINnDQWLiwLasLQ==
|
|
||||||
|
|
||||||
"@next/swc-android-arm64@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.1.6.tgz#f37a98d5f18927d8c9970d750d516ac779465176"
|
|
||||||
integrity sha512-cMwQjnB8vrYkWyK/H0Rf2c2pKIH4RGjpKUDvbjVAit6SbwPDpmaijLio0LWFV3/tOnY6kvzbL62lndVA0mkYpw==
|
|
||||||
|
|
||||||
"@next/swc-darwin-arm64@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.1.6.tgz#ec1b90fd9bf809d8b81004c5182e254dced4ad96"
|
|
||||||
integrity sha512-KKRQH4DDE4kONXCvFMNBZGDb499Hs+xcFAwvj+rfSUssIDrZOlyfJNy55rH5t2Qxed1e4K80KEJgsxKQN1/fyw==
|
|
||||||
|
|
||||||
"@next/swc-darwin-x64@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.1.6.tgz#e869ac75d16995eee733a7d1550322d9051c1eb4"
|
|
||||||
integrity sha512-/uOky5PaZDoaU99ohjtNcDTJ6ks/gZ5ykTQDvNZDjIoCxFe3+t06bxsTPY6tAO6uEAw5f6vVFX5H5KLwhrkZCA==
|
|
||||||
|
|
||||||
"@next/swc-freebsd-x64@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.1.6.tgz#84a7b2e423a2904afc2edca21c2f1ba6b53fa4c1"
|
|
||||||
integrity sha512-qaEALZeV7to6weSXk3Br80wtFQ7cFTpos/q+m9XVRFggu+8Ib895XhMWdJBzew6aaOcMvYR6KQ6JmHA2/eMzWw==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm-gnueabihf@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.1.6.tgz#980eed1f655ff8a72187d8a6ef9e73ac39d20d23"
|
|
||||||
integrity sha512-OybkbC58A1wJ+JrJSOjGDvZzrVEQA4sprJejGqMwiZyLqhr9Eo8FXF0y6HL+m1CPCpPhXEHz/2xKoYsl16kNqw==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-gnu@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.1.6.tgz#87a71db21cded3f7c63d1d19079845c59813c53d"
|
|
||||||
integrity sha512-yCH+yDr7/4FDuWv6+GiYrPI9kcTAO3y48UmaIbrKy8ZJpi7RehJe3vIBRUmLrLaNDH3rY1rwoHi471NvR5J5NQ==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-musl@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.1.6.tgz#c5aac8619331b9fd030603bbe2b36052011e11de"
|
|
||||||
integrity sha512-ECagB8LGX25P9Mrmlc7Q/TQBb9rGScxHbv/kLqqIWs2fIXy6Y/EiBBiM72NTwuXUFCNrWR4sjUPSooVBJJ3ESQ==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-gnu@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.1.6.tgz#9513d36d540bbfea575576746736054c31aacdea"
|
|
||||||
integrity sha512-GT5w2mruk90V/I5g6ScuueE7fqj/d8Bui2qxdw6lFxmuTgMeol5rnzAv4uAoVQgClOUO/MULilzlODg9Ib3Y4Q==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-musl@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.1.6.tgz#d61fc6884899f5957251f4ce3f522e34a2c479b7"
|
|
||||||
integrity sha512-keFD6KvwOPzmat4TCnlnuxJCQepPN+8j3Nw876FtULxo8005Y9Ghcl7ACcR8GoiKoddAq8gxNBrpjoxjQRHeAQ==
|
|
||||||
|
|
||||||
"@next/swc-win32-arm64-msvc@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.1.6.tgz#fac2077a8ae9768e31444c9ae90807e64117cda7"
|
|
||||||
integrity sha512-OwertslIiGQluFvHyRDzBCIB07qJjqabAmINlXUYt7/sY7Q7QPE8xVi5beBxX/rxTGPIbtyIe3faBE6Z2KywhQ==
|
|
||||||
|
|
||||||
"@next/swc-win32-ia32-msvc@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.1.6.tgz#498bc11c91b4c482a625bf4b978f98ae91111e46"
|
|
||||||
integrity sha512-g8zowiuP8FxUR9zslPmlju7qYbs2XBtTLVSxVikPtUDQedhcls39uKYLvOOd1JZg0ehyhopobRoH1q+MHlIN/w==
|
|
||||||
|
|
||||||
"@next/swc-win32-x64-msvc@13.1.6":
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.1.6.tgz#17ed919c723426b7d0ce1cd73d40ce3dcd342089"
|
|
||||||
integrity sha512-Ls2OL9hi3YlJKGNdKv8k3X/lLgc3VmLG3a/DeTkAd+lAituJp8ZHmRmm9f9SL84fT3CotlzcgbdaCDfFwFA6bA==
|
|
||||||
|
|
||||||
"@swc/helpers@0.4.14":
|
|
||||||
version "0.4.14"
|
|
||||||
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74"
|
|
||||||
integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
caniuse-lite@^1.0.30001406:
|
|
||||||
version "1.0.30001450"
|
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz#022225b91200589196b814b51b1bbe45144cf74f"
|
|
||||||
integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==
|
|
||||||
|
|
||||||
client-only@0.0.1:
|
|
||||||
version "0.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
|
|
||||||
integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
|
|
||||||
|
|
||||||
"js-tokens@^3.0.0 || ^4.0.0":
|
|
||||||
version "4.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
|
||||||
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
|
||||||
|
|
||||||
loose-envify@^1.1.0:
|
|
||||||
version "1.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
|
||||||
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
|
||||||
dependencies:
|
|
||||||
js-tokens "^3.0.0 || ^4.0.0"
|
|
||||||
|
|
||||||
nanoid@^3.3.4:
|
|
||||||
version "3.3.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
|
|
||||||
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
|
|
||||||
|
|
||||||
next@latest:
|
|
||||||
version "13.1.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/next/-/next-13.1.6.tgz#054babe20b601f21f682f197063c9b0b32f1a27c"
|
|
||||||
integrity sha512-hHlbhKPj9pW+Cymvfzc15lvhaOZ54l+8sXDXJWm3OBNBzgrVj6hwGPmqqsXg40xO1Leq+kXpllzRPuncpC0Phw==
|
|
||||||
dependencies:
|
|
||||||
"@next/env" "13.1.6"
|
|
||||||
"@swc/helpers" "0.4.14"
|
|
||||||
caniuse-lite "^1.0.30001406"
|
|
||||||
postcss "8.4.14"
|
|
||||||
styled-jsx "5.1.1"
|
|
||||||
optionalDependencies:
|
|
||||||
"@next/swc-android-arm-eabi" "13.1.6"
|
|
||||||
"@next/swc-android-arm64" "13.1.6"
|
|
||||||
"@next/swc-darwin-arm64" "13.1.6"
|
|
||||||
"@next/swc-darwin-x64" "13.1.6"
|
|
||||||
"@next/swc-freebsd-x64" "13.1.6"
|
|
||||||
"@next/swc-linux-arm-gnueabihf" "13.1.6"
|
|
||||||
"@next/swc-linux-arm64-gnu" "13.1.6"
|
|
||||||
"@next/swc-linux-arm64-musl" "13.1.6"
|
|
||||||
"@next/swc-linux-x64-gnu" "13.1.6"
|
|
||||||
"@next/swc-linux-x64-musl" "13.1.6"
|
|
||||||
"@next/swc-win32-arm64-msvc" "13.1.6"
|
|
||||||
"@next/swc-win32-ia32-msvc" "13.1.6"
|
|
||||||
"@next/swc-win32-x64-msvc" "13.1.6"
|
|
||||||
|
|
||||||
picocolors@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
|
||||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
|
||||||
|
|
||||||
postcss@8.4.14:
|
|
||||||
version "8.4.14"
|
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
|
|
||||||
integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
|
|
||||||
dependencies:
|
|
||||||
nanoid "^3.3.4"
|
|
||||||
picocolors "^1.0.0"
|
|
||||||
source-map-js "^1.0.2"
|
|
||||||
|
|
||||||
react-dom@latest:
|
|
||||||
version "18.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
|
|
||||||
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
scheduler "^0.23.0"
|
|
||||||
|
|
||||||
react@latest:
|
|
||||||
version "18.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
|
|
||||||
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
|
|
||||||
scheduler@^0.23.0:
|
|
||||||
version "0.23.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
|
|
||||||
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
|
|
||||||
source-map-js@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
|
||||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
|
||||||
|
|
||||||
styled-jsx@5.1.1:
|
|
||||||
version "5.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f"
|
|
||||||
integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
|
|
||||||
dependencies:
|
|
||||||
client-only "0.0.1"
|
|
||||||
|
|
||||||
tslib@^2.4.0:
|
|
||||||
version "2.5.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
|
|
||||||
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
|
|
||||||
@@ -34,7 +34,9 @@ describe(`${__dirname.split(path.sep).pop()}`, () => {
|
|||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
const { output } = await build({
|
const { output } = await build({
|
||||||
config: {},
|
config: {
|
||||||
|
installCommand: 'yarn',
|
||||||
|
},
|
||||||
entrypoint: 'package.json',
|
entrypoint: 'package.json',
|
||||||
files,
|
files,
|
||||||
meta: {
|
meta: {
|
||||||
|
|||||||
Reference in New Issue
Block a user