@nuxt/webpack-builder 3.20.2 → 3.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,193 +1,534 @@
1
- import pify from 'pify';
2
- import { fromNodeMiddleware, defineEventHandler, handleCors, getRequestHeader, createError, setHeader } from 'h3';
3
- import webpackDevMiddleware from 'webpack-dev-middleware';
4
- import webpackHotMiddleware from 'webpack-hot-middleware';
5
- import { defu } from 'defu';
6
- import { joinURL } from 'ufo';
7
- import { logger, useNitro, useNuxt } from '@nuxt/kit';
8
- import { createUnplugin } from 'unplugin';
9
- import MagicString from 'magic-string';
10
- import { webpack, WebpackBarPlugin, builder, MiniCssExtractPlugin, TsCheckerPlugin } from '#builder';
11
- import { join, resolve, normalize, isAbsolute } from 'pathe';
12
- import { createFsFromVolume, Volume } from 'memfs';
13
- import querystring from 'node:querystring';
14
- import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
15
- import { defineEnv } from 'unenv';
16
- import TimeFixPlugin from 'time-fix-plugin';
17
- import FriendlyErrorsWebpackPlugin from '@nuxt/friendly-errors-webpack-plugin';
18
- import escapeRegExp from 'escape-string-regexp';
19
- import { isTest } from 'std-env';
20
- import { genObjectFromRawEntries, genString } from 'knitwork';
21
- import { EsbuildPlugin } from 'esbuild-loader';
22
- import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
23
- import createResolver from 'postcss-import-resolver';
24
- import { createJiti } from 'jiti';
25
- import VueLoaderPlugin from 'vue-loader/dist/pluginWebpack5.js';
26
- import { mkdir, writeFile } from 'node:fs/promises';
27
- import { normalizeWebpackManifest, precomputeDependencies } from 'vue-bundle-renderer';
28
- import { hash } from 'ohash';
29
- import { serialize } from 'seroval';
1
+ import { createRequire } from "node:module";
2
+ import pify from "pify";
3
+ import webpackDevMiddleware from "webpack-dev-middleware";
4
+ import webpackHotMiddleware from "webpack-hot-middleware";
5
+ import { defu } from "defu";
6
+ import { joinURL, parseURL, withTrailingSlash } from "ufo";
7
+ import { directoryToURL, logger, resolveAlias, useNitro, useNuxt } from "@nuxt/kit";
8
+ import { createUnplugin } from "unplugin";
9
+ import MagicString from "magic-string";
10
+ import webpack from "webpack";
11
+ import MiniCssExtractPlugin from "mini-css-extract-plugin";
12
+ import WebpackBarPlugin from "webpackbar";
13
+ import TsCheckerPlugin from "fork-ts-checker-webpack-plugin";
14
+ import { existsSync, readFileSync } from "node:fs";
15
+ import { pathToFileURL } from "node:url";
16
+ import { isAbsolute, join, normalize, relative, resolve } from "pathe";
17
+ import { genArrayFromRaw, genObjectFromRawEntries, genString } from "knitwork";
18
+ import { compileStyle, parse } from "@vue/compiler-sfc";
19
+ import { createHash } from "node:crypto";
20
+ import { Volume, createFsFromVolume } from "memfs";
21
+ import querystring from "node:querystring";
22
+ import { BundleAnalyzerPlugin } from "webpack-bundle-analyzer";
23
+ import { defineEnv } from "unenv";
24
+ import TimeFixPlugin from "time-fix-plugin";
25
+ import FriendlyErrorsWebpackPlugin from "@nuxt/friendly-errors-webpack-plugin";
26
+ import escapeRegExp from "escape-string-regexp";
27
+ import { isTest } from "std-env";
28
+ import { EsbuildPlugin } from "esbuild-loader";
29
+ import CssMinimizerPlugin from "css-minimizer-webpack-plugin";
30
+ import createResolver from "postcss-import-resolver";
31
+ import { createJiti } from "jiti";
32
+ import VueLoaderPlugin from "vue-loader/dist/pluginWebpack5.js";
33
+ import { resolveModulePath } from "exsolve";
34
+ import { mkdir, writeFile } from "node:fs/promises";
35
+ import { normalizeWebpackManifest, precomputeDependencies } from "vue-bundle-renderer";
36
+ import { hash } from "ohash";
37
+ import { serialize } from "seroval";
38
+ import { parseNodeModulePath } from "mlly";
30
39
 
40
+ //#region src/plugins/dynamic-base.ts
31
41
  const defaults = {
32
- globalPublicPath: "__webpack_public_path__",
33
- sourcemap: true
42
+ globalPublicPath: "__webpack_public_path__",
43
+ sourcemap: true
34
44
  };
35
45
  const ENTRY_RE = /import ["']#build\/css["'];/;
36
46
  const DynamicBasePlugin = createUnplugin((options = {}) => {
37
- options = { ...defaults, ...options };
38
- return {
39
- name: "nuxt:dynamic-base-path",
40
- enforce: "post",
41
- transform: {
42
- filter: {
43
- id: { include: /entry/ },
44
- code: { include: ENTRY_RE }
45
- },
46
- handler(code) {
47
- const s = new MagicString(code);
48
- s.prepend(`import { buildAssetsURL } from '#internal/nuxt/paths';
49
- ${options.globalPublicPath} = buildAssetsURL();
50
- `);
51
- return {
52
- code: s.toString(),
53
- map: options.sourcemap ? s.generateMap({ hires: true }) : void 0
54
- };
55
- }
56
- }
57
- };
47
+ options = {
48
+ ...defaults,
49
+ ...options
50
+ };
51
+ return {
52
+ name: "nuxt:dynamic-base-path",
53
+ enforce: "post",
54
+ transform: {
55
+ filter: {
56
+ id: { include: /entry/ },
57
+ code: { include: ENTRY_RE }
58
+ },
59
+ handler(code) {
60
+ const s = new MagicString(code);
61
+ s.prepend(`import { buildAssetsURL } from '#internal/nuxt/paths';\n${options.globalPublicPath} = buildAssetsURL();\n`);
62
+ return {
63
+ code: s.toString(),
64
+ map: options.sourcemap ? s.generateMap({ hires: true }) : void 0
65
+ };
66
+ }
67
+ }
68
+ };
58
69
  });
59
70
 
71
+ //#endregion
72
+ //#region builder.mjs
73
+ const builder = "webpack";
74
+
75
+ //#endregion
76
+ //#region src/plugins/chunk.ts
60
77
  const pluginName = "ChunkErrorPlugin";
61
- class ChunkErrorPlugin {
62
- script = `
63
- if (typeof ${webpack.RuntimeGlobals.require} !== "undefined") {
64
- var _ensureChunk = ${webpack.RuntimeGlobals.ensureChunk};
65
- ${webpack.RuntimeGlobals.ensureChunk} = function (chunkId) {
66
- return Promise.resolve(_ensureChunk(chunkId)).catch(error => {
67
- const e = new Event('nuxt:preloadError', { cancelable: true })
68
- e.payload = error
69
- window.dispatchEvent(e)
70
- throw error
78
+ var ChunkErrorPlugin = class {
79
+ apply(compiler) {
80
+ compiler.hooks.thisCompilation.tap(pluginName, (compilation) => {
81
+ compilation.hooks.runtimeRequirementInTree.for(webpack.RuntimeGlobals.ensureChunk).tap(pluginName, (chunk) => {
82
+ compilation.addRuntimeModule(chunk, new ChunkErrorRuntimeModule());
83
+ });
84
+ });
85
+ }
86
+ };
87
+ var ChunkErrorRuntimeModule = class extends webpack.RuntimeModule {
88
+ constructor() {
89
+ super("chunk preload error handler", webpack.RuntimeModule.STAGE_ATTACH);
90
+ }
91
+ generate() {
92
+ const { ensureChunk } = webpack.RuntimeGlobals;
93
+ return `
94
+ if (typeof ${ensureChunk} !== "undefined") {
95
+ var _ensureChunk = ${ensureChunk};
96
+ ${ensureChunk} = function (chunkId) {
97
+ return Promise.resolve(_ensureChunk(chunkId)).catch(function(error) {
98
+ var e = new Event('nuxt:preloadError', { cancelable: true });
99
+ e.payload = error;
100
+ window.dispatchEvent(e);
101
+ throw error;
71
102
  });
72
103
  };
73
- };`;
74
- apply(compiler) {
75
- compiler.hooks.thisCompilation.tap(
76
- pluginName,
77
- (compilation) => compilation.mainTemplate.hooks.localVars.tap(
78
- { name: pluginName, stage: 1 },
79
- (source) => source + this.script
80
- )
81
- );
82
- }
83
104
  }
105
+ `;
106
+ }
107
+ };
108
+
109
+ //#endregion
110
+ //#region src/plugins/ssr-styles.ts
111
+ const CSS_URL_RE = /url\((['"]?)(\/[^)]+?)\1\)/g;
112
+ const isVueFile = (id) => /\.vue(?:\?|$)/.test(id);
113
+ const isCSSLike = (name) => /\.(?:css|scss|sass|less|styl(?:us)?|postcss|pcss)(?:\?|$)/.test(name);
114
+ function normalizePath(nuxt$1, id) {
115
+ if (!id) return null;
116
+ const { pathname } = parseURL(decodeURIComponent(pathToFileURL(id).href));
117
+ const rel = relative(nuxt$1.options.srcDir, pathname);
118
+ if (rel.startsWith("..")) return null;
119
+ return rel;
120
+ }
121
+ function resolveFilePath(id) {
122
+ if (!id) return null;
123
+ return parseURL(decodeURIComponent(pathToFileURL(id).href)).pathname || null;
124
+ }
125
+ function sanitizeStyleAssetName(rel) {
126
+ return rel.replace(/[\\/]/g, "_").replace(/\.{2,}/g, "_");
127
+ }
128
+ function normalizeCSSContent(css) {
129
+ return css.trim().replace(/(--[^:]+):\s*'([^']*)'/g, "$1:\"$2\"").replace(/:\s+/g, ":").replace(/\s*\{\s*/g, "{").replace(/;\s*\}/g, "}").replace(/\s*\}\s*/g, "}");
130
+ }
131
+ function extractVueStyles(filePath) {
132
+ try {
133
+ const { descriptor } = parse(readFileSync(filePath, "utf8"), { filename: filePath });
134
+ const styles = [];
135
+ const scopeId = createHash("sha256").update(filePath).digest("hex").slice(0, 8);
136
+ for (let i = 0; i < descriptor.styles.length; i++) {
137
+ const style$1 = descriptor.styles[i];
138
+ const result = compileStyle({
139
+ source: style$1.content,
140
+ filename: filePath,
141
+ id: `data-v-${scopeId}`,
142
+ scoped: style$1.scoped
143
+ });
144
+ if (!result.errors.length && result.code) styles.push(normalizeCSSContent(result.code));
145
+ }
146
+ return styles;
147
+ } catch {
148
+ return [];
149
+ }
150
+ }
151
+ var SSRStylesPlugin = class {
152
+ nuxt;
153
+ clientCSSByIssuer = /* @__PURE__ */ new Map();
154
+ chunksWithInlinedCSS = /* @__PURE__ */ new Set();
155
+ globalCSSPaths = /* @__PURE__ */ new Set();
156
+ constructor(nuxt$1) {
157
+ this.nuxt = nuxt$1;
158
+ this.globalCSSPaths = this.resolveGlobalCSS();
159
+ nuxt$1.hook("build:manifest", (manifest) => {
160
+ for (const [id, chunk] of Object.entries(manifest)) {
161
+ if (chunk.isEntry && chunk.src) this.chunksWithInlinedCSS.add(chunk.src);
162
+ else if (this.chunksWithInlinedCSS.has(id)) chunk.css &&= [];
163
+ if (chunk.css?.length) chunk.css = chunk.css.filter((cssPath) => {
164
+ for (const globalPath of this.globalCSSPaths) if (cssPath.includes(globalPath.split("/").pop() || "")) return false;
165
+ return true;
166
+ });
167
+ }
168
+ });
169
+ }
170
+ shouldInline(mod) {
171
+ const shouldInline = this.nuxt.options.features.inlineStyles;
172
+ if (typeof shouldInline === "boolean") return shouldInline;
173
+ return shouldInline(mod.identifier());
174
+ }
175
+ escapeTemplateLiteral(str) {
176
+ return str.replace(/[`\\$]/g, (m) => m === "$" ? "\\$" : `\\${m}`);
177
+ }
178
+ isBuildAsset(url) {
179
+ const buildDir = withTrailingSlash(this.nuxt.options.app.buildAssetsDir || "/_nuxt/");
180
+ return url.startsWith(buildDir);
181
+ }
182
+ isPublicAsset(url, nitro) {
183
+ const cleaned = url.replace(/[?#].*$/, "");
184
+ for (const dir of nitro.options.publicAssets) {
185
+ const base$1 = withTrailingSlash(dir.baseURL || "/");
186
+ if (!url.startsWith(base$1)) continue;
187
+ if (existsSync(cleaned.replace(base$1, withTrailingSlash(dir.dir)))) return true;
188
+ }
189
+ return false;
190
+ }
191
+ rewriteStyle(css, nitro) {
192
+ let changed = false;
193
+ let needsPublicAsset = false;
194
+ let needsBuildAsset = false;
195
+ let lastIndex = 0;
196
+ let out = "`";
197
+ for (const match of css.matchAll(CSS_URL_RE)) {
198
+ const index = match.index ?? 0;
199
+ const before = css.slice(lastIndex, index);
200
+ if (before) out += this.escapeTemplateLiteral(before);
201
+ const full = match[0];
202
+ const rawUrl = match[2] || "";
203
+ const stripped = rawUrl.replace(/[?#].*$/, "");
204
+ if (this.isPublicAsset(stripped, nitro)) {
205
+ needsPublicAsset = true;
206
+ changed = true;
207
+ out += "${publicAssetsURL(" + JSON.stringify(rawUrl) + ")}";
208
+ } else if (this.isBuildAsset(stripped)) {
209
+ needsBuildAsset = true;
210
+ changed = true;
211
+ out += "${buildAssetsURL(" + JSON.stringify(rawUrl) + ")}";
212
+ } else out += this.escapeTemplateLiteral(full);
213
+ lastIndex = index + full.length;
214
+ }
215
+ const tail = css.slice(lastIndex);
216
+ if (tail) out += this.escapeTemplateLiteral(tail);
217
+ out += "`";
218
+ return {
219
+ code: changed ? out : JSON.stringify(css),
220
+ needsPublicAsset,
221
+ needsBuildAsset
222
+ };
223
+ }
224
+ resolveGlobalCSS() {
225
+ const req = createRequire(this.nuxt.options.rootDir);
226
+ const resolved = /* @__PURE__ */ new Set();
227
+ const entries = this.nuxt.options.css || [];
228
+ for (const entry of entries) {
229
+ const src = typeof entry === "string" ? entry : entry?.src;
230
+ if (!src) continue;
231
+ const path = this.resolveCSSRequest(src, req);
232
+ if (path) resolved.add(path);
233
+ }
234
+ return resolved;
235
+ }
236
+ resolveCSSRequest(request, req) {
237
+ const candidates = /* @__PURE__ */ new Set();
238
+ const resolved = resolveAlias(request, this.nuxt.options.alias);
239
+ if (isAbsolute(resolved)) candidates.add(resolved);
240
+ else candidates.add(resolve(this.nuxt.options.srcDir, resolved));
241
+ try {
242
+ candidates.add(req.resolve(request));
243
+ } catch {}
244
+ for (const candidate of candidates) {
245
+ const path = resolveFilePath(candidate);
246
+ if (path) return path;
247
+ }
248
+ return null;
249
+ }
250
+ normalizeResourcePath(resource) {
251
+ if (!resource) return null;
252
+ const withoutQuery = resource.split("?")[0];
253
+ return resolveFilePath(withoutQuery);
254
+ }
255
+ apply(compiler) {
256
+ if (this.nuxt.options.dev) return;
257
+ const isClient = compiler.options.name === "client";
258
+ const isServer = compiler.options.name === "server";
259
+ if (!isClient && !isServer) return;
260
+ compiler.hooks.thisCompilation.tap("SSRStylesPlugin", (compilation) => {
261
+ this.collectCSS(compilation);
262
+ if (isClient) this.removeGlobalCSSFromClient(compilation);
263
+ if (isServer) this.emitServerStyles(compilation);
264
+ });
265
+ }
266
+ emitServerStyles(compilation) {
267
+ const { webpack: webpack$1 } = compilation.compiler;
268
+ const stage = webpack$1.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE;
269
+ compilation.hooks.processAssets.tap({
270
+ name: "SSRStylesPlugin",
271
+ stage
272
+ }, () => {
273
+ const nitro = useNitro();
274
+ const collected = new Map(this.clientCSSByIssuer);
275
+ const entryModules = /* @__PURE__ */ new Set();
276
+ for (const entrypoint of compilation.entrypoints.values()) {
277
+ const primaryChunk = typeof entrypoint.getEntrypointChunk === "function" ? entrypoint.getEntrypointChunk() : void 0;
278
+ const chunks = primaryChunk ? [primaryChunk] : entrypoint.chunks;
279
+ for (const chunk of chunks) for (const mod of compilation.chunkGraph.getChunkModulesIterable(chunk)) if ("resource" in mod && typeof mod.resource === "string") {
280
+ const resolved = resolveFilePath(mod.resource);
281
+ if (resolved) {
282
+ const rel = normalizePath(this.nuxt, resolved);
283
+ if (rel) entryModules.add(rel);
284
+ else entryModules.add(resolved);
285
+ }
286
+ }
287
+ }
288
+ for (const module of compilation.modules) {
289
+ const resource = module.resource;
290
+ if (!resource || !isVueFile(resource)) continue;
291
+ const rel = normalizePath(this.nuxt, resource);
292
+ if (!rel) continue;
293
+ if (collected.has(rel)) continue;
294
+ const vueStyles = extractVueStyles(resolveFilePath(resource) || resource);
295
+ if (vueStyles.length) collected.set(rel, new Set(vueStyles));
296
+ }
297
+ const emitted = {};
298
+ const rawSource = webpack$1.sources.RawSource;
299
+ for (const [rel, cssSet] of collected.entries()) {
300
+ if (!cssSet.size) continue;
301
+ const transformed = Array.from(cssSet).map((style$1) => this.rewriteStyle(style$1, nitro));
302
+ const needsPublicAssets = transformed.some((t) => t.needsPublicAsset);
303
+ const needsBuildAssets = transformed.some((t) => t.needsBuildAsset);
304
+ const imports = [];
305
+ if (needsPublicAssets || needsBuildAssets) {
306
+ const names = [];
307
+ if (needsBuildAssets) names.push("buildAssetsURL");
308
+ if (needsPublicAssets) names.push("publicAssetsURL");
309
+ imports.push(`import { ${names.join(", ")} } from '#internal/nuxt/paths'`);
310
+ }
311
+ const moduleSource = [...imports, `export default ${genArrayFromRaw(transformed.map((t) => t.code))}`].filter(Boolean).join("\n");
312
+ const styleModuleName = `${sanitizeStyleAssetName(rel)}-styles.mjs`;
313
+ compilation.emitAsset(styleModuleName, new rawSource(moduleSource));
314
+ emitted[rel] = styleModuleName;
315
+ this.chunksWithInlinedCSS.add(rel);
316
+ }
317
+ const stylesSource = ["const interopDefault = r => r.default || r || []", `export default ${genObjectFromRawEntries(Object.entries(emitted).map(([key, value]) => [key, `() => import('./${value}').then(interopDefault)`]))}`].join("\n");
318
+ compilation.emitAsset("styles.mjs", new rawSource(stylesSource));
319
+ const entryIds = Array.from(this.chunksWithInlinedCSS).filter((id) => entryModules.has(id));
320
+ nitro.options.virtual["#internal/nuxt/entry-ids.mjs"] = () => `export default ${JSON.stringify(entryIds)}`;
321
+ nitro.options._config.virtual ||= {};
322
+ nitro.options._config.virtual["#internal/nuxt/entry-ids.mjs"] = nitro.options.virtual["#internal/nuxt/entry-ids.mjs"];
323
+ });
324
+ }
325
+ findIssuerPath(compilation, mod) {
326
+ let issuer = compilation.moduleGraph.getIssuer(mod);
327
+ while (issuer) {
328
+ if ("resource" in issuer && typeof issuer.resource === "string") return issuer.resource;
329
+ issuer = compilation.moduleGraph.getIssuer(issuer);
330
+ }
331
+ return null;
332
+ }
333
+ removeGlobalCSSFromClient(compilation) {
334
+ compilation.hooks.processAssets.tap({
335
+ name: "SSRStylesPlugin:RemoveGlobalCSS",
336
+ stage: 650
337
+ }, () => {
338
+ for (const chunk of compilation.chunks) if (chunk.name === "nuxt-global-css") {
339
+ const cssAssets = [];
340
+ for (const file of Array.from(chunk.files)) {
341
+ const filename = String(file);
342
+ if (isCSSLike(filename)) {
343
+ const source = compilation.getAsset(filename)?.source;
344
+ const content = source && typeof source.source === "function" ? source.source() : null;
345
+ const text = typeof content === "string" ? content : content instanceof Buffer ? content.toString("utf8") : "";
346
+ if (text) cssAssets.push(text);
347
+ }
348
+ }
349
+ if (cssAssets.length > 0) for (const mod of compilation.chunkGraph.getChunkModulesIterable(chunk)) {
350
+ const issuerPath = this.findIssuerPath(compilation, mod) || ("resource" in mod && typeof mod.resource === "string" ? mod.resource : null);
351
+ const normalized = normalizePath(this.nuxt, issuerPath);
352
+ if (!normalized) continue;
353
+ const set = this.clientCSSByIssuer.get(normalized) || /* @__PURE__ */ new Set();
354
+ for (const css of cssAssets) set.add(normalizeCSSContent(css));
355
+ this.clientCSSByIssuer.set(normalized, set);
356
+ }
357
+ for (const file of Array.from(chunk.files)) {
358
+ const filename = String(file);
359
+ if (isCSSLike(filename)) {
360
+ compilation.deleteAsset(filename);
361
+ chunk.files.delete(file);
362
+ }
363
+ }
364
+ }
365
+ });
366
+ }
367
+ collectCSS(compilation) {
368
+ const { webpack: webpack$1 } = compilation.compiler;
369
+ const stage = compilation.compiler.options.name === "server" ? webpack$1.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS : webpack$1.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER;
370
+ const chunkCSSMeta = /* @__PURE__ */ new Map();
371
+ compilation.hooks.processAssets.tap({
372
+ name: "SSRStylesPlugin",
373
+ stage
374
+ }, () => {
375
+ const cssAssetsByChunk = /* @__PURE__ */ new Map();
376
+ for (const chunk of compilation.chunks) {
377
+ const cssAssets = [];
378
+ const chunkCSSFiles = [];
379
+ for (const file of chunk.files) {
380
+ if (!isCSSLike(file)) continue;
381
+ chunkCSSFiles.push(file);
382
+ const source = compilation.getAsset(file)?.source;
383
+ const content = source && typeof source.source === "function" ? source.source() : null;
384
+ const text = typeof content === "string" ? content : content instanceof Buffer ? content.toString("utf8") : "";
385
+ if (text) cssAssets.push(text);
386
+ }
387
+ if (chunkCSSFiles.length) {
388
+ const chunkCSSModules = Array.from(compilation.chunkGraph.getChunkModulesIterable(chunk));
389
+ chunkCSSMeta.set(chunk, {
390
+ files: chunkCSSFiles,
391
+ modules: chunkCSSModules
392
+ });
393
+ }
394
+ if (cssAssets.length) cssAssetsByChunk.set(chunk, cssAssets);
395
+ }
396
+ for (const [chunk, cssAssets] of cssAssetsByChunk) for (const mod of compilation.chunkGraph.getChunkModulesIterable(chunk)) {
397
+ if (!this.shouldInline(mod)) continue;
398
+ const issuerPath = this.findIssuerPath(compilation, mod) || ("resource" in mod && typeof mod.resource === "string" ? mod.resource : null);
399
+ const normalized = normalizePath(this.nuxt, issuerPath);
400
+ if (!normalized) continue;
401
+ const set = this.clientCSSByIssuer.get(normalized) || /* @__PURE__ */ new Set();
402
+ for (const css of cssAssets) set.add(normalizeCSSContent(css));
403
+ this.clientCSSByIssuer.set(normalized, set);
404
+ }
405
+ for (const mod of compilation.modules) {
406
+ if (!this.shouldInline(mod)) continue;
407
+ const issuerPath = this.findIssuerPath(compilation, mod);
408
+ const normalized = normalizePath(this.nuxt, issuerPath);
409
+ if (!normalized) continue;
410
+ const cssChunks = this.getModuleCSS(mod, compilation);
411
+ if (!cssChunks.length) continue;
412
+ const set = this.clientCSSByIssuer.get(normalized) || /* @__PURE__ */ new Set();
413
+ set.add(cssChunks.join("\n"));
414
+ this.clientCSSByIssuer.set(normalized, set);
415
+ }
416
+ });
417
+ }
418
+ getModuleCSS(mod, _compilation) {
419
+ const cssModule = mod;
420
+ const cssChunks = [];
421
+ if (mod.type === "css/mini-extract" && Array.isArray(cssModule.content)) for (const part of cssModule.content) {
422
+ const css = part?.[1];
423
+ if (css && typeof css === "string") cssChunks.push(normalizeCSSContent(css));
424
+ }
425
+ return cssChunks;
426
+ }
427
+ };
84
428
 
429
+ //#endregion
430
+ //#region src/utils/mfs.ts
85
431
  function createMFS() {
86
- const fs = createFsFromVolume(new Volume());
87
- const _fs = { ...fs };
88
- _fs.join = join;
89
- _fs.exists = (p) => Promise.resolve(_fs.existsSync(p));
90
- _fs.readFile = pify(_fs.readFile);
91
- return _fs;
432
+ const _fs = { ...createFsFromVolume(new Volume()) };
433
+ _fs.join = join;
434
+ _fs.exists = (p) => Promise.resolve(_fs.existsSync(p));
435
+ _fs.readFile = pify(_fs.readFile);
436
+ return _fs;
92
437
  }
93
438
 
439
+ //#endregion
440
+ //#region src/utils/index.ts
441
+ /** @since 3.9.0 */
94
442
  function toArray(value) {
95
- return Array.isArray(value) ? value : [value];
443
+ return Array.isArray(value) ? value : [value];
96
444
  }
97
445
 
98
- function createWebpackConfigContext(nuxt) {
99
- return {
100
- nuxt,
101
- options: nuxt.options,
102
- userConfig: nuxt.options.webpack,
103
- config: {},
104
- name: "base",
105
- isDev: nuxt.options.dev,
106
- isServer: false,
107
- isClient: false,
108
- alias: {},
109
- transpile: []
110
- };
446
+ //#endregion
447
+ //#region src/utils/config.ts
448
+ function createWebpackConfigContext(nuxt$1) {
449
+ return {
450
+ nuxt: nuxt$1,
451
+ options: nuxt$1.options,
452
+ userConfig: nuxt$1.options.webpack,
453
+ config: {},
454
+ name: "base",
455
+ isDev: nuxt$1.options.dev,
456
+ isServer: false,
457
+ isClient: false,
458
+ alias: {},
459
+ transpile: []
460
+ };
111
461
  }
112
462
  async function applyPresets(ctx, presets) {
113
- for (const preset of toArray(presets)) {
114
- if (Array.isArray(preset)) {
115
- await preset[0](ctx, preset[1]);
116
- } else {
117
- await preset(ctx);
118
- }
119
- }
463
+ for (const preset of toArray(presets)) if (Array.isArray(preset)) await preset[0](ctx, preset[1]);
464
+ else await preset(ctx);
120
465
  }
121
466
  function fileName(ctx, key) {
122
- let fileName2 = ctx.userConfig.filenames[key];
123
- if (typeof fileName2 === "function") {
124
- fileName2 = fileName2(ctx);
125
- }
126
- if (typeof fileName2 === "string" && ctx.options.dev) {
127
- const hash = /\[(chunkhash|contenthash|hash)(?::\d+)?\]/.exec(fileName2);
128
- if (hash) {
129
- logger.warn(`Notice: Please do not use ${hash[1]} in dev mode to prevent memory leak`);
130
- }
131
- }
132
- return fileName2;
467
+ let fileName$1 = ctx.userConfig.filenames[key];
468
+ if (typeof fileName$1 === "function") fileName$1 = fileName$1(ctx);
469
+ if (typeof fileName$1 === "string" && ctx.options.dev) {
470
+ const hash$1 = /\[(chunkhash|contenthash|hash)(?::\d+)?\]/.exec(fileName$1);
471
+ if (hash$1) logger.warn(`Notice: Please do not use ${hash$1[1]} in dev mode to prevent memory leak`);
472
+ }
473
+ return fileName$1;
133
474
  }
134
475
 
476
+ //#endregion
477
+ //#region src/presets/assets.ts
135
478
  function assets(ctx) {
136
- ctx.config.module.rules.push(
137
- {
138
- test: /\.(png|jpe?g|gif|svg|webp)$/i,
139
- use: [{
140
- loader: "url-loader",
141
- options: {
142
- ...ctx.userConfig.loaders.imgUrl,
143
- name: fileName(ctx, "img")
144
- }
145
- }]
146
- },
147
- {
148
- test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i,
149
- use: [{
150
- loader: "url-loader",
151
- options: {
152
- ...ctx.userConfig.loaders.fontUrl,
153
- name: fileName(ctx, "font")
154
- }
155
- }]
156
- },
157
- {
158
- test: /\.(webm|mp4|ogv)$/i,
159
- use: [{
160
- loader: "file-loader",
161
- options: {
162
- ...ctx.userConfig.loaders.file,
163
- name: fileName(ctx, "video")
164
- }
165
- }]
166
- }
167
- );
479
+ ctx.config.module.rules.push({
480
+ test: /\.(png|jpe?g|gif|svg|webp)$/i,
481
+ use: [{
482
+ loader: "url-loader",
483
+ options: {
484
+ ...ctx.userConfig.loaders.imgUrl,
485
+ name: fileName(ctx, "img")
486
+ }
487
+ }]
488
+ }, {
489
+ test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i,
490
+ use: [{
491
+ loader: "url-loader",
492
+ options: {
493
+ ...ctx.userConfig.loaders.fontUrl,
494
+ name: fileName(ctx, "font")
495
+ }
496
+ }]
497
+ }, {
498
+ test: /\.(webm|mp4|ogv)$/i,
499
+ use: [{
500
+ loader: "file-loader",
501
+ options: {
502
+ ...ctx.userConfig.loaders.file,
503
+ name: fileName(ctx, "video")
504
+ }
505
+ }]
506
+ });
168
507
  }
169
508
 
170
- class WarningIgnorePlugin {
171
- filter;
172
- constructor(filter) {
173
- this.filter = filter;
174
- }
175
- apply(compiler) {
176
- compiler.hooks.done.tap("warnfix-plugin", (stats) => {
177
- stats.compilation.warnings = stats.compilation.warnings.filter(this.filter);
178
- });
179
- }
180
- }
509
+ //#endregion
510
+ //#region src/plugins/warning-ignore.ts
511
+ var WarningIgnorePlugin = class {
512
+ filter;
513
+ constructor(filter) {
514
+ this.filter = filter;
515
+ }
516
+ apply(compiler) {
517
+ compiler.hooks.done.tap("warnfix-plugin", (stats) => {
518
+ stats.compilation.warnings = stats.compilation.warnings.filter(this.filter);
519
+ });
520
+ }
521
+ };
181
522
 
523
+ //#endregion
524
+ //#region src/plugins/vue/util.ts
525
+ /**
526
+ * This file is based on Vue.js (MIT) webpack plugins
527
+ * https://github.com/vuejs/vue/blob/dev/src/server/webpack-plugin/util.js
528
+ */
182
529
  const validate = (compiler) => {
183
- if (compiler.options.target !== "node") {
184
- logger.warn('webpack config `target` should be "node".');
185
- }
186
- if (!compiler.options.externals) {
187
- logger.info(
188
- "It is recommended to externalize dependencies in the server build for better build performance."
189
- );
190
- }
530
+ if (compiler.options.target !== "node") logger.warn("webpack config `target` should be \"node\".");
531
+ if (!compiler.options.externals) logger.info("It is recommended to externalize dependencies in the server build for better build performance.");
191
532
  };
192
533
  const isJSRegExp = /\.[cm]?js(\?[^.]+)?$/;
193
534
  const isJS = (file) => isJSRegExp.test(file);
@@ -196,87 +537,66 @@ const isCSSRegExp = /\.css(?:\?[^.]+)?$/;
196
537
  const isCSS = (file) => isCSSRegExp.test(file);
197
538
  const isHotUpdate = (file) => file.includes("hot-update");
198
539
 
540
+ //#endregion
541
+ //#region src/plugins/rollup-compat-dynamic-import.ts
199
542
  const DYNAMIC_IMPORT_RE = /import\([^)]*\+\s*__webpack_require__[^+]*\)\.then/;
200
543
  const DYNAMIC_IMPORT_REPLACE_RE = /import\([^)]*\+\s*(__webpack_require__[^+]*)\)\.then/g;
201
544
  const HELPER_FILENAME = "_dynamic-import-helper.mjs";
202
- const HELPER_IMPORT = `import { _rollupDynamicImport } from "./${HELPER_FILENAME}";
203
- `;
204
- class RollupCompatDynamicImportPlugin {
205
- apply(compiler) {
206
- compiler.hooks.compilation.tap("RollupCompatDynamicImportPlugin", (compilation) => {
207
- compilation.hooks.processAssets.tapAsync(
208
- {
209
- name: "RollupCompatDynamicImportPlugin",
210
- stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
211
- },
212
- (assets, callback) => {
213
- try {
214
- const targetFiles = /* @__PURE__ */ new Set();
215
- for (const chunk of compilation.chunks) {
216
- if (chunk.canBeInitial() || chunk.hasRuntime()) {
217
- for (const file of chunk.files || []) {
218
- targetFiles.add(file);
219
- }
220
- }
221
- }
222
- for (const [filename, asset] of Object.entries(assets)) {
223
- if (!isJS(filename)) {
224
- continue;
225
- }
226
- if (!targetFiles.has(filename)) {
227
- continue;
228
- }
229
- const source = asset.source();
230
- const originalCode = typeof source === "string" ? source : source.toString();
231
- if (!DYNAMIC_IMPORT_RE.test(originalCode)) {
232
- continue;
233
- }
234
- const transformedCode = this.transformDynamicImports(originalCode);
235
- if (transformedCode !== originalCode) {
236
- assets[filename] = new compiler.webpack.sources.RawSource(transformedCode);
237
- }
238
- }
239
- this.generateDynamicImportHelper(compilation);
240
- callback();
241
- } catch (error) {
242
- callback(error);
243
- }
244
- }
245
- );
246
- });
247
- }
248
- transformDynamicImports(source) {
249
- let transformed = source;
250
- let needsHelperImport = false;
251
- transformed = transformed.replace(DYNAMIC_IMPORT_REPLACE_RE, (match, filename) => {
252
- needsHelperImport = true;
253
- return `_rollupDynamicImport(${filename}).then`;
254
- });
255
- if (needsHelperImport && !transformed.includes(HELPER_IMPORT)) {
256
- transformed = HELPER_IMPORT + transformed;
257
- }
258
- return transformed;
259
- }
260
- generateDynamicImportHelper(compilation) {
261
- const chunkFiles = [];
262
- for (const chunk of compilation.chunks) {
263
- if (chunk.hasRuntime()) {
264
- continue;
265
- }
266
- for (const filename of chunk.files) {
267
- if (filename && isJS(filename)) {
268
- chunkFiles.push(filename);
269
- }
270
- }
271
- }
272
- if (chunkFiles.length === 0) {
273
- return;
274
- }
275
- const helperContent = this.generateHelperContent(chunkFiles);
276
- compilation.emitAsset(HELPER_FILENAME, new compilation.compiler.webpack.sources.RawSource(helperContent));
277
- }
278
- generateHelperContent(chunkFiles) {
279
- return `
545
+ const HELPER_IMPORT = `import { _rollupDynamicImport } from "./${HELPER_FILENAME}";\n`;
546
+ /**
547
+ * Webpack plugin that generates rollup-compatible dynamic imports.
548
+ * This plugin uses webpack's native compilation hooks to override dynamic import generation
549
+ * and create rollup-compatible code directly during webpack's compilation process.
550
+ */
551
+ var RollupCompatDynamicImportPlugin = class {
552
+ apply(compiler) {
553
+ compiler.hooks.compilation.tap("RollupCompatDynamicImportPlugin", (compilation) => {
554
+ compilation.hooks.processAssets.tapAsync({
555
+ name: "RollupCompatDynamicImportPlugin",
556
+ stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
557
+ }, (assets$1, callback) => {
558
+ try {
559
+ const targetFiles = /* @__PURE__ */ new Set();
560
+ for (const chunk of compilation.chunks) if (chunk.canBeInitial() || chunk.hasRuntime()) for (const file of chunk.files || []) targetFiles.add(file);
561
+ for (const [filename, asset] of Object.entries(assets$1)) {
562
+ if (!isJS(filename)) continue;
563
+ if (!targetFiles.has(filename)) continue;
564
+ const source = asset.source();
565
+ const originalCode = typeof source === "string" ? source : source.toString();
566
+ if (!DYNAMIC_IMPORT_RE.test(originalCode)) continue;
567
+ const transformedCode = this.transformDynamicImports(originalCode);
568
+ if (transformedCode !== originalCode) assets$1[filename] = new compiler.webpack.sources.RawSource(transformedCode);
569
+ }
570
+ this.generateDynamicImportHelper(compilation);
571
+ callback();
572
+ } catch (error) {
573
+ callback(error);
574
+ }
575
+ });
576
+ });
577
+ }
578
+ transformDynamicImports(source) {
579
+ let transformed = source;
580
+ let needsHelperImport = false;
581
+ transformed = transformed.replace(DYNAMIC_IMPORT_REPLACE_RE, (match, filename) => {
582
+ needsHelperImport = true;
583
+ return `_rollupDynamicImport(${filename}).then`;
584
+ });
585
+ if (needsHelperImport && !transformed.includes(HELPER_IMPORT)) transformed = HELPER_IMPORT + transformed;
586
+ return transformed;
587
+ }
588
+ generateDynamicImportHelper(compilation) {
589
+ const chunkFiles = [];
590
+ for (const chunk of compilation.chunks) {
591
+ if (chunk.hasRuntime()) continue;
592
+ for (const filename of chunk.files) if (filename && isJS(filename)) chunkFiles.push(filename);
593
+ }
594
+ if (chunkFiles.length === 0) return;
595
+ const helperContent = this.generateHelperContent(chunkFiles);
596
+ compilation.emitAsset(HELPER_FILENAME, new compilation.compiler.webpack.sources.RawSource(helperContent));
597
+ }
598
+ generateHelperContent(chunkFiles) {
599
+ return `
280
600
  // Rollup-compatible dynamic import helper generated by webpack
281
601
  // This helper enables rollup to consume webpack chunks directly
282
602
 
@@ -293,993 +613,912 @@ export function _rollupDynamicImport(chunkId) {
293
613
  return chunk()
294
614
  }
295
615
  `;
296
- }
297
- }
616
+ }
617
+ };
298
618
 
619
+ //#endregion
620
+ //#region src/presets/base.ts
299
621
  async function base(ctx) {
300
- await applyPresets(ctx, [
301
- baseAlias,
302
- baseConfig,
303
- basePlugins,
304
- baseResolve,
305
- baseTranspile
306
- ]);
622
+ await applyPresets(ctx, [
623
+ baseAlias,
624
+ baseConfig,
625
+ basePlugins,
626
+ baseResolve,
627
+ baseTranspile
628
+ ]);
307
629
  }
308
630
  function baseConfig(ctx) {
309
- ctx.config = defu({}, {
310
- name: ctx.name,
311
- entry: { app: [resolve(ctx.options.appDir, ctx.options.experimental.asyncEntry ? "entry.async" : "entry")] },
312
- module: { rules: [] },
313
- plugins: [],
314
- externals: [],
315
- optimization: {
316
- ...ctx.userConfig.optimization,
317
- minimizer: []
318
- },
319
- experiments: {
320
- ...ctx.userConfig.experiments
321
- },
322
- mode: ctx.isDev ? "development" : "production",
323
- cache: getCache(ctx),
324
- output: getOutput(ctx),
325
- stats: statsMap[ctx.nuxt.options.logLevel] ?? statsMap.info,
326
- ...ctx.config
327
- });
631
+ ctx.config = defu({}, {
632
+ name: ctx.name,
633
+ entry: { app: [resolve(ctx.options.appDir, ctx.options.experimental.asyncEntry ? "entry.async" : "entry")] },
634
+ module: { rules: [] },
635
+ plugins: [],
636
+ externals: [],
637
+ optimization: {
638
+ ...ctx.userConfig.optimization,
639
+ minimizer: []
640
+ },
641
+ experiments: { ...ctx.userConfig.experiments },
642
+ mode: ctx.isDev ? "development" : "production",
643
+ cache: getCache(ctx),
644
+ output: getOutput(ctx),
645
+ stats: statsMap[ctx.nuxt.options.logLevel] ?? statsMap.info,
646
+ ...ctx.config
647
+ });
328
648
  }
329
649
  function basePlugins(ctx) {
330
- ctx.config.plugins ||= [];
331
- if (ctx.options.dev) {
332
- if (ctx.nuxt.options.builder !== "@nuxt/rspack-builder") {
333
- ctx.config.plugins.push(new TimeFixPlugin());
334
- }
335
- }
336
- ctx.config.plugins.push(...ctx.userConfig.plugins || []);
337
- if (ctx.nuxt.options.builder !== "@nuxt/rspack-builder") {
338
- ctx.config.plugins.push(new WarningIgnorePlugin(getWarningIgnoreFilter(ctx)));
339
- }
340
- ctx.config.plugins.push(new webpack.DefinePlugin(getEnv(ctx)));
341
- if (ctx.isServer || ctx.isDev && ctx.userConfig.friendlyErrors) {
342
- ctx.config.plugins.push(
343
- new FriendlyErrorsWebpackPlugin({
344
- clearConsole: false,
345
- reporter: "consola",
346
- logLevel: "ERROR"
347
- // TODO
348
- })
349
- );
350
- }
351
- if (ctx.nuxt.options.webpack.profile) {
352
- const colors = {
353
- client: "green",
354
- server: "orange",
355
- modern: "blue"
356
- };
357
- ctx.config.plugins.push(new WebpackBarPlugin({
358
- name: ctx.name,
359
- color: colors[ctx.name],
360
- reporters: ["stats"],
361
- // @ts-expect-error TODO: this is a valid option for Webpack.ProgressPlugin and needs to be declared for WebpackBar
362
- stats: !ctx.isDev,
363
- reporter: {
364
- reporter: {
365
- change: (_, { shortPath }) => {
366
- if (!ctx.isServer) {
367
- ctx.nuxt.callHook(`${builder}:change`, shortPath);
368
- }
369
- },
370
- done: (_, { stats }) => {
371
- if (stats.hasErrors()) {
372
- ctx.nuxt.callHook(`${builder}:error`);
373
- } else {
374
- logger.success(`Finished building ${stats.compilation.name ?? "Nuxt app"}`);
375
- }
376
- },
377
- allDone: () => {
378
- ctx.nuxt.callHook(`${builder}:done`);
379
- },
380
- progress: ({ webpackbar }) => {
381
- ctx.nuxt.callHook(`${builder}:progress`, webpackbar.statesArray);
382
- }
383
- }
384
- }
385
- }));
386
- }
387
- if (ctx.isServer && !ctx.isDev) {
388
- ctx.config.plugins.push(new RollupCompatDynamicImportPlugin());
389
- }
650
+ ctx.config.plugins ||= [];
651
+ if (ctx.options.dev) {
652
+ if (ctx.nuxt.options.builder !== "@nuxt/rspack-builder") ctx.config.plugins.push(new TimeFixPlugin());
653
+ }
654
+ ctx.config.plugins.push(...ctx.userConfig.plugins || []);
655
+ if (ctx.nuxt.options.builder !== "@nuxt/rspack-builder") ctx.config.plugins.push(new WarningIgnorePlugin(getWarningIgnoreFilter(ctx)));
656
+ ctx.config.plugins.push(new webpack.DefinePlugin(getEnv(ctx)));
657
+ if (ctx.isServer || ctx.isDev && ctx.userConfig.friendlyErrors) ctx.config.plugins.push(new FriendlyErrorsWebpackPlugin({
658
+ clearConsole: false,
659
+ reporter: "consola",
660
+ logLevel: "ERROR"
661
+ }));
662
+ if (ctx.nuxt.options.webpack.profile) ctx.config.plugins.push(new WebpackBarPlugin({
663
+ name: ctx.name,
664
+ color: {
665
+ client: "green",
666
+ server: "orange",
667
+ modern: "blue"
668
+ }[ctx.name],
669
+ reporters: ["stats"],
670
+ stats: !ctx.isDev,
671
+ reporter: { reporter: {
672
+ change: (_, { shortPath }) => {
673
+ if (!ctx.isServer) ctx.nuxt.callHook(`${builder}:change`, shortPath);
674
+ },
675
+ done: (_, { stats }) => {
676
+ if (stats.hasErrors()) ctx.nuxt.callHook(`${builder}:error`);
677
+ else logger.success(`Finished building ${stats.compilation.name ?? "Nuxt app"}`);
678
+ },
679
+ allDone: () => {
680
+ ctx.nuxt.callHook(`${builder}:done`);
681
+ },
682
+ progress: ({ webpackbar }) => {
683
+ ctx.nuxt.callHook(`${builder}:progress`, webpackbar.statesArray);
684
+ }
685
+ } }
686
+ }));
687
+ if (ctx.isServer && !ctx.isDev) ctx.config.plugins.push(new RollupCompatDynamicImportPlugin());
390
688
  }
391
689
  function baseAlias(ctx) {
392
- ctx.alias = {
393
- "#app": ctx.options.appDir,
394
- ...ctx.options.alias,
395
- ...ctx.alias
396
- };
397
- if (ctx.isClient) {
398
- ctx.alias["#internal/nitro"] = resolve(ctx.nuxt.options.buildDir, "nitro.client.mjs");
399
- }
690
+ ctx.alias = {
691
+ "#app": ctx.options.appDir,
692
+ ...ctx.options.alias,
693
+ ...ctx.alias
694
+ };
695
+ if (ctx.isClient) ctx.alias["#internal/nitro"] = resolve(ctx.nuxt.options.buildDir, "nitro.client.mjs");
400
696
  }
401
697
  function baseResolve(ctx) {
402
- const webpackModulesDir = ["node_modules"].concat(ctx.options.modulesDir);
403
- ctx.config.resolve = {
404
- extensions: [".wasm", ".mjs", ".js", ".ts", ".json", ".vue", ".jsx", ".tsx"],
405
- alias: ctx.alias,
406
- modules: webpackModulesDir,
407
- fullySpecified: false,
408
- ...ctx.config.resolve
409
- };
410
- ctx.config.resolveLoader = {
411
- modules: webpackModulesDir,
412
- ...ctx.config.resolveLoader
413
- };
698
+ const webpackModulesDir = ["node_modules"].concat(ctx.options.modulesDir);
699
+ ctx.config.resolve = {
700
+ extensions: [
701
+ ".wasm",
702
+ ".mjs",
703
+ ".js",
704
+ ".ts",
705
+ ".json",
706
+ ".vue",
707
+ ".jsx",
708
+ ".tsx"
709
+ ],
710
+ alias: ctx.alias,
711
+ modules: webpackModulesDir,
712
+ fullySpecified: false,
713
+ ...ctx.config.resolve
714
+ };
715
+ ctx.config.resolveLoader = {
716
+ modules: webpackModulesDir,
717
+ ...ctx.config.resolveLoader
718
+ };
414
719
  }
415
720
  function baseTranspile(ctx) {
416
- const transpile = [
417
- /\.vue\.js/i,
418
- // include SFCs in node_modules
419
- /consola\/src/,
420
- /vue-demi/,
421
- /(^|\/)nuxt\/(src\/|dist\/)?(app|[^/]+\/runtime)($|\/)/
422
- ];
423
- for (let pattern of ctx.options.build.transpile) {
424
- if (typeof pattern === "function") {
425
- const result = pattern(ctx);
426
- if (result) {
427
- pattern = result;
428
- }
429
- }
430
- if (typeof pattern === "string") {
431
- transpile.push(new RegExp(escapeRegExp(normalize(pattern))));
432
- } else if (pattern instanceof RegExp) {
433
- transpile.push(pattern);
434
- }
435
- }
436
- ctx.transpile = [...transpile, ...ctx.transpile];
721
+ const transpile = [
722
+ /\.vue\.js/i,
723
+ /consola\/src/,
724
+ /vue-demi/,
725
+ /(^|\/)nuxt\/(src\/|dist\/)?(app|[^/]+\/runtime)($|\/)/
726
+ ];
727
+ for (let pattern of ctx.options.build.transpile) {
728
+ if (typeof pattern === "function") {
729
+ const result = pattern(ctx);
730
+ if (result) pattern = result;
731
+ }
732
+ if (typeof pattern === "string") transpile.push(new RegExp(escapeRegExp(normalize(pattern))));
733
+ else if (pattern instanceof RegExp) transpile.push(pattern);
734
+ }
735
+ ctx.transpile = [...transpile, ...ctx.transpile];
437
736
  }
438
737
  function getCache(ctx) {
439
- if (!ctx.options.dev) {
440
- return false;
441
- }
738
+ if (!ctx.options.dev) return false;
442
739
  }
443
740
  function getOutput(ctx) {
444
- return {
445
- path: resolve(ctx.options.buildDir, "dist", ctx.isServer ? "server" : joinURL("client", ctx.options.app.buildAssetsDir)),
446
- filename: fileName(ctx, "app"),
447
- chunkFilename: fileName(ctx, "chunk"),
448
- publicPath: joinURL(ctx.options.app.baseURL, ctx.options.app.buildAssetsDir)
449
- };
741
+ return {
742
+ path: resolve(ctx.options.buildDir, "dist", ctx.isServer ? "server" : joinURL("client", ctx.options.app.buildAssetsDir)),
743
+ filename: fileName(ctx, "app"),
744
+ chunkFilename: fileName(ctx, "chunk"),
745
+ publicPath: joinURL(ctx.options.app.baseURL, ctx.options.app.buildAssetsDir)
746
+ };
450
747
  }
451
748
  function getWarningIgnoreFilter(ctx) {
452
- const filters = [
453
- // Hide warnings about plugins without a default export (#1179)
454
- (warn) => warn.name === "ModuleDependencyWarning" && warn.message.includes("export 'default'") && warn.message.includes("nuxt_plugin_"),
455
- ...ctx.userConfig.warningIgnoreFilters || []
456
- ];
457
- return (warn) => !filters.some((ignoreFilter) => ignoreFilter(warn));
749
+ const filters = [(warn) => warn.name === "ModuleDependencyWarning" && warn.message.includes("export 'default'") && warn.message.includes("nuxt_plugin_"), ...ctx.userConfig.warningIgnoreFilters || []];
750
+ return (warn) => !filters.some((ignoreFilter) => ignoreFilter(warn));
458
751
  }
459
752
  function getEnv(ctx) {
460
- const _env = {
461
- "process.env.NODE_ENV": JSON.stringify(ctx.config.mode),
462
- "__NUXT_VERSION__": JSON.stringify(ctx.nuxt._version),
463
- "__NUXT_ASYNC_CONTEXT__": ctx.options.experimental.asyncContext,
464
- "process.env.VUE_ENV": JSON.stringify(ctx.name),
465
- "process.dev": ctx.options.dev,
466
- "process.test": isTest,
467
- "process.browser": ctx.isClient,
468
- "process.client": ctx.isClient,
469
- "process.server": ctx.isServer,
470
- "import.meta.dev": ctx.options.dev,
471
- "import.meta.test": isTest,
472
- "import.meta.browser": ctx.isClient,
473
- "import.meta.client": ctx.isClient,
474
- "import.meta.server": ctx.isServer
475
- };
476
- if (ctx.isClient) {
477
- _env["process.prerender"] = false;
478
- _env["process.nitro"] = false;
479
- _env["import.meta.prerender"] = false;
480
- _env["import.meta.nitro"] = false;
481
- } else {
482
- _env["process.prerender"] = "(()=>process.prerender)()";
483
- _env["process.nitro"] = "(()=>process.nitro)()";
484
- _env["import.meta.prerender"] = "(()=>import.meta.prerender)()";
485
- _env["import.meta.nitro"] = "(()=>import.meta.nitro)()";
486
- }
487
- if (ctx.userConfig.aggressiveCodeRemoval) {
488
- _env["typeof process"] = JSON.stringify(ctx.isServer ? "object" : "undefined");
489
- _env["typeof window"] = _env["typeof document"] = JSON.stringify(!ctx.isServer ? "object" : "undefined");
490
- }
491
- return _env;
753
+ const _env = {
754
+ "process.env.NODE_ENV": JSON.stringify(ctx.config.mode),
755
+ "__NUXT_VERSION__": JSON.stringify(ctx.nuxt._version),
756
+ "__NUXT_ASYNC_CONTEXT__": ctx.options.experimental.asyncContext,
757
+ "process.env.VUE_ENV": JSON.stringify(ctx.name),
758
+ "process.dev": ctx.options.dev,
759
+ "process.test": isTest,
760
+ "process.browser": ctx.isClient,
761
+ "process.client": ctx.isClient,
762
+ "process.server": ctx.isServer,
763
+ "import.meta.dev": ctx.options.dev,
764
+ "import.meta.test": isTest,
765
+ "import.meta.browser": ctx.isClient,
766
+ "import.meta.client": ctx.isClient,
767
+ "import.meta.server": ctx.isServer
768
+ };
769
+ if (ctx.isClient) {
770
+ _env["process.prerender"] = false;
771
+ _env["process.nitro"] = false;
772
+ _env["import.meta.prerender"] = false;
773
+ _env["import.meta.nitro"] = false;
774
+ } else {
775
+ _env["process.prerender"] = "(()=>process.prerender)()";
776
+ _env["process.nitro"] = "(()=>process.nitro)()";
777
+ _env["import.meta.prerender"] = "(()=>import.meta.prerender)()";
778
+ _env["import.meta.nitro"] = "(()=>import.meta.nitro)()";
779
+ }
780
+ if (ctx.userConfig.aggressiveCodeRemoval) {
781
+ _env["typeof process"] = JSON.stringify(ctx.isServer ? "object" : "undefined");
782
+ _env["typeof window"] = _env["typeof document"] = JSON.stringify(!ctx.isServer ? "object" : "undefined");
783
+ }
784
+ return _env;
492
785
  }
493
786
  const statsMap = {
494
- silent: "none",
495
- info: "normal",
496
- verbose: "verbose"
787
+ silent: "none",
788
+ info: "normal",
789
+ verbose: "verbose"
497
790
  };
498
791
 
792
+ //#endregion
793
+ //#region src/presets/esbuild.ts
499
794
  function esbuild(ctx) {
500
- const target = ctx.isServer ? "es2020" : "chrome85";
501
- ctx.config.optimization.minimizer.push(new EsbuildPlugin());
502
- ctx.config.module.rules.push(
503
- {
504
- test: /\.m?[jt]s$/i,
505
- loader: "esbuild-loader",
506
- exclude: (file) => {
507
- const lastSegment = file.split("node_modules", 2)[1];
508
- if (!lastSegment) {
509
- return false;
510
- }
511
- return !ctx.transpile.some((module) => module.test(lastSegment));
512
- },
513
- resolve: {
514
- fullySpecified: false
515
- },
516
- options: {
517
- target,
518
- ...ctx.nuxt.options.webpack.loaders.esbuild,
519
- loader: "ts"
520
- }
521
- },
522
- {
523
- test: /\.m?[jt]sx$/,
524
- loader: "esbuild-loader",
525
- options: {
526
- target,
527
- ...ctx.nuxt.options.webpack.loaders.esbuild,
528
- loader: "tsx"
529
- }
530
- }
531
- );
795
+ const target = ctx.isServer ? "es2020" : "chrome85";
796
+ ctx.config.optimization.minimizer.push(new EsbuildPlugin());
797
+ ctx.config.module.rules.push({
798
+ test: /\.m?[jt]s$/i,
799
+ loader: "esbuild-loader",
800
+ exclude: (file) => {
801
+ const lastSegment = file.split("node_modules", 2)[1];
802
+ if (!lastSegment) return false;
803
+ return !ctx.transpile.some((module) => module.test(lastSegment));
804
+ },
805
+ resolve: { fullySpecified: false },
806
+ options: {
807
+ target,
808
+ ...ctx.nuxt.options.webpack.loaders.esbuild,
809
+ loader: "ts"
810
+ }
811
+ }, {
812
+ test: /\.m?[jt]sx$/,
813
+ loader: "esbuild-loader",
814
+ options: {
815
+ target,
816
+ ...ctx.nuxt.options.webpack.loaders.esbuild,
817
+ loader: "tsx"
818
+ }
819
+ });
532
820
  }
533
821
 
822
+ //#endregion
823
+ //#region src/presets/pug.ts
534
824
  function pug(ctx) {
535
- ctx.config.module.rules.push({
536
- test: /\.pug$/i,
537
- oneOf: [
538
- {
539
- resourceQuery: /^\?vue/i,
540
- use: [{
541
- loader: "pug-plain-loader",
542
- options: ctx.userConfig.loaders.pugPlain
543
- }]
544
- },
545
- {
546
- use: [
547
- "raw-loader",
548
- {
549
- loader: "pug-plain-loader",
550
- options: ctx.userConfig.loaders.pugPlain
551
- }
552
- ]
553
- }
554
- ]
555
- });
825
+ ctx.config.module.rules.push({
826
+ test: /\.pug$/i,
827
+ oneOf: [{
828
+ resourceQuery: /^\?vue/i,
829
+ use: [{
830
+ loader: "pug-plain-loader",
831
+ options: ctx.userConfig.loaders.pugPlain
832
+ }]
833
+ }, { use: ["raw-loader", {
834
+ loader: "pug-plain-loader",
835
+ options: ctx.userConfig.loaders.pugPlain
836
+ }] }]
837
+ });
556
838
  }
557
839
 
840
+ //#endregion
841
+ //#region src/utils/postcss.ts
558
842
  const isPureObject = (obj) => obj !== null && !Array.isArray(obj) && typeof obj === "object";
559
843
  function sortPlugins({ plugins, order }) {
560
- const names = Object.keys(plugins);
561
- return typeof order === "function" ? order(names) : order || names;
844
+ const names = Object.keys(plugins);
845
+ return typeof order === "function" ? order(names) : order || names;
562
846
  }
563
- async function getPostcssConfig(nuxt) {
564
- if (!nuxt.options.webpack.postcss || !nuxt.options.postcss) {
565
- return false;
566
- }
567
- const postcssOptions = defu({}, nuxt.options.postcss, {
568
- plugins: {
569
- /**
570
- * https://github.com/postcss/postcss-import
571
- */
572
- "postcss-import": {
573
- resolve: createResolver({
574
- alias: { ...nuxt.options.alias },
575
- modules: nuxt.options.modulesDir
576
- })
577
- },
578
- /**
579
- * https://github.com/postcss/postcss-url
580
- */
581
- "postcss-url": {}
582
- },
583
- sourceMap: nuxt.options.webpack.cssSourceMap
584
- });
585
- const jiti = createJiti(nuxt.options.rootDir, { alias: nuxt.options.alias });
586
- if (!Array.isArray(postcssOptions.plugins) && isPureObject(postcssOptions.plugins)) {
587
- const plugins = [];
588
- for (const pluginName of sortPlugins(postcssOptions)) {
589
- const pluginOptions = postcssOptions.plugins[pluginName];
590
- if (!pluginOptions) {
591
- continue;
592
- }
593
- let pluginFn;
594
- for (const parentURL of nuxt.options.modulesDir) {
595
- pluginFn = await jiti.import(pluginName, { parentURL: parentURL.replace(/\/node_modules\/?$/, ""), try: true, default: true });
596
- if (typeof pluginFn === "function") {
597
- plugins.push(pluginFn(pluginOptions));
598
- break;
599
- }
600
- }
601
- if (typeof pluginFn !== "function") {
602
- console.warn(`[nuxt] could not import postcss plugin \`${pluginName}\`. Please report this as a bug.`);
603
- }
604
- }
605
- postcssOptions.plugins = plugins;
606
- }
607
- return {
608
- sourceMap: nuxt.options.webpack.cssSourceMap,
609
- ...nuxt.options.webpack.postcss,
610
- postcssOptions
611
- };
847
+ async function getPostcssConfig(nuxt$1) {
848
+ if (!nuxt$1.options.webpack.postcss || !nuxt$1.options.postcss) return false;
849
+ const postcssOptions = defu({}, nuxt$1.options.postcss, {
850
+ plugins: {
851
+ "postcss-import": { resolve: createResolver({
852
+ alias: { ...nuxt$1.options.alias },
853
+ modules: nuxt$1.options.modulesDir
854
+ }) },
855
+ "postcss-url": {}
856
+ },
857
+ sourceMap: nuxt$1.options.webpack.cssSourceMap
858
+ });
859
+ const jiti = createJiti(nuxt$1.options.rootDir, { alias: nuxt$1.options.alias });
860
+ if (!Array.isArray(postcssOptions.plugins) && isPureObject(postcssOptions.plugins)) {
861
+ const plugins = [];
862
+ for (const pluginName$1 of sortPlugins(postcssOptions)) {
863
+ const pluginOptions = postcssOptions.plugins[pluginName$1];
864
+ if (!pluginOptions) continue;
865
+ let pluginFn;
866
+ for (const parentURL of nuxt$1.options.modulesDir) {
867
+ pluginFn = await jiti.import(pluginName$1, {
868
+ parentURL: parentURL.replace(/\/node_modules\/?$/, ""),
869
+ try: true,
870
+ default: true
871
+ });
872
+ if (typeof pluginFn === "function") {
873
+ plugins.push(pluginFn(pluginOptions));
874
+ break;
875
+ }
876
+ }
877
+ if (typeof pluginFn !== "function") console.warn(`[nuxt] could not import postcss plugin \`${pluginName$1}\`. Please report this as a bug.`);
878
+ }
879
+ postcssOptions.plugins = plugins;
880
+ }
881
+ return {
882
+ sourceMap: nuxt$1.options.webpack.cssSourceMap,
883
+ ...nuxt$1.options.webpack.postcss,
884
+ postcssOptions
885
+ };
612
886
  }
613
887
 
888
+ //#endregion
889
+ //#region src/presets/style.ts
614
890
  async function style(ctx) {
615
- await applyPresets(ctx, [
616
- loaders,
617
- extractCSS,
618
- minimizer
619
- ]);
891
+ await applyPresets(ctx, [
892
+ loaders,
893
+ extractCSS,
894
+ minimizer
895
+ ]);
620
896
  }
621
897
  function minimizer(ctx) {
622
- if (ctx.userConfig.optimizeCSS && Array.isArray(ctx.config.optimization.minimizer)) {
623
- ctx.config.optimization.minimizer.push(new CssMinimizerPlugin({
624
- ...ctx.userConfig.optimizeCSS
625
- }));
626
- }
898
+ if (ctx.userConfig.optimizeCSS && Array.isArray(ctx.config.optimization.minimizer)) ctx.config.optimization.minimizer.push(new CssMinimizerPlugin({ ...ctx.userConfig.optimizeCSS }));
627
899
  }
628
900
  function extractCSS(ctx) {
629
- const config = ctx.userConfig.extractCSS;
630
- if (!config) {
631
- return;
632
- }
633
- const filename = fileName(ctx, "css");
634
- ctx.config.plugins.push(new MiniCssExtractPlugin({
635
- filename,
636
- chunkFilename: filename,
637
- ...config === true ? {} : config
638
- }));
901
+ const config = ctx.userConfig.extractCSS;
902
+ if (!config) return;
903
+ const filename = fileName(ctx, "css");
904
+ ctx.config.plugins.push(new MiniCssExtractPlugin({
905
+ filename,
906
+ chunkFilename: filename,
907
+ ...config === true ? {} : config
908
+ }));
639
909
  }
640
910
  async function loaders(ctx) {
641
- ctx.config.module.rules.push(await createdStyleRule("css", /\.css$/i, null, ctx));
642
- ctx.config.module.rules.push(await createdStyleRule("postcss", /\.p(ost)?css$/i, null, ctx));
643
- const lessLoader = { loader: "less-loader", options: ctx.userConfig.loaders.less };
644
- ctx.config.module.rules.push(await createdStyleRule("less", /\.less$/i, lessLoader, ctx));
645
- const sassLoader = { loader: "sass-loader", options: ctx.userConfig.loaders.sass };
646
- ctx.config.module.rules.push(await createdStyleRule("sass", /\.sass$/i, sassLoader, ctx));
647
- const scssLoader = { loader: "sass-loader", options: ctx.userConfig.loaders.scss };
648
- ctx.config.module.rules.push(await createdStyleRule("scss", /\.scss$/i, scssLoader, ctx));
649
- const stylusLoader = { loader: "stylus-loader", options: ctx.userConfig.loaders.stylus };
650
- ctx.config.module.rules.push(await createdStyleRule("stylus", /\.styl(us)?$/i, stylusLoader, ctx));
911
+ ctx.config.module.rules.push(await createdStyleRule("css", /\.css$/i, null, ctx));
912
+ ctx.config.module.rules.push(await createdStyleRule("postcss", /\.p(ost)?css$/i, null, ctx));
913
+ const lessLoader = {
914
+ loader: "less-loader",
915
+ options: ctx.userConfig.loaders.less
916
+ };
917
+ ctx.config.module.rules.push(await createdStyleRule("less", /\.less$/i, lessLoader, ctx));
918
+ const sassLoader = {
919
+ loader: "sass-loader",
920
+ options: ctx.userConfig.loaders.sass
921
+ };
922
+ ctx.config.module.rules.push(await createdStyleRule("sass", /\.sass$/i, sassLoader, ctx));
923
+ const scssLoader = {
924
+ loader: "sass-loader",
925
+ options: ctx.userConfig.loaders.scss
926
+ };
927
+ ctx.config.module.rules.push(await createdStyleRule("scss", /\.scss$/i, scssLoader, ctx));
928
+ const stylusLoader = {
929
+ loader: "stylus-loader",
930
+ options: ctx.userConfig.loaders.stylus
931
+ };
932
+ ctx.config.module.rules.push(await createdStyleRule("stylus", /\.styl(us)?$/i, stylusLoader, ctx));
651
933
  }
652
934
  async function createdStyleRule(lang, test, processorLoader, ctx) {
653
- const styleLoaders = [
654
- await createPostcssLoadersRule(ctx),
655
- processorLoader
656
- ].filter(Boolean);
657
- ctx.userConfig.loaders.css.importLoaders = ctx.userConfig.loaders.cssModules.importLoaders = styleLoaders.length;
658
- const cssLoaders = createCssLoadersRule(ctx, ctx.userConfig.loaders.css);
659
- const cssModuleLoaders = createCssLoadersRule(ctx, ctx.userConfig.loaders.cssModules);
660
- return {
661
- test,
662
- oneOf: [
663
- // This matches <style module>
664
- {
665
- resourceQuery: /module/,
666
- use: cssModuleLoaders.concat(styleLoaders)
667
- },
668
- // This matches plain <style> or <style scoped>
669
- {
670
- use: cssLoaders.concat(styleLoaders)
671
- }
672
- ]
673
- };
935
+ const styleLoaders = [await createPostcssLoadersRule(ctx), processorLoader].filter(Boolean);
936
+ ctx.userConfig.loaders.css.importLoaders = ctx.userConfig.loaders.cssModules.importLoaders = styleLoaders.length;
937
+ const cssLoaders = createCssLoadersRule(ctx, ctx.userConfig.loaders.css);
938
+ return {
939
+ test,
940
+ oneOf: [{
941
+ resourceQuery: /module/,
942
+ use: createCssLoadersRule(ctx, ctx.userConfig.loaders.cssModules).concat(styleLoaders)
943
+ }, { use: cssLoaders.concat(styleLoaders) }]
944
+ };
674
945
  }
675
946
  function createCssLoadersRule(ctx, cssLoaderOptions) {
676
- const cssLoader = { loader: "css-loader", options: cssLoaderOptions };
677
- if (ctx.userConfig.extractCSS) {
678
- if (ctx.isServer) {
679
- if (cssLoader.options.modules) {
680
- cssLoader.options.modules.exportOnlyLocals ??= true;
681
- }
682
- return [cssLoader];
683
- }
684
- return [
685
- {
686
- loader: MiniCssExtractPlugin.loader
687
- },
688
- cssLoader
689
- ];
690
- }
691
- return [
692
- // https://github.com/vuejs/vue-style-loader/issues/56
693
- // {
694
- // loader: 'vue-style-loader',
695
- // options: options.webpack.loaders.vueStyle
696
- // },
697
- cssLoader
698
- ];
947
+ const cssLoader = {
948
+ loader: "css-loader",
949
+ options: cssLoaderOptions
950
+ };
951
+ if (ctx.userConfig.extractCSS) {
952
+ if (ctx.isServer) {
953
+ if (cssLoader.options.modules) cssLoader.options.modules.exportOnlyLocals ??= true;
954
+ return [cssLoader];
955
+ }
956
+ return [{ loader: MiniCssExtractPlugin.loader }, cssLoader];
957
+ }
958
+ return [cssLoader];
699
959
  }
700
960
  async function createPostcssLoadersRule(ctx) {
701
- if (!ctx.options.postcss) {
702
- return;
703
- }
704
- const config = await getPostcssConfig(ctx.nuxt);
705
- if (!config) {
706
- return;
707
- }
708
- return {
709
- loader: "postcss-loader",
710
- options: config
711
- };
961
+ if (!ctx.options.postcss) return;
962
+ const config = await getPostcssConfig(ctx.nuxt);
963
+ if (!config) return;
964
+ return {
965
+ loader: "postcss-loader",
966
+ options: config
967
+ };
712
968
  }
713
969
 
714
- class VueSSRClientPlugin {
715
- serverDist;
716
- nuxt;
717
- constructor(options) {
718
- this.serverDist = resolve(options.nuxt.options.buildDir, "dist/server");
719
- this.nuxt = options.nuxt;
720
- }
721
- apply(compiler) {
722
- compiler.hooks.afterEmit.tap("VueSSRClientPlugin", async (compilation) => {
723
- const stats = compilation.getStats().toJson();
724
- const initialFiles = /* @__PURE__ */ new Set();
725
- for (const { assets } of Object.values(stats.entrypoints)) {
726
- if (!assets) {
727
- continue;
728
- }
729
- for (const asset of assets) {
730
- const file = asset.name;
731
- if ((isJS(file) || isCSS(file)) && !isHotUpdate(file)) {
732
- initialFiles.add(file);
733
- }
734
- }
735
- }
736
- const allFiles = /* @__PURE__ */ new Set();
737
- const asyncFiles = /* @__PURE__ */ new Set();
738
- const assetsMapping = {};
739
- for (const { name: file, chunkNames = [] } of stats.assets) {
740
- if (isHotUpdate(file)) {
741
- continue;
742
- }
743
- allFiles.add(file);
744
- const isFileJS = isJS(file);
745
- if (!initialFiles.has(file) && (isFileJS || isCSS(file))) {
746
- asyncFiles.add(file);
747
- }
748
- if (isFileJS) {
749
- const componentHash = hash(chunkNames.join("|"));
750
- const map = assetsMapping[componentHash] ||= [];
751
- map.push(file);
752
- }
753
- }
754
- const webpackManifest = {
755
- publicPath: stats.publicPath,
756
- all: [...allFiles],
757
- initial: [...initialFiles],
758
- async: [...asyncFiles],
759
- modules: {
760
- /* [identifier: string]: Array<index: number> */
761
- },
762
- assetsMapping
763
- };
764
- const { entrypoints = {}, namedChunkGroups = {} } = stats;
765
- const fileToIndex = (file) => webpackManifest.all.indexOf(String(file));
766
- for (const m of stats.modules) {
767
- if (m.chunks?.length !== 1) {
768
- continue;
769
- }
770
- const [cid] = m.chunks;
771
- const chunk = stats.chunks.find((c) => c.id === cid);
772
- if (!chunk || !chunk.files || !cid) {
773
- continue;
774
- }
775
- const id = m.identifier.replace(/\s\w+$/, "");
776
- const filesSet = /* @__PURE__ */ new Set();
777
- for (const file of chunk.files) {
778
- const index = fileToIndex(file);
779
- if (index !== -1) {
780
- filesSet.add(index);
781
- }
782
- }
783
- for (const chunkName of chunk.names) {
784
- if (!entrypoints[chunkName]) {
785
- const chunkGroup = namedChunkGroups[chunkName];
786
- if (chunkGroup) {
787
- for (const asset of chunkGroup.assets) {
788
- filesSet.add(fileToIndex(asset.name));
789
- }
790
- }
791
- }
792
- }
793
- const files = Array.from(filesSet);
794
- webpackManifest.modules[hash(id)] = files;
795
- if (Array.isArray(m.modules)) {
796
- for (const concatenatedModule of m.modules) {
797
- const id2 = hash(concatenatedModule.identifier.replace(/\s\w+$/, ""));
798
- webpackManifest.modules[id2] ||= files;
799
- }
800
- }
801
- if (stats.modules) {
802
- for (const m2 of stats.modules) {
803
- if (m2.assets?.length && m2.chunks?.includes(cid)) {
804
- files.push(...m2.assets.map(fileToIndex));
805
- }
806
- }
807
- }
808
- }
809
- const manifest = normalizeWebpackManifest(webpackManifest);
810
- await this.nuxt.callHook("build:manifest", manifest);
811
- await mkdir(this.serverDist, { recursive: true });
812
- const precomputed = precomputeDependencies(manifest);
813
- await writeFile(join(this.serverDist, `client.manifest.json`), JSON.stringify(manifest, null, 2));
814
- await writeFile(join(this.serverDist, "client.manifest.mjs"), "export default " + serialize(manifest), "utf8");
815
- await writeFile(join(this.serverDist, "client.precomputed.mjs"), "export default " + serialize(precomputed), "utf8");
816
- });
817
- }
818
- }
970
+ //#endregion
971
+ //#region src/plugins/vue/client.ts
972
+ /**
973
+ * This file is based on Vue.js (MIT) webpack plugins
974
+ * https://github.com/vuejs/vue/blob/dev/src/server/webpack-plugin/client.js
975
+ */
976
+ var VueSSRClientPlugin = class {
977
+ serverDist;
978
+ nuxt;
979
+ constructor(options) {
980
+ this.serverDist = resolve(options.nuxt.options.buildDir, "dist/server");
981
+ this.nuxt = options.nuxt;
982
+ }
983
+ getRelativeModuleId(identifier, context) {
984
+ const id = identifier.replace(/\s\w+$/, "");
985
+ const resourceMatch = id.match(/([^!]*\.vue)(?:\?|$)/);
986
+ return resourceMatch && resourceMatch[1] ? normalize(relative(context, resourceMatch[1])).replace(/^\.\//, "").replace(/\\/g, "/") : id;
987
+ }
988
+ apply(compiler) {
989
+ compiler.hooks.afterEmit.tap("VueSSRClientPlugin", async (compilation) => {
990
+ const stats = compilation.getStats().toJson();
991
+ const context = this.nuxt.options.srcDir;
992
+ const initialFiles = /* @__PURE__ */ new Set();
993
+ for (const { assets: assets$1 } of Object.values(stats.entrypoints)) {
994
+ if (!assets$1) continue;
995
+ for (const asset of assets$1) {
996
+ const file = asset.name;
997
+ if ((isJS(file) || isCSS(file)) && !isHotUpdate(file)) initialFiles.add(file);
998
+ }
999
+ }
1000
+ const allFiles = /* @__PURE__ */ new Set();
1001
+ const asyncFiles = /* @__PURE__ */ new Set();
1002
+ const assetsMapping = {};
1003
+ for (const { name: file, chunkNames = [] } of stats.assets) {
1004
+ if (isHotUpdate(file)) continue;
1005
+ allFiles.add(file);
1006
+ const isFileJS = isJS(file);
1007
+ if (!initialFiles.has(file) && (isFileJS || isCSS(file))) asyncFiles.add(file);
1008
+ if (isFileJS) {
1009
+ const componentHash = hash(chunkNames.join("|"));
1010
+ (assetsMapping[componentHash] ||= []).push(file);
1011
+ }
1012
+ }
1013
+ const webpackManifest = {
1014
+ publicPath: stats.publicPath,
1015
+ all: [...allFiles],
1016
+ initial: [...initialFiles],
1017
+ async: [...asyncFiles],
1018
+ modules: {},
1019
+ assetsMapping
1020
+ };
1021
+ const { entrypoints = {}, namedChunkGroups = {} } = stats;
1022
+ const fileToIndex = (file) => webpackManifest.all.indexOf(String(file));
1023
+ for (const m of stats.modules) {
1024
+ if (m.chunks?.length !== 1) continue;
1025
+ const [cid] = m.chunks;
1026
+ const chunk = stats.chunks.find((c) => c.id === cid);
1027
+ if (!chunk || !chunk.files || !cid) continue;
1028
+ const relativeId = this.getRelativeModuleId(m.identifier, context);
1029
+ const filesSet = /* @__PURE__ */ new Set();
1030
+ for (const file of chunk.files) {
1031
+ const index = fileToIndex(file);
1032
+ if (index !== -1) filesSet.add(index);
1033
+ }
1034
+ for (const chunkName of chunk.names) if (!entrypoints[chunkName]) {
1035
+ const chunkGroup = namedChunkGroups[chunkName];
1036
+ if (chunkGroup) for (const asset of chunkGroup.assets) filesSet.add(fileToIndex(asset.name));
1037
+ }
1038
+ const files = Array.from(filesSet);
1039
+ webpackManifest.modules[relativeId] = files;
1040
+ if (Array.isArray(m.modules)) for (const concatenatedModule of m.modules) {
1041
+ const relativeId$1 = this.getRelativeModuleId(concatenatedModule.identifier, context);
1042
+ webpackManifest.modules[relativeId$1] ||= files;
1043
+ }
1044
+ if (stats.modules) {
1045
+ for (const m$1 of stats.modules) if (m$1.assets?.length && m$1.chunks?.includes(cid)) files.push(...m$1.assets.map(fileToIndex));
1046
+ }
1047
+ }
1048
+ const manifest = normalizeWebpackManifest(webpackManifest);
1049
+ await this.nuxt.callHook("build:manifest", manifest);
1050
+ await mkdir(this.serverDist, { recursive: true });
1051
+ const precomputed = precomputeDependencies(manifest);
1052
+ await writeFile(join(this.serverDist, `client.manifest.json`), JSON.stringify(manifest, null, 2));
1053
+ await writeFile(join(this.serverDist, "client.manifest.mjs"), "export default " + serialize(manifest), "utf8");
1054
+ await writeFile(join(this.serverDist, "client.precomputed.mjs"), "export default " + serialize(precomputed), "utf8");
1055
+ });
1056
+ }
1057
+ };
819
1058
 
1059
+ //#endregion
1060
+ //#region src/plugins/vue/server.ts
820
1061
  const JS_MAP_RE = /\.js\.map$/;
821
- class VueSSRServerPlugin {
822
- options;
823
- constructor(options = {}) {
824
- this.options = Object.assign({
825
- filename: null
826
- }, options);
827
- }
828
- apply(compiler) {
829
- validate(compiler);
830
- compiler.hooks.make.tap("VueSSRServerPlugin", (compilation) => {
831
- compilation.hooks.processAssets.tapAsync({
832
- name: "VueSSRServerPlugin",
833
- stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL
834
- }, (assets, cb) => {
835
- const stats = compilation.getStats().toJson();
836
- const [entryName] = Object.keys(stats.entrypoints);
837
- const entryInfo = stats.entrypoints[entryName];
838
- if (!entryInfo) {
839
- return cb();
840
- }
841
- const entryAssets = entryInfo.assets.filter((asset) => isJS(asset.name));
842
- if (entryAssets.length > 1) {
843
- throw new Error(
844
- "Server-side bundle should have one single entry file. Avoid using CommonsChunkPlugin in the server config."
845
- );
846
- }
847
- const [entry] = entryAssets;
848
- if (!entry || typeof entry.name !== "string") {
849
- throw new Error(
850
- `Entry "${entryName}" not found. Did you specify the correct entry option?`
851
- );
852
- }
853
- const bundle = {
854
- entry: entry.name,
855
- files: {},
856
- maps: {}
857
- };
858
- for (const asset of stats.assets) {
859
- if (isJS(asset.name)) {
860
- const queryPart = extractQueryPartJS(asset.name);
861
- if (queryPart !== void 0) {
862
- bundle.files[asset.name] = asset.name.replace(queryPart, "");
863
- } else {
864
- bundle.files[asset.name] = asset.name;
865
- }
866
- } else if (JS_MAP_RE.test(asset.name)) {
867
- bundle.maps[asset.name.replace(/\.map$/, "")] = asset.name;
868
- } else {
869
- delete assets[asset.name];
870
- }
871
- }
872
- const src = JSON.stringify(bundle, null, 2);
873
- assets[this.options.filename] = {
874
- source: () => src,
875
- size: () => src.length
876
- };
877
- const mjsSrc = "export default " + src;
878
- assets[this.options.filename.replace(".json", ".mjs")] = {
879
- source: () => mjsSrc,
880
- map: () => null,
881
- size: () => mjsSrc.length
882
- };
883
- cb();
884
- });
885
- });
886
- }
887
- }
1062
+ var VueSSRServerPlugin = class {
1063
+ options;
1064
+ constructor(options = {}) {
1065
+ this.options = Object.assign({ filename: null }, options);
1066
+ }
1067
+ apply(compiler) {
1068
+ validate(compiler);
1069
+ compiler.hooks.make.tap("VueSSRServerPlugin", (compilation) => {
1070
+ compilation.hooks.processAssets.tapAsync({
1071
+ name: "VueSSRServerPlugin",
1072
+ stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL
1073
+ }, (assets$1, cb) => {
1074
+ const stats = compilation.getStats().toJson();
1075
+ const [entryName] = Object.keys(stats.entrypoints);
1076
+ const entryInfo = stats.entrypoints[entryName];
1077
+ if (!entryInfo) return cb();
1078
+ const entryAssets = entryInfo.assets.filter((asset) => isJS(asset.name));
1079
+ if (entryAssets.length > 1) throw new Error("Server-side bundle should have one single entry file. Avoid using CommonsChunkPlugin in the server config.");
1080
+ const [entry] = entryAssets;
1081
+ if (!entry || typeof entry.name !== "string") throw new Error(`Entry "${entryName}" not found. Did you specify the correct entry option?`);
1082
+ const bundle$1 = {
1083
+ entry: entry.name,
1084
+ files: {},
1085
+ maps: {}
1086
+ };
1087
+ for (const asset of stats.assets) if (isJS(asset.name)) {
1088
+ const queryPart = extractQueryPartJS(asset.name);
1089
+ if (queryPart !== void 0) bundle$1.files[asset.name] = asset.name.replace(queryPart, "");
1090
+ else bundle$1.files[asset.name] = asset.name;
1091
+ } else if (JS_MAP_RE.test(asset.name)) bundle$1.maps[asset.name.replace(/\.map$/, "")] = asset.name;
1092
+ else delete assets$1[asset.name];
1093
+ const src = JSON.stringify(bundle$1, null, 2);
1094
+ assets$1[this.options.filename] = {
1095
+ source: () => src,
1096
+ size: () => src.length
1097
+ };
1098
+ const mjsSrc = "export default " + src;
1099
+ assets$1[this.options.filename.replace(".json", ".mjs")] = {
1100
+ source: () => mjsSrc,
1101
+ map: () => null,
1102
+ size: () => mjsSrc.length
1103
+ };
1104
+ cb();
1105
+ });
1106
+ });
1107
+ }
1108
+ };
888
1109
 
1110
+ //#endregion
1111
+ //#region src/presets/vue.ts
889
1112
  function vue(ctx) {
890
- ctx.config.plugins.push(new (VueLoaderPlugin.default || VueLoaderPlugin)());
891
- ctx.config.module.rules.push({
892
- test: /\.vue$/i,
893
- loader: "vue-loader",
894
- options: ctx.userConfig.loaders.vue
895
- });
896
- if (ctx.isClient) {
897
- ctx.config.plugins.push(new VueSSRClientPlugin({ nuxt: ctx.nuxt }));
898
- } else {
899
- ctx.config.plugins.push(new VueSSRServerPlugin({
900
- filename: `${ctx.name}.manifest.json`
901
- }));
902
- }
903
- ctx.config.plugins.push(new webpack.DefinePlugin({
904
- "__VUE_OPTIONS_API__": "true",
905
- "__VUE_PROD_DEVTOOLS__": "false",
906
- "__VUE_PROD_HYDRATION_MISMATCH_DETAILS__": ctx.nuxt.options.debug && ctx.nuxt.options.debug.hydration
907
- }));
1113
+ ctx.config.plugins.push(new (VueLoaderPlugin.default || VueLoaderPlugin)());
1114
+ ctx.config.module.rules.push({
1115
+ test: /\.vue$/i,
1116
+ loader: "vue-loader",
1117
+ options: {
1118
+ ...ctx.userConfig.loaders.vue,
1119
+ isServerBuild: ctx.isServer
1120
+ }
1121
+ });
1122
+ if (ctx.isClient) ctx.config.plugins.push(new VueSSRClientPlugin({ nuxt: ctx.nuxt }));
1123
+ else {
1124
+ ctx.config.plugins.push(new VueSSRServerPlugin({ filename: `${ctx.name}.manifest.json` }));
1125
+ const loaderPath = resolveModulePath("#vue-module-identifier", { from: import.meta.url });
1126
+ ctx.config.module.rules.push({
1127
+ test: /\.vue$/i,
1128
+ enforce: "post",
1129
+ use: [{
1130
+ loader: loaderPath,
1131
+ options: { srcDir: ctx.nuxt.options.srcDir }
1132
+ }]
1133
+ });
1134
+ }
1135
+ ctx.config.plugins.push(new webpack.DefinePlugin({
1136
+ "__VUE_OPTIONS_API__": "true",
1137
+ "__VUE_PROD_DEVTOOLS__": "false",
1138
+ "__VUE_PROD_HYDRATION_MISMATCH_DETAILS__": ctx.nuxt.options.debug && ctx.nuxt.options.debug.hydration
1139
+ }));
908
1140
  }
909
1141
 
1142
+ //#endregion
1143
+ //#region src/presets/nuxt.ts
910
1144
  async function nuxt(ctx) {
911
- await applyPresets(ctx, [
912
- base,
913
- assets,
914
- esbuild,
915
- pug,
916
- style,
917
- vue
918
- ]);
1145
+ await applyPresets(ctx, [
1146
+ base,
1147
+ assets,
1148
+ esbuild,
1149
+ pug,
1150
+ style,
1151
+ vue
1152
+ ]);
919
1153
  }
920
1154
 
1155
+ //#endregion
1156
+ //#region src/configs/client.ts
921
1157
  async function client(ctx) {
922
- ctx.name = "client";
923
- ctx.isClient = true;
924
- await applyPresets(ctx, [
925
- nuxt,
926
- clientPlugins,
927
- clientOptimization,
928
- clientDevtool,
929
- clientPerformance,
930
- clientHMR,
931
- clientNodeCompat
932
- ]);
1158
+ ctx.name = "client";
1159
+ ctx.isClient = true;
1160
+ await applyPresets(ctx, [
1161
+ nuxt,
1162
+ clientPlugins,
1163
+ clientOptimization,
1164
+ clientDevtool,
1165
+ clientPerformance,
1166
+ clientHMR,
1167
+ clientNodeCompat
1168
+ ]);
933
1169
  }
934
1170
  function clientDevtool(ctx) {
935
- if (!ctx.nuxt.options.sourcemap.client) {
936
- ctx.config.devtool = false;
937
- return;
938
- }
939
- const prefix = ctx.nuxt.options.sourcemap.client === "hidden" ? "hidden-" : "";
940
- if (!ctx.isDev) {
941
- ctx.config.devtool = prefix + "source-map";
942
- return;
943
- }
944
- ctx.config.devtool = prefix + "eval-cheap-module-source-map";
1171
+ if (!ctx.nuxt.options.sourcemap.client) {
1172
+ ctx.config.devtool = false;
1173
+ return;
1174
+ }
1175
+ const prefix = ctx.nuxt.options.sourcemap.client === "hidden" ? "hidden-" : "";
1176
+ if (!ctx.isDev) {
1177
+ ctx.config.devtool = prefix + "source-map";
1178
+ return;
1179
+ }
1180
+ ctx.config.devtool = prefix + "eval-cheap-module-source-map";
945
1181
  }
946
1182
  function clientPerformance(ctx) {
947
- ctx.config.performance = {
948
- maxEntrypointSize: 1e3 * 1024,
949
- hints: ctx.isDev ? false : "warning",
950
- ...ctx.config.performance
951
- };
1183
+ ctx.config.performance = {
1184
+ maxEntrypointSize: 1e3 * 1024,
1185
+ hints: ctx.isDev ? false : "warning",
1186
+ ...ctx.config.performance
1187
+ };
952
1188
  }
953
1189
  function clientNodeCompat(ctx) {
954
- if (!ctx.nuxt.options.experimental.clientNodeCompat) {
955
- return;
956
- }
957
- ctx.config.plugins.push(new webpack.DefinePlugin({ global: "globalThis" }));
958
- ctx.config.resolve ||= {};
959
- ctx.config.resolve.fallback = {
960
- ...defineEnv({
961
- nodeCompat: true,
962
- resolve: true
963
- }).env.alias,
964
- ...ctx.config.resolve.fallback
965
- };
966
- ctx.config.plugins.unshift(new webpack.NormalModuleReplacementPlugin(/node:/, (resource) => {
967
- resource.request = resource.request.replace(/^node:/, "");
968
- }));
1190
+ if (!ctx.nuxt.options.experimental.clientNodeCompat) return;
1191
+ ctx.config.plugins.push(new webpack.DefinePlugin({ global: "globalThis" }));
1192
+ ctx.config.resolve ||= {};
1193
+ ctx.config.resolve.fallback = {
1194
+ ...defineEnv({
1195
+ nodeCompat: true,
1196
+ resolve: true
1197
+ }).env.alias,
1198
+ ...ctx.config.resolve.fallback
1199
+ };
1200
+ ctx.config.plugins.unshift(new webpack.NormalModuleReplacementPlugin(/node:/, (resource) => {
1201
+ resource.request = resource.request.replace(/^node:/, "");
1202
+ }));
969
1203
  }
970
1204
  function clientHMR(ctx) {
971
- if (!ctx.isDev) {
972
- return;
973
- }
974
- const clientOptions = ctx.userConfig.hotMiddleware?.client || {};
975
- const hotMiddlewareClientOptions = {
976
- reload: true,
977
- timeout: 3e4,
978
- path: joinURL(ctx.options.app.baseURL, "__webpack_hmr", ctx.name),
979
- ...clientOptions,
980
- ansiColors: JSON.stringify(clientOptions.ansiColors || {}),
981
- overlayStyles: JSON.stringify(clientOptions.overlayStyles || {}),
982
- name: ctx.name
983
- };
984
- const hotMiddlewareClientOptionsStr = querystring.stringify(hotMiddlewareClientOptions);
985
- const app = ctx.config.entry.app;
986
- app.unshift(
987
- // https://github.com/glenjamin/webpack-hot-middleware#config
988
- `webpack-hot-middleware/client?${hotMiddlewareClientOptionsStr}`
989
- );
990
- ctx.config.plugins ||= [];
991
- ctx.config.plugins.push(new webpack.HotModuleReplacementPlugin());
1205
+ if (!ctx.isDev) return;
1206
+ const clientOptions = ctx.userConfig.hotMiddleware?.client || {};
1207
+ const hotMiddlewareClientOptions = {
1208
+ reload: true,
1209
+ timeout: 3e4,
1210
+ path: joinURL(ctx.options.app.baseURL, "__webpack_hmr", ctx.name),
1211
+ ...clientOptions,
1212
+ ansiColors: JSON.stringify(clientOptions.ansiColors || {}),
1213
+ overlayStyles: JSON.stringify(clientOptions.overlayStyles || {}),
1214
+ name: ctx.name
1215
+ };
1216
+ const hotMiddlewareClientOptionsStr = querystring.stringify(hotMiddlewareClientOptions);
1217
+ ctx.config.entry.app.unshift(`webpack-hot-middleware/client?${hotMiddlewareClientOptionsStr}`);
1218
+ ctx.config.plugins ||= [];
1219
+ ctx.config.plugins.push(new webpack.HotModuleReplacementPlugin());
992
1220
  }
993
- function clientOptimization(_ctx) {
1221
+ function clientOptimization(ctx) {
1222
+ if (!ctx.nuxt.options.features.inlineStyles) return;
1223
+ const globalCSSPaths = /* @__PURE__ */ new Set();
1224
+ for (const css of ctx.options.css) if (typeof css === "string") {
1225
+ const resolved = resolveAlias(css, ctx.options.alias);
1226
+ globalCSSPaths.add(normalize(resolved));
1227
+ }
1228
+ if (globalCSSPaths.size > 0) {
1229
+ ctx.config.optimization ||= {};
1230
+ ctx.config.optimization.splitChunks ||= {};
1231
+ ctx.config.optimization.splitChunks.cacheGroups ||= {};
1232
+ ctx.config.optimization.splitChunks.cacheGroups.nuxtGlobalCSS = {
1233
+ name: "nuxt-global-css",
1234
+ chunks: "all",
1235
+ enforce: true,
1236
+ test: (module) => {
1237
+ if (module.type !== "css/mini-extract") return false;
1238
+ const identifier = normalize(module.identifier());
1239
+ for (const globalPath of globalCSSPaths) if (identifier.includes(globalPath)) return true;
1240
+ return false;
1241
+ }
1242
+ };
1243
+ }
994
1244
  }
995
1245
  function clientPlugins(ctx) {
996
- if (!ctx.isDev && !ctx.nuxt.options.test && ctx.name === "client" && ctx.userConfig.analyze && (ctx.userConfig.analyze === true || ctx.userConfig.analyze.enabled)) {
997
- const statsDir = resolve(ctx.options.analyzeDir);
998
- ctx.config.plugins.push(new BundleAnalyzerPlugin({
999
- analyzerMode: "static",
1000
- defaultSizes: "gzip",
1001
- generateStatsFile: true,
1002
- openAnalyzer: true,
1003
- reportFilename: resolve(statsDir, `${ctx.name}.html`),
1004
- statsFilename: resolve(statsDir, `${ctx.name}.json`),
1005
- ...ctx.userConfig.analyze === true ? {} : ctx.userConfig.analyze
1006
- }));
1007
- }
1008
- if (!ctx.nuxt.options.ssr) {
1009
- if (!ctx.nuxt.options.test && (ctx.nuxt.options.typescript.typeCheck === true || ctx.nuxt.options.typescript.typeCheck === "build" && !ctx.nuxt.options.dev)) {
1010
- ctx.config.plugins.push(new TsCheckerPlugin({
1011
- logger
1012
- }));
1013
- }
1014
- }
1246
+ if (!ctx.isDev && !ctx.nuxt.options.test && ctx.name === "client" && ctx.userConfig.analyze && (ctx.userConfig.analyze === true || ctx.userConfig.analyze.enabled)) {
1247
+ const statsDir = resolve(ctx.options.analyzeDir);
1248
+ ctx.config.plugins.push(new BundleAnalyzerPlugin({
1249
+ analyzerMode: "static",
1250
+ defaultSizes: "gzip",
1251
+ generateStatsFile: true,
1252
+ openAnalyzer: true,
1253
+ reportFilename: resolve(statsDir, `${ctx.name}.html`),
1254
+ statsFilename: resolve(statsDir, `${ctx.name}.json`),
1255
+ ...ctx.userConfig.analyze === true ? {} : ctx.userConfig.analyze
1256
+ }));
1257
+ }
1258
+ if (!ctx.nuxt.options.ssr) {
1259
+ if (!ctx.nuxt.options.test && (ctx.nuxt.options.typescript.typeCheck === true || ctx.nuxt.options.typescript.typeCheck === "build" && !ctx.nuxt.options.dev)) ctx.config.plugins.push(new TsCheckerPlugin({ logger }));
1260
+ }
1015
1261
  }
1016
1262
 
1263
+ //#endregion
1264
+ //#region src/presets/node.ts
1017
1265
  function node(ctx) {
1018
- ctx.config.target = "node";
1019
- ctx.config.node = false;
1020
- ctx.config.experiments.outputModule = true;
1021
- ctx.config.output = {
1022
- ...ctx.config.output,
1023
- chunkFilename: "[name].mjs",
1024
- chunkFormat: "module",
1025
- chunkLoading: "import",
1026
- module: true,
1027
- environment: {
1028
- module: true,
1029
- arrowFunction: true,
1030
- bigIntLiteral: true,
1031
- const: true,
1032
- destructuring: true,
1033
- dynamicImport: true,
1034
- forOf: true
1035
- },
1036
- library: {
1037
- type: "module"
1038
- }
1039
- };
1040
- ctx.config.performance = {
1041
- ...ctx.config.performance,
1042
- hints: false,
1043
- maxEntrypointSize: Number.POSITIVE_INFINITY,
1044
- maxAssetSize: Number.POSITIVE_INFINITY
1045
- };
1266
+ ctx.config.target = "node";
1267
+ ctx.config.node = false;
1268
+ ctx.config.experiments.outputModule = true;
1269
+ ctx.config.output = {
1270
+ ...ctx.config.output,
1271
+ chunkFilename: "[name].mjs",
1272
+ chunkFormat: "module",
1273
+ chunkLoading: "import",
1274
+ module: true,
1275
+ environment: {
1276
+ module: true,
1277
+ arrowFunction: true,
1278
+ bigIntLiteral: true,
1279
+ const: true,
1280
+ destructuring: true,
1281
+ dynamicImport: true,
1282
+ forOf: true
1283
+ },
1284
+ library: { type: "module" }
1285
+ };
1286
+ ctx.config.performance = {
1287
+ ...ctx.config.performance,
1288
+ hints: false,
1289
+ maxEntrypointSize: Number.POSITIVE_INFINITY,
1290
+ maxAssetSize: Number.POSITIVE_INFINITY
1291
+ };
1046
1292
  }
1047
1293
 
1294
+ //#endregion
1295
+ //#region src/configs/server.ts
1048
1296
  const assetPattern = /\.(?:css|s[ca]ss|png|jpe?g|gif|svg|woff2?|eot|ttf|otf|webp|webm|mp4|ogv)(?:\?.*)?$/i;
1297
+ const VIRTUAL_RE = /^\0?virtual:(?:nuxt:)?/;
1049
1298
  async function server(ctx) {
1050
- ctx.name = "server";
1051
- ctx.isServer = true;
1052
- await applyPresets(ctx, [
1053
- nuxt,
1054
- node,
1055
- serverStandalone,
1056
- serverPreset,
1057
- serverPlugins
1058
- ]);
1299
+ ctx.name = "server";
1300
+ ctx.isServer = true;
1301
+ await applyPresets(ctx, [
1302
+ nuxt,
1303
+ node,
1304
+ serverStandalone,
1305
+ serverPreset,
1306
+ serverPlugins
1307
+ ]);
1059
1308
  }
1060
1309
  function serverPreset(ctx) {
1061
- ctx.config.output.filename = "server.mjs";
1062
- if (ctx.nuxt.options.sourcemap.server) {
1063
- const prefix = ctx.nuxt.options.sourcemap.server === "hidden" ? "hidden-" : "";
1064
- ctx.config.devtool = prefix + ctx.isDev ? "cheap-module-source-map" : "source-map";
1065
- } else {
1066
- ctx.config.devtool = false;
1067
- }
1068
- ctx.config.optimization = {
1069
- splitChunks: false,
1070
- minimize: false
1071
- };
1310
+ ctx.config.output.filename = "server.mjs";
1311
+ if (ctx.nuxt.options.sourcemap.server) {
1312
+ const prefix = ctx.nuxt.options.sourcemap.server === "hidden" ? "hidden-" : "";
1313
+ ctx.config.devtool = prefix + (ctx.isDev ? "cheap-module-source-map" : "source-map");
1314
+ } else ctx.config.devtool = false;
1315
+ ctx.config.optimization = {
1316
+ splitChunks: false,
1317
+ minimize: false
1318
+ };
1319
+ if (ctx.isDev) ctx.config.output.asyncChunks = false;
1072
1320
  }
1073
1321
  function serverStandalone(ctx) {
1074
- const inline = [
1075
- "src/",
1076
- "#app",
1077
- "nuxt",
1078
- "nuxt3",
1079
- "nuxt-nightly",
1080
- "!",
1081
- "-!",
1082
- "~",
1083
- "@/",
1084
- "#",
1085
- ...ctx.options.build.transpile
1086
- ];
1087
- const external = /* @__PURE__ */ new Set([
1088
- "#internal/nitro",
1089
- "#shared",
1090
- resolve(ctx.nuxt.options.rootDir, ctx.nuxt.options.dir.shared)
1091
- ]);
1092
- if (!ctx.nuxt.options.dev) {
1093
- external.add("#internal/nuxt/paths");
1094
- external.add("#app-manifest");
1095
- }
1096
- if (!Array.isArray(ctx.config.externals)) {
1097
- return;
1098
- }
1099
- ctx.config.externals.push(({ request }, cb) => {
1100
- if (!request) {
1101
- return cb(void 0, false);
1102
- }
1103
- if (external.has(request)) {
1104
- return cb(void 0, true);
1105
- }
1106
- if (request[0] === "." || isAbsolute(request) || inline.find((prefix) => typeof prefix === "string" && request.startsWith(prefix)) || assetPattern.test(request)) {
1107
- return cb(void 0, false);
1108
- }
1109
- return cb(void 0, true);
1110
- });
1322
+ const inline = [
1323
+ "src/",
1324
+ "#app",
1325
+ "nuxt",
1326
+ "nuxt3",
1327
+ "nuxt-nightly",
1328
+ "!",
1329
+ "-!",
1330
+ "~",
1331
+ "@/",
1332
+ "#",
1333
+ ...ctx.options.build.transpile
1334
+ ];
1335
+ const external = new Set([
1336
+ "#internal/nitro",
1337
+ "#shared",
1338
+ resolve(ctx.nuxt.options.rootDir, ctx.nuxt.options.dir.shared),
1339
+ ...ctx.nuxt["~runtimeDependencies"] || []
1340
+ ]);
1341
+ if (!ctx.nuxt.options.dev) {
1342
+ external.add("#internal/nuxt/paths");
1343
+ external.add("#app-manifest");
1344
+ }
1345
+ if (!Array.isArray(ctx.config.externals)) return;
1346
+ const conditions = [
1347
+ ctx.nuxt.options.dev ? "development" : "production",
1348
+ "node",
1349
+ "import",
1350
+ "require"
1351
+ ];
1352
+ ctx.config.externals.push(({ request, context }, cb) => {
1353
+ if (!request) return cb(void 0, false);
1354
+ if (external.has(request)) {
1355
+ const resolved = resolveModulePath(request, {
1356
+ from: context ? [context, ...ctx.nuxt.options.modulesDir].map((d) => directoryToURL(d)) : ctx.nuxt.options.modulesDir.map((d) => directoryToURL(d)),
1357
+ suffixes: ["", "index"],
1358
+ conditions,
1359
+ try: true
1360
+ });
1361
+ if (resolved && isAbsolute(resolved)) return cb(void 0, resolved);
1362
+ return cb(void 0, true);
1363
+ }
1364
+ if (request[0] === "." || isAbsolute(request) || inline.find((prefix) => typeof prefix === "string" && request.startsWith(prefix)) || assetPattern.test(request)) return cb(void 0, false);
1365
+ if (context && request && !request.startsWith("node:") && (isAbsolute(context) || VIRTUAL_RE.test(context))) try {
1366
+ const resolved = resolveModulePath(resolveAlias(normalize(request), ctx.nuxt.options.alias), {
1367
+ from: [parseNodeModulePath(context).dir || ctx.nuxt.options.rootDir, ...ctx.nuxt.options.modulesDir].map((d) => directoryToURL(d)),
1368
+ suffixes: ["", "index"],
1369
+ conditions,
1370
+ try: true
1371
+ });
1372
+ if (resolved && isAbsolute(resolved)) return cb(void 0, false);
1373
+ } catch {}
1374
+ return cb(void 0, true);
1375
+ });
1111
1376
  }
1112
1377
  function serverPlugins(ctx) {
1113
- ctx.config.plugins ||= [];
1114
- if (ctx.userConfig.serverURLPolyfill) {
1115
- ctx.config.plugins.push(new webpack.ProvidePlugin({
1116
- URL: [ctx.userConfig.serverURLPolyfill, "URL"],
1117
- URLSearchParams: [ctx.userConfig.serverURLPolyfill, "URLSearchParams"]
1118
- }));
1119
- }
1120
- if (!ctx.nuxt.options.test && (ctx.nuxt.options.typescript.typeCheck === true || ctx.nuxt.options.typescript.typeCheck === "build" && !ctx.nuxt.options.dev)) {
1121
- ctx.config.plugins.push(new TsCheckerPlugin({
1122
- logger
1123
- }));
1124
- }
1378
+ ctx.config.plugins ||= [];
1379
+ if (ctx.userConfig.serverURLPolyfill) ctx.config.plugins.push(new webpack.ProvidePlugin({
1380
+ URL: [ctx.userConfig.serverURLPolyfill, "URL"],
1381
+ URLSearchParams: [ctx.userConfig.serverURLPolyfill, "URLSearchParams"]
1382
+ }));
1383
+ if (!ctx.nuxt.options.test && (ctx.nuxt.options.typescript.typeCheck === true || ctx.nuxt.options.typescript.typeCheck === "build" && !ctx.nuxt.options.dev)) ctx.config.plugins.push(new TsCheckerPlugin({ logger }));
1125
1384
  }
1126
1385
 
1127
- const bundle = async (nuxt) => {
1128
- const webpackConfigs = await Promise.all([client, ...nuxt.options.ssr ? [server] : []].map(async (preset) => {
1129
- const ctx = createWebpackConfigContext(nuxt);
1130
- ctx.userConfig = defu(nuxt.options.webpack[`$${preset.name}`], ctx.userConfig);
1131
- await applyPresets(ctx, preset);
1132
- return ctx.config;
1133
- }));
1134
- if (!nuxt.options.dev) {
1135
- const nitro = useNitro();
1136
- nitro.hooks.hook("rollup:before", (_nitro, config) => {
1137
- const plugins = config.plugins;
1138
- const existingPlugin = plugins.findIndex((i) => i && "name" in i && i.name === "dynamic-require");
1139
- if (existingPlugin >= 0) {
1140
- plugins.splice(existingPlugin, 1);
1141
- }
1142
- });
1143
- }
1144
- await nuxt.callHook(`${builder}:config`, webpackConfigs);
1145
- const mfs = nuxt.options.dev ? createMFS() : null;
1146
- for (const config of webpackConfigs) {
1147
- config.plugins.push(DynamicBasePlugin.webpack({
1148
- sourcemap: !!nuxt.options.sourcemap[config.name]
1149
- }));
1150
- if (config.name === "client" && nuxt.options.experimental.emitRouteChunkError && nuxt.options.builder !== "@nuxt/rspack-builder") {
1151
- config.plugins.push(new ChunkErrorPlugin());
1152
- }
1153
- }
1154
- await nuxt.callHook(`${builder}:configResolved`, webpackConfigs);
1155
- const compilers = webpackConfigs.map((config) => {
1156
- const compiler = webpack(config);
1157
- if (nuxt.options.dev && compiler) {
1158
- compiler.outputFileSystem = mfs;
1159
- }
1160
- return compiler;
1161
- });
1162
- nuxt.hook("close", async () => {
1163
- for (const compiler of compilers) {
1164
- await new Promise((resolve) => compiler?.close(resolve));
1165
- }
1166
- });
1167
- if (nuxt.options.dev) {
1168
- await Promise.all(compilers.map((c) => c && compile(c)));
1169
- return;
1170
- }
1171
- for (const c of compilers) {
1172
- if (c) {
1173
- await compile(c);
1174
- }
1175
- }
1386
+ //#endregion
1387
+ //#region src/webpack.ts
1388
+ const bundle = async (nuxt$1) => {
1389
+ const webpackConfigs = await Promise.all([client, ...nuxt$1.options.ssr ? [server] : []].map(async (preset) => {
1390
+ const ctx = createWebpackConfigContext(nuxt$1);
1391
+ ctx.userConfig = defu(nuxt$1.options.webpack[`$${preset.name}`], ctx.userConfig);
1392
+ await applyPresets(ctx, preset);
1393
+ return ctx.config;
1394
+ }));
1395
+ /** Remove Nitro rollup plugin for handling dynamic imports from webpack chunks */
1396
+ if (!nuxt$1.options.dev) useNitro().hooks.hook("rollup:before", (_nitro, config) => {
1397
+ const plugins = config.plugins;
1398
+ const existingPlugin = plugins.findIndex((i) => i && "name" in i && i.name === "dynamic-require");
1399
+ if (existingPlugin >= 0) plugins.splice(existingPlugin, 1);
1400
+ });
1401
+ await nuxt$1.callHook(`${builder}:config`, webpackConfigs);
1402
+ const mfs = nuxt$1.options.dev ? createMFS() : null;
1403
+ const ssrStylesPlugin = nuxt$1.options.ssr && !nuxt$1.options.dev && nuxt$1.options.features.inlineStyles ? new SSRStylesPlugin(nuxt$1) : null;
1404
+ for (const config of webpackConfigs) {
1405
+ config.plugins.push(DynamicBasePlugin.webpack({ sourcemap: !!nuxt$1.options.sourcemap[config.name] }));
1406
+ if (config.name === "client" && nuxt$1.options.experimental.emitRouteChunkError && nuxt$1.options.builder !== "@nuxt/rspack-builder") config.plugins.push(new ChunkErrorPlugin());
1407
+ if (ssrStylesPlugin) config.plugins.push(ssrStylesPlugin);
1408
+ }
1409
+ await nuxt$1.callHook(`${builder}:configResolved`, webpackConfigs);
1410
+ const compilers = webpackConfigs.map((config) => {
1411
+ const compiler = webpack(config);
1412
+ if (nuxt$1.options.dev && compiler) compiler.outputFileSystem = mfs;
1413
+ return compiler;
1414
+ });
1415
+ nuxt$1.hook("close", async () => {
1416
+ for (const compiler of compilers) await new Promise((resolve$1) => compiler.close(resolve$1));
1417
+ });
1418
+ if (nuxt$1.options.dev) {
1419
+ await Promise.all(compilers.map((c) => compile(c)));
1420
+ return;
1421
+ }
1422
+ for (const c of compilers) await compile(c);
1176
1423
  };
1177
1424
  async function createDevMiddleware(compiler) {
1178
- const nuxt = useNuxt();
1179
- logger.debug("Creating webpack middleware...");
1180
- const devMiddleware = webpackDevMiddleware(compiler, {
1181
- publicPath: joinURL(nuxt.options.app.baseURL, nuxt.options.app.buildAssetsDir),
1182
- outputFileSystem: compiler.outputFileSystem,
1183
- stats: "none",
1184
- ...nuxt.options.webpack.devMiddleware
1185
- });
1186
- nuxt.hook("close", () => pify(devMiddleware.close.bind(devMiddleware))());
1187
- const { client: _client, ...hotMiddlewareOptions } = nuxt.options.webpack.hotMiddleware || {};
1188
- const hotMiddleware = webpackHotMiddleware(compiler, {
1189
- log: false,
1190
- heartbeat: 1e4,
1191
- path: joinURL(nuxt.options.app.baseURL, "__webpack_hmr", compiler.options.name),
1192
- ...hotMiddlewareOptions
1193
- });
1194
- const devHandler = wdmToH3Handler(devMiddleware, nuxt.options.devServer.cors);
1195
- const hotHandler = fromNodeMiddleware(hotMiddleware);
1196
- await nuxt.callHook("server:devHandler", defineEventHandler(async (event) => {
1197
- const body = await devHandler(event);
1198
- if (body !== void 0) {
1199
- return body;
1200
- }
1201
- await hotHandler(event);
1202
- }));
1203
- return devMiddleware;
1425
+ const nuxt$1 = useNuxt();
1426
+ logger.debug("Creating webpack middleware...");
1427
+ const devMiddleware = webpackDevMiddleware(compiler, {
1428
+ publicPath: joinURL(nuxt$1.options.app.baseURL, nuxt$1.options.app.buildAssetsDir),
1429
+ outputFileSystem: compiler.outputFileSystem,
1430
+ stats: "none",
1431
+ ...nuxt$1.options.webpack.devMiddleware
1432
+ });
1433
+ nuxt$1.hook("close", () => pify(devMiddleware.close.bind(devMiddleware))());
1434
+ const { client: _client, ...hotMiddlewareOptions } = nuxt$1.options.webpack.hotMiddleware || {};
1435
+ const hotMiddleware = webpackHotMiddleware(compiler, {
1436
+ log: false,
1437
+ heartbeat: 1e4,
1438
+ path: joinURL(nuxt$1.options.app.baseURL, "__webpack_hmr", compiler.options.name),
1439
+ ...hotMiddlewareOptions
1440
+ });
1441
+ const devHandler = wdmToH3Handler(devMiddleware);
1442
+ await nuxt$1.callHook("server:devHandler", defineEventHandler(async (event) => {
1443
+ const body = await devHandler(event);
1444
+ if (body !== void 0) return body;
1445
+ const { req, res } = "runtime" in event ? event.runtime.node : event.node;
1446
+ await new Promise((resolve$1, reject) => hotMiddleware(req, res, (err) => err ? reject(err) : resolve$1()));
1447
+ }), { cors: () => true });
1448
+ return devMiddleware;
1204
1449
  }
1205
- function wdmToH3Handler(devMiddleware, corsOptions) {
1206
- return defineEventHandler(async (event) => {
1207
- const isPreflight = handleCors(event, corsOptions);
1208
- if (isPreflight) {
1209
- return null;
1210
- }
1211
- if (getRequestHeader(event, "sec-fetch-mode") === "no-cors" && getRequestHeader(event, "sec-fetch-site") === "cross-site") {
1212
- throw createError({ statusCode: 403 });
1213
- }
1214
- setHeader(event, "Vary", "Origin");
1215
- event.context.webpack = {
1216
- ...event.context.webpack,
1217
- devMiddleware: devMiddleware.context
1218
- };
1219
- const { req, res } = event.node;
1220
- const body = await new Promise((resolve, reject) => {
1221
- res.stream = (stream) => {
1222
- resolve(stream);
1223
- };
1224
- res.send = (data) => {
1225
- resolve(data);
1226
- };
1227
- res.finish = (data) => {
1228
- resolve(data);
1229
- };
1230
- devMiddleware(req, res, (err) => {
1231
- if (err) {
1232
- reject(err);
1233
- } else {
1234
- resolve(void 0);
1235
- }
1236
- });
1237
- });
1238
- return body;
1239
- });
1450
+ function wdmToH3Handler(devMiddleware) {
1451
+ return defineEventHandler(async (event) => {
1452
+ const { req, res } = "runtime" in event ? event.runtime.node : event.node;
1453
+ if (req.headers["sec-fetch-mode"] === "no-cors" && req.headers["sec-fetch-site"] === "cross-site") throw { status: 403 };
1454
+ event.context.webpack = {
1455
+ ...event.context.webpack,
1456
+ devMiddleware: devMiddleware.context
1457
+ };
1458
+ return await new Promise((resolve$1, reject) => {
1459
+ res.stream = (stream) => {
1460
+ resolve$1(stream);
1461
+ };
1462
+ res.send = (data) => {
1463
+ resolve$1(data);
1464
+ };
1465
+ res.finish = (data) => {
1466
+ resolve$1(data);
1467
+ };
1468
+ devMiddleware(req, res, (err) => {
1469
+ if (err) reject(err);
1470
+ else resolve$1(void 0);
1471
+ });
1472
+ });
1473
+ });
1240
1474
  }
1241
1475
  async function compile(compiler) {
1242
- const nuxt = useNuxt();
1243
- await nuxt.callHook(`${builder}:compile`, { name: compiler.options.name, compiler });
1244
- compiler.hooks.done.tap("load-resources", async (stats2) => {
1245
- await nuxt.callHook(`${builder}:compiled`, { name: compiler.options.name, compiler, stats: stats2 });
1246
- });
1247
- if (nuxt.options.dev) {
1248
- const compilersWatching = [];
1249
- nuxt.hook("close", async () => {
1250
- await Promise.all(compilersWatching.map((watching) => watching && pify(watching.close.bind(watching))()));
1251
- });
1252
- if (compiler.options.name === "client") {
1253
- return new Promise((resolve, reject) => {
1254
- compiler.hooks.done.tap("nuxt-dev", () => {
1255
- resolve(null);
1256
- });
1257
- compiler.hooks.failed.tap("nuxt-errorlog", (err) => {
1258
- reject(err);
1259
- });
1260
- createDevMiddleware(compiler).then((devMiddleware) => {
1261
- if (devMiddleware.context.watching) {
1262
- compilersWatching.push(devMiddleware.context.watching);
1263
- }
1264
- });
1265
- });
1266
- }
1267
- return new Promise((resolve, reject) => {
1268
- const watching = compiler.watch(nuxt.options.watchers.webpack, (err) => {
1269
- if (err) {
1270
- return reject(err);
1271
- }
1272
- resolve(null);
1273
- });
1274
- compilersWatching.push(watching);
1275
- });
1276
- }
1277
- const stats = await new Promise((resolve, reject) => compiler.run((err, stats2) => err ? reject(err) : resolve(stats2)));
1278
- if (stats.hasErrors()) {
1279
- const error = new Error("Nuxt build error");
1280
- error.stack = stats.toString("errors-only");
1281
- throw error;
1282
- }
1476
+ const nuxt$1 = useNuxt();
1477
+ await nuxt$1.callHook(`${builder}:compile`, {
1478
+ name: compiler.options.name,
1479
+ compiler
1480
+ });
1481
+ compiler.hooks.done.tap("load-resources", async (stats$1) => {
1482
+ await nuxt$1.callHook(`${builder}:compiled`, {
1483
+ name: compiler.options.name,
1484
+ compiler,
1485
+ stats: stats$1
1486
+ });
1487
+ });
1488
+ if (nuxt$1.options.dev) {
1489
+ const compilersWatching = [];
1490
+ nuxt$1.hook("close", async () => {
1491
+ await Promise.all(compilersWatching.map((watching) => watching && pify(watching.close.bind(watching))()));
1492
+ });
1493
+ if (compiler.options.name === "client") return new Promise((resolve$1, reject) => {
1494
+ compiler.hooks.done.tap("nuxt-dev", () => {
1495
+ resolve$1(null);
1496
+ });
1497
+ compiler.hooks.failed.tap("nuxt-errorlog", (err) => {
1498
+ reject(err);
1499
+ });
1500
+ createDevMiddleware(compiler).then((devMiddleware) => {
1501
+ if (devMiddleware.context.watching) compilersWatching.push(devMiddleware.context.watching);
1502
+ });
1503
+ });
1504
+ return new Promise((resolve$1, reject) => {
1505
+ const watching = compiler.watch(nuxt$1.options.watchers.webpack, (err) => {
1506
+ if (err) return reject(err);
1507
+ resolve$1(null);
1508
+ });
1509
+ compilersWatching.push(watching);
1510
+ });
1511
+ }
1512
+ const stats = await new Promise((resolve$1, reject) => compiler.run((err, stats$1) => err ? reject(err) : resolve$1(stats$1)));
1513
+ if (stats.hasErrors()) {
1514
+ const error = /* @__PURE__ */ new Error("Nuxt build error");
1515
+ error.stack = stats.toString("errors-only");
1516
+ throw error;
1517
+ }
1518
+ }
1519
+ function defineEventHandler(handler) {
1520
+ return Object.assign(handler, { __is_handler__: true });
1283
1521
  }
1284
1522
 
1285
- export { bundle };
1523
+ //#endregion
1524
+ export { bundle };