next 16.0.2-canary.10 → 16.0.2-canary.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/next +1 -1
- package/dist/build/babel/loader/get-config.js +5 -0
- package/dist/build/babel/loader/get-config.js.map +1 -1
- package/dist/build/index.js +7 -4
- package/dist/build/index.js.map +1 -1
- package/dist/build/jest/jest.js +2 -1
- package/dist/build/jest/jest.js.map +1 -1
- package/dist/build/load-entrypoint.js +1 -2
- package/dist/build/load-entrypoint.js.map +1 -1
- package/dist/build/lockfile.d.ts +1 -1
- package/dist/build/lockfile.js +5 -9
- package/dist/build/lockfile.js.map +1 -1
- package/dist/build/next-config-ts/transpile-config.js +13 -3
- package/dist/build/next-config-ts/transpile-config.js.map +1 -1
- package/dist/build/swc/index.d.ts +4 -2
- package/dist/build/swc/index.js +54 -51
- package/dist/build/swc/index.js.map +1 -1
- package/dist/build/swc/install-bindings.d.ts +15 -0
- package/dist/build/swc/install-bindings.js +30 -0
- package/dist/build/swc/install-bindings.js.map +1 -0
- package/dist/build/templates/app-page.js +7 -1
- package/dist/build/templates/app-page.js.map +1 -1
- package/dist/build/turbopack-build/impl.js +9 -4
- package/dist/build/turbopack-build/impl.js.map +1 -1
- package/dist/build/webpack/loaders/lightningcss-loader/src/loader.js +7 -2
- package/dist/build/webpack/loaders/lightningcss-loader/src/loader.js.map +1 -1
- package/dist/build/webpack/loaders/lightningcss-loader/src/minify.js +2 -2
- package/dist/build/webpack/loaders/lightningcss-loader/src/minify.js.map +1 -1
- package/dist/build/webpack/loaders/next-app-loader/index.js +6 -0
- package/dist/build/webpack/loaders/next-app-loader/index.js.map +1 -1
- package/dist/build/webpack/loaders/next-barrel-loader.js +5 -0
- package/dist/build/webpack/loaders/next-barrel-loader.js.map +1 -1
- package/dist/build/webpack/loaders/next-metadata-image-loader.js +5 -0
- package/dist/build/webpack/loaders/next-metadata-image-loader.js.map +1 -1
- package/dist/build/webpack/loaders/next-metadata-route-loader.js +5 -0
- package/dist/build/webpack/loaders/next-metadata-route-loader.js.map +1 -1
- package/dist/build/webpack/loaders/next-swc-loader.js +10 -6
- package/dist/build/webpack/loaders/next-swc-loader.js.map +1 -1
- package/dist/build/webpack-build/impl.js +4 -1
- package/dist/build/webpack-build/impl.js.map +1 -1
- package/dist/build/webpack-config.js +2 -7
- package/dist/build/webpack-config.js.map +1 -1
- package/dist/cli/next-typegen.js +3 -0
- package/dist/cli/next-typegen.js.map +1 -1
- package/dist/client/app-bootstrap.js +1 -1
- package/dist/client/index.js +1 -1
- package/dist/compiled/@next/font/dist/google/font-data.json +63 -0
- package/dist/compiled/@next/font/dist/google/index.d.ts +40 -0
- package/dist/esm/build/babel/loader/get-config.js +5 -0
- package/dist/esm/build/babel/loader/get-config.js.map +1 -1
- package/dist/esm/build/index.js +7 -4
- package/dist/esm/build/index.js.map +1 -1
- package/dist/esm/build/load-entrypoint.js +2 -3
- package/dist/esm/build/load-entrypoint.js.map +1 -1
- package/dist/esm/build/lockfile.js +5 -9
- package/dist/esm/build/lockfile.js.map +1 -1
- package/dist/esm/build/next-config-ts/transpile-config.js +13 -3
- package/dist/esm/build/next-config-ts/transpile-config.js.map +1 -1
- package/dist/esm/build/swc/index.js +52 -49
- package/dist/esm/build/swc/index.js.map +1 -1
- package/dist/esm/build/swc/install-bindings.js +20 -0
- package/dist/esm/build/swc/install-bindings.js.map +1 -0
- package/dist/esm/build/templates/app-page.js +7 -1
- package/dist/esm/build/templates/app-page.js.map +1 -1
- package/dist/esm/build/turbopack-build/impl.js +10 -5
- package/dist/esm/build/turbopack-build/impl.js.map +1 -1
- package/dist/esm/build/webpack/loaders/lightningcss-loader/src/loader.js +7 -2
- package/dist/esm/build/webpack/loaders/lightningcss-loader/src/loader.js.map +1 -1
- package/dist/esm/build/webpack/loaders/lightningcss-loader/src/minify.js +2 -2
- package/dist/esm/build/webpack/loaders/lightningcss-loader/src/minify.js.map +1 -1
- package/dist/esm/build/webpack/loaders/next-app-loader/index.js +6 -0
- package/dist/esm/build/webpack/loaders/next-app-loader/index.js.map +1 -1
- package/dist/esm/build/webpack/loaders/next-barrel-loader.js +5 -0
- package/dist/esm/build/webpack/loaders/next-barrel-loader.js.map +1 -1
- package/dist/esm/build/webpack/loaders/next-metadata-image-loader.js +5 -0
- package/dist/esm/build/webpack/loaders/next-metadata-image-loader.js.map +1 -1
- package/dist/esm/build/webpack/loaders/next-metadata-route-loader.js +5 -0
- package/dist/esm/build/webpack/loaders/next-metadata-route-loader.js.map +1 -1
- package/dist/esm/build/webpack/loaders/next-swc-loader.js +11 -7
- package/dist/esm/build/webpack/loaders/next-swc-loader.js.map +1 -1
- package/dist/esm/build/webpack-build/impl.js +4 -1
- package/dist/esm/build/webpack-build/impl.js.map +1 -1
- package/dist/esm/build/webpack-config.js +2 -7
- package/dist/esm/build/webpack-config.js.map +1 -1
- package/dist/esm/client/app-bootstrap.js +1 -1
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/server/config.js +2 -2
- package/dist/esm/server/config.js.map +1 -1
- package/dist/esm/server/dev/hot-reloader-turbopack.js +3 -4
- package/dist/esm/server/dev/hot-reloader-turbopack.js.map +1 -1
- package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/esm/server/lib/app-info-log.js +1 -1
- package/dist/esm/server/lib/router-utils/setup-dev-bundler.js +3 -0
- package/dist/esm/server/lib/router-utils/setup-dev-bundler.js.map +1 -1
- package/dist/esm/server/lib/start-server.js +1 -1
- package/dist/esm/server/lib/trace/tracer.js +6 -5
- package/dist/esm/server/lib/trace/tracer.js.map +1 -1
- package/dist/esm/shared/lib/errors/canary-only-config-error.js +1 -1
- package/dist/server/config.js +2 -2
- package/dist/server/config.js.map +1 -1
- package/dist/server/dev/hot-reloader-turbopack.js +2 -3
- package/dist/server/dev/hot-reloader-turbopack.js.map +1 -1
- package/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/server/lib/app-info-log.js +1 -1
- package/dist/server/lib/router-utils/setup-dev-bundler.js +3 -0
- package/dist/server/lib/router-utils/setup-dev-bundler.js.map +1 -1
- package/dist/server/lib/start-server.js +1 -1
- package/dist/server/lib/trace/tracer.js +6 -5
- package/dist/server/lib/trace/tracer.js.map +1 -1
- package/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/dist/telemetry/anonymous-meta.js +1 -1
- package/dist/telemetry/events/session-stopped.js +2 -2
- package/dist/telemetry/events/version.js +2 -2
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-barrel-loader.ts"],"sourcesContent":["/**\n * ## Barrel Optimizations\n *\n * This loader is used to optimize the imports of \"barrel\" files that have many\n * re-exports. Currently, both Node.js and Webpack have to enter all of these\n * submodules even if we only need a few of them.\n *\n * For example, say a file `foo.js` with the following contents:\n *\n * export { a } from './a'\n * export { b } from './b'\n * export { c } from './c'\n * ...\n *\n * If the user imports `a` only, this loader will accept the `names` option to\n * be `['a']`. Then, it request the \"__barrel_transform__\" SWC transform to load\n * `foo.js` and receive the following output:\n *\n * export const __next_private_export_map__ = '[[\"a\",\"./a\",\"a\"],[\"b\",\"./b\",\"b\"],[\"c\",\"./c\",\"c\"],...]'\n *\n * format: '[\"<imported identifier>\", \"<import path>\", \"<exported name>\"]'\n * e.g.: import { a as b } from './module-a' => '[\"b\", \"./module-a\", \"a\"]'\n *\n * The export map, generated by SWC, is a JSON that represents the exports of\n * that module, their original file, and their original name (since you can do\n * `export { a as b }`).\n *\n * Then, this loader can safely remove all the exports that are not needed and\n * re-export the ones from `names`:\n *\n * export { a } from './a'\n *\n * That's the basic situation and also the happy path.\n *\n *\n *\n * ## Wildcard Exports\n *\n * For wildcard exports (e.g. `export * from './a'`), it becomes a bit more complicated.\n * Say `foo.js` with the following contents:\n *\n * export * from './a'\n * export * from './b'\n * export * from './c'\n * ...\n *\n * If the user imports `bar` from it, SWC can never know which files are going to be\n * exporting `bar`. So, we have to keep all the wildcard exports and do the same\n * process recursively. This loader will return the following output:\n *\n * export * from '__barrel_optimize__?names=bar&wildcard!=!./a'\n * export * from '__barrel_optimize__?names=bar&wildcard!=!./b'\n * export * from '__barrel_optimize__?names=bar&wildcard!=!./c'\n * ...\n *\n * The \"!=!\" tells Webpack to use the same loader to process './a', './b', and './c'.\n * After the recursive process, the \"inner loaders\" will either return an empty string\n * or:\n *\n * export * from './target'\n *\n * Where `target` is the file that exports `bar`.\n *\n *\n *\n * ## Non-Barrel Files\n *\n * If the file is not a barrel, we can't apply any optimizations. That's because\n * we can't easily remove things from the file. For example, say `foo.js` with:\n *\n * const v = 1\n * export function b () {\n * return v\n * }\n *\n * If the user imports `b` only, we can't remove the `const v = 1` even though\n * the file is side-effect free. In these caes, this loader will simply re-export\n * `foo.js`:\n *\n * export * from './foo'\n *\n * Besides these cases, this loader also carefully handles the module cache so\n * SWC won't analyze the same file twice, and no instance of the same file will\n * be accidentally created as different instances.\n */\n\nimport type webpack from 'webpack'\n\nimport path from 'path'\nimport { transform } from '../../swc'\n\n// This is a in-memory cache for the mapping of barrel exports. This only applies\n// to the packages that we optimize. It will never change (e.g. upgrading packages)\n// during the lifetime of the server so we can safely cache it.\n// There is also no need to collect the cache for the same reason.\nconst barrelTransformMappingCache = new Map<\n string,\n {\n exportList: [string, string, string][]\n wildcardExports: string[]\n isClientEntry: boolean\n } | null\n>()\n\nasync function getBarrelMapping(\n resourcePath: string,\n swcCacheDir: string,\n resolve: (context: string, request: string) => Promise<string>,\n fs: {\n readFile: (\n path: string,\n callback: (err: any, data: string | Buffer | undefined) => void\n ) => void\n }\n) {\n if (barrelTransformMappingCache.has(resourcePath)) {\n return barrelTransformMappingCache.get(resourcePath)!\n }\n\n // This is a SWC transform specifically for `optimizeBarrelExports`. We don't\n // care about other things but the export map only.\n async function transpileSource(\n filename: string,\n source: string,\n isWildcard: boolean\n ) {\n const isTypeScript = filename.endsWith('.ts') || filename.endsWith('.tsx')\n return new Promise<string>((res) =>\n transform(source, {\n filename,\n inputSourceMap: undefined,\n sourceFileName: filename,\n optimizeBarrelExports: {\n wildcard: isWildcard,\n },\n jsc: {\n parser: {\n syntax: isTypeScript ? 'typescript' : 'ecmascript',\n [isTypeScript ? 'tsx' : 'jsx']: true,\n },\n experimental: {\n cacheRoot: swcCacheDir,\n },\n },\n }).then((output) => {\n res(output.code)\n })\n )\n }\n\n // Avoid circular `export *` dependencies\n const visited = new Set<string>()\n async function getMatches(\n file: string,\n isWildcard: boolean,\n isClientEntry: boolean\n ) {\n if (visited.has(file)) {\n return null\n }\n visited.add(file)\n\n const source = await new Promise<string>((res, rej) => {\n fs.readFile(file, (err, data) => {\n if (err || data === undefined) {\n rej(err)\n } else {\n res(data.toString())\n }\n })\n })\n\n const output = await transpileSource(file, source, isWildcard)\n\n const matches = output.match(\n /^([^]*)export (const|var) __next_private_export_map__ = ('[^']+'|\"[^\"]+\")/\n )\n if (!matches) {\n return null\n }\n\n const matchedDirectives = output.match(\n /^([^]*)export (const|var) __next_private_directive_list__ = '([^']+)'/\n )\n const directiveList = matchedDirectives\n ? JSON.parse(matchedDirectives[3])\n : []\n // \"use client\" in barrel files has to be transferred to the target file.\n isClientEntry = directiveList.includes('use client')\n\n let exportList = JSON.parse(matches[3].slice(1, -1)) as [\n string,\n string,\n string,\n ][]\n const wildcardExports = [\n ...output.matchAll(/export \\* from \"([^\"]+)\"/g),\n ].map((match) => match[1])\n\n // In the wildcard case, if the value is exported from another file, we\n // redirect to that file (decl[0]). Otherwise, export from the current\n // file itself.\n if (isWildcard) {\n for (const decl of exportList) {\n decl[1] = file\n decl[2] = decl[0]\n }\n }\n\n // This recursively handles the wildcard exports (e.g. `export * from './a'`)\n if (wildcardExports.length) {\n await Promise.all(\n wildcardExports.map(async (req) => {\n const targetPath = await resolve(\n path.dirname(file),\n req.replace('__barrel_optimize__?names=__PLACEHOLDER__!=!', '')\n )\n\n const targetMatches = await getMatches(\n targetPath,\n true,\n isClientEntry\n )\n\n if (targetMatches) {\n // Merge the export list\n exportList = exportList.concat(targetMatches.exportList)\n }\n })\n )\n }\n\n return {\n exportList,\n wildcardExports,\n isClientEntry,\n }\n }\n\n const res = await getMatches(resourcePath, false, false)\n barrelTransformMappingCache.set(resourcePath, res)\n\n return res\n}\n\nconst NextBarrelLoader = async function (\n this: webpack.LoaderContext<{\n names: string[]\n swcCacheDir: string\n }>\n) {\n this.async()\n this.cacheable(true)\n\n const { names, swcCacheDir } = this.getOptions()\n\n // For barrel optimizations, we always prefer the \"module\" field over the\n // \"main\" field because ESM handling is more robust with better tree-shaking.\n const resolve = this.getResolve({\n mainFields: ['module', 'main'],\n })\n\n const mapping = await getBarrelMapping(\n this.resourcePath,\n swcCacheDir,\n resolve,\n this.fs\n )\n\n // `resolve` adds all sub-paths to the dependency graph. However, we already\n // cached the mapping and we assume them to not change. So, we can safely\n // clear the dependencies here to avoid unnecessary watchers which turned out\n // to be very expensive.\n this.clearDependencies()\n\n if (!mapping) {\n // This file isn't a barrel and we can't apply any optimizations. Let's re-export everything.\n // Since this loader accepts `names` and the request is keyed with `names`, we can't simply\n // return the original source here. That will create these imports with different names as\n // different modules instances.\n this.callback(null, `export * from ${JSON.stringify(this.resourcePath)}`)\n return\n }\n\n const exportList = mapping.exportList\n const isClientEntry = mapping.isClientEntry\n const exportMap = new Map<string, [string, string]>()\n for (const [name, filePath, orig] of exportList) {\n exportMap.set(name, [filePath, orig])\n }\n\n let output = ''\n let missedNames: string[] = []\n for (const name of names) {\n // If the name matches\n if (exportMap.has(name)) {\n const decl = exportMap.get(name)!\n\n if (decl[1] === '*') {\n output += `\\nexport * as ${name} from ${JSON.stringify(decl[0])}`\n } else if (decl[1] === 'default') {\n output += `\\nexport { default as ${name} } from ${JSON.stringify(\n decl[0]\n )}`\n } else if (decl[1] === name) {\n output += `\\nexport { ${name} } from ${JSON.stringify(decl[0])}`\n } else {\n output += `\\nexport { ${decl[1]} as ${name} } from ${JSON.stringify(\n decl[0]\n )}`\n }\n } else {\n missedNames.push(name)\n }\n }\n\n // These are from wildcard exports.\n if (missedNames.length > 0) {\n for (const req of mapping.wildcardExports) {\n output += `\\nexport * from ${JSON.stringify(\n req.replace('__PLACEHOLDER__', missedNames.join(',') + '&wildcard')\n )}`\n }\n }\n\n // When it has `\"use client\"` inherited from its barrel files, we need to\n // prefix it to this target file as well.\n if (isClientEntry) {\n output = `\"use client\";\\n${output}`\n }\n\n this.callback(null, output)\n}\n\nexport default NextBarrelLoader\n"],"names":["path","transform","barrelTransformMappingCache","Map","getBarrelMapping","resourcePath","swcCacheDir","resolve","fs","has","get","transpileSource","filename","source","isWildcard","isTypeScript","endsWith","Promise","res","inputSourceMap","undefined","sourceFileName","optimizeBarrelExports","wildcard","jsc","parser","syntax","experimental","cacheRoot","then","output","code","visited","Set","getMatches","file","isClientEntry","add","rej","readFile","err","data","toString","matches","match","matchedDirectives","directiveList","JSON","parse","includes","exportList","slice","wildcardExports","matchAll","map","decl","length","all","req","targetPath","dirname","replace","targetMatches","concat","set","NextBarrelLoader","async","cacheable","names","getOptions","getResolve","mainFields","mapping","clearDependencies","callback","stringify","exportMap","name","filePath","orig","missedNames","push","join"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-barrel-loader.ts"],"sourcesContent":["/**\n * ## Barrel Optimizations\n *\n * This loader is used to optimize the imports of \"barrel\" files that have many\n * re-exports. Currently, both Node.js and Webpack have to enter all of these\n * submodules even if we only need a few of them.\n *\n * For example, say a file `foo.js` with the following contents:\n *\n * export { a } from './a'\n * export { b } from './b'\n * export { c } from './c'\n * ...\n *\n * If the user imports `a` only, this loader will accept the `names` option to\n * be `['a']`. Then, it request the \"__barrel_transform__\" SWC transform to load\n * `foo.js` and receive the following output:\n *\n * export const __next_private_export_map__ = '[[\"a\",\"./a\",\"a\"],[\"b\",\"./b\",\"b\"],[\"c\",\"./c\",\"c\"],...]'\n *\n * format: '[\"<imported identifier>\", \"<import path>\", \"<exported name>\"]'\n * e.g.: import { a as b } from './module-a' => '[\"b\", \"./module-a\", \"a\"]'\n *\n * The export map, generated by SWC, is a JSON that represents the exports of\n * that module, their original file, and their original name (since you can do\n * `export { a as b }`).\n *\n * Then, this loader can safely remove all the exports that are not needed and\n * re-export the ones from `names`:\n *\n * export { a } from './a'\n *\n * That's the basic situation and also the happy path.\n *\n *\n *\n * ## Wildcard Exports\n *\n * For wildcard exports (e.g. `export * from './a'`), it becomes a bit more complicated.\n * Say `foo.js` with the following contents:\n *\n * export * from './a'\n * export * from './b'\n * export * from './c'\n * ...\n *\n * If the user imports `bar` from it, SWC can never know which files are going to be\n * exporting `bar`. So, we have to keep all the wildcard exports and do the same\n * process recursively. This loader will return the following output:\n *\n * export * from '__barrel_optimize__?names=bar&wildcard!=!./a'\n * export * from '__barrel_optimize__?names=bar&wildcard!=!./b'\n * export * from '__barrel_optimize__?names=bar&wildcard!=!./c'\n * ...\n *\n * The \"!=!\" tells Webpack to use the same loader to process './a', './b', and './c'.\n * After the recursive process, the \"inner loaders\" will either return an empty string\n * or:\n *\n * export * from './target'\n *\n * Where `target` is the file that exports `bar`.\n *\n *\n *\n * ## Non-Barrel Files\n *\n * If the file is not a barrel, we can't apply any optimizations. That's because\n * we can't easily remove things from the file. For example, say `foo.js` with:\n *\n * const v = 1\n * export function b () {\n * return v\n * }\n *\n * If the user imports `b` only, we can't remove the `const v = 1` even though\n * the file is side-effect free. In these caes, this loader will simply re-export\n * `foo.js`:\n *\n * export * from './foo'\n *\n * Besides these cases, this loader also carefully handles the module cache so\n * SWC won't analyze the same file twice, and no instance of the same file will\n * be accidentally created as different instances.\n */\n\nimport type webpack from 'webpack'\n\nimport path from 'path'\nimport { transform } from '../../swc'\nimport { installBindings } from '../../swc/install-bindings'\n\n// This is a in-memory cache for the mapping of barrel exports. This only applies\n// to the packages that we optimize. It will never change (e.g. upgrading packages)\n// during the lifetime of the server so we can safely cache it.\n// There is also no need to collect the cache for the same reason.\nconst barrelTransformMappingCache = new Map<\n string,\n {\n exportList: [string, string, string][]\n wildcardExports: string[]\n isClientEntry: boolean\n } | null\n>()\n\nasync function getBarrelMapping(\n resourcePath: string,\n swcCacheDir: string,\n resolve: (context: string, request: string) => Promise<string>,\n fs: {\n readFile: (\n path: string,\n callback: (err: any, data: string | Buffer | undefined) => void\n ) => void\n }\n) {\n if (barrelTransformMappingCache.has(resourcePath)) {\n return barrelTransformMappingCache.get(resourcePath)!\n }\n\n // This is a SWC transform specifically for `optimizeBarrelExports`. We don't\n // care about other things but the export map only.\n async function transpileSource(\n filename: string,\n source: string,\n isWildcard: boolean\n ) {\n const isTypeScript = filename.endsWith('.ts') || filename.endsWith('.tsx')\n return new Promise<string>((res) =>\n transform(source, {\n filename,\n inputSourceMap: undefined,\n sourceFileName: filename,\n optimizeBarrelExports: {\n wildcard: isWildcard,\n },\n jsc: {\n parser: {\n syntax: isTypeScript ? 'typescript' : 'ecmascript',\n [isTypeScript ? 'tsx' : 'jsx']: true,\n },\n experimental: {\n cacheRoot: swcCacheDir,\n },\n },\n }).then((output) => {\n res(output.code)\n })\n )\n }\n\n // Avoid circular `export *` dependencies\n const visited = new Set<string>()\n async function getMatches(\n file: string,\n isWildcard: boolean,\n isClientEntry: boolean\n ) {\n if (visited.has(file)) {\n return null\n }\n visited.add(file)\n\n const source = await new Promise<string>((res, rej) => {\n fs.readFile(file, (err, data) => {\n if (err || data === undefined) {\n rej(err)\n } else {\n res(data.toString())\n }\n })\n })\n\n const output = await transpileSource(file, source, isWildcard)\n\n const matches = output.match(\n /^([^]*)export (const|var) __next_private_export_map__ = ('[^']+'|\"[^\"]+\")/\n )\n if (!matches) {\n return null\n }\n\n const matchedDirectives = output.match(\n /^([^]*)export (const|var) __next_private_directive_list__ = '([^']+)'/\n )\n const directiveList = matchedDirectives\n ? JSON.parse(matchedDirectives[3])\n : []\n // \"use client\" in barrel files has to be transferred to the target file.\n isClientEntry = directiveList.includes('use client')\n\n let exportList = JSON.parse(matches[3].slice(1, -1)) as [\n string,\n string,\n string,\n ][]\n const wildcardExports = [\n ...output.matchAll(/export \\* from \"([^\"]+)\"/g),\n ].map((match) => match[1])\n\n // In the wildcard case, if the value is exported from another file, we\n // redirect to that file (decl[0]). Otherwise, export from the current\n // file itself.\n if (isWildcard) {\n for (const decl of exportList) {\n decl[1] = file\n decl[2] = decl[0]\n }\n }\n\n // This recursively handles the wildcard exports (e.g. `export * from './a'`)\n if (wildcardExports.length) {\n await Promise.all(\n wildcardExports.map(async (req) => {\n const targetPath = await resolve(\n path.dirname(file),\n req.replace('__barrel_optimize__?names=__PLACEHOLDER__!=!', '')\n )\n\n const targetMatches = await getMatches(\n targetPath,\n true,\n isClientEntry\n )\n\n if (targetMatches) {\n // Merge the export list\n exportList = exportList.concat(targetMatches.exportList)\n }\n })\n )\n }\n\n return {\n exportList,\n wildcardExports,\n isClientEntry,\n }\n }\n\n const res = await getMatches(resourcePath, false, false)\n barrelTransformMappingCache.set(resourcePath, res)\n\n return res\n}\n\nconst NextBarrelLoader = async function (\n this: webpack.LoaderContext<{\n names: string[]\n swcCacheDir: string\n }>\n) {\n this.async()\n this.cacheable(true)\n // Install bindings early so they are definitely available.\n // When run by webpack in next this is already done with correct configuration so this is a no-op.\n // In turbopack loaders are run in a subprocess so it may or may not be done.\n await installBindings()\n\n const { names, swcCacheDir } = this.getOptions()\n\n // For barrel optimizations, we always prefer the \"module\" field over the\n // \"main\" field because ESM handling is more robust with better tree-shaking.\n const resolve = this.getResolve({\n mainFields: ['module', 'main'],\n })\n\n const mapping = await getBarrelMapping(\n this.resourcePath,\n swcCacheDir,\n resolve,\n this.fs\n )\n\n // `resolve` adds all sub-paths to the dependency graph. However, we already\n // cached the mapping and we assume them to not change. So, we can safely\n // clear the dependencies here to avoid unnecessary watchers which turned out\n // to be very expensive.\n this.clearDependencies()\n\n if (!mapping) {\n // This file isn't a barrel and we can't apply any optimizations. Let's re-export everything.\n // Since this loader accepts `names` and the request is keyed with `names`, we can't simply\n // return the original source here. That will create these imports with different names as\n // different modules instances.\n this.callback(null, `export * from ${JSON.stringify(this.resourcePath)}`)\n return\n }\n\n const exportList = mapping.exportList\n const isClientEntry = mapping.isClientEntry\n const exportMap = new Map<string, [string, string]>()\n for (const [name, filePath, orig] of exportList) {\n exportMap.set(name, [filePath, orig])\n }\n\n let output = ''\n let missedNames: string[] = []\n for (const name of names) {\n // If the name matches\n if (exportMap.has(name)) {\n const decl = exportMap.get(name)!\n\n if (decl[1] === '*') {\n output += `\\nexport * as ${name} from ${JSON.stringify(decl[0])}`\n } else if (decl[1] === 'default') {\n output += `\\nexport { default as ${name} } from ${JSON.stringify(\n decl[0]\n )}`\n } else if (decl[1] === name) {\n output += `\\nexport { ${name} } from ${JSON.stringify(decl[0])}`\n } else {\n output += `\\nexport { ${decl[1]} as ${name} } from ${JSON.stringify(\n decl[0]\n )}`\n }\n } else {\n missedNames.push(name)\n }\n }\n\n // These are from wildcard exports.\n if (missedNames.length > 0) {\n for (const req of mapping.wildcardExports) {\n output += `\\nexport * from ${JSON.stringify(\n req.replace('__PLACEHOLDER__', missedNames.join(',') + '&wildcard')\n )}`\n }\n }\n\n // When it has `\"use client\"` inherited from its barrel files, we need to\n // prefix it to this target file as well.\n if (isClientEntry) {\n output = `\"use client\";\\n${output}`\n }\n\n this.callback(null, output)\n}\n\nexport default NextBarrelLoader\n"],"names":["path","transform","installBindings","barrelTransformMappingCache","Map","getBarrelMapping","resourcePath","swcCacheDir","resolve","fs","has","get","transpileSource","filename","source","isWildcard","isTypeScript","endsWith","Promise","res","inputSourceMap","undefined","sourceFileName","optimizeBarrelExports","wildcard","jsc","parser","syntax","experimental","cacheRoot","then","output","code","visited","Set","getMatches","file","isClientEntry","add","rej","readFile","err","data","toString","matches","match","matchedDirectives","directiveList","JSON","parse","includes","exportList","slice","wildcardExports","matchAll","map","decl","length","all","req","targetPath","dirname","replace","targetMatches","concat","set","NextBarrelLoader","async","cacheable","names","getOptions","getResolve","mainFields","mapping","clearDependencies","callback","stringify","exportMap","name","filePath","orig","missedNames","push","join"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoFC,GAID,OAAOA,UAAU,OAAM;AACvB,SAASC,SAAS,QAAQ,YAAW;AACrC,SAASC,eAAe,QAAQ,6BAA4B;AAE5D,iFAAiF;AACjF,mFAAmF;AACnF,+DAA+D;AAC/D,kEAAkE;AAClE,MAAMC,8BAA8B,IAAIC;AASxC,eAAeC,iBACbC,YAAoB,EACpBC,WAAmB,EACnBC,OAA8D,EAC9DC,EAKC;IAED,IAAIN,4BAA4BO,GAAG,CAACJ,eAAe;QACjD,OAAOH,4BAA4BQ,GAAG,CAACL;IACzC;IAEA,6EAA6E;IAC7E,mDAAmD;IACnD,eAAeM,gBACbC,QAAgB,EAChBC,MAAc,EACdC,UAAmB;QAEnB,MAAMC,eAAeH,SAASI,QAAQ,CAAC,UAAUJ,SAASI,QAAQ,CAAC;QACnE,OAAO,IAAIC,QAAgB,CAACC,MAC1BlB,UAAUa,QAAQ;gBAChBD;gBACAO,gBAAgBC;gBAChBC,gBAAgBT;gBAChBU,uBAAuB;oBACrBC,UAAUT;gBACZ;gBACAU,KAAK;oBACHC,QAAQ;wBACNC,QAAQX,eAAe,eAAe;wBACtC,CAACA,eAAe,QAAQ,MAAM,EAAE;oBAClC;oBACAY,cAAc;wBACZC,WAAWtB;oBACb;gBACF;YACF,GAAGuB,IAAI,CAAC,CAACC;gBACPZ,IAAIY,OAAOC,IAAI;YACjB;IAEJ;IAEA,yCAAyC;IACzC,MAAMC,UAAU,IAAIC;IACpB,eAAeC,WACbC,IAAY,EACZrB,UAAmB,EACnBsB,aAAsB;QAEtB,IAAIJ,QAAQvB,GAAG,CAAC0B,OAAO;YACrB,OAAO;QACT;QACAH,QAAQK,GAAG,CAACF;QAEZ,MAAMtB,SAAS,MAAM,IAAII,QAAgB,CAACC,KAAKoB;YAC7C9B,GAAG+B,QAAQ,CAACJ,MAAM,CAACK,KAAKC;gBACtB,IAAID,OAAOC,SAASrB,WAAW;oBAC7BkB,IAAIE;gBACN,OAAO;oBACLtB,IAAIuB,KAAKC,QAAQ;gBACnB;YACF;QACF;QAEA,MAAMZ,SAAS,MAAMnB,gBAAgBwB,MAAMtB,QAAQC;QAEnD,MAAM6B,UAAUb,OAAOc,KAAK,CAC1B;QAEF,IAAI,CAACD,SAAS;YACZ,OAAO;QACT;QAEA,MAAME,oBAAoBf,OAAOc,KAAK,CACpC;QAEF,MAAME,gBAAgBD,oBAClBE,KAAKC,KAAK,CAACH,iBAAiB,CAAC,EAAE,IAC/B,EAAE;QACN,yEAAyE;QACzET,gBAAgBU,cAAcG,QAAQ,CAAC;QAEvC,IAAIC,aAAaH,KAAKC,KAAK,CAACL,OAAO,CAAC,EAAE,CAACQ,KAAK,CAAC,GAAG,CAAC;QAKjD,MAAMC,kBAAkB;eACnBtB,OAAOuB,QAAQ,CAAC;SACpB,CAACC,GAAG,CAAC,CAACV,QAAUA,KAAK,CAAC,EAAE;QAEzB,uEAAuE;QACvE,sEAAsE;QACtE,eAAe;QACf,IAAI9B,YAAY;YACd,KAAK,MAAMyC,QAAQL,WAAY;gBAC7BK,IAAI,CAAC,EAAE,GAAGpB;gBACVoB,IAAI,CAAC,EAAE,GAAGA,IAAI,CAAC,EAAE;YACnB;QACF;QAEA,6EAA6E;QAC7E,IAAIH,gBAAgBI,MAAM,EAAE;YAC1B,MAAMvC,QAAQwC,GAAG,CACfL,gBAAgBE,GAAG,CAAC,OAAOI;gBACzB,MAAMC,aAAa,MAAMpD,QACvBR,KAAK6D,OAAO,CAACzB,OACbuB,IAAIG,OAAO,CAAC,gDAAgD;gBAG9D,MAAMC,gBAAgB,MAAM5B,WAC1ByB,YACA,MACAvB;gBAGF,IAAI0B,eAAe;oBACjB,wBAAwB;oBACxBZ,aAAaA,WAAWa,MAAM,CAACD,cAAcZ,UAAU;gBACzD;YACF;QAEJ;QAEA,OAAO;YACLA;YACAE;YACAhB;QACF;IACF;IAEA,MAAMlB,MAAM,MAAMgB,WAAW7B,cAAc,OAAO;IAClDH,4BAA4B8D,GAAG,CAAC3D,cAAca;IAE9C,OAAOA;AACT;AAEA,MAAM+C,mBAAmB;IAMvB,IAAI,CAACC,KAAK;IACV,IAAI,CAACC,SAAS,CAAC;IACf,2DAA2D;IAC3D,kGAAkG;IAClG,6EAA6E;IAC7E,MAAMlE;IAEN,MAAM,EAAEmE,KAAK,EAAE9D,WAAW,EAAE,GAAG,IAAI,CAAC+D,UAAU;IAE9C,yEAAyE;IACzE,6EAA6E;IAC7E,MAAM9D,UAAU,IAAI,CAAC+D,UAAU,CAAC;QAC9BC,YAAY;YAAC;YAAU;SAAO;IAChC;IAEA,MAAMC,UAAU,MAAMpE,iBACpB,IAAI,CAACC,YAAY,EACjBC,aACAC,SACA,IAAI,CAACC,EAAE;IAGT,4EAA4E;IAC5E,yEAAyE;IACzE,6EAA6E;IAC7E,wBAAwB;IACxB,IAAI,CAACiE,iBAAiB;IAEtB,IAAI,CAACD,SAAS;QACZ,6FAA6F;QAC7F,2FAA2F;QAC3F,0FAA0F;QAC1F,+BAA+B;QAC/B,IAAI,CAACE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE3B,KAAK4B,SAAS,CAAC,IAAI,CAACtE,YAAY,GAAG;QACxE;IACF;IAEA,MAAM6C,aAAasB,QAAQtB,UAAU;IACrC,MAAMd,gBAAgBoC,QAAQpC,aAAa;IAC3C,MAAMwC,YAAY,IAAIzE;IACtB,KAAK,MAAM,CAAC0E,MAAMC,UAAUC,KAAK,IAAI7B,WAAY;QAC/C0B,UAAUZ,GAAG,CAACa,MAAM;YAACC;YAAUC;SAAK;IACtC;IAEA,IAAIjD,SAAS;IACb,IAAIkD,cAAwB,EAAE;IAC9B,KAAK,MAAMH,QAAQT,MAAO;QACxB,sBAAsB;QACtB,IAAIQ,UAAUnE,GAAG,CAACoE,OAAO;YACvB,MAAMtB,OAAOqB,UAAUlE,GAAG,CAACmE;YAE3B,IAAItB,IAAI,CAAC,EAAE,KAAK,KAAK;gBACnBzB,UAAU,CAAC,cAAc,EAAE+C,KAAK,MAAM,EAAE9B,KAAK4B,SAAS,CAACpB,IAAI,CAAC,EAAE,GAAG;YACnE,OAAO,IAAIA,IAAI,CAAC,EAAE,KAAK,WAAW;gBAChCzB,UAAU,CAAC,sBAAsB,EAAE+C,KAAK,QAAQ,EAAE9B,KAAK4B,SAAS,CAC9DpB,IAAI,CAAC,EAAE,GACN;YACL,OAAO,IAAIA,IAAI,CAAC,EAAE,KAAKsB,MAAM;gBAC3B/C,UAAU,CAAC,WAAW,EAAE+C,KAAK,QAAQ,EAAE9B,KAAK4B,SAAS,CAACpB,IAAI,CAAC,EAAE,GAAG;YAClE,OAAO;gBACLzB,UAAU,CAAC,WAAW,EAAEyB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAEsB,KAAK,QAAQ,EAAE9B,KAAK4B,SAAS,CACjEpB,IAAI,CAAC,EAAE,GACN;YACL;QACF,OAAO;YACLyB,YAAYC,IAAI,CAACJ;QACnB;IACF;IAEA,mCAAmC;IACnC,IAAIG,YAAYxB,MAAM,GAAG,GAAG;QAC1B,KAAK,MAAME,OAAOc,QAAQpB,eAAe,CAAE;YACzCtB,UAAU,CAAC,gBAAgB,EAAEiB,KAAK4B,SAAS,CACzCjB,IAAIG,OAAO,CAAC,mBAAmBmB,YAAYE,IAAI,CAAC,OAAO,eACtD;QACL;IACF;IAEA,yEAAyE;IACzE,yCAAyC;IACzC,IAAI9C,eAAe;QACjBN,SAAS,CAAC,eAAe,EAAEA,QAAQ;IACrC;IAEA,IAAI,CAAC4C,QAAQ,CAAC,MAAM5C;AACtB;AAEA,eAAemC,iBAAgB","ignoreList":[0]}
|
|
@@ -8,9 +8,14 @@ import { imageExtMimeTypeMap } from '../../../lib/mime-type';
|
|
|
8
8
|
import { WEBPACK_RESOURCE_QUERIES } from '../../../lib/constants';
|
|
9
9
|
import { normalizePathSep } from '../../../shared/lib/page-path/normalize-path-sep';
|
|
10
10
|
import { getLoaderModuleNamedExports } from './utils';
|
|
11
|
+
import { installBindings } from '../../swc/install-bindings';
|
|
11
12
|
// [NOTE] For turbopack, refer to app_page_loader_tree's write_metadata_item for
|
|
12
13
|
// corresponding features.
|
|
13
14
|
async function nextMetadataImageLoader(content) {
|
|
15
|
+
// Install bindings early so they are definitely available to the loader.
|
|
16
|
+
// When run by webpack in next this is already done with correct configuration so this is a no-op.
|
|
17
|
+
// In turbopack loaders are run in a subprocess so it may or may not be done.
|
|
18
|
+
await installBindings();
|
|
14
19
|
const options = this.getOptions();
|
|
15
20
|
const { type, segment, pageExtensions, basePath } = options;
|
|
16
21
|
const { resourcePath, rootContext: context } = this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-metadata-image-loader.ts"],"sourcesContent":["/*\n * This loader is responsible for extracting the metadata image info for rendering in html\n */\n\nimport type webpack from 'webpack'\nimport type {\n MetadataImageModule,\n PossibleImageFileNameConvention,\n} from './metadata/types'\nimport { existsSync, promises as fs } from 'fs'\nimport path from 'path'\nimport loaderUtils from 'next/dist/compiled/loader-utils3'\nimport { getImageSize } from '../../../server/image-optimizer'\nimport { imageExtMimeTypeMap } from '../../../lib/mime-type'\nimport { WEBPACK_RESOURCE_QUERIES } from '../../../lib/constants'\nimport { normalizePathSep } from '../../../shared/lib/page-path/normalize-path-sep'\nimport type { PageExtensions } from '../../page-extensions-type'\nimport { getLoaderModuleNamedExports } from './utils'\n\ninterface Options {\n segment: string\n type: PossibleImageFileNameConvention\n pageExtensions: PageExtensions\n basePath: string\n}\n\n// [NOTE] For turbopack, refer to app_page_loader_tree's write_metadata_item for\n// corresponding features.\nasync function nextMetadataImageLoader(\n this: webpack.LoaderContext<Options>,\n content: Buffer\n) {\n const options: Options = this.getOptions()\n const { type, segment, pageExtensions, basePath } = options\n const { resourcePath, rootContext: context } = this\n const { name: fileNameBase, ext } = path.parse(resourcePath)\n const useNumericSizes = type === 'twitter' || type === 'openGraph'\n\n let extension = ext.slice(1)\n if (extension === 'jpg') {\n extension = 'jpeg'\n }\n\n const opts = { context, content }\n\n const contentHash = loaderUtils.interpolateName(this, '[contenthash]', opts)\n\n const interpolatedName = loaderUtils.interpolateName(\n this,\n '[name].[ext]',\n opts\n )\n\n const isDynamicResource = pageExtensions.includes(extension)\n const pageSegment = isDynamicResource ? fileNameBase : interpolatedName\n const hashQuery = contentHash ? '?' + contentHash : ''\n const pathnamePrefix = normalizePathSep(path.join(basePath, segment))\n\n if (isDynamicResource) {\n const exportedFieldsExcludingDefault = (\n await getLoaderModuleNamedExports(resourcePath, this)\n ).filter((name) => name !== 'default')\n\n // re-export and spread as `exportedImageData` to avoid non-exported error\n return `\\\n import {\n ${exportedFieldsExcludingDefault\n .map((field) => `${field} as _${field}`)\n .join(',')}\n } from ${JSON.stringify(\n // This is an arbitrary resource query to ensure it's a new request, instead\n // of sharing the same module with next-metadata-route-loader.\n // Since here we only need export fields such as `size`, `alt` and\n // `generateImageMetadata`, avoid sharing the same module can make this entry\n // smaller.\n resourcePath + '?' + WEBPACK_RESOURCE_QUERIES.metadataImageMeta\n )}\n import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route'\n\n const imageModule = {\n ${exportedFieldsExcludingDefault\n .map((field) => `${field}: _${field}`)\n .join(',')}\n }\n\n function getImageMetadata(imageMetadata, idParam, resolvedParams) {\n const imageUrl = fillMetadataSegment(${JSON.stringify(\n pathnamePrefix\n )}, resolvedParams, ${JSON.stringify(pageSegment)})\n const data = {\n alt: imageMetadata.alt,\n type: imageMetadata.contentType || 'image/png',\n url: imageUrl + (idParam ? ('/' + idParam) : '') + ${JSON.stringify(\n hashQuery\n )},\n }\n const { size } = imageMetadata\n if (size) {\n ${\n type === 'twitter' || type === 'openGraph'\n ? 'data.width = size.width; data.height = size.height;'\n : 'data.sizes = size.width + \"x\" + size.height;'\n }\n }\n return data\n }\n\n export default async function (props) {\n const { generateImageMetadata } = imageModule\n const resolvedParams = await props.params\n\n if (generateImageMetadata) {\n const imageMetadataArray = await generateImageMetadata({ params: resolvedParams })\n return imageMetadataArray.map((imageMetadata, index) => {\n const idParam = imageMetadata.id + ''\n return getImageMetadata(imageMetadata, idParam, resolvedParams)\n })\n } else {\n return [getImageMetadata(imageModule, '', resolvedParams)]\n }\n }`\n }\n\n let imageError\n const imageSize: { width?: number; height?: number } = await getImageSize(\n content\n ).catch((error) => {\n const message = `Process image \"${path.posix.join(segment || '/', interpolatedName)}\" failed: ${error}`\n imageError = new Error(message)\n return {}\n })\n\n if (imageError) {\n throw imageError\n }\n\n const imageData: Omit<MetadataImageModule, 'url'> = {\n ...(extension in imageExtMimeTypeMap && {\n type: imageExtMimeTypeMap[extension as keyof typeof imageExtMimeTypeMap],\n }),\n ...(useNumericSizes && imageSize.width != null && imageSize.height != null\n ? imageSize\n : {\n sizes:\n // For SVGs, skip sizes and use \"any\" to let it scale automatically based on viewport,\n // For the images doesn't provide the size properly, use \"any\" as well.\n // If the size is presented, use the actual size for the image.\n extension !== 'svg' &&\n imageSize.width != null &&\n imageSize.height != null\n ? `${imageSize.width}x${imageSize.height}`\n : 'any',\n }),\n }\n if (type === 'openGraph' || type === 'twitter') {\n const altPath = path.join(\n path.dirname(resourcePath),\n fileNameBase + '.alt.txt'\n )\n\n if (existsSync(altPath)) {\n imageData.alt = await fs.readFile(altPath, 'utf8')\n }\n }\n\n return `\\\n import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route'\n\n export default async (props) => {\n const imageData = ${JSON.stringify(imageData)}\n const imageUrl = fillMetadataSegment(${JSON.stringify(\n pathnamePrefix\n )}, await props.params, ${JSON.stringify(pageSegment)})\n\n return [{\n ...imageData,\n url: imageUrl + ${JSON.stringify(hashQuery)},\n }]\n }`\n}\n\nexport const raw = true\nexport default nextMetadataImageLoader\n"],"names":["existsSync","promises","fs","path","loaderUtils","getImageSize","imageExtMimeTypeMap","WEBPACK_RESOURCE_QUERIES","normalizePathSep","getLoaderModuleNamedExports","nextMetadataImageLoader","content","options","getOptions","type","segment","pageExtensions","basePath","resourcePath","rootContext","context","name","fileNameBase","ext","parse","useNumericSizes","extension","slice","opts","contentHash","interpolateName","interpolatedName","isDynamicResource","includes","pageSegment","hashQuery","pathnamePrefix","join","exportedFieldsExcludingDefault","filter","map","field","JSON","stringify","metadataImageMeta","imageError","imageSize","catch","error","message","posix","Error","imageData","width","height","sizes","altPath","dirname","alt","readFile","raw"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-metadata-image-loader.ts"],"sourcesContent":["/*\n * This loader is responsible for extracting the metadata image info for rendering in html\n */\n\nimport type webpack from 'webpack'\nimport type {\n MetadataImageModule,\n PossibleImageFileNameConvention,\n} from './metadata/types'\nimport { existsSync, promises as fs } from 'fs'\nimport path from 'path'\nimport loaderUtils from 'next/dist/compiled/loader-utils3'\nimport { getImageSize } from '../../../server/image-optimizer'\nimport { imageExtMimeTypeMap } from '../../../lib/mime-type'\nimport { WEBPACK_RESOURCE_QUERIES } from '../../../lib/constants'\nimport { normalizePathSep } from '../../../shared/lib/page-path/normalize-path-sep'\nimport type { PageExtensions } from '../../page-extensions-type'\nimport { getLoaderModuleNamedExports } from './utils'\nimport { installBindings } from '../../swc/install-bindings'\n\ninterface Options {\n segment: string\n type: PossibleImageFileNameConvention\n pageExtensions: PageExtensions\n basePath: string\n}\n\n// [NOTE] For turbopack, refer to app_page_loader_tree's write_metadata_item for\n// corresponding features.\nasync function nextMetadataImageLoader(\n this: webpack.LoaderContext<Options>,\n content: Buffer\n) {\n // Install bindings early so they are definitely available to the loader.\n // When run by webpack in next this is already done with correct configuration so this is a no-op.\n // In turbopack loaders are run in a subprocess so it may or may not be done.\n await installBindings()\n const options: Options = this.getOptions()\n const { type, segment, pageExtensions, basePath } = options\n const { resourcePath, rootContext: context } = this\n const { name: fileNameBase, ext } = path.parse(resourcePath)\n const useNumericSizes = type === 'twitter' || type === 'openGraph'\n\n let extension = ext.slice(1)\n if (extension === 'jpg') {\n extension = 'jpeg'\n }\n\n const opts = { context, content }\n\n const contentHash = loaderUtils.interpolateName(this, '[contenthash]', opts)\n\n const interpolatedName = loaderUtils.interpolateName(\n this,\n '[name].[ext]',\n opts\n )\n\n const isDynamicResource = pageExtensions.includes(extension)\n const pageSegment = isDynamicResource ? fileNameBase : interpolatedName\n const hashQuery = contentHash ? '?' + contentHash : ''\n const pathnamePrefix = normalizePathSep(path.join(basePath, segment))\n\n if (isDynamicResource) {\n const exportedFieldsExcludingDefault = (\n await getLoaderModuleNamedExports(resourcePath, this)\n ).filter((name) => name !== 'default')\n\n // re-export and spread as `exportedImageData` to avoid non-exported error\n return `\\\n import {\n ${exportedFieldsExcludingDefault\n .map((field) => `${field} as _${field}`)\n .join(',')}\n } from ${JSON.stringify(\n // This is an arbitrary resource query to ensure it's a new request, instead\n // of sharing the same module with next-metadata-route-loader.\n // Since here we only need export fields such as `size`, `alt` and\n // `generateImageMetadata`, avoid sharing the same module can make this entry\n // smaller.\n resourcePath + '?' + WEBPACK_RESOURCE_QUERIES.metadataImageMeta\n )}\n import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route'\n\n const imageModule = {\n ${exportedFieldsExcludingDefault\n .map((field) => `${field}: _${field}`)\n .join(',')}\n }\n\n function getImageMetadata(imageMetadata, idParam, resolvedParams) {\n const imageUrl = fillMetadataSegment(${JSON.stringify(\n pathnamePrefix\n )}, resolvedParams, ${JSON.stringify(pageSegment)})\n const data = {\n alt: imageMetadata.alt,\n type: imageMetadata.contentType || 'image/png',\n url: imageUrl + (idParam ? ('/' + idParam) : '') + ${JSON.stringify(\n hashQuery\n )},\n }\n const { size } = imageMetadata\n if (size) {\n ${\n type === 'twitter' || type === 'openGraph'\n ? 'data.width = size.width; data.height = size.height;'\n : 'data.sizes = size.width + \"x\" + size.height;'\n }\n }\n return data\n }\n\n export default async function (props) {\n const { generateImageMetadata } = imageModule\n const resolvedParams = await props.params\n\n if (generateImageMetadata) {\n const imageMetadataArray = await generateImageMetadata({ params: resolvedParams })\n return imageMetadataArray.map((imageMetadata, index) => {\n const idParam = imageMetadata.id + ''\n return getImageMetadata(imageMetadata, idParam, resolvedParams)\n })\n } else {\n return [getImageMetadata(imageModule, '', resolvedParams)]\n }\n }`\n }\n\n let imageError\n const imageSize: { width?: number; height?: number } = await getImageSize(\n content\n ).catch((error) => {\n const message = `Process image \"${path.posix.join(segment || '/', interpolatedName)}\" failed: ${error}`\n imageError = new Error(message)\n return {}\n })\n\n if (imageError) {\n throw imageError\n }\n\n const imageData: Omit<MetadataImageModule, 'url'> = {\n ...(extension in imageExtMimeTypeMap && {\n type: imageExtMimeTypeMap[extension as keyof typeof imageExtMimeTypeMap],\n }),\n ...(useNumericSizes && imageSize.width != null && imageSize.height != null\n ? imageSize\n : {\n sizes:\n // For SVGs, skip sizes and use \"any\" to let it scale automatically based on viewport,\n // For the images doesn't provide the size properly, use \"any\" as well.\n // If the size is presented, use the actual size for the image.\n extension !== 'svg' &&\n imageSize.width != null &&\n imageSize.height != null\n ? `${imageSize.width}x${imageSize.height}`\n : 'any',\n }),\n }\n if (type === 'openGraph' || type === 'twitter') {\n const altPath = path.join(\n path.dirname(resourcePath),\n fileNameBase + '.alt.txt'\n )\n\n if (existsSync(altPath)) {\n imageData.alt = await fs.readFile(altPath, 'utf8')\n }\n }\n\n return `\\\n import { fillMetadataSegment } from 'next/dist/lib/metadata/get-metadata-route'\n\n export default async (props) => {\n const imageData = ${JSON.stringify(imageData)}\n const imageUrl = fillMetadataSegment(${JSON.stringify(\n pathnamePrefix\n )}, await props.params, ${JSON.stringify(pageSegment)})\n\n return [{\n ...imageData,\n url: imageUrl + ${JSON.stringify(hashQuery)},\n }]\n }`\n}\n\nexport const raw = true\nexport default nextMetadataImageLoader\n"],"names":["existsSync","promises","fs","path","loaderUtils","getImageSize","imageExtMimeTypeMap","WEBPACK_RESOURCE_QUERIES","normalizePathSep","getLoaderModuleNamedExports","installBindings","nextMetadataImageLoader","content","options","getOptions","type","segment","pageExtensions","basePath","resourcePath","rootContext","context","name","fileNameBase","ext","parse","useNumericSizes","extension","slice","opts","contentHash","interpolateName","interpolatedName","isDynamicResource","includes","pageSegment","hashQuery","pathnamePrefix","join","exportedFieldsExcludingDefault","filter","map","field","JSON","stringify","metadataImageMeta","imageError","imageSize","catch","error","message","posix","Error","imageData","width","height","sizes","altPath","dirname","alt","readFile","raw"],"mappings":"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","ignoreList":[0]}
|
|
@@ -2,6 +2,7 @@ import fs from 'fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { imageExtMimeTypeMap } from '../../../lib/mime-type';
|
|
4
4
|
import { getLoaderModuleNamedExports } from './utils';
|
|
5
|
+
import { installBindings } from '../../swc/install-bindings';
|
|
5
6
|
function errorOnBadHandler(resourcePath) {
|
|
6
7
|
return `
|
|
7
8
|
if (typeof handler !== 'function') {
|
|
@@ -288,6 +289,10 @@ async function getSitemapRouteCode(resourcePath, loaderContext) {
|
|
|
288
289
|
// When it's static route, it could be favicon.ico, sitemap.xml, robots.txt etc.
|
|
289
290
|
// TODO-METADATA: improve the cache control strategy
|
|
290
291
|
const nextMetadataRouterLoader = async function() {
|
|
292
|
+
// Install bindings early so they are definitely available to the loader.
|
|
293
|
+
// When run by webpack in next this is already done with correct configuration so this is a no-op.
|
|
294
|
+
// In turbopack loaders are run in a subprocess so it may or may not be done.
|
|
295
|
+
await installBindings();
|
|
291
296
|
const { isDynamicRouteExtension, filePath } = this.getOptions();
|
|
292
297
|
const { name: fileBaseName } = getFilenameAndExtension(filePath);
|
|
293
298
|
this.addDependency(filePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-metadata-route-loader.ts"],"sourcesContent":["import type webpack from 'webpack'\nimport fs from 'fs'\nimport path from 'path'\nimport { imageExtMimeTypeMap } from '../../../lib/mime-type'\nimport { getLoaderModuleNamedExports } from './utils'\n\nfunction errorOnBadHandler(resourcePath: string) {\n return `\n if (typeof handler !== 'function') {\n throw new Error('Default export is missing in ${JSON.stringify(\n resourcePath\n )}')\n }\n `\n}\n\n/* re-export the userland route configs */\nasync function createReExportsCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n // Re-export configs but avoid conflicted exports\n const reExportNames = exportNames.filter(\n (name) =>\n name !== 'default' &&\n name !== 'generateSitemaps' &&\n name !== 'dynamicParams'\n )\n\n return reExportNames.length > 0\n ? `export { ${reExportNames.join(', ')} } from ${JSON.stringify(\n resourcePath\n )}\\n`\n : ''\n}\n\nconst CACHE_HEADERS = {\n NO_CACHE: 'no-cache, no-store',\n REVALIDATE: 'public, max-age=0, must-revalidate',\n}\n\nexport type MetadataRouteLoaderOptions = {\n // Using separate argument to avoid json being parsed and hit error\n // x-ref: https://github.com/vercel/next.js/pull/62615\n filePath: string\n isDynamicRouteExtension: '1' | '0'\n}\n\nexport function getFilenameAndExtension(resourcePath: string) {\n const filename = path.basename(resourcePath)\n const [name, ext] = filename.split('.', 2)\n return {\n name,\n ext,\n }\n}\n\nfunction getContentType(resourcePath: string) {\n let { name, ext } = getFilenameAndExtension(resourcePath)\n if (ext === 'jpg') ext = 'jpeg'\n\n if (name === 'favicon' && ext === 'ico') return 'image/x-icon'\n if (name === 'sitemap') return 'application/xml'\n if (name === 'robots') return 'text/plain'\n if (name === 'manifest') return 'application/manifest+json'\n\n if (ext === 'png' || ext === 'jpeg' || ext === 'ico' || ext === 'svg') {\n return imageExtMimeTypeMap[ext]\n }\n return 'text/plain'\n}\n\nasync function getStaticAssetRouteCode(\n resourcePath: string,\n fileBaseName: string\n) {\n const cache =\n process.env.NODE_ENV !== 'production'\n ? CACHE_HEADERS.NO_CACHE\n : CACHE_HEADERS.REVALIDATE\n\n const isTwitter = fileBaseName === 'twitter-image'\n const isOpenGraph = fileBaseName === 'opengraph-image'\n // Twitter image file size limit is 5MB.\n // General Open Graph image file size limit is 8MB.\n // x-ref: https://developer.x.com/en/docs/x-for-websites/cards/overview/summary\n // x-ref(facebook): https://developers.facebook.com/docs/sharing/webmasters/images\n const fileSizeLimit = isTwitter ? 5 : 8\n const imgName = isTwitter ? 'Twitter' : 'Open Graph'\n\n const code = `\\\n/* static asset route */\nimport { NextResponse } from 'next/server'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst buffer = Buffer.from(${JSON.stringify(\n (await fs.promises.readFile(resourcePath)).toString('base64')\n )}, 'base64'\n )\n\nif (${isTwitter || isOpenGraph}) {\n const fileSizeInMB = buffer.byteLength / 1024 / 1024\n if (fileSizeInMB > ${fileSizeLimit}) {\n throw new Error('File size for ${imgName} image ${JSON.stringify(resourcePath)} exceeds ${fileSizeLimit}MB. ' +\n \\`(Current: \\${fileSizeInMB.toFixed(2)}MB)\\n\\` +\n 'Read more: https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image#image-files-jpg-png-gif'\n )\n }\n}\n\nexport function GET() {\n return new NextResponse(buffer, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(cache)},\n },\n })\n}\n\nexport const dynamic = 'force-static'\n`\n return code\n}\n\nasync function getDynamicTextRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic asset route */\nimport { NextResponse } from 'next/server'\nimport handler from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route with generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateImageMetadata } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const paramsPromise = ctx.params\n const idPromise = paramsPromise.then(params => params?.__metadata_id__)\n const restParamsPromise = paramsPromise.then(params => {\n if (!params) return undefined\n const { __metadata_id__, ...rest } = params\n return rest\n })\n\n const restParams = await restParamsPromise\n const __metadata_id__ = await idPromise\n const imageMetadata = await generateImageMetadata({ params: restParams })\n const id = imageMetadata.find((item) => {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n\n return item.id.toString() === __metadata_id__\n })?.id\n\n if (id == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n\n return handler({ params: restParamsPromise, id: idPromise })\n}\n\nexport async function generateStaticParams({ params }) {\n const imageMetadata = await generateImageMetadata({ params })\n const staticParams = []\n\n for (const item of imageMetadata) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n staticParams.push({ __metadata_id__: item.id.toString() })\n }\n return staticParams\n}\n`\n}\n\nasync function getSingleImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route without generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n return handler({ params: ctx.params })\n}\n`\n}\n\n// <metadata-image>/[id]/route.js\nasync function getImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateParamsExport = exportNames.includes('generateImageMetadata')\n\n if (hasGenerateParamsExport) {\n return getDynamicImageRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleImageRouteCode(resourcePath, loaderContext)\n }\n}\n\nasync function getSingleSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* single sitemap route */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const code = `\\\n/* dynamic sitemap route with generateSitemaps */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateSitemaps } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const paramsPromise = ctx.params\n const idPromise = paramsPromise.then(params => params?.__metadata_id__)\n\n const id = await idPromise\n const hasXmlExtension = id ? id.endsWith('.xml') : false\n const sitemaps = await generateSitemaps()\n let foundId\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n\n const baseId = id && hasXmlExtension ? id.slice(0, -4) : undefined\n if (item.id.toString() === baseId) {\n foundId = item.id\n }\n }\n if (foundId == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n\n const targetIdPromise = idPromise.then(id => {\n const hasXmlExtension = id ? id.endsWith('.xml') : false\n return id && hasXmlExtension ? id.slice(0, -4) : undefined\n })\n const data = await handler({ id: targetIdPromise })\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n\nexport async function generateStaticParams() {\n const sitemaps = await generateSitemaps()\n const params = []\n\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n params.push({ __metadata_id__: item.id.toString() + '.xml' })\n }\n return params\n}\n`\n return code\n}\n\n// <metadata-sitemap>/[id]/route.js\nasync function getSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateSitemaps = exportNames.includes('generateSitemaps')\n\n if (hasGenerateSitemaps) {\n return getDynamicSitemapRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleSitemapRouteCode(resourcePath, loaderContext)\n }\n}\n\n// When it's static route, it could be favicon.ico, sitemap.xml, robots.txt etc.\n// TODO-METADATA: improve the cache control strategy\nconst nextMetadataRouterLoader: webpack.LoaderDefinitionFunction<MetadataRouteLoaderOptions> =\n async function () {\n const { isDynamicRouteExtension, filePath } = this.getOptions()\n const { name: fileBaseName } = getFilenameAndExtension(filePath)\n this.addDependency(filePath)\n\n let code = ''\n if (isDynamicRouteExtension === '1') {\n if (fileBaseName === 'robots' || fileBaseName === 'manifest') {\n code = await getDynamicTextRouteCode(filePath, this)\n } else if (fileBaseName === 'sitemap') {\n code = await getSitemapRouteCode(filePath, this)\n } else {\n code = await getImageRouteCode(filePath, this)\n }\n } else {\n code = await getStaticAssetRouteCode(filePath, fileBaseName)\n }\n\n return code\n }\n\nexport default nextMetadataRouterLoader\n"],"names":["fs","path","imageExtMimeTypeMap","getLoaderModuleNamedExports","errorOnBadHandler","resourcePath","JSON","stringify","createReExportsCode","loaderContext","exportNames","reExportNames","filter","name","length","join","CACHE_HEADERS","NO_CACHE","REVALIDATE","getFilenameAndExtension","filename","basename","ext","split","getContentType","getStaticAssetRouteCode","fileBaseName","cache","process","env","NODE_ENV","isTwitter","isOpenGraph","fileSizeLimit","imgName","code","promises","readFile","toString","getDynamicTextRouteCode","getDynamicImageRouteCode","getSingleImageRouteCode","getImageRouteCode","hasGenerateParamsExport","includes","getSingleSitemapRouteCode","getDynamicSitemapRouteCode","getSitemapRouteCode","hasGenerateSitemaps","nextMetadataRouterLoader","isDynamicRouteExtension","filePath","getOptions","addDependency"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-metadata-route-loader.ts"],"sourcesContent":["import type webpack from 'webpack'\nimport fs from 'fs'\nimport path from 'path'\nimport { imageExtMimeTypeMap } from '../../../lib/mime-type'\nimport { getLoaderModuleNamedExports } from './utils'\nimport { installBindings } from '../../swc/install-bindings'\n\nfunction errorOnBadHandler(resourcePath: string) {\n return `\n if (typeof handler !== 'function') {\n throw new Error('Default export is missing in ${JSON.stringify(\n resourcePath\n )}')\n }\n `\n}\n\n/* re-export the userland route configs */\nasync function createReExportsCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n // Re-export configs but avoid conflicted exports\n const reExportNames = exportNames.filter(\n (name) =>\n name !== 'default' &&\n name !== 'generateSitemaps' &&\n name !== 'dynamicParams'\n )\n\n return reExportNames.length > 0\n ? `export { ${reExportNames.join(', ')} } from ${JSON.stringify(\n resourcePath\n )}\\n`\n : ''\n}\n\nconst CACHE_HEADERS = {\n NO_CACHE: 'no-cache, no-store',\n REVALIDATE: 'public, max-age=0, must-revalidate',\n}\n\nexport type MetadataRouteLoaderOptions = {\n // Using separate argument to avoid json being parsed and hit error\n // x-ref: https://github.com/vercel/next.js/pull/62615\n filePath: string\n isDynamicRouteExtension: '1' | '0'\n}\n\nexport function getFilenameAndExtension(resourcePath: string) {\n const filename = path.basename(resourcePath)\n const [name, ext] = filename.split('.', 2)\n return {\n name,\n ext,\n }\n}\n\nfunction getContentType(resourcePath: string) {\n let { name, ext } = getFilenameAndExtension(resourcePath)\n if (ext === 'jpg') ext = 'jpeg'\n\n if (name === 'favicon' && ext === 'ico') return 'image/x-icon'\n if (name === 'sitemap') return 'application/xml'\n if (name === 'robots') return 'text/plain'\n if (name === 'manifest') return 'application/manifest+json'\n\n if (ext === 'png' || ext === 'jpeg' || ext === 'ico' || ext === 'svg') {\n return imageExtMimeTypeMap[ext]\n }\n return 'text/plain'\n}\n\nasync function getStaticAssetRouteCode(\n resourcePath: string,\n fileBaseName: string\n) {\n const cache =\n process.env.NODE_ENV !== 'production'\n ? CACHE_HEADERS.NO_CACHE\n : CACHE_HEADERS.REVALIDATE\n\n const isTwitter = fileBaseName === 'twitter-image'\n const isOpenGraph = fileBaseName === 'opengraph-image'\n // Twitter image file size limit is 5MB.\n // General Open Graph image file size limit is 8MB.\n // x-ref: https://developer.x.com/en/docs/x-for-websites/cards/overview/summary\n // x-ref(facebook): https://developers.facebook.com/docs/sharing/webmasters/images\n const fileSizeLimit = isTwitter ? 5 : 8\n const imgName = isTwitter ? 'Twitter' : 'Open Graph'\n\n const code = `\\\n/* static asset route */\nimport { NextResponse } from 'next/server'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst buffer = Buffer.from(${JSON.stringify(\n (await fs.promises.readFile(resourcePath)).toString('base64')\n )}, 'base64'\n )\n\nif (${isTwitter || isOpenGraph}) {\n const fileSizeInMB = buffer.byteLength / 1024 / 1024\n if (fileSizeInMB > ${fileSizeLimit}) {\n throw new Error('File size for ${imgName} image ${JSON.stringify(resourcePath)} exceeds ${fileSizeLimit}MB. ' +\n \\`(Current: \\${fileSizeInMB.toFixed(2)}MB)\\n\\` +\n 'Read more: https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image#image-files-jpg-png-gif'\n )\n }\n}\n\nexport function GET() {\n return new NextResponse(buffer, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(cache)},\n },\n })\n}\n\nexport const dynamic = 'force-static'\n`\n return code\n}\n\nasync function getDynamicTextRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic asset route */\nimport { NextResponse } from 'next/server'\nimport handler from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route with generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateImageMetadata } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const paramsPromise = ctx.params\n const idPromise = paramsPromise.then(params => params?.__metadata_id__)\n const restParamsPromise = paramsPromise.then(params => {\n if (!params) return undefined\n const { __metadata_id__, ...rest } = params\n return rest\n })\n\n const restParams = await restParamsPromise\n const __metadata_id__ = await idPromise\n const imageMetadata = await generateImageMetadata({ params: restParams })\n const id = imageMetadata.find((item) => {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n\n return item.id.toString() === __metadata_id__\n })?.id\n\n if (id == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n\n return handler({ params: restParamsPromise, id: idPromise })\n}\n\nexport async function generateStaticParams({ params }) {\n const imageMetadata = await generateImageMetadata({ params })\n const staticParams = []\n\n for (const item of imageMetadata) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n staticParams.push({ __metadata_id__: item.id.toString() })\n }\n return staticParams\n}\n`\n}\n\nasync function getSingleImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route without generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n return handler({ params: ctx.params })\n}\n`\n}\n\n// <metadata-image>/[id]/route.js\nasync function getImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateParamsExport = exportNames.includes('generateImageMetadata')\n\n if (hasGenerateParamsExport) {\n return getDynamicImageRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleImageRouteCode(resourcePath, loaderContext)\n }\n}\n\nasync function getSingleSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* single sitemap route */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const code = `\\\n/* dynamic sitemap route with generateSitemaps */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateSitemaps } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const paramsPromise = ctx.params\n const idPromise = paramsPromise.then(params => params?.__metadata_id__)\n\n const id = await idPromise\n const hasXmlExtension = id ? id.endsWith('.xml') : false\n const sitemaps = await generateSitemaps()\n let foundId\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n\n const baseId = id && hasXmlExtension ? id.slice(0, -4) : undefined\n if (item.id.toString() === baseId) {\n foundId = item.id\n }\n }\n if (foundId == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n\n const targetIdPromise = idPromise.then(id => {\n const hasXmlExtension = id ? id.endsWith('.xml') : false\n return id && hasXmlExtension ? id.slice(0, -4) : undefined\n })\n const data = await handler({ id: targetIdPromise })\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n\nexport async function generateStaticParams() {\n const sitemaps = await generateSitemaps()\n const params = []\n\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n params.push({ __metadata_id__: item.id.toString() + '.xml' })\n }\n return params\n}\n`\n return code\n}\n\n// <metadata-sitemap>/[id]/route.js\nasync function getSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateSitemaps = exportNames.includes('generateSitemaps')\n\n if (hasGenerateSitemaps) {\n return getDynamicSitemapRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleSitemapRouteCode(resourcePath, loaderContext)\n }\n}\n\n// When it's static route, it could be favicon.ico, sitemap.xml, robots.txt etc.\n// TODO-METADATA: improve the cache control strategy\nconst nextMetadataRouterLoader: webpack.LoaderDefinitionFunction<MetadataRouteLoaderOptions> =\n async function () {\n // Install bindings early so they are definitely available to the loader.\n // When run by webpack in next this is already done with correct configuration so this is a no-op.\n // In turbopack loaders are run in a subprocess so it may or may not be done.\n await installBindings()\n const { isDynamicRouteExtension, filePath } = this.getOptions()\n const { name: fileBaseName } = getFilenameAndExtension(filePath)\n this.addDependency(filePath)\n\n let code = ''\n if (isDynamicRouteExtension === '1') {\n if (fileBaseName === 'robots' || fileBaseName === 'manifest') {\n code = await getDynamicTextRouteCode(filePath, this)\n } else if (fileBaseName === 'sitemap') {\n code = await getSitemapRouteCode(filePath, this)\n } else {\n code = await getImageRouteCode(filePath, this)\n }\n } else {\n code = await getStaticAssetRouteCode(filePath, fileBaseName)\n }\n\n return code\n }\n\nexport default nextMetadataRouterLoader\n"],"names":["fs","path","imageExtMimeTypeMap","getLoaderModuleNamedExports","installBindings","errorOnBadHandler","resourcePath","JSON","stringify","createReExportsCode","loaderContext","exportNames","reExportNames","filter","name","length","join","CACHE_HEADERS","NO_CACHE","REVALIDATE","getFilenameAndExtension","filename","basename","ext","split","getContentType","getStaticAssetRouteCode","fileBaseName","cache","process","env","NODE_ENV","isTwitter","isOpenGraph","fileSizeLimit","imgName","code","promises","readFile","toString","getDynamicTextRouteCode","getDynamicImageRouteCode","getSingleImageRouteCode","getImageRouteCode","hasGenerateParamsExport","includes","getSingleSitemapRouteCode","getDynamicSitemapRouteCode","getSitemapRouteCode","hasGenerateSitemaps","nextMetadataRouterLoader","isDynamicRouteExtension","filePath","getOptions","addDependency"],"mappings":"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","ignoreList":[0]}
|
|
@@ -25,7 +25,8 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
|
25
25
|
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
26
26
|
DEALINGS IN THE SOFTWARE.
|
|
27
27
|
*/ import { WEBPACK_LAYERS } from '../../../lib/constants';
|
|
28
|
-
import {
|
|
28
|
+
import { getBindingsSync, transform } from '../../swc';
|
|
29
|
+
import { installBindings } from '../../swc/install-bindings';
|
|
29
30
|
import { getLoaderSWCOptions } from '../../swc/options';
|
|
30
31
|
import path, { isAbsolute } from 'path';
|
|
31
32
|
import { babelIncludeRegexes } from '../../webpack-config';
|
|
@@ -148,7 +149,7 @@ export function pitch() {
|
|
|
148
149
|
(async ()=>{
|
|
149
150
|
if (// if it might be excluded/no-op we can't use pitch loader
|
|
150
151
|
!shouldMaybeExclude && // TODO: investigate swc file reading in PnP mode?
|
|
151
|
-
!process.versions.pnp && !EXCLUDED_PATHS.test(this.resourcePath) && this.loaders.length - 1 === this.loaderIndex && isAbsolute(this.resourcePath) && !
|
|
152
|
+
!process.versions.pnp && !EXCLUDED_PATHS.test(this.resourcePath) && this.loaders.length - 1 === this.loaderIndex && isAbsolute(this.resourcePath) && !getBindingsSync().isWasm) {
|
|
152
153
|
this.addDependency(this.resourcePath);
|
|
153
154
|
return loaderTransform.call(this);
|
|
154
155
|
}
|
|
@@ -159,11 +160,14 @@ export function pitch() {
|
|
|
159
160
|
}
|
|
160
161
|
export default function swcLoader(inputSource, inputSourceMap) {
|
|
161
162
|
const callback = this.async();
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
163
|
+
// Install bindings early so they are definitely available to the loader.
|
|
164
|
+
// When run by webpack in next this is already done with correct configuration so this is a no-op.
|
|
165
|
+
// In turbopack loaders are run in a subprocess so it may or may not be done.
|
|
166
|
+
installBindings().then(()=>loaderTransform.call(this, inputSource, inputSourceMap).then(([transformedSource, outputSourceMap])=>{
|
|
167
|
+
callback(null, transformedSource, outputSourceMap || inputSourceMap);
|
|
168
|
+
}, (err)=>{
|
|
169
|
+
callback(err);
|
|
170
|
+
}));
|
|
167
171
|
}
|
|
168
172
|
// accept Buffers instead of strings
|
|
169
173
|
export const raw = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-swc-loader.ts"],"sourcesContent":["/*\nCopyright (c) 2017 The swc Project Developers\n\nPermission is hereby granted, free of charge, to any\nperson obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without\nlimitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice\nshall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\nimport type { NextConfig } from '../../../types'\nimport { type WebpackLayerName, WEBPACK_LAYERS } from '../../../lib/constants'\nimport { isWasm, transform } from '../../swc'\nimport { getLoaderSWCOptions } from '../../swc/options'\nimport path, { isAbsolute } from 'path'\nimport { babelIncludeRegexes } from '../../webpack-config'\nimport { isResourceInPackages } from '../../handle-externals'\nimport type { TelemetryLoaderContext } from '../plugins/telemetry-plugin/telemetry-plugin'\nimport {\n updateTelemetryLoaderCtxFromTransformOutput,\n type SwcTransformTelemetryOutput,\n} from '../plugins/telemetry-plugin/update-telemetry-loader-context-from-swc'\nimport type { LoaderContext } from 'webpack'\nimport {\n COMPILER_NAMES,\n type CompilerNameValues,\n} from '../../../shared/lib/constants'\n\nconst maybeExclude = (\n excludePath: string,\n transpilePackages: string[]\n): boolean => {\n if (babelIncludeRegexes.some((r) => r.test(excludePath))) {\n return false\n }\n\n const shouldBeBundled = isResourceInPackages(excludePath, transpilePackages)\n if (shouldBeBundled) return false\n\n return excludePath.includes('node_modules')\n}\n\nexport interface SWCLoaderOptions {\n rootDir: string\n isServer: boolean\n compilerType: CompilerNameValues\n pagesDir?: string\n appDir?: string\n hasReactRefresh: boolean\n optimizeServerReact?: boolean\n nextConfig: NextConfig\n jsConfig: any\n supportedBrowsers: string[] | undefined\n swcCacheDir: string\n serverComponents?: boolean\n serverReferenceHashSalt: string\n bundleLayer?: WebpackLayerName\n esm?: boolean\n transpilePackages?: string[]\n}\n\n// these are exact code conditions checked\n// for to force transpiling a `node_module`\nconst FORCE_TRANSPILE_CONDITIONS =\n /next\\/font|next\\/dynamic|use server|use client|use cache/\n// same as above, but including `import(...)`.\n// (note the optional whitespace: `import (...)` is also syntactically valid)\nconst FORCE_TRANSPILE_CONDITIONS_WITH_IMPORT = new RegExp(\n String.raw`(?:${FORCE_TRANSPILE_CONDITIONS.source})|import\\s*\\(`\n)\n\nasync function loaderTransform(\n this: LoaderContext<SWCLoaderOptions> & TelemetryLoaderContext,\n source?: string,\n inputSourceMap?: any\n) {\n // Make the loader async\n const filename = this.resourcePath\n\n // Ensure `.d.ts` are not processed.\n if (filename.endsWith('.d.ts')) {\n return [source, inputSourceMap]\n }\n\n let loaderOptions: SWCLoaderOptions = this.getOptions() || {}\n const shouldMaybeExclude = maybeExclude(\n filename,\n loaderOptions.transpilePackages || []\n )\n\n const trackDynamicImports = shouldTrackDynamicImports(loaderOptions)\n\n if (shouldMaybeExclude) {\n if (!source) {\n throw new Error(`Invariant might be excluded but missing source`)\n }\n\n const forceTranspileConditions = trackDynamicImports\n ? FORCE_TRANSPILE_CONDITIONS_WITH_IMPORT\n : FORCE_TRANSPILE_CONDITIONS\n\n if (!forceTranspileConditions.test(source)) {\n return [source, inputSourceMap]\n }\n }\n\n const {\n isServer,\n rootDir,\n pagesDir,\n appDir,\n hasReactRefresh,\n nextConfig,\n jsConfig,\n supportedBrowsers,\n swcCacheDir,\n serverComponents,\n serverReferenceHashSalt,\n bundleLayer,\n esm,\n } = loaderOptions\n const isPageFile = pagesDir ? filename.startsWith(pagesDir) : false\n const relativeFilePathFromRoot = path.relative(rootDir, filename)\n\n const swcOptions = getLoaderSWCOptions({\n pagesDir,\n appDir,\n filename,\n isServer,\n isPageFile,\n development:\n this.mode === 'development' ||\n !!nextConfig.experimental?.allowDevelopmentBuild,\n isCacheComponents: nextConfig.cacheComponents,\n hasReactRefresh,\n modularizeImports: nextConfig?.modularizeImports,\n optimizePackageImports: nextConfig?.experimental?.optimizePackageImports,\n swcPlugins: nextConfig?.experimental?.swcPlugins,\n compilerOptions: nextConfig?.compiler,\n optimizeServerReact: nextConfig?.experimental?.optimizeServerReact,\n jsConfig,\n supportedBrowsers,\n swcCacheDir,\n relativeFilePathFromRoot,\n serverComponents,\n serverReferenceHashSalt,\n bundleLayer,\n esm,\n cacheHandlers: nextConfig.cacheHandlers,\n useCacheEnabled: nextConfig.experimental?.useCache,\n trackDynamicImports,\n })\n\n const programmaticOptions = {\n ...swcOptions,\n filename,\n inputSourceMap: inputSourceMap ? JSON.stringify(inputSourceMap) : undefined,\n\n // Set the default sourcemap behavior based on Webpack's mapping flag,\n sourceMaps: this.sourceMap,\n inlineSourcesContent: this.sourceMap,\n\n // Ensure that Webpack will get a full absolute path in the sourcemap\n // so that it can properly map the module back to its internal cached\n // modules.\n sourceFileName: filename,\n }\n\n if (!programmaticOptions.inputSourceMap) {\n delete programmaticOptions.inputSourceMap\n }\n\n // auto detect development mode\n if (\n this.mode &&\n programmaticOptions.jsc &&\n programmaticOptions.jsc.transform &&\n programmaticOptions.jsc.transform.react &&\n !Object.prototype.hasOwnProperty.call(\n programmaticOptions.jsc.transform.react,\n 'development'\n )\n ) {\n programmaticOptions.jsc.transform.react.development =\n this.mode === 'development'\n }\n\n return transform(source as any, programmaticOptions).then(\n (\n output: {\n code: string\n map?: string\n } & SwcTransformTelemetryOutput\n ) => {\n updateTelemetryLoaderCtxFromTransformOutput(this, output)\n return [output.code, output.map ? JSON.parse(output.map) : undefined]\n }\n )\n}\n\nfunction shouldTrackDynamicImports(loaderOptions: SWCLoaderOptions): boolean {\n // we only need to track `import()` 1. in cacheComponents, 2. on the server (RSC and SSR)\n // (Note: logic duplicated in crates/next-core/src/next_server/transforms.rs)\n const { nextConfig, bundleLayer, compilerType } = loaderOptions\n return (\n !!nextConfig.cacheComponents &&\n // NOTE: `server` means nodejs. `cacheComponents` is not supported in the edge runtime, so we want to exclude it.\n // (also, the code generated by the dynamic imports transform relies on `CacheSignal`, which uses nodejs-specific APIs)\n compilerType === COMPILER_NAMES.server &&\n (bundleLayer === WEBPACK_LAYERS.reactServerComponents ||\n bundleLayer === WEBPACK_LAYERS.serverSideRendering)\n )\n}\n\nconst EXCLUDED_PATHS =\n /[\\\\/](cache[\\\\/][^\\\\/]+\\.zip[\\\\/]node_modules|__virtual__)[\\\\/]/g\n\nexport function pitch(this: any) {\n const callback = this.async()\n let loaderOptions: SWCLoaderOptions = this.getOptions() || {}\n\n const shouldMaybeExclude = maybeExclude(\n this.resourcePath,\n loaderOptions.transpilePackages || []\n )\n\n ;(async () => {\n if (\n // if it might be excluded/no-op we can't use pitch loader\n !shouldMaybeExclude &&\n // TODO: investigate swc file reading in PnP mode?\n !process.versions.pnp &&\n !EXCLUDED_PATHS.test(this.resourcePath) &&\n this.loaders.length - 1 === this.loaderIndex &&\n isAbsolute(this.resourcePath) &&\n !(await isWasm())\n ) {\n this.addDependency(this.resourcePath)\n return loaderTransform.call(this)\n }\n })().then((r) => {\n if (r) return callback(null, ...r)\n callback()\n }, callback)\n}\n\nexport default function swcLoader(\n this: any,\n inputSource: string,\n inputSourceMap: any\n) {\n const callback = this.async()\n loaderTransform.call(this, inputSource, inputSourceMap).then(\n ([transformedSource, outputSourceMap]: any) => {\n callback(null, transformedSource, outputSourceMap || inputSourceMap)\n },\n (err: Error) => {\n callback(err)\n }\n )\n}\n\n// accept Buffers instead of strings\nexport const raw = true\n"],"names":["WEBPACK_LAYERS","isWasm","transform","getLoaderSWCOptions","path","isAbsolute","babelIncludeRegexes","isResourceInPackages","updateTelemetryLoaderCtxFromTransformOutput","COMPILER_NAMES","maybeExclude","excludePath","transpilePackages","some","r","test","shouldBeBundled","includes","FORCE_TRANSPILE_CONDITIONS","FORCE_TRANSPILE_CONDITIONS_WITH_IMPORT","RegExp","String","raw","source","loaderTransform","inputSourceMap","nextConfig","filename","resourcePath","endsWith","loaderOptions","getOptions","shouldMaybeExclude","trackDynamicImports","shouldTrackDynamicImports","Error","forceTranspileConditions","isServer","rootDir","pagesDir","appDir","hasReactRefresh","jsConfig","supportedBrowsers","swcCacheDir","serverComponents","serverReferenceHashSalt","bundleLayer","esm","isPageFile","startsWith","relativeFilePathFromRoot","relative","swcOptions","development","mode","experimental","allowDevelopmentBuild","isCacheComponents","cacheComponents","modularizeImports","optimizePackageImports","swcPlugins","compilerOptions","compiler","optimizeServerReact","cacheHandlers","useCacheEnabled","useCache","programmaticOptions","JSON","stringify","undefined","sourceMaps","sourceMap","inlineSourcesContent","sourceFileName","jsc","react","Object","prototype","hasOwnProperty","call","then","output","code","map","parse","compilerType","server","reactServerComponents","serverSideRendering","EXCLUDED_PATHS","pitch","callback","async","process","versions","pnp","loaders","length","loaderIndex","addDependency","swcLoader","inputSource","transformedSource","outputSourceMap","err"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-swc-loader.ts"],"sourcesContent":["/*\nCopyright (c) 2017 The swc Project Developers\n\nPermission is hereby granted, free of charge, to any\nperson obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without\nlimitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice\nshall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n*/\n\nimport type { NextConfig } from '../../../types'\nimport { type WebpackLayerName, WEBPACK_LAYERS } from '../../../lib/constants'\nimport { getBindingsSync, transform } from '../../swc'\nimport { installBindings } from '../../swc/install-bindings'\nimport { getLoaderSWCOptions } from '../../swc/options'\nimport path, { isAbsolute } from 'path'\nimport { babelIncludeRegexes } from '../../webpack-config'\nimport { isResourceInPackages } from '../../handle-externals'\nimport type { TelemetryLoaderContext } from '../plugins/telemetry-plugin/telemetry-plugin'\nimport {\n updateTelemetryLoaderCtxFromTransformOutput,\n type SwcTransformTelemetryOutput,\n} from '../plugins/telemetry-plugin/update-telemetry-loader-context-from-swc'\nimport type { LoaderContext } from 'webpack'\nimport {\n COMPILER_NAMES,\n type CompilerNameValues,\n} from '../../../shared/lib/constants'\n\nconst maybeExclude = (\n excludePath: string,\n transpilePackages: string[]\n): boolean => {\n if (babelIncludeRegexes.some((r) => r.test(excludePath))) {\n return false\n }\n\n const shouldBeBundled = isResourceInPackages(excludePath, transpilePackages)\n if (shouldBeBundled) return false\n\n return excludePath.includes('node_modules')\n}\n\nexport interface SWCLoaderOptions {\n rootDir: string\n isServer: boolean\n compilerType: CompilerNameValues\n pagesDir?: string\n appDir?: string\n hasReactRefresh: boolean\n optimizeServerReact?: boolean\n nextConfig: NextConfig\n jsConfig: any\n supportedBrowsers: string[] | undefined\n swcCacheDir: string\n serverComponents?: boolean\n serverReferenceHashSalt: string\n bundleLayer?: WebpackLayerName\n esm?: boolean\n transpilePackages?: string[]\n}\n\n// these are exact code conditions checked\n// for to force transpiling a `node_module`\nconst FORCE_TRANSPILE_CONDITIONS =\n /next\\/font|next\\/dynamic|use server|use client|use cache/\n// same as above, but including `import(...)`.\n// (note the optional whitespace: `import (...)` is also syntactically valid)\nconst FORCE_TRANSPILE_CONDITIONS_WITH_IMPORT = new RegExp(\n String.raw`(?:${FORCE_TRANSPILE_CONDITIONS.source})|import\\s*\\(`\n)\n\nasync function loaderTransform(\n this: LoaderContext<SWCLoaderOptions> & TelemetryLoaderContext,\n source?: string,\n inputSourceMap?: any\n) {\n // Make the loader async\n const filename = this.resourcePath\n\n // Ensure `.d.ts` are not processed.\n if (filename.endsWith('.d.ts')) {\n return [source, inputSourceMap]\n }\n\n let loaderOptions: SWCLoaderOptions = this.getOptions() || {}\n const shouldMaybeExclude = maybeExclude(\n filename,\n loaderOptions.transpilePackages || []\n )\n\n const trackDynamicImports = shouldTrackDynamicImports(loaderOptions)\n\n if (shouldMaybeExclude) {\n if (!source) {\n throw new Error(`Invariant might be excluded but missing source`)\n }\n\n const forceTranspileConditions = trackDynamicImports\n ? FORCE_TRANSPILE_CONDITIONS_WITH_IMPORT\n : FORCE_TRANSPILE_CONDITIONS\n\n if (!forceTranspileConditions.test(source)) {\n return [source, inputSourceMap]\n }\n }\n\n const {\n isServer,\n rootDir,\n pagesDir,\n appDir,\n hasReactRefresh,\n nextConfig,\n jsConfig,\n supportedBrowsers,\n swcCacheDir,\n serverComponents,\n serverReferenceHashSalt,\n bundleLayer,\n esm,\n } = loaderOptions\n const isPageFile = pagesDir ? filename.startsWith(pagesDir) : false\n const relativeFilePathFromRoot = path.relative(rootDir, filename)\n\n const swcOptions = getLoaderSWCOptions({\n pagesDir,\n appDir,\n filename,\n isServer,\n isPageFile,\n development:\n this.mode === 'development' ||\n !!nextConfig.experimental?.allowDevelopmentBuild,\n isCacheComponents: nextConfig.cacheComponents,\n hasReactRefresh,\n modularizeImports: nextConfig?.modularizeImports,\n optimizePackageImports: nextConfig?.experimental?.optimizePackageImports,\n swcPlugins: nextConfig?.experimental?.swcPlugins,\n compilerOptions: nextConfig?.compiler,\n optimizeServerReact: nextConfig?.experimental?.optimizeServerReact,\n jsConfig,\n supportedBrowsers,\n swcCacheDir,\n relativeFilePathFromRoot,\n serverComponents,\n serverReferenceHashSalt,\n bundleLayer,\n esm,\n cacheHandlers: nextConfig.cacheHandlers,\n useCacheEnabled: nextConfig.experimental?.useCache,\n trackDynamicImports,\n })\n\n const programmaticOptions = {\n ...swcOptions,\n filename,\n inputSourceMap: inputSourceMap ? JSON.stringify(inputSourceMap) : undefined,\n\n // Set the default sourcemap behavior based on Webpack's mapping flag,\n sourceMaps: this.sourceMap,\n inlineSourcesContent: this.sourceMap,\n\n // Ensure that Webpack will get a full absolute path in the sourcemap\n // so that it can properly map the module back to its internal cached\n // modules.\n sourceFileName: filename,\n }\n\n if (!programmaticOptions.inputSourceMap) {\n delete programmaticOptions.inputSourceMap\n }\n\n // auto detect development mode\n if (\n this.mode &&\n programmaticOptions.jsc &&\n programmaticOptions.jsc.transform &&\n programmaticOptions.jsc.transform.react &&\n !Object.prototype.hasOwnProperty.call(\n programmaticOptions.jsc.transform.react,\n 'development'\n )\n ) {\n programmaticOptions.jsc.transform.react.development =\n this.mode === 'development'\n }\n\n return transform(source as any, programmaticOptions).then(\n (\n output: {\n code: string\n map?: string\n } & SwcTransformTelemetryOutput\n ) => {\n updateTelemetryLoaderCtxFromTransformOutput(this, output)\n return [output.code, output.map ? JSON.parse(output.map) : undefined]\n }\n )\n}\n\nfunction shouldTrackDynamicImports(loaderOptions: SWCLoaderOptions): boolean {\n // we only need to track `import()` 1. in cacheComponents, 2. on the server (RSC and SSR)\n // (Note: logic duplicated in crates/next-core/src/next_server/transforms.rs)\n const { nextConfig, bundleLayer, compilerType } = loaderOptions\n return (\n !!nextConfig.cacheComponents &&\n // NOTE: `server` means nodejs. `cacheComponents` is not supported in the edge runtime, so we want to exclude it.\n // (also, the code generated by the dynamic imports transform relies on `CacheSignal`, which uses nodejs-specific APIs)\n compilerType === COMPILER_NAMES.server &&\n (bundleLayer === WEBPACK_LAYERS.reactServerComponents ||\n bundleLayer === WEBPACK_LAYERS.serverSideRendering)\n )\n}\n\nconst EXCLUDED_PATHS =\n /[\\\\/](cache[\\\\/][^\\\\/]+\\.zip[\\\\/]node_modules|__virtual__)[\\\\/]/g\n\nexport function pitch(this: any) {\n const callback = this.async()\n let loaderOptions: SWCLoaderOptions = this.getOptions() || {}\n\n const shouldMaybeExclude = maybeExclude(\n this.resourcePath,\n loaderOptions.transpilePackages || []\n )\n\n ;(async () => {\n if (\n // if it might be excluded/no-op we can't use pitch loader\n !shouldMaybeExclude &&\n // TODO: investigate swc file reading in PnP mode?\n !process.versions.pnp &&\n !EXCLUDED_PATHS.test(this.resourcePath) &&\n this.loaders.length - 1 === this.loaderIndex &&\n isAbsolute(this.resourcePath) &&\n !getBindingsSync().isWasm\n ) {\n this.addDependency(this.resourcePath)\n return loaderTransform.call(this)\n }\n })().then((r) => {\n if (r) return callback(null, ...r)\n callback()\n }, callback)\n}\n\nexport default function swcLoader(\n this: any,\n inputSource: string,\n inputSourceMap: any\n) {\n const callback = this.async()\n // Install bindings early so they are definitely available to the loader.\n // When run by webpack in next this is already done with correct configuration so this is a no-op.\n // In turbopack loaders are run in a subprocess so it may or may not be done.\n installBindings().then(() =>\n loaderTransform.call(this, inputSource, inputSourceMap).then(\n ([transformedSource, outputSourceMap]: any) => {\n callback(null, transformedSource, outputSourceMap || inputSourceMap)\n },\n (err: Error) => {\n callback(err)\n }\n )\n )\n}\n\n// accept Buffers instead of strings\nexport const raw = true\n"],"names":["WEBPACK_LAYERS","getBindingsSync","transform","installBindings","getLoaderSWCOptions","path","isAbsolute","babelIncludeRegexes","isResourceInPackages","updateTelemetryLoaderCtxFromTransformOutput","COMPILER_NAMES","maybeExclude","excludePath","transpilePackages","some","r","test","shouldBeBundled","includes","FORCE_TRANSPILE_CONDITIONS","FORCE_TRANSPILE_CONDITIONS_WITH_IMPORT","RegExp","String","raw","source","loaderTransform","inputSourceMap","nextConfig","filename","resourcePath","endsWith","loaderOptions","getOptions","shouldMaybeExclude","trackDynamicImports","shouldTrackDynamicImports","Error","forceTranspileConditions","isServer","rootDir","pagesDir","appDir","hasReactRefresh","jsConfig","supportedBrowsers","swcCacheDir","serverComponents","serverReferenceHashSalt","bundleLayer","esm","isPageFile","startsWith","relativeFilePathFromRoot","relative","swcOptions","development","mode","experimental","allowDevelopmentBuild","isCacheComponents","cacheComponents","modularizeImports","optimizePackageImports","swcPlugins","compilerOptions","compiler","optimizeServerReact","cacheHandlers","useCacheEnabled","useCache","programmaticOptions","JSON","stringify","undefined","sourceMaps","sourceMap","inlineSourcesContent","sourceFileName","jsc","react","Object","prototype","hasOwnProperty","call","then","output","code","map","parse","compilerType","server","reactServerComponents","serverSideRendering","EXCLUDED_PATHS","pitch","callback","async","process","versions","pnp","loaders","length","loaderIndex","isWasm","addDependency","swcLoader","inputSource","transformedSource","outputSourceMap","err"],"mappings":"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","ignoreList":[0]}
|
|
@@ -16,6 +16,7 @@ import { TraceEntryPointsPlugin } from '../webpack/plugins/next-trace-entrypoint
|
|
|
16
16
|
import origDebug from 'next/dist/compiled/debug';
|
|
17
17
|
import { Telemetry } from '../../telemetry/storage';
|
|
18
18
|
import { durationToString, hrtimeToSeconds } from '../duration-to-string';
|
|
19
|
+
import { installBindings } from '../swc/install-bindings';
|
|
19
20
|
const debug = origDebug('next:build:webpack-build');
|
|
20
21
|
function isTelemetryPlugin(plugin) {
|
|
21
22
|
return plugin instanceof TelemetryPlugin;
|
|
@@ -267,6 +268,7 @@ export async function webpackBuildImpl(compilerName) {
|
|
|
267
268
|
}
|
|
268
269
|
// the main function when this file is run as a worker
|
|
269
270
|
export async function workerMain(workerData) {
|
|
271
|
+
var _config_experimental;
|
|
270
272
|
// Clone the telemetry for worker
|
|
271
273
|
const telemetry = new Telemetry({
|
|
272
274
|
distDir: workerData.buildContext.config.distDir
|
|
@@ -279,10 +281,11 @@ export async function workerMain(workerData) {
|
|
|
279
281
|
// Resume plugin state
|
|
280
282
|
resumePluginState(NextBuildContext.pluginState);
|
|
281
283
|
/// load the config because it's not serializable
|
|
282
|
-
NextBuildContext.config = await loadConfig(PHASE_PRODUCTION_BUILD, NextBuildContext.dir, {
|
|
284
|
+
const config = NextBuildContext.config = await loadConfig(PHASE_PRODUCTION_BUILD, NextBuildContext.dir, {
|
|
283
285
|
debugPrerender: NextBuildContext.debugPrerender,
|
|
284
286
|
reactProductionProfiling: NextBuildContext.reactProductionProfiling
|
|
285
287
|
});
|
|
288
|
+
await installBindings((_config_experimental = config.experimental) == null ? void 0 : _config_experimental.useWasmBinary);
|
|
286
289
|
NextBuildContext.nextBuildSpan = trace(`worker-main-${workerData.compilerName}`);
|
|
287
290
|
const result = await webpackBuildImpl(workerData.compilerName);
|
|
288
291
|
const { entriesTrace, chunksTrace } = result.buildTraceContext ?? {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/build/webpack-build/impl.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport { stringBufferUtils } from 'next/dist/compiled/webpack-sources3'\nimport { red } from '../../lib/picocolors'\nimport formatWebpackMessages from '../../shared/lib/format-webpack-messages'\nimport { nonNullable } from '../../lib/non-nullable'\nimport type { COMPILER_INDEXES } from '../../shared/lib/constants'\nimport {\n COMPILER_NAMES,\n CLIENT_STATIC_FILES_RUNTIME_MAIN_APP,\n APP_CLIENT_INTERNALS,\n PHASE_PRODUCTION_BUILD,\n} from '../../shared/lib/constants'\nimport { runCompiler } from '../compiler'\nimport * as Log from '../output/log'\nimport getBaseWebpackConfig, { loadProjectInfo } from '../webpack-config'\nimport type { NextError } from '../../lib/is-error'\nimport {\n TelemetryPlugin,\n type TelemetryPluginState,\n} from '../webpack/plugins/telemetry-plugin/telemetry-plugin'\nimport {\n NextBuildContext,\n resumePluginState,\n getPluginState,\n} from '../build-context'\nimport { createEntrypoints } from '../entries'\nimport loadConfig from '../../server/config'\nimport {\n getTraceEvents,\n initializeTraceState,\n setGlobal,\n trace,\n type TraceEvent,\n type TraceState,\n} from '../../trace'\nimport { WEBPACK_LAYERS } from '../../lib/constants'\nimport { TraceEntryPointsPlugin } from '../webpack/plugins/next-trace-entrypoints-plugin'\nimport type { BuildTraceContext } from '../webpack/plugins/next-trace-entrypoints-plugin'\nimport type { UnwrapPromise } from '../../lib/coalesced-function'\n\nimport origDebug from 'next/dist/compiled/debug'\nimport { Telemetry } from '../../telemetry/storage'\nimport { durationToString, hrtimeToSeconds } from '../duration-to-string'\n\nconst debug = origDebug('next:build:webpack-build')\n\ntype CompilerResult = {\n errors: webpack.StatsError[]\n warnings: webpack.StatsError[]\n stats: (webpack.Stats | undefined)[]\n}\n\ntype SingleCompilerResult = {\n errors: webpack.StatsError[]\n warnings: webpack.StatsError[]\n stats: webpack.Stats | undefined\n}\n\nfunction isTelemetryPlugin(plugin: unknown): plugin is TelemetryPlugin {\n return plugin instanceof TelemetryPlugin\n}\n\nfunction isTraceEntryPointsPlugin(\n plugin: unknown\n): plugin is TraceEntryPointsPlugin {\n return plugin instanceof TraceEntryPointsPlugin\n}\n\nexport async function webpackBuildImpl(\n compilerName: keyof typeof COMPILER_INDEXES | null\n): Promise<{\n duration: number\n pluginState: any\n buildTraceContext?: BuildTraceContext\n telemetryState?: TelemetryPluginState\n}> {\n let result: CompilerResult | null = {\n warnings: [],\n errors: [],\n stats: [],\n }\n let webpackBuildStart\n const nextBuildSpan = NextBuildContext.nextBuildSpan!\n const dir = NextBuildContext.dir!\n const config = NextBuildContext.config!\n process.env.NEXT_COMPILER_NAME = compilerName || 'server'\n\n const runWebpackSpan = nextBuildSpan.traceChild('run-webpack-compiler')\n const entrypoints = await nextBuildSpan\n .traceChild('create-entrypoints')\n .traceAsyncFn(() =>\n createEntrypoints({\n buildId: NextBuildContext.buildId!,\n config: config,\n envFiles: NextBuildContext.loadedEnvFiles!,\n isDev: false,\n rootDir: dir,\n pageExtensions: config.pageExtensions!,\n pagesDir: NextBuildContext.pagesDir!,\n appDir: NextBuildContext.appDir!,\n pages: NextBuildContext.mappedPages!,\n appPaths: NextBuildContext.mappedAppPages!,\n previewMode: NextBuildContext.previewProps!,\n rootPaths: NextBuildContext.mappedRootPaths!,\n hasInstrumentationHook: NextBuildContext.hasInstrumentationHook!,\n })\n )\n\n const commonWebpackOptions = {\n isServer: false,\n isCompileMode: NextBuildContext.isCompileMode,\n buildId: NextBuildContext.buildId!,\n encryptionKey: NextBuildContext.encryptionKey!,\n config: config,\n appDir: NextBuildContext.appDir!,\n pagesDir: NextBuildContext.pagesDir!,\n rewrites: NextBuildContext.rewrites!,\n originalRewrites: NextBuildContext.originalRewrites,\n originalRedirects: NextBuildContext.originalRedirects,\n reactProductionProfiling: NextBuildContext.reactProductionProfiling!,\n noMangling: NextBuildContext.noMangling!,\n clientRouterFilters: NextBuildContext.clientRouterFilters!,\n previewProps: NextBuildContext.previewProps!,\n allowedRevalidateHeaderKeys: NextBuildContext.allowedRevalidateHeaderKeys!,\n fetchCacheKeyPrefix: NextBuildContext.fetchCacheKeyPrefix!,\n }\n\n const configs = await runWebpackSpan\n .traceChild('generate-webpack-config')\n .traceAsyncFn(async () => {\n const info = await loadProjectInfo({\n dir,\n config: commonWebpackOptions.config,\n dev: false,\n })\n return Promise.all([\n getBaseWebpackConfig(dir, {\n ...commonWebpackOptions,\n middlewareMatchers: entrypoints.middlewareMatchers,\n runWebpackSpan,\n compilerType: COMPILER_NAMES.client,\n entrypoints: entrypoints.client,\n ...info,\n }),\n getBaseWebpackConfig(dir, {\n ...commonWebpackOptions,\n runWebpackSpan,\n middlewareMatchers: entrypoints.middlewareMatchers,\n compilerType: COMPILER_NAMES.server,\n entrypoints: entrypoints.server,\n ...info,\n }),\n getBaseWebpackConfig(dir, {\n ...commonWebpackOptions,\n runWebpackSpan,\n middlewareMatchers: entrypoints.middlewareMatchers,\n compilerType: COMPILER_NAMES.edgeServer,\n entrypoints: entrypoints.edgeServer,\n ...info,\n }),\n ])\n })\n\n const clientConfig = configs[0]\n const serverConfig = configs[1]\n const edgeConfig = configs[2]\n\n if (\n clientConfig.optimization &&\n (clientConfig.optimization.minimize !== true ||\n (clientConfig.optimization.minimizer &&\n clientConfig.optimization.minimizer.length === 0))\n ) {\n Log.warn(\n `Production code optimization has been disabled in your project. Read more: https://nextjs.org/docs/messages/minification-disabled`\n )\n }\n\n webpackBuildStart = process.hrtime()\n\n debug(`starting compiler`, compilerName)\n // We run client and server compilation separately to optimize for memory usage\n await runWebpackSpan.traceAsyncFn(async () => {\n if (config.experimental.webpackMemoryOptimizations) {\n stringBufferUtils.disableDualStringBufferCaching()\n stringBufferUtils.enterStringInterningRange()\n }\n\n // Run the server compilers first and then the client\n // compiler to track the boundary of server/client components.\n let clientResult: SingleCompilerResult | null = null\n\n // During the server compilations, entries of client components will be\n // injected to this set and then will be consumed by the client compiler.\n let serverResult: UnwrapPromise<ReturnType<typeof runCompiler>>[0] | null =\n null\n let edgeServerResult:\n | UnwrapPromise<ReturnType<typeof runCompiler>>[0]\n | null = null\n\n let inputFileSystem: webpack.Compiler['inputFileSystem'] | undefined\n\n if (!compilerName || compilerName === 'server') {\n debug('starting server compiler')\n const start = Date.now()\n ;[serverResult, inputFileSystem] = await runCompiler(serverConfig, {\n runWebpackSpan,\n inputFileSystem,\n })\n debug(`server compiler finished ${Date.now() - start}ms`)\n }\n\n if (!compilerName || compilerName === 'edge-server') {\n debug('starting edge-server compiler')\n const start = Date.now()\n ;[edgeServerResult, inputFileSystem] = edgeConfig\n ? await runCompiler(edgeConfig, { runWebpackSpan, inputFileSystem })\n : [null]\n debug(`edge-server compiler finished ${Date.now() - start}ms`)\n }\n\n // Only continue if there were no errors\n if (!serverResult?.errors.length && !edgeServerResult?.errors.length) {\n const pluginState = getPluginState()\n for (const key in pluginState.injectedClientEntries) {\n const value = pluginState.injectedClientEntries[key]\n const clientEntry = clientConfig.entry as webpack.EntryObject\n if (key === APP_CLIENT_INTERNALS) {\n clientEntry[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP] = {\n import: [\n // TODO-APP: cast clientEntry[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP] to type EntryDescription once it's available from webpack\n // @ts-expect-error clientEntry['main-app'] is type EntryDescription { import: ... }\n ...clientEntry[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP].import,\n value,\n ],\n layer: WEBPACK_LAYERS.appPagesBrowser,\n }\n } else {\n clientEntry[key] = {\n dependOn: [CLIENT_STATIC_FILES_RUNTIME_MAIN_APP],\n import: value,\n layer: WEBPACK_LAYERS.appPagesBrowser,\n }\n }\n }\n\n if (!compilerName || compilerName === 'client') {\n debug('starting client compiler')\n const start = Date.now()\n ;[clientResult, inputFileSystem] = await runCompiler(clientConfig, {\n runWebpackSpan,\n inputFileSystem,\n })\n debug(`client compiler finished ${Date.now() - start}ms`)\n }\n }\n\n if (config.experimental.webpackMemoryOptimizations) {\n stringBufferUtils.exitStringInterningRange()\n }\n inputFileSystem?.purge?.()\n\n result = {\n warnings: [\n ...(clientResult?.warnings ?? []),\n ...(serverResult?.warnings ?? []),\n ...(edgeServerResult?.warnings ?? []),\n ].filter(nonNullable),\n errors: [\n ...(clientResult?.errors ?? []),\n ...(serverResult?.errors ?? []),\n ...(edgeServerResult?.errors ?? []),\n ].filter(nonNullable),\n stats: [\n clientResult?.stats,\n serverResult?.stats,\n edgeServerResult?.stats,\n ],\n }\n })\n result = nextBuildSpan\n .traceChild('format-webpack-messages')\n .traceFn(() => formatWebpackMessages(result, true)) as CompilerResult\n\n const telemetryPlugin = (clientConfig as webpack.Configuration).plugins?.find(\n isTelemetryPlugin\n )\n\n const traceEntryPointsPlugin = (\n serverConfig as webpack.Configuration\n ).plugins?.find(isTraceEntryPointsPlugin)\n\n const webpackBuildEnd = process.hrtime(webpackBuildStart)\n\n if (result.errors.length > 0) {\n // Only keep the first few errors. Others are often indicative\n // of the same problem, but confuse the reader with noise.\n if (result.errors.length > 5) {\n result.errors.length = 5\n }\n let error = result.errors.filter(Boolean).join('\\n\\n')\n\n console.error(red('Failed to compile.\\n'))\n\n if (\n error.indexOf('private-next-pages') > -1 &&\n error.indexOf('does not contain a default export') > -1\n ) {\n const page_name_regex = /'private-next-pages\\/(?<page_name>[^']*)'/\n const parsed = page_name_regex.exec(error)\n const page_name = parsed && parsed.groups && parsed.groups.page_name\n throw new Error(\n `webpack build failed: found page without a React Component as default export in pages/${page_name}\\n\\nSee https://nextjs.org/docs/messages/page-without-valid-component for more info.`\n )\n }\n\n console.error(error)\n console.error()\n\n if (\n error.indexOf('private-next-pages') > -1 ||\n error.indexOf('__next_polyfill__') > -1\n ) {\n const err = new Error(\n 'webpack config.resolve.alias was incorrectly overridden. https://nextjs.org/docs/messages/invalid-resolve-alias'\n ) as NextError\n err.code = 'INVALID_RESOLVE_ALIAS'\n throw err\n }\n const err = new Error(\n `Build failed because of ${process.env.NEXT_RSPACK ? 'Rspack' : 'webpack'} errors`\n ) as NextError\n err.code = 'WEBPACK_ERRORS'\n throw err\n } else {\n const duration = hrtimeToSeconds(webpackBuildEnd)\n const durationString = durationToString(duration)\n\n if (result.warnings.length > 0) {\n Log.warn(`Compiled with warnings in ${durationString}\\n`)\n console.warn(result.warnings.filter(Boolean).join('\\n\\n'))\n console.warn()\n } else if (!compilerName) {\n Log.event(`Compiled successfully in ${durationString}`)\n }\n\n return {\n duration,\n buildTraceContext: traceEntryPointsPlugin?.buildTraceContext,\n pluginState: getPluginState(),\n telemetryState: {\n usages: telemetryPlugin?.usages() || [],\n packagesUsedInServerSideProps:\n telemetryPlugin?.packagesUsedInServerSideProps() || [],\n useCacheTracker: telemetryPlugin?.getUseCacheTracker() || {},\n },\n }\n }\n}\n\n// the main function when this file is run as a worker\nexport async function workerMain(workerData: {\n compilerName: keyof typeof COMPILER_INDEXES\n buildContext: typeof NextBuildContext\n traceState: TraceState\n}): Promise<\n Awaited<ReturnType<typeof webpackBuildImpl>> & {\n debugTraceEvents: TraceEvent[]\n }\n> {\n // Clone the telemetry for worker\n const telemetry = new Telemetry({\n distDir: workerData.buildContext.config!.distDir,\n })\n setGlobal('telemetry', telemetry)\n // setup new build context from the serialized data passed from the parent\n Object.assign(NextBuildContext, workerData.buildContext)\n\n // Initialize tracer state from the parent\n initializeTraceState(workerData.traceState)\n\n // Resume plugin state\n resumePluginState(NextBuildContext.pluginState)\n\n /// load the config because it's not serializable\n NextBuildContext.config = await loadConfig(\n PHASE_PRODUCTION_BUILD,\n NextBuildContext.dir!,\n {\n debugPrerender: NextBuildContext.debugPrerender,\n reactProductionProfiling: NextBuildContext.reactProductionProfiling,\n }\n )\n NextBuildContext.nextBuildSpan = trace(\n `worker-main-${workerData.compilerName}`\n )\n\n const result = await webpackBuildImpl(workerData.compilerName)\n const { entriesTrace, chunksTrace } = result.buildTraceContext ?? {}\n if (entriesTrace) {\n const { entryNameMap, depModArray } = entriesTrace\n if (depModArray) {\n result.buildTraceContext!.entriesTrace!.depModArray = depModArray\n }\n if (entryNameMap) {\n const entryEntries = entryNameMap\n result.buildTraceContext!.entriesTrace!.entryNameMap = entryEntries\n }\n }\n if (chunksTrace?.entryNameFilesMap) {\n const entryNameFilesMap = chunksTrace.entryNameFilesMap\n result.buildTraceContext!.chunksTrace!.entryNameFilesMap = entryNameFilesMap\n }\n NextBuildContext.nextBuildSpan.stop()\n return { ...result, debugTraceEvents: getTraceEvents() }\n}\n"],"names":["stringBufferUtils","red","formatWebpackMessages","nonNullable","COMPILER_NAMES","CLIENT_STATIC_FILES_RUNTIME_MAIN_APP","APP_CLIENT_INTERNALS","PHASE_PRODUCTION_BUILD","runCompiler","Log","getBaseWebpackConfig","loadProjectInfo","TelemetryPlugin","NextBuildContext","resumePluginState","getPluginState","createEntrypoints","loadConfig","getTraceEvents","initializeTraceState","setGlobal","trace","WEBPACK_LAYERS","TraceEntryPointsPlugin","origDebug","Telemetry","durationToString","hrtimeToSeconds","debug","isTelemetryPlugin","plugin","isTraceEntryPointsPlugin","webpackBuildImpl","compilerName","result","warnings","errors","stats","webpackBuildStart","nextBuildSpan","dir","config","process","env","NEXT_COMPILER_NAME","runWebpackSpan","traceChild","entrypoints","traceAsyncFn","buildId","envFiles","loadedEnvFiles","isDev","rootDir","pageExtensions","pagesDir","appDir","pages","mappedPages","appPaths","mappedAppPages","previewMode","previewProps","rootPaths","mappedRootPaths","hasInstrumentationHook","commonWebpackOptions","isServer","isCompileMode","encryptionKey","rewrites","originalRewrites","originalRedirects","reactProductionProfiling","noMangling","clientRouterFilters","allowedRevalidateHeaderKeys","fetchCacheKeyPrefix","configs","info","dev","Promise","all","middlewareMatchers","compilerType","client","server","edgeServer","clientConfig","serverConfig","edgeConfig","optimization","minimize","minimizer","length","warn","hrtime","inputFileSystem","experimental","webpackMemoryOptimizations","disableDualStringBufferCaching","enterStringInterningRange","clientResult","serverResult","edgeServerResult","start","Date","now","pluginState","key","injectedClientEntries","value","clientEntry","entry","import","layer","appPagesBrowser","dependOn","exitStringInterningRange","purge","filter","traceFn","telemetryPlugin","plugins","find","traceEntryPointsPlugin","webpackBuildEnd","error","Boolean","join","console","indexOf","page_name_regex","parsed","exec","page_name","groups","Error","err","code","NEXT_RSPACK","duration","durationString","event","buildTraceContext","telemetryState","usages","packagesUsedInServerSideProps","useCacheTracker","getUseCacheTracker","workerMain","workerData","telemetry","distDir","buildContext","Object","assign","traceState","debugPrerender","entriesTrace","chunksTrace","entryNameMap","depModArray","entryEntries","entryNameFilesMap","stop","debugTraceEvents"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/build/webpack-build/impl.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport { stringBufferUtils } from 'next/dist/compiled/webpack-sources3'\nimport { red } from '../../lib/picocolors'\nimport formatWebpackMessages from '../../shared/lib/format-webpack-messages'\nimport { nonNullable } from '../../lib/non-nullable'\nimport type { COMPILER_INDEXES } from '../../shared/lib/constants'\nimport {\n COMPILER_NAMES,\n CLIENT_STATIC_FILES_RUNTIME_MAIN_APP,\n APP_CLIENT_INTERNALS,\n PHASE_PRODUCTION_BUILD,\n} from '../../shared/lib/constants'\nimport { runCompiler } from '../compiler'\nimport * as Log from '../output/log'\nimport getBaseWebpackConfig, { loadProjectInfo } from '../webpack-config'\nimport type { NextError } from '../../lib/is-error'\nimport {\n TelemetryPlugin,\n type TelemetryPluginState,\n} from '../webpack/plugins/telemetry-plugin/telemetry-plugin'\nimport {\n NextBuildContext,\n resumePluginState,\n getPluginState,\n} from '../build-context'\nimport { createEntrypoints } from '../entries'\nimport loadConfig from '../../server/config'\nimport {\n getTraceEvents,\n initializeTraceState,\n setGlobal,\n trace,\n type TraceEvent,\n type TraceState,\n} from '../../trace'\nimport { WEBPACK_LAYERS } from '../../lib/constants'\nimport { TraceEntryPointsPlugin } from '../webpack/plugins/next-trace-entrypoints-plugin'\nimport type { BuildTraceContext } from '../webpack/plugins/next-trace-entrypoints-plugin'\nimport type { UnwrapPromise } from '../../lib/coalesced-function'\n\nimport origDebug from 'next/dist/compiled/debug'\nimport { Telemetry } from '../../telemetry/storage'\nimport { durationToString, hrtimeToSeconds } from '../duration-to-string'\nimport { installBindings } from '../swc/install-bindings'\n\nconst debug = origDebug('next:build:webpack-build')\n\ntype CompilerResult = {\n errors: webpack.StatsError[]\n warnings: webpack.StatsError[]\n stats: (webpack.Stats | undefined)[]\n}\n\ntype SingleCompilerResult = {\n errors: webpack.StatsError[]\n warnings: webpack.StatsError[]\n stats: webpack.Stats | undefined\n}\n\nfunction isTelemetryPlugin(plugin: unknown): plugin is TelemetryPlugin {\n return plugin instanceof TelemetryPlugin\n}\n\nfunction isTraceEntryPointsPlugin(\n plugin: unknown\n): plugin is TraceEntryPointsPlugin {\n return plugin instanceof TraceEntryPointsPlugin\n}\n\nexport async function webpackBuildImpl(\n compilerName: keyof typeof COMPILER_INDEXES | null\n): Promise<{\n duration: number\n pluginState: any\n buildTraceContext?: BuildTraceContext\n telemetryState?: TelemetryPluginState\n}> {\n let result: CompilerResult | null = {\n warnings: [],\n errors: [],\n stats: [],\n }\n let webpackBuildStart\n const nextBuildSpan = NextBuildContext.nextBuildSpan!\n const dir = NextBuildContext.dir!\n const config = NextBuildContext.config!\n process.env.NEXT_COMPILER_NAME = compilerName || 'server'\n\n const runWebpackSpan = nextBuildSpan.traceChild('run-webpack-compiler')\n const entrypoints = await nextBuildSpan\n .traceChild('create-entrypoints')\n .traceAsyncFn(() =>\n createEntrypoints({\n buildId: NextBuildContext.buildId!,\n config: config,\n envFiles: NextBuildContext.loadedEnvFiles!,\n isDev: false,\n rootDir: dir,\n pageExtensions: config.pageExtensions!,\n pagesDir: NextBuildContext.pagesDir!,\n appDir: NextBuildContext.appDir!,\n pages: NextBuildContext.mappedPages!,\n appPaths: NextBuildContext.mappedAppPages!,\n previewMode: NextBuildContext.previewProps!,\n rootPaths: NextBuildContext.mappedRootPaths!,\n hasInstrumentationHook: NextBuildContext.hasInstrumentationHook!,\n })\n )\n\n const commonWebpackOptions = {\n isServer: false,\n isCompileMode: NextBuildContext.isCompileMode,\n buildId: NextBuildContext.buildId!,\n encryptionKey: NextBuildContext.encryptionKey!,\n config: config,\n appDir: NextBuildContext.appDir!,\n pagesDir: NextBuildContext.pagesDir!,\n rewrites: NextBuildContext.rewrites!,\n originalRewrites: NextBuildContext.originalRewrites,\n originalRedirects: NextBuildContext.originalRedirects,\n reactProductionProfiling: NextBuildContext.reactProductionProfiling!,\n noMangling: NextBuildContext.noMangling!,\n clientRouterFilters: NextBuildContext.clientRouterFilters!,\n previewProps: NextBuildContext.previewProps!,\n allowedRevalidateHeaderKeys: NextBuildContext.allowedRevalidateHeaderKeys!,\n fetchCacheKeyPrefix: NextBuildContext.fetchCacheKeyPrefix!,\n }\n\n const configs = await runWebpackSpan\n .traceChild('generate-webpack-config')\n .traceAsyncFn(async () => {\n const info = await loadProjectInfo({\n dir,\n config: commonWebpackOptions.config,\n dev: false,\n })\n return Promise.all([\n getBaseWebpackConfig(dir, {\n ...commonWebpackOptions,\n middlewareMatchers: entrypoints.middlewareMatchers,\n runWebpackSpan,\n compilerType: COMPILER_NAMES.client,\n entrypoints: entrypoints.client,\n ...info,\n }),\n getBaseWebpackConfig(dir, {\n ...commonWebpackOptions,\n runWebpackSpan,\n middlewareMatchers: entrypoints.middlewareMatchers,\n compilerType: COMPILER_NAMES.server,\n entrypoints: entrypoints.server,\n ...info,\n }),\n getBaseWebpackConfig(dir, {\n ...commonWebpackOptions,\n runWebpackSpan,\n middlewareMatchers: entrypoints.middlewareMatchers,\n compilerType: COMPILER_NAMES.edgeServer,\n entrypoints: entrypoints.edgeServer,\n ...info,\n }),\n ])\n })\n\n const clientConfig = configs[0]\n const serverConfig = configs[1]\n const edgeConfig = configs[2]\n\n if (\n clientConfig.optimization &&\n (clientConfig.optimization.minimize !== true ||\n (clientConfig.optimization.minimizer &&\n clientConfig.optimization.minimizer.length === 0))\n ) {\n Log.warn(\n `Production code optimization has been disabled in your project. Read more: https://nextjs.org/docs/messages/minification-disabled`\n )\n }\n\n webpackBuildStart = process.hrtime()\n\n debug(`starting compiler`, compilerName)\n // We run client and server compilation separately to optimize for memory usage\n await runWebpackSpan.traceAsyncFn(async () => {\n if (config.experimental.webpackMemoryOptimizations) {\n stringBufferUtils.disableDualStringBufferCaching()\n stringBufferUtils.enterStringInterningRange()\n }\n\n // Run the server compilers first and then the client\n // compiler to track the boundary of server/client components.\n let clientResult: SingleCompilerResult | null = null\n\n // During the server compilations, entries of client components will be\n // injected to this set and then will be consumed by the client compiler.\n let serverResult: UnwrapPromise<ReturnType<typeof runCompiler>>[0] | null =\n null\n let edgeServerResult:\n | UnwrapPromise<ReturnType<typeof runCompiler>>[0]\n | null = null\n\n let inputFileSystem: webpack.Compiler['inputFileSystem'] | undefined\n\n if (!compilerName || compilerName === 'server') {\n debug('starting server compiler')\n const start = Date.now()\n ;[serverResult, inputFileSystem] = await runCompiler(serverConfig, {\n runWebpackSpan,\n inputFileSystem,\n })\n debug(`server compiler finished ${Date.now() - start}ms`)\n }\n\n if (!compilerName || compilerName === 'edge-server') {\n debug('starting edge-server compiler')\n const start = Date.now()\n ;[edgeServerResult, inputFileSystem] = edgeConfig\n ? await runCompiler(edgeConfig, { runWebpackSpan, inputFileSystem })\n : [null]\n debug(`edge-server compiler finished ${Date.now() - start}ms`)\n }\n\n // Only continue if there were no errors\n if (!serverResult?.errors.length && !edgeServerResult?.errors.length) {\n const pluginState = getPluginState()\n for (const key in pluginState.injectedClientEntries) {\n const value = pluginState.injectedClientEntries[key]\n const clientEntry = clientConfig.entry as webpack.EntryObject\n if (key === APP_CLIENT_INTERNALS) {\n clientEntry[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP] = {\n import: [\n // TODO-APP: cast clientEntry[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP] to type EntryDescription once it's available from webpack\n // @ts-expect-error clientEntry['main-app'] is type EntryDescription { import: ... }\n ...clientEntry[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP].import,\n value,\n ],\n layer: WEBPACK_LAYERS.appPagesBrowser,\n }\n } else {\n clientEntry[key] = {\n dependOn: [CLIENT_STATIC_FILES_RUNTIME_MAIN_APP],\n import: value,\n layer: WEBPACK_LAYERS.appPagesBrowser,\n }\n }\n }\n\n if (!compilerName || compilerName === 'client') {\n debug('starting client compiler')\n const start = Date.now()\n ;[clientResult, inputFileSystem] = await runCompiler(clientConfig, {\n runWebpackSpan,\n inputFileSystem,\n })\n debug(`client compiler finished ${Date.now() - start}ms`)\n }\n }\n\n if (config.experimental.webpackMemoryOptimizations) {\n stringBufferUtils.exitStringInterningRange()\n }\n inputFileSystem?.purge?.()\n\n result = {\n warnings: [\n ...(clientResult?.warnings ?? []),\n ...(serverResult?.warnings ?? []),\n ...(edgeServerResult?.warnings ?? []),\n ].filter(nonNullable),\n errors: [\n ...(clientResult?.errors ?? []),\n ...(serverResult?.errors ?? []),\n ...(edgeServerResult?.errors ?? []),\n ].filter(nonNullable),\n stats: [\n clientResult?.stats,\n serverResult?.stats,\n edgeServerResult?.stats,\n ],\n }\n })\n result = nextBuildSpan\n .traceChild('format-webpack-messages')\n .traceFn(() => formatWebpackMessages(result, true)) as CompilerResult\n\n const telemetryPlugin = (clientConfig as webpack.Configuration).plugins?.find(\n isTelemetryPlugin\n )\n\n const traceEntryPointsPlugin = (\n serverConfig as webpack.Configuration\n ).plugins?.find(isTraceEntryPointsPlugin)\n\n const webpackBuildEnd = process.hrtime(webpackBuildStart)\n\n if (result.errors.length > 0) {\n // Only keep the first few errors. Others are often indicative\n // of the same problem, but confuse the reader with noise.\n if (result.errors.length > 5) {\n result.errors.length = 5\n }\n let error = result.errors.filter(Boolean).join('\\n\\n')\n\n console.error(red('Failed to compile.\\n'))\n\n if (\n error.indexOf('private-next-pages') > -1 &&\n error.indexOf('does not contain a default export') > -1\n ) {\n const page_name_regex = /'private-next-pages\\/(?<page_name>[^']*)'/\n const parsed = page_name_regex.exec(error)\n const page_name = parsed && parsed.groups && parsed.groups.page_name\n throw new Error(\n `webpack build failed: found page without a React Component as default export in pages/${page_name}\\n\\nSee https://nextjs.org/docs/messages/page-without-valid-component for more info.`\n )\n }\n\n console.error(error)\n console.error()\n\n if (\n error.indexOf('private-next-pages') > -1 ||\n error.indexOf('__next_polyfill__') > -1\n ) {\n const err = new Error(\n 'webpack config.resolve.alias was incorrectly overridden. https://nextjs.org/docs/messages/invalid-resolve-alias'\n ) as NextError\n err.code = 'INVALID_RESOLVE_ALIAS'\n throw err\n }\n const err = new Error(\n `Build failed because of ${process.env.NEXT_RSPACK ? 'Rspack' : 'webpack'} errors`\n ) as NextError\n err.code = 'WEBPACK_ERRORS'\n throw err\n } else {\n const duration = hrtimeToSeconds(webpackBuildEnd)\n const durationString = durationToString(duration)\n\n if (result.warnings.length > 0) {\n Log.warn(`Compiled with warnings in ${durationString}\\n`)\n console.warn(result.warnings.filter(Boolean).join('\\n\\n'))\n console.warn()\n } else if (!compilerName) {\n Log.event(`Compiled successfully in ${durationString}`)\n }\n\n return {\n duration,\n buildTraceContext: traceEntryPointsPlugin?.buildTraceContext,\n pluginState: getPluginState(),\n telemetryState: {\n usages: telemetryPlugin?.usages() || [],\n packagesUsedInServerSideProps:\n telemetryPlugin?.packagesUsedInServerSideProps() || [],\n useCacheTracker: telemetryPlugin?.getUseCacheTracker() || {},\n },\n }\n }\n}\n\n// the main function when this file is run as a worker\nexport async function workerMain(workerData: {\n compilerName: keyof typeof COMPILER_INDEXES\n buildContext: typeof NextBuildContext\n traceState: TraceState\n}): Promise<\n Awaited<ReturnType<typeof webpackBuildImpl>> & {\n debugTraceEvents: TraceEvent[]\n }\n> {\n // Clone the telemetry for worker\n const telemetry = new Telemetry({\n distDir: workerData.buildContext.config!.distDir,\n })\n setGlobal('telemetry', telemetry)\n // setup new build context from the serialized data passed from the parent\n Object.assign(NextBuildContext, workerData.buildContext)\n\n // Initialize tracer state from the parent\n initializeTraceState(workerData.traceState)\n\n // Resume plugin state\n resumePluginState(NextBuildContext.pluginState)\n\n /// load the config because it's not serializable\n const config = (NextBuildContext.config = await loadConfig(\n PHASE_PRODUCTION_BUILD,\n NextBuildContext.dir!,\n {\n debugPrerender: NextBuildContext.debugPrerender,\n reactProductionProfiling: NextBuildContext.reactProductionProfiling,\n }\n ))\n await installBindings(config.experimental?.useWasmBinary)\n NextBuildContext.nextBuildSpan = trace(\n `worker-main-${workerData.compilerName}`\n )\n\n const result = await webpackBuildImpl(workerData.compilerName)\n const { entriesTrace, chunksTrace } = result.buildTraceContext ?? {}\n if (entriesTrace) {\n const { entryNameMap, depModArray } = entriesTrace\n if (depModArray) {\n result.buildTraceContext!.entriesTrace!.depModArray = depModArray\n }\n if (entryNameMap) {\n const entryEntries = entryNameMap\n result.buildTraceContext!.entriesTrace!.entryNameMap = entryEntries\n }\n }\n if (chunksTrace?.entryNameFilesMap) {\n const entryNameFilesMap = chunksTrace.entryNameFilesMap\n result.buildTraceContext!.chunksTrace!.entryNameFilesMap = entryNameFilesMap\n }\n NextBuildContext.nextBuildSpan.stop()\n return { ...result, debugTraceEvents: getTraceEvents() }\n}\n"],"names":["stringBufferUtils","red","formatWebpackMessages","nonNullable","COMPILER_NAMES","CLIENT_STATIC_FILES_RUNTIME_MAIN_APP","APP_CLIENT_INTERNALS","PHASE_PRODUCTION_BUILD","runCompiler","Log","getBaseWebpackConfig","loadProjectInfo","TelemetryPlugin","NextBuildContext","resumePluginState","getPluginState","createEntrypoints","loadConfig","getTraceEvents","initializeTraceState","setGlobal","trace","WEBPACK_LAYERS","TraceEntryPointsPlugin","origDebug","Telemetry","durationToString","hrtimeToSeconds","installBindings","debug","isTelemetryPlugin","plugin","isTraceEntryPointsPlugin","webpackBuildImpl","compilerName","result","warnings","errors","stats","webpackBuildStart","nextBuildSpan","dir","config","process","env","NEXT_COMPILER_NAME","runWebpackSpan","traceChild","entrypoints","traceAsyncFn","buildId","envFiles","loadedEnvFiles","isDev","rootDir","pageExtensions","pagesDir","appDir","pages","mappedPages","appPaths","mappedAppPages","previewMode","previewProps","rootPaths","mappedRootPaths","hasInstrumentationHook","commonWebpackOptions","isServer","isCompileMode","encryptionKey","rewrites","originalRewrites","originalRedirects","reactProductionProfiling","noMangling","clientRouterFilters","allowedRevalidateHeaderKeys","fetchCacheKeyPrefix","configs","info","dev","Promise","all","middlewareMatchers","compilerType","client","server","edgeServer","clientConfig","serverConfig","edgeConfig","optimization","minimize","minimizer","length","warn","hrtime","inputFileSystem","experimental","webpackMemoryOptimizations","disableDualStringBufferCaching","enterStringInterningRange","clientResult","serverResult","edgeServerResult","start","Date","now","pluginState","key","injectedClientEntries","value","clientEntry","entry","import","layer","appPagesBrowser","dependOn","exitStringInterningRange","purge","filter","traceFn","telemetryPlugin","plugins","find","traceEntryPointsPlugin","webpackBuildEnd","error","Boolean","join","console","indexOf","page_name_regex","parsed","exec","page_name","groups","Error","err","code","NEXT_RSPACK","duration","durationString","event","buildTraceContext","telemetryState","usages","packagesUsedInServerSideProps","useCacheTracker","getUseCacheTracker","workerMain","workerData","telemetry","distDir","buildContext","Object","assign","traceState","debugPrerender","useWasmBinary","entriesTrace","chunksTrace","entryNameMap","depModArray","entryEntries","entryNameFilesMap","stop","debugTraceEvents"],"mappings":"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","ignoreList":[0]}
|
|
@@ -28,7 +28,6 @@ import { FlightClientEntryPlugin as NextFlightClientEntryPlugin } from './webpac
|
|
|
28
28
|
import { RspackFlightClientEntryPlugin } from './webpack/plugins/rspack-flight-client-entry-plugin';
|
|
29
29
|
import { NextTypesPlugin } from './webpack/plugins/next-types-plugin';
|
|
30
30
|
import loadJsConfig from './load-jsconfig';
|
|
31
|
-
import { loadBindings } from './swc';
|
|
32
31
|
import { SubresourceIntegrityPlugin } from './webpack/plugins/subresource-integrity-plugin';
|
|
33
32
|
import { NextFontManifestPlugin } from './webpack/plugins/next-font-manifest-plugin';
|
|
34
33
|
import { getSupportedBrowsers } from './utils';
|
|
@@ -241,10 +240,6 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
|
|
|
241
240
|
Log.info(`Disabled SWC as replacement for Babel because of custom Babel configuration "${path.relative(dir, babelConfigFile)}" https://nextjs.org/docs/messages/swc-disabled`);
|
|
242
241
|
loggedSwcDisabled = true;
|
|
243
242
|
}
|
|
244
|
-
// eagerly load swc bindings instead of waiting for transform calls
|
|
245
|
-
if (!babelConfigFile && isClient) {
|
|
246
|
-
await loadBindings(config.experimental.useWasmBinary);
|
|
247
|
-
}
|
|
248
243
|
// since `pages` doesn't always bundle by default we need to
|
|
249
244
|
// auto-include optimizePackageImports in transpilePackages
|
|
250
245
|
const finalTranspilePackages = (config.transpilePackages || []).concat(DEFAULT_TRANSPILED_PACKAGES);
|
|
@@ -1625,7 +1620,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
|
|
|
1625
1620
|
isClient && new CopyFilePlugin({
|
|
1626
1621
|
// file path to build output of `@next/polyfill-nomodule`
|
|
1627
1622
|
filePath: require.resolve('./polyfills/polyfill-nomodule'),
|
|
1628
|
-
cacheKey: "16.0.2-canary.
|
|
1623
|
+
cacheKey: "16.0.2-canary.12",
|
|
1629
1624
|
name: `static/chunks/polyfills${dev ? '' : '-[hash]'}.js`,
|
|
1630
1625
|
minimize: false,
|
|
1631
1626
|
info: {
|
|
@@ -1811,7 +1806,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
|
|
|
1811
1806
|
// - Next.js location on disk (some loaders use absolute paths and some resolve options depend on absolute paths)
|
|
1812
1807
|
// - Next.js version
|
|
1813
1808
|
// - next.config.js keys that affect compilation
|
|
1814
|
-
version: `${__dirname}|${"16.0.2-canary.
|
|
1809
|
+
version: `${__dirname}|${"16.0.2-canary.12"}|${configVars}`,
|
|
1815
1810
|
cacheDirectory: path.join(distDir, 'cache', 'webpack'),
|
|
1816
1811
|
// For production builds, it's more efficient to compress all cache files together instead of compression each one individually.
|
|
1817
1812
|
// So we disable compression here and allow the build runner to take care of compressing the cache as a whole.
|