next-yak 9.4.2 → 9.5.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.
Files changed (47) hide show
  1. package/dist/context/baseContext.cjs.map +1 -1
  2. package/dist/context/baseContext.js.map +1 -1
  3. package/dist/context/index.cjs +1 -1
  4. package/dist/context/index.cjs.map +1 -1
  5. package/dist/context/index.js.map +1 -1
  6. package/dist/context/index.server.cjs +1 -1
  7. package/dist/context/index.server.cjs.map +1 -1
  8. package/dist/context/index.server.js.map +1 -1
  9. package/dist/index.cjs +1 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/internal.cjs +134 -134
  13. package/dist/internal.cjs.map +1 -1
  14. package/dist/internal.d.cts +133 -134
  15. package/dist/internal.d.ts +133 -134
  16. package/dist/internal.js +133 -133
  17. package/dist/internal.js.map +1 -1
  18. package/dist/isolated-source-eval/index.js.map +1 -1
  19. package/dist/isolated-source-eval/worker.js.map +1 -1
  20. package/dist/jsx-dev-runtime.cjs +1 -1
  21. package/dist/jsx-dev-runtime.d.cts +1 -2
  22. package/dist/jsx-dev-runtime.d.ts +1 -2
  23. package/dist/jsx-runtime.cjs +1 -1
  24. package/dist/jsx-runtime.d.cts +1 -3
  25. package/dist/jsx-runtime.d.ts +1 -3
  26. package/dist/loaders/turbo-loader.cjs +8 -1
  27. package/dist/loaders/turbo-loader.cjs.map +1 -1
  28. package/dist/loaders/vite-plugin.js.map +1 -1
  29. package/dist/loaders/webpack-loader.cjs.map +1 -1
  30. package/dist/rsbuild/index.d.ts +30 -0
  31. package/dist/rsbuild/index.js +52 -0
  32. package/dist/rsbuild/index.js.map +1 -0
  33. package/dist/static/index.cjs +1 -1
  34. package/dist/static/index.cjs.map +1 -1
  35. package/dist/static/index.js +1 -1
  36. package/dist/static/index.js.map +1 -1
  37. package/dist/withYak/index.cjs +7 -3
  38. package/dist/withYak/index.cjs.map +1 -1
  39. package/dist/withYak/index.d.cts +17 -1
  40. package/dist/withYak/index.d.ts +17 -1
  41. package/dist/withYak/index.js +7 -4
  42. package/dist/withYak/index.js.map +1 -1
  43. package/loaders/lib/resolveCrossFileSelectors.ts +8 -9
  44. package/package.json +27 -17
  45. package/rsbuild/index.ts +92 -0
  46. package/withYak/index.ts +15 -3
  47. /package/dist/static/{chunk-WfQuXRBF.js → chunk-DK3Fl9T5.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin.js","names":["relative","transform","swcTransform"],"sources":["../../cross-file-resolver/parseModule.ts","../../cross-file-resolver/Errors.ts","../../cross-file-resolver/resolveCrossFileConstant.ts","../../loaders/lib/debugLogger.ts","../../loaders/lib/extractCss.ts","../../loaders/lib/resolveCrossFileSelectors.ts","../../loaders/vite-plugin.ts"],"sourcesContent":["import { type Cache } from \"./types.js\";\n\nexport async function parseModule(\n context: ParseContext,\n modulePath: string,\n): Promise<ParsedModule> {\n try {\n const isYak =\n modulePath.endsWith(\".yak.ts\") ||\n modulePath.endsWith(\".yak.tsx\") ||\n modulePath.endsWith(\".yak.js\") ||\n modulePath.endsWith(\".yak.jsx\");\n\n // handle yak file by evaluating and mapping exported value to the\n // `ModuleExport` format. This operation is not cached to always get a fresh\n // value from those modules\n if (isYak && context.evaluateYakModule) {\n const yakModule = await context.evaluateYakModule(modulePath);\n const yakExports = objectToModuleExport(yakModule);\n\n return {\n type: \"yak\",\n exports: { importYak: false, named: yakExports, all: [] },\n path: modulePath,\n };\n }\n\n if (context.cache?.parse === undefined) {\n return await uncachedParseModule(context, modulePath);\n }\n\n const cached = context.cache.parse.get(modulePath);\n if (cached === undefined) {\n // We cache the parsed file to avoid re-parsing it.\n // It's ok, that initial parallel requests to the same file will parse it multiple times.\n // This avoid deadlocks do to the fact that we load multiple modules in the chain for cross file references.\n const parsedModule = await uncachedParseModule(context, modulePath);\n\n context.cache.parse.set(modulePath, parsedModule);\n if (context.cache.parse.addDependency) {\n context.cache.parse.addDependency(modulePath, modulePath);\n }\n return parsedModule;\n }\n\n return cached;\n } catch (error) {\n const causeMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Error parsing file \"${modulePath}\"\\n Caused by: ${causeMessage}`);\n }\n}\n\nexport async function uncachedParseModule(\n context: ParseContext,\n modulePath: string,\n): Promise<ParsedModule> {\n const exports = await context.extractExports(modulePath);\n\n // early exit if no yak import was found\n if (!exports.importYak) {\n return {\n type: \"regular\",\n path: modulePath,\n exports,\n };\n }\n\n const transformed = await context.getTransformed(modulePath);\n const mixins = parseMixins(transformed.code);\n const styledComponents = parseStyledComponents(transformed.code, context.transpilationMode);\n\n return {\n type: \"regular\",\n path: modulePath,\n js: transformed,\n exports,\n styledComponents,\n mixins,\n };\n}\n\nfunction parseMixins(sourceContents: string): Record<string, Mixin> {\n // Mixins are always in the following format:\n // /*YAK EXPORTED MIXIN:fancy:aspectRatio:16:9\n // css\n // */\n const mixinParts = sourceContents.split(\"/*YAK EXPORTED MIXIN:\");\n let mixins: Record<string, { type: \"mixin\"; value: string; nameParts: string[] }> = {};\n\n for (let i = 1; i < mixinParts.length; i++) {\n const [comment] = mixinParts[i].split(\"*/\", 1);\n const position = comment.indexOf(\"\\n\");\n const name = comment.slice(0, position);\n const value = comment.slice(position + 1);\n mixins[name] = {\n type: \"mixin\",\n value,\n nameParts: name.split(\":\").map((part) => decodeURIComponent(part)),\n };\n }\n return mixins;\n}\n\nfunction parseStyledComponents(\n sourceContents: string,\n transpilationMode?: \"Css\" | \"CssModule\",\n): Record<string, StyledComponent> {\n // cross-file Styled Components are always in the following format:\n // /*YAK EXPORTED STYLED:ComponentName:ClassName*/\n const styledParts = sourceContents.split(\"/*YAK EXPORTED STYLED:\");\n let styledComponents: Record<string, StyledComponent> = {};\n\n for (let i = 1; i < styledParts.length; i++) {\n const [comment] = styledParts[i].split(\"*/\", 1);\n const [componentName, className] = comment.split(\":\");\n styledComponents[componentName] = {\n type: \"styled-component\",\n nameParts: componentName.split(\".\"),\n value: transpilationMode === \"Css\" ? `.${className}` : `:global(.${className})`,\n };\n }\n\n return styledComponents;\n}\n\nfunction objectToModuleExport(object: object) {\n return Object.fromEntries(\n Object.entries(object).map(([key, value]): [string, ModuleExport] => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return [key, { type: \"constant\" as const, value }];\n } else if (value && (typeof value === \"object\" || Array.isArray(value))) {\n return [key, { type: \"record\" as const, value: objectToModuleExport(value) }];\n } else {\n return [key, { type: \"unsupported\" as const, hint: String(value) }];\n }\n }),\n );\n}\n\nexport type ParseContext = {\n cache?: { parse?: Cache<ParsedModule> };\n transpilationMode?: \"Css\" | \"CssModule\";\n evaluateYakModule?: (\n modulePath: string,\n ) => Promise<Record<string, unknown>> | Record<string, unknown>;\n extractExports: (modulePath: string) => Promise<ModuleExports> | ModuleExports;\n getTransformed: (\n modulePath: string,\n ) => Promise<{ code: string; map?: string }> | { code: string; map?: string };\n};\n\nexport type ModuleExports = {\n importYak: boolean;\n named: Record<string, ModuleExport>;\n all: string[];\n};\n\nexport type ConstantExport = { type: \"constant\"; value: string | number };\nexport type RecordExport = {\n type: \"record\";\n value: Record<string, ModuleExport>;\n};\nexport type UnsupportedExport = {\n type: \"unsupported\";\n hint?: string;\n /**\n * Source location of the offending expression. Populated by the parser\n * when it has access to source text; left undefined for runtime-evaluated\n * yak modules. The error formatter is responsible for any rendering.\n */\n source?: UnsupportedExportSource;\n};\n\nexport type UnsupportedExportSource = {\n /** 1-based line number, 0-based column — same convention as Babel `loc`. */\n start: { line: number; column: number };\n end: { line: number; column: number };\n /** The text of `start.line` from the original source — kept so the\n * error formatter can render a snippet without re-reading the file. */\n lineText: string;\n};\nexport type ReExport = { type: \"re-export\"; name: string; from: string };\nexport type NamespaceReExport = { type: \"namespace-re-export\"; from: string };\nexport type TagTemplateExport = { type: \"tag-template\" };\n\nexport type ModuleExport =\n | ConstantExport\n | TagTemplateExport\n | RecordExport\n | UnsupportedExport\n | ReExport\n | NamespaceReExport;\n\nexport type ParsedModule = {\n path: string;\n exports: ModuleExports;\n} & (\n | {\n type: \"regular\";\n js?: { code: string; map?: string };\n styledComponents?: Record<string, StyledComponent>;\n mixins?: Record<string, Mixin>;\n }\n | {\n type: \"yak\";\n }\n);\n\nexport type StyledComponent = {\n type: \"styled-component\";\n value: string;\n nameParts: string[];\n};\n\nexport type Mixin = { type: \"mixin\"; value: string; nameParts: string[] };\n","export class CauseError extends Error {\n circular?: boolean;\n constructor(message: string, options?: { cause?: unknown }) {\n super(\n `${message}${options?.cause ? `\\n Caused by: ${typeof options.cause === \"object\" && options.cause !== null && \"message\" in options.cause ? options.cause.message : String(options.cause)}` : \"\"}`,\n );\n\n if (options?.cause instanceof CauseError && options.cause.circular) {\n this.circular = true;\n }\n }\n}\n\nexport class ResolveError extends CauseError {}\n\n/**\n * Thrown for `unsupported` exports. Subclassed so the surrounding\n * `resolveModuleExport` catch can recognise that the error already\n * carries its own \"Unable to resolve … in module …\" wrapper and\n * doesn't need another one stacked on top.\n */\nexport class UnsupportedExportError extends ResolveError {}\n\nexport class CircularDependencyError extends CauseError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.circular = true;\n }\n}\n","import type {\n ConstantExport,\n ModuleExport,\n ParsedModule,\n RecordExport,\n UnsupportedExportSource,\n} from \"./parseModule.js\";\nimport { Cache } from \"./types.js\";\nimport {\n CauseError,\n CircularDependencyError,\n ResolveError,\n UnsupportedExportError,\n} from \"./Errors.js\";\n\nconst yakCssImportRegex =\n // Make mixin and selector non optional once we dropped support for the babel plugin\n /--yak-css-import:\\s*url\\(\"([^\"]+)\",?(|mixin|selector)\\)(;?)/g;\n\n/**\n * Resolves cross-file selectors in css files\n *\n * e.g.:\n * theme.ts:\n * ```ts\n * export const colors = {\n * primary: \"#ff0000\",\n * secondary: \"#00ff00\",\n * };\n * ```\n *\n * styles.ts:\n * ```ts\n * import { colors } from \"./theme\";\n * export const button = css`\n * background-color: ${colors.primary};\n * `;\n */\nexport async function resolveCrossFileConstant(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<{ resolved: string; dependencies: string[] }> {\n const resolveCrossFileConstant = context.cache?.resolveCrossFileConstant;\n if (resolveCrossFileConstant === undefined) {\n return uncachedResolveCrossFileConstant(context, filePath, css);\n }\n\n const cacheKey = await sha1(filePath + \":\" + css);\n\n const cached = resolveCrossFileConstant.get(cacheKey);\n\n if (cached === undefined) {\n const resolvedCrossFilConstantPromise = uncachedResolveCrossFileConstant(\n context,\n filePath,\n css,\n );\n resolveCrossFileConstant.set(cacheKey, resolvedCrossFilConstantPromise);\n\n if (resolveCrossFileConstant.addDependency) {\n resolveCrossFileConstant.addDependency(cacheKey, filePath);\n resolvedCrossFilConstantPromise.then((value) => {\n for (const dep of value.dependencies) {\n resolveCrossFileConstant!.addDependency!(cacheKey, dep);\n }\n });\n }\n\n return resolvedCrossFilConstantPromise;\n }\n\n return cached;\n}\n\nexport async function uncachedResolveCrossFileConstant(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<{ resolved: string; dependencies: string[] }> {\n const yakImports = await parseYakCssImport(context, filePath, css);\n\n if (yakImports.length === 0) {\n return { resolved: css, dependencies: [] };\n }\n\n try {\n const dependencies = new Set<string>();\n\n const resolvedValues = await Promise.all(\n yakImports.map(async ({ moduleSpecifier, specifier }) => {\n const { resolved: resolvedModule } = await resolveModule(context, moduleSpecifier);\n\n const resolvedValue = await resolveModuleSpecifierRecursively(\n context,\n resolvedModule,\n specifier,\n );\n\n for (const dependency of resolvedValue.from) {\n dependencies.add(dependency);\n }\n\n return resolvedValue;\n }),\n );\n\n // Replace the imports with the resolved values\n let result = css;\n for (let i = yakImports.length - 1; i >= 0; i--) {\n const { position, size, importKind, specifier, semicolon } = yakImports[i];\n const resolved = resolvedValues[i];\n\n let replacement: string;\n\n if (resolved.type === \"unresolved-tag\") {\n // tag that could not be resolved to styled-components or mixins are\n // interpolated to produce valid CSS with minimal impact (since we don't\n // know what the value should actually be). For mixins (CSS rules) we\n // interpolate an empty string, and for selectors we interpolate\n // \"undefined\" (a selector that would match nothing)\n replacement = importKind === \"mixin\" ? \"\" : \"undefined\";\n } else {\n if (importKind === \"selector\") {\n if (resolved.type !== \"styled-component\" && resolved.type !== \"constant\") {\n throw new Error(\n `Found \"${\n resolved.type\n }\" but expected a selector - did you forget a semicolon after \"${specifier.join(\n \".\",\n )}\"?`,\n );\n }\n }\n\n replacement =\n resolved.type === \"styled-component\"\n ? resolved.value\n : resolved.value +\n // resolved.value can be of two different types:\n // - mixin:\n // ${mixinName};\n // - constant:\n // color: ${value};\n // For mixins the semicolon is already included in the value\n // but for constants it has to be added manually\n ([\"}\", \";\"].includes(String(resolved.value).trimEnd().slice(-1)) ? \"\" : semicolon);\n }\n\n result = result.slice(0, position) + String(replacement) + result.slice(position + size);\n }\n\n return { resolved: result, dependencies: Array.from(dependencies) };\n } catch (error) {\n throw new CauseError(`Error while resolving cross-file selectors in file \"${filePath}\"`, {\n cause: error,\n });\n }\n}\n\n/**\n * Search for --yak-css-import: url(\"path/to/module\") in the css\n */\nasync function parseYakCssImport(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<YakCssImport[]> {\n const yakImports: YakCssImport[] = [];\n\n for (const match of css.matchAll(yakCssImportRegex)) {\n const [fullMatch, encodedArguments, importKind, semicolon] = match;\n const [moduleSpecifier, ...specifier] = encodedArguments\n .split(\":\")\n .map((entry) => decodeURIComponent(entry));\n\n yakImports.push({\n encodedArguments,\n moduleSpecifier: await context.resolve(moduleSpecifier, filePath),\n specifier,\n importKind: importKind as YakImportKind,\n semicolon,\n position: match.index,\n size: fullMatch.length,\n });\n }\n\n return yakImports;\n}\n\nasync function resolveModule(context: ResolveContext, filePath: string) {\n if (context.cache?.resolve === undefined) {\n return uncachedResolveModule(context, filePath);\n }\n\n const cached = context.cache.resolve.get(filePath);\n if (cached === undefined) {\n const resolvedPromise = uncachedResolveModule(context, filePath);\n context.cache.resolve.set(filePath, resolvedPromise);\n\n if (context.cache.resolve.addDependency) {\n context.cache.resolve.addDependency(filePath, filePath);\n resolvedPromise.then((value) => {\n for (const dep of value.dependencies) {\n context.cache!.resolve!.addDependency!(filePath, dep);\n }\n });\n }\n\n return resolvedPromise;\n }\n\n return cached;\n}\n\nasync function uncachedResolveModule(\n context: ResolveContext,\n filePath: string,\n): Promise<{ resolved: ResolvedModule; dependencies: string[] }> {\n const parsedModule = await context.parse(filePath);\n\n const exports = parsedModule.exports as ResolvedExports;\n\n if (parsedModule.type !== \"regular\") {\n return {\n resolved: {\n path: parsedModule.path,\n exports,\n },\n dependencies: [],\n };\n }\n\n const dependencies = new Set<string>();\n\n // Reconcile styled-component \"name\" structure with export structure\n if (parsedModule.styledComponents) {\n Object.values(parsedModule.styledComponents).map((styledComponent) => {\n if (styledComponent.nameParts.length === 1) {\n exports.named[styledComponent.nameParts[0]] = {\n type: \"styled-component\",\n className: styledComponent.value,\n };\n } else {\n let exportEntry = exports.named[styledComponent.nameParts[0]];\n\n if (!exportEntry) {\n exportEntry = { type: \"record\", value: {} };\n exports.named[styledComponent.nameParts[0]] = exportEntry;\n } else if (exportEntry.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${styledComponent.nameParts[0]}\" is not a record`,\n });\n }\n\n let current = exportEntry.value;\n for (let i = 1; i < styledComponent.nameParts.length - 1; i++) {\n let next = current[styledComponent.nameParts[i]];\n if (!next) {\n next = { type: \"record\", value: {} };\n current[styledComponent.nameParts[i]] = next;\n } else if (next.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${styledComponent.nameParts.slice(0, i + 1).join(\".\")}\" is not a record`,\n });\n }\n current = next.value;\n }\n current[styledComponent.nameParts[styledComponent.nameParts.length - 1]] = {\n type: \"styled-component\",\n className: styledComponent.value,\n };\n }\n });\n }\n\n // Recursively resolve cross-file constants in mixins\n // e.g. cross file mixins inside a cross file mixin\n // or a cross file selector inside a cross file mixin\n if (parsedModule.mixins) {\n await Promise.all(\n Object.values(parsedModule.mixins).map(async (mixin) => {\n const { resolved, dependencies: deps } = await resolveCrossFileConstant(\n context,\n parsedModule.path,\n mixin.value,\n );\n\n for (const dep of deps) {\n dependencies.add(dep);\n }\n\n if (mixin.nameParts.length === 1) {\n exports.named[mixin.nameParts[0]] = {\n type: \"mixin\",\n value: resolved,\n };\n } else {\n let exportEntry = exports.named[mixin.nameParts[0]];\n\n if (!exportEntry) {\n exportEntry = { type: \"record\", value: {} };\n exports.named[mixin.nameParts[0]] = exportEntry;\n } else if (exportEntry.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${mixin.nameParts[0]}\" is not a record`,\n });\n }\n\n let current = exportEntry.value;\n for (let i = 1; i < mixin.nameParts.length - 1; i++) {\n let next = current[mixin.nameParts[i]];\n if (!next) {\n next = { type: \"record\", value: {} };\n current[mixin.nameParts[i]] = next;\n } else if (next.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${mixin.nameParts.slice(0, i + 1).join(\".\")}\" is not a record`,\n });\n }\n current = next.value;\n }\n current[mixin.nameParts[mixin.nameParts.length - 1]] = {\n type: \"mixin\",\n value: resolved,\n };\n }\n }),\n );\n }\n return {\n resolved: {\n path: parsedModule.path,\n exports,\n },\n dependencies: Array.from(dependencies),\n };\n}\n\nasync function resolveModuleSpecifierRecursively(\n context: ResolveContext,\n resolvedModule: ResolvedModule,\n specifiers: string[],\n seen = new Set<string>(),\n): Promise<ResolvedCssImport> {\n const exportName = specifiers[0];\n const exportValue = resolvedModule.exports.named[exportName];\n if (exportValue !== undefined) {\n if (seen.has(resolvedModule.path + \":\" + exportName)) {\n throw new CircularDependencyError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n { cause: \"Circular dependency detected\" },\n );\n }\n\n seen.add(resolvedModule.path + \":\" + exportName);\n return resolveModuleExport(context, resolvedModule.path, exportValue, specifiers, seen);\n }\n\n let i = 1;\n for (const from of resolvedModule.exports.all) {\n if (context.exportAllLimit && i++ > context.exportAllLimit) {\n throw new ResolveError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n {\n cause: `More than ${context.exportAllLimit} star exports are not supported for performance reasons`,\n },\n );\n }\n\n try {\n const resolved = await resolveModuleExport(\n context,\n resolvedModule.path,\n {\n type: \"re-export\",\n from,\n name: exportName,\n },\n specifiers,\n seen,\n );\n\n if (seen.has(resolvedModule.path + \":*\")) {\n throw new CircularDependencyError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n { cause: \"Circular dependency detected\" },\n );\n }\n\n seen.add(resolvedModule.path + \":*\");\n\n return resolved;\n } catch (error) {\n // ignore resolve error, it means the specifier was not found in the\n // current module, we just have to continue the loop.\n if (!(error instanceof ResolveError)) {\n throw error;\n }\n // if the cause of the error is a circular dependency down the road do not\n // ignore the error\n if (error.circular) {\n throw error;\n }\n }\n }\n\n throw new ResolveError(`Unable to resolve \"${specifiers.join(\".\")}\"`, {\n cause: `no matching export found in module \"${resolvedModule.path}\"`,\n });\n}\n\nasync function resolveModuleExport(\n context: ResolveContext,\n filePath: string,\n moduleExport: ResolvedExport,\n specifiers: string[],\n seen: Set<string>,\n): Promise<ResolvedCssImport> {\n const failureMessage = `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${filePath}\"`;\n try {\n switch (moduleExport.type) {\n case \"re-export\": {\n const { resolved: reExportedModule } = await resolveModule(\n context,\n await context.resolve(moduleExport.from, filePath),\n );\n const resolved = await resolveModuleSpecifierRecursively(\n context,\n reExportedModule,\n [moduleExport.name, ...specifiers.slice(1)],\n seen,\n );\n if (resolved) {\n resolved.from.push(filePath);\n }\n return resolved;\n }\n case \"namespace-re-export\": {\n const { resolved: reExportedModule } = await resolveModule(\n context,\n await context.resolve(moduleExport.from, filePath),\n );\n const resolved = await resolveModuleSpecifierRecursively(\n context,\n reExportedModule,\n specifiers.slice(1),\n seen,\n );\n if (resolved) {\n resolved.from.push(filePath);\n }\n return resolved;\n }\n case \"styled-component\": {\n return {\n type: \"styled-component\",\n from: [filePath],\n source: filePath,\n name: specifiers[specifiers.length - 1],\n value: moduleExport.className,\n };\n }\n // usually at this point `tag-template` exports where already resolved to\n // styled-components if a matching styled-component comment was generated\n // by yak-swc. So resolving a value to a `tag-template` at this stage\n // would mean that the user tried to use the result of a call to a\n // different tag-template than yak's styled in a template. This is usually\n // invalid.\n //\n // But there is an issue with Nextjs. Next build in two passes, once for\n // the server bundle, once for the client bundle. During the server-side\n // build, each module with the `\"use client\"` directive is transformed to\n // throw errors if the exported symbol are used. This transformation\n // removes the comments generated by `yak-swc`, so instead of the expected\n // `styled-component`, calls to `styled` resolve to a `tag-template`\n // (because no classname was found in the now absent comments).\n //\n // To summarize, if a \"use client\" bundle exports a styled component that\n // is used in a \"standard\" module, the resolve logic would throw with\n // \"unknown type tag-template\".\n //\n // To avoid this error, the resolve logic must handle those `tag-template`\n // with a special type `unresolved-tag`. Those will be interpolated to\n // valid CSS with minimal effect (to avoid CSS syntax error in the case of\n // Nextjs server build)\n case \"tag-template\": {\n return {\n type: \"unresolved-tag\",\n from: [filePath],\n source: filePath,\n name: specifiers[specifiers.length - 1],\n };\n }\n case \"constant\": {\n return {\n type: \"constant\",\n from: [filePath],\n source: filePath,\n value: moduleExport.value,\n };\n }\n case \"record\": {\n const resolvedInRecord = resolveSpecifierInRecord(\n moduleExport,\n specifiers[0],\n specifiers.slice(1),\n );\n return resolveModuleExport(context, filePath, resolvedInRecord, specifiers, seen);\n }\n case \"mixin\": {\n return {\n type: \"mixin\",\n from: [filePath],\n source: filePath,\n value: moduleExport.value,\n };\n }\n case \"unsupported\": {\n throw new UnsupportedExportError(failureMessage, {\n cause: explainUnsupported(\n filePath,\n specifiers.join(\".\"),\n moduleExport.hint,\n moduleExport.source,\n ),\n });\n }\n }\n } catch (error) {\n // UnsupportedExportError already carries this frame's \"Unable to resolve …\"\n // wrapper, so it bubbles up unchanged to avoid duplicating the line.\n if (error instanceof UnsupportedExportError) {\n throw error;\n }\n throw new ResolveError(failureMessage, { cause: error });\n }\n}\n\nfunction explainUnsupported(\n filePath: string,\n specifier: string,\n hint: string | undefined,\n source: UnsupportedExportSource | undefined,\n): string {\n const isYakFile = /\\.yak\\.(?:ts|tsx|js|jsx)$/.test(filePath);\n const docs =\n \"https://yak.js.org/docs/migration-from-styled-components#move-some-code-to-yak-files\";\n const snippet = source ? renderSourceSnippet(filePath, source, hint ?? \"\") : undefined;\n\n const lines: string[] = [];\n if (isYakFile) {\n const got = hint ? ` (got \\`${hint}\\`)` : \"\";\n lines.push(`\\`${specifier}\\` evaluated to a value that cannot be inlined into CSS${got}.`);\n if (snippet) lines.push(snippet);\n lines.push(\n ` help: replace it with a string, number, or plain object/array of those`,\n ` see: ${docs}`,\n );\n return lines.join(\"\\n\");\n }\n\n const got = hint ? ` (got a ${hint})` : \"\";\n lines.push(`\\`${specifier}\\` is not a string or number literal${got}.`);\n if (snippet) lines.push(snippet);\n lines.push(\n ` help: rename \"${filePath}\" to \"${suggestYakFileName(filePath)}\" so its exports run at build time`,\n ` (or replace \\`${specifier}\\` with a literal value)`,\n ` see: ${docs}`,\n );\n return lines.join(\"\\n\");\n}\n\nfunction suggestYakFileName(filePath: string): string {\n const match = filePath.match(/^(.*)\\.(ts|tsx|js|jsx)$/);\n if (!match) return filePath;\n return `${match[1]}.yak.${match[2]}`;\n}\n\n/**\n * Render a Rust-compiler-style snippet from a structural source location:\n *\n * --> /foo/colors.ts:5:18\n * |\n * 5 | export const bg = `var(${v})`;\n * | ^^^^^^^^^^^^ TemplateLiteral\n */\nfunction renderSourceSnippet(\n filePath: string,\n source: UnsupportedExportSource,\n label: string,\n): string {\n const startLine = source.start.line;\n const startCol = source.start.column;\n const sameLine = source.end.line === startLine;\n const caretLen = sameLine\n ? Math.max(1, source.end.column - startCol)\n : Math.max(1, source.lineText.length - startCol);\n\n const lineNumStr = String(startLine);\n const gutterPad = \" \".repeat(lineNumStr.length);\n\n return [\n ` --> ${filePath}:${startLine}:${startCol + 1}`,\n ` ${gutterPad} |`,\n ` ${lineNumStr} | ${source.lineText}`,\n ` ${gutterPad} | ${\" \".repeat(startCol)}${\"^\".repeat(caretLen)} ${label}`,\n ].join(\"\\n\");\n}\n\nfunction resolveSpecifierInRecord(\n record: ExtendedRecordExport,\n name: string,\n specifiers: string[],\n): ConstantExport | ResolvedStyledComponent | ResolvedMixin {\n if (specifiers.length === 0) {\n throw new ResolveError(\"did not expect an object\");\n }\n let depth = 0;\n let current: ResolvedExport = record;\n while (current && current.type === \"record\" && depth < specifiers.length) {\n current = current.value[specifiers[depth]];\n depth += 1;\n }\n\n if (current === undefined || depth !== specifiers.length) {\n throw new ResolveError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in object/array \"${name}\"`,\n { cause: \"path not found\" },\n );\n }\n\n if (\n current.type === \"constant\" ||\n current.type === \"styled-component\" ||\n current.type === \"mixin\"\n ) {\n return current;\n }\n\n // mixins in .yak files are wrapped inside an object with a __yak key\n if (\n current.type === \"record\" &&\n \"__yak\" in current.value &&\n current.value.__yak.type === \"constant\"\n ) {\n return { type: \"mixin\", value: String(current.value.__yak.value) };\n }\n\n throw new ResolveError(`Unable to resolve \"${specifiers.join(\".\")}\" in object/array \"${name}\"`, {\n cause: \"only string and numbers are supported\",\n });\n}\n\n/**\n * hex SHA-1 hash of a message using webcrypto\n * Keeps yak independent from node api (therefore executable in browser)\n */\nasync function sha1(message: string) {\n const resultBuffer = await globalThis.crypto.subtle.digest(\n \"SHA-1\",\n new TextEncoder().encode(message),\n );\n return Array.from(new Uint8Array(resultBuffer), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\ntype ResolvedCssImport =\n | {\n type: \"styled-component\";\n source: string;\n from: string[];\n name: string;\n value: string;\n }\n | {\n type: \"unresolved-tag\";\n source: string;\n from: string[];\n name: string;\n }\n | { type: \"mixin\"; source: string; from: string[]; value: string | number }\n | {\n type: \"constant\";\n source: string;\n from: string[];\n value: string | number;\n };\n\nexport type ResolveContext = {\n parse: (modulePath: string) => Promise<ParsedModule> | ParsedModule;\n cache?: {\n resolve?: Cache<Promise<{ resolved: ResolvedModule; dependencies: string[] }>>;\n resolveCrossFileConstant?: Cache<Promise<{ resolved: string; dependencies: string[] }>>;\n };\n exportAllLimit?: number;\n resolve: (specifier: string, importer: string) => Promise<string> | string;\n};\n\ntype YakImportKind = \"mixin\" | \"selector\";\n\ntype YakCssImport = {\n encodedArguments: string;\n moduleSpecifier: string;\n specifier: string[];\n importKind: YakImportKind;\n semicolon: string;\n position: number;\n size: number;\n};\n\nexport type ExtendedRecordExport = {\n type: \"record\";\n value: Record<string, ResolvedExport>;\n};\n\nexport type ResolvedMixin = { type: \"mixin\"; value: string };\nexport type ResolvedStyledComponent = {\n type: \"styled-component\";\n className: string;\n};\n\nexport type ResolvedExport =\n | Exclude<ModuleExport, RecordExport>\n | ExtendedRecordExport\n | ResolvedStyledComponent\n | ResolvedMixin;\n\nexport type ResolvedExports = {\n named: Record<string, ResolvedExport>;\n all: string[];\n};\n\nexport type ResolvedModule = {\n path: string;\n exports: ResolvedExports;\n};\n","import { relative } from \"path\";\nimport type { YakConfigOptions } from \"../../withYak/index.js\";\n\ntype DebugOptions = Required<YakConfigOptions>[\"experiments\"][\"debug\"];\ntype DebugType = NonNullable<Exclude<DebugOptions, true | undefined>>[\"types\"] extends\n | Array<infer T>\n | undefined\n ? T\n : never;\n\n/**\n * Creates a debug logger function that conditionally logs messages\n * based on debug options and file paths.\n */\nexport function createDebugLogger(debugOptions: DebugOptions | undefined, rootPath: string) {\n if (!debugOptions) {\n return () => {};\n }\n\n throwOnDeprecatedDebugOptions(debugOptions);\n\n // Handle true (log all) vs object (with optional filtering)\n const pattern = debugOptions === true ? undefined : debugOptions.pattern;\n const typesArray = debugOptions === true ? undefined : debugOptions.types;\n\n // Validate and pre-compile regex pattern\n let compiledPattern: RegExp | null = null;\n if (pattern) {\n try {\n compiledPattern = new RegExp(pattern);\n } catch (error) {\n throw new Error(\n `Invalid debug pattern: \"${pattern}\" is not a valid regular expression. ${\n error instanceof Error ? error.message : \"\"\n }`,\n );\n }\n }\n\n const types = typesArray ? new Set(typesArray) : null;\n\n return (\n messageType: DebugType,\n message: string | Buffer<ArrayBufferLike> | undefined,\n filePath: string,\n ) => {\n // Filter by type if specified\n if (types && !types.has(messageType)) {\n return;\n }\n\n const relativePath = relative(rootPath, filePath);\n\n // Filter by pattern if specified, or log all if no pattern\n if (!compiledPattern || compiledPattern.test(relativePath)) {\n console.log(\"🐮 Yak\", `[${messageType}]`, relativePath, \"\\n\\n\", message);\n }\n };\n}\n\n/**\n * Detects deprecated debug option shapes and throws helpful migration errors.\n * TODO: Remove this function in the next major version.\n */\nfunction throwOnDeprecatedDebugOptions(debugOptions: DebugOptions): void {\n // Old API: debug: \"regex-string\"\n if (typeof debugOptions === \"string\") {\n const suggestion =\n suggestTypesForExtensionPattern(debugOptions) ?? `debug: { pattern: \"${debugOptions}\" }`;\n throw new Error(\n `The debug option no longer accepts a string. Please update your config:\\n` +\n ` Before: debug: \"${debugOptions}\"\\n` +\n ` After: ${suggestion}`,\n );\n }\n\n // Old API: debug: { filter: Function, type: string }\n if (typeof debugOptions === \"object\" && \"filter\" in debugOptions) {\n throw new Error(\n `The debug option no longer accepts { filter, type }. Please update your config:\\n` +\n ` Before: debug: { filter: ..., type: \"...\" }\\n` +\n ` After: debug: { pattern: \"...\", types: [\"ts\", \"css\", \"css-resolved\"] }`,\n );\n }\n\n // Old convention: pattern used \".css$\" or \".css-resolved$\" as file extension\n // for type filtering — the pattern now only matches file paths\n if (typeof debugOptions === \"object\" && debugOptions.pattern) {\n const suggestion = suggestTypesForExtensionPattern(debugOptions.pattern);\n if (suggestion) {\n throw new Error(\n `The debug pattern \"${debugOptions.pattern}\" looks like it's filtering by output type using the old file extension convention.\\n` +\n `The pattern now only matches file paths. Use the \"types\" option to filter by output type:\\n` +\n ` Before: debug: { pattern: \"${debugOptions.pattern}\" }\\n` +\n ` After: ${suggestion}`,\n );\n }\n }\n}\n\n/**\n * Checks if a pattern string uses the old \".css$\" / \".css-resolved$\" file\n * extension convention for type filtering. Returns a suggested replacement\n * or null if the pattern doesn't match.\n */\nfunction suggestTypesForExtensionPattern(pattern: string): string | null {\n const extensionMatch = pattern.match(/\\.\\(?(?:css-resolved|css)\\)?\\$?$/);\n if (!extensionMatch) {\n return null;\n }\n const type = extensionMatch[0].includes(\"css-resolved\") ? \"css-resolved\" : \"css\";\n const remaining = pattern.slice(0, extensionMatch.index);\n return remaining\n ? `debug: { pattern: \"${remaining}\", types: [\"${type}\"] }`\n : `debug: { types: [\"${type}\"] }`;\n}\n","import { YakConfigOptions } from \"../../withYak/index.js\";\n\n/**\n * Extracts CSS content from code that contains YAK-generated CSS comments.\n * Parses the input code and returns the extracted CSS, optionally adding\n * a cssmodules directive based on the transpilation mode.\n */\nexport function extractCss(\n code: string | Buffer<ArrayBufferLike>,\n transpilationMode: NonNullable<YakConfigOptions[\"experiments\"]>[\"transpilationMode\"],\n): string {\n let codeString: string;\n\n if (typeof code === \"string\") {\n codeString = code;\n } else if (code instanceof Buffer) {\n codeString = code.toString(\"utf-8\");\n } else if (code instanceof ArrayBuffer) {\n codeString = new TextDecoder(\"utf-8\").decode(code);\n } else {\n throw new Error(\"Invalid input type: code must be string, Buffer, or ArrayBuffer\");\n }\n\n const codeParts = codeString.split(\"/*YAK Extracted CSS:\\n\");\n let result = \"\";\n for (let i = 1; i < codeParts.length; i++) {\n const codeUntilEnd = codeParts[i].split(\"*/\")[0];\n result += codeUntilEnd;\n }\n if (result && transpilationMode !== \"Css\") {\n result = \"/* cssmodules-pure-no-check */\\n\" + result;\n }\n\n return result;\n}\n","import { parse } from \"@babel/parser\";\nimport type { Compilation, LoaderContext } from \"webpack\";\nimport {\n ModuleExport,\n ModuleExports,\n ParseContext,\n ParsedModule,\n UnsupportedExportSource,\n parseModule,\n} from \"../../cross-file-resolver/parseModule.js\";\nimport {\n ResolveContext,\n resolveCrossFileConstant as genericResolveCrossFileConstant,\n} from \"../../cross-file-resolver/resolveCrossFileConstant.js\";\nimport { YakConfigOptions } from \"../../withYak/index.js\";\n\nconst compilationCache = new WeakMap<\n Compilation,\n {\n parsedFiles: Map<string, ParsedModule>;\n }\n>();\n\nexport async function resolveCrossFileConstant(\n loader: LoaderContext<{}>,\n pathContext: string,\n css: string,\n): Promise<string> {\n const { resolved } = await genericResolveCrossFileConstant(\n getResolveContext(loader),\n loader.resourcePath,\n css,\n );\n return resolved;\n}\n\nfunction getCompilationCache(loader: LoaderContext<YakConfigOptions>) {\n const compilation = loader._compilation;\n if (!compilation) {\n throw new Error(\"Webpack compilation object not available\");\n }\n let cache = compilationCache.get(compilation);\n if (!cache) {\n cache = {\n parsedFiles: new Map(),\n };\n compilationCache.set(compilation, cache);\n }\n return cache;\n}\n\nfunction getParseContext(loader: LoaderContext<YakConfigOptions>): ParseContext {\n return {\n cache: { parse: getCompilationCache(loader).parsedFiles },\n async extractExports(modulePath) {\n const sourceContents = new Promise<string>((resolve, reject) =>\n loader.fs.readFile(modulePath, \"utf-8\", (err, result) => {\n if (err) return reject(err);\n resolve(result || \"\");\n }),\n );\n return parseExports(await sourceContents);\n },\n async getTransformed(modulePath) {\n const transformedSource = new Promise<string>((resolve, reject) => {\n loader.loadModule(modulePath, (err, source) => {\n if (err) {\n // When webpack reports \"The loaded module contains errors\",\n // the actual errors are stored on the module in the compilation.\n // Extract and report the real errors for better debugging.\n const compilation = loader._compilation;\n if (compilation) {\n try {\n for (const mod of compilation.modules) {\n if (\"resource\" in mod && mod.resource === modulePath) {\n const errors = mod.getErrors();\n if (errors) {\n const messages = Array.from(errors)\n .map((e) => e.message)\n .filter(Boolean);\n if (messages.length > 0) {\n return reject(new Error(messages.join(\"\\n\")));\n }\n }\n }\n }\n } catch {\n // Ignore errors while trying to extract module errors\n }\n }\n return reject(err);\n }\n let sourceString: string;\n if (typeof source === \"string\") {\n sourceString = source;\n } else if (source instanceof Buffer) {\n sourceString = source.toString(\"utf-8\");\n } else if (source instanceof ArrayBuffer) {\n sourceString = new TextDecoder(\"utf-8\").decode(source);\n } else {\n throw new Error(\"Invalid input type: code must be string, Buffer, or ArrayBuffer\");\n }\n resolve(sourceString || \"\");\n });\n });\n return { code: await transformedSource };\n },\n async evaluateYakModule(modulePath) {\n return loader.importModule(modulePath);\n },\n transpilationMode: loader.getOptions().experiments?.transpilationMode,\n };\n}\n\nfunction getResolveContext(loader: LoaderContext<YakConfigOptions>): ResolveContext {\n const parseContext = getParseContext(loader);\n return {\n parse: (modulePath) => parseModule(parseContext, modulePath),\n resolve: async (specifier, importer) => {\n return resolveModule(loader, specifier, dirname(importer));\n },\n };\n}\n\n/**\n * Resolves a module by wrapping loader.resolve in a promise\n */\nexport async function resolveModule(\n loader: LoaderContext<{}>,\n moduleSpecifier: string,\n context: string,\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n loader.resolve(context, moduleSpecifier, (err, result) => {\n if (err) return reject(err);\n if (!result) return reject(new Error(`Could not resolve ${moduleSpecifier}`));\n resolve(result);\n });\n });\n}\n\nexport async function parseExports(sourceContents: string): Promise<ModuleExports> {\n try {\n const ast = parse(sourceContents, {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"] as const,\n });\n\n // Derive importYak from top-level imports (no traverse needed)\n const importYak = ast.program.body.some(\n (node) => node.type === \"ImportDeclaration\" && node.source.value === \"next-yak\",\n );\n\n const moduleExports: ModuleExports = {\n importYak,\n named: {},\n all: [],\n };\n\n // Track variable declarations for default export lookup\n const variableDeclarations: Record<string, babel.types.Expression> = {};\n let defaultIdentifier: string | null = null;\n\n for (const node of ast.program.body) {\n // Track top-level variable declarations for default export lookup\n if (node.type === \"VariableDeclaration\") {\n for (const decl of node.declarations) {\n if (decl.id.type === \"Identifier\" && decl.init) {\n variableDeclarations[decl.id.name] = decl.init;\n }\n }\n }\n\n if (node.type === \"ExportNamedDeclaration\") {\n if (node.source) {\n // export { x } from \"./file\", export { x as y } from \"./file\"\n for (const specifier of node.specifiers) {\n if (\n specifier.type === \"ExportSpecifier\" &&\n specifier.exported.type === \"Identifier\" &&\n specifier.local.type === \"Identifier\"\n ) {\n moduleExports.named[specifier.exported.name] = {\n type: \"re-export\",\n from: node.source.value,\n name: specifier.local.name,\n };\n }\n // export * as ns from \"./file\"\n if (\n specifier.type === \"ExportNamespaceSpecifier\" &&\n specifier.exported.type === \"Identifier\"\n ) {\n moduleExports.named[specifier.exported.name] = {\n type: \"namespace-re-export\",\n from: node.source.value,\n };\n }\n }\n } else if (node.declaration?.type === \"VariableDeclaration\") {\n // export const x = ...\n for (const declaration of node.declaration.declarations) {\n if (declaration.id.type === \"Identifier\" && declaration.init) {\n variableDeclarations[declaration.id.name] = declaration.init;\n const parsed = parseExportValueExpression(declaration.init, sourceContents);\n if (parsed) {\n moduleExports.named[declaration.id.name] = parsed;\n }\n }\n }\n }\n }\n\n if (node.type === \"ExportDefaultDeclaration\") {\n if (node.declaration.type === \"Identifier\") {\n // e.g. export default variableName;\n // Save the identifier name to look up later\n defaultIdentifier = node.declaration.name;\n } else if (\n node.declaration.type === \"FunctionDeclaration\" ||\n node.declaration.type === \"ClassDeclaration\"\n ) {\n // e.g. export default function() {...} or export default class {...}\n moduleExports.named[\"default\"] = {\n type: \"unsupported\",\n hint: node.declaration.type,\n source: extractUnsupportedSource(node.declaration.loc, sourceContents),\n };\n } else {\n // e.g. export default { ... } or export default \"value\"\n moduleExports.named[\"default\"] = parseExportValueExpression(\n node.declaration as babel.types.Expression,\n sourceContents,\n );\n }\n }\n\n // export * from \"./file\"\n if (node.type === \"ExportAllDeclaration\") {\n moduleExports.all.push(node.source.value);\n }\n }\n\n // If we found a default export that's an identifier, look up its value\n if (defaultIdentifier && variableDeclarations[defaultIdentifier]) {\n moduleExports.named[\"default\"] = parseExportValueExpression(\n variableDeclarations[defaultIdentifier],\n sourceContents,\n );\n }\n\n return moduleExports;\n } catch (error) {\n throw new Error(`Error parsing exports: ${(error as Error).message}`);\n }\n}\n\n/**\n * Unpacks TS type assertions (as, satisfies) to the underlying expression\n */\nfunction unpackTSAsExpression(\n node: babel.types.TSAsExpression | babel.types.Expression,\n): babel.types.Expression {\n if (node.type === \"TSAsExpression\" || node.type === \"TSSatisfiesExpression\") {\n return unpackTSAsExpression((node as babel.types.TSAsExpression).expression);\n }\n return node;\n}\n\nfunction parseExportValueExpression(node: babel.types.Expression, code?: string): ModuleExport {\n // ignores `as` casts so it doesn't interfere with the ast node type detection\n const expression = unpackTSAsExpression(node);\n if (expression.type === \"CallExpression\" || expression.type === \"TaggedTemplateExpression\") {\n return { type: \"tag-template\" };\n } else if (expression.type === \"StringLiteral\" || expression.type === \"NumericLiteral\") {\n return { type: \"constant\", value: expression.value };\n } else if (\n expression.type === \"UnaryExpression\" &&\n expression.operator === \"-\" &&\n expression.argument.type === \"NumericLiteral\"\n ) {\n return { type: \"constant\", value: -expression.argument.value };\n } else if (expression.type === \"TemplateLiteral\" && expression.quasis.length === 1) {\n return { type: \"constant\", value: expression.quasis[0].value.raw };\n } else if (expression.type === \"ObjectExpression\") {\n return {\n type: \"record\",\n value: parseObjectExpression(expression, code),\n };\n }\n return {\n type: \"unsupported\",\n hint: expression.type,\n source: extractUnsupportedSource(expression.loc, code),\n };\n}\n\nfunction parseObjectExpression(\n node: babel.types.ObjectExpression,\n code?: string,\n): Record<string, ModuleExport> {\n let result: Record<string, ModuleExport> = {};\n for (const property of node.properties) {\n if (property.type === \"ObjectProperty\" && property.key.type === \"Identifier\") {\n const key = property.key.name;\n const parsed = parseExportValueExpression(property.value as babel.types.Expression, code);\n if (parsed) {\n result[key] = parsed;\n }\n }\n }\n return result;\n}\n\n/**\n * Pull the structural source-location data the error formatter needs to\n * render a snippet — the formatter (not this parser) is responsible for\n * any presentation. Returns undefined if loc or source text is missing.\n */\nfunction extractUnsupportedSource(\n loc:\n | {\n start: { line: number; column: number };\n end: { line: number; column: number };\n }\n | null\n | undefined,\n code: string | undefined,\n): UnsupportedExportSource | undefined {\n if (!loc || !code) return undefined;\n const lineText = code.split(/\\r?\\n/)[loc.start.line - 1];\n if (lineText === undefined) return undefined;\n return {\n start: { line: loc.start.line, column: loc.start.column },\n end: { line: loc.end.line, column: loc.end.column },\n lineText,\n };\n}\n\nconst DIRNAME_POSIX_REGEX =\n /^((?:\\.(?![^/]))|(?:(?:\\/?|)(?:[\\s\\S]*?)))(?:\\/+?|)(?:(?:\\.{1,2}|[^/]+?|)(?:\\.[^./]*|))(?:[/]*)$/;\nconst DIRNAME_WIN32_REGEX =\n /^((?:\\.(?![^\\\\]))|(?:(?:\\\\?|)(?:[\\s\\S]*?)))(?:\\\\+?|)(?:(?:\\.{1,2}|[^\\\\]+?|)(?:\\.[^.\\\\]*|))(?:[\\\\]*)$/;\n\n/**\n * Polyfill for `node:path` method dirname.\n * Keeps yak independent from node api (therefore executable in browser)\n */\nfunction dirname(path: string) {\n let dirname = DIRNAME_POSIX_REGEX.exec(path)?.[1];\n\n if (!dirname) {\n dirname = DIRNAME_WIN32_REGEX.exec(path)?.[1];\n }\n\n if (!dirname) {\n throw new Error(`Can't extract dirname from ${path}`);\n }\n\n return dirname;\n}\n","import { Options, transform as swcTransform } from \"@swc/core\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, relative, resolve } from \"node:path\";\nimport { normalizePath, type Plugin } from \"vite\";\nimport { parseModule } from \"../cross-file-resolver/parseModule.js\";\nimport { resolveCrossFileConstant } from \"../cross-file-resolver/resolveCrossFileConstant.js\";\nimport { createEvaluator, type Evaluator } from \"../isolated-source-eval/index.js\";\nimport { resolveYakContext, YakConfigOptions } from \"../withYak/index.js\";\nimport { createDebugLogger } from \"./lib/debugLogger.js\";\nimport { extractCss } from \"./lib/extractCss.js\";\nimport { parseExports } from \"./lib/resolveCrossFileSelectors.js\";\nconst require = createRequire(import.meta.url);\n\ntype ViteYakPluginOptions = YakConfigOptions & {\n /**\n * Base path for resolving CSS virtual module paths.\n * Relative paths are resolved from Vite's project root.\n * In monorepo setups where source files live outside the Vite project root,\n * set this to the monorepo root to avoid broken CSS imports.\n * @defaultValue Vite's resolved `root`\n */\n basePath?: string;\n swcOptions?: Omit<\n Options,\n \"filename\" | \"sourceFileName\" | \"inputSourceMap\" | \"sourceMaps\" | \"sourceRoot\"\n >;\n};\n\nconst defaultSwcOptions: ViteYakPluginOptions[\"swcOptions\"] = {\n jsc: {\n parser: {\n syntax: \"typescript\",\n tsx: true,\n decorators: false,\n dynamicImport: true,\n },\n transform: {\n react: {\n runtime: \"preserve\",\n },\n },\n target: \"es2022\",\n loose: false,\n minify: {\n compress: false,\n mangle: false,\n },\n preserveAllComments: true,\n },\n minify: false,\n isModule: true,\n};\n\nexport async function viteYak(userOptions: ViteYakPluginOptions = {}): Promise<Plugin> {\n const yakOptions: ViteYakPluginOptions = {\n experiments: {\n transpilationMode: \"Css\",\n suppressDeprecationWarnings: false,\n ...userOptions.experiments,\n },\n minify: userOptions.minify ?? process.env.NODE_ENV === \"production\",\n prefix: userOptions.prefix,\n contextPath: userOptions.contextPath,\n swcOptions: deepMerge(defaultSwcOptions!, userOptions.swcOptions ?? {}),\n };\n yakOptions.displayNames =\n userOptions.displayNames ?? yakOptions.displayNames ?? !yakOptions.minify;\n let basePath = userOptions.basePath ?? \"\";\n let hasWarnedAboutBasePath = false;\n let debugLog: ReturnType<typeof createDebugLogger> = () => {};\n let isServe = false;\n const sourceFileRegex = /\\.(tsx?|m?jsx?)\\??/;\n const virtualModuleRegex = /^virtual:yak-css:/;\n const virtualCssModuleRegex = /^\\0virtual:yak-css:/;\n const yakSwcPath = await findYakSwcPlugin();\n const evaluator: Evaluator = await createEvaluator();\n return {\n name: \"vite-plugin-yak:css:pre\",\n enforce: \"pre\",\n config: (config) => {\n const context = resolveYakContext(yakOptions.contextPath, config.root ?? process.cwd());\n\n if (!context) {\n return;\n }\n\n config.resolve ||= {};\n\n if (Array.isArray(config.resolve.alias)) {\n config.resolve.alias.push({\n find: \"next-yak/context/baseContext\",\n replacement: context,\n });\n } else {\n config.resolve.alias = {\n ...config.resolve.alias,\n \"next-yak/context/baseContext\": context,\n };\n }\n },\n configResolved(config) {\n basePath = basePath ? resolve(config.root, basePath) : config.root;\n debugLog = createDebugLogger(yakOptions.experiments?.debug, basePath);\n isServe = config.command === \"serve\";\n },\n resolveId: {\n filter: {\n id: virtualModuleRegex,\n },\n handler(id) {\n return \"\\0\" + id;\n },\n },\n load: {\n filter: {\n id: virtualCssModuleRegex,\n },\n async handler(id) {\n // remove \\0virtual:yak-css: (17 chars) from the beginning and .css (4 chars) from the end\n // The path is relative to basePath — resolve to absolute for Vite's file APIs\n const queryStringStart = id.indexOf(\"?\");\n const queryString = queryStringStart === -1 ? \"\" : id.slice(queryStringStart);\n const relativeId = id.slice(17, -4 - queryString.length);\n const originalId = resolve(basePath, relativeId);\n this.addWatchFile(originalId);\n\n const sourceContent = await this.fs.readFile(originalId, {\n encoding: \"utf8\",\n });\n const code = await transform(sourceContent, originalId, basePath, yakSwcPath, yakOptions);\n const extractedCss = extractCss(code.code, \"Css\");\n debugLog(\"css\", extractedCss, originalId);\n\n const { resolved } = await resolveCrossFileConstant(\n {\n parse: (modulePath) => {\n return parseModule(\n {\n transpilationMode: \"Css\",\n extractExports: async (modulePath) => {\n const sourceContent = await this.fs.readFile(modulePath, {\n encoding: \"utf8\",\n });\n\n this.addWatchFile(modulePath);\n\n return parseExports(sourceContent);\n },\n getTransformed: async (modulePath) => {\n const sourceContent = await this.fs.readFile(modulePath, {\n encoding: \"utf8\",\n });\n return transform(sourceContent, modulePath, basePath, yakSwcPath, yakOptions);\n },\n evaluateYakModule: async (modulePath: string) => {\n this.addWatchFile(modulePath);\n const result = await evaluator.evaluate(modulePath);\n if (!result.ok) {\n throw new Error(result.error.message);\n }\n for (const dep of result.dependencies) {\n this.addWatchFile(dep);\n }\n return result.value;\n },\n },\n modulePath,\n );\n },\n resolve: async (moduleSpecifier: string, context: string) => {\n let importer = context;\n const resolved = await this.resolve(moduleSpecifier, importer);\n\n if (!resolved) {\n throw new Error(`Could not resolve ${moduleSpecifier} from ${context}`);\n }\n return resolved.id;\n },\n },\n originalId + queryString,\n extractedCss,\n );\n\n debugLog(\"css-resolved\", resolved, originalId);\n return resolved;\n },\n },\n\n configureServer(server) {\n server.watcher.on(\"change\", (file) => {\n evaluator.invalidate(file);\n });\n },\n\n transform: {\n filter: {\n id: {\n include: sourceFileRegex,\n exclude: [/packages\\/next-yak/],\n },\n code: \"next-yak\",\n },\n async handler(code, id) {\n try {\n const filePath = id.split(\"?\")[0];\n if (!hasWarnedAboutBasePath) {\n const relPath = relative(basePath, filePath);\n if (relPath.startsWith(\"..\")) {\n hasWarnedAboutBasePath = true;\n console.warn(\n `[next-yak] Source file \"${filePath}\" is outside the project root \"${basePath}\".\\n` +\n `This may cause CSS resolution issues in monorepo setups.\\n` +\n `Set the \"basePath\" option to your monorepo root:\\n\\n` +\n ` viteYak({ basePath: \"/absolute/path/to/monorepo/root\" })\\n`,\n );\n }\n }\n const result = await transform(code, filePath, basePath, yakSwcPath, yakOptions, isServe);\n debugLog(\"ts\", result.code, id);\n\n return {\n code: result.code,\n map: result.map,\n };\n } catch (error) {\n this.error(`[YAK Plugin] Error transforming ${id}: ${(error as Error).message}`);\n }\n },\n },\n\n // Vite's default HMR only updates the JS module when a source file changes.\n // The extracted CSS lives in a separate virtual module (virtual:yak-css:...)\n // which Vite doesn't know is derived from the source file. Without explicit\n // invalidation here, the browser keeps stale CSS after edits.\n hotUpdate({ modules, file, type }) {\n if (type !== \"update\" && type !== \"create\") return;\n if (!sourceFileRegex.test(file)) return;\n\n // The SWC plugin generates virtual module paths relative to basePath\n // (via {{__MODULE_PATH__}}), so we must match that format.\n const relativePath = normalizePath(relative(basePath, file));\n const virtualId = \"\\0virtual:yak-css:\" + relativePath + \".css\";\n const mod = this.environment.moduleGraph.getModuleById(virtualId);\n if (mod) {\n this.environment.moduleGraph.invalidateModule(mod);\n return [...modules, mod];\n }\n },\n };\n}\n\n/**\n * This function finds the path to the yak-swc plugin because it is most of the time a transitive dependency\n * and the resolver of SWC only resolves the main node_modules directory.\n * @returns The path to the yak-swc wasm plugin.\n */\nasync function findYakSwcPlugin() {\n try {\n const packageJsonPath = require.resolve(\"yak-swc/package.json\");\n const packageRoot = dirname(packageJsonPath);\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n\n // Resolve the main field which points to the WASM file\n const wasmPath = resolve(packageRoot, packageJson.main);\n\n return wasmPath;\n } catch (e) {\n throw new Error(`Could not resolve yak-swc plugin: ${e}`);\n }\n}\n\nfunction transform(\n data: string,\n modulePath: string,\n rootPath: string,\n yakSwcPath: string,\n yakOptions: ViteYakPluginOptions,\n reactRefreshReg?: boolean,\n) {\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/loaders/next-swc-loader.ts#L143\n return swcTransform(data, {\n filename: modulePath,\n inputSourceMap: undefined,\n sourceMaps: true,\n sourceFileName: modulePath,\n sourceRoot: rootPath,\n ...yakOptions.swcOptions,\n jsc: {\n ...yakOptions.swcOptions?.jsc,\n experimental: {\n plugins: [\n [\n yakSwcPath,\n {\n minify: yakOptions.minify,\n basePath: rootPath,\n prefix: yakOptions.prefix,\n displayNames: yakOptions.displayNames,\n suppressDeprecationWarnings: yakOptions.experiments?.suppressDeprecationWarnings,\n ...(reactRefreshReg ? { reactRefreshReg: true } : {}),\n importMode: {\n value: \"virtual:yak-css:{{__MODULE_PATH__}}.css\",\n transpilation: \"Css\",\n encoding: \"None\",\n },\n },\n ],\n ],\n },\n },\n });\n}\n\n/**\n * Deep merge two objects, with source values overriding target values.\n */\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = target[key];\n if (\n sourceValue !== undefined &&\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === \"object\" &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[keyof T];\n }\n }\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite-plugin.js","names":["relative","transform","swcTransform"],"sources":["../../cross-file-resolver/parseModule.ts","../../cross-file-resolver/Errors.ts","../../cross-file-resolver/resolveCrossFileConstant.ts","../../loaders/lib/debugLogger.ts","../../loaders/lib/extractCss.ts","../../loaders/lib/resolveCrossFileSelectors.ts","../../loaders/vite-plugin.ts"],"sourcesContent":["import { type Cache } from \"./types.js\";\n\nexport async function parseModule(\n context: ParseContext,\n modulePath: string,\n): Promise<ParsedModule> {\n try {\n const isYak =\n modulePath.endsWith(\".yak.ts\") ||\n modulePath.endsWith(\".yak.tsx\") ||\n modulePath.endsWith(\".yak.js\") ||\n modulePath.endsWith(\".yak.jsx\");\n\n // handle yak file by evaluating and mapping exported value to the\n // `ModuleExport` format. This operation is not cached to always get a fresh\n // value from those modules\n if (isYak && context.evaluateYakModule) {\n const yakModule = await context.evaluateYakModule(modulePath);\n const yakExports = objectToModuleExport(yakModule);\n\n return {\n type: \"yak\",\n exports: { importYak: false, named: yakExports, all: [] },\n path: modulePath,\n };\n }\n\n if (context.cache?.parse === undefined) {\n return await uncachedParseModule(context, modulePath);\n }\n\n const cached = context.cache.parse.get(modulePath);\n if (cached === undefined) {\n // We cache the parsed file to avoid re-parsing it.\n // It's ok, that initial parallel requests to the same file will parse it multiple times.\n // This avoid deadlocks do to the fact that we load multiple modules in the chain for cross file references.\n const parsedModule = await uncachedParseModule(context, modulePath);\n\n context.cache.parse.set(modulePath, parsedModule);\n if (context.cache.parse.addDependency) {\n context.cache.parse.addDependency(modulePath, modulePath);\n }\n return parsedModule;\n }\n\n return cached;\n } catch (error) {\n const causeMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Error parsing file \"${modulePath}\"\\n Caused by: ${causeMessage}`);\n }\n}\n\nexport async function uncachedParseModule(\n context: ParseContext,\n modulePath: string,\n): Promise<ParsedModule> {\n const exports = await context.extractExports(modulePath);\n\n // early exit if no yak import was found\n if (!exports.importYak) {\n return {\n type: \"regular\",\n path: modulePath,\n exports,\n };\n }\n\n const transformed = await context.getTransformed(modulePath);\n const mixins = parseMixins(transformed.code);\n const styledComponents = parseStyledComponents(transformed.code, context.transpilationMode);\n\n return {\n type: \"regular\",\n path: modulePath,\n js: transformed,\n exports,\n styledComponents,\n mixins,\n };\n}\n\nfunction parseMixins(sourceContents: string): Record<string, Mixin> {\n // Mixins are always in the following format:\n // /*YAK EXPORTED MIXIN:fancy:aspectRatio:16:9\n // css\n // */\n const mixinParts = sourceContents.split(\"/*YAK EXPORTED MIXIN:\");\n let mixins: Record<string, { type: \"mixin\"; value: string; nameParts: string[] }> = {};\n\n for (let i = 1; i < mixinParts.length; i++) {\n const [comment] = mixinParts[i].split(\"*/\", 1);\n const position = comment.indexOf(\"\\n\");\n const name = comment.slice(0, position);\n const value = comment.slice(position + 1);\n mixins[name] = {\n type: \"mixin\",\n value,\n nameParts: name.split(\":\").map((part) => decodeURIComponent(part)),\n };\n }\n return mixins;\n}\n\nfunction parseStyledComponents(\n sourceContents: string,\n transpilationMode?: \"Css\" | \"CssModule\",\n): Record<string, StyledComponent> {\n // cross-file Styled Components are always in the following format:\n // /*YAK EXPORTED STYLED:ComponentName:ClassName*/\n const styledParts = sourceContents.split(\"/*YAK EXPORTED STYLED:\");\n let styledComponents: Record<string, StyledComponent> = {};\n\n for (let i = 1; i < styledParts.length; i++) {\n const [comment] = styledParts[i].split(\"*/\", 1);\n const [componentName, className] = comment.split(\":\");\n styledComponents[componentName] = {\n type: \"styled-component\",\n nameParts: componentName.split(\".\"),\n value: transpilationMode === \"Css\" ? `.${className}` : `:global(.${className})`,\n };\n }\n\n return styledComponents;\n}\n\nfunction objectToModuleExport(object: object) {\n return Object.fromEntries(\n Object.entries(object).map(([key, value]): [string, ModuleExport] => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n return [key, { type: \"constant\" as const, value }];\n } else if (value && (typeof value === \"object\" || Array.isArray(value))) {\n return [key, { type: \"record\" as const, value: objectToModuleExport(value) }];\n } else {\n return [key, { type: \"unsupported\" as const, hint: String(value) }];\n }\n }),\n );\n}\n\nexport type ParseContext = {\n cache?: { parse?: Cache<ParsedModule> };\n transpilationMode?: \"Css\" | \"CssModule\";\n evaluateYakModule?: (\n modulePath: string,\n ) => Promise<Record<string, unknown>> | Record<string, unknown>;\n extractExports: (modulePath: string) => Promise<ModuleExports> | ModuleExports;\n getTransformed: (\n modulePath: string,\n ) => Promise<{ code: string; map?: string }> | { code: string; map?: string };\n};\n\nexport type ModuleExports = {\n importYak: boolean;\n named: Record<string, ModuleExport>;\n all: string[];\n};\n\nexport type ConstantExport = { type: \"constant\"; value: string | number };\nexport type RecordExport = {\n type: \"record\";\n value: Record<string, ModuleExport>;\n};\nexport type UnsupportedExport = {\n type: \"unsupported\";\n hint?: string;\n /**\n * Source location of the offending expression. Populated by the parser\n * when it has access to source text; left undefined for runtime-evaluated\n * yak modules. The error formatter is responsible for any rendering.\n */\n source?: UnsupportedExportSource;\n};\n\nexport type UnsupportedExportSource = {\n /** 1-based line number, 0-based column — same convention as Babel `loc`. */\n start: { line: number; column: number };\n end: { line: number; column: number };\n /** The text of `start.line` from the original source — kept so the\n * error formatter can render a snippet without re-reading the file. */\n lineText: string;\n};\nexport type ReExport = { type: \"re-export\"; name: string; from: string };\nexport type NamespaceReExport = { type: \"namespace-re-export\"; from: string };\nexport type TagTemplateExport = { type: \"tag-template\" };\n\nexport type ModuleExport =\n | ConstantExport\n | TagTemplateExport\n | RecordExport\n | UnsupportedExport\n | ReExport\n | NamespaceReExport;\n\nexport type ParsedModule = {\n path: string;\n exports: ModuleExports;\n} & (\n | {\n type: \"regular\";\n js?: { code: string; map?: string };\n styledComponents?: Record<string, StyledComponent>;\n mixins?: Record<string, Mixin>;\n }\n | {\n type: \"yak\";\n }\n);\n\nexport type StyledComponent = {\n type: \"styled-component\";\n value: string;\n nameParts: string[];\n};\n\nexport type Mixin = { type: \"mixin\"; value: string; nameParts: string[] };\n","export class CauseError extends Error {\n circular?: boolean;\n constructor(message: string, options?: { cause?: unknown }) {\n super(\n `${message}${options?.cause ? `\\n Caused by: ${typeof options.cause === \"object\" && options.cause !== null && \"message\" in options.cause ? options.cause.message : String(options.cause)}` : \"\"}`,\n );\n\n if (options?.cause instanceof CauseError && options.cause.circular) {\n this.circular = true;\n }\n }\n}\n\nexport class ResolveError extends CauseError {}\n\n/**\n * Thrown for `unsupported` exports. Subclassed so the surrounding\n * `resolveModuleExport` catch can recognise that the error already\n * carries its own \"Unable to resolve … in module …\" wrapper and\n * doesn't need another one stacked on top.\n */\nexport class UnsupportedExportError extends ResolveError {}\n\nexport class CircularDependencyError extends CauseError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.circular = true;\n }\n}\n","import type {\n ConstantExport,\n ModuleExport,\n ParsedModule,\n RecordExport,\n UnsupportedExportSource,\n} from \"./parseModule.js\";\nimport { Cache } from \"./types.js\";\nimport {\n CauseError,\n CircularDependencyError,\n ResolveError,\n UnsupportedExportError,\n} from \"./Errors.js\";\n\nconst yakCssImportRegex =\n // Make mixin and selector non optional once we dropped support for the babel plugin\n /--yak-css-import:\\s*url\\(\"([^\"]+)\",?(|mixin|selector)\\)(;?)/g;\n\n/**\n * Resolves cross-file selectors in css files\n *\n * e.g.:\n * theme.ts:\n * ```ts\n * export const colors = {\n * primary: \"#ff0000\",\n * secondary: \"#00ff00\",\n * };\n * ```\n *\n * styles.ts:\n * ```ts\n * import { colors } from \"./theme\";\n * export const button = css`\n * background-color: ${colors.primary};\n * `;\n */\nexport async function resolveCrossFileConstant(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<{ resolved: string; dependencies: string[] }> {\n const resolveCrossFileConstant = context.cache?.resolveCrossFileConstant;\n if (resolveCrossFileConstant === undefined) {\n return uncachedResolveCrossFileConstant(context, filePath, css);\n }\n\n const cacheKey = await sha1(filePath + \":\" + css);\n\n const cached = resolveCrossFileConstant.get(cacheKey);\n\n if (cached === undefined) {\n const resolvedCrossFilConstantPromise = uncachedResolveCrossFileConstant(\n context,\n filePath,\n css,\n );\n resolveCrossFileConstant.set(cacheKey, resolvedCrossFilConstantPromise);\n\n if (resolveCrossFileConstant.addDependency) {\n resolveCrossFileConstant.addDependency(cacheKey, filePath);\n resolvedCrossFilConstantPromise.then((value) => {\n for (const dep of value.dependencies) {\n resolveCrossFileConstant!.addDependency!(cacheKey, dep);\n }\n });\n }\n\n return resolvedCrossFilConstantPromise;\n }\n\n return cached;\n}\n\nexport async function uncachedResolveCrossFileConstant(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<{ resolved: string; dependencies: string[] }> {\n const yakImports = await parseYakCssImport(context, filePath, css);\n\n if (yakImports.length === 0) {\n return { resolved: css, dependencies: [] };\n }\n\n try {\n const dependencies = new Set<string>();\n\n const resolvedValues = await Promise.all(\n yakImports.map(async ({ moduleSpecifier, specifier }) => {\n const { resolved: resolvedModule } = await resolveModule(context, moduleSpecifier);\n\n const resolvedValue = await resolveModuleSpecifierRecursively(\n context,\n resolvedModule,\n specifier,\n );\n\n for (const dependency of resolvedValue.from) {\n dependencies.add(dependency);\n }\n\n return resolvedValue;\n }),\n );\n\n // Replace the imports with the resolved values\n let result = css;\n for (let i = yakImports.length - 1; i >= 0; i--) {\n const { position, size, importKind, specifier, semicolon } = yakImports[i];\n const resolved = resolvedValues[i];\n\n let replacement: string;\n\n if (resolved.type === \"unresolved-tag\") {\n // tag that could not be resolved to styled-components or mixins are\n // interpolated to produce valid CSS with minimal impact (since we don't\n // know what the value should actually be). For mixins (CSS rules) we\n // interpolate an empty string, and for selectors we interpolate\n // \"undefined\" (a selector that would match nothing)\n replacement = importKind === \"mixin\" ? \"\" : \"undefined\";\n } else {\n if (importKind === \"selector\") {\n if (resolved.type !== \"styled-component\" && resolved.type !== \"constant\") {\n throw new Error(\n `Found \"${\n resolved.type\n }\" but expected a selector - did you forget a semicolon after \"${specifier.join(\n \".\",\n )}\"?`,\n );\n }\n }\n\n replacement =\n resolved.type === \"styled-component\"\n ? resolved.value\n : resolved.value +\n // resolved.value can be of two different types:\n // - mixin:\n // ${mixinName};\n // - constant:\n // color: ${value};\n // For mixins the semicolon is already included in the value\n // but for constants it has to be added manually\n ([\"}\", \";\"].includes(String(resolved.value).trimEnd().slice(-1)) ? \"\" : semicolon);\n }\n\n result = result.slice(0, position) + String(replacement) + result.slice(position + size);\n }\n\n return { resolved: result, dependencies: Array.from(dependencies) };\n } catch (error) {\n throw new CauseError(`Error while resolving cross-file selectors in file \"${filePath}\"`, {\n cause: error,\n });\n }\n}\n\n/**\n * Search for --yak-css-import: url(\"path/to/module\") in the css\n */\nasync function parseYakCssImport(\n context: ResolveContext,\n filePath: string,\n css: string,\n): Promise<YakCssImport[]> {\n const yakImports: YakCssImport[] = [];\n\n for (const match of css.matchAll(yakCssImportRegex)) {\n const [fullMatch, encodedArguments, importKind, semicolon] = match;\n const [moduleSpecifier, ...specifier] = encodedArguments\n .split(\":\")\n .map((entry) => decodeURIComponent(entry));\n\n yakImports.push({\n encodedArguments,\n moduleSpecifier: await context.resolve(moduleSpecifier, filePath),\n specifier,\n importKind: importKind as YakImportKind,\n semicolon,\n position: match.index,\n size: fullMatch.length,\n });\n }\n\n return yakImports;\n}\n\nasync function resolveModule(context: ResolveContext, filePath: string) {\n if (context.cache?.resolve === undefined) {\n return uncachedResolveModule(context, filePath);\n }\n\n const cached = context.cache.resolve.get(filePath);\n if (cached === undefined) {\n const resolvedPromise = uncachedResolveModule(context, filePath);\n context.cache.resolve.set(filePath, resolvedPromise);\n\n if (context.cache.resolve.addDependency) {\n context.cache.resolve.addDependency(filePath, filePath);\n resolvedPromise.then((value) => {\n for (const dep of value.dependencies) {\n context.cache!.resolve!.addDependency!(filePath, dep);\n }\n });\n }\n\n return resolvedPromise;\n }\n\n return cached;\n}\n\nasync function uncachedResolveModule(\n context: ResolveContext,\n filePath: string,\n): Promise<{ resolved: ResolvedModule; dependencies: string[] }> {\n const parsedModule = await context.parse(filePath);\n\n const exports = parsedModule.exports as ResolvedExports;\n\n if (parsedModule.type !== \"regular\") {\n return {\n resolved: {\n path: parsedModule.path,\n exports,\n },\n dependencies: [],\n };\n }\n\n const dependencies = new Set<string>();\n\n // Reconcile styled-component \"name\" structure with export structure\n if (parsedModule.styledComponents) {\n Object.values(parsedModule.styledComponents).map((styledComponent) => {\n if (styledComponent.nameParts.length === 1) {\n exports.named[styledComponent.nameParts[0]] = {\n type: \"styled-component\",\n className: styledComponent.value,\n };\n } else {\n let exportEntry = exports.named[styledComponent.nameParts[0]];\n\n if (!exportEntry) {\n exportEntry = { type: \"record\", value: {} };\n exports.named[styledComponent.nameParts[0]] = exportEntry;\n } else if (exportEntry.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${styledComponent.nameParts[0]}\" is not a record`,\n });\n }\n\n let current = exportEntry.value;\n for (let i = 1; i < styledComponent.nameParts.length - 1; i++) {\n let next = current[styledComponent.nameParts[i]];\n if (!next) {\n next = { type: \"record\", value: {} };\n current[styledComponent.nameParts[i]] = next;\n } else if (next.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${styledComponent.nameParts.slice(0, i + 1).join(\".\")}\" is not a record`,\n });\n }\n current = next.value;\n }\n current[styledComponent.nameParts[styledComponent.nameParts.length - 1]] = {\n type: \"styled-component\",\n className: styledComponent.value,\n };\n }\n });\n }\n\n // Recursively resolve cross-file constants in mixins\n // e.g. cross file mixins inside a cross file mixin\n // or a cross file selector inside a cross file mixin\n if (parsedModule.mixins) {\n await Promise.all(\n Object.values(parsedModule.mixins).map(async (mixin) => {\n const { resolved, dependencies: deps } = await resolveCrossFileConstant(\n context,\n parsedModule.path,\n mixin.value,\n );\n\n for (const dep of deps) {\n dependencies.add(dep);\n }\n\n if (mixin.nameParts.length === 1) {\n exports.named[mixin.nameParts[0]] = {\n type: \"mixin\",\n value: resolved,\n };\n } else {\n let exportEntry = exports.named[mixin.nameParts[0]];\n\n if (!exportEntry) {\n exportEntry = { type: \"record\", value: {} };\n exports.named[mixin.nameParts[0]] = exportEntry;\n } else if (exportEntry.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${mixin.nameParts[0]}\" is not a record`,\n });\n }\n\n let current = exportEntry.value;\n for (let i = 1; i < mixin.nameParts.length - 1; i++) {\n let next = current[mixin.nameParts[i]];\n if (!next) {\n next = { type: \"record\", value: {} };\n current[mixin.nameParts[i]] = next;\n } else if (next.type !== \"record\") {\n throw new CauseError(`Error parsing file \"${parsedModule.path}\"`, {\n cause: `\"${mixin.nameParts.slice(0, i + 1).join(\".\")}\" is not a record`,\n });\n }\n current = next.value;\n }\n current[mixin.nameParts[mixin.nameParts.length - 1]] = {\n type: \"mixin\",\n value: resolved,\n };\n }\n }),\n );\n }\n return {\n resolved: {\n path: parsedModule.path,\n exports,\n },\n dependencies: Array.from(dependencies),\n };\n}\n\nasync function resolveModuleSpecifierRecursively(\n context: ResolveContext,\n resolvedModule: ResolvedModule,\n specifiers: string[],\n seen = new Set<string>(),\n): Promise<ResolvedCssImport> {\n const exportName = specifiers[0];\n const exportValue = resolvedModule.exports.named[exportName];\n if (exportValue !== undefined) {\n if (seen.has(resolvedModule.path + \":\" + exportName)) {\n throw new CircularDependencyError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n { cause: \"Circular dependency detected\" },\n );\n }\n\n seen.add(resolvedModule.path + \":\" + exportName);\n return resolveModuleExport(context, resolvedModule.path, exportValue, specifiers, seen);\n }\n\n let i = 1;\n for (const from of resolvedModule.exports.all) {\n if (context.exportAllLimit && i++ > context.exportAllLimit) {\n throw new ResolveError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n {\n cause: `More than ${context.exportAllLimit} star exports are not supported for performance reasons`,\n },\n );\n }\n\n try {\n const resolved = await resolveModuleExport(\n context,\n resolvedModule.path,\n {\n type: \"re-export\",\n from,\n name: exportName,\n },\n specifiers,\n seen,\n );\n\n if (seen.has(resolvedModule.path + \":*\")) {\n throw new CircularDependencyError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${resolvedModule.path}\"`,\n { cause: \"Circular dependency detected\" },\n );\n }\n\n seen.add(resolvedModule.path + \":*\");\n\n return resolved;\n } catch (error) {\n // ignore resolve error, it means the specifier was not found in the\n // current module, we just have to continue the loop.\n if (!(error instanceof ResolveError)) {\n throw error;\n }\n // if the cause of the error is a circular dependency down the road do not\n // ignore the error\n if (error.circular) {\n throw error;\n }\n }\n }\n\n throw new ResolveError(`Unable to resolve \"${specifiers.join(\".\")}\"`, {\n cause: `no matching export found in module \"${resolvedModule.path}\"`,\n });\n}\n\nasync function resolveModuleExport(\n context: ResolveContext,\n filePath: string,\n moduleExport: ResolvedExport,\n specifiers: string[],\n seen: Set<string>,\n): Promise<ResolvedCssImport> {\n const failureMessage = `Unable to resolve \"${specifiers.join(\".\")}\" in module \"${filePath}\"`;\n try {\n switch (moduleExport.type) {\n case \"re-export\": {\n const { resolved: reExportedModule } = await resolveModule(\n context,\n await context.resolve(moduleExport.from, filePath),\n );\n const resolved = await resolveModuleSpecifierRecursively(\n context,\n reExportedModule,\n [moduleExport.name, ...specifiers.slice(1)],\n seen,\n );\n if (resolved) {\n resolved.from.push(filePath);\n }\n return resolved;\n }\n case \"namespace-re-export\": {\n const { resolved: reExportedModule } = await resolveModule(\n context,\n await context.resolve(moduleExport.from, filePath),\n );\n const resolved = await resolveModuleSpecifierRecursively(\n context,\n reExportedModule,\n specifiers.slice(1),\n seen,\n );\n if (resolved) {\n resolved.from.push(filePath);\n }\n return resolved;\n }\n case \"styled-component\": {\n return {\n type: \"styled-component\",\n from: [filePath],\n source: filePath,\n name: specifiers[specifiers.length - 1],\n value: moduleExport.className,\n };\n }\n // usually at this point `tag-template` exports where already resolved to\n // styled-components if a matching styled-component comment was generated\n // by yak-swc. So resolving a value to a `tag-template` at this stage\n // would mean that the user tried to use the result of a call to a\n // different tag-template than yak's styled in a template. This is usually\n // invalid.\n //\n // But there is an issue with Nextjs. Next build in two passes, once for\n // the server bundle, once for the client bundle. During the server-side\n // build, each module with the `\"use client\"` directive is transformed to\n // throw errors if the exported symbol are used. This transformation\n // removes the comments generated by `yak-swc`, so instead of the expected\n // `styled-component`, calls to `styled` resolve to a `tag-template`\n // (because no classname was found in the now absent comments).\n //\n // To summarize, if a \"use client\" bundle exports a styled component that\n // is used in a \"standard\" module, the resolve logic would throw with\n // \"unknown type tag-template\".\n //\n // To avoid this error, the resolve logic must handle those `tag-template`\n // with a special type `unresolved-tag`. Those will be interpolated to\n // valid CSS with minimal effect (to avoid CSS syntax error in the case of\n // Nextjs server build)\n case \"tag-template\": {\n return {\n type: \"unresolved-tag\",\n from: [filePath],\n source: filePath,\n name: specifiers[specifiers.length - 1],\n };\n }\n case \"constant\": {\n return {\n type: \"constant\",\n from: [filePath],\n source: filePath,\n value: moduleExport.value,\n };\n }\n case \"record\": {\n const resolvedInRecord = resolveSpecifierInRecord(\n moduleExport,\n specifiers[0],\n specifiers.slice(1),\n );\n return resolveModuleExport(context, filePath, resolvedInRecord, specifiers, seen);\n }\n case \"mixin\": {\n return {\n type: \"mixin\",\n from: [filePath],\n source: filePath,\n value: moduleExport.value,\n };\n }\n case \"unsupported\": {\n throw new UnsupportedExportError(failureMessage, {\n cause: explainUnsupported(\n filePath,\n specifiers.join(\".\"),\n moduleExport.hint,\n moduleExport.source,\n ),\n });\n }\n }\n } catch (error) {\n // UnsupportedExportError already carries this frame's \"Unable to resolve …\"\n // wrapper, so it bubbles up unchanged to avoid duplicating the line.\n if (error instanceof UnsupportedExportError) {\n throw error;\n }\n throw new ResolveError(failureMessage, { cause: error });\n }\n}\n\nfunction explainUnsupported(\n filePath: string,\n specifier: string,\n hint: string | undefined,\n source: UnsupportedExportSource | undefined,\n): string {\n const isYakFile = /\\.yak\\.(?:ts|tsx|js|jsx)$/.test(filePath);\n const docs =\n \"https://yak.js.org/docs/migration-from-styled-components#move-some-code-to-yak-files\";\n const snippet = source ? renderSourceSnippet(filePath, source, hint ?? \"\") : undefined;\n\n const lines: string[] = [];\n if (isYakFile) {\n const got = hint ? ` (got \\`${hint}\\`)` : \"\";\n lines.push(`\\`${specifier}\\` evaluated to a value that cannot be inlined into CSS${got}.`);\n if (snippet) lines.push(snippet);\n lines.push(\n ` help: replace it with a string, number, or plain object/array of those`,\n ` see: ${docs}`,\n );\n return lines.join(\"\\n\");\n }\n\n const got = hint ? ` (got a ${hint})` : \"\";\n lines.push(`\\`${specifier}\\` is not a string or number literal${got}.`);\n if (snippet) lines.push(snippet);\n lines.push(\n ` help: rename \"${filePath}\" to \"${suggestYakFileName(filePath)}\" so its exports run at build time`,\n ` (or replace \\`${specifier}\\` with a literal value)`,\n ` see: ${docs}`,\n );\n return lines.join(\"\\n\");\n}\n\nfunction suggestYakFileName(filePath: string): string {\n const match = filePath.match(/^(.*)\\.(ts|tsx|js|jsx)$/);\n if (!match) return filePath;\n return `${match[1]}.yak.${match[2]}`;\n}\n\n/**\n * Render a Rust-compiler-style snippet from a structural source location:\n *\n * --> /foo/colors.ts:5:18\n * |\n * 5 | export const bg = `var(${v})`;\n * | ^^^^^^^^^^^^ TemplateLiteral\n */\nfunction renderSourceSnippet(\n filePath: string,\n source: UnsupportedExportSource,\n label: string,\n): string {\n const startLine = source.start.line;\n const startCol = source.start.column;\n const sameLine = source.end.line === startLine;\n const caretLen = sameLine\n ? Math.max(1, source.end.column - startCol)\n : Math.max(1, source.lineText.length - startCol);\n\n const lineNumStr = String(startLine);\n const gutterPad = \" \".repeat(lineNumStr.length);\n\n return [\n ` --> ${filePath}:${startLine}:${startCol + 1}`,\n ` ${gutterPad} |`,\n ` ${lineNumStr} | ${source.lineText}`,\n ` ${gutterPad} | ${\" \".repeat(startCol)}${\"^\".repeat(caretLen)} ${label}`,\n ].join(\"\\n\");\n}\n\nfunction resolveSpecifierInRecord(\n record: ExtendedRecordExport,\n name: string,\n specifiers: string[],\n): ConstantExport | ResolvedStyledComponent | ResolvedMixin {\n if (specifiers.length === 0) {\n throw new ResolveError(\"did not expect an object\");\n }\n let depth = 0;\n let current: ResolvedExport = record;\n while (current && current.type === \"record\" && depth < specifiers.length) {\n current = current.value[specifiers[depth]];\n depth += 1;\n }\n\n if (current === undefined || depth !== specifiers.length) {\n throw new ResolveError(\n `Unable to resolve \"${specifiers.join(\".\")}\" in object/array \"${name}\"`,\n { cause: \"path not found\" },\n );\n }\n\n if (\n current.type === \"constant\" ||\n current.type === \"styled-component\" ||\n current.type === \"mixin\"\n ) {\n return current;\n }\n\n // mixins in .yak files are wrapped inside an object with a __yak key\n if (\n current.type === \"record\" &&\n \"__yak\" in current.value &&\n current.value.__yak.type === \"constant\"\n ) {\n return { type: \"mixin\", value: String(current.value.__yak.value) };\n }\n\n throw new ResolveError(`Unable to resolve \"${specifiers.join(\".\")}\" in object/array \"${name}\"`, {\n cause: \"only string and numbers are supported\",\n });\n}\n\n/**\n * hex SHA-1 hash of a message using webcrypto\n * Keeps yak independent from node api (therefore executable in browser)\n */\nasync function sha1(message: string) {\n const resultBuffer = await globalThis.crypto.subtle.digest(\n \"SHA-1\",\n new TextEncoder().encode(message),\n );\n return Array.from(new Uint8Array(resultBuffer), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\ntype ResolvedCssImport =\n | {\n type: \"styled-component\";\n source: string;\n from: string[];\n name: string;\n value: string;\n }\n | {\n type: \"unresolved-tag\";\n source: string;\n from: string[];\n name: string;\n }\n | { type: \"mixin\"; source: string; from: string[]; value: string | number }\n | {\n type: \"constant\";\n source: string;\n from: string[];\n value: string | number;\n };\n\nexport type ResolveContext = {\n parse: (modulePath: string) => Promise<ParsedModule> | ParsedModule;\n cache?: {\n resolve?: Cache<Promise<{ resolved: ResolvedModule; dependencies: string[] }>>;\n resolveCrossFileConstant?: Cache<Promise<{ resolved: string; dependencies: string[] }>>;\n };\n exportAllLimit?: number;\n resolve: (specifier: string, importer: string) => Promise<string> | string;\n};\n\ntype YakImportKind = \"mixin\" | \"selector\";\n\ntype YakCssImport = {\n encodedArguments: string;\n moduleSpecifier: string;\n specifier: string[];\n importKind: YakImportKind;\n semicolon: string;\n position: number;\n size: number;\n};\n\nexport type ExtendedRecordExport = {\n type: \"record\";\n value: Record<string, ResolvedExport>;\n};\n\nexport type ResolvedMixin = { type: \"mixin\"; value: string };\nexport type ResolvedStyledComponent = {\n type: \"styled-component\";\n className: string;\n};\n\nexport type ResolvedExport =\n | Exclude<ModuleExport, RecordExport>\n | ExtendedRecordExport\n | ResolvedStyledComponent\n | ResolvedMixin;\n\nexport type ResolvedExports = {\n named: Record<string, ResolvedExport>;\n all: string[];\n};\n\nexport type ResolvedModule = {\n path: string;\n exports: ResolvedExports;\n};\n","import { relative } from \"path\";\nimport type { YakConfigOptions } from \"../../withYak/index.js\";\n\ntype DebugOptions = Required<YakConfigOptions>[\"experiments\"][\"debug\"];\ntype DebugType = NonNullable<Exclude<DebugOptions, true | undefined>>[\"types\"] extends\n | Array<infer T>\n | undefined\n ? T\n : never;\n\n/**\n * Creates a debug logger function that conditionally logs messages\n * based on debug options and file paths.\n */\nexport function createDebugLogger(debugOptions: DebugOptions | undefined, rootPath: string) {\n if (!debugOptions) {\n return () => {};\n }\n\n throwOnDeprecatedDebugOptions(debugOptions);\n\n // Handle true (log all) vs object (with optional filtering)\n const pattern = debugOptions === true ? undefined : debugOptions.pattern;\n const typesArray = debugOptions === true ? undefined : debugOptions.types;\n\n // Validate and pre-compile regex pattern\n let compiledPattern: RegExp | null = null;\n if (pattern) {\n try {\n compiledPattern = new RegExp(pattern);\n } catch (error) {\n throw new Error(\n `Invalid debug pattern: \"${pattern}\" is not a valid regular expression. ${\n error instanceof Error ? error.message : \"\"\n }`,\n );\n }\n }\n\n const types = typesArray ? new Set(typesArray) : null;\n\n return (\n messageType: DebugType,\n message: string | Buffer<ArrayBufferLike> | undefined,\n filePath: string,\n ) => {\n // Filter by type if specified\n if (types && !types.has(messageType)) {\n return;\n }\n\n const relativePath = relative(rootPath, filePath);\n\n // Filter by pattern if specified, or log all if no pattern\n if (!compiledPattern || compiledPattern.test(relativePath)) {\n console.log(\"🐮 Yak\", `[${messageType}]`, relativePath, \"\\n\\n\", message);\n }\n };\n}\n\n/**\n * Detects deprecated debug option shapes and throws helpful migration errors.\n * TODO: Remove this function in the next major version.\n */\nfunction throwOnDeprecatedDebugOptions(debugOptions: DebugOptions): void {\n // Old API: debug: \"regex-string\"\n if (typeof debugOptions === \"string\") {\n const suggestion =\n suggestTypesForExtensionPattern(debugOptions) ?? `debug: { pattern: \"${debugOptions}\" }`;\n throw new Error(\n `The debug option no longer accepts a string. Please update your config:\\n` +\n ` Before: debug: \"${debugOptions}\"\\n` +\n ` After: ${suggestion}`,\n );\n }\n\n // Old API: debug: { filter: Function, type: string }\n if (typeof debugOptions === \"object\" && \"filter\" in debugOptions) {\n throw new Error(\n `The debug option no longer accepts { filter, type }. Please update your config:\\n` +\n ` Before: debug: { filter: ..., type: \"...\" }\\n` +\n ` After: debug: { pattern: \"...\", types: [\"ts\", \"css\", \"css-resolved\"] }`,\n );\n }\n\n // Old convention: pattern used \".css$\" or \".css-resolved$\" as file extension\n // for type filtering — the pattern now only matches file paths\n if (typeof debugOptions === \"object\" && debugOptions.pattern) {\n const suggestion = suggestTypesForExtensionPattern(debugOptions.pattern);\n if (suggestion) {\n throw new Error(\n `The debug pattern \"${debugOptions.pattern}\" looks like it's filtering by output type using the old file extension convention.\\n` +\n `The pattern now only matches file paths. Use the \"types\" option to filter by output type:\\n` +\n ` Before: debug: { pattern: \"${debugOptions.pattern}\" }\\n` +\n ` After: ${suggestion}`,\n );\n }\n }\n}\n\n/**\n * Checks if a pattern string uses the old \".css$\" / \".css-resolved$\" file\n * extension convention for type filtering. Returns a suggested replacement\n * or null if the pattern doesn't match.\n */\nfunction suggestTypesForExtensionPattern(pattern: string): string | null {\n const extensionMatch = pattern.match(/\\.\\(?(?:css-resolved|css)\\)?\\$?$/);\n if (!extensionMatch) {\n return null;\n }\n const type = extensionMatch[0].includes(\"css-resolved\") ? \"css-resolved\" : \"css\";\n const remaining = pattern.slice(0, extensionMatch.index);\n return remaining\n ? `debug: { pattern: \"${remaining}\", types: [\"${type}\"] }`\n : `debug: { types: [\"${type}\"] }`;\n}\n","import { YakConfigOptions } from \"../../withYak/index.js\";\n\n/**\n * Extracts CSS content from code that contains YAK-generated CSS comments.\n * Parses the input code and returns the extracted CSS, optionally adding\n * a cssmodules directive based on the transpilation mode.\n */\nexport function extractCss(\n code: string | Buffer<ArrayBufferLike>,\n transpilationMode: NonNullable<YakConfigOptions[\"experiments\"]>[\"transpilationMode\"],\n): string {\n let codeString: string;\n\n if (typeof code === \"string\") {\n codeString = code;\n } else if (code instanceof Buffer) {\n codeString = code.toString(\"utf-8\");\n } else if (code instanceof ArrayBuffer) {\n codeString = new TextDecoder(\"utf-8\").decode(code);\n } else {\n throw new Error(\"Invalid input type: code must be string, Buffer, or ArrayBuffer\");\n }\n\n const codeParts = codeString.split(\"/*YAK Extracted CSS:\\n\");\n let result = \"\";\n for (let i = 1; i < codeParts.length; i++) {\n const codeUntilEnd = codeParts[i].split(\"*/\")[0];\n result += codeUntilEnd;\n }\n if (result && transpilationMode !== \"Css\") {\n result = \"/* cssmodules-pure-no-check */\\n\" + result;\n }\n\n return result;\n}\n","import { parse } from \"@babel/parser\";\nimport type { Expression, ObjectExpression, TSAsExpression } from \"@babel/types\";\nimport type { Compilation, LoaderContext } from \"webpack\";\nimport {\n ModuleExport,\n ModuleExports,\n ParseContext,\n ParsedModule,\n UnsupportedExportSource,\n parseModule,\n} from \"../../cross-file-resolver/parseModule.js\";\nimport {\n ResolveContext,\n resolveCrossFileConstant as genericResolveCrossFileConstant,\n} from \"../../cross-file-resolver/resolveCrossFileConstant.js\";\nimport { YakConfigOptions } from \"../../withYak/index.js\";\n\nconst compilationCache = new WeakMap<\n Compilation,\n {\n parsedFiles: Map<string, ParsedModule>;\n }\n>();\n\nexport async function resolveCrossFileConstant(\n loader: LoaderContext<{}>,\n pathContext: string,\n css: string,\n): Promise<string> {\n const { resolved } = await genericResolveCrossFileConstant(\n getResolveContext(loader),\n loader.resourcePath,\n css,\n );\n return resolved;\n}\n\nfunction getCompilationCache(loader: LoaderContext<YakConfigOptions>) {\n const compilation = loader._compilation;\n if (!compilation) {\n throw new Error(\"Webpack compilation object not available\");\n }\n let cache = compilationCache.get(compilation);\n if (!cache) {\n cache = {\n parsedFiles: new Map(),\n };\n compilationCache.set(compilation, cache);\n }\n return cache;\n}\n\nfunction getParseContext(loader: LoaderContext<YakConfigOptions>): ParseContext {\n return {\n cache: { parse: getCompilationCache(loader).parsedFiles },\n async extractExports(modulePath) {\n const sourceContents = new Promise<string>((resolve, reject) =>\n loader.fs.readFile(modulePath, \"utf-8\", (err, result) => {\n if (err) return reject(err);\n resolve(result || \"\");\n }),\n );\n return parseExports(await sourceContents);\n },\n async getTransformed(modulePath) {\n const transformedSource = new Promise<string>((resolve, reject) => {\n loader.loadModule(modulePath, (err, source) => {\n if (err) {\n // When webpack reports \"The loaded module contains errors\",\n // the actual errors are stored on the module in the compilation.\n // Extract and report the real errors for better debugging.\n const compilation = loader._compilation;\n if (compilation) {\n try {\n for (const mod of compilation.modules) {\n if (\"resource\" in mod && mod.resource === modulePath) {\n const errors = mod.getErrors();\n if (errors) {\n const messages = Array.from(errors)\n .map((e) => e.message)\n .filter(Boolean);\n if (messages.length > 0) {\n return reject(new Error(messages.join(\"\\n\")));\n }\n }\n }\n }\n } catch {\n // Ignore errors while trying to extract module errors\n }\n }\n return reject(err);\n }\n let sourceString: string;\n if (typeof source === \"string\") {\n sourceString = source;\n } else if (source instanceof Buffer) {\n sourceString = source.toString(\"utf-8\");\n } else if (source instanceof ArrayBuffer) {\n sourceString = new TextDecoder(\"utf-8\").decode(source);\n } else {\n throw new Error(\"Invalid input type: code must be string, Buffer, or ArrayBuffer\");\n }\n resolve(sourceString || \"\");\n });\n });\n return { code: await transformedSource };\n },\n async evaluateYakModule(modulePath) {\n return loader.importModule(modulePath);\n },\n transpilationMode: loader.getOptions().experiments?.transpilationMode,\n };\n}\n\nfunction getResolveContext(loader: LoaderContext<YakConfigOptions>): ResolveContext {\n const parseContext = getParseContext(loader);\n return {\n parse: (modulePath) => parseModule(parseContext, modulePath),\n resolve: async (specifier, importer) => {\n return resolveModule(loader, specifier, dirname(importer));\n },\n };\n}\n\n/**\n * Resolves a module by wrapping loader.resolve in a promise\n */\nexport async function resolveModule(\n loader: LoaderContext<{}>,\n moduleSpecifier: string,\n context: string,\n): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n loader.resolve(context, moduleSpecifier, (err, result) => {\n if (err) return reject(err);\n if (!result) return reject(new Error(`Could not resolve ${moduleSpecifier}`));\n resolve(result);\n });\n });\n}\n\nexport async function parseExports(sourceContents: string): Promise<ModuleExports> {\n try {\n const ast = parse(sourceContents, {\n sourceType: \"module\",\n plugins: [\"jsx\", \"typescript\"] as const,\n });\n\n // Derive importYak from top-level imports (no traverse needed)\n const importYak = ast.program.body.some(\n (node) => node.type === \"ImportDeclaration\" && node.source.value === \"next-yak\",\n );\n\n const moduleExports: ModuleExports = {\n importYak,\n named: {},\n all: [],\n };\n\n // Track variable declarations for default export lookup\n const variableDeclarations: Record<string, Expression> = {};\n let defaultIdentifier: string | null = null;\n\n for (const node of ast.program.body) {\n // Track top-level variable declarations for default export lookup\n if (node.type === \"VariableDeclaration\") {\n for (const decl of node.declarations) {\n if (decl.id.type === \"Identifier\" && decl.init) {\n variableDeclarations[decl.id.name] = decl.init;\n }\n }\n }\n\n if (node.type === \"ExportNamedDeclaration\") {\n if (node.source) {\n // export { x } from \"./file\", export { x as y } from \"./file\"\n for (const specifier of node.specifiers) {\n if (\n specifier.type === \"ExportSpecifier\" &&\n specifier.exported.type === \"Identifier\" &&\n specifier.local.type === \"Identifier\"\n ) {\n moduleExports.named[specifier.exported.name] = {\n type: \"re-export\",\n from: node.source.value,\n name: specifier.local.name,\n };\n }\n // export * as ns from \"./file\"\n if (\n specifier.type === \"ExportNamespaceSpecifier\" &&\n specifier.exported.type === \"Identifier\"\n ) {\n moduleExports.named[specifier.exported.name] = {\n type: \"namespace-re-export\",\n from: node.source.value,\n };\n }\n }\n } else if (node.declaration?.type === \"VariableDeclaration\") {\n // export const x = ...\n for (const declaration of node.declaration.declarations) {\n if (declaration.id.type === \"Identifier\" && declaration.init) {\n variableDeclarations[declaration.id.name] = declaration.init;\n const parsed = parseExportValueExpression(declaration.init, sourceContents);\n if (parsed) {\n moduleExports.named[declaration.id.name] = parsed;\n }\n }\n }\n }\n }\n\n if (node.type === \"ExportDefaultDeclaration\") {\n if (node.declaration.type === \"Identifier\") {\n // e.g. export default variableName;\n // Save the identifier name to look up later\n defaultIdentifier = node.declaration.name;\n } else if (\n node.declaration.type === \"FunctionDeclaration\" ||\n node.declaration.type === \"ClassDeclaration\"\n ) {\n // e.g. export default function() {...} or export default class {...}\n moduleExports.named[\"default\"] = {\n type: \"unsupported\",\n hint: node.declaration.type,\n source: extractUnsupportedSource(node.declaration.loc, sourceContents),\n };\n } else {\n // e.g. export default { ... } or export default \"value\"\n moduleExports.named[\"default\"] = parseExportValueExpression(\n node.declaration as Expression,\n sourceContents,\n );\n }\n }\n\n // export * from \"./file\"\n if (node.type === \"ExportAllDeclaration\") {\n moduleExports.all.push(node.source.value);\n }\n }\n\n // If we found a default export that's an identifier, look up its value\n if (defaultIdentifier && variableDeclarations[defaultIdentifier]) {\n moduleExports.named[\"default\"] = parseExportValueExpression(\n variableDeclarations[defaultIdentifier],\n sourceContents,\n );\n }\n\n return moduleExports;\n } catch (error) {\n throw new Error(`Error parsing exports: ${(error as Error).message}`);\n }\n}\n\n/**\n * Unpacks TS type assertions (as, satisfies) to the underlying expression\n */\nfunction unpackTSAsExpression(node: TSAsExpression | Expression): Expression {\n if (node.type === \"TSAsExpression\" || node.type === \"TSSatisfiesExpression\") {\n return unpackTSAsExpression((node as TSAsExpression).expression);\n }\n return node;\n}\n\nfunction parseExportValueExpression(node: Expression, code?: string): ModuleExport {\n // ignores `as` casts so it doesn't interfere with the ast node type detection\n const expression = unpackTSAsExpression(node);\n if (expression.type === \"CallExpression\" || expression.type === \"TaggedTemplateExpression\") {\n return { type: \"tag-template\" };\n } else if (expression.type === \"StringLiteral\" || expression.type === \"NumericLiteral\") {\n return { type: \"constant\", value: expression.value };\n } else if (\n expression.type === \"UnaryExpression\" &&\n expression.operator === \"-\" &&\n expression.argument.type === \"NumericLiteral\"\n ) {\n return { type: \"constant\", value: -expression.argument.value };\n } else if (expression.type === \"TemplateLiteral\" && expression.quasis.length === 1) {\n return { type: \"constant\", value: expression.quasis[0].value.raw };\n } else if (expression.type === \"ObjectExpression\") {\n return {\n type: \"record\",\n value: parseObjectExpression(expression, code),\n };\n }\n return {\n type: \"unsupported\",\n hint: expression.type,\n source: extractUnsupportedSource(expression.loc, code),\n };\n}\n\nfunction parseObjectExpression(\n node: ObjectExpression,\n code?: string,\n): Record<string, ModuleExport> {\n let result: Record<string, ModuleExport> = {};\n for (const property of node.properties) {\n if (property.type === \"ObjectProperty\" && property.key.type === \"Identifier\") {\n const key = property.key.name;\n const parsed = parseExportValueExpression(property.value as Expression, code);\n if (parsed) {\n result[key] = parsed;\n }\n }\n }\n return result;\n}\n\n/**\n * Pull the structural source-location data the error formatter needs to\n * render a snippet — the formatter (not this parser) is responsible for\n * any presentation. Returns undefined if loc or source text is missing.\n */\nfunction extractUnsupportedSource(\n loc:\n | {\n start: { line: number; column: number };\n end: { line: number; column: number };\n }\n | null\n | undefined,\n code: string | undefined,\n): UnsupportedExportSource | undefined {\n if (!loc || !code) return undefined;\n const lineText = code.split(/\\r?\\n/)[loc.start.line - 1];\n if (lineText === undefined) return undefined;\n return {\n start: { line: loc.start.line, column: loc.start.column },\n end: { line: loc.end.line, column: loc.end.column },\n lineText,\n };\n}\n\nconst DIRNAME_POSIX_REGEX =\n /^((?:\\.(?![^/]))|(?:(?:\\/?|)(?:[\\s\\S]*?)))(?:\\/+?|)(?:(?:\\.{1,2}|[^/]+?|)(?:\\.[^./]*|))(?:[/]*)$/;\nconst DIRNAME_WIN32_REGEX =\n /^((?:\\.(?![^\\\\]))|(?:(?:\\\\?|)(?:[\\s\\S]*?)))(?:\\\\+?|)(?:(?:\\.{1,2}|[^\\\\]+?|)(?:\\.[^.\\\\]*|))(?:[\\\\]*)$/;\n\n/**\n * Polyfill for `node:path` method dirname.\n * Keeps yak independent from node api (therefore executable in browser)\n */\nfunction dirname(path: string) {\n let dirname = DIRNAME_POSIX_REGEX.exec(path)?.[1];\n\n if (!dirname) {\n dirname = DIRNAME_WIN32_REGEX.exec(path)?.[1];\n }\n\n if (!dirname) {\n throw new Error(`Can't extract dirname from ${path}`);\n }\n\n return dirname;\n}\n","import { Options, transform as swcTransform } from \"@swc/core\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, relative, resolve } from \"node:path\";\nimport { normalizePath, type Plugin } from \"vite\";\nimport { parseModule } from \"../cross-file-resolver/parseModule.js\";\nimport { resolveCrossFileConstant } from \"../cross-file-resolver/resolveCrossFileConstant.js\";\nimport { createEvaluator, type Evaluator } from \"../isolated-source-eval/index.js\";\nimport { resolveYakContext, YakConfigOptions } from \"../withYak/index.js\";\nimport { createDebugLogger } from \"./lib/debugLogger.js\";\nimport { extractCss } from \"./lib/extractCss.js\";\nimport { parseExports } from \"./lib/resolveCrossFileSelectors.js\";\nconst require = createRequire(import.meta.url);\n\ntype ViteYakPluginOptions = YakConfigOptions & {\n /**\n * Base path for resolving CSS virtual module paths.\n * Relative paths are resolved from Vite's project root.\n * In monorepo setups where source files live outside the Vite project root,\n * set this to the monorepo root to avoid broken CSS imports.\n * @defaultValue Vite's resolved `root`\n */\n basePath?: string;\n swcOptions?: Omit<\n Options,\n \"filename\" | \"sourceFileName\" | \"inputSourceMap\" | \"sourceMaps\" | \"sourceRoot\"\n >;\n};\n\nconst defaultSwcOptions: ViteYakPluginOptions[\"swcOptions\"] = {\n jsc: {\n parser: {\n syntax: \"typescript\",\n tsx: true,\n decorators: false,\n dynamicImport: true,\n },\n transform: {\n react: {\n runtime: \"preserve\",\n },\n },\n target: \"es2022\",\n loose: false,\n minify: {\n compress: false,\n mangle: false,\n },\n preserveAllComments: true,\n },\n minify: false,\n isModule: true,\n};\n\nexport async function viteYak(userOptions: ViteYakPluginOptions = {}): Promise<Plugin> {\n const yakOptions: ViteYakPluginOptions = {\n experiments: {\n transpilationMode: \"Css\",\n suppressDeprecationWarnings: false,\n ...userOptions.experiments,\n },\n minify: userOptions.minify ?? process.env.NODE_ENV === \"production\",\n prefix: userOptions.prefix,\n contextPath: userOptions.contextPath,\n swcOptions: deepMerge(defaultSwcOptions!, userOptions.swcOptions ?? {}),\n };\n yakOptions.displayNames =\n userOptions.displayNames ?? yakOptions.displayNames ?? !yakOptions.minify;\n let basePath = userOptions.basePath ?? \"\";\n let hasWarnedAboutBasePath = false;\n let debugLog: ReturnType<typeof createDebugLogger> = () => {};\n let isServe = false;\n const sourceFileRegex = /\\.(tsx?|m?jsx?)\\??/;\n const virtualModuleRegex = /^virtual:yak-css:/;\n const virtualCssModuleRegex = /^\\0virtual:yak-css:/;\n const yakSwcPath = await findYakSwcPlugin();\n const evaluator: Evaluator = await createEvaluator();\n return {\n name: \"vite-plugin-yak:css:pre\",\n enforce: \"pre\",\n config: (config) => {\n const context = resolveYakContext(yakOptions.contextPath, config.root ?? process.cwd());\n\n if (!context) {\n return;\n }\n\n config.resolve ||= {};\n\n if (Array.isArray(config.resolve.alias)) {\n config.resolve.alias.push({\n find: \"next-yak/context/baseContext\",\n replacement: context,\n });\n } else {\n config.resolve.alias = {\n ...config.resolve.alias,\n \"next-yak/context/baseContext\": context,\n };\n }\n },\n configResolved(config) {\n basePath = basePath ? resolve(config.root, basePath) : config.root;\n debugLog = createDebugLogger(yakOptions.experiments?.debug, basePath);\n isServe = config.command === \"serve\";\n },\n resolveId: {\n filter: {\n id: virtualModuleRegex,\n },\n handler(id) {\n return \"\\0\" + id;\n },\n },\n load: {\n filter: {\n id: virtualCssModuleRegex,\n },\n async handler(id) {\n // remove \\0virtual:yak-css: (17 chars) from the beginning and .css (4 chars) from the end\n // The path is relative to basePath — resolve to absolute for Vite's file APIs\n const queryStringStart = id.indexOf(\"?\");\n const queryString = queryStringStart === -1 ? \"\" : id.slice(queryStringStart);\n const relativeId = id.slice(17, -4 - queryString.length);\n const originalId = resolve(basePath, relativeId);\n this.addWatchFile(originalId);\n\n const sourceContent = await this.fs.readFile(originalId, {\n encoding: \"utf8\",\n });\n const code = await transform(sourceContent, originalId, basePath, yakSwcPath, yakOptions);\n const extractedCss = extractCss(code.code, \"Css\");\n debugLog(\"css\", extractedCss, originalId);\n\n const { resolved } = await resolveCrossFileConstant(\n {\n parse: (modulePath) => {\n return parseModule(\n {\n transpilationMode: \"Css\",\n extractExports: async (modulePath) => {\n const sourceContent = await this.fs.readFile(modulePath, {\n encoding: \"utf8\",\n });\n\n this.addWatchFile(modulePath);\n\n return parseExports(sourceContent);\n },\n getTransformed: async (modulePath) => {\n const sourceContent = await this.fs.readFile(modulePath, {\n encoding: \"utf8\",\n });\n return transform(sourceContent, modulePath, basePath, yakSwcPath, yakOptions);\n },\n evaluateYakModule: async (modulePath: string) => {\n this.addWatchFile(modulePath);\n const result = await evaluator.evaluate(modulePath);\n if (!result.ok) {\n throw new Error(result.error.message);\n }\n for (const dep of result.dependencies) {\n this.addWatchFile(dep);\n }\n return result.value;\n },\n },\n modulePath,\n );\n },\n resolve: async (moduleSpecifier: string, context: string) => {\n let importer = context;\n const resolved = await this.resolve(moduleSpecifier, importer);\n\n if (!resolved) {\n throw new Error(`Could not resolve ${moduleSpecifier} from ${context}`);\n }\n return resolved.id;\n },\n },\n originalId + queryString,\n extractedCss,\n );\n\n debugLog(\"css-resolved\", resolved, originalId);\n return resolved;\n },\n },\n\n configureServer(server) {\n server.watcher.on(\"change\", (file) => {\n evaluator.invalidate(file);\n });\n },\n\n transform: {\n filter: {\n id: {\n include: sourceFileRegex,\n exclude: [/packages\\/next-yak/],\n },\n code: \"next-yak\",\n },\n async handler(code, id) {\n try {\n const filePath = id.split(\"?\")[0];\n if (!hasWarnedAboutBasePath) {\n const relPath = relative(basePath, filePath);\n if (relPath.startsWith(\"..\")) {\n hasWarnedAboutBasePath = true;\n console.warn(\n `[next-yak] Source file \"${filePath}\" is outside the project root \"${basePath}\".\\n` +\n `This may cause CSS resolution issues in monorepo setups.\\n` +\n `Set the \"basePath\" option to your monorepo root:\\n\\n` +\n ` viteYak({ basePath: \"/absolute/path/to/monorepo/root\" })\\n`,\n );\n }\n }\n const result = await transform(code, filePath, basePath, yakSwcPath, yakOptions, isServe);\n debugLog(\"ts\", result.code, id);\n\n return {\n code: result.code,\n map: result.map,\n };\n } catch (error) {\n this.error(`[YAK Plugin] Error transforming ${id}: ${(error as Error).message}`);\n }\n },\n },\n\n // Vite's default HMR only updates the JS module when a source file changes.\n // The extracted CSS lives in a separate virtual module (virtual:yak-css:...)\n // which Vite doesn't know is derived from the source file. Without explicit\n // invalidation here, the browser keeps stale CSS after edits.\n hotUpdate({ modules, file, type }) {\n if (type !== \"update\" && type !== \"create\") return;\n if (!sourceFileRegex.test(file)) return;\n\n // The SWC plugin generates virtual module paths relative to basePath\n // (via {{__MODULE_PATH__}}), so we must match that format.\n const relativePath = normalizePath(relative(basePath, file));\n const virtualId = \"\\0virtual:yak-css:\" + relativePath + \".css\";\n const mod = this.environment.moduleGraph.getModuleById(virtualId);\n if (mod) {\n this.environment.moduleGraph.invalidateModule(mod);\n return [...modules, mod];\n }\n },\n };\n}\n\n/**\n * This function finds the path to the yak-swc plugin because it is most of the time a transitive dependency\n * and the resolver of SWC only resolves the main node_modules directory.\n * @returns The path to the yak-swc wasm plugin.\n */\nasync function findYakSwcPlugin() {\n try {\n const packageJsonPath = require.resolve(\"yak-swc/package.json\");\n const packageRoot = dirname(packageJsonPath);\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n\n // Resolve the main field which points to the WASM file\n const wasmPath = resolve(packageRoot, packageJson.main);\n\n return wasmPath;\n } catch (e) {\n throw new Error(`Could not resolve yak-swc plugin: ${e}`);\n }\n}\n\nfunction transform(\n data: string,\n modulePath: string,\n rootPath: string,\n yakSwcPath: string,\n yakOptions: ViteYakPluginOptions,\n reactRefreshReg?: boolean,\n) {\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/loaders/next-swc-loader.ts#L143\n return swcTransform(data, {\n filename: modulePath,\n inputSourceMap: undefined,\n sourceMaps: true,\n sourceFileName: modulePath,\n sourceRoot: rootPath,\n ...yakOptions.swcOptions,\n jsc: {\n ...yakOptions.swcOptions?.jsc,\n experimental: {\n plugins: [\n [\n yakSwcPath,\n {\n minify: yakOptions.minify,\n basePath: rootPath,\n prefix: yakOptions.prefix,\n displayNames: yakOptions.displayNames,\n suppressDeprecationWarnings: yakOptions.experiments?.suppressDeprecationWarnings,\n ...(reactRefreshReg ? { reactRefreshReg: true } : {}),\n importMode: {\n value: \"virtual:yak-css:{{__MODULE_PATH__}}.css\",\n transpilation: \"Css\",\n encoding: \"None\",\n },\n },\n ],\n ],\n },\n },\n });\n}\n\n/**\n * Deep merge two objects, with source values overriding target values.\n */\nfunction deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = target[key];\n if (\n sourceValue !== undefined &&\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === \"object\" &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[keyof T];\n }\n }\n return result;\n}\n"],"mappings":"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"}