From dd714796d752104fe36a41ba5eaff2b46d0820da Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Mon, 5 Jun 2023 08:51:02 +0200 Subject: [PATCH 1/2] Optimize next-app-loader resolving speed (#50745) ## What? We recently implemented an optimized resolving method for `app` in Turbopack, this ports some of the main changes in that resolving logic to optimize `next-app-loader` which during compilation resolves the tree structure that we use to render in `app-render.tsx`. Here's the results for a page that is nested a few levels deep on vercel.com using App Router. These results only cover `next-app-loader`, not any modules compiled below it. ### Before CleanShot 2023-06-03 at 22 36 26@2x ### After CleanShot 2023-06-03 at 22 55 10@2x ## Raw numbers
Before After Delta Delta (percent)
1.620 ms 76.39 ms -1.543.61 ms -95.2%
## How? Changed the resolving logic to use `fileExists`, looping over the provided pageExtensions. For Turbopack we have a process that does only one pass for generating all trees. That also only reads directories instead of checking individual files, which is even better (<5ms for generating all possible trees) but this PR is a quick win that has a big impact already without refactoring the entire entries generation in webpack. --- packages/next/src/build/index.ts | 4 +- .../webpack/loaders/metadata/discover.ts | 41 ++--- .../build/webpack/loaders/next-app-loader.ts | 172 ++++++++++-------- packages/next/src/cli/next-dev.ts | 4 +- packages/next/src/lib/file-exists.ts | 11 +- .../next/src/lib/verify-partytown-setup.ts | 7 +- 6 files changed, 123 insertions(+), 116 deletions(-) diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index efabbb5fbbfdf..d3d0d39625a79 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -28,7 +28,7 @@ import { PAGES_DIR_ALIAS, INSTRUMENTATION_HOOK_FILENAME, } from '../lib/constants' -import { fileExists } from '../lib/file-exists' +import { FileType, fileExists } from '../lib/file-exists' import { findPagesDir } from '../lib/find-pages-dir' import loadCustomRoutes, { CustomRoutes, @@ -588,7 +588,7 @@ export default async function build( for (const page in mappedPages) { const hasPublicPageFile = await fileExists( path.join(publicDir, page === '/' ? '/index' : page), - 'file' + FileType.File ) if (hasPublicPageFile) { conflictingPublicFiles.push(page) diff --git a/packages/next/src/build/webpack/loaders/metadata/discover.ts b/packages/next/src/build/webpack/loaders/metadata/discover.ts index 46d7854121904..1a5cd9743a0bc 100644 --- a/packages/next/src/build/webpack/loaders/metadata/discover.ts +++ b/packages/next/src/build/webpack/loaders/metadata/discover.ts @@ -1,4 +1,3 @@ -import type webpack from 'webpack' import type { CollectingMetadata, PossibleStaticMetadataFileNameConvention, @@ -7,6 +6,7 @@ import path from 'path' import { stringify } from 'querystring' import { STATIC_METADATA_IMAGES } from '../../../../lib/metadata/is-metadata-route' import { WEBPACK_RESOURCE_QUERIES } from '../../../../lib/constants' +import { MetadataResolver } from '../next-app-loader' const METADATA_TYPE = 'metadata' @@ -16,16 +16,14 @@ async function enumMetadataFiles( filename: string, extensions: readonly string[], { - resolvePath, - loaderContext, + metadataResolver, // When set to true, possible filename without extension could: icon, icon0, ..., icon9 numericSuffix, }: { - resolvePath: (pathname: string) => Promise - loaderContext: webpack.LoaderContext + metadataResolver: MetadataResolver numericSuffix: boolean } -) { +): Promise { const collectedFiles: string[] = [] const possibleFileNames = [filename].concat( @@ -36,19 +34,9 @@ async function enumMetadataFiles( : [] ) for (const name of possibleFileNames) { - for (const ext of extensions) { - const pathname = path.join(dir, `${name}.${ext}`) - try { - const resolved = await resolvePath(pathname) - loaderContext.addDependency(resolved) - - collectedFiles.push(resolved) - } catch (err: any) { - if (!err.message.includes("Can't resolve")) { - throw err - } - loaderContext.addMissingDependency(pathname) - } + const resolved = await metadataResolver(path.join(dir, name), extensions) + if (resolved) { + collectedFiles.push(resolved) } } @@ -59,16 +47,14 @@ export async function createStaticMetadataFromRoute( resolvedDir: string, { segment, - resolvePath, + metadataResolver, isRootLayoutOrRootPage, - loaderContext, pageExtensions, basePath, }: { segment: string - resolvePath: (pathname: string) => Promise + metadataResolver: MetadataResolver isRootLayoutOrRootPage: boolean - loaderContext: webpack.LoaderContext pageExtensions: string[] basePath: string } @@ -82,11 +68,6 @@ export async function createStaticMetadataFromRoute( manifest: undefined, } - const opts = { - resolvePath, - loaderContext, - } - async function collectIconModuleIfExists( type: PossibleStaticMetadataFileNameConvention ) { @@ -96,7 +77,7 @@ export async function createStaticMetadataFromRoute( resolvedDir, 'manifest', staticManifestExtension.concat(pageExtensions), - { ...opts, numericSuffix: false } + { metadataResolver, numericSuffix: false } ) if (manifestFile.length > 0) { hasStaticMetadataFiles = true @@ -116,7 +97,7 @@ export async function createStaticMetadataFromRoute( ...STATIC_METADATA_IMAGES[type].extensions, ...(type === 'favicon' ? [] : pageExtensions), ], - { ...opts, numericSuffix: true } + { metadataResolver, numericSuffix: true } ) resolvedMetadataFiles .sort((a, b) => a.localeCompare(b)) diff --git a/packages/next/src/build/webpack/loaders/next-app-loader.ts b/packages/next/src/build/webpack/loaders/next-app-loader.ts index 0581c837ec5e0..f042aad211e98 100644 --- a/packages/next/src/build/webpack/loaders/next-app-loader.ts +++ b/packages/next/src/build/webpack/loaders/next-app-loader.ts @@ -5,7 +5,6 @@ import type { ModuleReference, CollectedMetadata } from './metadata/types' import path from 'path' import { stringify } from 'querystring' import chalk from 'next/dist/compiled/chalk' -import { NODE_RESOLVE_OPTIONS } from '../../webpack-config' import { getModuleBuildInfo } from './get-module-build-info' import { verifyRootLayout } from '../../../lib/verifyRootLayout' import * as Log from '../../output/log' @@ -22,6 +21,7 @@ import { AppPathnameNormalizer } from '../../../server/future/normalizers/built/ import { RouteKind } from '../../../server/future/route-kind' import { AppRouteRouteModuleOptions } from '../../../server/future/route-modules/app-route/module' import { AppBundlePathNormalizer } from '../../../server/future/normalizers/built/app/app-bundle-path-normalizer' +import { FileType, fileExists } from '../../../lib/file-exists' export type AppLoaderOptions = { name: string @@ -40,8 +40,6 @@ export type AppLoaderOptions = { } type AppLoader = webpack.LoaderDefinitionFunction -const isNotResolvedError = (err: any) => err.message.includes("Can't resolve") - const FILE_TYPES = { layout: 'layout', template: 'template', @@ -53,10 +51,13 @@ const FILE_TYPES = { const GLOBAL_ERROR_FILE_TYPE = 'global-error' const PAGE_SEGMENT = 'page$' +type DirResolver = (pathToResolve: string) => string type PathResolver = ( + pathname: string +) => Promise | string | undefined +export type MetadataResolver = ( pathname: string, - resolveDir?: boolean, - internal?: boolean + extensions: readonly string[] ) => Promise export type ComponentsType = { @@ -73,14 +74,14 @@ async function createAppRouteCode({ name, page, pagePath, - resolver, + resolveAppRoute, pageExtensions, nextConfigOutput, }: { name: string page: string pagePath: string - resolver: PathResolver + resolveAppRoute: PathResolver pageExtensions: string[] nextConfigOutput: NextConfig['output'] }): Promise { @@ -90,7 +91,7 @@ async function createAppRouteCode({ // This, when used with the resolver will give us the pathname to the built // route handler file. - let resolvedPagePath = await resolver(routePath) + let resolvedPagePath = await resolveAppRoute(routePath) if (!resolvedPagePath) { throw new Error( `Invariant: could not resolve page path for ${name} at ${routePath}` @@ -181,15 +182,16 @@ const isDirectory = async (pathname: string) => { async function createTreeCodeFromPath( pagePath: string, { + resolveDir, resolver, - resolvePath, resolveParallelSegments, - loaderContext, + metadataResolver, pageExtensions, basePath, }: { + resolveDir: DirResolver resolver: PathResolver - resolvePath: (pathname: string) => Promise + metadataResolver: MetadataResolver resolveParallelSegments: ( pathname: string ) => [key: string, segment: string | string[]][] @@ -197,7 +199,12 @@ async function createTreeCodeFromPath( pageExtensions: string[] basePath: string } -) { +): Promise<{ + treeCode: string + pages: string + rootLayout: string | undefined + globalError: string | undefined +}> { const splittedPath = pagePath.split(/[\\/]/) const appDirPrefix = splittedPath[0] const pages: string[] = [] @@ -208,9 +215,8 @@ async function createTreeCodeFromPath( async function resolveAdjacentParallelSegments( segmentPath: string ): Promise { - const absoluteSegmentPath = await resolver( - `${appDirPrefix}${segmentPath}`, - true + const absoluteSegmentPath = await resolveDir( + `${appDirPrefix}${segmentPath}` ) if (!absoluteSegmentPath) { @@ -264,24 +270,17 @@ async function createTreeCodeFromPath( let metadata: Awaited> = null - try { - const routerDirPath = `${appDirPrefix}${segmentPath}` - const resolvedRouteDir = await resolver(routerDirPath, true) - - if (resolvedRouteDir) { - metadata = await createStaticMetadataFromRoute(resolvedRouteDir, { - basePath, - segment: segmentPath, - resolvePath, - isRootLayoutOrRootPage, - loaderContext, - pageExtensions, - }) - } - } catch (err: any) { - if (isNotResolvedError(err)) { - throw err - } + const routerDirPath = `${appDirPrefix}${segmentPath}` + const resolvedRouteDir = await resolveDir(routerDirPath) + + if (resolvedRouteDir) { + metadata = await createStaticMetadataFromRoute(resolvedRouteDir, { + basePath, + segment: segmentPath, + metadataResolver, + isRootLayoutOrRootPage, + pageExtensions, + }) } for (const [parallelKey, parallelSegment] of parallelSegments) { @@ -448,20 +447,6 @@ const nextAppLoader: AppLoader = async function nextAppLoader() { const extensions = pageExtensions.map((extension) => `.${extension}`) - const resolveOptions: any = { - ...NODE_RESOLVE_OPTIONS, - extensions, - } - - const resolve = this.getResolve(resolveOptions) - - // a resolver for internal next files. We need to override the extensions, in case - // a project doesn't have the same ones as used by next. - const internalResolve = this.getResolve({ - ...resolveOptions, - extensions: [...extensions, '.js', '.jsx', '.ts', '.tsx'], - }) - const normalizedAppPaths = typeof appPaths === 'string' ? [appPaths] : appPaths || [] @@ -496,29 +481,55 @@ const nextAppLoader: AppLoader = async function nextAppLoader() { return Object.entries(matched) } - const resolver: PathResolver = async (pathname, resolveDir, internal) => { - if (resolveDir) { - return createAbsolutePath(appDir, pathname) - } - try { - const resolved = await (internal ? internalResolve : resolve)( - this.rootContext, - pathname - ) - this.addDependency(resolved) - return resolved - } catch (err: any) { - const absolutePath = createAbsolutePath(appDir, pathname) - for (const ext of extensions) { - const absolutePathWithExtension = `${absolutePath}${ext}` + const resolveDir: DirResolver = (pathToResolve) => { + return createAbsolutePath(appDir, pathToResolve) + } + + const resolveAppRoute: PathResolver = (pathToResolve) => { + return createAbsolutePath(appDir, pathToResolve) + } + + const resolver: PathResolver = async (pathname) => { + const absolutePath = createAbsolutePath(appDir, pathname) + + let result: string | undefined + + for (const ext of extensions) { + const absolutePathWithExtension = `${absolutePath}${ext}` + if ( + !result && + (await fileExists(absolutePathWithExtension, FileType.File)) + ) { + // Ensures we call `addMissingDependency` for all files that didn't match + result = absolutePathWithExtension + } else { this.addMissingDependency(absolutePathWithExtension) } - if (isNotResolvedError(err)) { - return undefined + } + + return result + } + + const metadataResolver: MetadataResolver = async (pathname, exts) => { + const absolutePath = createAbsolutePath(appDir, pathname) + + let result: string | undefined + + for (const ext of exts) { + // Compared to `resolver` above the exts do not have the `.` included already, so it's added here. + const absolutePathWithExtension = `${absolutePath}.${ext}` + if ( + !result && + (await fileExists(absolutePathWithExtension, FileType.File)) + ) { + result = absolutePathWithExtension + } else { + this.addMissingDependency(absolutePathWithExtension) } - throw err } + + return result } if (isAppRouteRoute(name)) { @@ -527,27 +538,23 @@ const nextAppLoader: AppLoader = async function nextAppLoader() { page: loaderOptions.page, name, pagePath, - resolver, + resolveAppRoute, pageExtensions, nextConfigOutput, }) } - const { - treeCode, - pages: pageListCode, - rootLayout, - globalError, - } = await createTreeCodeFromPath(pagePath, { + let treeCodeResult = await createTreeCodeFromPath(pagePath, { + resolveDir, resolver, - resolvePath: (pathname: string) => resolve(this.rootContext, pathname), + metadataResolver, resolveParallelSegments, loaderContext: this, pageExtensions, basePath, }) - if (!rootLayout) { + if (!treeCodeResult.rootLayout) { if (!isDev) { // If we're building and missing a root layout, exit the build Log.error( @@ -581,18 +588,29 @@ const nextAppLoader: AppLoader = async function nextAppLoader() { throw new Error(message) } + + // Get the new result with the created root layout. + treeCodeResult = await createTreeCodeFromPath(pagePath, { + resolveDir, + resolver, + metadataResolver, + resolveParallelSegments, + loaderContext: this, + pageExtensions, + basePath, + }) } } const result = ` - export ${treeCode} - export ${pageListCode} + export ${treeCodeResult.treeCode} + export ${treeCodeResult.pages} export { default as AppRouter } from 'next/dist/client/components/app-router' export { default as LayoutRouter } from 'next/dist/client/components/layout-router' export { default as RenderFromTemplateContext } from 'next/dist/client/components/render-from-template-context' export { default as GlobalError } from ${JSON.stringify( - globalError || 'next/dist/client/components/error-boundary' + treeCodeResult.globalError || 'next/dist/client/components/error-boundary' )} export { staticGenerationAsyncStorage } from 'next/dist/client/components/static-generation-async-storage' diff --git a/packages/next/src/cli/next-dev.ts b/packages/next/src/cli/next-dev.ts index 4316d6eca682a..839a57392e387 100644 --- a/packages/next/src/cli/next-dev.ts +++ b/packages/next/src/cli/next-dev.ts @@ -18,7 +18,7 @@ import { Telemetry } from '../telemetry/storage' import loadConfig from '../server/config' import { findPagesDir } from '../lib/find-pages-dir' import { findRootDir } from '../lib/find-root' -import { fileExists } from '../lib/file-exists' +import { fileExists, FileType } from '../lib/file-exists' import { getNpxCommand } from '../lib/helpers/get-npx-command' import Watchpack from 'next/dist/compiled/watchpack' import stripAnsi from 'next/dist/compiled/strip-ansi' @@ -161,7 +161,7 @@ const nextDev: CliCommand = async (argv) => { dir = getProjectDir(process.env.NEXT_PRIVATE_DEV_DIR || args._[0]) // Check if pages dir exists and warn if not - if (!(await fileExists(dir, 'directory'))) { + if (!(await fileExists(dir, FileType.Directory))) { printAndExit(`> No such directory exists as the project root: ${dir}`) } diff --git a/packages/next/src/lib/file-exists.ts b/packages/next/src/lib/file-exists.ts index 2cf0ea8aae3a7..fff15e984794a 100644 --- a/packages/next/src/lib/file-exists.ts +++ b/packages/next/src/lib/file-exists.ts @@ -1,15 +1,20 @@ import { constants, promises } from 'fs' import isError from './is-error' +export enum FileType { + File = 'file', + Directory = 'directory', +} + export async function fileExists( fileName: string, - type?: 'file' | 'directory' + type?: FileType ): Promise { try { - if (type === 'file') { + if (type === FileType.File) { const stats = await promises.stat(fileName) return stats.isFile() - } else if (type === 'directory') { + } else if (type === FileType.Directory) { const stats = await promises.stat(fileName) return stats.isDirectory() } else { diff --git a/packages/next/src/lib/verify-partytown-setup.ts b/packages/next/src/lib/verify-partytown-setup.ts index e98848eba8c34..5f4caf378e7db 100644 --- a/packages/next/src/lib/verify-partytown-setup.ts +++ b/packages/next/src/lib/verify-partytown-setup.ts @@ -6,7 +6,7 @@ import { hasNecessaryDependencies, NecessaryDependencies, } from './has-necessary-dependencies' -import { fileExists } from './file-exists' +import { fileExists, FileType } from './file-exists' import { FatalError } from './fatal-error' import { recursiveDelete } from './recursive-delete' import * as Log from '../build/output/log' @@ -44,7 +44,10 @@ async function copyPartytownStaticFiles( staticDir: string ) { const partytownLibDir = path.join(staticDir, '~partytown') - const hasPartytownLibDir = await fileExists(partytownLibDir, 'directory') + const hasPartytownLibDir = await fileExists( + partytownLibDir, + FileType.Directory + ) if (hasPartytownLibDir) { await recursiveDelete(partytownLibDir) From ccee374e2ad6858d7c3ef74e0360cd758cfd0699 Mon Sep 17 00:00:00 2001 From: vercel-release-bot Date: Mon, 5 Jun 2023 07:18:40 +0000 Subject: [PATCH 2/2] v13.4.5-canary.5 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-config-next/package.json | 4 ++-- packages/eslint-plugin-next/package.json | 2 +- packages/font/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next-swc/package.json | 2 +- packages/next/package.json | 14 +++++++------- packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 17 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lerna.json b/lerna.json index 6bb97aca3b811..6bf137381ab3b 100644 --- a/lerna.json +++ b/lerna.json @@ -16,5 +16,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "13.4.5-canary.4" + "version": "13.4.5-canary.5" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index e5e762ba01313..6d24c3343c710 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "keywords": [ "react", "next", diff --git a/packages/eslint-config-next/package.json b/packages/eslint-config-next/package.json index 1d48e9441c083..751d6c95887ff 100644 --- a/packages/eslint-config-next/package.json +++ b/packages/eslint-config-next/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-next", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "description": "ESLint configuration used by NextJS.", "main": "index.js", "license": "MIT", @@ -9,7 +9,7 @@ "directory": "packages/eslint-config-next" }, "dependencies": { - "@next/eslint-plugin-next": "13.4.5-canary.4", + "@next/eslint-plugin-next": "13.4.5-canary.5", "@rushstack/eslint-patch": "^1.1.3", "@typescript-eslint/parser": "^5.42.0", "eslint-import-resolver-node": "^0.3.6", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index d3d4353bf9969..b6f56755fd2e1 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "description": "ESLint plugin for NextJS.", "main": "dist/index.js", "license": "MIT", diff --git a/packages/font/package.json b/packages/font/package.json index 927902a038c16..d34c9546027be 100644 --- a/packages/font/package.json +++ b/packages/font/package.json @@ -1,6 +1,6 @@ { "name": "@next/font", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "repository": { "url": "vercel/next.js", "directory": "packages/font" diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index 6eeb13e30c287..1fe69d0f7ef7f 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "main": "index.js", "types": "index.d.ts", "license": "MIT", diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 95e6ea7c9a4c0..8d4ca33f12361 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "license": "MIT", "repository": { "type": "git", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index 186dd34f25a0a..dbde29e90ae1b 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index 69d9d5d08cddd..8aad6a657db00 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 7cdf0a235a24e..2e9fefb9794f5 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index e49a2c00d7670..1310da27e8a34 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index 9eb38dd66f08a..7d0890940aed0 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next-swc/package.json b/packages/next-swc/package.json index aa8ffd6861169..b77385ec1e28c 100644 --- a/packages/next-swc/package.json +++ b/packages/next-swc/package.json @@ -1,6 +1,6 @@ { "name": "@next/swc", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "private": true, "scripts": { "clean": "node ../../scripts/rm.mjs native", diff --git a/packages/next/package.json b/packages/next/package.json index 37c9a6ac3d63b..3746b07370047 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -83,7 +83,7 @@ ] }, "dependencies": { - "@next/env": "13.4.5-canary.4", + "@next/env": "13.4.5-canary.5", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -140,11 +140,11 @@ "@jest/types": "29.5.0", "@napi-rs/cli": "2.14.7", "@napi-rs/triples": "1.1.0", - "@next/polyfill-module": "13.4.5-canary.4", - "@next/polyfill-nomodule": "13.4.5-canary.4", - "@next/react-dev-overlay": "13.4.5-canary.4", - "@next/react-refresh-utils": "13.4.5-canary.4", - "@next/swc": "13.4.5-canary.4", + "@next/polyfill-module": "13.4.5-canary.5", + "@next/polyfill-nomodule": "13.4.5-canary.5", + "@next/react-dev-overlay": "13.4.5-canary.5", + "@next/react-refresh-utils": "13.4.5-canary.5", + "@next/swc": "13.4.5-canary.5", "@opentelemetry/api": "1.4.1", "@segment/ajv-human-errors": "2.1.2", "@taskr/clear": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index 81573756e2120..b5f0f20821d9b 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index de5d7fde29e3b..b82d8a28c3c7e 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "13.4.5-canary.4", + "version": "13.4.5-canary.5", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf7bd9bbb6f35..c9f162eb5a419 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -460,7 +460,7 @@ importers: packages/eslint-config-next: specifiers: - '@next/eslint-plugin-next': 13.4.5-canary.4 + '@next/eslint-plugin-next': 13.4.5-canary.5 '@rushstack/eslint-patch': ^1.1.3 '@typescript-eslint/parser': ^5.42.0 eslint: ^7.23.0 || ^8.0.0 @@ -537,12 +537,12 @@ importers: '@jest/types': 29.5.0 '@napi-rs/cli': 2.14.7 '@napi-rs/triples': 1.1.0 - '@next/env': 13.4.5-canary.4 - '@next/polyfill-module': 13.4.5-canary.4 - '@next/polyfill-nomodule': 13.4.5-canary.4 - '@next/react-dev-overlay': 13.4.5-canary.4 - '@next/react-refresh-utils': 13.4.5-canary.4 - '@next/swc': 13.4.5-canary.4 + '@next/env': 13.4.5-canary.5 + '@next/polyfill-module': 13.4.5-canary.5 + '@next/polyfill-nomodule': 13.4.5-canary.5 + '@next/react-dev-overlay': 13.4.5-canary.5 + '@next/react-refresh-utils': 13.4.5-canary.5 + '@next/swc': 13.4.5-canary.5 '@opentelemetry/api': 1.4.1 '@segment/ajv-human-errors': 2.1.2 '@swc/helpers': 0.5.1