{"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 {\n  Configuration,\n  RuleSetRule,\n  RuleSetUseFunction,\n  RuleSetUseItem,\n} 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}$`);\nconst NODE_MODULES_RE = /[\\\\/]node_modules[\\\\/]/;\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};\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 createWywLoaderUseFunction(\n  use: RuleSetUseItem[],\n  loaderItem: RuleSetUseItem\n): RuleSetUseFunction {\n  return ({ realResource, resource }) => {\n    const resourcePath = realResource ?? resource;\n    return resourcePath && NODE_MODULES_RE.test(resourcePath)\n      ? use\n      : [...use, loaderItem];\n  };\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(rule: RuleSetRule) {\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: [{ loader, ...(options !== undefined ? { options } : {}) }],\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 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 &&\n          test.source !== expectedTestSource &&\n          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            const previous = oneOf[idx - 1];\n            const previousIsWywCssRule =\n              previous !== null &&\n              typeof previous === 'object' &&\n              (previous as RuleSetRule).test instanceof RegExp &&\n              ((previous as RuleSetRule).test as RegExp).source ===\n                expectedTestSource;\n\n            if (hasCssLoader && !previousIsWywCssRule) {\n              oneOf.splice(\n                idx,\n                0,\n                createWywCssModuleRule(candidateRule, extensionSuffix)\n              );\n              idx += 1;\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  traverseRules(config.module?.rules ?? [], (rule) => {\n    convertLoaderRuleToUseRule(rule);\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    const wywLoaderItem: RuleSetUseItem = {\n      loader,\n      options: loaderOptions,\n    };\n    const wywLoaderUse = createWywLoaderUseFunction(use, wywLoaderItem);\n\n    // Loader order is right-to-left. We want WyW to run first, so it should be last.\n    Object.assign(rule, { use: wywLoaderUse });\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"}
