@wyw-in-js/nextjs 2.0.2 → 2.1.1
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/esm/index.mjs +57 -12
- package/esm/index.mjs.map +1 -1
- package/package.json +4 -4
- package/types/index.js +64 -15
package/esm/index.mjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createRequire } from "module";
|
|
2
2
|
import { mergeOxcResolverAlias, toNativeResolverAlias } from "@wyw-in-js/shared";
|
|
3
3
|
const DEFAULT_EXTENSION = ".wyw-in-js.module.css";
|
|
4
|
+
const CSS_OUTPUT_QUERY = "__wyw_css";
|
|
5
|
+
const CSS_OUTPUT_QUERY_RE = new RegExp(`^\\??${CSS_OUTPUT_QUERY}$`);
|
|
4
6
|
const DEFAULT_TURBO_RULE_KEYS = [
|
|
5
7
|
"*.js",
|
|
6
8
|
"*.jsx",
|
|
@@ -213,20 +215,37 @@ function injectWywLoader(config, nextOptions, wywNext) {
|
|
|
213
215
|
});
|
|
214
216
|
ensureWywCssModuleRules(config, extension);
|
|
215
217
|
}
|
|
216
|
-
function
|
|
217
|
-
const explicit = nextConfig.turbopack;
|
|
218
|
-
if (typeof explicit !== "undefined") {
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
218
|
+
function getInstalledNextVersion() {
|
|
221
219
|
try {
|
|
222
220
|
const pkgPath = nodeRequire.resolve("next/package.json", { paths: [process.cwd()] });
|
|
223
221
|
const pkg = nodeRequire(pkgPath);
|
|
224
222
|
const version = typeof pkg.version === "string" ? pkg.version : "";
|
|
225
|
-
const
|
|
226
|
-
|
|
223
|
+
const [majorPart, minorPart] = version.split(".");
|
|
224
|
+
const major = Number.parseInt(majorPart ?? "", 10);
|
|
225
|
+
const minor = Number.parseInt(minorPart ?? "", 10);
|
|
226
|
+
if (!Number.isFinite(major) || !Number.isFinite(minor)) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
major,
|
|
231
|
+
minor
|
|
232
|
+
};
|
|
227
233
|
} catch {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function shouldUseTurbopackConfig(nextConfig, nextVersion) {
|
|
238
|
+
const explicit = nextConfig.turbopack;
|
|
239
|
+
if (typeof explicit !== "undefined") {
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
return nextVersion !== null && nextVersion.major >= 16;
|
|
243
|
+
}
|
|
244
|
+
function supportsTurbopackQueryConditions(nextVersion) {
|
|
245
|
+
if (nextVersion === null) {
|
|
228
246
|
return false;
|
|
229
247
|
}
|
|
248
|
+
return nextVersion.major > 16 || nextVersion.major === 16 && nextVersion.minor >= 2;
|
|
230
249
|
}
|
|
231
250
|
function injectWywTurbopackRules(nextConfig, wywNext) {
|
|
232
251
|
const loader = nodeRequire.resolve("@wyw-in-js/turbopack-loader");
|
|
@@ -248,18 +267,44 @@ function injectWywTurbopackRules(nextConfig, wywNext) {
|
|
|
248
267
|
...userImportOverrides
|
|
249
268
|
} : DEFAULT_REACT_IMPORT_OVERRIDES
|
|
250
269
|
};
|
|
251
|
-
const
|
|
270
|
+
const nextVersion = getInstalledNextVersion();
|
|
271
|
+
const useTurbopackConfig = shouldUseTurbopackConfig(nextConfig, nextVersion);
|
|
272
|
+
const useCssQueryOutput = supportsTurbopackQueryConditions(nextVersion);
|
|
273
|
+
const commonConditions = [{ not: "foreign" }, { not: { path: /(?:^|[\\/])middleware\.[jt]sx?$/ } }];
|
|
274
|
+
const jsLoaderOptions = {
|
|
275
|
+
...loaderOptions,
|
|
276
|
+
cssOutputMode: useCssQueryOutput ? "query" : "sidecar"
|
|
277
|
+
};
|
|
252
278
|
const ruleValue = useTurbopackConfig ? {
|
|
253
279
|
loaders: [{
|
|
254
280
|
loader,
|
|
255
|
-
options:
|
|
281
|
+
options: jsLoaderOptions
|
|
256
282
|
}],
|
|
257
|
-
condition: { all:
|
|
283
|
+
condition: { all: commonConditions }
|
|
258
284
|
} : [{
|
|
259
285
|
loader,
|
|
260
|
-
options:
|
|
286
|
+
options: jsLoaderOptions
|
|
261
287
|
}];
|
|
262
|
-
const
|
|
288
|
+
const jsRuleValue = {
|
|
289
|
+
loaders: [{
|
|
290
|
+
loader,
|
|
291
|
+
options: jsLoaderOptions
|
|
292
|
+
}],
|
|
293
|
+
condition: { all: [...commonConditions, { not: { query: CSS_OUTPUT_QUERY_RE } }] }
|
|
294
|
+
};
|
|
295
|
+
const cssRuleValue = {
|
|
296
|
+
loaders: [{
|
|
297
|
+
loader,
|
|
298
|
+
options: {
|
|
299
|
+
...loaderOptions,
|
|
300
|
+
cssOutputMode: "query",
|
|
301
|
+
outputCss: true
|
|
302
|
+
}
|
|
303
|
+
}],
|
|
304
|
+
as: "*.module.css",
|
|
305
|
+
condition: { all: [...commonConditions, { query: CSS_OUTPUT_QUERY_RE }] }
|
|
306
|
+
};
|
|
307
|
+
const wywRules = Object.fromEntries(DEFAULT_TURBO_RULE_KEYS.map((key) => [key, useCssQueryOutput ? [cssRuleValue, jsRuleValue] : ruleValue]));
|
|
263
308
|
if (useTurbopackConfig) {
|
|
264
309
|
const userRules = isPlainObject(userTurbopack.rules) ? userTurbopack.rules : {};
|
|
265
310
|
return {
|
package/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["import { createRequire } from 'module';\n\nimport {\n mergeOxcResolverAlias,\n toNativeResolverAlias,\n} from '@wyw-in-js/shared';\nimport type { LoaderOptions as WywTurbopackLoaderOptions } from '@wyw-in-js/turbopack-loader';\nimport type { LoaderOptions as WywWebpackLoaderOptions } from '@wyw-in-js/webpack-loader';\nimport type { NextConfig } from 'next';\nimport type { Configuration, RuleSetRule, RuleSetUseItem } from 'webpack';\n\nconst DEFAULT_EXTENSION = '.wyw-in-js.module.css';\n\nconst DEFAULT_TURBO_RULE_KEYS = ['*.js', '*.jsx', '*.ts', '*.tsx'];\n\nconst DEFAULT_REACT_IMPORT_OVERRIDES = {\n react: { mock: 'react' },\n 'react/jsx-runtime': { mock: 'react/jsx-runtime' },\n 'react/jsx-dev-runtime': { mock: 'react/jsx-dev-runtime' },\n} satisfies WywWebpackLoaderOptions['importOverrides'];\n\nconst nodeRequire = createRequire(import.meta.url);\n\nexport type WywNextPluginOptions = {\n loaderOptions?: Omit<WywWebpackLoaderOptions, 'extension' | 'sourceMap'> &\n Partial<Pick<WywWebpackLoaderOptions, 'extension' | 'sourceMap'>>;\n turbopackLoaderOptions?: Partial<WywTurbopackLoaderOptions>;\n};\n\ntype NextWebpackConfigFn = NonNullable<NextConfig['webpack']>;\ntype NextWebpackOptions = Parameters<NextWebpackConfigFn>[1];\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isUseLoaderObject(\n item: RuleSetUseItem\n): item is Exclude<RuleSetUseItem, string> & { loader: string } {\n return (\n isObject(item) &&\n typeof (item as Record<string, unknown>).loader === 'string'\n );\n}\n\nfunction normalizeUseItems(use: RuleSetRule['use']): RuleSetUseItem[] | null {\n if (!use) return null;\n if (typeof use === 'function') return null;\n\n const list = (Array.isArray(use) ? use : [use]).filter(Boolean);\n return list.length ? (list as RuleSetUseItem[]) : null;\n}\n\nfunction getLoaderName(item: RuleSetUseItem): string {\n if (typeof item === 'string') return item;\n if (isUseLoaderObject(item)) return item.loader;\n return '';\n}\n\nfunction isWywLoaderPath(loader: string) {\n return (\n loader.includes('@wyw-in-js/webpack-loader') ||\n /[\\\\/]webpack-loader[\\\\/]/.test(loader)\n );\n}\n\nfunction convertLoaderRuleToUseRule(\n rule: RuleSetRule,\n wywLoaderItem: RuleSetUseItem\n) {\n const { loader } = rule as { loader?: unknown };\n if (typeof loader !== 'string') return;\n\n const alreadyInjected = isWywLoaderPath(loader);\n if (alreadyInjected) return;\n\n const isNextJsTranspileRule = [\n 'next-swc-loader',\n 'next-babel-loader',\n 'babel-loader',\n ].some((needle) => loader.includes(needle));\n if (!isNextJsTranspileRule) return;\n\n const { options } = rule as { options?: unknown };\n\n const nextRule = rule as RuleSetRule & {\n loader?: unknown;\n options?: unknown;\n };\n\n delete nextRule.loader;\n delete nextRule.options;\n\n // Loader order is right-to-left. We want WyW to run first, so it should be last.\n Object.assign(nextRule, {\n use: [\n { loader, ...(options !== undefined ? { options } : {}) },\n wywLoaderItem,\n ],\n });\n}\n\nfunction traverseRules(rules: unknown[], visitor: (rule: RuleSetRule) => void) {\n for (const rule of rules) {\n if (rule && typeof rule === 'object') {\n visitor(rule as RuleSetRule);\n\n if (Array.isArray((rule as RuleSetRule).oneOf)) {\n traverseRules((rule as RuleSetRule).oneOf!, visitor);\n }\n if (Array.isArray((rule as RuleSetRule).rules)) {\n traverseRules((rule as RuleSetRule).rules!, visitor);\n }\n }\n }\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction assertJsonSerializable(value: unknown, name: string) {\n const queue: Array<{ path: string; value: unknown }> = [\n { path: name, value },\n ];\n const seen = new Set<unknown>();\n\n while (queue.length) {\n const current = queue.shift()!;\n\n if (current.value === null) {\n // skip\n } else if (typeof current.value === 'undefined') {\n // skip\n } else if (\n typeof current.value === 'string' ||\n typeof current.value === 'number' ||\n typeof current.value === 'boolean'\n ) {\n // primitives are ok\n } else if (\n typeof current.value === 'function' ||\n typeof current.value === 'symbol' ||\n typeof current.value === 'bigint'\n ) {\n throw new Error(\n `${current.path} must be JSON-serializable (functions, symbols and bigint are not supported in Turbopack loader options). Use \"configFile\" to pass non-JSON config.`\n );\n } else if (Array.isArray(current.value)) {\n if (!seen.has(current.value)) {\n seen.add(current.value);\n current.value.forEach((item, idx) =>\n queue.push({ path: `${current.path}[${idx}]`, value: item })\n );\n }\n } else if (isPlainObject(current.value)) {\n if (!seen.has(current.value)) {\n seen.add(current.value);\n Object.entries(current.value).forEach(([key, item]) =>\n queue.push({ path: `${current.path}.${key}`, value: item })\n );\n }\n } else {\n throw new Error(\n `${current.path} must be JSON-serializable (only plain objects, arrays, and primitives are supported in Turbopack loader options). Use \"configFile\" to pass non-JSON config.`\n );\n }\n }\n}\n\nfunction createWywCssModuleRule(\n baseRule: RuleSetRule,\n extensionSuffix: string\n): RuleSetRule {\n const use = normalizeUseItems(baseRule.use) ?? [];\n\n const patchedUse = use.map((item) => {\n if (!isUseLoaderObject(item) || !item.loader.includes('css-loader')) {\n return item;\n }\n\n const itemOptions = (item as { options?: unknown }).options;\n if (!isObject(itemOptions)) {\n return item;\n }\n\n const { modules } = itemOptions as { modules?: unknown };\n if (!isObject(modules)) {\n return item;\n }\n\n const nextModules = {\n ...(modules as Record<string, unknown>),\n mode: 'global',\n getLocalIdent: (\n _context: unknown,\n _localIdentName: string,\n localName: string\n ) => localName,\n };\n\n return {\n ...item,\n options: {\n ...(itemOptions as Record<string, unknown>),\n modules: nextModules,\n },\n };\n });\n\n const nextRule: RuleSetRule = {\n ...baseRule,\n sideEffects: true,\n test: new RegExp(`${escapeRegExp(extensionSuffix)}$`),\n use: patchedUse,\n };\n\n return nextRule;\n}\n\nfunction ensureWywCssModuleRules(\n config: Configuration,\n extensionSuffix: string\n) {\n traverseRules(config.module?.rules ?? [], (rule) => {\n if (!Array.isArray(rule.oneOf) || rule.oneOf.length === 0) {\n return;\n }\n\n const expectedTestSource = `${escapeRegExp(extensionSuffix)}$`;\n\n const alreadyPresent = rule.oneOf.some((candidate) => {\n if (!candidate || typeof candidate !== 'object') return false;\n\n const { test } = candidate as RuleSetRule;\n return test instanceof RegExp && test.source === expectedTestSource;\n });\n\n if (alreadyPresent) {\n return;\n }\n\n const oneOf = rule.oneOf as unknown[];\n for (let idx = 0; idx < oneOf.length; idx += 1) {\n const candidate = oneOf[idx];\n if (candidate && typeof candidate === 'object') {\n const candidateRule = candidate as RuleSetRule;\n const { test } = candidateRule;\n\n const isModuleCssRule =\n test instanceof RegExp && test.source.includes('\\\\.module\\\\.css');\n\n if (isModuleCssRule) {\n const use = normalizeUseItems(candidateRule.use);\n if (use) {\n const hasCssLoader = use.some(\n (item) =>\n isUseLoaderObject(item) && item.loader.includes('css-loader')\n );\n if (hasCssLoader) {\n oneOf.splice(\n idx,\n 0,\n createWywCssModuleRule(candidateRule, extensionSuffix)\n );\n break;\n }\n }\n }\n }\n }\n });\n}\n\nfunction injectWywLoader(\n config: Configuration,\n nextOptions: NextWebpackOptions,\n wywNext: WywNextPluginOptions\n) {\n const loader = nodeRequire.resolve('@wyw-in-js/webpack-loader');\n\n const extension = wywNext.loaderOptions?.extension ?? DEFAULT_EXTENSION;\n\n const userImportOverrides = wywNext.loaderOptions?.importOverrides;\n const importOverrides = userImportOverrides\n ? { ...DEFAULT_REACT_IMPORT_OVERRIDES, ...userImportOverrides }\n : DEFAULT_REACT_IMPORT_OVERRIDES;\n\n const loaderOptions = {\n cssImport: 'import',\n ...wywNext.loaderOptions,\n extension,\n importOverrides,\n sourceMap: wywNext.loaderOptions?.sourceMap ?? nextOptions.dev,\n } satisfies WywWebpackLoaderOptions;\n\n const wywLoaderItem: RuleSetUseItem = {\n loader,\n options: loaderOptions,\n };\n\n traverseRules(config.module?.rules ?? [], (rule) => {\n convertLoaderRuleToUseRule(rule, wywLoaderItem);\n\n const use = normalizeUseItems(rule.use);\n if (!use) return;\n\n const loaders = use.map(getLoaderName);\n\n const alreadyInjected = loaders.some(\n (l) => l === loader || isWywLoaderPath(l)\n );\n if (alreadyInjected) return;\n\n const isNextJsTranspileRule = loaders.some((l) =>\n ['next-swc-loader', 'next-babel-loader', 'babel-loader'].some((needle) =>\n l.includes(needle)\n )\n );\n if (!isNextJsTranspileRule) return;\n\n // Loader order is right-to-left. We want WyW to run first, so it should be last.\n Object.assign(rule, { use: [...use, wywLoaderItem] });\n });\n\n ensureWywCssModuleRules(config, extension);\n}\n\nfunction shouldUseTurbopackConfig(nextConfig: NextConfig) {\n const explicit = (nextConfig as unknown as Record<string, unknown>).turbopack;\n if (typeof explicit !== 'undefined') {\n return true;\n }\n\n try {\n const pkgPath = nodeRequire.resolve('next/package.json', {\n paths: [process.cwd()],\n });\n const pkg = nodeRequire(pkgPath) as { version?: unknown };\n const version = typeof pkg.version === 'string' ? pkg.version : '';\n const major = Number.parseInt(version.split('.')[0] ?? '', 10);\n return Number.isFinite(major) && major >= 16;\n } catch {\n return false;\n }\n}\n\nfunction injectWywTurbopackRules(\n nextConfig: NextConfig,\n wywNext: WywNextPluginOptions\n): NextConfig {\n const loader = nodeRequire.resolve('@wyw-in-js/turbopack-loader');\n\n const userOptions = wywNext.turbopackLoaderOptions ?? {};\n\n assertJsonSerializable(userOptions, 'turbopackLoaderOptions');\n\n const turbopackConfig = (nextConfig as unknown as Record<string, unknown>)\n .turbopack;\n const userTurbopack = isPlainObject(turbopackConfig) ? turbopackConfig : {};\n const userExperimental = isPlainObject(nextConfig.experimental)\n ? (nextConfig.experimental as Record<string, unknown>)\n : {};\n const userTurbo = isPlainObject(userExperimental.turbo)\n ? (userExperimental.turbo as Record<string, unknown>)\n : {};\n\n const nativeResolverAlias = toNativeResolverAlias(\n userTurbopack.resolveAlias ?? userTurbo.resolveAlias\n );\n const oxcOptions = mergeOxcResolverAlias(\n userOptions.oxcOptions,\n nativeResolverAlias\n );\n\n const userImportOverrides = isPlainObject(userOptions.importOverrides)\n ? (userOptions.importOverrides as Record<string, unknown>)\n : undefined;\n\n const loaderOptions = {\n sourceMap: process.env.NODE_ENV !== 'production',\n ...userOptions,\n ...(oxcOptions ? { oxcOptions } : {}),\n importOverrides: userImportOverrides\n ? { ...DEFAULT_REACT_IMPORT_OVERRIDES, ...userImportOverrides }\n : DEFAULT_REACT_IMPORT_OVERRIDES,\n };\n\n const useTurbopackConfig = shouldUseTurbopackConfig(nextConfig);\n\n const ruleValue = useTurbopackConfig\n ? {\n loaders: [{ loader, options: loaderOptions }],\n condition: {\n all: [\n { not: 'foreign' },\n { not: { path: /(?:^|[\\\\/])middleware\\.[jt]sx?$/ } },\n ],\n },\n }\n : [{ loader, options: loaderOptions }];\n\n const wywRules = Object.fromEntries(\n DEFAULT_TURBO_RULE_KEYS.map((key) => [key, ruleValue])\n );\n\n if (useTurbopackConfig) {\n const userRules = isPlainObject(userTurbopack.rules)\n ? (userTurbopack.rules as Record<string, unknown>)\n : {};\n\n return {\n ...nextConfig,\n turbopack: {\n ...userTurbopack,\n rules: {\n ...wywRules,\n ...userRules,\n },\n },\n } as NextConfig;\n }\n\n const userRules = isPlainObject(userTurbo.rules)\n ? (userTurbo.rules as Record<string, unknown>)\n : {};\n\n return {\n ...nextConfig,\n experimental: {\n ...userExperimental,\n turbo: {\n ...userTurbo,\n rules: {\n ...wywRules,\n ...userRules,\n },\n },\n },\n } as NextConfig;\n}\n\nexport function withWyw(\n nextConfig: NextConfig = {},\n wywNext: WywNextPluginOptions = {}\n): NextConfig {\n const userWebpack = nextConfig.webpack;\n\n return {\n ...injectWywTurbopackRules(nextConfig, wywNext),\n webpack(config: Configuration, options: NextWebpackOptions) {\n const resolvedConfig =\n typeof userWebpack === 'function'\n ? userWebpack(config, options)\n : config;\n\n injectWywLoader(resolvedConfig, options, wywNext);\n\n return resolvedConfig;\n },\n };\n}\n"],"file":"index.mjs"}
|
|
1
|
+
{"mappings":"AAAA,SAAS,qBAAqB;AAE9B,SACE,uBACA,6BACK;AAMP,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AACzB,MAAM,sBAAsB,IAAI,OAAO,QAAQ,iBAAiB,GAAG;AAEnE,MAAM,0BAA0B;CAAC;CAAQ;CAAS;CAAQ;CAAQ;AAElE,MAAM,iCAAiC;CACrC,OAAO,EAAE,MAAM,SAAS;CACxB,qBAAqB,EAAE,MAAM,qBAAqB;CAClD,yBAAyB,EAAE,MAAM,yBAAyB;CAC3D;AAED,MAAM,cAAc,cAAc,OAAO,KAAK,IAAI;AAelD,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU;;AAGhD,SAAS,kBACP,MAC8D;AAC9D,QACE,SAAS,KAAK,IACd,OAAQ,KAAiC,WAAW;;AAIxD,SAAS,kBAAkB,KAAkD;AAC3E,KAAI,CAAC,IAAK,QAAO;AACjB,KAAI,OAAO,QAAQ,WAAY,QAAO;CAEtC,MAAM,QAAQ,MAAM,QAAQ,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,QAAQ;AAC/D,QAAO,KAAK,SAAU,OAA4B;;AAGpD,SAAS,cAAc,MAA8B;AACnD,KAAI,OAAO,SAAS,SAAU,QAAO;AACrC,KAAI,kBAAkB,KAAK,CAAE,QAAO,KAAK;AACzC,QAAO;;AAGT,SAAS,gBAAgB,QAAgB;AACvC,QACE,OAAO,SAAS,4BAA4B,IAC5C,2BAA2B,KAAK,OAAO;;AAI3C,SAAS,2BACP,MACA,eACA;CACA,MAAM,EAAE,WAAW;AACnB,KAAI,OAAO,WAAW,SAAU;CAEhC,MAAM,kBAAkB,gBAAgB,OAAO;AAC/C,KAAI,gBAAiB;CAErB,MAAM,wBAAwB;EAC5B;EACA;EACA;EACD,CAAC,MAAM,WAAW,OAAO,SAAS,OAAO,CAAC;AAC3C,KAAI,CAAC,sBAAuB;CAE5B,MAAM,EAAE,YAAY;CAEpB,MAAM,WAAW;AAKjB,QAAO,SAAS;AAChB,QAAO,SAAS;;AAGhB,QAAO,OAAO,UAAU,EACtB,KAAK,CACH;EAAE;EAAQ,GAAI,YAAY,YAAY,EAAE,SAAS,GAAG,EAAE;EAAG,EACzD,cACD,EACF,CAAC;;AAGJ,SAAS,cAAc,OAAkB,SAAsC;AAC7E,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,WAAQ,KAAoB;AAE5B,OAAI,MAAM,QAAS,KAAqB,MAAM,EAAE;AAC9C,kBAAe,KAAqB,OAAQ,QAAQ;;AAEtD,OAAI,MAAM,QAAS,KAAqB,MAAM,EAAE;AAC9C,kBAAe,KAAqB,OAAQ,QAAQ;;;;;AAM5D,SAAS,aAAa,OAAe;AACnC,QAAO,MAAM,QAAQ,uBAAuB,OAAO;;AAGrD,SAAS,cAAc,OAAkD;AACvE,KAAI,CAAC,SAAS,MAAM,CAAE,QAAO;CAC7B,MAAM,QAAQ,OAAO,eAAe,MAAM;AAC1C,QAAO,UAAU,OAAO,aAAa,UAAU;;AAGjD,SAAS,uBAAuB,OAAgB,MAAc;CAC5D,MAAM,QAAiD,CACrD;EAAE,MAAM;EAAM;EAAO,CACtB;CACD,MAAM,OAAO,IAAI,KAAc;AAE/B,QAAO,MAAM,QAAQ;EACnB,MAAM,UAAU,MAAM,OAAO;AAE7B,MAAI,QAAQ,UAAU,MAAM,YAEjB,OAAO,QAAQ,UAAU,aAAa,YAG/C,OAAO,QAAQ,UAAU,YACzB,OAAO,QAAQ,UAAU,YACzB,OAAO,QAAQ,UAAU,WACzB,YAGA,OAAO,QAAQ,UAAU,cACzB,OAAO,QAAQ,UAAU,YACzB,OAAO,QAAQ,UAAU,UACzB;AACA,SAAM,IAAI,MACR,GAAG,QAAQ,KAAK,qJACjB;aACQ,MAAM,QAAQ,QAAQ,MAAM,EAAE;AACvC,OAAI,CAAC,KAAK,IAAI,QAAQ,MAAM,EAAE;AAC5B,SAAK,IAAI,QAAQ,MAAM;AACvB,YAAQ,MAAM,SAAS,MAAM,QAC3B,MAAM,KAAK;KAAE,MAAM,GAAG,QAAQ,KAAK,GAAG,IAAI;KAAI,OAAO;KAAM,CAAC,CAC7D;;aAEM,cAAc,QAAQ,MAAM,EAAE;AACvC,OAAI,CAAC,KAAK,IAAI,QAAQ,MAAM,EAAE;AAC5B,SAAK,IAAI,QAAQ,MAAM;AACvB,WAAO,QAAQ,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,UAC3C,MAAM,KAAK;KAAE,MAAM,GAAG,QAAQ,KAAK,GAAG;KAAO,OAAO;KAAM,CAAC,CAC5D;;SAEE;AACL,SAAM,IAAI,MACR,GAAG,QAAQ,KAAK,8JACjB;;;;AAKP,SAAS,uBACP,UACA,iBACa;CACb,MAAM,MAAM,kBAAkB,SAAS,IAAI,IAAI,EAAE;CAEjD,MAAM,aAAa,IAAI,KAAK,SAAS;AACnC,MAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,KAAK,OAAO,SAAS,aAAa,EAAE;AACnE,UAAO;;EAGT,MAAM,cAAe,KAA+B;AACpD,MAAI,CAAC,SAAS,YAAY,EAAE;AAC1B,UAAO;;EAGT,MAAM,EAAE,YAAY;AACpB,MAAI,CAAC,SAAS,QAAQ,EAAE;AACtB,UAAO;;EAGT,MAAM,cAAc;GAClB,GAAI;GACJ,MAAM;GACN,gBACE,UACA,iBACA,cACG;GACN;AAED,SAAO;GACL,GAAG;GACH,SAAS;IACP,GAAI;IACJ,SAAS;IACV;GACF;GACD;CAEF,MAAM,WAAwB;EAC5B,GAAG;EACH,aAAa;EACb,MAAM,IAAI,OAAO,GAAG,aAAa,gBAAgB,CAAC,GAAG;EACrD,KAAK;EACN;AAED,QAAO;;AAGT,SAAS,wBACP,QACA,iBACA;AACA,eAAc,OAAO,QAAQ,SAAS,EAAE,GAAG,SAAS;AAClD,MAAI,CAAC,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,WAAW,GAAG;AACzD;;EAGF,MAAM,qBAAqB,GAAG,aAAa,gBAAgB,CAAC;EAE5D,MAAM,iBAAiB,KAAK,MAAM,MAAM,cAAc;AACpD,OAAI,CAAC,aAAa,OAAO,cAAc,SAAU,QAAO;GAExD,MAAM,EAAE,SAAS;AACjB,UAAO,gBAAgB,UAAU,KAAK,WAAW;IACjD;AAEF,MAAI,gBAAgB;AAClB;;EAGF,MAAM,QAAQ,KAAK;AACnB,OAAK,IAAI,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;GAC9C,MAAM,YAAY,MAAM;AACxB,OAAI,aAAa,OAAO,cAAc,UAAU;IAC9C,MAAM,gBAAgB;IACtB,MAAM,EAAE,SAAS;IAEjB,MAAM,kBACJ,gBAAgB,UAAU,KAAK,OAAO,SAAS,kBAAkB;AAEnE,QAAI,iBAAiB;KACnB,MAAM,MAAM,kBAAkB,cAAc,IAAI;AAChD,SAAI,KAAK;MACP,MAAM,eAAe,IAAI,MACtB,SACC,kBAAkB,KAAK,IAAI,KAAK,OAAO,SAAS,aAAa,CAChE;AACD,UAAI,cAAc;AAChB,aAAM,OACJ,KACA,GACA,uBAAuB,eAAe,gBAAgB,CACvD;AACD;;;;;;GAMV;;AAGJ,SAAS,gBACP,QACA,aACA,SACA;CACA,MAAM,SAAS,YAAY,QAAQ,4BAA4B;CAE/D,MAAM,YAAY,QAAQ,eAAe,aAAa;CAEtD,MAAM,sBAAsB,QAAQ,eAAe;CACnD,MAAM,kBAAkB,sBACpB;EAAE,GAAG;EAAgC,GAAG;EAAqB,GAC7D;CAEJ,MAAM,gBAAgB;EACpB,WAAW;EACX,GAAG,QAAQ;EACX;EACA;EACA,WAAW,QAAQ,eAAe,aAAa,YAAY;EAC5D;CAED,MAAM,gBAAgC;EACpC;EACA,SAAS;EACV;AAED,eAAc,OAAO,QAAQ,SAAS,EAAE,GAAG,SAAS;AAClD,6BAA2B,MAAM,cAAc;EAE/C,MAAM,MAAM,kBAAkB,KAAK,IAAI;AACvC,MAAI,CAAC,IAAK;EAEV,MAAM,UAAU,IAAI,IAAI,cAAc;EAEtC,MAAM,kBAAkB,QAAQ,MAC7B,MAAM,MAAM,UAAU,gBAAgB,EAAE,CAC1C;AACD,MAAI,gBAAiB;EAErB,MAAM,wBAAwB,QAAQ,MAAM,MAC1C;GAAC;GAAmB;GAAqB;GAAe,CAAC,MAAM,WAC7D,EAAE,SAAS,OAAO,CACnB,CACF;AACD,MAAI,CAAC,sBAAuB;;AAG5B,SAAO,OAAO,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,cAAc,EAAE,CAAC;GACrD;AAEF,yBAAwB,QAAQ,UAAU;;AAG5C,SAAS,0BAA8C;AACrD,KAAI;EACF,MAAM,UAAU,YAAY,QAAQ,qBAAqB,EACvD,OAAO,CAAC,QAAQ,KAAK,CAAC,EACvB,CAAC;EACF,MAAM,MAAM,YAAY,QAAQ;EAChC,MAAM,UAAU,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;EAChE,MAAM,CAAC,WAAW,aAAa,QAAQ,MAAM,IAAI;EACjD,MAAM,QAAQ,OAAO,SAAS,aAAa,IAAI,GAAG;EAClD,MAAM,QAAQ,OAAO,SAAS,aAAa,IAAI,GAAG;AAElD,MAAI,CAAC,OAAO,SAAS,MAAM,IAAI,CAAC,OAAO,SAAS,MAAM,EAAE;AACtD,UAAO;;AAGT,SAAO;GAAE;GAAO;GAAO;SACjB;AACN,SAAO;;;AAIX,SAAS,yBACP,YACA,aACA;CACA,MAAM,WAAY,WAAkD;AACpE,KAAI,OAAO,aAAa,aAAa;AACnC,SAAO;;AAGT,QAAO,gBAAgB,QAAQ,YAAY,SAAS;;AAGtD,SAAS,iCAAiC,aAAiC;AACzE,KAAI,gBAAgB,MAAM;AACxB,SAAO;;AAGT,QACE,YAAY,QAAQ,MACnB,YAAY,UAAU,MAAM,YAAY,SAAS;;AAItD,SAAS,wBACP,YACA,SACY;CACZ,MAAM,SAAS,YAAY,QAAQ,8BAA8B;CAEjE,MAAM,cAAc,QAAQ,0BAA0B,EAAE;AAExD,wBAAuB,aAAa,yBAAyB;CAE7D,MAAM,kBAAmB,WACtB;CACH,MAAM,gBAAgB,cAAc,gBAAgB,GAAG,kBAAkB,EAAE;CAC3E,MAAM,mBAAmB,cAAc,WAAW,aAAa,GAC1D,WAAW,eACZ,EAAE;CACN,MAAM,YAAY,cAAc,iBAAiB,MAAM,GAClD,iBAAiB,QAClB,EAAE;CAEN,MAAM,sBAAsB,sBAC1B,cAAc,gBAAgB,UAAU,aACzC;CACD,MAAM,aAAa,sBACjB,YAAY,YACZ,oBACD;CAED,MAAM,sBAAsB,cAAc,YAAY,gBAAgB,GACjE,YAAY,kBACb;CAEJ,MAAM,gBAAgB;EACpB,WAAW,QAAQ,IAAI,aAAa;EACpC,GAAG;EACH,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;EACpC,iBAAiB,sBACb;GAAE,GAAG;GAAgC,GAAG;GAAqB,GAC7D;EACL;CAED,MAAM,cAAc,yBAAyB;CAC7C,MAAM,qBAAqB,yBAAyB,YAAY,YAAY;CAC5E,MAAM,oBAAoB,iCAAiC,YAAY;CAEvE,MAAM,mBAAmB,CACvB,EAAE,KAAK,WAAW,EAClB,EAAE,KAAK,EAAE,MAAM,mCAAmC,EAAE,CACrD;CAED,MAAM,kBAAkB;EACtB,GAAG;EACH,eAAe,oBAAoB,UAAU;EAC9C;CAED,MAAM,YAAY,qBACd;EACE,SAAS,CAAC;GAAE;GAAQ,SAAS;GAAiB,CAAC;EAC/C,WAAW,EACT,KAAK,kBACN;EACF,GACD,CAAC;EAAE;EAAQ,SAAS;EAAiB,CAAC;CAE1C,MAAM,cAAc;EAClB,SAAS,CAAC;GAAE;GAAQ,SAAS;GAAiB,CAAC;EAC/C,WAAW,EACT,KAAK,CAAC,GAAG,kBAAkB,EAAE,KAAK,EAAE,OAAO,qBAAqB,EAAE,CAAC,EACpE;EACF;CAED,MAAM,eAAe;EACnB,SAAS,CACP;GACE;GACA,SAAS;IACP,GAAG;IACH,eAAe;IACf,WAAW;IACZ;GACF,CACF;EACD,IAAI;EACJ,WAAW,EACT,KAAK,CAAC,GAAG,kBAAkB,EAAE,OAAO,qBAAqB,CAAC,EAC3D;EACF;CAED,MAAM,WAAW,OAAO,YACtB,wBAAwB,KAAK,QAAQ,CACnC,KACA,oBAAoB,CAAC,cAAc,YAAY,GAAG,UACnD,CAAC,CACH;AAED,KAAI,oBAAoB;EACtB,MAAM,YAAY,cAAc,cAAc,MAAM,GAC/C,cAAc,QACf,EAAE;AAEN,SAAO;GACL,GAAG;GACH,WAAW;IACT,GAAG;IACH,OAAO;KACL,GAAG;KACH,GAAG;KACJ;IACF;GACF;;CAGH,MAAM,YAAY,cAAc,UAAU,MAAM,GAC3C,UAAU,QACX,EAAE;AAEN,QAAO;EACL,GAAG;EACH,cAAc;GACZ,GAAG;GACH,OAAO;IACL,GAAG;IACH,OAAO;KACL,GAAG;KACH,GAAG;KACJ;IACF;GACF;EACF;;AAGH,OAAO,SAAS,QACd,aAAyB,EAAE,EAC3B,UAAgC,EAAE,EACtB;CACZ,MAAM,cAAc,WAAW;AAE/B,QAAO;EACL,GAAG,wBAAwB,YAAY,QAAQ;EAC/C,QAAQ,QAAuB,SAA6B;GAC1D,MAAM,iBACJ,OAAO,gBAAgB,aACnB,YAAY,QAAQ,QAAQ,GAC5B;AAEN,mBAAgB,gBAAgB,SAAS,QAAQ;AAEjD,UAAO;;EAEV","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["import { createRequire } from 'module';\n\nimport {\n mergeOxcResolverAlias,\n toNativeResolverAlias,\n} from '@wyw-in-js/shared';\nimport type { LoaderOptions as WywTurbopackLoaderOptions } from '@wyw-in-js/turbopack-loader';\nimport type { LoaderOptions as WywWebpackLoaderOptions } from '@wyw-in-js/webpack-loader';\nimport type { NextConfig } from 'next';\nimport type { Configuration, RuleSetRule, RuleSetUseItem } from 'webpack';\n\nconst DEFAULT_EXTENSION = '.wyw-in-js.module.css';\nconst CSS_OUTPUT_QUERY = '__wyw_css';\nconst CSS_OUTPUT_QUERY_RE = new RegExp(`^\\\\??${CSS_OUTPUT_QUERY}$`);\n\nconst DEFAULT_TURBO_RULE_KEYS = ['*.js', '*.jsx', '*.ts', '*.tsx'];\n\nconst DEFAULT_REACT_IMPORT_OVERRIDES = {\n react: { mock: 'react' },\n 'react/jsx-runtime': { mock: 'react/jsx-runtime' },\n 'react/jsx-dev-runtime': { mock: 'react/jsx-dev-runtime' },\n} satisfies WywWebpackLoaderOptions['importOverrides'];\n\nconst nodeRequire = createRequire(import.meta.url);\n\nexport type WywNextPluginOptions = {\n loaderOptions?: Omit<WywWebpackLoaderOptions, 'extension' | 'sourceMap'> &\n Partial<Pick<WywWebpackLoaderOptions, 'extension' | 'sourceMap'>>;\n turbopackLoaderOptions?: Partial<WywTurbopackLoaderOptions>;\n};\n\ntype NextWebpackConfigFn = NonNullable<NextConfig['webpack']>;\ntype NextWebpackOptions = Parameters<NextWebpackConfigFn>[1];\ntype NextVersion = {\n major: number;\n minor: number;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isUseLoaderObject(\n item: RuleSetUseItem\n): item is Exclude<RuleSetUseItem, string> & { loader: string } {\n return (\n isObject(item) &&\n typeof (item as Record<string, unknown>).loader === 'string'\n );\n}\n\nfunction normalizeUseItems(use: RuleSetRule['use']): RuleSetUseItem[] | null {\n if (!use) return null;\n if (typeof use === 'function') return null;\n\n const list = (Array.isArray(use) ? use : [use]).filter(Boolean);\n return list.length ? (list as RuleSetUseItem[]) : null;\n}\n\nfunction getLoaderName(item: RuleSetUseItem): string {\n if (typeof item === 'string') return item;\n if (isUseLoaderObject(item)) return item.loader;\n return '';\n}\n\nfunction isWywLoaderPath(loader: string) {\n return (\n loader.includes('@wyw-in-js/webpack-loader') ||\n /[\\\\/]webpack-loader[\\\\/]/.test(loader)\n );\n}\n\nfunction convertLoaderRuleToUseRule(\n rule: RuleSetRule,\n wywLoaderItem: RuleSetUseItem\n) {\n const { loader } = rule as { loader?: unknown };\n if (typeof loader !== 'string') return;\n\n const alreadyInjected = isWywLoaderPath(loader);\n if (alreadyInjected) return;\n\n const isNextJsTranspileRule = [\n 'next-swc-loader',\n 'next-babel-loader',\n 'babel-loader',\n ].some((needle) => loader.includes(needle));\n if (!isNextJsTranspileRule) return;\n\n const { options } = rule as { options?: unknown };\n\n const nextRule = rule as RuleSetRule & {\n loader?: unknown;\n options?: unknown;\n };\n\n delete nextRule.loader;\n delete nextRule.options;\n\n // Loader order is right-to-left. We want WyW to run first, so it should be last.\n Object.assign(nextRule, {\n use: [\n { loader, ...(options !== undefined ? { options } : {}) },\n wywLoaderItem,\n ],\n });\n}\n\nfunction traverseRules(rules: unknown[], visitor: (rule: RuleSetRule) => void) {\n for (const rule of rules) {\n if (rule && typeof rule === 'object') {\n visitor(rule as RuleSetRule);\n\n if (Array.isArray((rule as RuleSetRule).oneOf)) {\n traverseRules((rule as RuleSetRule).oneOf!, visitor);\n }\n if (Array.isArray((rule as RuleSetRule).rules)) {\n traverseRules((rule as RuleSetRule).rules!, visitor);\n }\n }\n }\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction assertJsonSerializable(value: unknown, name: string) {\n const queue: Array<{ path: string; value: unknown }> = [\n { path: name, value },\n ];\n const seen = new Set<unknown>();\n\n while (queue.length) {\n const current = queue.shift()!;\n\n if (current.value === null) {\n // skip\n } else if (typeof current.value === 'undefined') {\n // skip\n } else if (\n typeof current.value === 'string' ||\n typeof current.value === 'number' ||\n typeof current.value === 'boolean'\n ) {\n // primitives are ok\n } else if (\n typeof current.value === 'function' ||\n typeof current.value === 'symbol' ||\n typeof current.value === 'bigint'\n ) {\n throw new Error(\n `${current.path} must be JSON-serializable (functions, symbols and bigint are not supported in Turbopack loader options). Use \"configFile\" to pass non-JSON config.`\n );\n } else if (Array.isArray(current.value)) {\n if (!seen.has(current.value)) {\n seen.add(current.value);\n current.value.forEach((item, idx) =>\n queue.push({ path: `${current.path}[${idx}]`, value: item })\n );\n }\n } else if (isPlainObject(current.value)) {\n if (!seen.has(current.value)) {\n seen.add(current.value);\n Object.entries(current.value).forEach(([key, item]) =>\n queue.push({ path: `${current.path}.${key}`, value: item })\n );\n }\n } else {\n throw new Error(\n `${current.path} must be JSON-serializable (only plain objects, arrays, and primitives are supported in Turbopack loader options). Use \"configFile\" to pass non-JSON config.`\n );\n }\n }\n}\n\nfunction createWywCssModuleRule(\n baseRule: RuleSetRule,\n extensionSuffix: string\n): RuleSetRule {\n const use = normalizeUseItems(baseRule.use) ?? [];\n\n const patchedUse = use.map((item) => {\n if (!isUseLoaderObject(item) || !item.loader.includes('css-loader')) {\n return item;\n }\n\n const itemOptions = (item as { options?: unknown }).options;\n if (!isObject(itemOptions)) {\n return item;\n }\n\n const { modules } = itemOptions as { modules?: unknown };\n if (!isObject(modules)) {\n return item;\n }\n\n const nextModules = {\n ...(modules as Record<string, unknown>),\n mode: 'global',\n getLocalIdent: (\n _context: unknown,\n _localIdentName: string,\n localName: string\n ) => localName,\n };\n\n return {\n ...item,\n options: {\n ...(itemOptions as Record<string, unknown>),\n modules: nextModules,\n },\n };\n });\n\n const nextRule: RuleSetRule = {\n ...baseRule,\n sideEffects: true,\n test: new RegExp(`${escapeRegExp(extensionSuffix)}$`),\n use: patchedUse,\n };\n\n return nextRule;\n}\n\nfunction ensureWywCssModuleRules(\n config: Configuration,\n extensionSuffix: string\n) {\n traverseRules(config.module?.rules ?? [], (rule) => {\n if (!Array.isArray(rule.oneOf) || rule.oneOf.length === 0) {\n return;\n }\n\n const expectedTestSource = `${escapeRegExp(extensionSuffix)}$`;\n\n const alreadyPresent = rule.oneOf.some((candidate) => {\n if (!candidate || typeof candidate !== 'object') return false;\n\n const { test } = candidate as RuleSetRule;\n return test instanceof RegExp && test.source === expectedTestSource;\n });\n\n if (alreadyPresent) {\n return;\n }\n\n const oneOf = rule.oneOf as unknown[];\n for (let idx = 0; idx < oneOf.length; idx += 1) {\n const candidate = oneOf[idx];\n if (candidate && typeof candidate === 'object') {\n const candidateRule = candidate as RuleSetRule;\n const { test } = candidateRule;\n\n const isModuleCssRule =\n test instanceof RegExp && test.source.includes('\\\\.module\\\\.css');\n\n if (isModuleCssRule) {\n const use = normalizeUseItems(candidateRule.use);\n if (use) {\n const hasCssLoader = use.some(\n (item) =>\n isUseLoaderObject(item) && item.loader.includes('css-loader')\n );\n if (hasCssLoader) {\n oneOf.splice(\n idx,\n 0,\n createWywCssModuleRule(candidateRule, extensionSuffix)\n );\n break;\n }\n }\n }\n }\n }\n });\n}\n\nfunction injectWywLoader(\n config: Configuration,\n nextOptions: NextWebpackOptions,\n wywNext: WywNextPluginOptions\n) {\n const loader = nodeRequire.resolve('@wyw-in-js/webpack-loader');\n\n const extension = wywNext.loaderOptions?.extension ?? DEFAULT_EXTENSION;\n\n const userImportOverrides = wywNext.loaderOptions?.importOverrides;\n const importOverrides = userImportOverrides\n ? { ...DEFAULT_REACT_IMPORT_OVERRIDES, ...userImportOverrides }\n : DEFAULT_REACT_IMPORT_OVERRIDES;\n\n const loaderOptions = {\n cssImport: 'import',\n ...wywNext.loaderOptions,\n extension,\n importOverrides,\n sourceMap: wywNext.loaderOptions?.sourceMap ?? nextOptions.dev,\n } satisfies WywWebpackLoaderOptions;\n\n const wywLoaderItem: RuleSetUseItem = {\n loader,\n options: loaderOptions,\n };\n\n traverseRules(config.module?.rules ?? [], (rule) => {\n convertLoaderRuleToUseRule(rule, wywLoaderItem);\n\n const use = normalizeUseItems(rule.use);\n if (!use) return;\n\n const loaders = use.map(getLoaderName);\n\n const alreadyInjected = loaders.some(\n (l) => l === loader || isWywLoaderPath(l)\n );\n if (alreadyInjected) return;\n\n const isNextJsTranspileRule = loaders.some((l) =>\n ['next-swc-loader', 'next-babel-loader', 'babel-loader'].some((needle) =>\n l.includes(needle)\n )\n );\n if (!isNextJsTranspileRule) return;\n\n // Loader order is right-to-left. We want WyW to run first, so it should be last.\n Object.assign(rule, { use: [...use, wywLoaderItem] });\n });\n\n ensureWywCssModuleRules(config, extension);\n}\n\nfunction getInstalledNextVersion(): NextVersion | null {\n try {\n const pkgPath = nodeRequire.resolve('next/package.json', {\n paths: [process.cwd()],\n });\n const pkg = nodeRequire(pkgPath) as { version?: unknown };\n const version = typeof pkg.version === 'string' ? pkg.version : '';\n const [majorPart, minorPart] = version.split('.');\n const major = Number.parseInt(majorPart ?? '', 10);\n const minor = Number.parseInt(minorPart ?? '', 10);\n\n if (!Number.isFinite(major) || !Number.isFinite(minor)) {\n return null;\n }\n\n return { major, minor };\n } catch {\n return null;\n }\n}\n\nfunction shouldUseTurbopackConfig(\n nextConfig: NextConfig,\n nextVersion: NextVersion | null\n) {\n const explicit = (nextConfig as unknown as Record<string, unknown>).turbopack;\n if (typeof explicit !== 'undefined') {\n return true;\n }\n\n return nextVersion !== null && nextVersion.major >= 16;\n}\n\nfunction supportsTurbopackQueryConditions(nextVersion: NextVersion | null) {\n if (nextVersion === null) {\n return false;\n }\n\n return (\n nextVersion.major > 16 ||\n (nextVersion.major === 16 && nextVersion.minor >= 2)\n );\n}\n\nfunction injectWywTurbopackRules(\n nextConfig: NextConfig,\n wywNext: WywNextPluginOptions\n): NextConfig {\n const loader = nodeRequire.resolve('@wyw-in-js/turbopack-loader');\n\n const userOptions = wywNext.turbopackLoaderOptions ?? {};\n\n assertJsonSerializable(userOptions, 'turbopackLoaderOptions');\n\n const turbopackConfig = (nextConfig as unknown as Record<string, unknown>)\n .turbopack;\n const userTurbopack = isPlainObject(turbopackConfig) ? turbopackConfig : {};\n const userExperimental = isPlainObject(nextConfig.experimental)\n ? (nextConfig.experimental as Record<string, unknown>)\n : {};\n const userTurbo = isPlainObject(userExperimental.turbo)\n ? (userExperimental.turbo as Record<string, unknown>)\n : {};\n\n const nativeResolverAlias = toNativeResolverAlias(\n userTurbopack.resolveAlias ?? userTurbo.resolveAlias\n );\n const oxcOptions = mergeOxcResolverAlias(\n userOptions.oxcOptions,\n nativeResolverAlias\n );\n\n const userImportOverrides = isPlainObject(userOptions.importOverrides)\n ? (userOptions.importOverrides as Record<string, unknown>)\n : undefined;\n\n const loaderOptions = {\n sourceMap: process.env.NODE_ENV !== 'production',\n ...userOptions,\n ...(oxcOptions ? { oxcOptions } : {}),\n importOverrides: userImportOverrides\n ? { ...DEFAULT_REACT_IMPORT_OVERRIDES, ...userImportOverrides }\n : DEFAULT_REACT_IMPORT_OVERRIDES,\n };\n\n const nextVersion = getInstalledNextVersion();\n const useTurbopackConfig = shouldUseTurbopackConfig(nextConfig, nextVersion);\n const useCssQueryOutput = supportsTurbopackQueryConditions(nextVersion);\n\n const commonConditions = [\n { not: 'foreign' },\n { not: { path: /(?:^|[\\\\/])middleware\\.[jt]sx?$/ } },\n ];\n\n const jsLoaderOptions = {\n ...loaderOptions,\n cssOutputMode: useCssQueryOutput ? 'query' : 'sidecar',\n };\n\n const ruleValue = useTurbopackConfig\n ? {\n loaders: [{ loader, options: jsLoaderOptions }],\n condition: {\n all: commonConditions,\n },\n }\n : [{ loader, options: jsLoaderOptions }];\n\n const jsRuleValue = {\n loaders: [{ loader, options: jsLoaderOptions }],\n condition: {\n all: [...commonConditions, { not: { query: CSS_OUTPUT_QUERY_RE } }],\n },\n };\n\n const cssRuleValue = {\n loaders: [\n {\n loader,\n options: {\n ...loaderOptions,\n cssOutputMode: 'query',\n outputCss: true,\n },\n },\n ],\n as: '*.module.css',\n condition: {\n all: [...commonConditions, { query: CSS_OUTPUT_QUERY_RE }],\n },\n };\n\n const wywRules = Object.fromEntries(\n DEFAULT_TURBO_RULE_KEYS.map((key) => [\n key,\n useCssQueryOutput ? [cssRuleValue, jsRuleValue] : ruleValue,\n ])\n );\n\n if (useTurbopackConfig) {\n const userRules = isPlainObject(userTurbopack.rules)\n ? (userTurbopack.rules as Record<string, unknown>)\n : {};\n\n return {\n ...nextConfig,\n turbopack: {\n ...userTurbopack,\n rules: {\n ...wywRules,\n ...userRules,\n },\n },\n } as NextConfig;\n }\n\n const userRules = isPlainObject(userTurbo.rules)\n ? (userTurbo.rules as Record<string, unknown>)\n : {};\n\n return {\n ...nextConfig,\n experimental: {\n ...userExperimental,\n turbo: {\n ...userTurbo,\n rules: {\n ...wywRules,\n ...userRules,\n },\n },\n },\n } as NextConfig;\n}\n\nexport function withWyw(\n nextConfig: NextConfig = {},\n wywNext: WywNextPluginOptions = {}\n): NextConfig {\n const userWebpack = nextConfig.webpack;\n\n return {\n ...injectWywTurbopackRules(nextConfig, wywNext),\n webpack(config: Configuration, options: NextWebpackOptions) {\n const resolvedConfig =\n typeof userWebpack === 'function'\n ? userWebpack(config, options)\n : config;\n\n injectWywLoader(resolvedConfig, options, wywNext);\n\n return resolvedConfig;\n },\n };\n}\n"],"file":"index.mjs"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wyw-in-js/nextjs",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@wyw-in-js/shared": "2.
|
|
7
|
-
"@wyw-in-js/turbopack-loader": "2.
|
|
8
|
-
"@wyw-in-js/webpack-loader": "2.
|
|
6
|
+
"@wyw-in-js/shared": "2.1.0",
|
|
7
|
+
"@wyw-in-js/turbopack-loader": "2.1.1",
|
|
8
|
+
"@wyw-in-js/webpack-loader": "2.1.1"
|
|
9
9
|
},
|
|
10
10
|
"devDependencies": {
|
|
11
11
|
"@types/node": "^22.0.0",
|
package/types/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createRequire } from 'module';
|
|
2
2
|
import { mergeOxcResolverAlias, toNativeResolverAlias, } from '@wyw-in-js/shared';
|
|
3
3
|
const DEFAULT_EXTENSION = '.wyw-in-js.module.css';
|
|
4
|
+
const CSS_OUTPUT_QUERY = '__wyw_css';
|
|
5
|
+
const CSS_OUTPUT_QUERY_RE = new RegExp(`^\\??${CSS_OUTPUT_QUERY}$`);
|
|
4
6
|
const DEFAULT_TURBO_RULE_KEYS = ['*.js', '*.jsx', '*.ts', '*.tsx'];
|
|
5
7
|
const DEFAULT_REACT_IMPORT_OVERRIDES = {
|
|
6
8
|
react: { mock: 'react' },
|
|
@@ -228,23 +230,38 @@ function injectWywLoader(config, nextOptions, wywNext) {
|
|
|
228
230
|
});
|
|
229
231
|
ensureWywCssModuleRules(config, extension);
|
|
230
232
|
}
|
|
231
|
-
function
|
|
232
|
-
const explicit = nextConfig.turbopack;
|
|
233
|
-
if (typeof explicit !== 'undefined') {
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
233
|
+
function getInstalledNextVersion() {
|
|
236
234
|
try {
|
|
237
235
|
const pkgPath = nodeRequire.resolve('next/package.json', {
|
|
238
236
|
paths: [process.cwd()],
|
|
239
237
|
});
|
|
240
238
|
const pkg = nodeRequire(pkgPath);
|
|
241
239
|
const version = typeof pkg.version === 'string' ? pkg.version : '';
|
|
242
|
-
const
|
|
243
|
-
|
|
240
|
+
const [majorPart, minorPart] = version.split('.');
|
|
241
|
+
const major = Number.parseInt(majorPart ?? '', 10);
|
|
242
|
+
const minor = Number.parseInt(minorPart ?? '', 10);
|
|
243
|
+
if (!Number.isFinite(major) || !Number.isFinite(minor)) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return { major, minor };
|
|
244
247
|
}
|
|
245
248
|
catch {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function shouldUseTurbopackConfig(nextConfig, nextVersion) {
|
|
253
|
+
const explicit = nextConfig.turbopack;
|
|
254
|
+
if (typeof explicit !== 'undefined') {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
return nextVersion !== null && nextVersion.major >= 16;
|
|
258
|
+
}
|
|
259
|
+
function supportsTurbopackQueryConditions(nextVersion) {
|
|
260
|
+
if (nextVersion === null) {
|
|
246
261
|
return false;
|
|
247
262
|
}
|
|
263
|
+
return (nextVersion.major > 16 ||
|
|
264
|
+
(nextVersion.major === 16 && nextVersion.minor >= 2));
|
|
248
265
|
}
|
|
249
266
|
function injectWywTurbopackRules(nextConfig, wywNext) {
|
|
250
267
|
const loader = nodeRequire.resolve('@wyw-in-js/turbopack-loader');
|
|
@@ -272,19 +289,51 @@ function injectWywTurbopackRules(nextConfig, wywNext) {
|
|
|
272
289
|
? { ...DEFAULT_REACT_IMPORT_OVERRIDES, ...userImportOverrides }
|
|
273
290
|
: DEFAULT_REACT_IMPORT_OVERRIDES,
|
|
274
291
|
};
|
|
275
|
-
const
|
|
292
|
+
const nextVersion = getInstalledNextVersion();
|
|
293
|
+
const useTurbopackConfig = shouldUseTurbopackConfig(nextConfig, nextVersion);
|
|
294
|
+
const useCssQueryOutput = supportsTurbopackQueryConditions(nextVersion);
|
|
295
|
+
const commonConditions = [
|
|
296
|
+
{ not: 'foreign' },
|
|
297
|
+
{ not: { path: /(?:^|[\\/])middleware\.[jt]sx?$/ } },
|
|
298
|
+
];
|
|
299
|
+
const jsLoaderOptions = {
|
|
300
|
+
...loaderOptions,
|
|
301
|
+
cssOutputMode: useCssQueryOutput ? 'query' : 'sidecar',
|
|
302
|
+
};
|
|
276
303
|
const ruleValue = useTurbopackConfig
|
|
277
304
|
? {
|
|
278
|
-
loaders: [{ loader, options:
|
|
305
|
+
loaders: [{ loader, options: jsLoaderOptions }],
|
|
279
306
|
condition: {
|
|
280
|
-
all:
|
|
281
|
-
{ not: 'foreign' },
|
|
282
|
-
{ not: { path: /(?:^|[\\/])middleware\.[jt]sx?$/ } },
|
|
283
|
-
],
|
|
307
|
+
all: commonConditions,
|
|
284
308
|
},
|
|
285
309
|
}
|
|
286
|
-
: [{ loader, options:
|
|
287
|
-
const
|
|
310
|
+
: [{ loader, options: jsLoaderOptions }];
|
|
311
|
+
const jsRuleValue = {
|
|
312
|
+
loaders: [{ loader, options: jsLoaderOptions }],
|
|
313
|
+
condition: {
|
|
314
|
+
all: [...commonConditions, { not: { query: CSS_OUTPUT_QUERY_RE } }],
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
const cssRuleValue = {
|
|
318
|
+
loaders: [
|
|
319
|
+
{
|
|
320
|
+
loader,
|
|
321
|
+
options: {
|
|
322
|
+
...loaderOptions,
|
|
323
|
+
cssOutputMode: 'query',
|
|
324
|
+
outputCss: true,
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
as: '*.module.css',
|
|
329
|
+
condition: {
|
|
330
|
+
all: [...commonConditions, { query: CSS_OUTPUT_QUERY_RE }],
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
const wywRules = Object.fromEntries(DEFAULT_TURBO_RULE_KEYS.map((key) => [
|
|
334
|
+
key,
|
|
335
|
+
useCssQueryOutput ? [cssRuleValue, jsRuleValue] : ruleValue,
|
|
336
|
+
]));
|
|
288
337
|
if (useTurbopackConfig) {
|
|
289
338
|
const userRules = isPlainObject(userTurbopack.rules)
|
|
290
339
|
? userTurbopack.rules
|