Recipe-app main
This commit is contained in:
Generated
Vendored
+31
@@ -0,0 +1,31 @@
|
||||
const ERROR_MESSAGE = 'Internal Error: do not use legacy react-dom/server APIs. If you encountered this error, please open an issue on the Next.js repo.';
|
||||
function error() {
|
||||
throw Object.defineProperty(new Error(ERROR_MESSAGE), "__NEXT_ERROR_CODE", {
|
||||
value: "E1021",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
var b;
|
||||
if (process.env.NEXT_RUNTIME === 'nodejs') {
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.node.production.js');
|
||||
} else {
|
||||
b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.node.development.js');
|
||||
}
|
||||
} else {
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.edge.production.js');
|
||||
} else {
|
||||
b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.edge.development.js');
|
||||
}
|
||||
}
|
||||
exports.version = b.version;
|
||||
exports.renderToReadableStream = b.renderToReadableStream;
|
||||
exports.renderToString = error;
|
||||
exports.renderToStaticMarkup = error;
|
||||
if (b.resume) {
|
||||
exports.resume = b.resume;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=react-dom-server-experimental.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/alias/react-dom-server-experimental.js"],"sourcesContent":["const ERROR_MESSAGE =\n 'Internal Error: do not use legacy react-dom/server APIs. If you encountered this error, please open an issue on the Next.js repo.'\n\nfunction error() {\n throw new Error(ERROR_MESSAGE)\n}\n\nvar b\nif (process.env.NEXT_RUNTIME === 'nodejs') {\n if (process.env.NODE_ENV === 'production') {\n b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.node.production.js')\n } else {\n b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.node.development.js')\n }\n} else {\n if (process.env.NODE_ENV === 'production') {\n b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.edge.production.js')\n } else {\n b = require('next/dist/compiled/react-dom-experimental/cjs/react-dom-server.edge.development.js')\n }\n}\n\nexports.version = b.version\nexports.renderToReadableStream = b.renderToReadableStream\nexports.renderToString = error\nexports.renderToStaticMarkup = error\nif (b.resume) {\n exports.resume = b.resume\n}\n"],"names":["ERROR_MESSAGE","error","Error","b","process","env","NEXT_RUNTIME","NODE_ENV","require","exports","version","renderToReadableStream","renderToString","renderToStaticMarkup","resume"],"mappings":"AAAA,MAAMA,gBACJ;AAEF,SAASC;IACP,MAAM,qBAAwB,CAAxB,IAAIC,MAAMF,gBAAV,qBAAA;eAAA;oBAAA;sBAAA;IAAuB;AAC/B;AAEA,IAAIG;AACJ,IAAIC,QAAQC,GAAG,CAACC,YAAY,KAAK,UAAU;IACzC,IAAIF,QAAQC,GAAG,CAACE,QAAQ,KAAK,cAAc;QACzCJ,IAAIK,QAAQ;IACd,OAAO;QACLL,IAAIK,QAAQ;IACd;AACF,OAAO;IACL,IAAIJ,QAAQC,GAAG,CAACE,QAAQ,KAAK,cAAc;QACzCJ,IAAIK,QAAQ;IACd,OAAO;QACLL,IAAIK,QAAQ;IACd;AACF;AAEAC,QAAQC,OAAO,GAAGP,EAAEO,OAAO;AAC3BD,QAAQE,sBAAsB,GAAGR,EAAEQ,sBAAsB;AACzDF,QAAQG,cAAc,GAAGX;AACzBQ,QAAQI,oBAAoB,GAAGZ;AAC/B,IAAIE,EAAEW,MAAM,EAAE;IACZL,QAAQK,MAAM,GAAGX,EAAEW,MAAM;AAC3B","ignoreList":[0]}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
const ERROR_MESSAGE = 'Internal Error: do not use legacy react-dom/server APIs. If you encountered this error, please open an issue on the Next.js repo.';
|
||||
function error() {
|
||||
throw Object.defineProperty(new Error(ERROR_MESSAGE), "__NEXT_ERROR_CODE", {
|
||||
value: "E1021",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
var b;
|
||||
if (process.env.NEXT_RUNTIME === 'nodejs') {
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
b = require('next/dist/compiled/react-dom/cjs/react-dom-server.node.production.js');
|
||||
} else {
|
||||
b = require('next/dist/compiled/react-dom/cjs/react-dom-server.node.development.js');
|
||||
}
|
||||
} else {
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
b = require('next/dist/compiled/react-dom/cjs/react-dom-server.edge.production.js');
|
||||
} else {
|
||||
b = require('next/dist/compiled/react-dom/cjs/react-dom-server.edge.development.js');
|
||||
}
|
||||
}
|
||||
exports.version = b.version;
|
||||
exports.renderToReadableStream = b.renderToReadableStream;
|
||||
exports.renderToString = error;
|
||||
exports.renderToStaticMarkup = error;
|
||||
if (b.resume) {
|
||||
exports.resume = b.resume;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=react-dom-server.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/alias/react-dom-server.js"],"sourcesContent":["const ERROR_MESSAGE =\n 'Internal Error: do not use legacy react-dom/server APIs. If you encountered this error, please open an issue on the Next.js repo.'\n\nfunction error() {\n throw new Error(ERROR_MESSAGE)\n}\n\nvar b\nif (process.env.NEXT_RUNTIME === 'nodejs') {\n if (process.env.NODE_ENV === 'production') {\n b = require('next/dist/compiled/react-dom/cjs/react-dom-server.node.production.js')\n } else {\n b = require('next/dist/compiled/react-dom/cjs/react-dom-server.node.development.js')\n }\n} else {\n if (process.env.NODE_ENV === 'production') {\n b = require('next/dist/compiled/react-dom/cjs/react-dom-server.edge.production.js')\n } else {\n b = require('next/dist/compiled/react-dom/cjs/react-dom-server.edge.development.js')\n }\n}\n\nexports.version = b.version\nexports.renderToReadableStream = b.renderToReadableStream\nexports.renderToString = error\nexports.renderToStaticMarkup = error\nif (b.resume) {\n exports.resume = b.resume\n}\n"],"names":["ERROR_MESSAGE","error","Error","b","process","env","NEXT_RUNTIME","NODE_ENV","require","exports","version","renderToReadableStream","renderToString","renderToStaticMarkup","resume"],"mappings":"AAAA,MAAMA,gBACJ;AAEF,SAASC;IACP,MAAM,qBAAwB,CAAxB,IAAIC,MAAMF,gBAAV,qBAAA;eAAA;oBAAA;sBAAA;IAAuB;AAC/B;AAEA,IAAIG;AACJ,IAAIC,QAAQC,GAAG,CAACC,YAAY,KAAK,UAAU;IACzC,IAAIF,QAAQC,GAAG,CAACE,QAAQ,KAAK,cAAc;QACzCJ,IAAIK,QAAQ;IACd,OAAO;QACLL,IAAIK,QAAQ;IACd;AACF,OAAO;IACL,IAAIJ,QAAQC,GAAG,CAACE,QAAQ,KAAK,cAAc;QACzCJ,IAAIK,QAAQ;IACd,OAAO;QACLL,IAAIK,QAAQ;IACd;AACF;AAEAC,QAAQC,OAAO,GAAGP,EAAEO,OAAO;AAC3BD,QAAQE,sBAAsB,GAAGR,EAAEQ,sBAAsB;AACzDF,QAAQG,cAAc,GAAGX;AACzBQ,QAAQI,oBAAoB,GAAGZ;AAC/B,IAAIE,EAAEW,MAAM,EAAE;IACZL,QAAQK,MAAM,GAAGX,EAAEW,MAAM;AAC3B","ignoreList":[0]}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
import fs from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
const INVALIDATION_MARKER = '__nextjs_invalidated_cache';
|
||||
/**
|
||||
* Atomically write an invalidation marker.
|
||||
*
|
||||
* Because attempting to delete currently open cache files could cause issues,
|
||||
* actual deletion of files is deferred until the next start-up (in
|
||||
* `checkFileSystemCacheInvalidationAndCleanup`).
|
||||
*
|
||||
* In the case that no database is currently open (e.g. via a separate CLI
|
||||
* subcommand), you should call `cleanupFileSystemCache` *after* this to eagerly
|
||||
* remove the cache files.
|
||||
*/ export async function invalidateFileSystemCache(cacheDirectory) {
|
||||
let file;
|
||||
try {
|
||||
// We're just opening it so that `open()` creates the file.
|
||||
file = await fs.open(path.join(cacheDirectory, INVALIDATION_MARKER), 'w');
|
||||
// We don't currently write anything to the file, but we could choose to
|
||||
// later, e.g. a reason for the invalidation.
|
||||
} catch (err) {
|
||||
// it's valid for the cache to not exist at all
|
||||
if (err.code !== 'ENOENT') {
|
||||
throw err;
|
||||
}
|
||||
} finally{
|
||||
file == null ? void 0 : file.close();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Called during startup. See if the cache is in a partially-completed
|
||||
* invalidation state. Finds and delete any invalidated cache files.
|
||||
*/ export async function checkFileSystemCacheInvalidationAndCleanup(cacheDirectory) {
|
||||
const invalidated = await fs.access(path.join(cacheDirectory, INVALIDATION_MARKER)).then(()=>true, ()=>false);
|
||||
if (invalidated) {
|
||||
await cleanupFileSystemCache(cacheDirectory);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Helper for `checkFileSystemCacheInvalidationAndCleanup`. You can call this to
|
||||
* explicitly clean up a database after running `invalidateFileSystemCache` when
|
||||
* webpack is not running.
|
||||
*
|
||||
* You should not run this if the cache has not yet been invalidated, as this
|
||||
* operation is not atomic and could result in a partially-deleted and corrupted
|
||||
* database.
|
||||
*/ async function cleanupFileSystemCache(cacheDirectory) {
|
||||
try {
|
||||
await cleanupFileSystemCacheInner(cacheDirectory);
|
||||
} catch (e) {
|
||||
// generate a user-friendly error message
|
||||
throw Object.defineProperty(new Error(`Unable to remove an invalidated webpack cache. If this issue persists ` + `you can work around it by deleting ${cacheDirectory}`, {
|
||||
cause: e
|
||||
}), "__NEXT_ERROR_CODE", {
|
||||
value: "E710",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
async function cleanupFileSystemCacheInner(cacheDirectory) {
|
||||
const files = await fs.readdir(cacheDirectory);
|
||||
// delete everything except the invalidation marker
|
||||
await Promise.all(files.map((name)=>name !== INVALIDATION_MARKER ? fs.rm(path.join(cacheDirectory, name), {
|
||||
force: true,
|
||||
recursive: true,
|
||||
maxRetries: 2
|
||||
}) : null));
|
||||
// delete the invalidation marker last, once we're sure everything is cleaned
|
||||
// up
|
||||
await fs.rm(path.join(cacheDirectory, INVALIDATION_MARKER), {
|
||||
force: true,
|
||||
maxRetries: 2
|
||||
});
|
||||
}
|
||||
|
||||
//# sourceMappingURL=cache-invalidation.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../src/build/webpack/cache-invalidation.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nconst INVALIDATION_MARKER = '__nextjs_invalidated_cache'\n\n/**\n * Atomically write an invalidation marker.\n *\n * Because attempting to delete currently open cache files could cause issues,\n * actual deletion of files is deferred until the next start-up (in\n * `checkFileSystemCacheInvalidationAndCleanup`).\n *\n * In the case that no database is currently open (e.g. via a separate CLI\n * subcommand), you should call `cleanupFileSystemCache` *after* this to eagerly\n * remove the cache files.\n */\nexport async function invalidateFileSystemCache(cacheDirectory: string) {\n let file\n try {\n // We're just opening it so that `open()` creates the file.\n file = await fs.open(path.join(cacheDirectory, INVALIDATION_MARKER), 'w')\n // We don't currently write anything to the file, but we could choose to\n // later, e.g. a reason for the invalidation.\n } catch (err: any) {\n // it's valid for the cache to not exist at all\n if (err.code !== 'ENOENT') {\n throw err\n }\n } finally {\n file?.close()\n }\n}\n\n/**\n * Called during startup. See if the cache is in a partially-completed\n * invalidation state. Finds and delete any invalidated cache files.\n */\nexport async function checkFileSystemCacheInvalidationAndCleanup(\n cacheDirectory: string\n) {\n const invalidated = await fs\n .access(path.join(cacheDirectory, INVALIDATION_MARKER))\n .then(\n () => true,\n () => false\n )\n if (invalidated) {\n await cleanupFileSystemCache(cacheDirectory)\n }\n}\n\n/**\n * Helper for `checkFileSystemCacheInvalidationAndCleanup`. You can call this to\n * explicitly clean up a database after running `invalidateFileSystemCache` when\n * webpack is not running.\n *\n * You should not run this if the cache has not yet been invalidated, as this\n * operation is not atomic and could result in a partially-deleted and corrupted\n * database.\n */\nasync function cleanupFileSystemCache(cacheDirectory: string) {\n try {\n await cleanupFileSystemCacheInner(cacheDirectory)\n } catch (e) {\n // generate a user-friendly error message\n throw new Error(\n `Unable to remove an invalidated webpack cache. If this issue persists ` +\n `you can work around it by deleting ${cacheDirectory}`,\n { cause: e }\n )\n }\n}\n\nasync function cleanupFileSystemCacheInner(cacheDirectory: string) {\n const files = await fs.readdir(cacheDirectory)\n\n // delete everything except the invalidation marker\n await Promise.all(\n files.map((name) =>\n name !== INVALIDATION_MARKER\n ? fs.rm(path.join(cacheDirectory, name), {\n force: true, // ignore errors if path does not exist\n recursive: true,\n maxRetries: 2, // windows prevents deletion of open files\n })\n : null\n )\n )\n\n // delete the invalidation marker last, once we're sure everything is cleaned\n // up\n await fs.rm(path.join(cacheDirectory, INVALIDATION_MARKER), {\n force: true,\n maxRetries: 2,\n })\n}\n"],"names":["fs","path","INVALIDATION_MARKER","invalidateFileSystemCache","cacheDirectory","file","open","join","err","code","close","checkFileSystemCacheInvalidationAndCleanup","invalidated","access","then","cleanupFileSystemCache","cleanupFileSystemCacheInner","e","Error","cause","files","readdir","Promise","all","map","name","rm","force","recursive","maxRetries"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,MAAMC,sBAAsB;AAE5B;;;;;;;;;;CAUC,GACD,OAAO,eAAeC,0BAA0BC,cAAsB;IACpE,IAAIC;IACJ,IAAI;QACF,2DAA2D;QAC3DA,OAAO,MAAML,GAAGM,IAAI,CAACL,KAAKM,IAAI,CAACH,gBAAgBF,sBAAsB;IACrE,wEAAwE;IACxE,6CAA6C;IAC/C,EAAE,OAAOM,KAAU;QACjB,+CAA+C;QAC/C,IAAIA,IAAIC,IAAI,KAAK,UAAU;YACzB,MAAMD;QACR;IACF,SAAU;QACRH,wBAAAA,KAAMK,KAAK;IACb;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeC,2CACpBP,cAAsB;IAEtB,MAAMQ,cAAc,MAAMZ,GACvBa,MAAM,CAACZ,KAAKM,IAAI,CAACH,gBAAgBF,sBACjCY,IAAI,CACH,IAAM,MACN,IAAM;IAEV,IAAIF,aAAa;QACf,MAAMG,uBAAuBX;IAC/B;AACF;AAEA;;;;;;;;CAQC,GACD,eAAeW,uBAAuBX,cAAsB;IAC1D,IAAI;QACF,MAAMY,4BAA4BZ;IACpC,EAAE,OAAOa,GAAG;QACV,yCAAyC;QACzC,MAAM,qBAIL,CAJK,IAAIC,MACR,CAAC,sEAAsE,CAAC,GACtE,CAAC,mCAAmC,EAAEd,gBAAgB,EACxD;YAAEe,OAAOF;QAAE,IAHP,qBAAA;mBAAA;wBAAA;0BAAA;QAIN;IACF;AACF;AAEA,eAAeD,4BAA4BZ,cAAsB;IAC/D,MAAMgB,QAAQ,MAAMpB,GAAGqB,OAAO,CAACjB;IAE/B,mDAAmD;IACnD,MAAMkB,QAAQC,GAAG,CACfH,MAAMI,GAAG,CAAC,CAACC,OACTA,SAASvB,sBACLF,GAAG0B,EAAE,CAACzB,KAAKM,IAAI,CAACH,gBAAgBqB,OAAO;YACrCE,OAAO;YACPC,WAAW;YACXC,YAAY;QACd,KACA;IAIR,6EAA6E;IAC7E,KAAK;IACL,MAAM7B,GAAG0B,EAAE,CAACzB,KAAKM,IAAI,CAACH,gBAAgBF,sBAAsB;QAC1DyB,OAAO;QACPE,YAAY;IACd;AACF","ignoreList":[0]}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
import curry from 'next/dist/compiled/lodash.curry';
|
||||
import { COMPILER_NAMES } from '../../../../shared/lib/constants';
|
||||
import DevToolsIgnorePlugin from '../../plugins/devtools-ignore-list-plugin';
|
||||
import EvalSourceMapDevToolPlugin from '../../plugins/eval-source-map-dev-tool-plugin';
|
||||
import { getRspackCore } from '../../../../shared/lib/get-rspack';
|
||||
function shouldIgnorePath(modulePath) {
|
||||
return modulePath.includes('node_modules') || modulePath.endsWith('__nextjs-internal-proxy.cjs') || modulePath.endsWith('__nextjs-internal-proxy.mjs') || // Only relevant for when Next.js is symlinked e.g. in the Next.js monorepo
|
||||
modulePath.includes('next/dist');
|
||||
}
|
||||
export const base = curry(function base(ctx, config) {
|
||||
config.mode = ctx.isDevelopment ? 'development' : 'production';
|
||||
config.name = ctx.isServer ? ctx.isEdgeRuntime ? COMPILER_NAMES.edgeServer : COMPILER_NAMES.server : COMPILER_NAMES.client;
|
||||
config.target = !ctx.targetWeb ? 'node18.17' // Same version defined in packages/next/package.json#engines
|
||||
: ctx.isEdgeRuntime ? [
|
||||
'web',
|
||||
'es6'
|
||||
] : [
|
||||
'web',
|
||||
'es6'
|
||||
];
|
||||
// https://webpack.js.org/configuration/devtool/#development
|
||||
if (ctx.isDevelopment) {
|
||||
// `eval-source-map` provides full-fidelity source maps for the
|
||||
// original source, including columns and original variable names.
|
||||
// This is desirable so the in-browser debugger can correctly pause
|
||||
// and show scoped variables with their original names.
|
||||
config.devtool = 'eval-source-map';
|
||||
} else {
|
||||
if (ctx.isEdgeRuntime || ctx.isServer && ctx.serverSourceMaps || // Enable browser sourcemaps:
|
||||
ctx.productionBrowserSourceMaps && ctx.isClient) {
|
||||
config.devtool = 'source-map';
|
||||
} else {
|
||||
config.devtool = false;
|
||||
}
|
||||
}
|
||||
if (!config.module) {
|
||||
config.module = {
|
||||
rules: []
|
||||
};
|
||||
}
|
||||
config.plugins ??= [];
|
||||
if (config.devtool === 'source-map' && !process.env.NEXT_RSPACK) {
|
||||
config.plugins.push(new DevToolsIgnorePlugin({
|
||||
shouldIgnorePath
|
||||
}));
|
||||
} else if (config.devtool === 'eval-source-map') {
|
||||
// We're using a fork of `eval-source-map`
|
||||
config.devtool = false;
|
||||
if (process.env.NEXT_RSPACK) {
|
||||
var _config_output;
|
||||
config.plugins.push(new (getRspackCore()).EvalSourceMapDevToolPlugin({
|
||||
moduleFilenameTemplate: (_config_output = config.output) == null ? void 0 : _config_output.devtoolModuleFilenameTemplate
|
||||
}));
|
||||
} else {
|
||||
var _config_output1;
|
||||
config.plugins.push(new EvalSourceMapDevToolPlugin({
|
||||
moduleFilenameTemplate: (_config_output1 = config.output) == null ? void 0 : _config_output1.devtoolModuleFilenameTemplate,
|
||||
shouldIgnorePath
|
||||
}));
|
||||
}
|
||||
}
|
||||
// TODO: add codemod for "Should not import the named export" with JSON files
|
||||
// config.module.strictExportPresence = !isWebpack5
|
||||
return config;
|
||||
});
|
||||
|
||||
//# sourceMappingURL=base.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
+543
@@ -0,0 +1,543 @@
|
||||
import curry from 'next/dist/compiled/lodash.curry';
|
||||
import { loader, plugin } from '../../helpers';
|
||||
import { pipe } from '../../utils';
|
||||
import { getCssModuleLoader, getGlobalCssLoader } from './loaders';
|
||||
import { getNextFontLoader } from './loaders/next-font';
|
||||
import { getCustomDocumentError, getGlobalImportError, getGlobalModuleImportError, getLocalModuleImportError } from './messages';
|
||||
import { getPostCssPlugins } from './plugins';
|
||||
import { nonNullable } from '../../../../../lib/non-nullable';
|
||||
import { WEBPACK_LAYERS } from '../../../../../lib/constants';
|
||||
import { getRspackCore } from '../../../../../shared/lib/get-rspack';
|
||||
// RegExps for all Style Sheet variants
|
||||
export const regexLikeCss = /\.(css|scss|sass)$/;
|
||||
// RegExps for Style Sheets
|
||||
const regexCssGlobal = /(?<!\.module)\.css$/;
|
||||
const regexCssModules = /\.module\.css$/;
|
||||
// RegExps for Syntactically Awesome Style Sheets
|
||||
const regexSassGlobal = /(?<!\.module)\.(scss|sass)$/;
|
||||
const regexSassModules = /\.module\.(scss|sass)$/;
|
||||
const APP_LAYER_RULE = {
|
||||
or: [
|
||||
WEBPACK_LAYERS.reactServerComponents,
|
||||
WEBPACK_LAYERS.serverSideRendering,
|
||||
WEBPACK_LAYERS.appPagesBrowser
|
||||
]
|
||||
};
|
||||
const PAGES_LAYER_RULE = {
|
||||
not: [
|
||||
WEBPACK_LAYERS.reactServerComponents,
|
||||
WEBPACK_LAYERS.serverSideRendering,
|
||||
WEBPACK_LAYERS.appPagesBrowser
|
||||
]
|
||||
};
|
||||
/**
|
||||
* Mark a rule as removable if built-in CSS support is disabled
|
||||
*/ function markRemovable(r) {
|
||||
Object.defineProperty(r, Symbol.for('__next_css_remove'), {
|
||||
enumerable: false,
|
||||
value: true
|
||||
});
|
||||
return r;
|
||||
}
|
||||
let postcssInstancePromise;
|
||||
export async function lazyPostCSS(rootDirectory, supportedBrowsers, disablePostcssPresetEnv, useLightningcss) {
|
||||
if (!postcssInstancePromise) {
|
||||
postcssInstancePromise = (async ()=>{
|
||||
const postcss = require('postcss');
|
||||
// @ts-ignore backwards compat
|
||||
postcss.plugin = function postcssPlugin(name, initializer) {
|
||||
function creator(...args) {
|
||||
let transformer = initializer(...args);
|
||||
transformer.postcssPlugin = name;
|
||||
// transformer.postcssVersion = new Processor().version
|
||||
return transformer;
|
||||
}
|
||||
let cache;
|
||||
Object.defineProperty(creator, 'postcss', {
|
||||
get () {
|
||||
if (!cache) cache = creator();
|
||||
return cache;
|
||||
}
|
||||
});
|
||||
creator.process = function(css, processOpts, pluginOpts) {
|
||||
return postcss([
|
||||
creator(pluginOpts)
|
||||
]).process(css, processOpts);
|
||||
};
|
||||
return creator;
|
||||
};
|
||||
// @ts-ignore backwards compat
|
||||
postcss.vendor = {
|
||||
/**
|
||||
* Returns the vendor prefix extracted from an input string.
|
||||
*
|
||||
* @example
|
||||
* postcss.vendor.prefix('-moz-tab-size') //=> '-moz-'
|
||||
* postcss.vendor.prefix('tab-size') //=> ''
|
||||
*/ prefix: function prefix(prop) {
|
||||
const match = prop.match(/^(-\w+-)/);
|
||||
if (match) {
|
||||
return match[0];
|
||||
}
|
||||
return '';
|
||||
},
|
||||
/**
|
||||
* Returns the input string stripped of its vendor prefix.
|
||||
*
|
||||
* @example
|
||||
* postcss.vendor.unprefixed('-moz-tab-size') //=> 'tab-size'
|
||||
*/ unprefixed: function unprefixed(/**
|
||||
* String with or without vendor prefix.
|
||||
*/ prop) {
|
||||
return prop.replace(/^-\w+-/, '');
|
||||
}
|
||||
};
|
||||
const postCssPlugins = await getPostCssPlugins(rootDirectory, supportedBrowsers, disablePostcssPresetEnv, useLightningcss);
|
||||
return {
|
||||
postcss,
|
||||
postcssWithPlugins: postcss(postCssPlugins)
|
||||
};
|
||||
})();
|
||||
}
|
||||
return postcssInstancePromise;
|
||||
}
|
||||
export const css = curry(async function css(ctx, config) {
|
||||
const isRspack = Boolean(process.env.NEXT_RSPACK);
|
||||
const { prependData: sassPrependData, additionalData: sassAdditionalData, implementation: sassImplementation, ...sassOptions } = ctx.sassOptions;
|
||||
const lazyPostCSSInitializer = ()=>lazyPostCSS(ctx.rootDirectory, ctx.supportedBrowsers, ctx.experimental.disablePostcssPresetEnv, ctx.experimental.useLightningcss);
|
||||
const sassPreprocessors = [
|
||||
// First, process files with `sass-loader`: this inlines content, and
|
||||
// compiles away the proprietary syntax.
|
||||
{
|
||||
loader: require.resolve('next/dist/compiled/sass-loader'),
|
||||
options: {
|
||||
implementation: sassImplementation,
|
||||
// Source maps are required so that `resolve-url-loader` can locate
|
||||
// files original to their source directory.
|
||||
sourceMap: true,
|
||||
sassOptions,
|
||||
additionalData: sassPrependData || sassAdditionalData
|
||||
}
|
||||
},
|
||||
// Then, `sass-loader` will have passed-through CSS imports as-is instead
|
||||
// of inlining them. Because they were inlined, the paths are no longer
|
||||
// correct.
|
||||
// To fix this, we use `resolve-url-loader` to rewrite the CSS
|
||||
// imports to real file paths.
|
||||
{
|
||||
loader: require.resolve('../../../loaders/resolve-url-loader/index'),
|
||||
options: {
|
||||
postcss: lazyPostCSSInitializer,
|
||||
// Source maps are not required here, but we may as well emit
|
||||
// them.
|
||||
sourceMap: true
|
||||
}
|
||||
}
|
||||
];
|
||||
const fns = [];
|
||||
const googleLoader = require.resolve('next/dist/compiled/@next/font/google/loader');
|
||||
const localLoader = require.resolve('next/dist/compiled/@next/font/local/loader');
|
||||
const nextFontLoaders = [
|
||||
[
|
||||
require.resolve('next/font/google/target.css'),
|
||||
googleLoader
|
||||
],
|
||||
[
|
||||
require.resolve('next/font/local/target.css'),
|
||||
localLoader
|
||||
]
|
||||
];
|
||||
nextFontLoaders.forEach(([fontLoaderTarget, fontLoaderPath])=>{
|
||||
// Matches the resolved font loaders noop files to run next-font-loader
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
sideEffects: false,
|
||||
test: fontLoaderTarget,
|
||||
use: getNextFontLoader(ctx, lazyPostCSSInitializer, fontLoaderPath)
|
||||
})
|
||||
]
|
||||
}));
|
||||
});
|
||||
// CSS cannot be imported in _document. This comes before everything because
|
||||
// global CSS nor CSS modules work in said file.
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
test: regexLikeCss,
|
||||
// Use a loose regex so we don't have to crawl the file system to
|
||||
// find the real file name (if present).
|
||||
issuer: /pages[\\/]_document\./,
|
||||
use: {
|
||||
loader: 'error-loader',
|
||||
options: {
|
||||
reason: getCustomDocumentError()
|
||||
}
|
||||
}
|
||||
})
|
||||
]
|
||||
}));
|
||||
const shouldIncludeExternalCSSImports = !!ctx.experimental.craCompat || !!ctx.transpilePackages;
|
||||
// CSS modules & SASS modules support. They are allowed to be imported in anywhere.
|
||||
fns.push(// CSS Modules should never have side effects. This setting will
|
||||
// allow unused CSS to be removed from the production build.
|
||||
// We ensure this by disallowing `:global()` CSS at the top-level
|
||||
// via the `pure` mode in `css-loader`.
|
||||
loader({
|
||||
oneOf: [
|
||||
// For app dir, we need to match the specific app layer.
|
||||
ctx.hasAppDir ? markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexCssModules,
|
||||
issuerLayer: APP_LAYER_RULE,
|
||||
use: [
|
||||
{
|
||||
loader: require.resolve('../../../loaders/next-flight-css-loader'),
|
||||
options: {
|
||||
cssModules: true
|
||||
}
|
||||
},
|
||||
...getCssModuleLoader({
|
||||
...ctx,
|
||||
isAppDir: true
|
||||
}, lazyPostCSSInitializer)
|
||||
]
|
||||
}) : null,
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexCssModules,
|
||||
issuerLayer: PAGES_LAYER_RULE,
|
||||
use: getCssModuleLoader({
|
||||
...ctx,
|
||||
isAppDir: false
|
||||
}, lazyPostCSSInitializer)
|
||||
})
|
||||
].filter(nonNullable)
|
||||
}), // Opt-in support for Sass (using .scss or .sass extensions).
|
||||
// Sass Modules should never have side effects. This setting will
|
||||
// allow unused Sass to be removed from the production build.
|
||||
// We ensure this by disallowing `:global()` Sass at the top-level
|
||||
// via the `pure` mode in `css-loader`.
|
||||
loader({
|
||||
oneOf: [
|
||||
// For app dir, we need to match the specific app layer.
|
||||
ctx.hasAppDir ? markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexSassModules,
|
||||
issuerLayer: APP_LAYER_RULE,
|
||||
use: [
|
||||
{
|
||||
loader: require.resolve('../../../loaders/next-flight-css-loader'),
|
||||
options: {
|
||||
cssModules: true
|
||||
}
|
||||
},
|
||||
...getCssModuleLoader({
|
||||
...ctx,
|
||||
isAppDir: true
|
||||
}, lazyPostCSSInitializer, sassPreprocessors)
|
||||
]
|
||||
}) : null,
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexSassModules,
|
||||
issuerLayer: PAGES_LAYER_RULE,
|
||||
use: getCssModuleLoader({
|
||||
...ctx,
|
||||
isAppDir: false
|
||||
}, lazyPostCSSInitializer, sassPreprocessors)
|
||||
})
|
||||
].filter(nonNullable)
|
||||
}), // Throw an error for CSS Modules used outside their supported scope
|
||||
loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
test: [
|
||||
regexCssModules,
|
||||
regexSassModules
|
||||
],
|
||||
use: {
|
||||
loader: 'error-loader',
|
||||
options: {
|
||||
reason: getLocalModuleImportError()
|
||||
}
|
||||
}
|
||||
})
|
||||
]
|
||||
}));
|
||||
// Global CSS and SASS support.
|
||||
if (ctx.isServer) {
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
ctx.hasAppDir && !ctx.isProduction ? markRemovable({
|
||||
sideEffects: true,
|
||||
test: [
|
||||
regexCssGlobal,
|
||||
regexSassGlobal
|
||||
],
|
||||
issuerLayer: APP_LAYER_RULE,
|
||||
use: {
|
||||
loader: require.resolve('../../../loaders/next-flight-css-loader'),
|
||||
options: {
|
||||
cssModules: false
|
||||
}
|
||||
}
|
||||
}) : null,
|
||||
markRemovable({
|
||||
// CSS imports have side effects, even on the server side.
|
||||
sideEffects: true,
|
||||
test: [
|
||||
regexCssGlobal,
|
||||
regexSassGlobal
|
||||
],
|
||||
use: require.resolve('next/dist/compiled/ignore-loader')
|
||||
})
|
||||
].filter(nonNullable)
|
||||
}));
|
||||
} else {
|
||||
// External CSS files are allowed to be loaded when any of the following is true:
|
||||
// - hasAppDir: all CSS files are allowed
|
||||
// - If the CSS file is located in `node_modules`
|
||||
// - If the CSS file is located in another package in a monorepo (outside of the current rootDir)
|
||||
// - If the issuer is pages/_app (matched later)
|
||||
const allowedPagesGlobalCSSPath = ctx.hasAppDir ? undefined : {
|
||||
and: [
|
||||
{
|
||||
or: [
|
||||
/node_modules/,
|
||||
{
|
||||
not: [
|
||||
ctx.rootDirectory
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
const allowedPagesGlobalCSSIssuer = ctx.hasAppDir ? undefined : shouldIncludeExternalCSSImports ? undefined : {
|
||||
and: [
|
||||
ctx.rootDirectory
|
||||
],
|
||||
not: [
|
||||
/node_modules/
|
||||
]
|
||||
};
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
...ctx.hasAppDir ? [
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexCssGlobal,
|
||||
issuerLayer: APP_LAYER_RULE,
|
||||
use: [
|
||||
{
|
||||
loader: require.resolve('../../../loaders/next-flight-css-loader'),
|
||||
options: {
|
||||
cssModules: false
|
||||
}
|
||||
},
|
||||
...getGlobalCssLoader({
|
||||
...ctx,
|
||||
isAppDir: true
|
||||
}, lazyPostCSSInitializer)
|
||||
]
|
||||
}),
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexSassGlobal,
|
||||
issuerLayer: APP_LAYER_RULE,
|
||||
use: [
|
||||
{
|
||||
loader: require.resolve('../../../loaders/next-flight-css-loader'),
|
||||
options: {
|
||||
cssModules: false
|
||||
}
|
||||
},
|
||||
...getGlobalCssLoader({
|
||||
...ctx,
|
||||
isAppDir: true
|
||||
}, lazyPostCSSInitializer, sassPreprocessors)
|
||||
]
|
||||
})
|
||||
] : [],
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexCssGlobal,
|
||||
include: allowedPagesGlobalCSSPath,
|
||||
issuer: allowedPagesGlobalCSSIssuer,
|
||||
issuerLayer: PAGES_LAYER_RULE,
|
||||
use: getGlobalCssLoader({
|
||||
...ctx,
|
||||
isAppDir: false
|
||||
}, lazyPostCSSInitializer)
|
||||
}),
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexSassGlobal,
|
||||
include: allowedPagesGlobalCSSPath,
|
||||
issuer: allowedPagesGlobalCSSIssuer,
|
||||
issuerLayer: PAGES_LAYER_RULE,
|
||||
use: getGlobalCssLoader({
|
||||
...ctx,
|
||||
isAppDir: false
|
||||
}, lazyPostCSSInitializer, sassPreprocessors)
|
||||
})
|
||||
].filter(nonNullable)
|
||||
}));
|
||||
if (ctx.customAppFile) {
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexCssGlobal,
|
||||
issuer: {
|
||||
and: [
|
||||
ctx.customAppFile
|
||||
]
|
||||
},
|
||||
use: getGlobalCssLoader({
|
||||
...ctx,
|
||||
isAppDir: false
|
||||
}, lazyPostCSSInitializer)
|
||||
})
|
||||
]
|
||||
}), loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
sideEffects: true,
|
||||
test: regexSassGlobal,
|
||||
issuer: {
|
||||
and: [
|
||||
ctx.customAppFile
|
||||
]
|
||||
},
|
||||
use: getGlobalCssLoader({
|
||||
...ctx,
|
||||
isAppDir: false
|
||||
}, lazyPostCSSInitializer, sassPreprocessors)
|
||||
})
|
||||
]
|
||||
}));
|
||||
}
|
||||
}
|
||||
// Throw an error for Global CSS used inside of `node_modules`
|
||||
if (!shouldIncludeExternalCSSImports) {
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
test: [
|
||||
regexCssGlobal,
|
||||
regexSassGlobal
|
||||
],
|
||||
issuer: {
|
||||
and: [
|
||||
/node_modules/
|
||||
]
|
||||
},
|
||||
use: {
|
||||
loader: 'error-loader',
|
||||
options: {
|
||||
reason: getGlobalModuleImportError()
|
||||
}
|
||||
}
|
||||
})
|
||||
]
|
||||
}));
|
||||
}
|
||||
// Throw an error for Global CSS used outside of our custom <App> file
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
test: [
|
||||
regexCssGlobal,
|
||||
regexSassGlobal
|
||||
],
|
||||
issuer: ctx.hasAppDir ? {
|
||||
// If it's inside the app dir, but not importing from a layout file,
|
||||
// throw an error.
|
||||
and: [
|
||||
ctx.rootDirectory
|
||||
],
|
||||
not: [
|
||||
/layout\.(js|mjs|jsx|ts|tsx)$/
|
||||
]
|
||||
} : undefined,
|
||||
use: {
|
||||
loader: 'error-loader',
|
||||
options: {
|
||||
reason: getGlobalImportError()
|
||||
}
|
||||
}
|
||||
})
|
||||
]
|
||||
}));
|
||||
if (ctx.isClient) {
|
||||
// Automatically transform references to files (i.e. url()) into URLs
|
||||
// e.g. url(./logo.svg)
|
||||
fns.push(loader({
|
||||
oneOf: [
|
||||
markRemovable({
|
||||
// This should only be applied to CSS files
|
||||
issuer: regexLikeCss,
|
||||
// Exclude extensions that webpack handles by default
|
||||
exclude: [
|
||||
/\.(js|mjs|jsx|ts|tsx)$/,
|
||||
/\.html$/,
|
||||
/\.json$/,
|
||||
/\.webpack\[[^\]]+\]$/
|
||||
],
|
||||
// `asset/resource` always emits a URL reference, where `asset`
|
||||
// might inline the asset as a data URI
|
||||
type: 'asset/resource'
|
||||
})
|
||||
]
|
||||
}));
|
||||
}
|
||||
// Enable full mini-css-extract-plugin hmr for prod mode pages or app dir
|
||||
if (ctx.isClient && (ctx.isProduction || ctx.hasAppDir)) {
|
||||
// Extract CSS as CSS file(s) in the client-side production bundle.
|
||||
const MiniCssExtractPlugin = isRspack ? getRspackCore().CssExtractRspackPlugin : require('../../../plugins/mini-css-extract-plugin').default;
|
||||
fns.push(plugin(// @ts-ignore webpack 5 compat
|
||||
new MiniCssExtractPlugin({
|
||||
filename: ctx.isProduction ? 'static/css/[contenthash].css' : 'static/css/[name].css',
|
||||
chunkFilename: ctx.isProduction ? 'static/css/[contenthash].css' : 'static/css/[name].css',
|
||||
// Next.js guarantees that CSS order "doesn't matter", due to imposed
|
||||
// restrictions:
|
||||
// 1. Global CSS can only be defined in a single entrypoint (_app)
|
||||
// 2. CSS Modules generate scoped class names by default and cannot
|
||||
// include Global CSS (:global() selector).
|
||||
//
|
||||
// While not a perfect guarantee (e.g. liberal use of `:global()`
|
||||
// selector), this assumption is required to code-split CSS.
|
||||
//
|
||||
// If this warning were to trigger, it'd be unactionable by the user,
|
||||
// but likely not valid -- so we disable it.
|
||||
ignoreOrder: true,
|
||||
insert: function(linkTag) {
|
||||
if (typeof _N_E_STYLE_LOAD === 'function') {
|
||||
// Avoid destructuring and optional-chaining here: this function
|
||||
// is serialized as a string by mini-css-extract-plugin and
|
||||
// injected directly into the browser bundle without further
|
||||
// transpilation. Destructuring (`const { x } = obj`) breaks on
|
||||
// browsers that pre-date ES2015 support (e.g. Chrome <49).
|
||||
var href = linkTag.href;
|
||||
var onload = linkTag.onload;
|
||||
var onerror = linkTag.onerror;
|
||||
_N_E_STYLE_LOAD(href.indexOf(window.location.origin) === 0 ? new URL(href).pathname : href).then(function() {
|
||||
if (onload) onload.call(linkTag, {
|
||||
type: 'load'
|
||||
});
|
||||
}, function() {
|
||||
if (onerror) onerror.call(linkTag, {});
|
||||
});
|
||||
} else {
|
||||
document.head.appendChild(linkTag);
|
||||
}
|
||||
}
|
||||
})));
|
||||
}
|
||||
const fn = pipe(...fns);
|
||||
return fn(config);
|
||||
});
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+39
@@ -0,0 +1,39 @@
|
||||
import { getRspackCore } from '../../../../../../shared/lib/get-rspack';
|
||||
export function getClientStyleLoader({ hasAppDir, isAppDir, isDevelopment, assetPrefix, experimentalInlineCss }) {
|
||||
const isRspack = Boolean(process.env.NEXT_RSPACK);
|
||||
const shouldEnableApp = typeof isAppDir === 'boolean' ? isAppDir : hasAppDir;
|
||||
// Keep next-style-loader for development mode in `pages/`
|
||||
if (isDevelopment && !shouldEnableApp) {
|
||||
return {
|
||||
loader: 'next-style-loader',
|
||||
options: {
|
||||
insert: function(element) {
|
||||
// By default, style-loader injects CSS into the bottom
|
||||
// of <head>. This causes ordering problems between dev
|
||||
// and prod. To fix this, we render a <noscript> tag as
|
||||
// an anchor for the styles to be placed before. These
|
||||
// styles will be applied _before_ <style jsx global>.
|
||||
// These elements should always exist. If they do not,
|
||||
// this code should fail.
|
||||
var anchorElement = document.querySelector('#__next_css__DO_NOT_USE__');
|
||||
var parentNode = anchorElement.parentNode// Normally <head>
|
||||
;
|
||||
// Each style tag should be placed right before our
|
||||
// anchor. By inserting before and not after, we do not
|
||||
// need to track the last inserted element.
|
||||
parentNode.insertBefore(element, anchorElement);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
const MiniCssExtractPlugin = isRspack ? getRspackCore().rspack.CssExtractRspackPlugin : require('../../../../plugins/mini-css-extract-plugin').default;
|
||||
return {
|
||||
loader: MiniCssExtractPlugin.loader,
|
||||
options: {
|
||||
publicPath: experimentalInlineCss ? '/' : `${assetPrefix}/_next/`,
|
||||
esModule: false
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//# sourceMappingURL=client.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/config/blocks/css/loaders/client.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport { getRspackCore } from '../../../../../../shared/lib/get-rspack'\n\nexport function getClientStyleLoader({\n hasAppDir,\n isAppDir,\n isDevelopment,\n assetPrefix,\n experimentalInlineCss,\n}: {\n hasAppDir: boolean\n isAppDir?: boolean\n isDevelopment: boolean\n assetPrefix: string\n experimentalInlineCss?: boolean\n}): webpack.RuleSetUseItem {\n const isRspack = Boolean(process.env.NEXT_RSPACK)\n const shouldEnableApp = typeof isAppDir === 'boolean' ? isAppDir : hasAppDir\n\n // Keep next-style-loader for development mode in `pages/`\n if (isDevelopment && !shouldEnableApp) {\n return {\n loader: 'next-style-loader',\n options: {\n insert: function (element: Node) {\n // By default, style-loader injects CSS into the bottom\n // of <head>. This causes ordering problems between dev\n // and prod. To fix this, we render a <noscript> tag as\n // an anchor for the styles to be placed before. These\n // styles will be applied _before_ <style jsx global>.\n\n // These elements should always exist. If they do not,\n // this code should fail.\n var anchorElement = document.querySelector(\n '#__next_css__DO_NOT_USE__'\n )!\n var parentNode = anchorElement.parentNode! // Normally <head>\n\n // Each style tag should be placed right before our\n // anchor. By inserting before and not after, we do not\n // need to track the last inserted element.\n parentNode.insertBefore(element, anchorElement)\n },\n },\n }\n }\n\n const MiniCssExtractPlugin = isRspack\n ? getRspackCore().rspack.CssExtractRspackPlugin\n : (\n require('../../../../plugins/mini-css-extract-plugin') as typeof import('../../../../plugins/mini-css-extract-plugin')\n ).default\n\n return {\n loader: MiniCssExtractPlugin.loader,\n options: {\n publicPath: experimentalInlineCss ? '/' : `${assetPrefix}/_next/`,\n esModule: false,\n },\n }\n}\n"],"names":["getRspackCore","getClientStyleLoader","hasAppDir","isAppDir","isDevelopment","assetPrefix","experimentalInlineCss","isRspack","Boolean","process","env","NEXT_RSPACK","shouldEnableApp","loader","options","insert","element","anchorElement","document","querySelector","parentNode","insertBefore","MiniCssExtractPlugin","rspack","CssExtractRspackPlugin","require","default","publicPath","esModule"],"mappings":"AACA,SAASA,aAAa,QAAQ,0CAAyC;AAEvE,OAAO,SAASC,qBAAqB,EACnCC,SAAS,EACTC,QAAQ,EACRC,aAAa,EACbC,WAAW,EACXC,qBAAqB,EAOtB;IACC,MAAMC,WAAWC,QAAQC,QAAQC,GAAG,CAACC,WAAW;IAChD,MAAMC,kBAAkB,OAAOT,aAAa,YAAYA,WAAWD;IAEnE,0DAA0D;IAC1D,IAAIE,iBAAiB,CAACQ,iBAAiB;QACrC,OAAO;YACLC,QAAQ;YACRC,SAAS;gBACPC,QAAQ,SAAUC,OAAa;oBAC7B,uDAAuD;oBACvD,uDAAuD;oBACvD,uDAAuD;oBACvD,sDAAsD;oBACtD,sDAAsD;oBAEtD,sDAAsD;oBACtD,yBAAyB;oBACzB,IAAIC,gBAAgBC,SAASC,aAAa,CACxC;oBAEF,IAAIC,aAAaH,cAAcG,UAAU,AAAE,kBAAkB;;oBAE7D,mDAAmD;oBACnD,uDAAuD;oBACvD,2CAA2C;oBAC3CA,WAAWC,YAAY,CAACL,SAASC;gBACnC;YACF;QACF;IACF;IAEA,MAAMK,uBAAuBf,WACzBP,gBAAgBuB,MAAM,CAACC,sBAAsB,GAC7C,AACEC,QAAQ,+CACRC,OAAO;IAEb,OAAO;QACLb,QAAQS,qBAAqBT,MAAM;QACnCC,SAAS;YACPa,YAAYrB,wBAAwB,MAAM,GAAGD,YAAY,OAAO,CAAC;YACjEuB,UAAU;QACZ;IACF;AACF","ignoreList":[0]}
|
||||
Generated
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
export function cssFileResolve(url, _resourcePath, urlImports) {
|
||||
if (url.startsWith('/')) {
|
||||
return false;
|
||||
}
|
||||
if (!urlImports && /^[a-z][a-z0-9+.-]*:/i.test(url)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=file-resolve.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/config/blocks/css/loaders/file-resolve.ts"],"sourcesContent":["export function cssFileResolve(\n url: string,\n _resourcePath: string,\n urlImports: any\n) {\n if (url.startsWith('/')) {\n return false\n }\n if (!urlImports && /^[a-z][a-z0-9+.-]*:/i.test(url)) {\n return false\n }\n return true\n}\n"],"names":["cssFileResolve","url","_resourcePath","urlImports","startsWith","test"],"mappings":"AAAA,OAAO,SAASA,eACdC,GAAW,EACXC,aAAqB,EACrBC,UAAe;IAEf,IAAIF,IAAIG,UAAU,CAAC,MAAM;QACvB,OAAO;IACT;IACA,IAAI,CAACD,cAAc,uBAAuBE,IAAI,CAACJ,MAAM;QACnD,OAAO;IACT;IACA,OAAO;AACT","ignoreList":[0]}
|
||||
Generated
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
import loaderUtils from 'next/dist/compiled/loader-utils3';
|
||||
import path from 'path';
|
||||
const regexLikeIndexModule = /(?<!pages[\\/])index\.module\.(scss|sass|css)$/;
|
||||
export function getCssModuleLocalIdent(context, _, exportName, options) {
|
||||
const relativePath = path.relative(context.rootContext, context.resourcePath).replace(/\\+/g, '/');
|
||||
// Generate a more meaningful name (parent folder) when the user names the
|
||||
// file `index.module.css`.
|
||||
const fileNameOrFolder = regexLikeIndexModule.test(relativePath) ? '[folder]' : '[name]';
|
||||
// Generate a hash to make the class name unique.
|
||||
const hash = loaderUtils.getHashDigest(Buffer.from(`filePath:${relativePath}#className:${exportName}`), 'sha1', 'base64', 5);
|
||||
// Have webpack interpolate the `[folder]` or `[name]` to its real value.
|
||||
return loaderUtils.interpolateName(context, fileNameOrFolder + '_' + exportName + '__' + hash, options).replace(// Webpack name interpolation returns `about.module_root__2oFM9` for
|
||||
// `.root {}` inside a file named `about.module.css`. Let's simplify
|
||||
// this.
|
||||
/\.module_/, '_')// Replace invalid symbols with underscores instead of escaping
|
||||
// https://mathiasbynens.be/notes/css-escapes#identifiers-strings
|
||||
.replace(/[^a-zA-Z0-9-_]/g, '_')// "they cannot start with a digit, two hyphens, or a hyphen followed by a digit [sic]"
|
||||
// https://www.w3.org/TR/CSS21/syndata.html#characters
|
||||
.replace(/^(\d|--|-\d)/, '__$1');
|
||||
}
|
||||
|
||||
//# sourceMappingURL=getCssModuleLocalIdent.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/config/blocks/css/loaders/getCssModuleLocalIdent.ts"],"sourcesContent":["import loaderUtils from 'next/dist/compiled/loader-utils3'\nimport path from 'path'\nimport type { webpack } from 'next/dist/compiled/webpack/webpack'\n\nconst regexLikeIndexModule = /(?<!pages[\\\\/])index\\.module\\.(scss|sass|css)$/\n\nexport function getCssModuleLocalIdent(\n context: webpack.LoaderContext<{}>,\n _: any,\n exportName: string,\n options: object\n) {\n const relativePath = path\n .relative(context.rootContext, context.resourcePath)\n .replace(/\\\\+/g, '/')\n\n // Generate a more meaningful name (parent folder) when the user names the\n // file `index.module.css`.\n const fileNameOrFolder = regexLikeIndexModule.test(relativePath)\n ? '[folder]'\n : '[name]'\n\n // Generate a hash to make the class name unique.\n const hash = loaderUtils.getHashDigest(\n Buffer.from(`filePath:${relativePath}#className:${exportName}`),\n 'sha1',\n 'base64',\n 5\n )\n\n // Have webpack interpolate the `[folder]` or `[name]` to its real value.\n return (\n loaderUtils\n .interpolateName(\n context,\n fileNameOrFolder + '_' + exportName + '__' + hash,\n options\n )\n .replace(\n // Webpack name interpolation returns `about.module_root__2oFM9` for\n // `.root {}` inside a file named `about.module.css`. Let's simplify\n // this.\n /\\.module_/,\n '_'\n )\n // Replace invalid symbols with underscores instead of escaping\n // https://mathiasbynens.be/notes/css-escapes#identifiers-strings\n .replace(/[^a-zA-Z0-9-_]/g, '_')\n // \"they cannot start with a digit, two hyphens, or a hyphen followed by a digit [sic]\"\n // https://www.w3.org/TR/CSS21/syndata.html#characters\n .replace(/^(\\d|--|-\\d)/, '__$1')\n )\n}\n"],"names":["loaderUtils","path","regexLikeIndexModule","getCssModuleLocalIdent","context","_","exportName","options","relativePath","relative","rootContext","resourcePath","replace","fileNameOrFolder","test","hash","getHashDigest","Buffer","from","interpolateName"],"mappings":"AAAA,OAAOA,iBAAiB,mCAAkC;AAC1D,OAAOC,UAAU,OAAM;AAGvB,MAAMC,uBAAuB;AAE7B,OAAO,SAASC,uBACdC,OAAkC,EAClCC,CAAM,EACNC,UAAkB,EAClBC,OAAe;IAEf,MAAMC,eAAeP,KAClBQ,QAAQ,CAACL,QAAQM,WAAW,EAAEN,QAAQO,YAAY,EAClDC,OAAO,CAAC,QAAQ;IAEnB,0EAA0E;IAC1E,2BAA2B;IAC3B,MAAMC,mBAAmBX,qBAAqBY,IAAI,CAACN,gBAC/C,aACA;IAEJ,iDAAiD;IACjD,MAAMO,OAAOf,YAAYgB,aAAa,CACpCC,OAAOC,IAAI,CAAC,CAAC,SAAS,EAAEV,aAAa,WAAW,EAAEF,YAAY,GAC9D,QACA,UACA;IAGF,yEAAyE;IACzE,OACEN,YACGmB,eAAe,CACdf,SACAS,mBAAmB,MAAMP,aAAa,OAAOS,MAC7CR,SAEDK,OAAO,CACN,oEAAoE;IACpE,oEAAoE;IACpE,QAAQ;IACR,aACA,IAEF,+DAA+D;IAC/D,iEAAiE;KAChEA,OAAO,CAAC,mBAAmB,IAC5B,uFAAuF;IACvF,sDAAsD;KACrDA,OAAO,CAAC,gBAAgB;AAE/B","ignoreList":[0]}
|
||||
Generated
Vendored
+57
@@ -0,0 +1,57 @@
|
||||
import { getClientStyleLoader } from './client';
|
||||
import { cssFileResolve } from './file-resolve';
|
||||
export function getGlobalCssLoader(ctx, postcss, preProcessors = []) {
|
||||
const loaders = [];
|
||||
if (ctx.isClient) {
|
||||
// Add appropriate development more or production mode style
|
||||
// loader
|
||||
loaders.push(getClientStyleLoader({
|
||||
hasAppDir: ctx.hasAppDir,
|
||||
isAppDir: ctx.isAppDir,
|
||||
isDevelopment: ctx.isDevelopment,
|
||||
assetPrefix: ctx.assetPrefix,
|
||||
experimentalInlineCss: ctx.experimental.inlineCss
|
||||
}));
|
||||
}
|
||||
if (ctx.experimental.useLightningcss) {
|
||||
loaders.push({
|
||||
loader: require.resolve('../../../../loaders/lightningcss-loader/src'),
|
||||
options: {
|
||||
importLoaders: 1 + preProcessors.length,
|
||||
url: (url, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
import: (url, _, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
modules: false,
|
||||
targets: ctx.supportedBrowsers,
|
||||
postcss,
|
||||
lightningCssFeatures: ctx.experimental.lightningCssFeatures
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Resolve CSS `@import`s and `url()`s
|
||||
loaders.push({
|
||||
loader: require.resolve('../../../../loaders/css-loader/src'),
|
||||
options: {
|
||||
postcss,
|
||||
importLoaders: 1 + preProcessors.length,
|
||||
// Next.js controls CSS Modules eligibility:
|
||||
modules: false,
|
||||
url: (url, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
import: (url, _, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
deploymentId: ctx.deploymentId
|
||||
}
|
||||
});
|
||||
// Compile CSS
|
||||
loaders.push({
|
||||
loader: require.resolve('../../../../loaders/postcss-loader/src'),
|
||||
options: {
|
||||
postcss
|
||||
}
|
||||
});
|
||||
}
|
||||
loaders.push(// Webpack loaders run like a stack, so we need to reverse the natural
|
||||
// order of preprocessors.
|
||||
...preProcessors.slice().reverse());
|
||||
return loaders;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=global.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/config/blocks/css/loaders/global.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport type { ConfigurationContext } from '../../../utils'\n\nimport { getClientStyleLoader } from './client'\nimport { cssFileResolve } from './file-resolve'\n\nexport function getGlobalCssLoader(\n ctx: ConfigurationContext,\n postcss: any,\n preProcessors: readonly webpack.RuleSetUseItem[] = []\n): webpack.RuleSetUseItem[] {\n const loaders: webpack.RuleSetUseItem[] = []\n\n if (ctx.isClient) {\n // Add appropriate development more or production mode style\n // loader\n loaders.push(\n getClientStyleLoader({\n hasAppDir: ctx.hasAppDir,\n isAppDir: ctx.isAppDir,\n isDevelopment: ctx.isDevelopment,\n assetPrefix: ctx.assetPrefix,\n experimentalInlineCss: ctx.experimental.inlineCss,\n })\n )\n }\n\n if (ctx.experimental.useLightningcss) {\n loaders.push({\n loader: require.resolve('../../../../loaders/lightningcss-loader/src'),\n options: {\n importLoaders: 1 + preProcessors.length,\n url: (url: string, resourcePath: string) =>\n cssFileResolve(url, resourcePath, ctx.experimental.urlImports),\n import: (url: string, _: any, resourcePath: string) =>\n cssFileResolve(url, resourcePath, ctx.experimental.urlImports),\n modules: false,\n targets: ctx.supportedBrowsers,\n postcss,\n lightningCssFeatures: ctx.experimental.lightningCssFeatures,\n },\n })\n } else {\n // Resolve CSS `@import`s and `url()`s\n loaders.push({\n loader: require.resolve('../../../../loaders/css-loader/src'),\n options: {\n postcss,\n importLoaders: 1 + preProcessors.length,\n // Next.js controls CSS Modules eligibility:\n modules: false,\n url: (url: string, resourcePath: string) =>\n cssFileResolve(url, resourcePath, ctx.experimental.urlImports),\n import: (url: string, _: any, resourcePath: string) =>\n cssFileResolve(url, resourcePath, ctx.experimental.urlImports),\n deploymentId: ctx.deploymentId,\n },\n })\n\n // Compile CSS\n loaders.push({\n loader: require.resolve('../../../../loaders/postcss-loader/src'),\n options: {\n postcss,\n },\n })\n }\n\n loaders.push(\n // Webpack loaders run like a stack, so we need to reverse the natural\n // order of preprocessors.\n ...preProcessors.slice().reverse()\n )\n\n return loaders\n}\n"],"names":["getClientStyleLoader","cssFileResolve","getGlobalCssLoader","ctx","postcss","preProcessors","loaders","isClient","push","hasAppDir","isAppDir","isDevelopment","assetPrefix","experimentalInlineCss","experimental","inlineCss","useLightningcss","loader","require","resolve","options","importLoaders","length","url","resourcePath","urlImports","import","_","modules","targets","supportedBrowsers","lightningCssFeatures","deploymentId","slice","reverse"],"mappings":"AAGA,SAASA,oBAAoB,QAAQ,WAAU;AAC/C,SAASC,cAAc,QAAQ,iBAAgB;AAE/C,OAAO,SAASC,mBACdC,GAAyB,EACzBC,OAAY,EACZC,gBAAmD,EAAE;IAErD,MAAMC,UAAoC,EAAE;IAE5C,IAAIH,IAAII,QAAQ,EAAE;QAChB,4DAA4D;QAC5D,SAAS;QACTD,QAAQE,IAAI,CACVR,qBAAqB;YACnBS,WAAWN,IAAIM,SAAS;YACxBC,UAAUP,IAAIO,QAAQ;YACtBC,eAAeR,IAAIQ,aAAa;YAChCC,aAAaT,IAAIS,WAAW;YAC5BC,uBAAuBV,IAAIW,YAAY,CAACC,SAAS;QACnD;IAEJ;IAEA,IAAIZ,IAAIW,YAAY,CAACE,eAAe,EAAE;QACpCV,QAAQE,IAAI,CAAC;YACXS,QAAQC,QAAQC,OAAO,CAAC;YACxBC,SAAS;gBACPC,eAAe,IAAIhB,cAAciB,MAAM;gBACvCC,KAAK,CAACA,KAAaC,eACjBvB,eAAesB,KAAKC,cAAcrB,IAAIW,YAAY,CAACW,UAAU;gBAC/DC,QAAQ,CAACH,KAAaI,GAAQH,eAC5BvB,eAAesB,KAAKC,cAAcrB,IAAIW,YAAY,CAACW,UAAU;gBAC/DG,SAAS;gBACTC,SAAS1B,IAAI2B,iBAAiB;gBAC9B1B;gBACA2B,sBAAsB5B,IAAIW,YAAY,CAACiB,oBAAoB;YAC7D;QACF;IACF,OAAO;QACL,sCAAsC;QACtCzB,QAAQE,IAAI,CAAC;YACXS,QAAQC,QAAQC,OAAO,CAAC;YACxBC,SAAS;gBACPhB;gBACAiB,eAAe,IAAIhB,cAAciB,MAAM;gBACvC,4CAA4C;gBAC5CM,SAAS;gBACTL,KAAK,CAACA,KAAaC,eACjBvB,eAAesB,KAAKC,cAAcrB,IAAIW,YAAY,CAACW,UAAU;gBAC/DC,QAAQ,CAACH,KAAaI,GAAQH,eAC5BvB,eAAesB,KAAKC,cAAcrB,IAAIW,YAAY,CAACW,UAAU;gBAC/DO,cAAc7B,IAAI6B,YAAY;YAChC;QACF;QAEA,cAAc;QACd1B,QAAQE,IAAI,CAAC;YACXS,QAAQC,QAAQC,OAAO,CAAC;YACxBC,SAAS;gBACPhB;YACF;QACF;IACF;IAEAE,QAAQE,IAAI,CACV,sEAAsE;IACtE,0BAA0B;OACvBH,cAAc4B,KAAK,GAAGC,OAAO;IAGlC,OAAO5B;AACT","ignoreList":[0]}
|
||||
Generated
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
export * from './global';
|
||||
export * from './modules';
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/config/blocks/css/loaders/index.ts"],"sourcesContent":["export * from './global'\nexport * from './modules'\n"],"names":[],"mappings":"AAAA,cAAc,WAAU;AACxB,cAAc,YAAW","ignoreList":[0]}
|
||||
Generated
Vendored
+78
@@ -0,0 +1,78 @@
|
||||
import { getClientStyleLoader } from './client';
|
||||
import { cssFileResolve } from './file-resolve';
|
||||
import { getCssModuleLocalIdent } from './getCssModuleLocalIdent';
|
||||
export function getCssModuleLoader(ctx, postcss, preProcessors = []) {
|
||||
const loaders = [];
|
||||
if (ctx.isClient) {
|
||||
// Add appropriate development more or production mode style
|
||||
// loader
|
||||
loaders.push(getClientStyleLoader({
|
||||
hasAppDir: ctx.hasAppDir,
|
||||
isAppDir: ctx.isAppDir,
|
||||
isDevelopment: ctx.isDevelopment,
|
||||
assetPrefix: ctx.assetPrefix,
|
||||
experimentalInlineCss: ctx.experimental.inlineCss
|
||||
}));
|
||||
}
|
||||
if (ctx.experimental.useLightningcss) {
|
||||
loaders.push({
|
||||
loader: require.resolve('../../../../loaders/lightningcss-loader/src'),
|
||||
options: {
|
||||
importLoaders: 1 + preProcessors.length,
|
||||
url: (url, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
import: (url, _, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
modules: {
|
||||
// Do not transform class names (CJS mode backwards compatibility):
|
||||
exportLocalsConvention: 'asIs',
|
||||
// Server-side (Node.js) rendering support:
|
||||
exportOnlyLocals: ctx.isServer
|
||||
},
|
||||
targets: ctx.supportedBrowsers,
|
||||
postcss,
|
||||
lightningCssFeatures: ctx.experimental.lightningCssFeatures
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Resolve CSS `@import`s and `url()`s
|
||||
loaders.push({
|
||||
loader: require.resolve('../../../../loaders/css-loader/src'),
|
||||
options: {
|
||||
postcss,
|
||||
importLoaders: 1 + preProcessors.length,
|
||||
// Use CJS mode for backwards compatibility:
|
||||
esModule: false,
|
||||
url: (url, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
import: (url, _, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
modules: {
|
||||
// Do not transform class names (CJS mode backwards compatibility):
|
||||
exportLocalsConvention: 'asIs',
|
||||
// Server-side (Node.js) rendering support:
|
||||
exportOnlyLocals: ctx.isServer,
|
||||
// Disallow global style exports so we can code-split CSS and
|
||||
// not worry about loading order.
|
||||
mode: 'pure',
|
||||
// Generate a friendly production-ready name so it's
|
||||
// reasonably understandable. The same name is used for
|
||||
// development.
|
||||
// TODO: Consider making production reduce this to a single
|
||||
// character?
|
||||
getLocalIdent: getCssModuleLocalIdent
|
||||
},
|
||||
deploymentId: ctx.deploymentId
|
||||
}
|
||||
});
|
||||
// Compile CSS
|
||||
loaders.push({
|
||||
loader: require.resolve('../../../../loaders/postcss-loader/src'),
|
||||
options: {
|
||||
postcss
|
||||
}
|
||||
});
|
||||
}
|
||||
loaders.push(// Webpack loaders run like a stack, so we need to reverse the natural
|
||||
// order of preprocessors.
|
||||
...preProcessors.slice().reverse());
|
||||
return loaders;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=modules.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+53
@@ -0,0 +1,53 @@
|
||||
import { getClientStyleLoader } from './client';
|
||||
import { cssFileResolve } from './file-resolve';
|
||||
export function getNextFontLoader(ctx, postcss, fontLoaderPath) {
|
||||
const loaders = [];
|
||||
if (ctx.isClient) {
|
||||
// Add appropriate development mode or production mode style
|
||||
// loader
|
||||
loaders.push(getClientStyleLoader({
|
||||
hasAppDir: ctx.hasAppDir,
|
||||
isDevelopment: ctx.isDevelopment,
|
||||
assetPrefix: ctx.assetPrefix
|
||||
}));
|
||||
}
|
||||
loaders.push({
|
||||
loader: require.resolve('../../../../loaders/css-loader/src'),
|
||||
options: {
|
||||
postcss,
|
||||
importLoaders: 1,
|
||||
// Use CJS mode for backwards compatibility:
|
||||
esModule: false,
|
||||
url: (url, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
import: (url, _, resourcePath)=>cssFileResolve(url, resourcePath, ctx.experimental.urlImports),
|
||||
modules: {
|
||||
// Do not transform class names (CJS mode backwards compatibility):
|
||||
exportLocalsConvention: 'asIs',
|
||||
// Server-side (Node.js) rendering support:
|
||||
exportOnlyLocals: ctx.isServer,
|
||||
// Disallow global style exports so we can code-split CSS and
|
||||
// not worry about loading order.
|
||||
mode: 'pure',
|
||||
getLocalIdent: (_context, _localIdentName, exportName, _options, meta)=>{
|
||||
// hash from next-font-loader
|
||||
return `__${exportName}_${meta.fontFamilyHash}`;
|
||||
}
|
||||
},
|
||||
fontLoader: true
|
||||
}
|
||||
});
|
||||
loaders.push({
|
||||
loader: 'next-font-loader',
|
||||
options: {
|
||||
isDev: ctx.isDevelopment,
|
||||
isServer: ctx.isServer,
|
||||
assetPrefix: ctx.assetPrefix,
|
||||
deploymentId: ctx.deploymentId,
|
||||
fontLoaderPath,
|
||||
postcss
|
||||
}
|
||||
});
|
||||
return loaders;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=next-font.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/config/blocks/css/loaders/next-font.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport type { ConfigurationContext } from '../../../utils'\nimport { getClientStyleLoader } from './client'\nimport { cssFileResolve } from './file-resolve'\n\nexport function getNextFontLoader(\n ctx: ConfigurationContext,\n postcss: any,\n fontLoaderPath: string\n): webpack.RuleSetUseItem[] {\n const loaders: webpack.RuleSetUseItem[] = []\n\n if (ctx.isClient) {\n // Add appropriate development mode or production mode style\n // loader\n loaders.push(\n getClientStyleLoader({\n hasAppDir: ctx.hasAppDir,\n isDevelopment: ctx.isDevelopment,\n assetPrefix: ctx.assetPrefix,\n })\n )\n }\n\n loaders.push({\n loader: require.resolve('../../../../loaders/css-loader/src'),\n options: {\n postcss,\n importLoaders: 1,\n // Use CJS mode for backwards compatibility:\n esModule: false,\n url: (url: string, resourcePath: string) =>\n cssFileResolve(url, resourcePath, ctx.experimental.urlImports),\n import: (url: string, _: any, resourcePath: string) =>\n cssFileResolve(url, resourcePath, ctx.experimental.urlImports),\n modules: {\n // Do not transform class names (CJS mode backwards compatibility):\n exportLocalsConvention: 'asIs',\n // Server-side (Node.js) rendering support:\n exportOnlyLocals: ctx.isServer,\n // Disallow global style exports so we can code-split CSS and\n // not worry about loading order.\n mode: 'pure',\n getLocalIdent: (\n _context: any,\n _localIdentName: any,\n exportName: string,\n _options: any,\n meta: any\n ) => {\n // hash from next-font-loader\n return `__${exportName}_${meta.fontFamilyHash}`\n },\n },\n fontLoader: true,\n },\n })\n\n loaders.push({\n loader: 'next-font-loader',\n options: {\n isDev: ctx.isDevelopment,\n isServer: ctx.isServer,\n assetPrefix: ctx.assetPrefix,\n deploymentId: ctx.deploymentId,\n fontLoaderPath,\n postcss,\n },\n })\n\n return loaders\n}\n"],"names":["getClientStyleLoader","cssFileResolve","getNextFontLoader","ctx","postcss","fontLoaderPath","loaders","isClient","push","hasAppDir","isDevelopment","assetPrefix","loader","require","resolve","options","importLoaders","esModule","url","resourcePath","experimental","urlImports","import","_","modules","exportLocalsConvention","exportOnlyLocals","isServer","mode","getLocalIdent","_context","_localIdentName","exportName","_options","meta","fontFamilyHash","fontLoader","isDev","deploymentId"],"mappings":"AAEA,SAASA,oBAAoB,QAAQ,WAAU;AAC/C,SAASC,cAAc,QAAQ,iBAAgB;AAE/C,OAAO,SAASC,kBACdC,GAAyB,EACzBC,OAAY,EACZC,cAAsB;IAEtB,MAAMC,UAAoC,EAAE;IAE5C,IAAIH,IAAII,QAAQ,EAAE;QAChB,4DAA4D;QAC5D,SAAS;QACTD,QAAQE,IAAI,CACVR,qBAAqB;YACnBS,WAAWN,IAAIM,SAAS;YACxBC,eAAeP,IAAIO,aAAa;YAChCC,aAAaR,IAAIQ,WAAW;QAC9B;IAEJ;IAEAL,QAAQE,IAAI,CAAC;QACXI,QAAQC,QAAQC,OAAO,CAAC;QACxBC,SAAS;YACPX;YACAY,eAAe;YACf,4CAA4C;YAC5CC,UAAU;YACVC,KAAK,CAACA,KAAaC,eACjBlB,eAAeiB,KAAKC,cAAchB,IAAIiB,YAAY,CAACC,UAAU;YAC/DC,QAAQ,CAACJ,KAAaK,GAAQJ,eAC5BlB,eAAeiB,KAAKC,cAAchB,IAAIiB,YAAY,CAACC,UAAU;YAC/DG,SAAS;gBACP,mEAAmE;gBACnEC,wBAAwB;gBACxB,2CAA2C;gBAC3CC,kBAAkBvB,IAAIwB,QAAQ;gBAC9B,6DAA6D;gBAC7D,iCAAiC;gBACjCC,MAAM;gBACNC,eAAe,CACbC,UACAC,iBACAC,YACAC,UACAC;oBAEA,6BAA6B;oBAC7B,OAAO,CAAC,EAAE,EAAEF,WAAW,CAAC,EAAEE,KAAKC,cAAc,EAAE;gBACjD;YACF;YACAC,YAAY;QACd;IACF;IAEA9B,QAAQE,IAAI,CAAC;QACXI,QAAQ;QACRG,SAAS;YACPsB,OAAOlC,IAAIO,aAAa;YACxBiB,UAAUxB,IAAIwB,QAAQ;YACtBhB,aAAaR,IAAIQ,WAAW;YAC5B2B,cAAcnC,IAAImC,YAAY;YAC9BjC;YACAD;QACF;IACF;IAEA,OAAOE;AACT","ignoreList":[0]}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
import { bold, cyan } from '../../../../../lib/picocolors';
|
||||
export function getGlobalImportError() {
|
||||
return `Global CSS ${bold('cannot')} be imported from files other than your ${bold('Custom <App>')}. Due to the Global nature of stylesheets, and to avoid conflicts, Please move all first-party global CSS imports to ${cyan('pages/_app.js')}. Or convert the import to Component-Level CSS (CSS Modules).\nRead more: https://nextjs.org/docs/messages/css-global`;
|
||||
}
|
||||
export function getGlobalModuleImportError() {
|
||||
return `Global CSS ${bold('cannot')} be imported from within ${bold('node_modules')}.\nRead more: https://nextjs.org/docs/messages/css-npm`;
|
||||
}
|
||||
export function getLocalModuleImportError() {
|
||||
return `CSS Modules ${bold('cannot')} be imported from within ${bold('node_modules')}.\nRead more: https://nextjs.org/docs/messages/css-modules-npm`;
|
||||
}
|
||||
export function getCustomDocumentError() {
|
||||
return `CSS ${bold('cannot')} be imported within ${cyan('pages/_document.js')}. Please move global styles to ${cyan('pages/_app.js')}.`;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=messages.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../src/build/webpack/config/blocks/css/messages.ts"],"sourcesContent":["import { bold, cyan } from '../../../../../lib/picocolors'\n\nexport function getGlobalImportError() {\n return `Global CSS ${bold(\n 'cannot'\n )} be imported from files other than your ${bold(\n 'Custom <App>'\n )}. Due to the Global nature of stylesheets, and to avoid conflicts, Please move all first-party global CSS imports to ${cyan(\n 'pages/_app.js'\n )}. Or convert the import to Component-Level CSS (CSS Modules).\\nRead more: https://nextjs.org/docs/messages/css-global`\n}\n\nexport function getGlobalModuleImportError() {\n return `Global CSS ${bold('cannot')} be imported from within ${bold(\n 'node_modules'\n )}.\\nRead more: https://nextjs.org/docs/messages/css-npm`\n}\n\nexport function getLocalModuleImportError() {\n return `CSS Modules ${bold('cannot')} be imported from within ${bold(\n 'node_modules'\n )}.\\nRead more: https://nextjs.org/docs/messages/css-modules-npm`\n}\n\nexport function getCustomDocumentError() {\n return `CSS ${bold('cannot')} be imported within ${cyan(\n 'pages/_document.js'\n )}. Please move global styles to ${cyan('pages/_app.js')}.`\n}\n"],"names":["bold","cyan","getGlobalImportError","getGlobalModuleImportError","getLocalModuleImportError","getCustomDocumentError"],"mappings":"AAAA,SAASA,IAAI,EAAEC,IAAI,QAAQ,gCAA+B;AAE1D,OAAO,SAASC;IACd,OAAO,CAAC,WAAW,EAAEF,KACnB,UACA,wCAAwC,EAAEA,KAC1C,gBACA,qHAAqH,EAAEC,KACvH,iBACA,qHAAqH,CAAC;AAC1H;AAEA,OAAO,SAASE;IACd,OAAO,CAAC,WAAW,EAAEH,KAAK,UAAU,yBAAyB,EAAEA,KAC7D,gBACA,sDAAsD,CAAC;AAC3D;AAEA,OAAO,SAASI;IACd,OAAO,CAAC,YAAY,EAAEJ,KAAK,UAAU,yBAAyB,EAAEA,KAC9D,gBACA,8DAA8D,CAAC;AACnE;AAEA,OAAO,SAASK;IACd,OAAO,CAAC,IAAI,EAAEL,KAAK,UAAU,oBAAoB,EAAEC,KACjD,sBACA,+BAA+B,EAAEA,KAAK,iBAAiB,CAAC,CAAC;AAC7D","ignoreList":[0]}
|
||||
+180
@@ -0,0 +1,180 @@
|
||||
import { bold, red, underline, yellow } from '../../../../../lib/picocolors';
|
||||
import { findConfig } from '../../../../../lib/find-config';
|
||||
const genericErrorText = 'Malformed PostCSS Configuration';
|
||||
function getError_NullConfig(pluginName) {
|
||||
return `${red(bold('Error'))}: Your PostCSS configuration for '${pluginName}' cannot have ${bold('null')} configuration.\nTo disable '${pluginName}', pass ${bold('false')}, otherwise, pass ${bold('true')} or a configuration object.`;
|
||||
}
|
||||
function isIgnoredPlugin(pluginPath) {
|
||||
const ignoredRegex = /(?:^|[\\/])(postcss-modules-values|postcss-modules-scope|postcss-modules-extract-imports|postcss-modules-local-by-default|postcss-modules)(?:[\\/]|$)/i;
|
||||
const match = ignoredRegex.exec(pluginPath);
|
||||
if (match == null) {
|
||||
return false;
|
||||
}
|
||||
const plugin = match.pop();
|
||||
console.warn(`${yellow(bold('Warning'))}: Please remove the ${underline(plugin)} plugin from your PostCSS configuration. ` + `This plugin is automatically configured by Next.js.\n` + 'Read more: https://nextjs.org/docs/messages/postcss-ignored-plugin');
|
||||
return true;
|
||||
}
|
||||
const createLazyPostCssPlugin = (fn)=>{
|
||||
let result = undefined;
|
||||
const plugin = (...args)=>{
|
||||
if (result === undefined) result = fn();
|
||||
if (result.postcss === true) {
|
||||
return result(...args);
|
||||
} else if (result.postcss) {
|
||||
return result.postcss;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
plugin.postcss = true;
|
||||
return plugin;
|
||||
};
|
||||
async function loadPlugin(dir, pluginName, options) {
|
||||
if (options === false || isIgnoredPlugin(pluginName)) {
|
||||
return false;
|
||||
}
|
||||
if (options == null) {
|
||||
console.error(getError_NullConfig(pluginName));
|
||||
throw Object.defineProperty(new Error(genericErrorText), "__NEXT_ERROR_CODE", {
|
||||
value: "E1036",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
const pluginPath = require.resolve(pluginName, {
|
||||
paths: [
|
||||
dir
|
||||
]
|
||||
});
|
||||
if (isIgnoredPlugin(pluginPath)) {
|
||||
return false;
|
||||
} else if (options === true) {
|
||||
return createLazyPostCssPlugin(()=>require(pluginPath));
|
||||
} else {
|
||||
if (typeof options === 'object' && Object.keys(options).length === 0) {
|
||||
return createLazyPostCssPlugin(()=>require(pluginPath));
|
||||
}
|
||||
return createLazyPostCssPlugin(()=>require(pluginPath)(options));
|
||||
}
|
||||
}
|
||||
function getDefaultPlugins(supportedBrowsers, disablePostcssPresetEnv) {
|
||||
return [
|
||||
require.resolve('next/dist/compiled/postcss-flexbugs-fixes'),
|
||||
disablePostcssPresetEnv ? false : [
|
||||
require.resolve('next/dist/compiled/postcss-preset-env'),
|
||||
{
|
||||
browsers: supportedBrowsers ?? [
|
||||
'defaults'
|
||||
],
|
||||
autoprefixer: {
|
||||
// Disable legacy flexbox support
|
||||
flexbox: 'no-2009'
|
||||
},
|
||||
// Enable CSS features that have shipped to the
|
||||
// web platform, i.e. in 2+ browsers unflagged.
|
||||
stage: 3,
|
||||
features: {
|
||||
'custom-properties': false
|
||||
}
|
||||
}
|
||||
]
|
||||
].filter(Boolean);
|
||||
}
|
||||
export async function getPostCssPlugins(dir, supportedBrowsers, disablePostcssPresetEnv = false, useLightningcss = false) {
|
||||
let config = await findConfig(dir, 'postcss');
|
||||
if (config == null) {
|
||||
config = {
|
||||
plugins: useLightningcss ? [] : getDefaultPlugins(supportedBrowsers, disablePostcssPresetEnv)
|
||||
};
|
||||
}
|
||||
if (typeof config === 'function') {
|
||||
throw Object.defineProperty(new Error(`Your custom PostCSS configuration may not export a function. Please export a plain object instead.\n` + 'Read more: https://nextjs.org/docs/messages/postcss-function'), "__NEXT_ERROR_CODE", {
|
||||
value: "E323",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
// Warn user about configuration keys which are not respected
|
||||
const invalidKey = Object.keys(config).find((key)=>key !== 'plugins');
|
||||
if (invalidKey) {
|
||||
console.warn(`${yellow(bold('Warning'))}: Your PostCSS configuration defines a field which is not supported (\`${invalidKey}\`). ` + `Please remove this configuration value.`);
|
||||
}
|
||||
// Enforce the user provided plugins if the configuration file is present
|
||||
let plugins = config.plugins;
|
||||
if (plugins == null || typeof plugins !== 'object') {
|
||||
throw Object.defineProperty(new Error(`Your custom PostCSS configuration must export a \`plugins\` key.`), "__NEXT_ERROR_CODE", {
|
||||
value: "E347",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
if (!Array.isArray(plugins)) {
|
||||
// Capture variable so TypeScript is happy
|
||||
const pc = plugins;
|
||||
plugins = Object.keys(plugins).reduce((acc, curr)=>{
|
||||
const p = pc[curr];
|
||||
if (typeof p === 'undefined') {
|
||||
console.error(getError_NullConfig(curr));
|
||||
throw Object.defineProperty(new Error(genericErrorText), "__NEXT_ERROR_CODE", {
|
||||
value: "E1036",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
acc.push([
|
||||
curr,
|
||||
p
|
||||
]);
|
||||
return acc;
|
||||
}, []);
|
||||
}
|
||||
const parsed = [];
|
||||
plugins.forEach((plugin)=>{
|
||||
if (plugin == null) {
|
||||
console.warn(`${yellow(bold('Warning'))}: A ${bold('null')} PostCSS plugin was provided. This entry will be ignored.`);
|
||||
} else if (typeof plugin === 'string') {
|
||||
parsed.push([
|
||||
plugin,
|
||||
true
|
||||
]);
|
||||
} else if (Array.isArray(plugin)) {
|
||||
const pluginName = plugin[0];
|
||||
const pluginConfig = plugin[1];
|
||||
if (typeof pluginName === 'string' && (typeof pluginConfig === 'boolean' || typeof pluginConfig === 'object' || typeof pluginConfig === 'string')) {
|
||||
parsed.push([
|
||||
pluginName,
|
||||
pluginConfig
|
||||
]);
|
||||
} else {
|
||||
if (typeof pluginName !== 'string') {
|
||||
console.error(`${red(bold('Error'))}: A PostCSS Plugin must be provided as a ${bold('string')}. Instead, we got: '${pluginName}'.\n` + 'Read more: https://nextjs.org/docs/messages/postcss-shape');
|
||||
} else {
|
||||
console.error(`${red(bold('Error'))}: A PostCSS Plugin was passed as an array but did not provide its configuration ('${pluginName}').\n` + 'Read more: https://nextjs.org/docs/messages/postcss-shape');
|
||||
}
|
||||
throw Object.defineProperty(new Error(genericErrorText), "__NEXT_ERROR_CODE", {
|
||||
value: "E1036",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
} else if (typeof plugin === 'function') {
|
||||
console.error(`${red(bold('Error'))}: A PostCSS Plugin was passed as a function using require(), but it must be provided as a ${bold('string')}.\nRead more: https://nextjs.org/docs/messages/postcss-shape`);
|
||||
throw Object.defineProperty(new Error(genericErrorText), "__NEXT_ERROR_CODE", {
|
||||
value: "E1036",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
} else {
|
||||
console.error(`${red(bold('Error'))}: An unknown PostCSS plugin was provided (${plugin}).\n` + 'Read more: https://nextjs.org/docs/messages/postcss-shape');
|
||||
throw Object.defineProperty(new Error(genericErrorText), "__NEXT_ERROR_CODE", {
|
||||
value: "E1036",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
});
|
||||
const resolved = await Promise.all(parsed.map((p)=>loadPlugin(dir, p[0], p[1])));
|
||||
const filtered = resolved.filter(Boolean);
|
||||
return filtered;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=plugins.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
+27
@@ -0,0 +1,27 @@
|
||||
import curry from 'next/dist/compiled/lodash.curry';
|
||||
import { nextImageLoaderRegex } from '../../../../webpack-config';
|
||||
import { loader } from '../../helpers';
|
||||
import { pipe } from '../../utils';
|
||||
import { getCustomDocumentImageError } from './messages';
|
||||
export const images = curry(async function images(_ctx, config) {
|
||||
const fns = [
|
||||
loader({
|
||||
oneOf: [
|
||||
{
|
||||
test: nextImageLoaderRegex,
|
||||
use: {
|
||||
loader: 'error-loader',
|
||||
options: {
|
||||
reason: getCustomDocumentImageError()
|
||||
}
|
||||
},
|
||||
issuer: /pages[\\/]_document\./
|
||||
}
|
||||
]
|
||||
})
|
||||
];
|
||||
const fn = pipe(...fns);
|
||||
return fn(config);
|
||||
});
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../src/build/webpack/config/blocks/images/index.ts"],"sourcesContent":["import curry from 'next/dist/compiled/lodash.curry'\nimport type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport { nextImageLoaderRegex } from '../../../../webpack-config'\nimport { loader } from '../../helpers'\nimport { pipe } from '../../utils'\nimport type { ConfigurationContext, ConfigurationFn } from '../../utils'\nimport { getCustomDocumentImageError } from './messages'\n\nexport const images = curry(async function images(\n _ctx: ConfigurationContext,\n config: webpack.Configuration\n) {\n const fns: ConfigurationFn[] = [\n loader({\n oneOf: [\n {\n test: nextImageLoaderRegex,\n use: {\n loader: 'error-loader',\n options: {\n reason: getCustomDocumentImageError(),\n },\n },\n issuer: /pages[\\\\/]_document\\./,\n },\n ],\n }),\n ]\n\n const fn = pipe(...fns)\n return fn(config)\n})\n"],"names":["curry","nextImageLoaderRegex","loader","pipe","getCustomDocumentImageError","images","_ctx","config","fns","oneOf","test","use","options","reason","issuer","fn"],"mappings":"AAAA,OAAOA,WAAW,kCAAiC;AAEnD,SAASC,oBAAoB,QAAQ,6BAA4B;AACjE,SAASC,MAAM,QAAQ,gBAAe;AACtC,SAASC,IAAI,QAAQ,cAAa;AAElC,SAASC,2BAA2B,QAAQ,aAAY;AAExD,OAAO,MAAMC,SAASL,MAAM,eAAeK,OACzCC,IAA0B,EAC1BC,MAA6B;IAE7B,MAAMC,MAAyB;QAC7BN,OAAO;YACLO,OAAO;gBACL;oBACEC,MAAMT;oBACNU,KAAK;wBACHT,QAAQ;wBACRU,SAAS;4BACPC,QAAQT;wBACV;oBACF;oBACAU,QAAQ;gBACV;aACD;QACH;KACD;IAED,MAAMC,KAAKZ,QAAQK;IACnB,OAAOO,GAAGR;AACZ,GAAE","ignoreList":[0]}
|
||||
Generated
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
import { bold, cyan } from '../../../../../lib/picocolors';
|
||||
export function getCustomDocumentImageError() {
|
||||
return `Images ${bold('cannot')} be imported within ${cyan('pages/_document.js')}. Please move image imports that need to be displayed on every page into ${cyan('pages/_app.js')}.\nRead more: https://nextjs.org/docs/messages/custom-document-image-import`;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=messages.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../src/build/webpack/config/blocks/images/messages.ts"],"sourcesContent":["import { bold, cyan } from '../../../../../lib/picocolors'\n\nexport function getCustomDocumentImageError() {\n return `Images ${bold('cannot')} be imported within ${cyan(\n 'pages/_document.js'\n )}. Please move image imports that need to be displayed on every page into ${cyan(\n 'pages/_app.js'\n )}.\\nRead more: https://nextjs.org/docs/messages/custom-document-image-import`\n}\n"],"names":["bold","cyan","getCustomDocumentImageError"],"mappings":"AAAA,SAASA,IAAI,EAAEC,IAAI,QAAQ,gCAA+B;AAE1D,OAAO,SAASC;IACd,OAAO,CAAC,OAAO,EAAEF,KAAK,UAAU,oBAAoB,EAAEC,KACpD,sBACA,yEAAyE,EAAEA,KAC3E,iBACA,2EAA2E,CAAC;AAChF","ignoreList":[0]}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
import curry from 'next/dist/compiled/lodash.curry';
|
||||
export const loader = curry(function loader(rule, config) {
|
||||
var _config_module_rules;
|
||||
if (!config.module) {
|
||||
config.module = {
|
||||
rules: []
|
||||
};
|
||||
}
|
||||
if (rule.oneOf) {
|
||||
var _config_module_rules1;
|
||||
const existing = (_config_module_rules1 = config.module.rules) == null ? void 0 : _config_module_rules1.find((arrayRule)=>arrayRule && typeof arrayRule === 'object' && arrayRule.oneOf);
|
||||
if (existing && typeof existing === 'object') {
|
||||
existing.oneOf.push(...rule.oneOf);
|
||||
return config;
|
||||
}
|
||||
}
|
||||
(_config_module_rules = config.module.rules) == null ? void 0 : _config_module_rules.push(rule);
|
||||
return config;
|
||||
});
|
||||
export const unshiftLoader = curry(function unshiftLoader(rule, config) {
|
||||
var _config_module_rules;
|
||||
if (!config.module) {
|
||||
config.module = {
|
||||
rules: []
|
||||
};
|
||||
}
|
||||
if (rule.oneOf) {
|
||||
var _config_module_rules1;
|
||||
const existing = (_config_module_rules1 = config.module.rules) == null ? void 0 : _config_module_rules1.find((arrayRule)=>arrayRule && typeof arrayRule === 'object' && arrayRule.oneOf);
|
||||
if (existing && typeof existing === 'object') {
|
||||
var _existing_oneOf;
|
||||
(_existing_oneOf = existing.oneOf) == null ? void 0 : _existing_oneOf.unshift(...rule.oneOf);
|
||||
return config;
|
||||
}
|
||||
}
|
||||
(_config_module_rules = config.module.rules) == null ? void 0 : _config_module_rules.unshift(rule);
|
||||
return config;
|
||||
});
|
||||
export const plugin = curry(function plugin(p, config) {
|
||||
if (!config.plugins) {
|
||||
config.plugins = [];
|
||||
}
|
||||
config.plugins.push(p);
|
||||
return config;
|
||||
});
|
||||
|
||||
//# sourceMappingURL=helpers.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/config/helpers.ts"],"sourcesContent":["import curry from 'next/dist/compiled/lodash.curry'\nimport type { webpack } from 'next/dist/compiled/webpack/webpack'\n\nexport const loader = curry(function loader(\n rule: webpack.RuleSetRule,\n config: webpack.Configuration\n) {\n if (!config.module) {\n config.module = { rules: [] }\n }\n\n if (rule.oneOf) {\n const existing = config.module.rules?.find(\n (arrayRule) =>\n arrayRule && typeof arrayRule === 'object' && arrayRule.oneOf\n )\n if (existing && typeof existing === 'object') {\n existing.oneOf!.push(...rule.oneOf)\n return config\n }\n }\n\n config.module.rules?.push(rule)\n return config\n})\n\nexport const unshiftLoader = curry(function unshiftLoader(\n rule: webpack.RuleSetRule,\n config: webpack.Configuration\n) {\n if (!config.module) {\n config.module = { rules: [] }\n }\n\n if (rule.oneOf) {\n const existing = config.module.rules?.find(\n (arrayRule) =>\n arrayRule && typeof arrayRule === 'object' && arrayRule.oneOf\n )\n if (existing && typeof existing === 'object') {\n existing.oneOf?.unshift(...rule.oneOf)\n return config\n }\n }\n\n config.module.rules?.unshift(rule)\n return config\n})\n\nexport const plugin = curry(function plugin(\n p: webpack.WebpackPluginInstance,\n config: webpack.Configuration\n) {\n if (!config.plugins) {\n config.plugins = []\n }\n config.plugins.push(p)\n return config\n})\n"],"names":["curry","loader","rule","config","module","rules","oneOf","existing","find","arrayRule","push","unshiftLoader","unshift","plugin","p","plugins"],"mappings":"AAAA,OAAOA,WAAW,kCAAiC;AAGnD,OAAO,MAAMC,SAASD,MAAM,SAASC,OACnCC,IAAyB,EACzBC,MAA6B;QAiB7BA;IAfA,IAAI,CAACA,OAAOC,MAAM,EAAE;QAClBD,OAAOC,MAAM,GAAG;YAAEC,OAAO,EAAE;QAAC;IAC9B;IAEA,IAAIH,KAAKI,KAAK,EAAE;YACGH;QAAjB,MAAMI,YAAWJ,wBAAAA,OAAOC,MAAM,CAACC,KAAK,qBAAnBF,sBAAqBK,IAAI,CACxC,CAACC,YACCA,aAAa,OAAOA,cAAc,YAAYA,UAAUH,KAAK;QAEjE,IAAIC,YAAY,OAAOA,aAAa,UAAU;YAC5CA,SAASD,KAAK,CAAEI,IAAI,IAAIR,KAAKI,KAAK;YAClC,OAAOH;QACT;IACF;KAEAA,uBAAAA,OAAOC,MAAM,CAACC,KAAK,qBAAnBF,qBAAqBO,IAAI,CAACR;IAC1B,OAAOC;AACT,GAAE;AAEF,OAAO,MAAMQ,gBAAgBX,MAAM,SAASW,cAC1CT,IAAyB,EACzBC,MAA6B;QAiB7BA;IAfA,IAAI,CAACA,OAAOC,MAAM,EAAE;QAClBD,OAAOC,MAAM,GAAG;YAAEC,OAAO,EAAE;QAAC;IAC9B;IAEA,IAAIH,KAAKI,KAAK,EAAE;YACGH;QAAjB,MAAMI,YAAWJ,wBAAAA,OAAOC,MAAM,CAACC,KAAK,qBAAnBF,sBAAqBK,IAAI,CACxC,CAACC,YACCA,aAAa,OAAOA,cAAc,YAAYA,UAAUH,KAAK;QAEjE,IAAIC,YAAY,OAAOA,aAAa,UAAU;gBAC5CA;aAAAA,kBAAAA,SAASD,KAAK,qBAAdC,gBAAgBK,OAAO,IAAIV,KAAKI,KAAK;YACrC,OAAOH;QACT;IACF;KAEAA,uBAAAA,OAAOC,MAAM,CAACC,KAAK,qBAAnBF,qBAAqBS,OAAO,CAACV;IAC7B,OAAOC;AACT,GAAE;AAEF,OAAO,MAAMU,SAASb,MAAM,SAASa,OACnCC,CAAgC,EAChCX,MAA6B;IAE7B,IAAI,CAACA,OAAOY,OAAO,EAAE;QACnBZ,OAAOY,OAAO,GAAG,EAAE;IACrB;IACAZ,OAAOY,OAAO,CAACL,IAAI,CAACI;IACpB,OAAOX;AACT,GAAE","ignoreList":[0]}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
import { base } from './blocks/base';
|
||||
import { css } from './blocks/css';
|
||||
import { images } from './blocks/images';
|
||||
import { pipe } from './utils';
|
||||
export async function buildConfiguration(config, { hasAppDir, supportedBrowsers, rootDirectory, customAppFile, isDevelopment, isServer, isEdgeRuntime, targetWeb, assetPrefix, sassOptions, productionBrowserSourceMaps, future, transpilePackages, experimental, disableStaticImages, serverSourceMaps, deploymentId }) {
|
||||
const ctx = {
|
||||
hasAppDir,
|
||||
supportedBrowsers,
|
||||
rootDirectory,
|
||||
customAppFile,
|
||||
isDevelopment,
|
||||
isProduction: !isDevelopment,
|
||||
isServer,
|
||||
isEdgeRuntime,
|
||||
isClient: !isServer,
|
||||
targetWeb,
|
||||
assetPrefix: assetPrefix ? assetPrefix.endsWith('/') ? assetPrefix.slice(0, -1) : assetPrefix : '',
|
||||
sassOptions,
|
||||
productionBrowserSourceMaps,
|
||||
transpilePackages,
|
||||
future,
|
||||
experimental,
|
||||
serverSourceMaps: serverSourceMaps ?? false,
|
||||
deploymentId
|
||||
};
|
||||
let fns = [
|
||||
base(ctx),
|
||||
css(ctx)
|
||||
];
|
||||
if (!disableStaticImages) {
|
||||
fns.push(images(ctx));
|
||||
}
|
||||
const fn = pipe(...fns);
|
||||
return fn(config);
|
||||
}
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/config/index.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport type { NextConfigComplete } from '../../../server/config-shared'\nimport type { ConfigurationContext } from './utils'\n\nimport { base } from './blocks/base'\nimport { css } from './blocks/css'\nimport { images } from './blocks/images'\nimport { pipe } from './utils'\n\nexport async function buildConfiguration(\n config: webpack.Configuration,\n {\n hasAppDir,\n supportedBrowsers,\n rootDirectory,\n customAppFile,\n isDevelopment,\n isServer,\n isEdgeRuntime,\n targetWeb,\n assetPrefix,\n sassOptions,\n productionBrowserSourceMaps,\n future,\n transpilePackages,\n experimental,\n disableStaticImages,\n serverSourceMaps,\n deploymentId,\n }: {\n hasAppDir: boolean\n supportedBrowsers: string[] | undefined\n rootDirectory: string\n customAppFile: RegExp | undefined\n isDevelopment: boolean\n isServer: boolean\n isEdgeRuntime: boolean\n targetWeb: boolean\n assetPrefix: string\n sassOptions: any\n productionBrowserSourceMaps: boolean\n transpilePackages: NextConfigComplete['transpilePackages']\n // @ts-expect-error TODO: remove any\n future: NextConfigComplete['future']\n experimental: NextConfigComplete['experimental']\n disableStaticImages: NextConfigComplete['images']['disableStaticImages']\n serverSourceMaps: NextConfigComplete['experimental']['serverSourceMaps']\n deploymentId?: string\n }\n): Promise<webpack.Configuration> {\n const ctx: ConfigurationContext = {\n hasAppDir,\n supportedBrowsers,\n rootDirectory,\n customAppFile,\n isDevelopment,\n isProduction: !isDevelopment,\n isServer,\n isEdgeRuntime,\n isClient: !isServer,\n targetWeb,\n assetPrefix: assetPrefix\n ? assetPrefix.endsWith('/')\n ? assetPrefix.slice(0, -1)\n : assetPrefix\n : '',\n sassOptions,\n productionBrowserSourceMaps,\n transpilePackages,\n future,\n experimental,\n serverSourceMaps: serverSourceMaps ?? false,\n deploymentId,\n }\n\n let fns = [base(ctx), css(ctx)]\n if (!disableStaticImages) {\n fns.push(images(ctx))\n }\n const fn = pipe(...fns)\n return fn(config)\n}\n"],"names":["base","css","images","pipe","buildConfiguration","config","hasAppDir","supportedBrowsers","rootDirectory","customAppFile","isDevelopment","isServer","isEdgeRuntime","targetWeb","assetPrefix","sassOptions","productionBrowserSourceMaps","future","transpilePackages","experimental","disableStaticImages","serverSourceMaps","deploymentId","ctx","isProduction","isClient","endsWith","slice","fns","push","fn"],"mappings":"AAIA,SAASA,IAAI,QAAQ,gBAAe;AACpC,SAASC,GAAG,QAAQ,eAAc;AAClC,SAASC,MAAM,QAAQ,kBAAiB;AACxC,SAASC,IAAI,QAAQ,UAAS;AAE9B,OAAO,eAAeC,mBACpBC,MAA6B,EAC7B,EACEC,SAAS,EACTC,iBAAiB,EACjBC,aAAa,EACbC,aAAa,EACbC,aAAa,EACbC,QAAQ,EACRC,aAAa,EACbC,SAAS,EACTC,WAAW,EACXC,WAAW,EACXC,2BAA2B,EAC3BC,MAAM,EACNC,iBAAiB,EACjBC,YAAY,EACZC,mBAAmB,EACnBC,gBAAgB,EAChBC,YAAY,EAoBb;IAED,MAAMC,MAA4B;QAChCjB;QACAC;QACAC;QACAC;QACAC;QACAc,cAAc,CAACd;QACfC;QACAC;QACAa,UAAU,CAACd;QACXE;QACAC,aAAaA,cACTA,YAAYY,QAAQ,CAAC,OACnBZ,YAAYa,KAAK,CAAC,GAAG,CAAC,KACtBb,cACF;QACJC;QACAC;QACAE;QACAD;QACAE;QACAE,kBAAkBA,oBAAoB;QACtCC;IACF;IAEA,IAAIM,MAAM;QAAC5B,KAAKuB;QAAMtB,IAAIsB;KAAK;IAC/B,IAAI,CAACH,qBAAqB;QACxBQ,IAAIC,IAAI,CAAC3B,OAAOqB;IAClB;IACA,MAAMO,KAAK3B,QAAQyB;IACnB,OAAOE,GAAGzB;AACZ","ignoreList":[0]}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
export const pipe = (...fns)=>(param)=>fns.reduce(async (result, next)=>next(await result), param);
|
||||
|
||||
//# sourceMappingURL=utils.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/config/utils.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\nimport type { NextConfigComplete } from '../../../server/config-shared'\n\nexport type ConfigurationContext = {\n // If the `appDir` feature is enabled\n hasAppDir: boolean\n // If the current rule matches a resource in the app layer\n isAppDir?: boolean\n supportedBrowsers: string[] | undefined\n rootDirectory: string\n customAppFile: RegExp | undefined\n\n isDevelopment: boolean\n isProduction: boolean\n\n isServer: boolean\n isClient: boolean\n isEdgeRuntime: boolean\n targetWeb: boolean\n\n assetPrefix: string\n\n sassOptions: any\n productionBrowserSourceMaps: boolean\n serverSourceMaps: boolean\n\n transpilePackages: NextConfigComplete['transpilePackages']\n\n // @ts-expect-error TODO: remove any\n future: NextConfigComplete['future']\n experimental: NextConfigComplete['experimental']\n\n deploymentId?: string\n}\n\nexport type ConfigurationFn = (\n a: webpack.Configuration\n) => webpack.Configuration\n\nexport const pipe =\n <R>(...fns: Array<(a: R) => R | Promise<R>>) =>\n (param: R) =>\n fns.reduce(\n async (result: R | Promise<R>, next) => next(await result),\n param\n )\n"],"names":["pipe","fns","param","reduce","result","next"],"mappings":"AAuCA,OAAO,MAAMA,OACX,CAAI,GAAGC,MACP,CAACC,QACCD,IAAIE,MAAM,CACR,OAAOC,QAAwBC,OAASA,KAAK,MAAMD,SACnDF,OACD","ignoreList":[0]}
|
||||
Generated
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
export default class CssSyntaxError extends Error {
|
||||
constructor(error){
|
||||
super(error);
|
||||
const { reason, line, column } = error;
|
||||
this.name = 'CssSyntaxError';
|
||||
// Based on https://github.com/postcss/postcss/blob/master/lib/css-syntax-error.es6#L132
|
||||
// We don't need `plugin` and `file` properties.
|
||||
this.message = `${this.name}\n\n`;
|
||||
if (typeof line !== 'undefined') {
|
||||
this.message += `(${line}:${column}) `;
|
||||
}
|
||||
this.message += reason;
|
||||
const code = error.showSourceCode();
|
||||
if (code) {
|
||||
this.message += `\n\n${code}\n`;
|
||||
}
|
||||
// We don't need stack https://github.com/postcss/postcss/blob/master/docs/guidelines/runner.md#31-dont-show-js-stack-for-csssyntaxerror
|
||||
this.stack = false;
|
||||
}
|
||||
}
|
||||
|
||||
//# sourceMappingURL=CssSyntaxError.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../src/build/webpack/loaders/css-loader/src/CssSyntaxError.ts"],"sourcesContent":["export default class CssSyntaxError extends Error {\n stack: any\n constructor(error: any) {\n super(error)\n\n const { reason, line, column } = error\n\n this.name = 'CssSyntaxError'\n\n // Based on https://github.com/postcss/postcss/blob/master/lib/css-syntax-error.es6#L132\n // We don't need `plugin` and `file` properties.\n this.message = `${this.name}\\n\\n`\n\n if (typeof line !== 'undefined') {\n this.message += `(${line}:${column}) `\n }\n\n this.message += reason\n\n const code = error.showSourceCode()\n\n if (code) {\n this.message += `\\n\\n${code}\\n`\n }\n\n // We don't need stack https://github.com/postcss/postcss/blob/master/docs/guidelines/runner.md#31-dont-show-js-stack-for-csssyntaxerror\n this.stack = false\n }\n}\n"],"names":["CssSyntaxError","Error","constructor","error","reason","line","column","name","message","code","showSourceCode","stack"],"mappings":"AAAA,eAAe,MAAMA,uBAAuBC;IAE1CC,YAAYC,KAAU,CAAE;QACtB,KAAK,CAACA;QAEN,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAGH;QAEjC,IAAI,CAACI,IAAI,GAAG;QAEZ,wFAAwF;QACxF,gDAAgD;QAChD,IAAI,CAACC,OAAO,GAAG,GAAG,IAAI,CAACD,IAAI,CAAC,IAAI,CAAC;QAEjC,IAAI,OAAOF,SAAS,aAAa;YAC/B,IAAI,CAACG,OAAO,IAAI,CAAC,CAAC,EAAEH,KAAK,CAAC,EAAEC,OAAO,EAAE,CAAC;QACxC;QAEA,IAAI,CAACE,OAAO,IAAIJ;QAEhB,MAAMK,OAAON,MAAMO,cAAc;QAEjC,IAAID,MAAM;YACR,IAAI,CAACD,OAAO,IAAI,CAAC,IAAI,EAAEC,KAAK,EAAE,CAAC;QACjC;QAEA,wIAAwI;QACxI,IAAI,CAACE,KAAK,GAAG;IACf;AACF","ignoreList":[0]}
|
||||
Generated
Vendored
+83
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/ const preserveCamelCase = (string, locale)=>{
|
||||
let isLastCharLower = false;
|
||||
let isLastCharUpper = false;
|
||||
let isLastLastCharUpper = false;
|
||||
for(let i = 0; i < string.length; i++){
|
||||
const character = string[i];
|
||||
if (isLastCharLower && /[\p{Lu}]/u.test(character)) {
|
||||
string = string.slice(0, i) + '-' + string.slice(i);
|
||||
isLastCharLower = false;
|
||||
isLastLastCharUpper = isLastCharUpper;
|
||||
isLastCharUpper = true;
|
||||
i++;
|
||||
} else if (isLastCharUpper && isLastLastCharUpper && /[\p{Ll}]/u.test(character)) {
|
||||
string = string.slice(0, i - 1) + '-' + string.slice(i - 1);
|
||||
isLastLastCharUpper = isLastCharUpper;
|
||||
isLastCharUpper = false;
|
||||
isLastCharLower = true;
|
||||
} else {
|
||||
isLastCharLower = character.toLocaleLowerCase(locale) === character && character.toLocaleUpperCase(locale) !== character;
|
||||
isLastLastCharUpper = isLastCharUpper;
|
||||
isLastCharUpper = character.toLocaleUpperCase(locale) === character && character.toLocaleLowerCase(locale) !== character;
|
||||
}
|
||||
}
|
||||
return string;
|
||||
};
|
||||
const preserveConsecutiveUppercase = (input)=>{
|
||||
return input.replace(/^[\p{Lu}](?![\p{Lu}])/gu, (m1)=>m1.toLowerCase());
|
||||
};
|
||||
const postProcess = (input, options)=>{
|
||||
return input.replace(/[_.\- ]+([\p{Alpha}\p{N}_]|$)/gu, (_, p1)=>p1.toLocaleUpperCase(options.locale)).replace(/\d+([\p{Alpha}\p{N}_]|$)/gu, (m)=>m.toLocaleUpperCase(options.locale));
|
||||
};
|
||||
const camelCase = (input, options)=>{
|
||||
if (!(typeof input === 'string' || Array.isArray(input))) {
|
||||
throw Object.defineProperty(new TypeError('Expected the input to be `string | string[]`'), "__NEXT_ERROR_CODE", {
|
||||
value: "E613",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
options = {
|
||||
pascalCase: false,
|
||||
preserveConsecutiveUppercase: false,
|
||||
...options
|
||||
};
|
||||
if (Array.isArray(input)) {
|
||||
input = input.map((x)=>x.trim()).filter((x)=>x.length).join('-');
|
||||
} else {
|
||||
input = input.trim();
|
||||
}
|
||||
if (input.length === 0) {
|
||||
return '';
|
||||
}
|
||||
if (input.length === 1) {
|
||||
return options.pascalCase ? input.toLocaleUpperCase(options.locale) : input.toLocaleLowerCase(options.locale);
|
||||
}
|
||||
const hasUpperCase = input !== input.toLocaleLowerCase(options.locale);
|
||||
if (hasUpperCase) {
|
||||
input = preserveCamelCase(input, options.locale);
|
||||
}
|
||||
input = input.replace(/^[_.\- ]+/, '');
|
||||
if (options.preserveConsecutiveUppercase) {
|
||||
input = preserveConsecutiveUppercase(input);
|
||||
} else {
|
||||
input = input.toLocaleLowerCase();
|
||||
}
|
||||
if (options.pascalCase) {
|
||||
input = input.charAt(0).toLocaleUpperCase(options.locale) + input.slice(1);
|
||||
}
|
||||
return postProcess(input, options);
|
||||
};
|
||||
export default camelCase;
|
||||
|
||||
//# sourceMappingURL=camelcase.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+273
@@ -0,0 +1,273 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/ import CssSyntaxError from './CssSyntaxError';
|
||||
import Warning from '../../postcss-loader/src/Warning';
|
||||
import { stringifyRequest } from '../../../stringify-request';
|
||||
const moduleRegExp = /\.module\.\w+$/i;
|
||||
function getModulesOptions(rawOptions, loaderContext) {
|
||||
const { resourcePath } = loaderContext;
|
||||
if (typeof rawOptions.modules === 'undefined') {
|
||||
const isModules = moduleRegExp.test(resourcePath);
|
||||
if (!isModules) {
|
||||
return false;
|
||||
}
|
||||
} else if (typeof rawOptions.modules === 'boolean' && rawOptions.modules === false) {
|
||||
return false;
|
||||
}
|
||||
let modulesOptions = {
|
||||
compileType: rawOptions.icss ? 'icss' : 'module',
|
||||
auto: true,
|
||||
mode: 'local',
|
||||
exportGlobals: false,
|
||||
localIdentName: '[hash:base64]',
|
||||
localIdentContext: loaderContext.rootContext,
|
||||
localIdentHashPrefix: '',
|
||||
localIdentRegExp: undefined,
|
||||
namedExport: false,
|
||||
exportLocalsConvention: 'asIs',
|
||||
exportOnlyLocals: false
|
||||
};
|
||||
if (typeof rawOptions.modules === 'boolean' || typeof rawOptions.modules === 'string') {
|
||||
modulesOptions.mode = typeof rawOptions.modules === 'string' ? rawOptions.modules : 'local';
|
||||
} else {
|
||||
if (rawOptions.modules) {
|
||||
if (typeof rawOptions.modules.auto === 'boolean') {
|
||||
const isModules = rawOptions.modules.auto && moduleRegExp.test(resourcePath);
|
||||
if (!isModules) {
|
||||
return false;
|
||||
}
|
||||
} else if (rawOptions.modules.auto instanceof RegExp) {
|
||||
const isModules = rawOptions.modules.auto.test(resourcePath);
|
||||
if (!isModules) {
|
||||
return false;
|
||||
}
|
||||
} else if (typeof rawOptions.modules.auto === 'function') {
|
||||
const isModule = rawOptions.modules.auto(resourcePath);
|
||||
if (!isModule) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (rawOptions.modules.namedExport === true && typeof rawOptions.modules.exportLocalsConvention === 'undefined') {
|
||||
modulesOptions.exportLocalsConvention = 'camelCaseOnly';
|
||||
}
|
||||
}
|
||||
modulesOptions = {
|
||||
...modulesOptions,
|
||||
...rawOptions.modules || {}
|
||||
};
|
||||
}
|
||||
if (typeof modulesOptions.mode === 'function') {
|
||||
modulesOptions.mode = modulesOptions.mode(loaderContext.resourcePath);
|
||||
}
|
||||
if (modulesOptions.namedExport === true) {
|
||||
if (rawOptions.esModule === false) {
|
||||
throw Object.defineProperty(new Error('The "modules.namedExport" option requires the "esModules" option to be enabled'), "__NEXT_ERROR_CODE", {
|
||||
value: "E103",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
if (modulesOptions.exportLocalsConvention !== 'camelCaseOnly') {
|
||||
throw Object.defineProperty(new Error('The "modules.namedExport" option requires the "modules.exportLocalsConvention" option to be "camelCaseOnly"'), "__NEXT_ERROR_CODE", {
|
||||
value: "E23",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
return modulesOptions;
|
||||
}
|
||||
function normalizeOptions(rawOptions, loaderContext) {
|
||||
if (rawOptions.icss) {
|
||||
loaderContext.emitWarning(Object.defineProperty(new Error('The "icss" option is deprecated, use "modules.compileType: "icss"" instead'), "__NEXT_ERROR_CODE", {
|
||||
value: "E476",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
}));
|
||||
}
|
||||
const modulesOptions = getModulesOptions(rawOptions, loaderContext);
|
||||
return {
|
||||
url: typeof rawOptions.url === 'undefined' ? true : rawOptions.url,
|
||||
import: typeof rawOptions.import === 'undefined' ? true : rawOptions.import,
|
||||
modules: modulesOptions,
|
||||
// TODO remove in the next major release
|
||||
icss: typeof rawOptions.icss === 'undefined' ? false : rawOptions.icss,
|
||||
sourceMap: typeof rawOptions.sourceMap === 'boolean' ? rawOptions.sourceMap : loaderContext.sourceMap,
|
||||
importLoaders: typeof rawOptions.importLoaders === 'string' ? parseInt(rawOptions.importLoaders, 10) : rawOptions.importLoaders,
|
||||
esModule: typeof rawOptions.esModule === 'undefined' ? true : rawOptions.esModule,
|
||||
fontLoader: rawOptions.fontLoader
|
||||
};
|
||||
}
|
||||
export default async function loader(content, map, meta) {
|
||||
const rawOptions = this.getOptions();
|
||||
const plugins = [];
|
||||
const callback = this.async();
|
||||
const loaderSpan = this.currentTraceSpan.traceChild('css-loader');
|
||||
loaderSpan.traceAsyncFn(async ()=>{
|
||||
let options;
|
||||
try {
|
||||
options = normalizeOptions(rawOptions, this);
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
const { postcss } = await rawOptions.postcss();
|
||||
const { shouldUseModulesPlugins, shouldUseImportPlugin, shouldUseURLPlugin, shouldUseIcssPlugin, getPreRequester, getExportCode, getFilter, getImportCode, getModuleCode, getModulesPlugins, normalizeSourceMap, sort } = require('./utils');
|
||||
const { icssParser, importParser, urlParser } = require('./plugins');
|
||||
const replacements = [];
|
||||
// if it's a font loader next-font-loader will have exports that should be exported as is
|
||||
const exports = options.fontLoader ? meta.exports : [];
|
||||
if (shouldUseModulesPlugins(options)) {
|
||||
plugins.push(...getModulesPlugins(options, this, meta));
|
||||
}
|
||||
const importPluginImports = [];
|
||||
const importPluginApi = [];
|
||||
if (shouldUseImportPlugin(options)) {
|
||||
const resolver = this.getResolve({
|
||||
conditionNames: [
|
||||
'style'
|
||||
],
|
||||
extensions: [
|
||||
'.css'
|
||||
],
|
||||
mainFields: [
|
||||
'css',
|
||||
'style',
|
||||
'main',
|
||||
'...'
|
||||
],
|
||||
mainFiles: [
|
||||
'index',
|
||||
'...'
|
||||
],
|
||||
restrictions: [
|
||||
/\.css$/i
|
||||
]
|
||||
});
|
||||
plugins.push(importParser({
|
||||
imports: importPluginImports,
|
||||
api: importPluginApi,
|
||||
context: this.context,
|
||||
rootContext: this.rootContext,
|
||||
filter: getFilter(options.import, this.resourcePath),
|
||||
resolver,
|
||||
urlHandler: (url)=>stringifyRequest(this, getPreRequester(this)(options.importLoaders) + url)
|
||||
}));
|
||||
}
|
||||
const urlPluginImports = [];
|
||||
if (shouldUseURLPlugin(options)) {
|
||||
const urlResolver = this.getResolve({
|
||||
conditionNames: [
|
||||
'asset'
|
||||
],
|
||||
mainFields: [
|
||||
'asset'
|
||||
],
|
||||
mainFiles: [],
|
||||
extensions: []
|
||||
});
|
||||
plugins.push(urlParser({
|
||||
imports: urlPluginImports,
|
||||
replacements,
|
||||
context: this.context,
|
||||
rootContext: this.rootContext,
|
||||
filter: getFilter(options.url, this.resourcePath),
|
||||
resolver: urlResolver,
|
||||
urlHandler: (url)=>stringifyRequest(this, url),
|
||||
deploymentId: rawOptions.deploymentId
|
||||
}));
|
||||
}
|
||||
const icssPluginImports = [];
|
||||
const icssPluginApi = [];
|
||||
if (shouldUseIcssPlugin(options)) {
|
||||
const icssResolver = this.getResolve({
|
||||
conditionNames: [
|
||||
'style'
|
||||
],
|
||||
extensions: [],
|
||||
mainFields: [
|
||||
'css',
|
||||
'style',
|
||||
'main',
|
||||
'...'
|
||||
],
|
||||
mainFiles: [
|
||||
'index',
|
||||
'...'
|
||||
]
|
||||
});
|
||||
plugins.push(icssParser({
|
||||
imports: icssPluginImports,
|
||||
api: icssPluginApi,
|
||||
replacements,
|
||||
exports,
|
||||
context: this.context,
|
||||
rootContext: this.rootContext,
|
||||
resolver: icssResolver,
|
||||
urlHandler: (url)=>stringifyRequest(this, getPreRequester(this)(options.importLoaders) + url)
|
||||
}));
|
||||
}
|
||||
// Reuse CSS AST (PostCSS AST e.g 'postcss-loader') to avoid reparsing
|
||||
if (meta) {
|
||||
const { ast } = meta;
|
||||
if (ast && ast.type === 'postcss') {
|
||||
content = ast.root;
|
||||
loaderSpan.setAttribute('astUsed', 'true');
|
||||
}
|
||||
}
|
||||
const { resourcePath } = this;
|
||||
let result;
|
||||
try {
|
||||
result = await postcss(plugins).process(content, {
|
||||
from: resourcePath,
|
||||
to: resourcePath,
|
||||
map: options.sourceMap ? {
|
||||
prev: map ? normalizeSourceMap(map, resourcePath) : null,
|
||||
inline: false,
|
||||
annotation: false
|
||||
} : false
|
||||
});
|
||||
} catch (error) {
|
||||
if (error.file) {
|
||||
this.addDependency(error.file);
|
||||
}
|
||||
throw error.name === 'CssSyntaxError' ? Object.defineProperty(new CssSyntaxError(error), "__NEXT_ERROR_CODE", {
|
||||
value: "E394",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
}) : error;
|
||||
}
|
||||
for (const warning of result.warnings()){
|
||||
this.emitWarning(Object.defineProperty(new Warning(warning), "__NEXT_ERROR_CODE", {
|
||||
value: "E394",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
}));
|
||||
}
|
||||
const imports = [
|
||||
...icssPluginImports.sort(sort),
|
||||
...importPluginImports.sort(sort),
|
||||
...urlPluginImports.sort(sort)
|
||||
];
|
||||
const api = [
|
||||
...importPluginApi.sort(sort),
|
||||
...icssPluginApi.sort(sort)
|
||||
];
|
||||
if (options.modules.exportOnlyLocals !== true) {
|
||||
imports.unshift({
|
||||
importName: '___CSS_LOADER_API_IMPORT___',
|
||||
url: stringifyRequest(this, require.resolve('./runtime/api'))
|
||||
});
|
||||
}
|
||||
const importCode = getImportCode(imports, options);
|
||||
const moduleCode = getModuleCode(result, api, replacements, options, this);
|
||||
const exportCode = getExportCode(exports, replacements, options);
|
||||
return `${importCode}${moduleCode}${exportCode}`;
|
||||
}).then((code)=>{
|
||||
callback(null, code);
|
||||
}, (err)=>{
|
||||
callback(err);
|
||||
});
|
||||
}
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
import importParser from './postcss-import-parser';
|
||||
import icssParser from './postcss-icss-parser';
|
||||
import urlParser from './postcss-url-parser';
|
||||
export { importParser, icssParser, urlParser };
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/loaders/css-loader/src/plugins/index.ts"],"sourcesContent":["import importParser from './postcss-import-parser'\nimport icssParser from './postcss-icss-parser'\nimport urlParser from './postcss-url-parser'\n\nexport { importParser, icssParser, urlParser }\n"],"names":["importParser","icssParser","urlParser"],"mappings":"AAAA,OAAOA,kBAAkB,0BAAyB;AAClD,OAAOC,gBAAgB,wBAAuB;AAC9C,OAAOC,eAAe,uBAAsB;AAE5C,SAASF,YAAY,EAAEC,UAAU,EAAEC,SAAS,GAAE","ignoreList":[0]}
|
||||
Generated
Vendored
+95
@@ -0,0 +1,95 @@
|
||||
import { extractICSS, replaceValueSymbols, replaceSymbols } from 'next/dist/compiled/icss-utils';
|
||||
import { normalizeUrl, resolveRequests, requestify } from '../utils';
|
||||
const plugin = (options = {})=>{
|
||||
return {
|
||||
postcssPlugin: 'postcss-icss-parser',
|
||||
async OnceExit (root) {
|
||||
const importReplacements = Object.create(null);
|
||||
const { icssImports, icssExports } = extractICSS(root);
|
||||
const imports = new Map();
|
||||
const tasks = [];
|
||||
for(const url in icssImports){
|
||||
const tokens = icssImports[url];
|
||||
if (Object.keys(tokens).length === 0) {
|
||||
continue;
|
||||
}
|
||||
let normalizedUrl = url;
|
||||
let prefix = '';
|
||||
const queryParts = normalizedUrl.split('!');
|
||||
if (queryParts.length > 1) {
|
||||
normalizedUrl = queryParts.pop();
|
||||
prefix = queryParts.join('!');
|
||||
}
|
||||
const request = requestify(normalizeUrl(normalizedUrl, true), options.rootContext);
|
||||
const doResolve = async ()=>{
|
||||
const { resolver, context } = options;
|
||||
const resolvedUrl = await resolveRequests(resolver, context, [
|
||||
...new Set([
|
||||
normalizedUrl,
|
||||
request
|
||||
])
|
||||
]);
|
||||
if (!resolvedUrl) {
|
||||
return;
|
||||
}
|
||||
return {
|
||||
url: resolvedUrl,
|
||||
prefix,
|
||||
tokens
|
||||
};
|
||||
};
|
||||
tasks.push(doResolve());
|
||||
}
|
||||
const results = await Promise.all(tasks);
|
||||
for(let index = 0; index <= results.length - 1; index++){
|
||||
const item = results[index];
|
||||
if (!item) {
|
||||
continue;
|
||||
}
|
||||
const newUrl = item.prefix ? `${item.prefix}!${item.url}` : item.url;
|
||||
const importKey = newUrl;
|
||||
let importName = imports.get(importKey);
|
||||
if (!importName) {
|
||||
importName = `___CSS_LOADER_ICSS_IMPORT_${imports.size}___`;
|
||||
imports.set(importKey, importName);
|
||||
options.imports.push({
|
||||
type: 'icss_import',
|
||||
importName,
|
||||
url: options.urlHandler(newUrl),
|
||||
icss: true,
|
||||
index
|
||||
});
|
||||
options.api.push({
|
||||
importName,
|
||||
dedupe: true,
|
||||
index
|
||||
});
|
||||
}
|
||||
for (const [replacementIndex, token] of Object.keys(item.tokens).entries()){
|
||||
const replacementName = `___CSS_LOADER_ICSS_IMPORT_${index}_REPLACEMENT_${replacementIndex}___`;
|
||||
const localName = item.tokens[token];
|
||||
importReplacements[token] = replacementName;
|
||||
options.replacements.push({
|
||||
replacementName,
|
||||
importName,
|
||||
localName
|
||||
});
|
||||
}
|
||||
}
|
||||
if (Object.keys(importReplacements).length > 0) {
|
||||
replaceSymbols(root, importReplacements);
|
||||
}
|
||||
for (const name of Object.keys(icssExports)){
|
||||
const value = replaceValueSymbols(icssExports[name], importReplacements);
|
||||
options.exports.push({
|
||||
name,
|
||||
value
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
plugin.postcss = true;
|
||||
export default plugin;
|
||||
|
||||
//# sourceMappingURL=postcss-icss-parser.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+206
@@ -0,0 +1,206 @@
|
||||
import valueParser from 'next/dist/compiled/postcss-value-parser';
|
||||
import { normalizeUrl, resolveRequests, isUrlRequestable, requestify, // @ts-expect-error TODO: this export doesn't exist? Double check.
|
||||
WEBPACK_IGNORE_COMMENT_REGEXP } from '../utils';
|
||||
function parseNode(atRule, key) {
|
||||
// Convert only top-level @import
|
||||
if (atRule.parent.type !== 'root') {
|
||||
return;
|
||||
}
|
||||
if (atRule.raws && atRule.raws.afterName && atRule.raws.afterName.trim().length > 0) {
|
||||
const lastCommentIndex = atRule.raws.afterName.lastIndexOf('/*');
|
||||
const matched = atRule.raws.afterName.slice(lastCommentIndex).match(WEBPACK_IGNORE_COMMENT_REGEXP);
|
||||
if (matched && matched[2] === 'true') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
const prevNode = atRule.prev();
|
||||
if (prevNode && prevNode.type === 'comment') {
|
||||
const matched = prevNode.text.match(WEBPACK_IGNORE_COMMENT_REGEXP);
|
||||
if (matched && matched[2] === 'true') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Nodes do not exists - `@import url('http://') :root {}`
|
||||
if (atRule.nodes) {
|
||||
const error = Object.defineProperty(new Error("It looks like you didn't end your @import statement correctly. Child nodes are attached to it."), "__NEXT_ERROR_CODE", {
|
||||
value: "E341",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
error.node = atRule;
|
||||
throw error;
|
||||
}
|
||||
const { nodes: paramsNodes } = valueParser(atRule[key]);
|
||||
// No nodes - `@import ;`
|
||||
// Invalid type - `@import foo-bar;`
|
||||
if (paramsNodes.length === 0 || paramsNodes[0].type !== 'string' && paramsNodes[0].type !== 'function') {
|
||||
const error = Object.defineProperty(new Error(`Unable to find uri in "${atRule.toString()}"`), "__NEXT_ERROR_CODE", {
|
||||
value: "E215",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
error.node = atRule;
|
||||
throw error;
|
||||
}
|
||||
let isStringValue;
|
||||
let url;
|
||||
if (paramsNodes[0].type === 'string') {
|
||||
isStringValue = true;
|
||||
url = paramsNodes[0].value;
|
||||
} else {
|
||||
// Invalid function - `@import nourl(test.css);`
|
||||
if (paramsNodes[0].value.toLowerCase() !== 'url') {
|
||||
const error = Object.defineProperty(new Error(`Unable to find uri in "${atRule.toString()}"`), "__NEXT_ERROR_CODE", {
|
||||
value: "E215",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
error.node = atRule;
|
||||
throw error;
|
||||
}
|
||||
isStringValue = paramsNodes[0].nodes.length !== 0 && paramsNodes[0].nodes[0].type === 'string';
|
||||
url = isStringValue ? paramsNodes[0].nodes[0].value : valueParser.stringify(paramsNodes[0].nodes);
|
||||
}
|
||||
url = normalizeUrl(url, isStringValue);
|
||||
const isRequestable = isUrlRequestable(url);
|
||||
let prefix;
|
||||
if (isRequestable) {
|
||||
const queryParts = url.split('!');
|
||||
if (queryParts.length > 1) {
|
||||
url = queryParts.pop();
|
||||
prefix = queryParts.join('!');
|
||||
}
|
||||
}
|
||||
// Empty url - `@import "";` or `@import url();`
|
||||
if (url.trim().length === 0) {
|
||||
const error = Object.defineProperty(new Error(`Unable to find uri in "${atRule.toString()}"`), "__NEXT_ERROR_CODE", {
|
||||
value: "E215",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
error.node = atRule;
|
||||
throw error;
|
||||
}
|
||||
const mediaNodes = paramsNodes.slice(1);
|
||||
let media;
|
||||
if (mediaNodes.length > 0) {
|
||||
media = valueParser.stringify(mediaNodes).trim().toLowerCase();
|
||||
}
|
||||
return {
|
||||
atRule,
|
||||
prefix,
|
||||
url,
|
||||
media,
|
||||
isRequestable
|
||||
};
|
||||
}
|
||||
const plugin = (options = {})=>{
|
||||
return {
|
||||
postcssPlugin: 'postcss-import-parser',
|
||||
prepare (result) {
|
||||
const parsedAtRules = [];
|
||||
return {
|
||||
AtRule: {
|
||||
import (atRule) {
|
||||
let parsedAtRule;
|
||||
try {
|
||||
// @ts-expect-error TODO: there is no third argument?
|
||||
parsedAtRule = parseNode(atRule, 'params', result);
|
||||
} catch (error) {
|
||||
result.warn(error.message, {
|
||||
node: error.node
|
||||
});
|
||||
}
|
||||
if (!parsedAtRule) {
|
||||
return;
|
||||
}
|
||||
parsedAtRules.push(parsedAtRule);
|
||||
}
|
||||
},
|
||||
async OnceExit () {
|
||||
if (parsedAtRules.length === 0) {
|
||||
return;
|
||||
}
|
||||
const resolvedAtRules = await Promise.all(parsedAtRules.map(async (parsedAtRule)=>{
|
||||
const { atRule, isRequestable, prefix, url, media } = parsedAtRule;
|
||||
if (options.filter) {
|
||||
const needKeep = await options.filter(url, media);
|
||||
if (!needKeep) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (isRequestable) {
|
||||
const request = requestify(url, options.rootContext);
|
||||
const { resolver, context } = options;
|
||||
const resolvedUrl = await resolveRequests(resolver, context, [
|
||||
...new Set([
|
||||
request,
|
||||
url
|
||||
])
|
||||
]);
|
||||
if (!resolvedUrl) {
|
||||
return;
|
||||
}
|
||||
if (resolvedUrl === options.resourcePath) {
|
||||
atRule.remove();
|
||||
return;
|
||||
}
|
||||
atRule.remove();
|
||||
return {
|
||||
url: resolvedUrl,
|
||||
media,
|
||||
prefix,
|
||||
isRequestable
|
||||
};
|
||||
}
|
||||
atRule.remove();
|
||||
return {
|
||||
url,
|
||||
media,
|
||||
prefix,
|
||||
isRequestable
|
||||
};
|
||||
}));
|
||||
const urlToNameMap = new Map();
|
||||
for(let index = 0; index <= resolvedAtRules.length - 1; index++){
|
||||
const resolvedAtRule = resolvedAtRules[index];
|
||||
if (!resolvedAtRule) {
|
||||
continue;
|
||||
}
|
||||
const { url, isRequestable, media } = resolvedAtRule;
|
||||
if (!isRequestable) {
|
||||
options.api.push({
|
||||
url,
|
||||
media,
|
||||
index
|
||||
});
|
||||
continue;
|
||||
}
|
||||
const { prefix } = resolvedAtRule;
|
||||
const newUrl = prefix ? `${prefix}!${url}` : url;
|
||||
let importName = urlToNameMap.get(newUrl);
|
||||
if (!importName) {
|
||||
importName = `___CSS_LOADER_AT_RULE_IMPORT_${urlToNameMap.size}___`;
|
||||
urlToNameMap.set(newUrl, importName);
|
||||
options.imports.push({
|
||||
type: 'rule_import',
|
||||
importName,
|
||||
url: options.urlHandler(newUrl),
|
||||
index
|
||||
});
|
||||
}
|
||||
options.api.push({
|
||||
importName,
|
||||
media,
|
||||
index
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
plugin.postcss = true;
|
||||
export default plugin;
|
||||
|
||||
//# sourceMappingURL=postcss-import-parser.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+300
@@ -0,0 +1,300 @@
|
||||
import valueParser from 'next/dist/compiled/postcss-value-parser';
|
||||
import { resolveRequests, normalizeUrl, requestify, isUrlRequestable, isDataUrl, // @ts-expect-error TODO: this export doesn't exist? Double check.
|
||||
WEBPACK_IGNORE_COMMENT_REGEXP } from '../utils';
|
||||
const isUrlFunc = /url/i;
|
||||
const isImageSetFunc = /^(?:-webkit-)?image-set$/i;
|
||||
const needParseDeclaration = /(?:url|(?:-webkit-)?image-set)\(/i;
|
||||
function getNodeFromUrlFunc(node) {
|
||||
return node.nodes && node.nodes[0];
|
||||
}
|
||||
function getWebpackIgnoreCommentValue(index, nodes, inBetween) {
|
||||
if (index === 0 && typeof inBetween !== 'undefined') {
|
||||
return inBetween;
|
||||
}
|
||||
let prevValueNode = nodes[index - 1];
|
||||
if (!prevValueNode) {
|
||||
return;
|
||||
}
|
||||
if (prevValueNode.type === 'space') {
|
||||
if (!nodes[index - 2]) {
|
||||
return;
|
||||
}
|
||||
prevValueNode = nodes[index - 2];
|
||||
}
|
||||
if (prevValueNode.type !== 'comment') {
|
||||
return;
|
||||
}
|
||||
const matched = prevValueNode.value.match(WEBPACK_IGNORE_COMMENT_REGEXP);
|
||||
return matched && matched[2] === 'true';
|
||||
}
|
||||
function shouldHandleURL(url, declaration, result, isSupportDataURLInNewURL) {
|
||||
if (url.length === 0) {
|
||||
result.warn(`Unable to find uri in '${declaration.toString()}'`, {
|
||||
node: declaration
|
||||
});
|
||||
return false;
|
||||
}
|
||||
if (isDataUrl(url) && isSupportDataURLInNewURL) {
|
||||
try {
|
||||
decodeURIComponent(url);
|
||||
} catch (ignoreError) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (!isUrlRequestable(url)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function parseDeclaration(declaration, key, result, isSupportDataURLInNewURL) {
|
||||
if (!needParseDeclaration.test(declaration[key])) {
|
||||
return;
|
||||
}
|
||||
const parsed = valueParser(declaration.raws && declaration.raws.value && declaration.raws.value.raw ? declaration.raws.value.raw : declaration[key]);
|
||||
let inBetween;
|
||||
if (declaration.raws && declaration.raws.between) {
|
||||
const lastCommentIndex = declaration.raws.between.lastIndexOf('/*');
|
||||
const matched = declaration.raws.between.slice(lastCommentIndex).match(WEBPACK_IGNORE_COMMENT_REGEXP);
|
||||
if (matched) {
|
||||
inBetween = matched[2] === 'true';
|
||||
}
|
||||
}
|
||||
let isIgnoreOnDeclaration = false;
|
||||
const prevNode = declaration.prev();
|
||||
if (prevNode && prevNode.type === 'comment') {
|
||||
const matched = prevNode.text.match(WEBPACK_IGNORE_COMMENT_REGEXP);
|
||||
if (matched) {
|
||||
isIgnoreOnDeclaration = matched[2] === 'true';
|
||||
}
|
||||
}
|
||||
let needIgnore;
|
||||
const parsedURLs = [];
|
||||
parsed.walk((valueNode, index, valueNodes)=>{
|
||||
if (valueNode.type !== 'function') {
|
||||
return;
|
||||
}
|
||||
if (isUrlFunc.test(valueNode.value)) {
|
||||
needIgnore = getWebpackIgnoreCommentValue(index, valueNodes, inBetween);
|
||||
if (isIgnoreOnDeclaration && typeof needIgnore === 'undefined' || needIgnore) {
|
||||
if (needIgnore) {
|
||||
needIgnore = undefined;
|
||||
}
|
||||
return;
|
||||
}
|
||||
const { nodes } = valueNode;
|
||||
const isStringValue = nodes.length !== 0 && nodes[0].type === 'string';
|
||||
let url = isStringValue ? nodes[0].value : valueParser.stringify(nodes);
|
||||
url = normalizeUrl(url, isStringValue);
|
||||
// Do not traverse inside `url`
|
||||
if (!shouldHandleURL(url, declaration, result, isSupportDataURLInNewURL)) {
|
||||
return false;
|
||||
}
|
||||
const queryParts = url.split('!');
|
||||
let prefix;
|
||||
if (queryParts.length > 1) {
|
||||
url = queryParts.pop();
|
||||
prefix = queryParts.join('!');
|
||||
}
|
||||
parsedURLs.push({
|
||||
declaration,
|
||||
parsed,
|
||||
node: getNodeFromUrlFunc(valueNode),
|
||||
prefix,
|
||||
url,
|
||||
needQuotes: false
|
||||
});
|
||||
return false;
|
||||
} else if (isImageSetFunc.test(valueNode.value)) {
|
||||
for (const [innerIndex, nNode] of valueNode.nodes.entries()){
|
||||
const { type, value } = nNode;
|
||||
if (type === 'function' && isUrlFunc.test(value)) {
|
||||
needIgnore = getWebpackIgnoreCommentValue(innerIndex, valueNode.nodes);
|
||||
if (isIgnoreOnDeclaration && typeof needIgnore === 'undefined' || needIgnore) {
|
||||
if (needIgnore) {
|
||||
needIgnore = undefined;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
const { nodes } = nNode;
|
||||
const isStringValue = nodes.length !== 0 && nodes[0].type === 'string';
|
||||
let url = isStringValue ? nodes[0].value : valueParser.stringify(nodes);
|
||||
url = normalizeUrl(url, isStringValue);
|
||||
// Do not traverse inside `url`
|
||||
if (!shouldHandleURL(url, declaration, result, isSupportDataURLInNewURL)) {
|
||||
return false;
|
||||
}
|
||||
const queryParts = url.split('!');
|
||||
let prefix;
|
||||
if (queryParts.length > 1) {
|
||||
url = queryParts.pop();
|
||||
prefix = queryParts.join('!');
|
||||
}
|
||||
parsedURLs.push({
|
||||
declaration,
|
||||
parsed,
|
||||
node: getNodeFromUrlFunc(nNode),
|
||||
prefix,
|
||||
url,
|
||||
needQuotes: false
|
||||
});
|
||||
} else if (type === 'string') {
|
||||
needIgnore = getWebpackIgnoreCommentValue(innerIndex, valueNode.nodes);
|
||||
if (isIgnoreOnDeclaration && typeof needIgnore === 'undefined' || needIgnore) {
|
||||
if (needIgnore) {
|
||||
needIgnore = undefined;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
let url = normalizeUrl(value, true);
|
||||
// Do not traverse inside `url`
|
||||
if (!shouldHandleURL(url, declaration, result, isSupportDataURLInNewURL)) {
|
||||
return false;
|
||||
}
|
||||
const queryParts = url.split('!');
|
||||
let prefix;
|
||||
if (queryParts.length > 1) {
|
||||
url = queryParts.pop();
|
||||
prefix = queryParts.join('!');
|
||||
}
|
||||
parsedURLs.push({
|
||||
declaration,
|
||||
parsed,
|
||||
node: nNode,
|
||||
prefix,
|
||||
url,
|
||||
needQuotes: true
|
||||
});
|
||||
}
|
||||
}
|
||||
// Do not traverse inside `image-set`
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return parsedURLs;
|
||||
}
|
||||
const plugin = (options = {})=>{
|
||||
return {
|
||||
postcssPlugin: 'postcss-url-parser',
|
||||
prepare (result) {
|
||||
const parsedDeclarations = [];
|
||||
return {
|
||||
Declaration (declaration) {
|
||||
const { isSupportDataURLInNewURL } = options;
|
||||
const parsedURL = parseDeclaration(declaration, 'value', result, isSupportDataURLInNewURL);
|
||||
if (!parsedURL) {
|
||||
return;
|
||||
}
|
||||
parsedDeclarations.push(...parsedURL);
|
||||
},
|
||||
async OnceExit () {
|
||||
if (parsedDeclarations.length === 0) {
|
||||
return;
|
||||
}
|
||||
const resolvedDeclarations = await Promise.all(parsedDeclarations.map(async (parsedDeclaration)=>{
|
||||
const { url } = parsedDeclaration;
|
||||
if (options.filter) {
|
||||
const needKeep = await options.filter(url);
|
||||
if (!needKeep) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (isDataUrl(url)) {
|
||||
return parsedDeclaration;
|
||||
}
|
||||
const [pathname, query, hashOrQuery] = url.split(/(\?)?#/, 3);
|
||||
let hash = '';
|
||||
// Build query string with deployment ID before the hash fragment
|
||||
if (query || options.deploymentId) {
|
||||
hash += '?';
|
||||
}
|
||||
if (options.deploymentId) {
|
||||
hash += `dpl=${options.deploymentId}`;
|
||||
}
|
||||
hash += hashOrQuery ? `#${hashOrQuery}` : '';
|
||||
const { needToResolveURL, rootContext } = options;
|
||||
const request = requestify(pathname, rootContext, // @ts-expect-error TODO: only 2 arguments allowed.
|
||||
needToResolveURL);
|
||||
if (!needToResolveURL) {
|
||||
return {
|
||||
...parsedDeclaration,
|
||||
url: request,
|
||||
hash
|
||||
};
|
||||
}
|
||||
const { resolver, context } = options;
|
||||
const resolvedUrl = await resolveRequests(resolver, context, [
|
||||
...new Set([
|
||||
request,
|
||||
url
|
||||
])
|
||||
]);
|
||||
if (!resolvedUrl) {
|
||||
return;
|
||||
}
|
||||
return {
|
||||
...parsedDeclaration,
|
||||
url: resolvedUrl,
|
||||
hash
|
||||
};
|
||||
}));
|
||||
const urlToNameMap = new Map();
|
||||
const urlToReplacementMap = new Map();
|
||||
let hasUrlImportHelper = false;
|
||||
for(let index = 0; index <= resolvedDeclarations.length - 1; index++){
|
||||
const item = resolvedDeclarations[index];
|
||||
if (!item) {
|
||||
continue;
|
||||
}
|
||||
if (!hasUrlImportHelper) {
|
||||
options.imports.push({
|
||||
type: 'get_url_import',
|
||||
importName: '___CSS_LOADER_GET_URL_IMPORT___',
|
||||
url: options.urlHandler(require.resolve('../runtime/getUrl.js')),
|
||||
index: -1
|
||||
});
|
||||
hasUrlImportHelper = true;
|
||||
}
|
||||
const { url, prefix } = item;
|
||||
const newUrl = prefix ? `${prefix}!${url}` : url;
|
||||
let importName = urlToNameMap.get(newUrl);
|
||||
if (!importName) {
|
||||
importName = `___CSS_LOADER_URL_IMPORT_${urlToNameMap.size}___`;
|
||||
urlToNameMap.set(newUrl, importName);
|
||||
options.imports.push({
|
||||
type: 'url',
|
||||
importName,
|
||||
url: options.needToResolveURL ? options.urlHandler(newUrl) : JSON.stringify(newUrl),
|
||||
index
|
||||
});
|
||||
}
|
||||
const { hash, needQuotes } = item;
|
||||
const replacementKey = JSON.stringify({
|
||||
newUrl,
|
||||
hash,
|
||||
needQuotes
|
||||
});
|
||||
let replacementName = urlToReplacementMap.get(replacementKey);
|
||||
if (!replacementName) {
|
||||
replacementName = `___CSS_LOADER_URL_REPLACEMENT_${urlToReplacementMap.size}___`;
|
||||
urlToReplacementMap.set(replacementKey, replacementName);
|
||||
options.replacements.push({
|
||||
replacementName,
|
||||
importName,
|
||||
hash,
|
||||
needQuotes
|
||||
});
|
||||
}
|
||||
item.node.type = 'word';
|
||||
item.node.value = replacementName;
|
||||
item.declaration.value = item.parsed.toString();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
plugin.postcss = true;
|
||||
export default plugin;
|
||||
|
||||
//# sourceMappingURL=postcss-url-parser.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+82
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/ // css base code, injected by the css-loader
|
||||
module.exports = function(useSourceMap) {
|
||||
var list = [] // return the list of modules as css string
|
||||
;
|
||||
list.toString = function toString() {
|
||||
return this.map(function(item) {
|
||||
var content = cssWithMappingToString(item, useSourceMap);
|
||||
if (item[2]) {
|
||||
return '@media '.concat(item[2], ' {').concat(content, '}');
|
||||
}
|
||||
return content;
|
||||
}).join('');
|
||||
} // import a list of modules into the list
|
||||
;
|
||||
// @ts-expect-error TODO: fix type
|
||||
list.i = function(modules, mediaQuery, dedupe) {
|
||||
if (typeof modules === 'string') {
|
||||
modules = [
|
||||
[
|
||||
null,
|
||||
modules,
|
||||
''
|
||||
]
|
||||
];
|
||||
}
|
||||
var alreadyImportedModules = {};
|
||||
if (dedupe) {
|
||||
for(var i = 0; i < this.length; i++){
|
||||
var id = this[i][0];
|
||||
if (id != null) {
|
||||
alreadyImportedModules[id] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(var _i = 0; _i < modules.length; _i++){
|
||||
var item = [].concat(modules[_i]);
|
||||
if (dedupe && alreadyImportedModules[item[0]]) {
|
||||
continue;
|
||||
}
|
||||
if (mediaQuery) {
|
||||
if (!item[2]) {
|
||||
item[2] = mediaQuery;
|
||||
} else {
|
||||
item[2] = ''.concat(mediaQuery, ' and ').concat(item[2]);
|
||||
}
|
||||
}
|
||||
list.push(item);
|
||||
}
|
||||
};
|
||||
return list;
|
||||
};
|
||||
function cssWithMappingToString(item, useSourceMap) {
|
||||
var content = item[1] || '';
|
||||
var cssMapping = item[3];
|
||||
if (!cssMapping) {
|
||||
return content;
|
||||
}
|
||||
if (useSourceMap && typeof btoa === 'function') {
|
||||
var sourceMapping = toComment(cssMapping);
|
||||
var sourceURLs = cssMapping.sources.map(function(source) {
|
||||
return '/*# sourceURL='.concat(cssMapping.sourceRoot || '').concat(source, ' */');
|
||||
});
|
||||
return [
|
||||
content
|
||||
].concat(sourceURLs).concat([
|
||||
sourceMapping
|
||||
]).join('\n');
|
||||
}
|
||||
return [
|
||||
content
|
||||
].join('\n');
|
||||
} // Adapted from convert-source-map (MIT)
|
||||
function toComment(sourceMap) {
|
||||
var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
|
||||
var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,'.concat(base64);
|
||||
return '/*# '.concat(data, ' */');
|
||||
}
|
||||
|
||||
//# sourceMappingURL=api.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/loaders/css-loader/src/runtime/api.ts"],"sourcesContent":["/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function (useSourceMap: any) {\n var list: any[] = [] // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item, useSourceMap)\n\n if (item[2]) {\n return '@media '.concat(item[2], ' {').concat(content, '}')\n }\n\n return content\n }).join('')\n } // import a list of modules into the list\n\n // @ts-expect-error TODO: fix type\n list.i = function (modules: any, mediaQuery: any, dedupe: any) {\n if (typeof modules === 'string') {\n modules = [[null, modules, '']]\n }\n\n var alreadyImportedModules: any = {}\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n var id = this[i][0]\n\n if (id != null) {\n alreadyImportedModules[id] = true\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item: any = [].concat(modules[_i])\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery\n } else {\n item[2] = ''.concat(mediaQuery, ' and ').concat(item[2])\n }\n }\n\n list.push(item)\n }\n }\n\n return list\n}\n\nfunction cssWithMappingToString(item: any, useSourceMap: any) {\n var content = item[1] || ''\n\n var cssMapping = item[3]\n\n if (!cssMapping) {\n return content\n }\n\n if (useSourceMap && typeof btoa === 'function') {\n var sourceMapping = toComment(cssMapping)\n var sourceURLs = cssMapping.sources.map(function (source: string) {\n return '/*# sourceURL='\n .concat(cssMapping.sourceRoot || '')\n .concat(source, ' */')\n })\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n')\n }\n\n return [content].join('\\n')\n} // Adapted from convert-source-map (MIT)\n\nfunction toComment(sourceMap: any) {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))))\n var data =\n 'sourceMappingURL=data:application/json;charset=utf-8;base64,'.concat(\n base64\n )\n return '/*# '.concat(data, ' */')\n}\n"],"names":["module","exports","useSourceMap","list","toString","map","item","content","cssWithMappingToString","concat","join","i","modules","mediaQuery","dedupe","alreadyImportedModules","length","id","_i","push","cssMapping","btoa","sourceMapping","toComment","sourceURLs","sources","source","sourceRoot","sourceMap","base64","unescape","encodeURIComponent","JSON","stringify","data"],"mappings":"AAAA;;;AAGA,GACA,4CAA4C;AAC5CA,OAAOC,OAAO,GAAG,SAAUC,YAAiB;IAC1C,IAAIC,OAAc,EAAE,CAAC,2CAA2C;;IAEhEA,KAAKC,QAAQ,GAAG,SAASA;QACvB,OAAO,IAAI,CAACC,GAAG,CAAC,SAAUC,IAAI;YAC5B,IAAIC,UAAUC,uBAAuBF,MAAMJ;YAE3C,IAAII,IAAI,CAAC,EAAE,EAAE;gBACX,OAAO,UAAUG,MAAM,CAACH,IAAI,CAAC,EAAE,EAAE,MAAMG,MAAM,CAACF,SAAS;YACzD;YAEA,OAAOA;QACT,GAAGG,IAAI,CAAC;IACV,EAAE,yCAAyC;;IAE3C,kCAAkC;IAClCP,KAAKQ,CAAC,GAAG,SAAUC,OAAY,EAAEC,UAAe,EAAEC,MAAW;QAC3D,IAAI,OAAOF,YAAY,UAAU;YAC/BA,UAAU;gBAAC;oBAAC;oBAAMA;oBAAS;iBAAG;aAAC;QACjC;QAEA,IAAIG,yBAA8B,CAAC;QAEnC,IAAID,QAAQ;YACV,IAAK,IAAIH,IAAI,GAAGA,IAAI,IAAI,CAACK,MAAM,EAAEL,IAAK;gBACpC,IAAIM,KAAK,IAAI,CAACN,EAAE,CAAC,EAAE;gBAEnB,IAAIM,MAAM,MAAM;oBACdF,sBAAsB,CAACE,GAAG,GAAG;gBAC/B;YACF;QACF;QAEA,IAAK,IAAIC,KAAK,GAAGA,KAAKN,QAAQI,MAAM,EAAEE,KAAM;YAC1C,IAAIZ,OAAY,EAAE,CAACG,MAAM,CAACG,OAAO,CAACM,GAAG;YAErC,IAAIJ,UAAUC,sBAAsB,CAACT,IAAI,CAAC,EAAE,CAAC,EAAE;gBAC7C;YACF;YAEA,IAAIO,YAAY;gBACd,IAAI,CAACP,IAAI,CAAC,EAAE,EAAE;oBACZA,IAAI,CAAC,EAAE,GAAGO;gBACZ,OAAO;oBACLP,IAAI,CAAC,EAAE,GAAG,GAAGG,MAAM,CAACI,YAAY,SAASJ,MAAM,CAACH,IAAI,CAAC,EAAE;gBACzD;YACF;YAEAH,KAAKgB,IAAI,CAACb;QACZ;IACF;IAEA,OAAOH;AACT;AAEA,SAASK,uBAAuBF,IAAS,EAAEJ,YAAiB;IAC1D,IAAIK,UAAUD,IAAI,CAAC,EAAE,IAAI;IAEzB,IAAIc,aAAad,IAAI,CAAC,EAAE;IAExB,IAAI,CAACc,YAAY;QACf,OAAOb;IACT;IAEA,IAAIL,gBAAgB,OAAOmB,SAAS,YAAY;QAC9C,IAAIC,gBAAgBC,UAAUH;QAC9B,IAAII,aAAaJ,WAAWK,OAAO,CAACpB,GAAG,CAAC,SAAUqB,MAAc;YAC9D,OAAO,iBACJjB,MAAM,CAACW,WAAWO,UAAU,IAAI,IAChClB,MAAM,CAACiB,QAAQ;QACpB;QACA,OAAO;YAACnB;SAAQ,CAACE,MAAM,CAACe,YAAYf,MAAM,CAAC;YAACa;SAAc,EAAEZ,IAAI,CAAC;IACnE;IAEA,OAAO;QAACH;KAAQ,CAACG,IAAI,CAAC;AACxB,EAAE,wCAAwC;AAE1C,SAASa,UAAUK,SAAc;IAC/B,IAAIC,SAASR,KAAKS,SAASC,mBAAmBC,KAAKC,SAAS,CAACL;IAC7D,IAAIM,OACF,+DAA+DzB,MAAM,CACnEoB;IAEJ,OAAO,OAAOpB,MAAM,CAACyB,MAAM;AAC7B","ignoreList":[0]}
|
||||
Generated
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
module.exports = function(url, options) {
|
||||
if (!options) {
|
||||
options = {};
|
||||
}
|
||||
url = url && url.__esModule ? url.default : url;
|
||||
if (typeof url !== 'string') {
|
||||
return url;
|
||||
} // If url is already wrapped in quotes, remove them
|
||||
if (/^['"].*['"]$/.test(url)) {
|
||||
url = url.slice(1, -1);
|
||||
}
|
||||
if (options.hash) {
|
||||
url += options.hash;
|
||||
} // Should url be wrapped?
|
||||
// See https://drafts.csswg.org/css-values-3/#urls
|
||||
if (/["'() \t\n]/.test(url) || options.needQuotes) {
|
||||
return '"'.concat(url.replace(/"/g, '\\"').replace(/\n/g, '\\n'), '"');
|
||||
}
|
||||
return url;
|
||||
};
|
||||
|
||||
//# sourceMappingURL=getUrl.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../../src/build/webpack/loaders/css-loader/src/runtime/getUrl.ts"],"sourcesContent":["module.exports = function (url: any, options: any) {\n if (!options) {\n options = {}\n }\n\n url = url && url.__esModule ? url.default : url\n\n if (typeof url !== 'string') {\n return url\n } // If url is already wrapped in quotes, remove them\n\n if (/^['\"].*['\"]$/.test(url)) {\n url = url.slice(1, -1)\n }\n\n if (options.hash) {\n url += options.hash\n } // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n\n if (/[\"'() \\t\\n]/.test(url) || options.needQuotes) {\n return '\"'.concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n'), '\"')\n }\n\n return url\n}\n"],"names":["module","exports","url","options","__esModule","default","test","slice","hash","needQuotes","concat","replace"],"mappings":"AAAAA,OAAOC,OAAO,GAAG,SAAUC,GAAQ,EAAEC,OAAY;IAC/C,IAAI,CAACA,SAAS;QACZA,UAAU,CAAC;IACb;IAEAD,MAAMA,OAAOA,IAAIE,UAAU,GAAGF,IAAIG,OAAO,GAAGH;IAE5C,IAAI,OAAOA,QAAQ,UAAU;QAC3B,OAAOA;IACT,EAAE,mDAAmD;IAErD,IAAI,eAAeI,IAAI,CAACJ,MAAM;QAC5BA,MAAMA,IAAIK,KAAK,CAAC,GAAG,CAAC;IACtB;IAEA,IAAIJ,QAAQK,IAAI,EAAE;QAChBN,OAAOC,QAAQK,IAAI;IACrB,EAAE,yBAAyB;IAC3B,kDAAkD;IAElD,IAAI,cAAcF,IAAI,CAACJ,QAAQC,QAAQM,UAAU,EAAE;QACjD,OAAO,IAAIC,MAAM,CAACR,IAAIS,OAAO,CAAC,MAAM,OAAOA,OAAO,CAAC,OAAO,QAAQ;IACpE;IAEA,OAAOT;AACT","ignoreList":[0]}
|
||||
Generated
Vendored
+365
@@ -0,0 +1,365 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/ import { fileURLToPath } from 'url';
|
||||
import path from 'path';
|
||||
import { urlToRequest } from 'next/dist/compiled/loader-utils3';
|
||||
import modulesValues from 'next/dist/compiled/postcss-modules-values';
|
||||
import localByDefault from 'next/dist/compiled/postcss-modules-local-by-default';
|
||||
import extractImports from 'next/dist/compiled/postcss-modules-extract-imports';
|
||||
import modulesScope from 'next/dist/compiled/postcss-modules-scope';
|
||||
import camelCase from './camelcase';
|
||||
import { normalizePath } from '../../../../../lib/normalize-path';
|
||||
const whitespace = '[\\x20\\t\\r\\n\\f]';
|
||||
const unescapeRegExp = new RegExp(`\\\\([\\da-f]{1,6}${whitespace}?|(${whitespace})|.)`, 'ig');
|
||||
const matchNativeWin32Path = /^[A-Z]:[/\\]|^\\\\/i;
|
||||
function unescape(str) {
|
||||
return str.replace(unescapeRegExp, (_, escaped, escapedWhitespace)=>{
|
||||
const high = `0x${escaped}` - 0x10000;
|
||||
// NaN means non-codepoint
|
||||
// Workaround erroneous numeric interpretation of +"0x"
|
||||
// eslint-disable-next-line no-self-compare
|
||||
return high !== high || escapedWhitespace ? escaped : high < 0 ? String.fromCharCode(high + 0x10000) : String.fromCharCode(high >> 10 | 0xd800, high & 0x3ff | 0xdc00);
|
||||
});
|
||||
}
|
||||
function fixedEncodeURIComponent(str) {
|
||||
return str.replace(/[!'()*]/g, (c)=>`%${c.charCodeAt(0).toString(16)}`);
|
||||
}
|
||||
function normalizeUrl(url, isStringValue) {
|
||||
let normalizedUrl = url;
|
||||
if (isStringValue && /\\(\n|\r\n|\r|\f)/.test(normalizedUrl)) {
|
||||
normalizedUrl = normalizedUrl.replace(/\\(\n|\r\n|\r|\f)/g, '');
|
||||
}
|
||||
if (matchNativeWin32Path.test(url)) {
|
||||
try {
|
||||
normalizedUrl = decodeURIComponent(normalizedUrl);
|
||||
} catch (error) {
|
||||
// Ignores invalid and broken URLs and try to resolve them as is
|
||||
}
|
||||
return normalizedUrl;
|
||||
}
|
||||
normalizedUrl = unescape(normalizedUrl);
|
||||
if (isDataUrl(url)) {
|
||||
return fixedEncodeURIComponent(normalizedUrl);
|
||||
}
|
||||
try {
|
||||
normalizedUrl = decodeURI(normalizedUrl);
|
||||
} catch (error) {
|
||||
// Ignores invalid and broken URLs and try to resolve them as is
|
||||
}
|
||||
return normalizedUrl;
|
||||
}
|
||||
function requestify(url, rootContext) {
|
||||
if (/^file:/i.test(url)) {
|
||||
return fileURLToPath(url);
|
||||
}
|
||||
if (/^[a-z][a-z0-9+.-]*:/i.test(url)) {
|
||||
return url;
|
||||
}
|
||||
return url.charAt(0) === '/' ? urlToRequest(url, rootContext) : urlToRequest(url);
|
||||
}
|
||||
function getFilter(filter, resourcePath) {
|
||||
return (...args)=>{
|
||||
if (typeof filter === 'function') {
|
||||
return filter(...args, resourcePath);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
function shouldUseImportPlugin(options) {
|
||||
if (options.modules.exportOnlyLocals) {
|
||||
return false;
|
||||
}
|
||||
if (typeof options.import === 'boolean') {
|
||||
return options.import;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function shouldUseURLPlugin(options) {
|
||||
if (options.modules.exportOnlyLocals) {
|
||||
return false;
|
||||
}
|
||||
if (typeof options.url === 'boolean') {
|
||||
return options.url;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function shouldUseModulesPlugins(options) {
|
||||
return options.modules.compileType === 'module';
|
||||
}
|
||||
function shouldUseIcssPlugin(options) {
|
||||
return options.icss === true || Boolean(options.modules);
|
||||
}
|
||||
function getModulesPlugins(options, loaderContext, meta) {
|
||||
const { mode, getLocalIdent, localIdentName, localIdentContext, localIdentHashPrefix, localIdentRegExp } = options.modules;
|
||||
let plugins = [];
|
||||
try {
|
||||
plugins = [
|
||||
modulesValues,
|
||||
localByDefault({
|
||||
mode
|
||||
}),
|
||||
extractImports(),
|
||||
modulesScope({
|
||||
generateScopedName (exportName) {
|
||||
return getLocalIdent(loaderContext, localIdentName, exportName, {
|
||||
context: localIdentContext,
|
||||
hashPrefix: localIdentHashPrefix,
|
||||
regExp: localIdentRegExp
|
||||
}, meta);
|
||||
},
|
||||
exportGlobals: options.modules.exportGlobals
|
||||
})
|
||||
];
|
||||
} catch (error) {
|
||||
loaderContext.emitError(error);
|
||||
}
|
||||
return plugins;
|
||||
}
|
||||
const IS_NATIVE_WIN32_PATH = /^[a-z]:[/\\]|^\\\\/i;
|
||||
const ABSOLUTE_SCHEME = /^[a-z0-9+\-.]+:/i;
|
||||
function getURLType(source) {
|
||||
if (source[0] === '/') {
|
||||
if (source[1] === '/') {
|
||||
return 'scheme-relative';
|
||||
}
|
||||
return 'path-absolute';
|
||||
}
|
||||
if (IS_NATIVE_WIN32_PATH.test(source)) {
|
||||
return 'path-absolute';
|
||||
}
|
||||
return ABSOLUTE_SCHEME.test(source) ? 'absolute' : 'path-relative';
|
||||
}
|
||||
function normalizeSourceMap(map, resourcePath) {
|
||||
let newMap = map;
|
||||
// Some loader emit source map as string
|
||||
// Strip any JSON XSSI avoidance prefix from the string (as documented in the source maps specification), and then parse the string as JSON.
|
||||
if (typeof newMap === 'string') {
|
||||
newMap = JSON.parse(newMap);
|
||||
}
|
||||
delete newMap.file;
|
||||
const { sourceRoot } = newMap;
|
||||
delete newMap.sourceRoot;
|
||||
if (newMap.sources) {
|
||||
// Source maps should use forward slash because it is URLs (https://github.com/mozilla/source-map/issues/91)
|
||||
// We should normalize path because previous loaders like `sass-loader` using backslash when generate source map
|
||||
newMap.sources = newMap.sources.map((source)=>{
|
||||
// Non-standard syntax from `postcss`
|
||||
if (source.startsWith('<')) {
|
||||
return source;
|
||||
}
|
||||
const sourceType = getURLType(source);
|
||||
// Do no touch `scheme-relative` and `absolute` URLs
|
||||
if (sourceType === 'path-relative' || sourceType === 'path-absolute') {
|
||||
const absoluteSource = sourceType === 'path-relative' && sourceRoot ? path.resolve(sourceRoot, normalizePath(source)) : normalizePath(source);
|
||||
return path.relative(path.dirname(resourcePath), absoluteSource);
|
||||
}
|
||||
return source;
|
||||
});
|
||||
}
|
||||
return newMap;
|
||||
}
|
||||
function getPreRequester({ loaders, loaderIndex }) {
|
||||
const cache = Object.create(null);
|
||||
return (number)=>{
|
||||
if (cache[number]) {
|
||||
return cache[number];
|
||||
}
|
||||
if (number === false) {
|
||||
cache[number] = '';
|
||||
} else {
|
||||
const loadersRequest = loaders.slice(loaderIndex, loaderIndex + 1 + (typeof number !== 'number' ? 0 : number)).map((x)=>x.request).join('!');
|
||||
cache[number] = `-!${loadersRequest}!`;
|
||||
}
|
||||
return cache[number];
|
||||
};
|
||||
}
|
||||
function getImportCode(imports, options) {
|
||||
let code = '';
|
||||
for (const item of imports){
|
||||
const { importName, url, icss } = item;
|
||||
if (options.esModule) {
|
||||
if (icss && options.modules.namedExport) {
|
||||
code += `import ${options.modules.exportOnlyLocals ? '' : `${importName}, `}* as ${importName}_NAMED___ from ${url};\n`;
|
||||
} else {
|
||||
code += `import ${importName} from ${url};\n`;
|
||||
}
|
||||
} else {
|
||||
code += `var ${importName} = require(${url});\n`;
|
||||
}
|
||||
}
|
||||
return code ? `// Imports\n${code}` : '';
|
||||
}
|
||||
function normalizeSourceMapForRuntime(map, loaderContext) {
|
||||
const resultMap = map ? map.toJSON() : null;
|
||||
if (resultMap) {
|
||||
delete resultMap.file;
|
||||
resultMap.sourceRoot = '';
|
||||
resultMap.sources = resultMap.sources.map((source)=>{
|
||||
// Non-standard syntax from `postcss`
|
||||
if (source.startsWith('<')) {
|
||||
return source;
|
||||
}
|
||||
const sourceType = getURLType(source);
|
||||
if (sourceType !== 'path-relative') {
|
||||
return source;
|
||||
}
|
||||
const resourceDirname = path.dirname(loaderContext.resourcePath);
|
||||
const absoluteSource = path.resolve(resourceDirname, source);
|
||||
const contextifyPath = normalizePath(path.relative(loaderContext.rootContext, absoluteSource));
|
||||
return `webpack://${contextifyPath}`;
|
||||
});
|
||||
}
|
||||
return JSON.stringify(resultMap);
|
||||
}
|
||||
function getModuleCode(result, api, replacements, options, loaderContext) {
|
||||
if (options.modules.exportOnlyLocals === true) {
|
||||
return '';
|
||||
}
|
||||
const sourceMapValue = options.sourceMap ? `,${normalizeSourceMapForRuntime(result.map, loaderContext)}` : '';
|
||||
let code = JSON.stringify(result.css);
|
||||
let beforeCode = `var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(${options.sourceMap});\n`;
|
||||
for (const item of api){
|
||||
const { url, media, dedupe } = item;
|
||||
beforeCode += url ? `___CSS_LOADER_EXPORT___.push([module.id, ${JSON.stringify(`@import url(${url});`)}${media ? `, ${JSON.stringify(media)}` : ''}]);\n` : `___CSS_LOADER_EXPORT___.i(${item.importName}${media ? `, ${JSON.stringify(media)}` : dedupe ? ', ""' : ''}${dedupe ? ', true' : ''});\n`;
|
||||
}
|
||||
for (const item of replacements){
|
||||
const { replacementName, importName, localName } = item;
|
||||
if (localName) {
|
||||
code = code.replace(new RegExp(replacementName, 'g'), ()=>options.modules.namedExport ? `" + ${importName}_NAMED___[${JSON.stringify(camelCase(localName))}] + "` : `" + ${importName}.locals[${JSON.stringify(localName)}] + "`);
|
||||
} else {
|
||||
const { hash, needQuotes } = item;
|
||||
const getUrlOptions = [
|
||||
...hash ? [
|
||||
`hash: ${JSON.stringify(hash)}`
|
||||
] : [],
|
||||
...needQuotes ? 'needQuotes: true' : []
|
||||
];
|
||||
const preparedOptions = getUrlOptions.length > 0 ? `, { ${getUrlOptions.join(', ')} }` : '';
|
||||
beforeCode += `var ${replacementName} = ___CSS_LOADER_GET_URL_IMPORT___(${importName}${preparedOptions});\n`;
|
||||
code = code.replace(new RegExp(replacementName, 'g'), ()=>`" + ${replacementName} + "`);
|
||||
}
|
||||
}
|
||||
return `${beforeCode}// Module\n___CSS_LOADER_EXPORT___.push([module.id, ${code}, ""${sourceMapValue}]);\n`;
|
||||
}
|
||||
function dashesCamelCase(str) {
|
||||
return str.replace(/-+(\w)/g, (_match, firstLetter)=>firstLetter.toUpperCase());
|
||||
}
|
||||
function getExportCode(exports, replacements, options) {
|
||||
let code = '// Exports\n';
|
||||
let localsCode = '';
|
||||
const addExportToLocalsCode = (name, value)=>{
|
||||
if (options.modules.namedExport) {
|
||||
localsCode += `export const ${camelCase(name)} = ${JSON.stringify(value)};\n`;
|
||||
} else {
|
||||
if (localsCode) {
|
||||
localsCode += `,\n`;
|
||||
}
|
||||
localsCode += `\t${JSON.stringify(name)}: ${JSON.stringify(value)}`;
|
||||
}
|
||||
};
|
||||
for (const { name, value } of exports){
|
||||
switch(options.modules.exportLocalsConvention){
|
||||
case 'camelCase':
|
||||
{
|
||||
addExportToLocalsCode(name, value);
|
||||
const modifiedName = camelCase(name);
|
||||
if (modifiedName !== name) {
|
||||
addExportToLocalsCode(modifiedName, value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'camelCaseOnly':
|
||||
{
|
||||
addExportToLocalsCode(camelCase(name), value);
|
||||
break;
|
||||
}
|
||||
case 'dashes':
|
||||
{
|
||||
addExportToLocalsCode(name, value);
|
||||
const modifiedName = dashesCamelCase(name);
|
||||
if (modifiedName !== name) {
|
||||
addExportToLocalsCode(modifiedName, value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'dashesOnly':
|
||||
{
|
||||
addExportToLocalsCode(dashesCamelCase(name), value);
|
||||
break;
|
||||
}
|
||||
case 'asIs':
|
||||
default:
|
||||
addExportToLocalsCode(name, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (const item of replacements){
|
||||
const { replacementName, localName } = item;
|
||||
if (localName) {
|
||||
const { importName } = item;
|
||||
localsCode = localsCode.replace(new RegExp(replacementName, 'g'), ()=>{
|
||||
if (options.modules.namedExport) {
|
||||
return `" + ${importName}_NAMED___[${JSON.stringify(camelCase(localName))}] + "`;
|
||||
} else if (options.modules.exportOnlyLocals) {
|
||||
return `" + ${importName}[${JSON.stringify(localName)}] + "`;
|
||||
}
|
||||
return `" + ${importName}.locals[${JSON.stringify(localName)}] + "`;
|
||||
});
|
||||
} else {
|
||||
localsCode = localsCode.replace(new RegExp(replacementName, 'g'), ()=>`" + ${replacementName} + "`);
|
||||
}
|
||||
}
|
||||
if (options.modules.exportOnlyLocals) {
|
||||
code += options.modules.namedExport ? localsCode : `${options.esModule ? 'export default' : 'module.exports ='} {\n${localsCode}\n};\n`;
|
||||
return code;
|
||||
}
|
||||
if (localsCode) {
|
||||
code += options.modules.namedExport ? localsCode : `___CSS_LOADER_EXPORT___.locals = {\n${localsCode}\n};\n`;
|
||||
}
|
||||
code += `${options.esModule ? 'export default' : 'module.exports ='} ___CSS_LOADER_EXPORT___;\n`;
|
||||
return code;
|
||||
}
|
||||
async function resolveRequests(resolve, context, possibleRequests) {
|
||||
return resolve(context, possibleRequests[0]).then((result)=>{
|
||||
return result;
|
||||
}).catch((error)=>{
|
||||
const [, ...tailPossibleRequests] = possibleRequests;
|
||||
if (tailPossibleRequests.length === 0) {
|
||||
throw error;
|
||||
}
|
||||
return resolveRequests(resolve, context, tailPossibleRequests);
|
||||
});
|
||||
}
|
||||
function isUrlRequestable(url) {
|
||||
// Protocol-relative URLs
|
||||
if (/^\/\//.test(url)) {
|
||||
return false;
|
||||
}
|
||||
// `file:` protocol
|
||||
if (/^file:/i.test(url)) {
|
||||
return true;
|
||||
}
|
||||
// Absolute URLs
|
||||
if (/^[a-z][a-z0-9+.-]*:/i.test(url)) {
|
||||
return true;
|
||||
}
|
||||
// `#` URLs
|
||||
if (/^#/.test(url)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function sort(a, b) {
|
||||
return a.index - b.index;
|
||||
}
|
||||
function isDataUrl(url) {
|
||||
if (/^data:/i.test(url)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
export { isDataUrl, shouldUseModulesPlugins, shouldUseImportPlugin, shouldUseURLPlugin, shouldUseIcssPlugin, normalizeUrl, requestify, getFilter, getModulesPlugins, normalizeSourceMap, getPreRequester, getImportCode, getModuleCode, getExportCode, resolveRequests, isUrlRequestable, sort, // For lightningcss-loader
|
||||
normalizeSourceMapForRuntime, dashesCamelCase, };
|
||||
|
||||
//# sourceMappingURL=utils.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+128
@@ -0,0 +1,128 @@
|
||||
/* @ts-check */ /**
|
||||
* Style injection mechanism for Next.js devtools with shadow DOM support
|
||||
* Handles caching of style elements when the nextjs-portal shadow root is not available
|
||||
*/ // Global cache for style elements when shadow root is not available
|
||||
if (typeof window !== 'undefined') {
|
||||
window._nextjsDevtoolsStyleCache = window._nextjsDevtoolsStyleCache || {
|
||||
pendingElements: [],
|
||||
isObserving: false,
|
||||
lastInsertedElement: null,
|
||||
cachedShadowRoot: null
|
||||
};
|
||||
}
|
||||
/**
|
||||
* @returns {ShadowRoot | null}
|
||||
*/ function getShadowRoot() {
|
||||
const cache = window._nextjsDevtoolsStyleCache;
|
||||
// Return cached shadow root if available
|
||||
if (cache.cachedShadowRoot) {
|
||||
return cache.cachedShadowRoot;
|
||||
}
|
||||
// Query the DOM and cache the result if found
|
||||
const portal = document.querySelector('nextjs-portal');
|
||||
const shadowRoot = (portal == null ? void 0 : portal.shadowRoot) || null;
|
||||
if (shadowRoot) {
|
||||
cache.cachedShadowRoot = shadowRoot;
|
||||
}
|
||||
return shadowRoot;
|
||||
}
|
||||
/**
|
||||
* @param {HTMLElement} element
|
||||
* @param {ShadowRoot} shadowRoot
|
||||
*/ function insertElementIntoShadowRoot(element, shadowRoot) {
|
||||
const cache = window._nextjsDevtoolsStyleCache;
|
||||
if (!cache.lastInsertedElement) {
|
||||
shadowRoot.insertBefore(element, shadowRoot.firstChild);
|
||||
} else if (cache.lastInsertedElement.nextSibling) {
|
||||
shadowRoot.insertBefore(element, cache.lastInsertedElement.nextSibling);
|
||||
} else {
|
||||
shadowRoot.appendChild(element);
|
||||
}
|
||||
cache.lastInsertedElement = element;
|
||||
}
|
||||
function flushCachedElements() {
|
||||
const cache = window._nextjsDevtoolsStyleCache;
|
||||
const shadowRoot = getShadowRoot();
|
||||
if (!shadowRoot) {
|
||||
return;
|
||||
}
|
||||
cache.pendingElements.forEach((element)=>{
|
||||
insertElementIntoShadowRoot(element, shadowRoot);
|
||||
});
|
||||
cache.pendingElements = [];
|
||||
}
|
||||
function startObservingForPortal() {
|
||||
const cache = window._nextjsDevtoolsStyleCache;
|
||||
if (cache.isObserving) {
|
||||
return;
|
||||
}
|
||||
cache.isObserving = true;
|
||||
// First check if the portal already exists
|
||||
const shadowRoot = getShadowRoot() // This will cache it if found
|
||||
;
|
||||
if (shadowRoot) {
|
||||
flushCachedElements();
|
||||
return;
|
||||
}
|
||||
// Set up MutationObserver to watch for the portal element
|
||||
const observer = new MutationObserver((mutations)=>{
|
||||
if (mutations.length === 0) {
|
||||
return;
|
||||
}
|
||||
// Check all mutations and all added nodes
|
||||
for (const mutation of mutations){
|
||||
if (mutation.addedNodes.length === 0) continue;
|
||||
for (const addedNode of mutation.addedNodes){
|
||||
if (addedNode.nodeType !== Node.ELEMENT_NODE) continue;
|
||||
const mutationNode = addedNode;
|
||||
let portalNode = null;
|
||||
if (// app router: body > script[data-nextjs-dev-overlay] > nextjs-portal
|
||||
mutationNode.tagName === 'SCRIPT' && mutationNode.getAttribute('data-nextjs-dev-overlay')) {
|
||||
portalNode = mutationNode.firstChild;
|
||||
} else if (// pages router: body > nextjs-portal
|
||||
mutationNode.tagName === 'NEXTJS-PORTAL') {
|
||||
portalNode = mutationNode;
|
||||
}
|
||||
if (portalNode) {
|
||||
// Wait until shadow root is available
|
||||
const checkShadowRoot = ()=>{
|
||||
if (getShadowRoot()) {
|
||||
flushCachedElements();
|
||||
observer.disconnect();
|
||||
cache.isObserving = false;
|
||||
} else {
|
||||
// Try again after a short delay
|
||||
setTimeout(checkShadowRoot, 20);
|
||||
}
|
||||
};
|
||||
checkShadowRoot();
|
||||
return; // Exit early once we find a portal
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
observer.observe(document.body, {
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @param {HTMLElement} element
|
||||
*/ function insertAtTop(element) {
|
||||
// Add special recognizable data prop to element
|
||||
element.setAttribute('data-nextjs-dev-tool-style', 'true');
|
||||
const shadowRoot = getShadowRoot();
|
||||
if (shadowRoot) {
|
||||
// Shadow root is available, insert directly
|
||||
insertElementIntoShadowRoot(element, shadowRoot);
|
||||
} else {
|
||||
// Shadow root not available, cache the element
|
||||
const cache = window._nextjsDevtoolsStyleCache;
|
||||
cache.pendingElements.push(element);
|
||||
// Start observing for the portal if not already observing
|
||||
startObservingForPortal();
|
||||
}
|
||||
}
|
||||
module.exports = insertAtTop;
|
||||
|
||||
//# sourceMappingURL=devtool-style-inject.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
+4
@@ -0,0 +1,4 @@
|
||||
const EmptyLoader = ()=>'export default {}';
|
||||
export default EmptyLoader;
|
||||
|
||||
//# sourceMappingURL=empty-loader.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/loaders/empty-loader.ts"],"sourcesContent":["import type { webpack } from 'next/dist/compiled/webpack/webpack'\n\nconst EmptyLoader: webpack.LoaderDefinitionFunction = () => 'export default {}'\nexport default EmptyLoader\n"],"names":["EmptyLoader"],"mappings":"AAEA,MAAMA,cAAgD,IAAM;AAC5D,eAAeA,YAAW","ignoreList":[0]}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
import { cyan } from '../../../lib/picocolors';
|
||||
import path from 'path';
|
||||
const ErrorLoader = function() {
|
||||
var _this__module_issuer, _this__module, _this__compiler;
|
||||
// @ts-ignore exists
|
||||
const options = this.getOptions() || {};
|
||||
const { reason = 'An unknown error has occurred' } = options;
|
||||
// @ts-expect-error
|
||||
const resource = ((_this__module = this._module) == null ? void 0 : (_this__module_issuer = _this__module.issuer) == null ? void 0 : _this__module_issuer.resource) ?? null;
|
||||
const context = this.rootContext ?? ((_this__compiler = this._compiler) == null ? void 0 : _this__compiler.context);
|
||||
const issuer = resource ? context ? path.relative(context, resource) : resource : null;
|
||||
const err = Object.defineProperty(new Error(reason + (issuer ? `\nLocation: ${cyan(issuer)}` : '')), "__NEXT_ERROR_CODE", {
|
||||
value: "E339",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
this.emitError(err);
|
||||
};
|
||||
export default ErrorLoader;
|
||||
|
||||
//# sourceMappingURL=error-loader.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/loaders/error-loader.ts"],"sourcesContent":["import { cyan } from '../../../lib/picocolors'\nimport path from 'path'\nimport type { webpack } from 'next/dist/compiled/webpack/webpack'\n\nconst ErrorLoader: webpack.LoaderDefinitionFunction = function () {\n // @ts-ignore exists\n const options = this.getOptions() || ({} as any)\n\n const { reason = 'An unknown error has occurred' } = options\n\n // @ts-expect-error\n const resource = this._module?.issuer?.resource ?? null\n const context = this.rootContext ?? this._compiler?.context\n\n const issuer = resource\n ? context\n ? path.relative(context, resource)\n : resource\n : null\n\n const err = new Error(reason + (issuer ? `\\nLocation: ${cyan(issuer)}` : ''))\n this.emitError(err)\n}\n\nexport default ErrorLoader\n"],"names":["cyan","path","ErrorLoader","options","getOptions","reason","resource","_module","issuer","context","rootContext","_compiler","relative","err","Error","emitError"],"mappings":"AAAA,SAASA,IAAI,QAAQ,0BAAyB;AAC9C,OAAOC,UAAU,OAAM;AAGvB,MAAMC,cAAgD;QAOnC,sBAAA,eACmB;IAPpC,oBAAoB;IACpB,MAAMC,UAAU,IAAI,CAACC,UAAU,MAAO,CAAC;IAEvC,MAAM,EAAEC,SAAS,+BAA+B,EAAE,GAAGF;IAErD,mBAAmB;IACnB,MAAMG,WAAW,EAAA,gBAAA,IAAI,CAACC,OAAO,sBAAZ,uBAAA,cAAcC,MAAM,qBAApB,qBAAsBF,QAAQ,KAAI;IACnD,MAAMG,UAAU,IAAI,CAACC,WAAW,MAAI,kBAAA,IAAI,CAACC,SAAS,qBAAd,gBAAgBF,OAAO;IAE3D,MAAMD,SAASF,WACXG,UACER,KAAKW,QAAQ,CAACH,SAASH,YACvBA,WACF;IAEJ,MAAMO,MAAM,qBAAiE,CAAjE,IAAIC,MAAMT,SAAUG,CAAAA,SAAS,CAAC,YAAY,EAAER,KAAKQ,SAAS,GAAG,EAAC,IAA9D,qBAAA;eAAA;oBAAA;sBAAA;IAAgE;IAC5E,IAAI,CAACO,SAAS,CAACF;AACjB;AAEA,eAAeX,YAAW","ignoreList":[0]}
|
||||
Generated
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* A getter for module build info that casts to the type it should have.
|
||||
* We also expose here types to make easier to use it.
|
||||
*/ export function getModuleBuildInfo(webpackModule) {
|
||||
return webpackModule.buildInfo;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=get-module-build-info.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/loaders/get-module-build-info.ts"],"sourcesContent":["import type {\n ProxyConfig,\n ProxyMatcher,\n RSCModuleType,\n} from '../../analysis/get-page-static-info'\nimport type { webpack } from 'next/dist/compiled/webpack/webpack'\n\nexport type ModuleBuildInfo = {\n nextEdgeMiddleware?: EdgeMiddlewareMeta\n nextEdgeApiFunction?: EdgeMiddlewareMeta\n nextEdgeSSR?: EdgeSSRMeta\n nextWasmMiddlewareBinding?: AssetBinding\n nextAssetMiddlewareBinding?: AssetBinding\n usingIndirectEval?: boolean | Set<string>\n route?: RouteMeta\n importLocByPath?: Map<string, any>\n rootDir?: string\n rsc?: RSCMeta\n}\n\n/**\n * A getter for module build info that casts to the type it should have.\n * We also expose here types to make easier to use it.\n */\nexport function getModuleBuildInfo(webpackModule: webpack.Module) {\n return webpackModule.buildInfo as ModuleBuildInfo\n}\n\n/**\n * Location info for a server action (1-indexed line and column)\n */\nexport interface ServerActionLocation {\n line: number\n col: number\n}\n\n/**\n * Server action info including name and optional source location\n */\nexport interface ServerActionInfo {\n name: string\n loc?: ServerActionLocation\n}\n\nexport interface RSCMeta {\n type: RSCModuleType\n /** Map of action ID to export name (old format) or action info (new format with location) */\n actionIds?: Record<string, string | ServerActionInfo>\n clientRefs?: string[]\n clientEntryType?: 'cjs' | 'auto'\n isClientRef?: boolean\n requests?: string[] // client requests in flight client entry\n}\n\nexport interface RouteMeta {\n page: string\n absolutePagePath: string\n preferredRegion: string | string[] | undefined\n middlewareConfig: ProxyConfig\n // references to other modules that this route needs\n // e.g. related routes, not-found routes, etc\n relatedModules?: string[]\n}\n\nexport interface EdgeMiddlewareMeta {\n page: string\n matchers?: ProxyMatcher[]\n}\n\nexport interface EdgeSSRMeta {\n isServerComponent: boolean\n isAppDir?: boolean\n page: string\n}\n\nexport interface AssetBinding {\n filePath: string\n name: string\n}\n"],"names":["getModuleBuildInfo","webpackModule","buildInfo"],"mappings":"AAoBA;;;CAGC,GACD,OAAO,SAASA,mBAAmBC,aAA6B;IAC9D,OAAOA,cAAcC,SAAS;AAChC","ignoreList":[0]}
|
||||
Generated
Vendored
+125
@@ -0,0 +1,125 @@
|
||||
import camelCase from '../../css-loader/src/camelcase';
|
||||
import { dashesCamelCase, normalizeSourceMapForRuntime } from '../../css-loader/src/utils';
|
||||
export function getImportCode(imports, options) {
|
||||
let code = '';
|
||||
for (const item of imports){
|
||||
const { importName, url, icss } = item;
|
||||
if (options.esModule) {
|
||||
if (icss && options.modules.namedExport) {
|
||||
code += `import ${options.modules.exportOnlyLocals ? '' : `${importName}, `}* as ${importName}_NAMED___ from ${url};\n`;
|
||||
} else {
|
||||
code += `import ${importName} from ${url};\n`;
|
||||
}
|
||||
} else {
|
||||
code += `var ${importName} = require(${url});\n`;
|
||||
}
|
||||
}
|
||||
return code ? `// Imports\n${code}` : '';
|
||||
}
|
||||
export function getModuleCode(result, api, replacements, options, loaderContext) {
|
||||
if (options.modules.exportOnlyLocals === true) {
|
||||
return '';
|
||||
}
|
||||
const sourceMapValue = options.sourceMap ? `,${normalizeSourceMapForRuntime(result.map, loaderContext)}` : '';
|
||||
let code = JSON.stringify(result.css);
|
||||
let beforeCode = `var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(${options.sourceMap});\n`;
|
||||
for (const item of api){
|
||||
const { url, media, dedupe } = item;
|
||||
beforeCode += url ? `___CSS_LOADER_EXPORT___.push([module.id, ${JSON.stringify(`@import url(${url});`)}${media ? `, ${JSON.stringify(media)}` : ''}]);\n` : `___CSS_LOADER_EXPORT___.i(${item.importName}${media ? `, ${JSON.stringify(media)}` : dedupe ? ', ""' : ''}${dedupe ? ', true' : ''});\n`;
|
||||
}
|
||||
for (const item of replacements){
|
||||
const { replacementName, importName, localName } = item;
|
||||
if (localName) {
|
||||
code = code.replace(new RegExp(replacementName, 'g'), ()=>options.modules.namedExport ? `" + ${importName}_NAMED___[${JSON.stringify(camelCase(localName))}] + "` : `" + ${importName}.locals[${JSON.stringify(localName)}] + "`);
|
||||
} else {
|
||||
const { hash, needQuotes } = item;
|
||||
const getUrlOptions = [
|
||||
...hash ? [
|
||||
`hash: ${JSON.stringify(hash)}`
|
||||
] : [],
|
||||
...needQuotes ? 'needQuotes: true' : []
|
||||
];
|
||||
const preparedOptions = getUrlOptions.length > 0 ? `, { ${getUrlOptions.join(', ')} }` : '';
|
||||
beforeCode += `var ${replacementName} = ___CSS_LOADER_GET_URL_IMPORT___(${importName}${preparedOptions});\n`;
|
||||
code = code.replace(new RegExp(replacementName, 'g'), ()=>`" + ${replacementName} + "`);
|
||||
}
|
||||
}
|
||||
return `${beforeCode}// Module\n___CSS_LOADER_EXPORT___.push([module.id, ${code}, ""${sourceMapValue}]);\n`;
|
||||
}
|
||||
export function getExportCode(exports, replacements, options) {
|
||||
let code = '// Exports\n';
|
||||
let localsCode = '';
|
||||
const addExportToLocalsCode = (name, value)=>{
|
||||
if (options.modules.namedExport) {
|
||||
localsCode += `export const ${camelCase(name)} = ${JSON.stringify(value)};\n`;
|
||||
} else {
|
||||
if (localsCode) {
|
||||
localsCode += `,\n`;
|
||||
}
|
||||
localsCode += `\t${JSON.stringify(name)}: ${JSON.stringify(value)}`;
|
||||
}
|
||||
};
|
||||
for (const { name, value } of exports){
|
||||
switch(options.modules.exportLocalsConvention){
|
||||
case 'camelCase':
|
||||
{
|
||||
addExportToLocalsCode(name, value);
|
||||
const modifiedName = camelCase(name);
|
||||
if (modifiedName !== name) {
|
||||
addExportToLocalsCode(modifiedName, value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'camelCaseOnly':
|
||||
{
|
||||
addExportToLocalsCode(camelCase(name), value);
|
||||
break;
|
||||
}
|
||||
case 'dashes':
|
||||
{
|
||||
addExportToLocalsCode(name, value);
|
||||
const modifiedName = dashesCamelCase(name);
|
||||
if (modifiedName !== name) {
|
||||
addExportToLocalsCode(modifiedName, value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'dashesOnly':
|
||||
{
|
||||
addExportToLocalsCode(dashesCamelCase(name), value);
|
||||
break;
|
||||
}
|
||||
case 'asIs':
|
||||
default:
|
||||
addExportToLocalsCode(name, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (const item of replacements){
|
||||
const { replacementName, localName } = item;
|
||||
if (localName) {
|
||||
const { importName } = item;
|
||||
localsCode = localsCode.replace(new RegExp(replacementName, 'g'), ()=>{
|
||||
if (options.modules.namedExport) {
|
||||
return `" + ${importName}_NAMED___[${JSON.stringify(camelCase(localName))}] + "`;
|
||||
} else if (options.modules.exportOnlyLocals) {
|
||||
return `" + ${importName}[${JSON.stringify(localName)}] + "`;
|
||||
}
|
||||
return `" + ${importName}.locals[${JSON.stringify(localName)}] + "`;
|
||||
});
|
||||
} else {
|
||||
localsCode = localsCode.replace(new RegExp(replacementName, 'g'), ()=>`" + ${replacementName} + "`);
|
||||
}
|
||||
}
|
||||
if (options.modules.exportOnlyLocals) {
|
||||
code += options.modules.namedExport ? localsCode : `${options.esModule ? 'export default' : 'module.exports ='} {\n${localsCode}\n};\n`;
|
||||
return code;
|
||||
}
|
||||
if (localsCode) {
|
||||
code += options.modules.namedExport ? localsCode : `___CSS_LOADER_EXPORT___.locals = {\n${localsCode}\n};\n`;
|
||||
}
|
||||
code += `${options.esModule ? 'export default' : 'module.exports ='} ___CSS_LOADER_EXPORT___;\n`;
|
||||
return code;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=codegen.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
import { LightningCssLoader } from './loader';
|
||||
export { LightningCssMinifyPlugin } from './minify';
|
||||
export default LightningCssLoader;
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../src/build/webpack/loaders/lightningcss-loader/src/index.ts"],"sourcesContent":["import { LightningCssLoader } from './loader'\n\nexport { LightningCssMinifyPlugin } from './minify'\nexport default LightningCssLoader\n"],"names":["LightningCssLoader","LightningCssMinifyPlugin"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,WAAU;AAE7C,SAASC,wBAAwB,QAAQ,WAAU;AACnD,eAAeD,mBAAkB","ignoreList":[0]}
|
||||
Generated
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
export var ECacheKey = /*#__PURE__*/ function(ECacheKey) {
|
||||
ECacheKey["loader"] = "loader";
|
||||
ECacheKey["minify"] = "minify";
|
||||
return ECacheKey;
|
||||
}({});
|
||||
|
||||
//# sourceMappingURL=interface.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../src/build/webpack/loaders/lightningcss-loader/src/interface.ts"],"sourcesContent":["export enum ECacheKey {\n loader = 'loader',\n minify = 'minify',\n}\n"],"names":["ECacheKey"],"mappings":"AAAA,OAAO,IAAA,AAAKA,mCAAAA;;;WAAAA;MAGX","ignoreList":[0]}
|
||||
Generated
Vendored
+416
@@ -0,0 +1,416 @@
|
||||
import { getTargets } from './utils';
|
||||
import { getImportCode, getModuleCode, getExportCode } from './codegen';
|
||||
import { getFilter, getPreRequester, isDataUrl, isUrlRequestable, requestify, resolveRequests } from '../../css-loader/src/utils';
|
||||
import { stringifyRequest } from '../../../stringify-request';
|
||||
import { ECacheKey } from './interface';
|
||||
import { getBindingsSync } from '../../../../../build/swc';
|
||||
import { installBindings } from '../../../../../build/swc/install-bindings';
|
||||
const encoder = new TextEncoder();
|
||||
function createUrlAndImportVisitor(visitorOptions, apis, imports, replacements, replacedUrls, replacedImportUrls) {
|
||||
const importUrlToNameMap = new Map();
|
||||
let hasUrlImportHelper = false;
|
||||
const urlToNameMap = new Map();
|
||||
const urlToReplacementMap = new Map();
|
||||
let urlIndex = -1;
|
||||
let importUrlIndex = -1;
|
||||
function handleUrl(u) {
|
||||
let url = u.url;
|
||||
const needKeep = visitorOptions.urlFilter(url);
|
||||
if (!needKeep) {
|
||||
return u;
|
||||
}
|
||||
if (isDataUrl(url)) {
|
||||
return u;
|
||||
}
|
||||
urlIndex++;
|
||||
replacedUrls.set(urlIndex, url);
|
||||
url = `__NEXT_LIGHTNINGCSS_LOADER_URL_REPLACE_${urlIndex}__`;
|
||||
const [, query, hashOrQuery] = url.split(/(\?)?#/, 3);
|
||||
const queryParts = url.split('!');
|
||||
let prefix;
|
||||
if (queryParts.length > 1) {
|
||||
url = queryParts.pop();
|
||||
prefix = queryParts.join('!');
|
||||
}
|
||||
let hash = query ? '?' : '';
|
||||
hash += hashOrQuery ? `#${hashOrQuery}` : '';
|
||||
if (!hasUrlImportHelper) {
|
||||
imports.push({
|
||||
type: 'get_url_import',
|
||||
importName: '___CSS_LOADER_GET_URL_IMPORT___',
|
||||
url: JSON.stringify(require.resolve('../../css-loader/src/runtime/getUrl.js')),
|
||||
index: -1
|
||||
});
|
||||
hasUrlImportHelper = true;
|
||||
}
|
||||
const newUrl = prefix ? `${prefix}!${url}` : url;
|
||||
let importName = urlToNameMap.get(newUrl);
|
||||
if (!importName) {
|
||||
importName = `___CSS_LOADER_URL_IMPORT_${urlToNameMap.size}___`;
|
||||
urlToNameMap.set(newUrl, importName);
|
||||
imports.push({
|
||||
type: 'url',
|
||||
importName,
|
||||
url: JSON.stringify(newUrl),
|
||||
index: urlIndex
|
||||
});
|
||||
}
|
||||
// This should be true for string-urls in image-set
|
||||
const needQuotes = false;
|
||||
const replacementKey = JSON.stringify({
|
||||
newUrl,
|
||||
hash,
|
||||
needQuotes
|
||||
});
|
||||
let replacementName = urlToReplacementMap.get(replacementKey);
|
||||
if (!replacementName) {
|
||||
replacementName = `___CSS_LOADER_URL_REPLACEMENT_${urlToReplacementMap.size}___`;
|
||||
urlToReplacementMap.set(replacementKey, replacementName);
|
||||
replacements.push({
|
||||
replacementName,
|
||||
importName,
|
||||
hash,
|
||||
needQuotes
|
||||
});
|
||||
}
|
||||
return {
|
||||
loc: u.loc,
|
||||
url: replacementName
|
||||
};
|
||||
}
|
||||
return {
|
||||
Rule: {
|
||||
import (node) {
|
||||
if (visitorOptions.importFilter) {
|
||||
const needKeep = visitorOptions.importFilter(node.value.url, node.value.media);
|
||||
if (!needKeep) {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
let url = node.value.url;
|
||||
importUrlIndex++;
|
||||
replacedImportUrls.set(importUrlIndex, url);
|
||||
url = `__NEXT_LIGHTNINGCSS_LOADER_IMPORT_URL_REPLACE_${importUrlIndex}__`;
|
||||
// TODO: Use identical logic as valueParser.stringify()
|
||||
const media = node.value.media.mediaQueries.length ? JSON.stringify(node.value.media.mediaQueries) : undefined;
|
||||
const isRequestable = isUrlRequestable(url);
|
||||
let prefix;
|
||||
if (isRequestable) {
|
||||
const queryParts = url.split('!');
|
||||
if (queryParts.length > 1) {
|
||||
url = queryParts.pop();
|
||||
prefix = queryParts.join('!');
|
||||
}
|
||||
}
|
||||
if (!isRequestable) {
|
||||
apis.push({
|
||||
url,
|
||||
media
|
||||
});
|
||||
// Bug of lightningcss
|
||||
return {
|
||||
type: 'ignored',
|
||||
value: ''
|
||||
};
|
||||
}
|
||||
const newUrl = prefix ? `${prefix}!${url}` : url;
|
||||
let importName = importUrlToNameMap.get(newUrl);
|
||||
if (!importName) {
|
||||
importName = `___CSS_LOADER_AT_RULE_IMPORT_${importUrlToNameMap.size}___`;
|
||||
importUrlToNameMap.set(newUrl, importName);
|
||||
const importUrl = visitorOptions.urlHandler(newUrl);
|
||||
imports.push({
|
||||
type: 'rule_import',
|
||||
importName,
|
||||
url: importUrl
|
||||
});
|
||||
}
|
||||
apis.push({
|
||||
importName,
|
||||
media
|
||||
});
|
||||
// Bug of lightningcss
|
||||
return {
|
||||
type: 'ignored',
|
||||
value: ''
|
||||
};
|
||||
}
|
||||
},
|
||||
Url (node) {
|
||||
return handleUrl(node);
|
||||
}
|
||||
};
|
||||
}
|
||||
function createIcssVisitor({ apis, imports, replacements, replacedUrls, urlHandler }) {
|
||||
let index = -1;
|
||||
let replacementIndex = -1;
|
||||
return {
|
||||
Declaration: {
|
||||
composes (node) {
|
||||
if (node.property === 'unparsed') {
|
||||
return;
|
||||
}
|
||||
const specifier = node.value.from;
|
||||
if ((specifier == null ? void 0 : specifier.type) !== 'file') {
|
||||
return;
|
||||
}
|
||||
let url = specifier.value;
|
||||
if (!url) {
|
||||
return;
|
||||
}
|
||||
index++;
|
||||
replacedUrls.set(index, url);
|
||||
url = `__NEXT_LIGHTNINGCSS_LOADER_ICSS_URL_REPLACE_${index}__`;
|
||||
const importName = `___CSS_LOADER_ICSS_IMPORT_${imports.length}___`;
|
||||
imports.push({
|
||||
type: 'icss_import',
|
||||
importName,
|
||||
icss: true,
|
||||
url: urlHandler(url),
|
||||
index
|
||||
});
|
||||
apis.push({
|
||||
importName,
|
||||
dedupe: true,
|
||||
index
|
||||
});
|
||||
const newNames = [];
|
||||
for (const localName of node.value.names){
|
||||
replacementIndex++;
|
||||
const replacementName = `___CSS_LOADER_ICSS_IMPORT_${index}_REPLACEMENT_${replacementIndex}___`;
|
||||
replacements.push({
|
||||
replacementName,
|
||||
importName,
|
||||
localName
|
||||
});
|
||||
newNames.push(replacementName);
|
||||
}
|
||||
return {
|
||||
property: 'composes',
|
||||
value: {
|
||||
loc: node.value.loc,
|
||||
names: newNames,
|
||||
from: specifier
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
const LOADER_NAME = `lightningcss-loader`;
|
||||
export async function LightningCssLoader(source, prevMap) {
|
||||
var _options_modules, _options_lightningCssFeatures, _options_lightningCssFeatures1;
|
||||
const done = this.async();
|
||||
const options = this.getOptions();
|
||||
// Install bindings early so they are definitely available to the loader.
|
||||
// When run by webpack in next this is already done with correct configuration so this is a no-op.
|
||||
// In turbopack loaders are run in a subprocess so it may or may not be done.
|
||||
await installBindings();
|
||||
const { implementation, targets: userTargets, ...opts } = options;
|
||||
options.modules ??= {};
|
||||
if (implementation && typeof implementation.transformCss !== 'function') {
|
||||
done(Object.defineProperty(new TypeError(`[${LOADER_NAME}]: options.implementation.transformCss must be an 'lightningcss' transform function. Received ${typeof implementation.transformCss}`), "__NEXT_ERROR_CODE", {
|
||||
value: "E1033",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
}));
|
||||
return;
|
||||
}
|
||||
if (options.postcss) {
|
||||
var _postcssWithPlugins_plugins;
|
||||
const { postcssWithPlugins } = await options.postcss();
|
||||
if ((postcssWithPlugins == null ? void 0 : (_postcssWithPlugins_plugins = postcssWithPlugins.plugins) == null ? void 0 : _postcssWithPlugins_plugins.length) > 0) {
|
||||
throw Object.defineProperty(new Error(`[${LOADER_NAME}]: experimental.useLightningcss does not work with postcss plugins. Please remove 'useLightningcss: true' from your configuration.`), "__NEXT_ERROR_CODE", {
|
||||
value: "E999",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
const exports = [];
|
||||
const imports = [];
|
||||
const icssImports = [];
|
||||
const apis = [];
|
||||
const replacements = [];
|
||||
if (((_options_modules = options.modules) == null ? void 0 : _options_modules.exportOnlyLocals) !== true) {
|
||||
imports.unshift({
|
||||
type: 'api_import',
|
||||
importName: '___CSS_LOADER_API_IMPORT___',
|
||||
url: stringifyRequest(this, require.resolve('../../css-loader/src/runtime/api'))
|
||||
});
|
||||
}
|
||||
const transform = (implementation == null ? void 0 : implementation.transformCss) ?? getBindingsSync().css.lightning.transform;
|
||||
const replacedUrls = new Map();
|
||||
const icssReplacedUrls = new Map();
|
||||
const replacedImportUrls = new Map();
|
||||
const urlImportVisitor = createUrlAndImportVisitor({
|
||||
urlHandler: (url)=>stringifyRequest(this, getPreRequester(this)(options.importLoaders ?? 0) + url),
|
||||
urlFilter: getFilter(options.url, this.resourcePath),
|
||||
importFilter: getFilter(options.import, this.resourcePath),
|
||||
context: this.context
|
||||
}, apis, imports, replacements, replacedUrls, replacedImportUrls);
|
||||
const icssVisitor = createIcssVisitor({
|
||||
apis,
|
||||
imports: icssImports,
|
||||
replacements,
|
||||
replacedUrls: icssReplacedUrls,
|
||||
urlHandler: (url)=>stringifyRequest(this, getPreRequester(this)(options.importLoaders) + url)
|
||||
});
|
||||
// This works by returned visitors are not conflicting.
|
||||
// naive workaround for composeVisitors, as we do not directly depends on lightningcss's npm pkg
|
||||
// but next-swc provides bindings
|
||||
const visitor = {
|
||||
...urlImportVisitor,
|
||||
...icssVisitor
|
||||
};
|
||||
// Compute feature include/exclude masks from user config.
|
||||
// Default: always transpile nesting (bit 0). User `include` adds flags,
|
||||
// user `exclude` removes them from both include and exclude masks.
|
||||
const featureNamesToMask = getBindingsSync().css.lightning.featureNamesToMask;
|
||||
const userIncludeMask = ((_options_lightningCssFeatures = options.lightningCssFeatures) == null ? void 0 : _options_lightningCssFeatures.include) ? featureNamesToMask(options.lightningCssFeatures.include) : 0;
|
||||
const userExcludeMask = ((_options_lightningCssFeatures1 = options.lightningCssFeatures) == null ? void 0 : _options_lightningCssFeatures1.exclude) ? featureNamesToMask(options.lightningCssFeatures.exclude) : 0;
|
||||
const includeMask = (1 | userIncludeMask) & ~userExcludeMask // 1 = Features.Nesting
|
||||
;
|
||||
try {
|
||||
const { code, map, exports: moduleExports } = transform({
|
||||
...opts,
|
||||
visitor,
|
||||
cssModules: options.modules ? {
|
||||
pattern: process.env.__NEXT_TEST_MODE ? '[name]__[local]' : '[name]__[hash]__[local]'
|
||||
} : undefined,
|
||||
filename: this.resourcePath,
|
||||
code: encoder.encode(source),
|
||||
sourceMap: this.sourceMap,
|
||||
targets: getTargets({
|
||||
targets: userTargets,
|
||||
key: ECacheKey.loader
|
||||
}),
|
||||
inputSourceMap: this.sourceMap && prevMap ? JSON.stringify(prevMap) : undefined,
|
||||
include: includeMask,
|
||||
exclude: userExcludeMask
|
||||
});
|
||||
let cssCodeAsString = code.toString();
|
||||
if (moduleExports) {
|
||||
for(const name in moduleExports){
|
||||
if (Object.prototype.hasOwnProperty.call(moduleExports, name)) {
|
||||
const v = moduleExports[name];
|
||||
let value = v.name;
|
||||
for (const compose of v.composes){
|
||||
value += ` ${compose.name}`;
|
||||
}
|
||||
exports.push({
|
||||
name,
|
||||
value
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
if (replacedUrls.size !== 0) {
|
||||
const urlResolver = this.getResolve({
|
||||
conditionNames: [
|
||||
'asset'
|
||||
],
|
||||
mainFields: [
|
||||
'asset'
|
||||
],
|
||||
mainFiles: [],
|
||||
extensions: []
|
||||
});
|
||||
for (const [index, url] of replacedUrls.entries()){
|
||||
const [pathname, , ] = url.split(/(\?)?#/, 3);
|
||||
const request = requestify(pathname, this.rootContext);
|
||||
const resolvedUrl = await resolveRequests(urlResolver, this.context, [
|
||||
...new Set([
|
||||
request,
|
||||
url
|
||||
])
|
||||
]);
|
||||
for (const importItem of imports){
|
||||
importItem.url = importItem.url.replace(`__NEXT_LIGHTNINGCSS_LOADER_URL_REPLACE_${index}__`, resolvedUrl ?? url);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (replacedImportUrls.size !== 0) {
|
||||
const importResolver = this.getResolve({
|
||||
conditionNames: [
|
||||
'style'
|
||||
],
|
||||
extensions: [
|
||||
'.css'
|
||||
],
|
||||
mainFields: [
|
||||
'css',
|
||||
'style',
|
||||
'main',
|
||||
'...'
|
||||
],
|
||||
mainFiles: [
|
||||
'index',
|
||||
'...'
|
||||
],
|
||||
restrictions: [
|
||||
/\.css$/i
|
||||
]
|
||||
});
|
||||
for (const [index, url] of replacedImportUrls.entries()){
|
||||
const [pathname, , ] = url.split(/(\?)?#/, 3);
|
||||
const request = requestify(pathname, this.rootContext);
|
||||
const resolvedUrl = await resolveRequests(importResolver, this.context, [
|
||||
...new Set([
|
||||
request,
|
||||
url
|
||||
])
|
||||
]);
|
||||
for (const importItem of imports){
|
||||
importItem.url = importItem.url.replace(`__NEXT_LIGHTNINGCSS_LOADER_IMPORT_URL_REPLACE_${index}__`, resolvedUrl ?? url);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (icssReplacedUrls.size !== 0) {
|
||||
const icssResolver = this.getResolve({
|
||||
conditionNames: [
|
||||
'style'
|
||||
],
|
||||
extensions: [],
|
||||
mainFields: [
|
||||
'css',
|
||||
'style',
|
||||
'main',
|
||||
'...'
|
||||
],
|
||||
mainFiles: [
|
||||
'index',
|
||||
'...'
|
||||
]
|
||||
});
|
||||
for (const [index, url] of icssReplacedUrls.entries()){
|
||||
const [pathname, , ] = url.split(/(\?)?#/, 3);
|
||||
const request = requestify(pathname, this.rootContext);
|
||||
const resolvedUrl = await resolveRequests(icssResolver, this.context, [
|
||||
...new Set([
|
||||
url,
|
||||
request
|
||||
])
|
||||
]);
|
||||
for (const importItem of icssImports){
|
||||
importItem.url = importItem.url.replace(`__NEXT_LIGHTNINGCSS_LOADER_ICSS_URL_REPLACE_${index}__`, resolvedUrl ?? url);
|
||||
}
|
||||
}
|
||||
}
|
||||
imports.push(...icssImports);
|
||||
const importCode = getImportCode(imports, options);
|
||||
const moduleCode = getModuleCode({
|
||||
css: cssCodeAsString,
|
||||
map
|
||||
}, apis, replacements, options, this);
|
||||
const exportCode = getExportCode(exports, replacements, options);
|
||||
const esCode = `${importCode}${moduleCode}${exportCode}`;
|
||||
done(null, esCode, map && JSON.parse(map.toString()));
|
||||
} catch (error) {
|
||||
console.error('lightningcss-loader error', error);
|
||||
done(error);
|
||||
}
|
||||
}
|
||||
export const raw = true;
|
||||
|
||||
//# sourceMappingURL=loader.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+86
@@ -0,0 +1,86 @@
|
||||
// @ts-ignore
|
||||
import { ModuleFilenameHelpers } from 'next/dist/compiled/webpack/webpack';
|
||||
import { webpack } from 'next/dist/compiled/webpack/webpack';
|
||||
// @ts-ignore
|
||||
import { RawSource, SourceMapSource } from 'next/dist/compiled/webpack-sources3';
|
||||
import { ECacheKey } from './interface';
|
||||
import { getTargets } from './utils';
|
||||
import { Buffer } from 'buffer';
|
||||
import { getBindingsSync } from '../../../../../build/swc';
|
||||
const PLUGIN_NAME = 'lightning-css-minify';
|
||||
const CSS_FILE_REG = /\.css(?:\?.*)?$/i;
|
||||
export class LightningCssMinifyPlugin {
|
||||
constructor(opts = {}){
|
||||
const { implementation, ...otherOpts } = opts;
|
||||
if (implementation && typeof implementation.transformCss !== 'function') {
|
||||
throw Object.defineProperty(new TypeError(`[LightningCssMinifyPlugin]: implementation.transformCss must be an 'lightningcss' transform function. Received ${typeof implementation.transformCss}`), "__NEXT_ERROR_CODE", {
|
||||
value: "E561",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
this.transform = implementation == null ? void 0 : implementation.transformCss;
|
||||
this.options = otherOpts;
|
||||
}
|
||||
apply(compiler) {
|
||||
const meta = JSON.stringify({
|
||||
name: '@next/lightningcss-loader',
|
||||
version: '0.0.0',
|
||||
options: this.options
|
||||
});
|
||||
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation)=>{
|
||||
compilation.hooks.chunkHash.tap(PLUGIN_NAME, (_, hash)=>hash.update(meta));
|
||||
compilation.hooks.processAssets.tapPromise({
|
||||
name: PLUGIN_NAME,
|
||||
stage: webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE,
|
||||
additionalAssets: true
|
||||
}, async ()=>await this.transformAssets(compilation));
|
||||
compilation.hooks.statsPrinter.tap(PLUGIN_NAME, (statsPrinter)=>{
|
||||
statsPrinter.hooks.print.for('asset.info.minimized')// @ts-ignore
|
||||
.tap(PLUGIN_NAME, (minimized, { green, formatFlag })=>{
|
||||
// @ts-ignore
|
||||
return minimized ? green(formatFlag('minimized')) : undefined;
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
async transformAssets(compilation) {
|
||||
const { options: { devtool } } = compilation.compiler;
|
||||
if (!this.transform) {
|
||||
this.transform = getBindingsSync().css.lightning.transform;
|
||||
}
|
||||
const sourcemap = this.options.sourceMap === undefined ? devtool && devtool.includes('source-map') : this.options.sourceMap;
|
||||
const { include, exclude, test: testRegExp, targets: userTargets, ...transformOptions } = this.options;
|
||||
const assets = compilation.getAssets().filter((asset)=>// Filter out already minimized
|
||||
!asset.info.minimized && // Filter out by file type
|
||||
(testRegExp || CSS_FILE_REG).test(asset.name) && ModuleFilenameHelpers.matchObject({
|
||||
include,
|
||||
exclude
|
||||
}, asset.name));
|
||||
await Promise.all(assets.map(async (asset)=>{
|
||||
const { source, map } = asset.source.sourceAndMap();
|
||||
const sourceAsString = source.toString();
|
||||
const code = typeof source === 'string' ? Buffer.from(source) : source;
|
||||
const targets = getTargets({
|
||||
targets: userTargets,
|
||||
key: ECacheKey.minify
|
||||
});
|
||||
const result = await this.transform({
|
||||
filename: asset.name,
|
||||
code,
|
||||
minify: true,
|
||||
sourceMap: sourcemap,
|
||||
targets,
|
||||
...transformOptions
|
||||
});
|
||||
const codeString = result.code.toString();
|
||||
compilation.updateAsset(asset.name, // @ts-ignore
|
||||
sourcemap ? new SourceMapSource(codeString, asset.name, JSON.parse(result.map.toString()), sourceAsString, map, true) : new RawSource(codeString), {
|
||||
...asset.info,
|
||||
minimized: true
|
||||
});
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
//# sourceMappingURL=minify.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+48
@@ -0,0 +1,48 @@
|
||||
let targetsCache = {};
|
||||
/**
|
||||
* Convert a version number to a single 24-bit number
|
||||
*
|
||||
* https://github.com/lumeland/lume/blob/4cc75599006df423a14befc06d3ed8493c645b09/plugins/lightningcss.ts#L160
|
||||
*/ function version(major, minor = 0, patch = 0) {
|
||||
return major << 16 | minor << 8 | patch;
|
||||
}
|
||||
function parseVersion(v) {
|
||||
return v.split('.').reduce((acc, val)=>{
|
||||
if (!acc) {
|
||||
return null;
|
||||
}
|
||||
const parsed = parseInt(val, 10);
|
||||
if (isNaN(parsed)) {
|
||||
return null;
|
||||
}
|
||||
acc.push(parsed);
|
||||
return acc;
|
||||
}, []);
|
||||
}
|
||||
function browserslistToTargets(targets) {
|
||||
return targets.reduce((acc, value)=>{
|
||||
const [name, v] = value.split(' ');
|
||||
const parsedVersion = parseVersion(v);
|
||||
if (!parsedVersion) {
|
||||
return acc;
|
||||
}
|
||||
const versionDigit = version(parsedVersion[0], parsedVersion[1], parsedVersion[2]);
|
||||
if (name === 'and_qq' || name === 'and_uc' || name === 'baidu' || name === 'bb' || name === 'kaios' || name === 'op_mini') {
|
||||
return acc;
|
||||
}
|
||||
if (acc[name] == null || versionDigit < acc[name]) {
|
||||
acc[name] = versionDigit;
|
||||
}
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
export const getTargets = (opts)=>{
|
||||
const cache = targetsCache[opts.key];
|
||||
if (cache) {
|
||||
return cache;
|
||||
}
|
||||
const result = browserslistToTargets(opts.targets ?? []);
|
||||
return targetsCache[opts.key] = result;
|
||||
};
|
||||
|
||||
//# sourceMappingURL=utils.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../../src/build/webpack/loaders/lightningcss-loader/src/utils.ts"],"sourcesContent":["let targetsCache: Record<string, any> = {}\n\n/**\n * Convert a version number to a single 24-bit number\n *\n * https://github.com/lumeland/lume/blob/4cc75599006df423a14befc06d3ed8493c645b09/plugins/lightningcss.ts#L160\n */\nfunction version(major: number, minor = 0, patch = 0): number {\n return (major << 16) | (minor << 8) | patch\n}\n\nfunction parseVersion(v: string) {\n return v.split('.').reduce(\n (acc, val) => {\n if (!acc) {\n return null\n }\n\n const parsed = parseInt(val, 10)\n if (isNaN(parsed)) {\n return null\n }\n acc.push(parsed)\n return acc\n },\n [] as Array<number> | null\n )\n}\n\nfunction browserslistToTargets(targets: Array<string>) {\n return targets.reduce(\n (acc, value) => {\n const [name, v] = value.split(' ')\n const parsedVersion = parseVersion(v)\n\n if (!parsedVersion) {\n return acc\n }\n const versionDigit = version(\n parsedVersion[0],\n parsedVersion[1],\n parsedVersion[2]\n )\n\n if (\n name === 'and_qq' ||\n name === 'and_uc' ||\n name === 'baidu' ||\n name === 'bb' ||\n name === 'kaios' ||\n name === 'op_mini'\n ) {\n return acc\n }\n\n if (acc[name] == null || versionDigit < acc[name]) {\n acc[name] = versionDigit\n }\n\n return acc\n },\n {} as Record<string, number>\n )\n}\n\nexport const getTargets = (opts: { targets?: string[]; key: any }) => {\n const cache = targetsCache[opts.key]\n if (cache) {\n return cache\n }\n\n const result = browserslistToTargets(opts.targets ?? [])\n return (targetsCache[opts.key] = result)\n}\n"],"names":["targetsCache","version","major","minor","patch","parseVersion","v","split","reduce","acc","val","parsed","parseInt","isNaN","push","browserslistToTargets","targets","value","name","parsedVersion","versionDigit","getTargets","opts","cache","key","result"],"mappings":"AAAA,IAAIA,eAAoC,CAAC;AAEzC;;;;CAIC,GACD,SAASC,QAAQC,KAAa,EAAEC,QAAQ,CAAC,EAAEC,QAAQ,CAAC;IAClD,OAAO,AAACF,SAAS,KAAOC,SAAS,IAAKC;AACxC;AAEA,SAASC,aAAaC,CAAS;IAC7B,OAAOA,EAAEC,KAAK,CAAC,KAAKC,MAAM,CACxB,CAACC,KAAKC;QACJ,IAAI,CAACD,KAAK;YACR,OAAO;QACT;QAEA,MAAME,SAASC,SAASF,KAAK;QAC7B,IAAIG,MAAMF,SAAS;YACjB,OAAO;QACT;QACAF,IAAIK,IAAI,CAACH;QACT,OAAOF;IACT,GACA,EAAE;AAEN;AAEA,SAASM,sBAAsBC,OAAsB;IACnD,OAAOA,QAAQR,MAAM,CACnB,CAACC,KAAKQ;QACJ,MAAM,CAACC,MAAMZ,EAAE,GAAGW,MAAMV,KAAK,CAAC;QAC9B,MAAMY,gBAAgBd,aAAaC;QAEnC,IAAI,CAACa,eAAe;YAClB,OAAOV;QACT;QACA,MAAMW,eAAenB,QACnBkB,aAAa,CAAC,EAAE,EAChBA,aAAa,CAAC,EAAE,EAChBA,aAAa,CAAC,EAAE;QAGlB,IACED,SAAS,YACTA,SAAS,YACTA,SAAS,WACTA,SAAS,QACTA,SAAS,WACTA,SAAS,WACT;YACA,OAAOT;QACT;QAEA,IAAIA,GAAG,CAACS,KAAK,IAAI,QAAQE,eAAeX,GAAG,CAACS,KAAK,EAAE;YACjDT,GAAG,CAACS,KAAK,GAAGE;QACd;QAEA,OAAOX;IACT,GACA,CAAC;AAEL;AAEA,OAAO,MAAMY,aAAa,CAACC;IACzB,MAAMC,QAAQvB,YAAY,CAACsB,KAAKE,GAAG,CAAC;IACpC,IAAID,OAAO;QACT,OAAOA;IACT;IAEA,MAAME,SAASV,sBAAsBO,KAAKN,OAAO,IAAI,EAAE;IACvD,OAAQhB,YAAY,CAACsB,KAAKE,GAAG,CAAC,GAAGC;AACnC,EAAC","ignoreList":[0]}
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
import path from 'path';
|
||||
import { stringify } from 'querystring';
|
||||
import { STATIC_METADATA_IMAGES } from '../../../../lib/metadata/is-metadata-route';
|
||||
import { WEBPACK_RESOURCE_QUERIES } from '../../../../lib/constants';
|
||||
const METADATA_TYPE = 'metadata';
|
||||
const NUMERIC_SUFFIX_ARRAY = Array(10).fill(0);
|
||||
// Produce all compositions with filename (icon, apple-icon, etc.) with extensions (png, jpg, etc.)
|
||||
async function enumMetadataFiles(dir, filename, extensions, { metadataResolver, // When set to true, possible filename without extension could: icon, icon0, ..., icon9
|
||||
numericSuffix }) {
|
||||
const collectedFiles = [];
|
||||
// Collect <filename>.<ext>, <filename>[].<ext>
|
||||
const possibleFileNames = [
|
||||
filename
|
||||
].concat(numericSuffix ? NUMERIC_SUFFIX_ARRAY.map((_, index)=>filename + index) : []);
|
||||
for (const name of possibleFileNames){
|
||||
const resolved = await metadataResolver(dir, name, extensions);
|
||||
collectedFiles.push(...resolved);
|
||||
}
|
||||
return collectedFiles;
|
||||
}
|
||||
export async function createStaticMetadataFromRoute(resolvedDir, { segment, metadataResolver, isRootLayoutOrRootPage, pageExtensions, basePath }) {
|
||||
let hasStaticMetadataFiles = false;
|
||||
const staticImagesMetadata = {
|
||||
icon: [],
|
||||
apple: [],
|
||||
twitter: [],
|
||||
openGraph: [],
|
||||
manifest: undefined
|
||||
};
|
||||
async function collectIconModuleIfExists(type) {
|
||||
if (type === 'manifest') {
|
||||
const staticManifestExtension = [
|
||||
'webmanifest',
|
||||
'json'
|
||||
];
|
||||
const manifestFile = await enumMetadataFiles(resolvedDir, 'manifest', staticManifestExtension.concat(pageExtensions), {
|
||||
metadataResolver,
|
||||
numericSuffix: false
|
||||
});
|
||||
if (manifestFile.length > 0) {
|
||||
hasStaticMetadataFiles = true;
|
||||
const { name, ext } = path.parse(manifestFile[0]);
|
||||
const extension = staticManifestExtension.includes(ext.slice(1)) ? ext.slice(1) : 'webmanifest';
|
||||
staticImagesMetadata.manifest = JSON.stringify(`${basePath}/${name}.${extension}`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
const isFavicon = type === 'favicon';
|
||||
const resolvedMetadataFiles = await enumMetadataFiles(resolvedDir, STATIC_METADATA_IMAGES[type].filename, [
|
||||
...STATIC_METADATA_IMAGES[type].extensions,
|
||||
...isFavicon ? [] : pageExtensions
|
||||
], {
|
||||
metadataResolver,
|
||||
numericSuffix: !isFavicon
|
||||
});
|
||||
resolvedMetadataFiles.sort((a, b)=>a.localeCompare(b)).forEach((filepath)=>{
|
||||
const imageModuleImportSource = `next-metadata-image-loader?${stringify({
|
||||
type,
|
||||
segment,
|
||||
basePath,
|
||||
pageExtensions
|
||||
})}!${filepath}?${WEBPACK_RESOURCE_QUERIES.metadata}`;
|
||||
const imageModule = `(async (props) => (await import(/* webpackMode: "eager" */ ${JSON.stringify(imageModuleImportSource)})).default(props))`;
|
||||
hasStaticMetadataFiles = true;
|
||||
if (type === 'favicon') {
|
||||
staticImagesMetadata.icon.unshift(imageModule);
|
||||
} else {
|
||||
staticImagesMetadata[type].push(imageModule);
|
||||
}
|
||||
});
|
||||
}
|
||||
// Intentionally make these serial to reuse directory access cache.
|
||||
await collectIconModuleIfExists('icon');
|
||||
await collectIconModuleIfExists('apple');
|
||||
await collectIconModuleIfExists('openGraph');
|
||||
await collectIconModuleIfExists('twitter');
|
||||
if (isRootLayoutOrRootPage) {
|
||||
await collectIconModuleIfExists('favicon');
|
||||
await collectIconModuleIfExists('manifest');
|
||||
}
|
||||
return hasStaticMetadataFiles ? staticImagesMetadata : null;
|
||||
}
|
||||
export function createMetadataExportsCode(metadata) {
|
||||
return metadata ? `${METADATA_TYPE}: {
|
||||
icon: [${metadata.icon.join(',')}],
|
||||
apple: [${metadata.apple.join(',')}],
|
||||
openGraph: [${metadata.openGraph.join(',')}],
|
||||
twitter: [${metadata.twitter.join(',')}],
|
||||
manifest: ${metadata.manifest ? metadata.manifest : 'undefined'}
|
||||
}` : '';
|
||||
}
|
||||
|
||||
//# sourceMappingURL=discover.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+144
@@ -0,0 +1,144 @@
|
||||
import { resolveArray } from '../../../../lib/metadata/generate/utils';
|
||||
// convert robots data to txt string
|
||||
export function resolveRobots(data) {
|
||||
let content = '';
|
||||
const rules = Array.isArray(data.rules) ? data.rules : [
|
||||
data.rules
|
||||
];
|
||||
for (const rule of rules){
|
||||
const userAgent = resolveArray(rule.userAgent || [
|
||||
'*'
|
||||
]);
|
||||
for (const agent of userAgent){
|
||||
content += `User-Agent: ${agent}\n`;
|
||||
}
|
||||
if (rule.allow) {
|
||||
const allow = resolveArray(rule.allow);
|
||||
for (const item of allow){
|
||||
content += `Allow: ${item}\n`;
|
||||
}
|
||||
}
|
||||
if (rule.disallow) {
|
||||
const disallow = resolveArray(rule.disallow);
|
||||
for (const item of disallow){
|
||||
content += `Disallow: ${item}\n`;
|
||||
}
|
||||
}
|
||||
if (rule.crawlDelay) {
|
||||
content += `Crawl-delay: ${rule.crawlDelay}\n`;
|
||||
}
|
||||
content += '\n';
|
||||
}
|
||||
if (data.host) {
|
||||
content += `Host: ${data.host}\n`;
|
||||
}
|
||||
if (data.sitemap) {
|
||||
const sitemap = resolveArray(data.sitemap);
|
||||
// TODO-METADATA: support injecting sitemap url into robots.txt
|
||||
sitemap.forEach((item)=>{
|
||||
content += `Sitemap: ${item}\n`;
|
||||
});
|
||||
}
|
||||
return content;
|
||||
}
|
||||
// TODO-METADATA: support multi sitemap files
|
||||
// convert sitemap data to xml string
|
||||
export function resolveSitemap(data) {
|
||||
const hasAlternates = data.some((item)=>Object.keys(item.alternates ?? {}).length > 0);
|
||||
const hasImages = data.some((item)=>{
|
||||
var _item_images;
|
||||
return Boolean((_item_images = item.images) == null ? void 0 : _item_images.length);
|
||||
});
|
||||
const hasVideos = data.some((item)=>{
|
||||
var _item_videos;
|
||||
return Boolean((_item_videos = item.videos) == null ? void 0 : _item_videos.length);
|
||||
});
|
||||
let content = '';
|
||||
content += '<?xml version="1.0" encoding="UTF-8"?>\n';
|
||||
content += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"';
|
||||
if (hasImages) {
|
||||
content += ' xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"';
|
||||
}
|
||||
if (hasVideos) {
|
||||
content += ' xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"';
|
||||
}
|
||||
if (hasAlternates) {
|
||||
content += ' xmlns:xhtml="http://www.w3.org/1999/xhtml">\n';
|
||||
} else {
|
||||
content += '>\n';
|
||||
}
|
||||
for (const item of data){
|
||||
var _item_alternates, _item_images, _item_videos;
|
||||
content += '<url>\n';
|
||||
content += `<loc>${item.url}</loc>\n`;
|
||||
const languages = (_item_alternates = item.alternates) == null ? void 0 : _item_alternates.languages;
|
||||
if (languages && Object.keys(languages).length) {
|
||||
// Since sitemap is separated from the page rendering, there's not metadataBase accessible yet.
|
||||
// we give the default setting that won't effect the languages resolving.
|
||||
for(const language in languages){
|
||||
content += `<xhtml:link rel="alternate" hreflang="${language}" href="${languages[language]}" />\n`;
|
||||
}
|
||||
}
|
||||
if ((_item_images = item.images) == null ? void 0 : _item_images.length) {
|
||||
for (const image of item.images){
|
||||
content += `<image:image>\n<image:loc>${image}</image:loc>\n</image:image>\n`;
|
||||
}
|
||||
}
|
||||
if ((_item_videos = item.videos) == null ? void 0 : _item_videos.length) {
|
||||
for (const video of item.videos){
|
||||
let videoFields = [
|
||||
`<video:video>`,
|
||||
`<video:title>${video.title}</video:title>`,
|
||||
`<video:thumbnail_loc>${video.thumbnail_loc}</video:thumbnail_loc>`,
|
||||
`<video:description>${video.description}</video:description>`,
|
||||
video.content_loc && `<video:content_loc>${video.content_loc}</video:content_loc>`,
|
||||
video.player_loc && `<video:player_loc>${video.player_loc}</video:player_loc>`,
|
||||
video.duration && `<video:duration>${video.duration}</video:duration>`,
|
||||
video.view_count && `<video:view_count>${video.view_count}</video:view_count>`,
|
||||
video.tag && `<video:tag>${video.tag}</video:tag>`,
|
||||
video.rating && `<video:rating>${video.rating}</video:rating>`,
|
||||
video.expiration_date && `<video:expiration_date>${video.expiration_date}</video:expiration_date>`,
|
||||
video.publication_date && `<video:publication_date>${video.publication_date}</video:publication_date>`,
|
||||
video.family_friendly && `<video:family_friendly>${video.family_friendly}</video:family_friendly>`,
|
||||
video.requires_subscription && `<video:requires_subscription>${video.requires_subscription}</video:requires_subscription>`,
|
||||
video.live && `<video:live>${video.live}</video:live>`,
|
||||
video.restriction && `<video:restriction relationship="${video.restriction.relationship}">${video.restriction.content}</video:restriction>`,
|
||||
video.platform && `<video:platform relationship="${video.platform.relationship}">${video.platform.content}</video:platform>`,
|
||||
video.uploader && `<video:uploader${video.uploader.info && ` info="${video.uploader.info}"`}>${video.uploader.content}</video:uploader>`,
|
||||
`</video:video>\n`
|
||||
].filter(Boolean);
|
||||
content += videoFields.join('\n');
|
||||
}
|
||||
}
|
||||
if (item.lastModified) {
|
||||
const serializedDate = item.lastModified instanceof Date ? item.lastModified.toISOString() : item.lastModified;
|
||||
content += `<lastmod>${serializedDate}</lastmod>\n`;
|
||||
}
|
||||
if (item.changeFrequency) {
|
||||
content += `<changefreq>${item.changeFrequency}</changefreq>\n`;
|
||||
}
|
||||
if (typeof item.priority === 'number') {
|
||||
content += `<priority>${item.priority}</priority>\n`;
|
||||
}
|
||||
content += '</url>\n';
|
||||
}
|
||||
content += '</urlset>\n';
|
||||
return content;
|
||||
}
|
||||
export function resolveManifest(data) {
|
||||
return JSON.stringify(data);
|
||||
}
|
||||
export function resolveRouteData(data, fileType) {
|
||||
if (fileType === 'robots') {
|
||||
return resolveRobots(data);
|
||||
}
|
||||
if (fileType === 'sitemap') {
|
||||
return resolveSitemap(data);
|
||||
}
|
||||
if (fileType === 'manifest') {
|
||||
return resolveManifest(data);
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
//# sourceMappingURL=resolve-route-data.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
+4
@@ -0,0 +1,4 @@
|
||||
// TODO-APP: check if this can be narrowed.
|
||||
export { };
|
||||
|
||||
//# sourceMappingURL=types.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../../src/build/webpack/loaders/metadata/types.ts"],"sourcesContent":["// TODO-APP: check if this can be narrowed.\nexport type ModuleGetter = () => any\n\nexport type ModuleTuple = [getModule: ModuleGetter, filePath: string]\n\n// Contain the collecting image module paths\nexport type CollectingMetadata = {\n icon: string[]\n apple: string[]\n twitter: string[]\n openGraph: string[]\n manifest?: string\n}\n\n// Contain the collecting evaluated image module\nexport type CollectedMetadata = {\n icon: ModuleGetter[]\n apple: ModuleGetter[]\n twitter: ModuleGetter[] | null\n openGraph: ModuleGetter[] | null\n manifest?: string\n}\n\nexport type MetadataImageModule = {\n url: string\n type?: string\n alt?: string\n} & (\n | { sizes?: string }\n | {\n width?: number\n height?: number\n }\n)\n\nexport type PossibleImageFileNameConvention =\n | 'icon'\n | 'apple'\n | 'favicon'\n | 'twitter'\n | 'openGraph'\n\nexport type PossibleStaticMetadataFileNameConvention =\n | PossibleImageFileNameConvention\n | 'manifest'\n"],"names":[],"mappings":"AAAA,2CAA2C;AA0C3C,WAEc","ignoreList":[0]}
|
||||
Generated
Vendored
+24
@@ -0,0 +1,24 @@
|
||||
import path from 'path';
|
||||
/**
|
||||
* This loader is to create special re-exports from a specific file.
|
||||
* For example, the following loader:
|
||||
*
|
||||
* modularize-import-loader?name=Arrow&from=Arrow&as=default&join=./icons/Arrow!lucide-react
|
||||
*
|
||||
* will be used to create a re-export of:
|
||||
*
|
||||
* export { Arrow as default } from "join(resolve_path('lucide-react'), '/icons/Arrow')"
|
||||
*
|
||||
* This works even if there's no export field in the package.json of the package.
|
||||
*/ export default function transformSource() {
|
||||
const { name, from, as, join } = this.getOptions();
|
||||
const { resourcePath } = this;
|
||||
const fullPath = join ? path.join(path.dirname(resourcePath), join) : resourcePath;
|
||||
return `
|
||||
export {
|
||||
${from === 'default' ? 'default' : name} as ${as === 'default' ? 'default' : name}
|
||||
} from ${JSON.stringify(fullPath)}
|
||||
`;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=modularize-import-loader.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/loaders/modularize-import-loader.ts"],"sourcesContent":["import path from 'path'\n\nexport type ModularizeImportLoaderOptions = {\n name: string\n join?: string\n from: 'default' | 'named'\n as: 'default' | 'named'\n}\n\n/**\n * This loader is to create special re-exports from a specific file.\n * For example, the following loader:\n *\n * modularize-import-loader?name=Arrow&from=Arrow&as=default&join=./icons/Arrow!lucide-react\n *\n * will be used to create a re-export of:\n *\n * export { Arrow as default } from \"join(resolve_path('lucide-react'), '/icons/Arrow')\"\n *\n * This works even if there's no export field in the package.json of the package.\n */\nexport default function transformSource(this: any) {\n const { name, from, as, join }: ModularizeImportLoaderOptions =\n this.getOptions()\n const { resourcePath } = this\n const fullPath = join\n ? path.join(path.dirname(resourcePath), join)\n : resourcePath\n\n return `\nexport {\n ${from === 'default' ? 'default' : name} as ${\n as === 'default' ? 'default' : name\n }\n} from ${JSON.stringify(fullPath)}\n`\n}\n"],"names":["path","transformSource","name","from","as","join","getOptions","resourcePath","fullPath","dirname","JSON","stringify"],"mappings":"AAAA,OAAOA,UAAU,OAAM;AASvB;;;;;;;;;;;CAWC,GACD,eAAe,SAASC;IACtB,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAC5B,IAAI,CAACC,UAAU;IACjB,MAAM,EAAEC,YAAY,EAAE,GAAG,IAAI;IAC7B,MAAMC,WAAWH,OACbL,KAAKK,IAAI,CAACL,KAAKS,OAAO,CAACF,eAAeF,QACtCE;IAEJ,OAAO,CAAC;;EAER,EAAEJ,SAAS,YAAY,YAAYD,KAAK,IAAI,EAC1CE,OAAO,YAAY,YAAYF,KAChC;OACI,EAAEQ,KAAKC,SAAS,CAACH,UAAU;AAClC,CAAC;AACD","ignoreList":[0]}
|
||||
Generated
Vendored
+50
@@ -0,0 +1,50 @@
|
||||
import path from 'path';
|
||||
import { stringify } from 'querystring';
|
||||
import { WEBPACK_RESOURCE_QUERIES } from '../../../../lib/constants';
|
||||
import { DEFAULT_METADATA_ROUTE_EXTENSIONS, isMetadataRouteFile } from '../../../../lib/metadata/is-metadata-route';
|
||||
import { AppBundlePathNormalizer } from '../../../../server/normalizers/built/app/app-bundle-path-normalizer';
|
||||
import { AppPathnameNormalizer } from '../../../../server/normalizers/built/app/app-pathname-normalizer';
|
||||
import { loadEntrypoint } from '../../../load-entrypoint';
|
||||
import { getFilenameAndExtension } from '../next-metadata-route-loader';
|
||||
export async function createAppRouteCode({ appDir, name, page, pagePath, resolveAppRoute, pageExtensions, nextConfigOutput }) {
|
||||
// routePath is the path to the route handler file,
|
||||
// but could be aliased e.g. private-next-app-dir/favicon.ico
|
||||
const routePath = pagePath.replace(/[\\/]/, '/');
|
||||
// This, when used with the resolver will give us the pathname to the built
|
||||
// route handler file.
|
||||
let resolvedPagePath = await resolveAppRoute(routePath);
|
||||
if (!resolvedPagePath) {
|
||||
throw Object.defineProperty(new Error(`Invariant: could not resolve page path for ${name} at ${routePath}`), "__NEXT_ERROR_CODE", {
|
||||
value: "E281",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
// If this is a metadata route file, then we need to use the metadata-loader
|
||||
// for the route to ensure that the route is generated.
|
||||
const fileBaseName = path.parse(resolvedPagePath).name;
|
||||
const appDirRelativePath = resolvedPagePath.slice(appDir.length);
|
||||
const isMetadataEntryFile = isMetadataRouteFile(appDirRelativePath, DEFAULT_METADATA_ROUTE_EXTENSIONS, true);
|
||||
if (isMetadataEntryFile) {
|
||||
const { ext } = getFilenameAndExtension(resolvedPagePath);
|
||||
const isDynamicRouteExtension = pageExtensions.includes(ext);
|
||||
resolvedPagePath = `next-metadata-route-loader?${stringify({
|
||||
filePath: resolvedPagePath,
|
||||
isDynamicRouteExtension: isDynamicRouteExtension ? '1' : '0'
|
||||
})}!?${WEBPACK_RESOURCE_QUERIES.metadataRoute}`;
|
||||
}
|
||||
const pathname = new AppPathnameNormalizer().normalize(page);
|
||||
const bundlePath = new AppBundlePathNormalizer().normalize(page);
|
||||
return await loadEntrypoint('app-route', {
|
||||
VAR_USERLAND: resolvedPagePath,
|
||||
VAR_DEFINITION_PAGE: page,
|
||||
VAR_DEFINITION_PATHNAME: pathname,
|
||||
VAR_DEFINITION_FILENAME: fileBaseName,
|
||||
VAR_DEFINITION_BUNDLE_PATH: bundlePath,
|
||||
VAR_RESOLVED_PAGE_PATH: resolvedPagePath
|
||||
}, {
|
||||
nextConfigOutput: JSON.stringify(nextConfigOutput)
|
||||
});
|
||||
}
|
||||
|
||||
//# sourceMappingURL=create-app-route-code.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+778
@@ -0,0 +1,778 @@
|
||||
import { UNDERSCORE_GLOBAL_ERROR_ROUTE, UNDERSCORE_NOT_FOUND_ROUTE } from '../../../../shared/lib/constants';
|
||||
import { UNDERSCORE_GLOBAL_ERROR_ROUTE_ENTRY, UNDERSCORE_NOT_FOUND_ROUTE_ENTRY } from '../../../../shared/lib/entry-constants';
|
||||
import path from 'path';
|
||||
import { bold } from '../../../../lib/picocolors';
|
||||
import { getModuleBuildInfo } from '../get-module-build-info';
|
||||
import { verifyRootLayout } from '../../../../lib/verify-root-layout';
|
||||
import * as Log from '../../../output/log';
|
||||
import { APP_DIR_ALIAS } from '../../../../lib/constants';
|
||||
import { createMetadataExportsCode, createStaticMetadataFromRoute } from '../metadata/discover';
|
||||
import { promises as fs } from 'fs';
|
||||
import { isAppRouteRoute } from '../../../../lib/is-app-route-route';
|
||||
import { AppPathnameNormalizer } from '../../../../server/normalizers/built/app/app-pathname-normalizer';
|
||||
import { isAppBuiltinPage } from '../../../utils';
|
||||
import { loadEntrypoint } from '../../../load-entrypoint';
|
||||
import { isGroupSegment, DEFAULT_SEGMENT_KEY, PAGE_SEGMENT_KEY } from '../../../../shared/lib/segment';
|
||||
import { getFilesInDir } from '../../../../lib/get-files-in-dir';
|
||||
import { PARALLEL_ROUTE_DEFAULT_PATH } from '../../../../client/components/builtin/default';
|
||||
import { PARALLEL_ROUTE_DEFAULT_NULL_PATH } from '../../../../client/components/builtin/default-null';
|
||||
import { createAppRouteCode } from './create-app-route-code';
|
||||
import { MissingDefaultParallelRouteError } from '../../../../shared/lib/errors/missing-default-parallel-route-error';
|
||||
import { isInterceptionRouteAppPath } from '../../../../shared/lib/router/utils/interception-routes';
|
||||
import { normalizeAppPath } from '../../../../shared/lib/router/utils/app-paths';
|
||||
import { normalizePathSep } from '../../../../shared/lib/page-path/normalize-path-sep';
|
||||
import { installBindings } from '../../../swc/install-bindings';
|
||||
const HTTP_ACCESS_FALLBACKS = {
|
||||
'not-found': 'not-found',
|
||||
forbidden: 'forbidden',
|
||||
unauthorized: 'unauthorized'
|
||||
};
|
||||
const defaultHTTPAccessFallbackPaths = {
|
||||
'not-found': 'next/dist/client/components/builtin/not-found.js',
|
||||
forbidden: 'next/dist/client/components/builtin/forbidden.js',
|
||||
unauthorized: 'next/dist/client/components/builtin/unauthorized.js'
|
||||
};
|
||||
const FILE_TYPES = {
|
||||
layout: 'layout',
|
||||
template: 'template',
|
||||
error: 'error',
|
||||
loading: 'loading',
|
||||
'global-error': 'global-error',
|
||||
'global-not-found': 'global-not-found',
|
||||
...HTTP_ACCESS_FALLBACKS
|
||||
};
|
||||
const GLOBAL_ERROR_FILE_TYPE = 'global-error';
|
||||
const GLOBAL_NOT_FOUND_FILE_TYPE = 'global-not-found';
|
||||
const PAGE_SEGMENT = 'page$';
|
||||
const PARALLEL_VIRTUAL_SEGMENT = 'slot$';
|
||||
const defaultGlobalErrorPath = 'next/dist/client/components/builtin/global-error.js';
|
||||
const defaultNotFoundPath = 'next/dist/client/components/builtin/not-found.js';
|
||||
const defaultEmptyStubPath = 'next/dist/client/components/builtin/empty-stub.js';
|
||||
const defaultLayoutPath = 'next/dist/client/components/builtin/layout.js';
|
||||
const defaultGlobalNotFoundPath = 'next/dist/client/components/builtin/global-not-found.js';
|
||||
const appErrorPath = 'next/dist/client/components/builtin/app-error.js';
|
||||
const normalizeParallelKey = (key)=>key.startsWith('@') ? key.slice(1) : key;
|
||||
const isCatchAllSegment = (segment)=>segment.startsWith('[...') || segment.startsWith('[[...');
|
||||
const isDynamicSegment = (segment)=>segment.startsWith('[') && segment.endsWith(']');
|
||||
const isDirectory = async (pathname)=>{
|
||||
try {
|
||||
const stat = await fs.stat(pathname);
|
||||
return stat.isDirectory();
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
async function createTreeCodeFromPath(pagePath, { page, resolveDir, resolver, resolveParallelSegments, hasChildRoutesForSegment, getStaticSiblingSegments, metadataResolver, pageExtensions, basePath, collectedDeclarations, isGlobalNotFoundEnabled, isDev }) {
|
||||
const splittedPath = pagePath.split(/[\\/]/, 1);
|
||||
const isNotFoundRoute = page === UNDERSCORE_NOT_FOUND_ROUTE_ENTRY;
|
||||
const isAppErrorRoute = page === UNDERSCORE_GLOBAL_ERROR_ROUTE_ENTRY;
|
||||
const isDefaultNotFound = isAppBuiltinPage(pagePath);
|
||||
const appDirPrefix = isDefaultNotFound ? APP_DIR_ALIAS : splittedPath[0];
|
||||
let rootLayout;
|
||||
let globalError = defaultGlobalErrorPath;
|
||||
let globalNotFound = defaultNotFoundPath;
|
||||
async function resolveAdjacentParallelSegments(segmentPath) {
|
||||
const absoluteSegmentPath = resolveDir(`${appDirPrefix}${segmentPath}`);
|
||||
if (!absoluteSegmentPath) {
|
||||
return [];
|
||||
}
|
||||
const segmentIsDirectory = await isDirectory(absoluteSegmentPath);
|
||||
if (!segmentIsDirectory) {
|
||||
return [];
|
||||
}
|
||||
// We need to resolve all parallel routes in this level.
|
||||
const files = await fs.opendir(absoluteSegmentPath);
|
||||
const parallelSegments = [
|
||||
'children'
|
||||
];
|
||||
for await (const dirent of files){
|
||||
// Make sure name starts with "@" and is a directory.
|
||||
if (dirent.isDirectory() && dirent.name.charCodeAt(0) === 64) {
|
||||
parallelSegments.push(dirent.name);
|
||||
}
|
||||
}
|
||||
return parallelSegments;
|
||||
}
|
||||
async function createSubtreePropsFromSegmentPath(segments, nestedCollectedDeclarations) {
|
||||
const segmentPath = segments.join('/');
|
||||
// Existing tree are the children of the current segment
|
||||
const props = {};
|
||||
// Root layer could be 1st layer of normal routes
|
||||
const isRootLayer = segments.length === 0;
|
||||
const isRootLayoutOrRootPage = segments.length <= 1;
|
||||
// We need to resolve all parallel routes in this level.
|
||||
const parallelSegments = [];
|
||||
if (isRootLayer) {
|
||||
parallelSegments.push([
|
||||
'children',
|
||||
''
|
||||
]);
|
||||
} else {
|
||||
parallelSegments.push(...resolveParallelSegments(segmentPath));
|
||||
}
|
||||
let metadata = null;
|
||||
const routerDirPath = `${appDirPrefix}${segmentPath}`;
|
||||
const resolvedRouteDir = resolveDir(routerDirPath);
|
||||
if (resolvedRouteDir && // Do not collect metadata for app-error route as it's for generating pure static 500.html
|
||||
!normalizePathSep(pagePath).endsWith(appErrorPath)) {
|
||||
metadata = await createStaticMetadataFromRoute(resolvedRouteDir, {
|
||||
basePath,
|
||||
segment: segmentPath,
|
||||
metadataResolver,
|
||||
isRootLayoutOrRootPage,
|
||||
pageExtensions
|
||||
});
|
||||
}
|
||||
for (const [parallelKey, parallelSegment] of parallelSegments){
|
||||
// if parallelSegment is the page segment (ie, `page$` and not ['page$']), it gets loaded into the __PAGE__ slot
|
||||
// as it's the page for the current route.
|
||||
if (parallelSegment === PAGE_SEGMENT) {
|
||||
const matchedPagePath = `${appDirPrefix}${segmentPath}${parallelKey === 'children' ? '' : `/${parallelKey}`}/page`;
|
||||
const resolvedPagePath = await resolver(matchedPagePath);
|
||||
if (resolvedPagePath) {
|
||||
const varName = `page${nestedCollectedDeclarations.length}`;
|
||||
nestedCollectedDeclarations.push([
|
||||
varName,
|
||||
resolvedPagePath
|
||||
]);
|
||||
// Use '' for segment as it's the page. There can't be a segment called '' so this is the safest way to add it.
|
||||
props[normalizeParallelKey(parallelKey)] = `['${PAGE_SEGMENT_KEY}', {}, {
|
||||
page: [${varName}, ${JSON.stringify(resolvedPagePath)}],
|
||||
${createMetadataExportsCode(metadata)}
|
||||
}]`;
|
||||
continue;
|
||||
} else {
|
||||
throw Object.defineProperty(new Error(`Can't resolve ${matchedPagePath}`), "__NEXT_ERROR_CODE", {
|
||||
value: "E1007",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
// if the parallelSegment was not matched to the __PAGE__ slot, then it's a parallel route at this level.
|
||||
// the code below recursively traverses the parallel slots directory to match the corresponding __PAGE__ for each parallel slot
|
||||
// while also filling in layout/default/etc files into the loader tree at each segment level.
|
||||
const subSegmentPath = [
|
||||
...segments
|
||||
];
|
||||
if (parallelKey !== 'children') {
|
||||
// A `children` parallel key should have already been processed in the above segment
|
||||
// So we exclude it when constructing the subsegment path for the remaining segment levels
|
||||
subSegmentPath.push(parallelKey);
|
||||
}
|
||||
const normalizedParallelSegment = Array.isArray(parallelSegment) ? parallelSegment[0] : parallelSegment;
|
||||
if (normalizedParallelSegment !== PAGE_SEGMENT && normalizedParallelSegment !== PARALLEL_VIRTUAL_SEGMENT) {
|
||||
// If we don't have a page segment, nor a special $children marker, it means we need to traverse the next directory
|
||||
// (ie, `normalizedParallelSegment` would correspond with the folder that contains the next level of pages/layout/etc)
|
||||
// we push it to the subSegmentPath so that we can fill in the loader tree for that segment.
|
||||
subSegmentPath.push(normalizedParallelSegment);
|
||||
}
|
||||
const parallelSegmentPath = subSegmentPath.join('/');
|
||||
// Fill in the loader tree for all of the special files types (layout, default, etc) at this level
|
||||
// `page` is not included here as it's added above.
|
||||
const filePathEntries = await Promise.all(Object.values(FILE_TYPES).map(async (file)=>{
|
||||
return [
|
||||
file,
|
||||
await resolver(`${appDirPrefix}${// TODO-APP: parallelSegmentPath sometimes ends in `/` but sometimes it doesn't. This should be consistent.
|
||||
parallelSegmentPath.endsWith('/') ? parallelSegmentPath : parallelSegmentPath + '/'}${file}`)
|
||||
];
|
||||
}));
|
||||
const filePaths = new Map(filePathEntries);
|
||||
// Resolve global-* convention files at the root layer
|
||||
if (isRootLayer) {
|
||||
const resolvedGlobalErrorPath = await resolver(`${appDirPrefix}/${GLOBAL_ERROR_FILE_TYPE}`);
|
||||
if (resolvedGlobalErrorPath) {
|
||||
globalError = resolvedGlobalErrorPath;
|
||||
}
|
||||
// TODO(global-not-found): remove this flag assertion condition
|
||||
// once global-not-found is stable
|
||||
if (isGlobalNotFoundEnabled) {
|
||||
const resolvedGlobalNotFoundPath = await resolver(`${appDirPrefix}/${GLOBAL_NOT_FOUND_FILE_TYPE}`);
|
||||
if (resolvedGlobalNotFoundPath) {
|
||||
globalNotFound = resolvedGlobalNotFoundPath;
|
||||
}
|
||||
// Add global-not-found to root layer's filePaths, so that it's always available,
|
||||
// by default it's the built-in global-not-found.js
|
||||
filePaths.set(GLOBAL_NOT_FOUND_FILE_TYPE, globalNotFound);
|
||||
}
|
||||
}
|
||||
// Add global-error to ALL layers' filePaths, so that it's always available.
|
||||
// By default it's the built-in global-error.js, or user's custom one if defined.
|
||||
filePaths.set(GLOBAL_ERROR_FILE_TYPE, globalError);
|
||||
let definedFilePaths = Array.from(filePaths.entries()).filter(([, filePath])=>filePath !== undefined);
|
||||
// Add default access fallback as root fallback if not present
|
||||
const existedConventionNames = new Set(definedFilePaths.map(([type])=>type));
|
||||
// If the first layer is a group route, we treat it as root layer
|
||||
const isFirstLayerGroupRoute = segments.length === 1 && subSegmentPath.filter((seg)=>isGroupSegment(seg)).length === 1;
|
||||
if (isRootLayer || isFirstLayerGroupRoute) {
|
||||
const accessFallbackTypes = Object.keys(defaultHTTPAccessFallbackPaths);
|
||||
for (const type of accessFallbackTypes){
|
||||
const hasRootFallbackFile = await resolver(`${appDirPrefix}/${FILE_TYPES[type]}`);
|
||||
const hasLayerFallbackFile = existedConventionNames.has(type);
|
||||
// If you already have a root access error fallback, don't insert default access error boundary to group routes root
|
||||
if (// Is treated as root layout and without boundary
|
||||
!(hasRootFallbackFile && isFirstLayerGroupRoute) && // Does not have a fallback boundary file
|
||||
!hasLayerFallbackFile) {
|
||||
const defaultFallbackPath = defaultHTTPAccessFallbackPaths[type];
|
||||
if (!(isDefaultNotFound && type === 'not-found')) {
|
||||
definedFilePaths.push([
|
||||
type,
|
||||
defaultFallbackPath
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!rootLayout) {
|
||||
var _definedFilePaths_find;
|
||||
const layoutPath = (_definedFilePaths_find = definedFilePaths.find(([type])=>type === 'layout')) == null ? void 0 : _definedFilePaths_find[1];
|
||||
rootLayout = layoutPath;
|
||||
// When `global-not-found` is disabled, we insert a default layout if
|
||||
// root layout is presented. This logic and the default layout will be removed
|
||||
// once `global-not-found` is stabilized.
|
||||
if (!isGlobalNotFoundEnabled && isDefaultNotFound && !layoutPath && !rootLayout) {
|
||||
rootLayout = defaultLayoutPath;
|
||||
definedFilePaths.push([
|
||||
'layout',
|
||||
rootLayout
|
||||
]);
|
||||
}
|
||||
}
|
||||
let parallelSegmentKey = Array.isArray(parallelSegment) ? parallelSegment[0] : parallelSegment;
|
||||
// normalize the parallel segment key to remove any special markers that we inserted in the
|
||||
// earlier logic (such as children$ and page$). These should never appear in the loader tree, and
|
||||
// should instead be the corresponding segment keys (ie `__PAGE__`) or the `children` parallel route.
|
||||
parallelSegmentKey = parallelSegmentKey === PARALLEL_VIRTUAL_SEGMENT || parallelSegmentKey === PAGE_SEGMENT ? '(__SLOT__)' : parallelSegmentKey;
|
||||
const normalizedParallelKey = normalizeParallelKey(parallelKey);
|
||||
let subtreeCode;
|
||||
// If it's root not found page, set not-found boundary as children page
|
||||
if (isNotFoundRoute) {
|
||||
if (normalizedParallelKey === 'children') {
|
||||
var _definedFilePaths_find1;
|
||||
const matchedGlobalNotFound = isGlobalNotFoundEnabled ? ((_definedFilePaths_find1 = definedFilePaths.find(([type])=>type === GLOBAL_NOT_FOUND_FILE_TYPE)) == null ? void 0 : _definedFilePaths_find1[1]) ?? defaultGlobalNotFoundPath : undefined;
|
||||
// If custom global-not-found.js is defined, use global-not-found.js
|
||||
if (matchedGlobalNotFound) {
|
||||
const varName = `notFound${nestedCollectedDeclarations.length}`;
|
||||
nestedCollectedDeclarations.push([
|
||||
varName,
|
||||
matchedGlobalNotFound
|
||||
]);
|
||||
const layoutName = `layout${nestedCollectedDeclarations.length}`;
|
||||
nestedCollectedDeclarations.push([
|
||||
layoutName,
|
||||
defaultEmptyStubPath
|
||||
]);
|
||||
subtreeCode = `{
|
||||
children: [${JSON.stringify(UNDERSCORE_NOT_FOUND_ROUTE)}, {
|
||||
children: ['${PAGE_SEGMENT_KEY}', {}, {
|
||||
layout: [
|
||||
${varName},
|
||||
${JSON.stringify(matchedGlobalNotFound)}
|
||||
],
|
||||
page: [
|
||||
${layoutName},
|
||||
${JSON.stringify(defaultEmptyStubPath)}
|
||||
]
|
||||
}]
|
||||
}, {}]
|
||||
}`;
|
||||
} else {
|
||||
var _definedFilePaths_find2;
|
||||
// If custom not-found.js is found, use it and layout to compose the page,
|
||||
// and fallback to built-in not-found component if doesn't exist.
|
||||
const notFoundPath = ((_definedFilePaths_find2 = definedFilePaths.find(([type])=>type === 'not-found')) == null ? void 0 : _definedFilePaths_find2[1]) ?? defaultNotFoundPath;
|
||||
const varName = `notFound${nestedCollectedDeclarations.length}`;
|
||||
nestedCollectedDeclarations.push([
|
||||
varName,
|
||||
notFoundPath
|
||||
]);
|
||||
subtreeCode = `{
|
||||
children: [${JSON.stringify(UNDERSCORE_NOT_FOUND_ROUTE.slice(1))}, {
|
||||
children: ['${PAGE_SEGMENT_KEY}', {}, {
|
||||
page: [
|
||||
${varName},
|
||||
${JSON.stringify(notFoundPath)}
|
||||
]
|
||||
}]
|
||||
}, {}]
|
||||
}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
// If it's app-error route, set app-error as children page
|
||||
if (isAppErrorRoute) {
|
||||
const varName = `appError${nestedCollectedDeclarations.length}`;
|
||||
nestedCollectedDeclarations.push([
|
||||
varName,
|
||||
appErrorPath
|
||||
]);
|
||||
subtreeCode = `{
|
||||
children: [${JSON.stringify(UNDERSCORE_GLOBAL_ERROR_ROUTE.slice(1))}, {
|
||||
children: ['${PAGE_SEGMENT_KEY}', {}, {
|
||||
page: [
|
||||
${varName},
|
||||
${JSON.stringify(appErrorPath)}
|
||||
]
|
||||
}]
|
||||
}, {}]
|
||||
}`;
|
||||
}
|
||||
// For 404 route
|
||||
// if global-not-found is in definedFilePaths, remove root layout for /_not-found,
|
||||
// and change it to global-not-found route.
|
||||
// TODO: remove this once global-not-found is stable.
|
||||
if (isNotFoundRoute && isGlobalNotFoundEnabled) {
|
||||
var _definedFilePaths_find3;
|
||||
definedFilePaths = definedFilePaths.filter(([type])=>type !== 'layout');
|
||||
// Replace the layout to global-not-found
|
||||
definedFilePaths.push([
|
||||
'layout',
|
||||
((_definedFilePaths_find3 = definedFilePaths.find(([type])=>type === GLOBAL_NOT_FOUND_FILE_TYPE)) == null ? void 0 : _definedFilePaths_find3[1]) ?? defaultGlobalNotFoundPath
|
||||
]);
|
||||
}
|
||||
if (isAppErrorRoute) {
|
||||
definedFilePaths = definedFilePaths.filter(([type])=>type !== 'layout');
|
||||
}
|
||||
const modulesCode = `{
|
||||
${definedFilePaths.map(([file, filePath])=>{
|
||||
const varName = `module${nestedCollectedDeclarations.length}`;
|
||||
nestedCollectedDeclarations.push([
|
||||
varName,
|
||||
filePath
|
||||
]);
|
||||
return `'${file}': [${varName}, ${JSON.stringify(filePath)}],`;
|
||||
}).join('\n')}
|
||||
${createMetadataExportsCode(metadata)}
|
||||
}`;
|
||||
if (!subtreeCode) {
|
||||
const { treeCode: pageSubtreeCode } = await createSubtreePropsFromSegmentPath(subSegmentPath, nestedCollectedDeclarations);
|
||||
subtreeCode = pageSubtreeCode;
|
||||
}
|
||||
// Compute static siblings for dynamic segments. In dev mode, routes are
|
||||
// compiled on-demand so we don't know all siblings; pass null.
|
||||
const staticSiblingsCode = isDev ? 'null' : `${JSON.stringify(getStaticSiblingSegments(parallelSegmentPath))}`;
|
||||
props[normalizedParallelKey] = `[
|
||||
'${parallelSegmentKey}',
|
||||
${subtreeCode},
|
||||
${modulesCode},
|
||||
${staticSiblingsCode}
|
||||
]`;
|
||||
}
|
||||
const adjacentParallelSegments = await resolveAdjacentParallelSegments(segmentPath);
|
||||
for (const adjacentParallelSegment of adjacentParallelSegments){
|
||||
if (!props[normalizeParallelKey(adjacentParallelSegment)]) {
|
||||
const actualSegment = adjacentParallelSegment === 'children' ? '' : `/${adjacentParallelSegment}`;
|
||||
// Use the default path if it's found, otherwise if it's a children
|
||||
// slot, then use the fallback (which triggers a `notFound()`). If this
|
||||
// isn't a children slot, then throw an error, as it produces a silent
|
||||
// 404 if we'd used the fallback.
|
||||
const fullSegmentPath = `${appDirPrefix}${segmentPath}${actualSegment}`;
|
||||
let defaultPath = await resolver(`${fullSegmentPath}/default`);
|
||||
if (!defaultPath) {
|
||||
if (adjacentParallelSegment === 'children') {
|
||||
// When we host applications on Vercel, the status code affects the
|
||||
// underlying behavior of the route, which when we are missing the
|
||||
// children slot of an interception route, will yield a full 404
|
||||
// response for the RSC request instead. For this reason, we expect
|
||||
// that if a default file is missing when we're rendering an
|
||||
// interception route, we instead always render null for the default
|
||||
// slot to avoid the full 404 response.
|
||||
if (isInterceptionRouteAppPath(page)) {
|
||||
defaultPath = PARALLEL_ROUTE_DEFAULT_NULL_PATH;
|
||||
} else {
|
||||
defaultPath = PARALLEL_ROUTE_DEFAULT_PATH;
|
||||
}
|
||||
} else {
|
||||
// Check if we're inside a catch-all route (i.e., the parallel route is a child
|
||||
// of a catch-all segment). Only skip validation if the slot is UNDER a catch-all.
|
||||
// For example:
|
||||
// /[...catchAll]/@slot - isInsideCatchAll = true (skip validation) ✓
|
||||
// /@slot/[...catchAll] - isInsideCatchAll = false (require default) ✓
|
||||
// The catch-all provides fallback behavior, so default.js is not required.
|
||||
const isInsideCatchAll = segments.some(isCatchAllSegment);
|
||||
// Check if this is a leaf segment (no child routes).
|
||||
// Leaf segments don't need default.js because there are no child routes
|
||||
// that could cause the parallel slot to unmatch. For example:
|
||||
// /repo-overview/@slot/page with no child routes - isLeafSegment = true (skip validation) ✓
|
||||
// /repo-overview/@slot/page with /repo-overview/child/page - isLeafSegment = false (require default) ✓
|
||||
// This also handles route groups correctly by filtering them out.
|
||||
const isLeafSegment = !hasChildRoutesForSegment(segmentPath);
|
||||
if (!isInsideCatchAll && !isLeafSegment) {
|
||||
// Replace internal webpack alias with user-facing directory name
|
||||
const userFacingPath = fullSegmentPath.replace(APP_DIR_ALIAS, 'app');
|
||||
throw new MissingDefaultParallelRouteError(userFacingPath, adjacentParallelSegment);
|
||||
}
|
||||
defaultPath = PARALLEL_ROUTE_DEFAULT_PATH;
|
||||
}
|
||||
}
|
||||
const varName = `default${nestedCollectedDeclarations.length}`;
|
||||
nestedCollectedDeclarations.push([
|
||||
varName,
|
||||
defaultPath
|
||||
]);
|
||||
props[normalizeParallelKey(adjacentParallelSegment)] = `[
|
||||
'${DEFAULT_SEGMENT_KEY}',
|
||||
{},
|
||||
{
|
||||
defaultPage: [${varName}, ${JSON.stringify(defaultPath)}],
|
||||
}
|
||||
]`;
|
||||
}
|
||||
}
|
||||
return {
|
||||
treeCode: `{
|
||||
${Object.entries(props).map(([key, value])=>`${key}: ${value}`).join(',\n')}
|
||||
}`
|
||||
};
|
||||
}
|
||||
const { treeCode } = await createSubtreePropsFromSegmentPath([], collectedDeclarations);
|
||||
return {
|
||||
treeCode: `${treeCode}.children;`,
|
||||
rootLayout,
|
||||
globalError,
|
||||
globalNotFound
|
||||
};
|
||||
}
|
||||
function createAbsolutePath(appDir, pathToTurnAbsolute) {
|
||||
return pathToTurnAbsolute// Replace all POSIX path separators with the current OS path separator
|
||||
.replace(/\//g, path.sep).replace(/^private-next-app-dir/, appDir);
|
||||
}
|
||||
const filesInDirMapMap = new WeakMap();
|
||||
const nextAppLoader = async function nextAppLoader() {
|
||||
// install native bindings early so they are always available.
|
||||
// When run by webpack, next will have already done this, so this will be fast,
|
||||
// but if run by turbopack in a subprocess it is required. In that case we cannot pass the
|
||||
// `useWasmBinary` flag, but that is ok since turbopack doesn't currently support wasm.
|
||||
await installBindings();
|
||||
const loaderOptions = this.getOptions();
|
||||
const { name, appDir, appPaths, allNormalizedAppPaths: allNormalizedAppPathsOption, pagePath, pageExtensions, rootDir, tsconfigPath, isDev, nextConfigOutput, preferredRegion, basePath, middlewareConfig: middlewareConfigBase64 } = loaderOptions;
|
||||
const isGlobalNotFoundEnabled = !!loaderOptions.isGlobalNotFoundEnabled;
|
||||
// Update FILE_TYPES on the very top-level of the loader
|
||||
if (!isGlobalNotFoundEnabled) {
|
||||
// @ts-expect-error this delete is only necessary while experimental
|
||||
delete FILE_TYPES['global-not-found'];
|
||||
}
|
||||
const buildInfo = getModuleBuildInfo(this._module);
|
||||
const collectedDeclarations = [];
|
||||
// Use the page from loaderOptions directly instead of deriving it from name.
|
||||
// The name (bundlePath) may have been normalized with normalizePagePath()
|
||||
// which is designed for Pages Router and incorrectly duplicates /index paths
|
||||
// (e.g., /index/page -> /index/index/page). The page parameter contains the
|
||||
// correct unnormalized value.
|
||||
const page = loaderOptions.page;
|
||||
const middlewareConfig = JSON.parse(Buffer.from(middlewareConfigBase64, 'base64').toString());
|
||||
buildInfo.route = {
|
||||
page,
|
||||
absolutePagePath: createAbsolutePath(appDir, pagePath),
|
||||
preferredRegion,
|
||||
middlewareConfig,
|
||||
relatedModules: []
|
||||
};
|
||||
const extensions = typeof pageExtensions === 'string' ? [
|
||||
pageExtensions
|
||||
] : pageExtensions.map((extension)=>`.${extension}`);
|
||||
const normalizedAppPaths = typeof appPaths === 'string' ? [
|
||||
appPaths
|
||||
] : appPaths || [];
|
||||
// All normalized app paths for computing static siblings across route groups
|
||||
const allNormalizedAppPaths = allNormalizedAppPathsOption ?? [];
|
||||
const resolveParallelSegments = (pathname)=>{
|
||||
const matched = {};
|
||||
let existingChildrenPath;
|
||||
for (const appPath of normalizedAppPaths){
|
||||
if (appPath.startsWith(pathname + '/')) {
|
||||
const rest = appPath.slice(pathname.length + 1).split('/');
|
||||
// It is the actual page, mark it specially.
|
||||
if (rest.length === 1 && rest[0] === 'page') {
|
||||
existingChildrenPath = appPath;
|
||||
matched.children = PAGE_SEGMENT;
|
||||
continue;
|
||||
}
|
||||
const isParallelRoute = rest[0].startsWith('@');
|
||||
if (isParallelRoute) {
|
||||
if (rest.length === 2 && rest[1] === 'page') {
|
||||
// We found a parallel route at this level. We don't want to mark it explicitly as the page segment,
|
||||
// as that should be matched to the `children` slot. Instead, we use an array, to signal to `createSubtreePropsFromSegmentPath`
|
||||
// that it needs to recursively fill in the loader tree code for the parallel route at the appropriate levels.
|
||||
matched[rest[0]] = [
|
||||
PAGE_SEGMENT
|
||||
];
|
||||
continue;
|
||||
}
|
||||
// If it was a parallel route but we weren't able to find the page segment (ie, maybe the page is nested further)
|
||||
// we first insert a special marker to ensure that we still process layout/default/etc at the slot level prior to continuing
|
||||
// on to the page segment.
|
||||
matched[rest[0]] = [
|
||||
PARALLEL_VIRTUAL_SEGMENT,
|
||||
...rest.slice(1)
|
||||
];
|
||||
continue;
|
||||
}
|
||||
if (existingChildrenPath && matched.children !== rest[0]) {
|
||||
// If we get here, it means we already set a `page` segment earlier in the loop,
|
||||
// meaning we already matched a page to the `children` parallel segment.
|
||||
const isIncomingParallelPage = appPath.includes('@');
|
||||
const hasCurrentParallelPage = existingChildrenPath.includes('@');
|
||||
if (isIncomingParallelPage) {
|
||||
continue;
|
||||
} else if (!hasCurrentParallelPage && !isIncomingParallelPage) {
|
||||
// Both the current `children` and the incoming `children` are regular pages.
|
||||
throw Object.defineProperty(new Error(`You cannot have two parallel pages that resolve to the same path. Please check ${existingChildrenPath} and ${appPath}. Refer to the route group docs for more information: https://nextjs.org/docs/app/building-your-application/routing/route-groups`), "__NEXT_ERROR_CODE", {
|
||||
value: "E28",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
}
|
||||
existingChildrenPath = appPath;
|
||||
matched.children = rest[0];
|
||||
}
|
||||
}
|
||||
return Object.entries(matched);
|
||||
};
|
||||
const hasChildRoutesForSegment = (segmentPath)=>{
|
||||
const pathPrefix = segmentPath ? `${segmentPath}/` : '';
|
||||
for (const appPath of normalizedAppPaths){
|
||||
if (appPath.startsWith(pathPrefix)) {
|
||||
var _routeSegments_;
|
||||
const rest = appPath.slice(pathPrefix.length).split('/');
|
||||
// Filter out route groups to get the actual route segments
|
||||
// Route groups (e.g., "(group)") don't contribute to the URL path
|
||||
const routeSegments = rest.filter((segment)=>!isGroupSegment(segment));
|
||||
// If it's just 'page' at this level, skip (not a child route)
|
||||
if (routeSegments.length === 1 && routeSegments[0] === 'page') {
|
||||
continue;
|
||||
}
|
||||
// If the first segment (after filtering route groups) is a parallel route, skip
|
||||
if ((_routeSegments_ = routeSegments[0]) == null ? void 0 : _routeSegments_.startsWith('@')) {
|
||||
continue;
|
||||
}
|
||||
// If we have more than just 'page', then there are child routes
|
||||
// Examples:
|
||||
// ['child', 'page'] -> true (has child route)
|
||||
// ['page'] -> false (already filtered above)
|
||||
// ['grandchild', 'deeper', 'page'] -> true (has nested child routes)
|
||||
if (routeSegments.length > 1 || routeSegments.length === 1 && routeSegments[0] !== 'page') {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
/**
|
||||
* For a given segment path (in file system space, e.g., "(group)/products/[id]"),
|
||||
* find all static sibling segments at the same URL path level.
|
||||
*
|
||||
* This accounts for route groups - siblings may exist in different parts of the
|
||||
* file system tree but at the same URL level.
|
||||
*
|
||||
* For example:
|
||||
* /app/(marketing)/products/sale/page.tsx -> /products/sale
|
||||
* /app/(shop)/products/[id]/page.tsx -> /products/[id]
|
||||
*
|
||||
* When called with "(shop)/products/[id]", this would return ['sale'].
|
||||
*
|
||||
* TODO: This function, along with resolveParallelSegments and
|
||||
* hasChildRoutesForSegment, repeatedly scans normalizedAppPaths. A more
|
||||
* optimal approach would build an intermediate tree structure first
|
||||
* (representing the URL namespace with route groups collapsed), then derive
|
||||
* all this information in a single pass. The Turbopack implementation
|
||||
* already uses a more tree-oriented approach (DirectoryTree ->
|
||||
* AppPageLoaderTree), so this is less urgent to refactor given Turbopack is
|
||||
* the canonical implementation going forward.
|
||||
*/ const getStaticSiblingSegments = (segmentPath)=>{
|
||||
// Normalize the current path to URL space
|
||||
// Add a trailing /page so normalizeAppPath strips it properly
|
||||
const currentUrlPath = normalizeAppPath(segmentPath + '/page');
|
||||
const currentUrlSegments = currentUrlPath.split('/').filter(Boolean);
|
||||
// If the path is empty (root level), there are no siblings
|
||||
if (currentUrlSegments.length === 0) {
|
||||
return [];
|
||||
}
|
||||
const currentSegment = currentUrlSegments[currentUrlSegments.length - 1];
|
||||
const parentUrlPath = currentUrlSegments.length === 1 ? '/' : '/' + currentUrlSegments.slice(0, -1).join('/');
|
||||
// The URL level at which we're looking for siblings (0-indexed)
|
||||
const siblingLevel = currentUrlSegments.length - 1;
|
||||
// Only compute siblings for dynamic segments
|
||||
if (!isDynamicSegment(currentSegment)) {
|
||||
return [];
|
||||
}
|
||||
// Use a Set to avoid duplicates (multiple paths may share the same sibling segment)
|
||||
const siblings = new Set();
|
||||
for (const appPath of allNormalizedAppPaths){
|
||||
// Normalize each path to URL space (strip route groups, parallel routes, and /page suffix)
|
||||
const urlPath = normalizeAppPath(appPath);
|
||||
const urlSegments = urlPath.split('/').filter(Boolean);
|
||||
// Path must have at least enough segments to reach the sibling level
|
||||
if (urlSegments.length <= siblingLevel) {
|
||||
continue;
|
||||
}
|
||||
// Check if the parent path matches (all segments before the sibling level)
|
||||
const pathParent = siblingLevel === 0 ? '/' : '/' + urlSegments.slice(0, siblingLevel).join('/');
|
||||
if (pathParent !== parentUrlPath) {
|
||||
continue;
|
||||
}
|
||||
// Get the segment at the same level as the current segment
|
||||
const segmentAtLevel = urlSegments[siblingLevel];
|
||||
// Check if this is a sibling: different segment and static
|
||||
if (segmentAtLevel !== currentSegment && !isDynamicSegment(segmentAtLevel)) {
|
||||
siblings.add(segmentAtLevel);
|
||||
}
|
||||
}
|
||||
return Array.from(siblings);
|
||||
};
|
||||
const resolveDir = (pathToResolve)=>{
|
||||
return createAbsolutePath(appDir, pathToResolve);
|
||||
};
|
||||
const resolveAppRoute = (pathToResolve)=>{
|
||||
return createAbsolutePath(appDir, pathToResolve);
|
||||
};
|
||||
// Cached checker to see if a file exists in a given directory.
|
||||
// This can be more efficient than checking them with `fs.stat` one by one
|
||||
// because all the thousands of files are likely in a few possible directories.
|
||||
// Note that it should only be cached for this compilation, not globally.
|
||||
const fileExistsInDirectory = async (dirname, fileName)=>{
|
||||
// I don't think we should ever hit this code path, but if we do we should handle it gracefully.
|
||||
if (this._compilation === undefined) {
|
||||
try {
|
||||
return (await getFilesInDir(dirname).catch(()=>new Set())).has(fileName);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
const map = filesInDirMapMap.get(this._compilation) || new Map();
|
||||
if (!filesInDirMapMap.has(this._compilation)) {
|
||||
filesInDirMapMap.set(this._compilation, map);
|
||||
}
|
||||
if (!map.has(dirname)) {
|
||||
map.set(dirname, getFilesInDir(dirname).catch(()=>new Set()));
|
||||
}
|
||||
return (await map.get(dirname) || new Set()).has(fileName);
|
||||
};
|
||||
const resolver = async (pathname)=>{
|
||||
const absolutePath = createAbsolutePath(appDir, pathname);
|
||||
const filenameIndex = absolutePath.lastIndexOf(path.sep);
|
||||
const dirname = absolutePath.slice(0, filenameIndex);
|
||||
const filename = absolutePath.slice(filenameIndex + 1);
|
||||
const checks = await Promise.all(extensions.map(async (ext)=>{
|
||||
const absolutePathWithExtension = `${absolutePath}${ext}`;
|
||||
const exists = await fileExistsInDirectory(dirname, `${filename}${ext}`);
|
||||
// Call `addMissingDependency` for all files even if they didn't match,
|
||||
// because they might be added or removed during development.
|
||||
this.addMissingDependency(absolutePathWithExtension);
|
||||
return exists ? absolutePathWithExtension : undefined;
|
||||
}));
|
||||
return checks.find((result)=>result);
|
||||
};
|
||||
const metadataResolver = async (dirname, filename, exts)=>{
|
||||
const absoluteDir = createAbsolutePath(appDir, dirname);
|
||||
const checks = await Promise.all(exts.map(async (ext)=>{
|
||||
// Compared to `resolver` above the exts do not have the `.` included already, so it's added here.
|
||||
const filenameWithExt = `${filename}.${ext}`;
|
||||
const absolutePathWithExtension = `${absoluteDir}${path.sep}${filenameWithExt}`;
|
||||
const exists = await fileExistsInDirectory(dirname, filenameWithExt);
|
||||
// Call `addMissingDependency` for all files even if they didn't match,
|
||||
// because they might be added or removed during development.
|
||||
this.addMissingDependency(absolutePathWithExtension);
|
||||
return exists ? absolutePathWithExtension : undefined;
|
||||
}));
|
||||
return checks.filter((result)=>result !== undefined);
|
||||
};
|
||||
if (isAppRouteRoute(name)) {
|
||||
return createAppRouteCode({
|
||||
appDir,
|
||||
// TODO: investigate if the local `page` is the same as the loaderOptions.page
|
||||
page: loaderOptions.page,
|
||||
name,
|
||||
pagePath,
|
||||
resolveAppRoute,
|
||||
pageExtensions,
|
||||
nextConfigOutput
|
||||
});
|
||||
}
|
||||
let treeCodeResult = await createTreeCodeFromPath(pagePath, {
|
||||
page,
|
||||
resolveDir,
|
||||
resolver,
|
||||
metadataResolver,
|
||||
resolveParallelSegments,
|
||||
hasChildRoutesForSegment,
|
||||
getStaticSiblingSegments,
|
||||
loaderContext: this,
|
||||
pageExtensions,
|
||||
basePath,
|
||||
collectedDeclarations,
|
||||
isGlobalNotFoundEnabled,
|
||||
isDev: !!isDev
|
||||
});
|
||||
const isGlobalNotFoundPath = page === UNDERSCORE_NOT_FOUND_ROUTE_ENTRY && !!treeCodeResult.globalNotFound && isGlobalNotFoundEnabled;
|
||||
const isAppErrorRoute = page === UNDERSCORE_GLOBAL_ERROR_ROUTE_ENTRY;
|
||||
if (!treeCodeResult.rootLayout && !isGlobalNotFoundPath && !isAppErrorRoute) {
|
||||
if (!isDev) {
|
||||
// If we're building and missing a root layout, exit the build
|
||||
Log.error(`${bold(pagePath.replace(`${APP_DIR_ALIAS}/`, ''))} doesn't have a root layout. To fix this error, make sure every page has a root layout.`);
|
||||
process.exit(1);
|
||||
} else {
|
||||
var _filesInDirMapMap_get;
|
||||
// In dev we'll try to create a root layout
|
||||
const [createdRootLayout, rootLayoutPath] = await verifyRootLayout({
|
||||
appDir: appDir,
|
||||
dir: rootDir,
|
||||
tsconfigPath: tsconfigPath,
|
||||
pagePath,
|
||||
pageExtensions
|
||||
});
|
||||
if (!createdRootLayout) {
|
||||
let message = `${bold(pagePath.replace(`${APP_DIR_ALIAS}/`, ''))} doesn't have a root layout. `;
|
||||
if (rootLayoutPath) {
|
||||
var _this__compiler;
|
||||
message += `We tried to create ${bold(path.relative(((_this__compiler = this._compiler) == null ? void 0 : _this__compiler.context) ?? '', rootLayoutPath))} for you but something went wrong.`;
|
||||
} else {
|
||||
message += 'To fix this error, make sure every page has a root layout.';
|
||||
}
|
||||
throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", {
|
||||
value: "E1024",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
// Clear fs cache, get the new result with the created root layout.
|
||||
if (this._compilation) (_filesInDirMapMap_get = filesInDirMapMap.get(this._compilation)) == null ? void 0 : _filesInDirMapMap_get.clear();
|
||||
treeCodeResult = await createTreeCodeFromPath(pagePath, {
|
||||
page,
|
||||
resolveDir,
|
||||
resolver,
|
||||
metadataResolver,
|
||||
resolveParallelSegments,
|
||||
hasChildRoutesForSegment,
|
||||
getStaticSiblingSegments,
|
||||
loaderContext: this,
|
||||
pageExtensions,
|
||||
basePath,
|
||||
collectedDeclarations,
|
||||
isGlobalNotFoundEnabled,
|
||||
isDev: !!isDev
|
||||
});
|
||||
}
|
||||
}
|
||||
const pathname = new AppPathnameNormalizer().normalize(page);
|
||||
// Prefer to modify next/src/server/app-render/entry-base.ts since this is shared with Turbopack.
|
||||
// Any changes to this code should be reflected in Turbopack's app_source.rs and/or app-renderer.tsx as well.
|
||||
const code = await loadEntrypoint('app-page', {
|
||||
VAR_DEFINITION_PAGE: page,
|
||||
VAR_DEFINITION_PATHNAME: pathname
|
||||
}, {
|
||||
tree: treeCodeResult.treeCode,
|
||||
__next_app_require__: '__webpack_require__',
|
||||
// all modules are in the entry chunk, so we never actually need to load chunks in webpack
|
||||
__next_app_load_chunk__: '() => Promise.resolve()'
|
||||
});
|
||||
// Lazily evaluate the imported modules in the generated code
|
||||
const header = collectedDeclarations.map(([varName, modulePath])=>{
|
||||
return `const ${varName} = () => import(/* webpackMode: "eager" */ ${JSON.stringify(modulePath)});\n`;
|
||||
}).join('');
|
||||
return header + code;
|
||||
};
|
||||
export default nextAppLoader;
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
+253
@@ -0,0 +1,253 @@
|
||||
/**
|
||||
* ## Barrel Optimizations
|
||||
*
|
||||
* This loader is used to optimize the imports of "barrel" files that have many
|
||||
* re-exports. Currently, both Node.js and Webpack have to enter all of these
|
||||
* submodules even if we only need a few of them.
|
||||
*
|
||||
* For example, say a file `foo.js` with the following contents:
|
||||
*
|
||||
* export { a } from './a'
|
||||
* export { b } from './b'
|
||||
* export { c } from './c'
|
||||
* ...
|
||||
*
|
||||
* If the user imports `a` only, this loader will accept the `names` option to
|
||||
* be `['a']`. Then, it request the "__barrel_transform__" SWC transform to load
|
||||
* `foo.js` and receive the following output:
|
||||
*
|
||||
* export const __next_private_export_map__ = '[["a","./a","a"],["b","./b","b"],["c","./c","c"],...]'
|
||||
*
|
||||
* format: '["<imported identifier>", "<import path>", "<exported name>"]'
|
||||
* e.g.: import { a as b } from './module-a' => '["b", "./module-a", "a"]'
|
||||
*
|
||||
* The export map, generated by SWC, is a JSON that represents the exports of
|
||||
* that module, their original file, and their original name (since you can do
|
||||
* `export { a as b }`).
|
||||
*
|
||||
* Then, this loader can safely remove all the exports that are not needed and
|
||||
* re-export the ones from `names`:
|
||||
*
|
||||
* export { a } from './a'
|
||||
*
|
||||
* That's the basic situation and also the happy path.
|
||||
*
|
||||
*
|
||||
*
|
||||
* ## Wildcard Exports
|
||||
*
|
||||
* For wildcard exports (e.g. `export * from './a'`), it becomes a bit more complicated.
|
||||
* Say `foo.js` with the following contents:
|
||||
*
|
||||
* export * from './a'
|
||||
* export * from './b'
|
||||
* export * from './c'
|
||||
* ...
|
||||
*
|
||||
* If the user imports `bar` from it, SWC can never know which files are going to be
|
||||
* exporting `bar`. So, we have to keep all the wildcard exports and do the same
|
||||
* process recursively. This loader will return the following output:
|
||||
*
|
||||
* export * from '__barrel_optimize__?names=bar&wildcard!=!./a'
|
||||
* export * from '__barrel_optimize__?names=bar&wildcard!=!./b'
|
||||
* export * from '__barrel_optimize__?names=bar&wildcard!=!./c'
|
||||
* ...
|
||||
*
|
||||
* The "!=!" tells Webpack to use the same loader to process './a', './b', and './c'.
|
||||
* After the recursive process, the "inner loaders" will either return an empty string
|
||||
* or:
|
||||
*
|
||||
* export * from './target'
|
||||
*
|
||||
* Where `target` is the file that exports `bar`.
|
||||
*
|
||||
*
|
||||
*
|
||||
* ## Non-Barrel Files
|
||||
*
|
||||
* If the file is not a barrel, we can't apply any optimizations. That's because
|
||||
* we can't easily remove things from the file. For example, say `foo.js` with:
|
||||
*
|
||||
* const v = 1
|
||||
* export function b () {
|
||||
* return v
|
||||
* }
|
||||
*
|
||||
* If the user imports `b` only, we can't remove the `const v = 1` even though
|
||||
* the file is side-effect free. In these caes, this loader will simply re-export
|
||||
* `foo.js`:
|
||||
*
|
||||
* export * from './foo'
|
||||
*
|
||||
* Besides these cases, this loader also carefully handles the module cache so
|
||||
* SWC won't analyze the same file twice, and no instance of the same file will
|
||||
* be accidentally created as different instances.
|
||||
*/ import path from 'path';
|
||||
import { transform } from '../../swc';
|
||||
import { installBindings } from '../../swc/install-bindings';
|
||||
// This is a in-memory cache for the mapping of barrel exports. This only applies
|
||||
// to the packages that we optimize. It will never change (e.g. upgrading packages)
|
||||
// during the lifetime of the server so we can safely cache it.
|
||||
// There is also no need to collect the cache for the same reason.
|
||||
const barrelTransformMappingCache = new Map();
|
||||
async function getBarrelMapping(resourcePath, swcCacheDir, resolve, fs) {
|
||||
if (barrelTransformMappingCache.has(resourcePath)) {
|
||||
return barrelTransformMappingCache.get(resourcePath);
|
||||
}
|
||||
// This is a SWC transform specifically for `optimizeBarrelExports`. We don't
|
||||
// care about other things but the export map only.
|
||||
async function transpileSource(filename, source, isWildcard) {
|
||||
const isTypeScript = filename.endsWith('.ts') || filename.endsWith('.tsx');
|
||||
return new Promise((res)=>transform(source, {
|
||||
filename,
|
||||
inputSourceMap: undefined,
|
||||
sourceFileName: filename,
|
||||
optimizeBarrelExports: {
|
||||
wildcard: isWildcard
|
||||
},
|
||||
jsc: {
|
||||
parser: {
|
||||
syntax: isTypeScript ? 'typescript' : 'ecmascript',
|
||||
[isTypeScript ? 'tsx' : 'jsx']: true
|
||||
},
|
||||
experimental: {
|
||||
cacheRoot: swcCacheDir
|
||||
}
|
||||
}
|
||||
}).then((output)=>{
|
||||
res(output.code);
|
||||
}));
|
||||
}
|
||||
// Avoid circular `export *` dependencies
|
||||
const visited = new Set();
|
||||
async function getMatches(file, isWildcard, isClientEntry) {
|
||||
if (visited.has(file)) {
|
||||
return null;
|
||||
}
|
||||
visited.add(file);
|
||||
const source = await new Promise((res, rej)=>{
|
||||
fs.readFile(file, (err, data)=>{
|
||||
if (err || data === undefined) {
|
||||
rej(err);
|
||||
} else {
|
||||
res(data.toString());
|
||||
}
|
||||
});
|
||||
});
|
||||
const output = await transpileSource(file, source, isWildcard);
|
||||
const matches = output.match(/^([^]*)export (const|var) __next_private_export_map__ = ('[^']+'|"[^"]+")/);
|
||||
if (!matches) {
|
||||
return null;
|
||||
}
|
||||
const matchedDirectives = output.match(/^([^]*)export (const|var) __next_private_directive_list__ = '([^']+)'/);
|
||||
const directiveList = matchedDirectives ? JSON.parse(matchedDirectives[3]) : [];
|
||||
// "use client" in barrel files has to be transferred to the target file.
|
||||
isClientEntry = directiveList.includes('use client');
|
||||
let exportList = JSON.parse(matches[3].slice(1, -1));
|
||||
const wildcardExports = [
|
||||
...output.matchAll(/export \* from "([^"]+)"/g)
|
||||
].map((match)=>match[1]);
|
||||
// In the wildcard case, if the value is exported from another file, we
|
||||
// redirect to that file (decl[0]). Otherwise, export from the current
|
||||
// file itself.
|
||||
if (isWildcard) {
|
||||
for (const decl of exportList){
|
||||
decl[1] = file;
|
||||
decl[2] = decl[0];
|
||||
}
|
||||
}
|
||||
// This recursively handles the wildcard exports (e.g. `export * from './a'`)
|
||||
if (wildcardExports.length) {
|
||||
await Promise.all(wildcardExports.map(async (req)=>{
|
||||
const targetPath = await resolve(path.dirname(file), req.replace('__barrel_optimize__?names=__PLACEHOLDER__!=!', ''));
|
||||
const targetMatches = await getMatches(targetPath, true, isClientEntry);
|
||||
if (targetMatches) {
|
||||
// Merge the export list
|
||||
exportList = exportList.concat(targetMatches.exportList);
|
||||
}
|
||||
}));
|
||||
}
|
||||
return {
|
||||
exportList,
|
||||
wildcardExports,
|
||||
isClientEntry
|
||||
};
|
||||
}
|
||||
const res = await getMatches(resourcePath, false, false);
|
||||
barrelTransformMappingCache.set(resourcePath, res);
|
||||
return res;
|
||||
}
|
||||
const NextBarrelLoader = async function() {
|
||||
this.async();
|
||||
this.cacheable(true);
|
||||
// Install bindings early so they are definitely available.
|
||||
// When run by webpack in next this is already done with correct configuration so this is a no-op.
|
||||
// In turbopack loaders are run in a subprocess so it may or may not be done.
|
||||
await installBindings();
|
||||
const { names, swcCacheDir } = this.getOptions();
|
||||
// For barrel optimizations, we always prefer the "module" field over the
|
||||
// "main" field because ESM handling is more robust with better tree-shaking.
|
||||
const resolve = this.getResolve({
|
||||
mainFields: [
|
||||
'module',
|
||||
'main'
|
||||
]
|
||||
});
|
||||
const mapping = await getBarrelMapping(this.resourcePath, swcCacheDir, resolve, this.fs);
|
||||
// `resolve` adds all sub-paths to the dependency graph. However, we already
|
||||
// cached the mapping and we assume them to not change. So, we can safely
|
||||
// clear the dependencies here to avoid unnecessary watchers which turned out
|
||||
// to be very expensive.
|
||||
this.clearDependencies();
|
||||
if (!mapping) {
|
||||
// This file isn't a barrel and we can't apply any optimizations. Let's re-export everything.
|
||||
// Since this loader accepts `names` and the request is keyed with `names`, we can't simply
|
||||
// return the original source here. That will create these imports with different names as
|
||||
// different modules instances.
|
||||
this.callback(null, `export * from ${JSON.stringify(this.resourcePath)}`);
|
||||
return;
|
||||
}
|
||||
const exportList = mapping.exportList;
|
||||
const isClientEntry = mapping.isClientEntry;
|
||||
const exportMap = new Map();
|
||||
for (const [name, filePath, orig] of exportList){
|
||||
exportMap.set(name, [
|
||||
filePath,
|
||||
orig
|
||||
]);
|
||||
}
|
||||
let output = '';
|
||||
let missedNames = [];
|
||||
for (const name of names){
|
||||
// If the name matches
|
||||
if (exportMap.has(name)) {
|
||||
const decl = exportMap.get(name);
|
||||
if (decl[1] === '*') {
|
||||
output += `\nexport * as ${name} from ${JSON.stringify(decl[0])}`;
|
||||
} else if (decl[1] === 'default') {
|
||||
output += `\nexport { default as ${name} } from ${JSON.stringify(decl[0])}`;
|
||||
} else if (decl[1] === name) {
|
||||
output += `\nexport { ${name} } from ${JSON.stringify(decl[0])}`;
|
||||
} else {
|
||||
output += `\nexport { ${decl[1]} as ${name} } from ${JSON.stringify(decl[0])}`;
|
||||
}
|
||||
} else {
|
||||
missedNames.push(name);
|
||||
}
|
||||
}
|
||||
// These are from wildcard exports.
|
||||
if (missedNames.length > 0) {
|
||||
for (const req of mapping.wildcardExports){
|
||||
output += `\nexport * from ${JSON.stringify(req.replace('__PLACEHOLDER__', missedNames.join(',') + '&wildcard'))}`;
|
||||
}
|
||||
}
|
||||
// When it has `"use client"` inherited from its barrel files, we need to
|
||||
// prefix it to this target file as well.
|
||||
if (isClientEntry) {
|
||||
output = `"use client";\n${output}`;
|
||||
}
|
||||
this.callback(null, output);
|
||||
};
|
||||
export default NextBarrelLoader;
|
||||
|
||||
//# sourceMappingURL=next-barrel-loader.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
import { stringifyRequest } from '../stringify-request';
|
||||
// this parameter: https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters
|
||||
function nextClientPagesLoader() {
|
||||
const pagesLoaderSpan = this.currentTraceSpan.traceChild('next-client-pages-loader');
|
||||
return pagesLoaderSpan.traceFn(()=>{
|
||||
const { absolutePagePath, page } = this.getOptions();
|
||||
pagesLoaderSpan.setAttribute('absolutePagePath', absolutePagePath);
|
||||
const stringifiedPageRequest = stringifyRequest(this, absolutePagePath);
|
||||
const stringifiedPage = JSON.stringify(page);
|
||||
return `
|
||||
(window.__NEXT_P = window.__NEXT_P || []).push([
|
||||
${stringifiedPage},
|
||||
function () {
|
||||
return require(${stringifiedPageRequest});
|
||||
}
|
||||
]);
|
||||
if(module.hot) {
|
||||
module.hot.dispose(function () {
|
||||
window.__NEXT_P.push([${stringifiedPage}])
|
||||
});
|
||||
}
|
||||
`;
|
||||
});
|
||||
}
|
||||
export default nextClientPagesLoader;
|
||||
|
||||
//# sourceMappingURL=next-client-pages-loader.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-client-pages-loader.ts"],"sourcesContent":["import { stringifyRequest } from '../stringify-request'\n\nexport type ClientPagesLoaderOptions = {\n absolutePagePath: string\n page: string\n}\n\n// this parameter: https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\nfunction nextClientPagesLoader(this: any) {\n const pagesLoaderSpan = this.currentTraceSpan.traceChild(\n 'next-client-pages-loader'\n )\n\n return pagesLoaderSpan.traceFn(() => {\n const { absolutePagePath, page } =\n this.getOptions() as ClientPagesLoaderOptions\n\n pagesLoaderSpan.setAttribute('absolutePagePath', absolutePagePath)\n\n const stringifiedPageRequest = stringifyRequest(this, absolutePagePath)\n const stringifiedPage = JSON.stringify(page)\n\n return `\n (window.__NEXT_P = window.__NEXT_P || []).push([\n ${stringifiedPage},\n function () {\n return require(${stringifiedPageRequest});\n }\n ]);\n if(module.hot) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([${stringifiedPage}])\n });\n }\n `\n })\n}\n\nexport default nextClientPagesLoader\n"],"names":["stringifyRequest","nextClientPagesLoader","pagesLoaderSpan","currentTraceSpan","traceChild","traceFn","absolutePagePath","page","getOptions","setAttribute","stringifiedPageRequest","stringifiedPage","JSON","stringify"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,uBAAsB;AAOvD,8FAA8F;AAC9F,SAASC;IACP,MAAMC,kBAAkB,IAAI,CAACC,gBAAgB,CAACC,UAAU,CACtD;IAGF,OAAOF,gBAAgBG,OAAO,CAAC;QAC7B,MAAM,EAAEC,gBAAgB,EAAEC,IAAI,EAAE,GAC9B,IAAI,CAACC,UAAU;QAEjBN,gBAAgBO,YAAY,CAAC,oBAAoBH;QAEjD,MAAMI,yBAAyBV,iBAAiB,IAAI,EAAEM;QACtD,MAAMK,kBAAkBC,KAAKC,SAAS,CAACN;QAEvC,OAAO,CAAC;;MAEN,EAAEI,gBAAgB;;uBAED,EAAED,uBAAuB;;;;;8BAKlB,EAAEC,gBAAgB;;;EAG9C,CAAC;IACD;AACF;AAEA,eAAeV,sBAAqB","ignoreList":[0]}
|
||||
Generated
Vendored
+57
@@ -0,0 +1,57 @@
|
||||
import { getModuleBuildInfo } from '../get-module-build-info';
|
||||
import { stringifyRequest } from '../../stringify-request';
|
||||
import { WEBPACK_RESOURCE_QUERIES } from '../../../../lib/constants';
|
||||
import { loadEntrypoint } from '../../../load-entrypoint';
|
||||
import { isMetadataRoute } from '../../../../lib/metadata/is-metadata-route';
|
||||
function getCacheHandlersSetup(cacheHandlersStringified, contextifyImportPath) {
|
||||
const cacheHandlers = JSON.parse(cacheHandlersStringified || '{}');
|
||||
const definedCacheHandlers = Object.entries(cacheHandlers).filter((entry)=>Boolean(entry[1]));
|
||||
const cacheHandlerImports = [];
|
||||
const edgeCacheHandlersRegistration = [];
|
||||
for (const [index, [kind, handlerPath]] of definedCacheHandlers.entries()){
|
||||
const cacheHandlerVarName = `edgeCacheHandler_${index}`;
|
||||
const cacheHandlerImportPath = contextifyImportPath(handlerPath);
|
||||
cacheHandlerImports.push(`import ${cacheHandlerVarName} from ${JSON.stringify(cacheHandlerImportPath)}`);
|
||||
edgeCacheHandlersRegistration.push(`edgeCacheHandlers[${JSON.stringify(kind)}] = ${cacheHandlerVarName}`);
|
||||
}
|
||||
return {
|
||||
cacheHandlerImports: cacheHandlerImports.join('\n') || '\n',
|
||||
edgeCacheHandlersRegistration: edgeCacheHandlersRegistration.join('\n') || '\n'
|
||||
};
|
||||
}
|
||||
const EdgeAppRouteLoader = async function() {
|
||||
const { page, absolutePagePath, preferredRegion, appDirLoader: appDirLoaderBase64 = '', middlewareConfig: middlewareConfigBase64 = '', cacheHandler, cacheHandlers: cacheHandlersStringified } = this.getOptions();
|
||||
const appDirLoader = Buffer.from(appDirLoaderBase64, 'base64').toString();
|
||||
const middlewareConfig = JSON.parse(Buffer.from(middlewareConfigBase64, 'base64').toString());
|
||||
const cacheHandlersSetup = getCacheHandlersSetup(cacheHandlersStringified, (handlerPath)=>this.utils.contextify(this.context || this.rootContext, handlerPath));
|
||||
const incrementalCacheHandler = cacheHandler ? this.utils.contextify(this.context || this.rootContext, cacheHandler) : null;
|
||||
// Ensure we only run this loader for as a module.
|
||||
if (!this._module) throw Object.defineProperty(new Error('This loader is only usable as a module'), "__NEXT_ERROR_CODE", {
|
||||
value: "E433",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
const buildInfo = getModuleBuildInfo(this._module);
|
||||
buildInfo.nextEdgeSSR = {
|
||||
isServerComponent: !isMetadataRoute(page),
|
||||
page: page,
|
||||
isAppDir: true
|
||||
};
|
||||
buildInfo.route = {
|
||||
page,
|
||||
absolutePagePath,
|
||||
preferredRegion,
|
||||
middlewareConfig
|
||||
};
|
||||
const stringifiedPagePath = stringifyRequest(this, absolutePagePath);
|
||||
const modulePath = `${appDirLoader}${stringifiedPagePath.substring(1, stringifiedPagePath.length - 1)}?${WEBPACK_RESOURCE_QUERIES.edgeSSREntry}`;
|
||||
return await loadEntrypoint('edge-app-route', {
|
||||
VAR_USERLAND: modulePath,
|
||||
VAR_PAGE: page
|
||||
}, cacheHandlersSetup, {
|
||||
incrementalCacheHandler
|
||||
});
|
||||
};
|
||||
export default EdgeAppRouteLoader;
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Generated
Vendored
+45
@@ -0,0 +1,45 @@
|
||||
import { getModuleBuildInfo } from './get-module-build-info';
|
||||
import { stringifyRequest } from '../stringify-request';
|
||||
const nextEdgeFunctionLoader = function nextEdgeFunctionLoader() {
|
||||
const { absolutePagePath, page, rootDir, preferredRegion, middlewareConfig: middlewareConfigBase64, cacheHandler } = this.getOptions();
|
||||
const stringifiedPagePath = stringifyRequest(this, absolutePagePath);
|
||||
const stringifiedCacheHandlerPath = cacheHandler ? stringifyRequest(this, cacheHandler) : null;
|
||||
const buildInfo = getModuleBuildInfo(this._module);
|
||||
const middlewareConfig = JSON.parse(Buffer.from(middlewareConfigBase64, 'base64').toString());
|
||||
buildInfo.route = {
|
||||
page: page || '/',
|
||||
absolutePagePath,
|
||||
preferredRegion,
|
||||
middlewareConfig
|
||||
};
|
||||
buildInfo.nextEdgeApiFunction = {
|
||||
page: page || '/'
|
||||
};
|
||||
buildInfo.rootDir = rootDir;
|
||||
return `
|
||||
import 'next/dist/esm/server/web/globals'
|
||||
import { adapter } from 'next/dist/esm/server/web/adapter'
|
||||
import { IncrementalCache } from 'next/dist/esm/server/lib/incremental-cache'
|
||||
import { wrapApiHandler } from 'next/dist/esm/server/api-utils'
|
||||
${stringifiedCacheHandlerPath ? `import incrementalCacheHandler from ${stringifiedCacheHandlerPath}` : 'const incrementalCacheHandler = null'}
|
||||
|
||||
import handler from ${stringifiedPagePath}
|
||||
|
||||
if (typeof handler !== 'function') {
|
||||
throw new Error('The Edge Function "pages${page}" must export a \`default\` function');
|
||||
}
|
||||
|
||||
export default function nHandler (opts) {
|
||||
return adapter({
|
||||
...opts,
|
||||
IncrementalCache,
|
||||
incrementalCacheHandler,
|
||||
page: ${JSON.stringify(page)},
|
||||
handler: wrapApiHandler(${JSON.stringify(page)}, handler),
|
||||
})
|
||||
}
|
||||
`;
|
||||
};
|
||||
export default nextEdgeFunctionLoader;
|
||||
|
||||
//# sourceMappingURL=next-edge-function-loader.js.map
|
||||
Generated
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../../../src/build/webpack/loaders/next-edge-function-loader.ts"],"sourcesContent":["import type webpack from 'webpack'\nimport { getModuleBuildInfo } from './get-module-build-info'\nimport { stringifyRequest } from '../stringify-request'\nimport type { ProxyConfig } from '../../analysis/get-page-static-info'\n\nexport type EdgeFunctionLoaderOptions = {\n absolutePagePath: string\n page: string\n rootDir: string\n preferredRegion: string | string[] | undefined\n middlewareConfig: string\n cacheHandler?: string\n}\n\nconst nextEdgeFunctionLoader: webpack.LoaderDefinitionFunction<EdgeFunctionLoaderOptions> =\n function nextEdgeFunctionLoader(this) {\n const {\n absolutePagePath,\n page,\n rootDir,\n preferredRegion,\n middlewareConfig: middlewareConfigBase64,\n cacheHandler,\n }: EdgeFunctionLoaderOptions = this.getOptions()\n const stringifiedPagePath = stringifyRequest(this, absolutePagePath)\n const stringifiedCacheHandlerPath = cacheHandler\n ? stringifyRequest(this, cacheHandler)\n : null\n const buildInfo = getModuleBuildInfo(this._module as any)\n const middlewareConfig: ProxyConfig = JSON.parse(\n Buffer.from(middlewareConfigBase64, 'base64').toString()\n )\n buildInfo.route = {\n page: page || '/',\n absolutePagePath,\n preferredRegion,\n middlewareConfig,\n }\n buildInfo.nextEdgeApiFunction = {\n page: page || '/',\n }\n buildInfo.rootDir = rootDir\n\n return `\n import 'next/dist/esm/server/web/globals'\n import { adapter } from 'next/dist/esm/server/web/adapter'\n import { IncrementalCache } from 'next/dist/esm/server/lib/incremental-cache'\n import { wrapApiHandler } from 'next/dist/esm/server/api-utils'\n ${\n stringifiedCacheHandlerPath\n ? `import incrementalCacheHandler from ${stringifiedCacheHandlerPath}`\n : 'const incrementalCacheHandler = null'\n }\n\n import handler from ${stringifiedPagePath}\n\n if (typeof handler !== 'function') {\n throw new Error('The Edge Function \"pages${page}\" must export a \\`default\\` function');\n }\n\n export default function nHandler (opts) {\n return adapter({\n ...opts,\n IncrementalCache,\n incrementalCacheHandler,\n page: ${JSON.stringify(page)},\n handler: wrapApiHandler(${JSON.stringify(page)}, handler),\n })\n }\n `\n }\n\nexport default nextEdgeFunctionLoader\n"],"names":["getModuleBuildInfo","stringifyRequest","nextEdgeFunctionLoader","absolutePagePath","page","rootDir","preferredRegion","middlewareConfig","middlewareConfigBase64","cacheHandler","getOptions","stringifiedPagePath","stringifiedCacheHandlerPath","buildInfo","_module","JSON","parse","Buffer","from","toString","route","nextEdgeApiFunction","stringify"],"mappings":"AACA,SAASA,kBAAkB,QAAQ,0BAAyB;AAC5D,SAASC,gBAAgB,QAAQ,uBAAsB;AAYvD,MAAMC,yBACJ,SAASA;IACP,MAAM,EACJC,gBAAgB,EAChBC,IAAI,EACJC,OAAO,EACPC,eAAe,EACfC,kBAAkBC,sBAAsB,EACxCC,YAAY,EACb,GAA8B,IAAI,CAACC,UAAU;IAC9C,MAAMC,sBAAsBV,iBAAiB,IAAI,EAAEE;IACnD,MAAMS,8BAA8BH,eAChCR,iBAAiB,IAAI,EAAEQ,gBACvB;IACJ,MAAMI,YAAYb,mBAAmB,IAAI,CAACc,OAAO;IACjD,MAAMP,mBAAgCQ,KAAKC,KAAK,CAC9CC,OAAOC,IAAI,CAACV,wBAAwB,UAAUW,QAAQ;IAExDN,UAAUO,KAAK,GAAG;QAChBhB,MAAMA,QAAQ;QACdD;QACAG;QACAC;IACF;IACAM,UAAUQ,mBAAmB,GAAG;QAC9BjB,MAAMA,QAAQ;IAChB;IACAS,UAAUR,OAAO,GAAGA;IAEpB,OAAO,CAAC;;;;;QAKJ,EACEO,8BACI,CAAC,oCAAoC,EAAEA,6BAA6B,GACpE,uCACL;;4BAEmB,EAAED,oBAAoB;;;mDAGC,EAAEP,KAAK;;;;;;;;oBAQtC,EAAEW,KAAKO,SAAS,CAAClB,MAAM;sCACL,EAAEW,KAAKO,SAAS,CAAClB,MAAM;;;IAGzD,CAAC;AACH;AAEF,eAAeF,uBAAsB","ignoreList":[0]}
|
||||
Generated
Vendored
+98
@@ -0,0 +1,98 @@
|
||||
import { getModuleBuildInfo } from '../get-module-build-info';
|
||||
import { WEBPACK_RESOURCE_QUERIES } from '../../../../lib/constants';
|
||||
import { RouteKind } from '../../../../server/route-kind';
|
||||
import { normalizePagePath } from '../../../../shared/lib/page-path/normalize-page-path';
|
||||
import { loadEntrypoint } from '../../../load-entrypoint';
|
||||
/*
|
||||
For pages SSR'd at the edge, we bundle them with the ESM version of Next in order to
|
||||
benefit from the better tree-shaking and thus, smaller bundle sizes.
|
||||
|
||||
The absolute paths for _app, _error and _document, used in this loader, link to the regular CJS modules.
|
||||
They are generated in `createPagesMapping` where we don't have access to `isEdgeRuntime`,
|
||||
so we have to do it here. It's not that bad because it keeps all references to ESM modules magic in this place.
|
||||
*/ function swapDistFolderWithEsmDistFolder(path) {
|
||||
return path.replace('next/dist/pages', 'next/dist/esm/pages');
|
||||
}
|
||||
function getRouteModuleOptions(page) {
|
||||
const options = {
|
||||
definition: {
|
||||
kind: RouteKind.PAGES,
|
||||
page: normalizePagePath(page),
|
||||
pathname: page,
|
||||
// The following aren't used in production.
|
||||
bundlePath: '',
|
||||
filename: ''
|
||||
}
|
||||
};
|
||||
return options;
|
||||
}
|
||||
function getCacheHandlersSetup(cacheHandlersStringified, contextifyImportPath) {
|
||||
const cacheHandlers = JSON.parse(cacheHandlersStringified || '{}');
|
||||
const definedCacheHandlers = Object.entries(cacheHandlers).filter((entry)=>Boolean(entry[1]));
|
||||
const cacheHandlerImports = [];
|
||||
const cacheHandlerRegistration = [];
|
||||
for (const [index, [kind, handlerPath]] of definedCacheHandlers.entries()){
|
||||
const cacheHandlerVarName = `edgeCacheHandler_${index}`;
|
||||
const cacheHandlerImportPath = contextifyImportPath(handlerPath);
|
||||
cacheHandlerImports.push(`import ${cacheHandlerVarName} from ${JSON.stringify(cacheHandlerImportPath)}`);
|
||||
cacheHandlerRegistration.push(` cacheHandlers.setCacheHandler(${JSON.stringify(kind)}, ${cacheHandlerVarName})`);
|
||||
}
|
||||
return {
|
||||
cacheHandlerImports: cacheHandlerImports.join('\n') || '\n',
|
||||
cacheHandlerRegistration: cacheHandlerRegistration.join('\n') || '\n'
|
||||
};
|
||||
}
|
||||
const edgeSSRLoader = async function edgeSSRLoader() {
|
||||
const { page, absolutePagePath, absoluteAppPath, absoluteDocumentPath, absolute500Path, absoluteErrorPath, isServerComponent, appDirLoader: appDirLoaderBase64, pagesType, cacheHandler, cacheHandlers: cacheHandlersStringified, preferredRegion, middlewareConfig: middlewareConfigBase64 } = this.getOptions();
|
||||
const cacheHandlersSetup = getCacheHandlersSetup(cacheHandlersStringified, (handlerPath)=>this.utils.contextify(this.context || this.rootContext, handlerPath));
|
||||
const incrementalCacheHandler = cacheHandler ? this.utils.contextify(this.context || this.rootContext, cacheHandler) : null;
|
||||
const middlewareConfig = JSON.parse(Buffer.from(middlewareConfigBase64, 'base64').toString());
|
||||
const appDirLoader = Buffer.from(appDirLoaderBase64 || '', 'base64').toString();
|
||||
const isAppDir = pagesType === 'app';
|
||||
const buildInfo = getModuleBuildInfo(this._module);
|
||||
buildInfo.nextEdgeSSR = {
|
||||
isServerComponent,
|
||||
page: page,
|
||||
isAppDir
|
||||
};
|
||||
buildInfo.route = {
|
||||
page,
|
||||
absolutePagePath,
|
||||
preferredRegion,
|
||||
middlewareConfig
|
||||
};
|
||||
const pagePath = this.utils.contextify(this.context || this.rootContext, absolutePagePath);
|
||||
const appPath = absoluteAppPath ? this.utils.contextify(this.context || this.rootContext, swapDistFolderWithEsmDistFolder(absoluteAppPath)) : '';
|
||||
const errorPath = absoluteErrorPath ? this.utils.contextify(this.context || this.rootContext, swapDistFolderWithEsmDistFolder(absoluteErrorPath)) : '';
|
||||
const documentPath = absoluteDocumentPath ? this.utils.contextify(this.context || this.rootContext, swapDistFolderWithEsmDistFolder(absoluteDocumentPath)) : '';
|
||||
const userland500Path = absolute500Path ? this.utils.contextify(this.context || this.rootContext, swapDistFolderWithEsmDistFolder(absolute500Path)) : null;
|
||||
const stringifiedPagePath = JSON.stringify(pagePath);
|
||||
const pageModPath = `${appDirLoader}${stringifiedPagePath.substring(1, stringifiedPagePath.length - 1)}${isAppDir ? `?${WEBPACK_RESOURCE_QUERIES.edgeSSREntry}` : ''}`;
|
||||
if (isAppDir) {
|
||||
return await loadEntrypoint('edge-ssr-app', {
|
||||
VAR_USERLAND: pageModPath,
|
||||
VAR_PAGE: page
|
||||
}, cacheHandlersSetup, {
|
||||
incrementalCacheHandler
|
||||
});
|
||||
} else {
|
||||
return await loadEntrypoint('edge-ssr', {
|
||||
VAR_USERLAND: pageModPath,
|
||||
VAR_DEFINITION_PATHNAME: page,
|
||||
VAR_MODULE_DOCUMENT: documentPath,
|
||||
VAR_MODULE_APP: appPath,
|
||||
VAR_MODULE_GLOBAL_ERROR: errorPath
|
||||
}, {
|
||||
pageRouteModuleOptions: JSON.stringify(getRouteModuleOptions(page)),
|
||||
errorRouteModuleOptions: JSON.stringify(getRouteModuleOptions('/_error')),
|
||||
user500RouteModuleOptions: JSON.stringify(getRouteModuleOptions('/500')),
|
||||
...cacheHandlersSetup ?? {}
|
||||
}, {
|
||||
userland500Page: userland500Path,
|
||||
incrementalCacheHandler
|
||||
});
|
||||
}
|
||||
};
|
||||
export default edgeSSRLoader;
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
Generated
Vendored
+1
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user