@yak/react 10.0.0-rc.0 → 10.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -3
- package/dist/context/baseContext.d.ts +1 -2
- package/dist/context/index.d.ts +5 -6
- package/dist/context/index.js.map +1 -1
- package/dist/context/index.server.d.ts +2 -3
- package/dist/cross-file-resolver/index.d.ts +12 -12
- package/dist/cross-file-resolver/index.js +58 -5
- package/dist/cross-file-resolver/index.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +139 -139
- package/dist/isolated-source-eval/index.d.ts +2 -2
- package/dist/isolated-source-eval/index.js +2 -2
- package/dist/isolated-source-eval/index.js.map +1 -1
- package/dist/isolated-source-eval/worker.js +4 -1
- package/dist/isolated-source-eval/worker.js.map +1 -1
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +2 -2
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/loaders/{turbo-loader.d.cts → turbo-loader.d.ts} +11 -3
- package/dist/loaders/{turbo-loader.cjs → turbo-loader.js} +81 -49
- package/dist/loaders/turbo-loader.js.map +1 -0
- package/dist/loaders/vite-plugin.d.ts +15 -25
- package/dist/loaders/vite-plugin.js +95 -67
- package/dist/loaders/vite-plugin.js.map +1 -1
- package/dist/loaders/{webpack-loader.d.cts → webpack-loader.d.ts} +3 -3
- package/dist/loaders/{webpack-loader.cjs → webpack-loader.js} +69 -37
- package/dist/loaders/webpack-loader.js.map +1 -0
- package/dist/rsbuild/index.d.ts +2 -2
- package/dist/rsbuild/index.js +3 -3
- package/dist/rsbuild/index.js.map +1 -1
- package/dist/static/index.js +1 -1
- package/dist/static/index.js.map +1 -1
- package/dist/withYak/index.d.ts +15 -24
- package/dist/withYak/index.js +8 -14
- package/dist/withYak/index.js.map +1 -1
- package/loaders/lib/resolveCrossFileSelectors.ts +0 -1
- package/loaders/turbo-loader.ts +32 -11
- package/loaders/webpack-loader.ts +3 -6
- package/package.json +47 -106
- package/rsbuild/index.ts +3 -4
- package/runtime/context/index.tsx +3 -3
- package/withYak/allow-global-css.ts +1 -1
- package/withYak/index.ts +7 -21
- package/dist/context/baseContext.cjs +0 -9
- package/dist/context/baseContext.cjs.map +0 -1
- package/dist/context/baseContext.d.cts +0 -6
- package/dist/context/index.cjs +0 -45
- package/dist/context/index.cjs.map +0 -1
- package/dist/context/index.d.cts +0 -21
- package/dist/context/index.server.cjs +0 -47
- package/dist/context/index.server.cjs.map +0 -1
- package/dist/context/index.server.d.cts +0 -10
- package/dist/index.cjs +0 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -320
- package/dist/internal.cjs +0 -544
- package/dist/internal.cjs.map +0 -1
- package/dist/internal.d.cts +0 -452
- package/dist/jsx-dev-runtime.cjs +0 -2
- package/dist/jsx-dev-runtime.cjs.map +0 -1
- package/dist/jsx-dev-runtime.d.cts +0 -7
- package/dist/jsx-runtime.cjs +0 -2
- package/dist/jsx-runtime.cjs.map +0 -1
- package/dist/jsx-runtime.d.cts +0 -38
- package/dist/loaders/turbo-loader.cjs.map +0 -1
- package/dist/loaders/webpack-loader.cjs.map +0 -1
- package/dist/static/index.cjs +0 -2
- package/dist/static/index.cjs.map +0 -1
- package/dist/static/index.d.cts +0 -28
- package/dist/withYak/index.cjs +0 -208
- package/dist/withYak/index.cjs.map +0 -1
- package/dist/withYak/index.d.cts +0 -121
package/dist/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","names":[],"sources":["../runtime/jsx-runtime.ts"],"sourcesContent":["import ReactJSXRuntime from \"react/jsx-runtime\";\nimport type { ComponentStyles } from \"./mocks/cssLiteral.js\";\n\n/**\n * A falsy css prop applies no styles, which keeps conditional shapes like\n * `css={on && css`...`}` or `css={on ? css`...` : undefined}` well typed\n */\ntype CSSProp = ComponentStyles<Record<keyof any, never>> | false | null | undefined;\n\n// Only return the css prop if the \"className\" and \"style\" properties are present\n// This was inspired from emotion\n// https://github.com/emotion-js/emotion/blob/cce67ec6b2fc94261028b4f4778aae8c3d6c5fd6/packages/react/src/jsx-namespace.ts#L9C6-L9C28\ntype WithConditionalCSSProp<P> = \"className\" | \"style\" extends keyof P\n ? string extends P[\"className\" & keyof P]\n ? Record<string, any> extends P[\"style\" & keyof P]\n ? { css?: CSSProp }\n : {}\n : {}\n : {};\n\nconst Fragment = ReactJSXRuntime.Fragment;\nconst jsx = ReactJSXRuntime.jsx;\nconst jsxs = ReactJSXRuntime.jsxs;\n\nexport declare namespace YakJSX {\n export type Element = React.JSX.Element;\n export type ElementType = React.JSX.ElementType;\n export type ElementClass = React.JSX.ElementClass;\n export type ElementAttributesProperty = React.JSX.ElementAttributesProperty;\n export type ElementChildrenAttribute = React.JSX.ElementChildrenAttribute;\n\n // Add the CSS prop to all components that can receive \"className\" and \"style\"\n export type LibraryManagedAttributes<C, P> = P extends unknown\n ? WithConditionalCSSProp<P> & React.JSX.LibraryManagedAttributes<C, P>\n : never;\n\n export type IntrinsicAttributes = React.JSX.IntrinsicAttributes;\n export type IntrinsicClassAttributes<T> = React.JSX.IntrinsicClassAttributes<T>;\n\n export type IntrinsicElements = {\n [K in keyof React.JSX.IntrinsicElements]: React.JSX.IntrinsicElements[K] & {\n // Add the CSS prop to all native elements e.g. \"div\" or \"span\"\n css?: CSSProp;\n };\n };\n}\n\nexport { Fragment, jsx, jsxs, type YakJSX as JSX };\n"],"mappings":"iCAoBA,
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","names":["ReactJSXRuntime","Fragment","jsx","jsxs"],"sources":["../runtime/jsx-runtime.ts"],"sourcesContent":["import ReactJSXRuntime from \"react/jsx-runtime\";\nimport type { ComponentStyles } from \"./mocks/cssLiteral.js\";\n\n/**\n * A falsy css prop applies no styles, which keeps conditional shapes like\n * `css={on && css`...`}` or `css={on ? css`...` : undefined}` well typed\n */\ntype CSSProp = ComponentStyles<Record<keyof any, never>> | false | null | undefined;\n\n// Only return the css prop if the \"className\" and \"style\" properties are present\n// This was inspired from emotion\n// https://github.com/emotion-js/emotion/blob/cce67ec6b2fc94261028b4f4778aae8c3d6c5fd6/packages/react/src/jsx-namespace.ts#L9C6-L9C28\ntype WithConditionalCSSProp<P> = \"className\" | \"style\" extends keyof P\n ? string extends P[\"className\" & keyof P]\n ? Record<string, any> extends P[\"style\" & keyof P]\n ? { css?: CSSProp }\n : {}\n : {}\n : {};\n\nconst Fragment = ReactJSXRuntime.Fragment;\nconst jsx = ReactJSXRuntime.jsx;\nconst jsxs = ReactJSXRuntime.jsxs;\n\nexport declare namespace YakJSX {\n export type Element = React.JSX.Element;\n export type ElementType = React.JSX.ElementType;\n export type ElementClass = React.JSX.ElementClass;\n export type ElementAttributesProperty = React.JSX.ElementAttributesProperty;\n export type ElementChildrenAttribute = React.JSX.ElementChildrenAttribute;\n\n // Add the CSS prop to all components that can receive \"className\" and \"style\"\n export type LibraryManagedAttributes<C, P> = P extends unknown\n ? WithConditionalCSSProp<P> & React.JSX.LibraryManagedAttributes<C, P>\n : never;\n\n export type IntrinsicAttributes = React.JSX.IntrinsicAttributes;\n export type IntrinsicClassAttributes<T> = React.JSX.IntrinsicClassAttributes<T>;\n\n export type IntrinsicElements = {\n [K in keyof React.JSX.IntrinsicElements]: React.JSX.IntrinsicElements[K] & {\n // Add the CSS prop to all native elements e.g. \"div\" or \"span\"\n css?: CSSProp;\n };\n };\n}\n\nexport { Fragment, jsx, jsxs, type YakJSX as JSX };\n"],"mappings":"A,iCAoBA,MAAMC,EAAWD,EAAgB,SAC3BE,EAAMF,EAAgB,IACtBG,EAAOH,EAAgB,K"}
|
|
@@ -7,9 +7,17 @@ import { YakConfigOptions } from "../withYak/index.js";
|
|
|
7
7
|
* strips all inline css code and adds the css as static css urls
|
|
8
8
|
* e.g.: `import "data:text/css;base64,"`
|
|
9
9
|
*/
|
|
10
|
-
|
|
10
|
+
export default function cssExtractLoader(this: LoaderContext<{
|
|
11
11
|
yakOptions: YakConfigOptions;
|
|
12
12
|
yakPluginOptions: any;
|
|
13
|
+
/**
|
|
14
|
+
* Rspack resolves the url() paths of a data: url css import from the
|
|
15
|
+
* compiler root, not from the importing file. With this option the loader
|
|
16
|
+
* rewrites relative paths to point from the root:
|
|
17
|
+
* url("./img/a.png") in src/Box.tsx -> url("./src/img/a.png").
|
|
18
|
+
* Turbopack resolves them from the importing file and needs no rewrite.
|
|
19
|
+
*/
|
|
20
|
+
cssUrlsFromRoot?: boolean;
|
|
13
21
|
}>, code: string, sourceMap: string | undefined): Promise<string | void>;
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=turbo-loader.d.
|
|
22
|
+
//#endregion
|
|
23
|
+
//# sourceMappingURL=turbo-loader.d.ts.map
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { transform } from "@swc/core";
|
|
3
|
+
import { dirname, join, posix, win32 } from "node:path";
|
|
4
|
+
import { relative } from "path";
|
|
5
|
+
import { parse } from "@babel/parser";
|
|
6
|
+
import { statSync } from "node:fs";
|
|
7
|
+
|
|
1
8
|
//#region \0rolldown/runtime.js
|
|
2
9
|
var __defProp = Object.defineProperty;
|
|
3
10
|
var __esmMin = (fn, res, err) => () => {
|
|
@@ -23,13 +30,6 @@ var __exportAll = (all, no_symbols) => {
|
|
|
23
30
|
};
|
|
24
31
|
|
|
25
32
|
//#endregion
|
|
26
|
-
let _swc_core = require("@swc/core");
|
|
27
|
-
let node_module = require("node:module");
|
|
28
|
-
let node_path = require("node:path");
|
|
29
|
-
let path = require("path");
|
|
30
|
-
let _babel_parser = require("@babel/parser");
|
|
31
|
-
let node_fs = require("node:fs");
|
|
32
|
-
|
|
33
33
|
//#region ../yak-internals/cross-file-resolver/parseModule.ts
|
|
34
34
|
async function parseModule(context, modulePath) {
|
|
35
35
|
try {
|
|
@@ -70,7 +70,7 @@ async function uncachedParseModule(context, modulePath) {
|
|
|
70
70
|
path: modulePath,
|
|
71
71
|
js: transformed,
|
|
72
72
|
exports,
|
|
73
|
-
styledComponents: parseStyledComponents(transformed.code
|
|
73
|
+
styledComponents: parseStyledComponents(transformed.code),
|
|
74
74
|
mixins
|
|
75
75
|
};
|
|
76
76
|
}
|
|
@@ -89,7 +89,7 @@ function parseMixins(sourceContents) {
|
|
|
89
89
|
}
|
|
90
90
|
return mixins;
|
|
91
91
|
}
|
|
92
|
-
function parseStyledComponents(sourceContents
|
|
92
|
+
function parseStyledComponents(sourceContents) {
|
|
93
93
|
const styledParts = sourceContents.split("/*YAK EXPORTED STYLED:");
|
|
94
94
|
let styledComponents = {};
|
|
95
95
|
for (let i = 1; i < styledParts.length; i++) {
|
|
@@ -98,7 +98,7 @@ function parseStyledComponents(sourceContents, transpilationMode) {
|
|
|
98
98
|
styledComponents[componentName] = {
|
|
99
99
|
type: "styled-component",
|
|
100
100
|
nameParts: componentName.split("."),
|
|
101
|
-
value:
|
|
101
|
+
value: `.${className}`
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
return styledComponents;
|
|
@@ -120,6 +120,23 @@ function objectToModuleExport(object) {
|
|
|
120
120
|
}));
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
//#endregion
|
|
124
|
+
//#region ../yak-internals/cross-file-resolver/rewriteRelativeCssUrls.ts
|
|
125
|
+
function rewriteRelativeCssUrls(css, source, consumer) {
|
|
126
|
+
if (!css.includes("url(")) return css;
|
|
127
|
+
const path = /^[a-z]:[\\/]/i.test(consumer) ? win32 : posix;
|
|
128
|
+
const prefix = path.relative(path.dirname(consumer), path.dirname(source.split("?")[0]));
|
|
129
|
+
if (path.isAbsolute(prefix)) return css;
|
|
130
|
+
return css.replace(cssUrlRegex, (match, double, single, bare) => {
|
|
131
|
+
const url = double ?? single ?? bare ?? "";
|
|
132
|
+
if (!url.startsWith("./") && !url.startsWith("../")) return match;
|
|
133
|
+
const quote = double !== void 0 ? "\"" : single !== void 0 ? "'" : "";
|
|
134
|
+
const rewritten = path.join(prefix, url).replace(/\\/g, "/");
|
|
135
|
+
return `url(${quote}${rewritten.startsWith("../") ? "" : "./"}${rewritten}${quote})`;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const cssUrlRegex = /url\(\s*(?:"([^"*]*)"|'([^'*]*)'|([^'"()\s*]*))\s*\)/g;
|
|
139
|
+
|
|
123
140
|
//#endregion
|
|
124
141
|
//#region ../yak-internals/cross-file-resolver/Errors.ts
|
|
125
142
|
var CauseError = class CauseError extends Error {
|
|
@@ -184,6 +201,7 @@ async function uncachedResolveCrossFileConstant(context, filePath, css) {
|
|
|
184
201
|
}
|
|
185
202
|
replacement = resolved.type === "styled-component" ? resolved.value : resolved.value + (["}", ";"].includes(String(resolved.value).trimEnd().slice(-1)) ? "" : semicolon);
|
|
186
203
|
}
|
|
204
|
+
if (resolved.type !== "unresolved-tag" && resolved.source !== filePath) replacement = rewriteRelativeCssUrls(String(replacement), resolved.source, filePath);
|
|
187
205
|
result = result.slice(0, position) + String(replacement) + result.slice(position + size);
|
|
188
206
|
}
|
|
189
207
|
return {
|
|
@@ -449,7 +467,6 @@ async function sha1(message) {
|
|
|
449
467
|
//#region ../yak-internals/loaders/lib/debugLogger.ts
|
|
450
468
|
function createDebugLogger(debugOptions, rootPath) {
|
|
451
469
|
if (!debugOptions) return () => {};
|
|
452
|
-
throwOnDeprecatedDebugOptions(debugOptions);
|
|
453
470
|
const pattern = debugOptions === true ? void 0 : debugOptions.pattern;
|
|
454
471
|
const typesArray = debugOptions === true ? void 0 : debugOptions.types;
|
|
455
472
|
let compiledPattern = null;
|
|
@@ -461,32 +478,14 @@ function createDebugLogger(debugOptions, rootPath) {
|
|
|
461
478
|
const types = typesArray ? new Set(typesArray) : null;
|
|
462
479
|
return (messageType, message, filePath) => {
|
|
463
480
|
if (types && !types.has(messageType)) return;
|
|
464
|
-
const relativePath =
|
|
481
|
+
const relativePath = relative(rootPath, filePath);
|
|
465
482
|
if (!compiledPattern || compiledPattern.test(relativePath)) console.log("🐮 Yak", `[${messageType}]`, relativePath, "\n\n", message);
|
|
466
483
|
};
|
|
467
484
|
}
|
|
468
|
-
function throwOnDeprecatedDebugOptions(debugOptions) {
|
|
469
|
-
if (typeof debugOptions === "string") {
|
|
470
|
-
const suggestion = suggestTypesForExtensionPattern(debugOptions) ?? `debug: { pattern: "${debugOptions}" }`;
|
|
471
|
-
throw new Error(`The debug option no longer accepts a string. Please update your config:\n Before: debug: "${debugOptions}"\n After: ${suggestion}`);
|
|
472
|
-
}
|
|
473
|
-
if (typeof debugOptions === "object" && "filter" in debugOptions) throw new Error("The debug option no longer accepts { filter, type }. Please update your config:\n Before: debug: { filter: ..., type: \"...\" }\n After: debug: { pattern: \"...\", types: [\"ts\", \"css\", \"css-resolved\"] }");
|
|
474
|
-
if (typeof debugOptions === "object" && debugOptions.pattern) {
|
|
475
|
-
const suggestion = suggestTypesForExtensionPattern(debugOptions.pattern);
|
|
476
|
-
if (suggestion) throw new Error(`The debug pattern "${debugOptions.pattern}" looks like it's filtering by output type using the old file extension convention.\nThe pattern now only matches file paths. Use the "types" option to filter by output type:\n Before: debug: { pattern: "${debugOptions.pattern}" }\n After: ${suggestion}`);
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
function suggestTypesForExtensionPattern(pattern) {
|
|
480
|
-
const extensionMatch = pattern.match(/\.\(?(?:css-resolved|css)\)?\$?$/);
|
|
481
|
-
if (!extensionMatch) return null;
|
|
482
|
-
const type = extensionMatch[0].includes("css-resolved") ? "css-resolved" : "css";
|
|
483
|
-
const remaining = pattern.slice(0, extensionMatch.index);
|
|
484
|
-
return remaining ? `debug: { pattern: "${remaining}", types: ["${type}"] }` : `debug: { types: ["${type}"] }`;
|
|
485
|
-
}
|
|
486
485
|
|
|
487
486
|
//#endregion
|
|
488
487
|
//#region ../yak-internals/loaders/lib/extractCss.ts
|
|
489
|
-
function extractCss(code
|
|
488
|
+
function extractCss(code) {
|
|
490
489
|
let codeString;
|
|
491
490
|
if (typeof code === "string") codeString = code;
|
|
492
491
|
else if (code instanceof Buffer) codeString = code.toString("utf-8");
|
|
@@ -498,7 +497,6 @@ function extractCss(code, transpilationMode) {
|
|
|
498
497
|
const codeUntilEnd = codeParts[i].split("*/")[0];
|
|
499
498
|
result += codeUntilEnd;
|
|
500
499
|
}
|
|
501
|
-
if (result && transpilationMode !== "Css") result = "/* cssmodules-pure-no-check */\n" + result;
|
|
502
500
|
return result;
|
|
503
501
|
}
|
|
504
502
|
|
|
@@ -510,7 +508,7 @@ const yakPackageNames = ["@yak/react", "@yak/solid"];
|
|
|
510
508
|
//#region ../yak-internals/loaders/lib/parseExports.ts
|
|
511
509
|
async function parseExports(sourceContents) {
|
|
512
510
|
try {
|
|
513
|
-
const ast =
|
|
511
|
+
const ast = parse(sourceContents, {
|
|
514
512
|
sourceType: "module",
|
|
515
513
|
plugins: ["jsx", "typescript"]
|
|
516
514
|
});
|
|
@@ -520,8 +518,26 @@ async function parseExports(sourceContents) {
|
|
|
520
518
|
all: []
|
|
521
519
|
};
|
|
522
520
|
const variableDeclarations = {};
|
|
521
|
+
const importBindings = {};
|
|
522
|
+
const localExportSpecifiers = [];
|
|
523
523
|
let defaultIdentifier = null;
|
|
524
524
|
for (const node of ast.program.body) {
|
|
525
|
+
if (node.type === "ImportDeclaration") {
|
|
526
|
+
for (const specifier of node.specifiers) if (specifier.type === "ImportSpecifier") importBindings[specifier.local.name] = {
|
|
527
|
+
type: "re-export",
|
|
528
|
+
from: node.source.value,
|
|
529
|
+
name: specifier.imported.type === "Identifier" ? specifier.imported.name : specifier.imported.value
|
|
530
|
+
};
|
|
531
|
+
else if (specifier.type === "ImportDefaultSpecifier") importBindings[specifier.local.name] = {
|
|
532
|
+
type: "re-export",
|
|
533
|
+
from: node.source.value,
|
|
534
|
+
name: "default"
|
|
535
|
+
};
|
|
536
|
+
else if (specifier.type === "ImportNamespaceSpecifier") importBindings[specifier.local.name] = {
|
|
537
|
+
type: "namespace-re-export",
|
|
538
|
+
from: node.source.value
|
|
539
|
+
};
|
|
540
|
+
}
|
|
525
541
|
if (node.type === "VariableDeclaration") {
|
|
526
542
|
for (const decl of node.declarations) if (decl.id.type === "Identifier" && decl.init) variableDeclarations[decl.id.name] = decl.init;
|
|
527
543
|
}
|
|
@@ -537,7 +553,12 @@ async function parseExports(sourceContents) {
|
|
|
537
553
|
from: node.source.value
|
|
538
554
|
};
|
|
539
555
|
}
|
|
540
|
-
else if (node.declaration
|
|
556
|
+
else if (!node.declaration) {
|
|
557
|
+
for (const specifier of node.specifiers) if (specifier.type === "ExportSpecifier" && specifier.exported.type === "Identifier" && specifier.local.type === "Identifier") localExportSpecifiers.push({
|
|
558
|
+
local: specifier.local.name,
|
|
559
|
+
exported: specifier.exported.name
|
|
560
|
+
});
|
|
561
|
+
} else if (node.declaration.type === "VariableDeclaration") {
|
|
541
562
|
for (const declaration of node.declaration.declarations) if (declaration.id.type === "Identifier" && declaration.init) {
|
|
542
563
|
variableDeclarations[declaration.id.name] = declaration.init;
|
|
543
564
|
const parsed = parseExportValueExpression(declaration.init, sourceContents);
|
|
@@ -556,7 +577,18 @@ async function parseExports(sourceContents) {
|
|
|
556
577
|
}
|
|
557
578
|
if (node.type === "ExportAllDeclaration") moduleExports.all.push(node.source.value);
|
|
558
579
|
}
|
|
559
|
-
|
|
580
|
+
const resolveIdentifier = (name) => {
|
|
581
|
+
if (variableDeclarations[name]) return parseExportValueExpression(variableDeclarations[name], sourceContents);
|
|
582
|
+
return importBindings[name];
|
|
583
|
+
};
|
|
584
|
+
for (const { local, exported } of localExportSpecifiers) {
|
|
585
|
+
const resolved = resolveIdentifier(local);
|
|
586
|
+
if (resolved) moduleExports.named[exported] = resolved;
|
|
587
|
+
}
|
|
588
|
+
if (defaultIdentifier) {
|
|
589
|
+
const resolved = resolveIdentifier(defaultIdentifier);
|
|
590
|
+
if (resolved) moduleExports.named["default"] = resolved;
|
|
591
|
+
}
|
|
560
592
|
return moduleExports;
|
|
561
593
|
} catch (error) {
|
|
562
594
|
throw new Error(`Error parsing exports: ${error.message}`);
|
|
@@ -650,7 +682,7 @@ function invalidateDependenciesWithDiskModifications(evaluator) {
|
|
|
650
682
|
const modificationTimes = getFileModificationTimes();
|
|
651
683
|
const modifiedDependencies = [];
|
|
652
684
|
for (const [dep, lastModificationTime] of modificationTimes) try {
|
|
653
|
-
const currentModificationTime =
|
|
685
|
+
const currentModificationTime = statSync(dep).mtimeMs;
|
|
654
686
|
if (currentModificationTime !== lastModificationTime) {
|
|
655
687
|
modifiedDependencies.push(dep);
|
|
656
688
|
modificationTimes.set(dep, currentModificationTime);
|
|
@@ -664,7 +696,7 @@ function invalidateDependenciesWithDiskModifications(evaluator) {
|
|
|
664
696
|
function recordModificationTimes(deps) {
|
|
665
697
|
const modificationTimes = getFileModificationTimes();
|
|
666
698
|
for (const dep of deps) try {
|
|
667
|
-
modificationTimes.set(dep,
|
|
699
|
+
modificationTimes.set(dep, statSync(dep).mtimeMs);
|
|
668
700
|
} catch {}
|
|
669
701
|
}
|
|
670
702
|
async function createCompilationEvaluator() {
|
|
@@ -701,18 +733,18 @@ var init_turbo_evaluator = __esmMin((() => {
|
|
|
701
733
|
|
|
702
734
|
//#endregion
|
|
703
735
|
//#region loaders/turbo-loader.ts
|
|
704
|
-
const yakSwcPluginPath =
|
|
736
|
+
const yakSwcPluginPath = createRequire(import.meta.url).resolve("@yak/swc");
|
|
705
737
|
const dataUrlImportPrefix = "import \"data:text/css;base64,";
|
|
706
738
|
async function cssExtractLoader(code, sourceMap) {
|
|
707
739
|
const callback = this.async();
|
|
708
740
|
if (!code.includes("@yak/react")) return callback(null, code, sourceMap);
|
|
709
|
-
const { yakPluginOptions, yakOptions: {
|
|
710
|
-
const debugLog = createDebugLogger(
|
|
741
|
+
const { yakPluginOptions, yakOptions: { debug }, cssUrlsFromRoot } = this.getOptions();
|
|
742
|
+
const debugLog = createDebugLogger(debug, this.rootContext);
|
|
711
743
|
const resolveTurbopack = this.getResolve({});
|
|
712
744
|
const transform = createTransform(yakPluginOptions, yakSwcPluginPath);
|
|
713
745
|
const resolveFn = (specifier, importer) => {
|
|
714
746
|
return new Promise((resolve, reject) => {
|
|
715
|
-
resolveTurbopack(
|
|
747
|
+
resolveTurbopack(dirname(importer), specifier, (err, result) => {
|
|
716
748
|
if (err) return reject(err);
|
|
717
749
|
if (!result) return reject(/* @__PURE__ */ new Error(`Could not resolve ${specifier}`));
|
|
718
750
|
resolve(result);
|
|
@@ -732,12 +764,11 @@ async function cssExtractLoader(code, sourceMap) {
|
|
|
732
764
|
try {
|
|
733
765
|
const result = await transform(code, this.resourcePath, this.rootContext, sourceMap);
|
|
734
766
|
debugLog("ts", result.code, this.resourcePath);
|
|
735
|
-
let css = extractCss(result.code
|
|
767
|
+
let css = extractCss(result.code);
|
|
736
768
|
debugLog("css", css, this.resourcePath);
|
|
737
769
|
const { resolved } = await resolveCrossFileConstant({
|
|
738
770
|
parse: (modulePath) => {
|
|
739
771
|
return parseModule({
|
|
740
|
-
transpilationMode: "Css",
|
|
741
772
|
extractExports: async (modulePath) => {
|
|
742
773
|
const sourceContents = await fsReadFile(modulePath);
|
|
743
774
|
return parseExports(sourceContents);
|
|
@@ -756,9 +787,10 @@ async function cssExtractLoader(code, sourceMap) {
|
|
|
756
787
|
resolve: resolveFn
|
|
757
788
|
}, this.resourcePath, css);
|
|
758
789
|
for (const dep of crossFileDeps) this.addDependency(dep);
|
|
759
|
-
const
|
|
760
|
-
|
|
761
|
-
|
|
790
|
+
const dataUrlCss = cssUrlsFromRoot ? rewriteRelativeCssUrls(resolved, this.resourcePath, join(this.rootContext, "root.css")) : resolved;
|
|
791
|
+
const codeWithCrossFileResolved = replaceDataUrlImport(result.code, dataUrlCss);
|
|
792
|
+
debugLog("css-resolved", dataUrlCss, this.resourcePath);
|
|
793
|
+
return callback(null, codeWithCrossFileResolved, result.map ? JSON.parse(result.map) : void 0);
|
|
762
794
|
} catch (error) {
|
|
763
795
|
for (const dep of crossFileDeps) this.addDependency(dep);
|
|
764
796
|
return callback(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -772,7 +804,7 @@ function replaceDataUrlImport(code, resolvedCss) {
|
|
|
772
804
|
return lines.join("\n");
|
|
773
805
|
}
|
|
774
806
|
function createTransform(yakPluginOptions, yakSwcPluginPath) {
|
|
775
|
-
return (data, modulePath, rootPath, sourceMap) =>
|
|
807
|
+
return (data, modulePath, rootPath, sourceMap) => transform(data, {
|
|
776
808
|
filename: modulePath,
|
|
777
809
|
inputSourceMap: sourceMap,
|
|
778
810
|
sourceMaps: true,
|
|
@@ -799,5 +831,5 @@ function createTransform(yakPluginOptions, yakSwcPluginPath) {
|
|
|
799
831
|
}
|
|
800
832
|
|
|
801
833
|
//#endregion
|
|
802
|
-
|
|
803
|
-
//# sourceMappingURL=turbo-loader.
|
|
834
|
+
export { cssExtractLoader as default };
|
|
835
|
+
//# sourceMappingURL=turbo-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turbo-loader.js","names":["swcTransform"],"sources":["../../../yak-internals/cross-file-resolver/parseModule.ts","../../../yak-internals/cross-file-resolver/rewriteRelativeCssUrls.ts","../../../yak-internals/cross-file-resolver/Errors.ts","../../../yak-internals/cross-file-resolver/resolveCrossFileConstant.ts","../../../yak-internals/loaders/lib/debugLogger.ts","../../../yak-internals/loaders/lib/extractCss.ts","../../../yak-internals/packageNames.ts","../../../yak-internals/loaders/lib/parseExports.ts","../../../yak-internals/loaders/lib/swcParserOptions.ts","../../loaders/turbo-evaluator.ts","../../loaders/turbo-loader.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);\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(sourceContents: string): 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: `.${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 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","import { posix, win32 } from \"node:path\";\n\n/**\n * A mixin keeps the relative url() paths of the file that defines it. When the\n * cross-file resolver inlines the mixin into a file in another directory, the\n * bundler resolves those paths from the new file, so they have to change:\n *\n * // src/icons/mixins.ts\n * export const sun = css`background: url(\"./sun.avif\");`;\n * // src/pages/home.tsx\n * const Hero = styled.div`${sun}`;\n * -> background: url(\"../icons/sun.avif\");\n *\n * Only paths that start with \"./\" or \"../\" change. \"/sun.avif\", \"data:\" and\n * \"https:\" urls point to the same place from every file.\n */\nexport function rewriteRelativeCssUrls(css: string, source: string, consumer: string): string {\n if (!css.includes(\"url(\")) return css;\n // Windows paths arrive as \"C:\\app\\a.tsx\" from webpack and as \"C:/app/a.tsx\" from\n // Vite. win32 reads both, and choosing it by the path keeps the result the same on\n // every OS, which lets the unit tests cover Windows paths.\n const path = /^[a-z]:[\\\\/]/i.test(consumer) ? win32 : posix;\n // A query on the mixin import, as in `import { sun } from \"./mixins.ts?v=2\"`, is not part of the path\n const prefix = path.relative(path.dirname(consumer), path.dirname(source.split(\"?\")[0]));\n // Two Windows drives have no relative path between them, so relative() returns\n // the absolute directory of the source and the urls stay as they are\n if (path.isAbsolute(prefix)) return css;\n\n return css.replace(cssUrlRegex, (match, double?: string, single?: string, bare?: string) => {\n const url = double ?? single ?? bare ?? \"\";\n if (!url.startsWith(\"./\") && !url.startsWith(\"../\")) return match;\n const quote = double !== undefined ? '\"' : single !== undefined ? \"'\" : \"\";\n // \"../icons\" + \"./sun.avif\" -> \"../icons/sun.avif\", \"img\" + \"./a.png\" -> \"./img/a.png\"\n const rewritten = path.join(prefix, url).replace(/\\\\/g, \"/\");\n return `url(${quote}${rewritten.startsWith(\"../\") ? \"\" : \"./\"}${rewritten}${quote})`;\n });\n}\n\n/**\n * url(\"a.png\"), url('a.png') or url(a.png), with optional spaces inside the parentheses.\n * The url has no \"*\": without that, a match could start in a comment and run into the\n * next rule, so `/* url(\"./ *\\/ .a:before { content: \")\" }` would rewrite the rule.\n */\nconst cssUrlRegex = /url\\(\\s*(?:\"([^\"*]*)\"|'([^'*]*)'|([^'\"()\\s*]*))\\s*\\)/g;\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 { rewriteRelativeCssUrls } from \"./rewriteRelativeCssUrls.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 // A mixin from another file keeps its own relative url() paths, see rewriteRelativeCssUrls\n if (resolved.type !== \"unresolved-tag\" && resolved.source !== filePath) {\n replacement = rewriteRelativeCssUrls(String(replacement), resolved.source, filePath);\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 \"../../config.js\";\n\ntype DebugOptions = YakConfigOptions[\"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 // 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 * Extracts CSS content from code that contains YAK-generated CSS comments.\n * Parses the input code and returns the extracted CSS.\n */\nexport function extractCss(code: string | Buffer<ArrayBufferLike>): 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\n return result;\n}\n","/**\n * Import sources of all yak runtime packages, for code that must detect any of them.\n * Mirrors YakPackage in yak-swc's yak_imports.rs\n */\nexport const yakPackageNames = [\"@yak/react\", \"@yak/solid\"] as const;\n","import { parse } from \"@babel/parser\";\nimport type { Expression, ObjectExpression, TSAsExpression } from \"@babel/types\";\nimport {\n ModuleExport,\n ModuleExports,\n UnsupportedExportSource,\n} from \"../../cross-file-resolver/parseModule.js\";\nimport { yakPackageNames } from \"../../packageNames.js\";\n\n/**\n * Extracts a module's exports for the cross-file resolver by parsing with babel. Nothing is executed.\n *\n * Handles `export const`, export lists (`export { x }`), re-exports with a `from`,\n * `export *`, and `export default`.\n * Anything else becomes an `unsupported` entry with its source location, or is skipped.\n *\n * Throws if the source doesn't parse.\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) =>\n node.type === \"ImportDeclaration\" &&\n (yakPackageNames as readonly string[]).includes(node.source.value),\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 // Track top-level import bindings so exported imports become re-exports\n const importBindings: Record<string, ModuleExport> = {};\n // Local export lists (`export { x }`), resolved after the loop\n // because the list can come before the declaration\n const localExportSpecifiers: { local: string; exported: string }[] = [];\n let defaultIdentifier: string | null = null;\n\n for (const node of ast.program.body) {\n if (node.type === \"ImportDeclaration\") {\n for (const specifier of node.specifiers) {\n if (specifier.type === \"ImportSpecifier\") {\n importBindings[specifier.local.name] = {\n type: \"re-export\",\n from: node.source.value,\n name:\n specifier.imported.type === \"Identifier\"\n ? specifier.imported.name\n : specifier.imported.value,\n };\n } else if (specifier.type === \"ImportDefaultSpecifier\") {\n importBindings[specifier.local.name] = {\n type: \"re-export\",\n from: node.source.value,\n name: \"default\",\n };\n } else if (specifier.type === \"ImportNamespaceSpecifier\") {\n importBindings[specifier.local.name] = {\n type: \"namespace-re-export\",\n from: node.source.value,\n };\n }\n }\n }\n\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) {\n // export { x }, export { x as y }\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 localExportSpecifiers.push({\n local: specifier.local.name,\n exported: specifier.exported.name,\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 // Look up the value of an exported identifier from local declarations or imports\n const resolveIdentifier = (name: string): ModuleExport | undefined => {\n if (variableDeclarations[name]) {\n return parseExportValueExpression(variableDeclarations[name], sourceContents);\n }\n return importBindings[name];\n };\n\n for (const { local, exported } of localExportSpecifiers) {\n const resolved = resolveIdentifier(local);\n if (resolved) {\n moduleExports.named[exported] = resolved;\n }\n }\n\n // If we found a default export that's an identifier, look up its value\n if (defaultIdentifier) {\n const resolved = resolveIdentifier(defaultIdentifier);\n if (resolved) {\n moduleExports.named[\"default\"] = resolved;\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","import type { ParserConfig } from \"@swc/core\";\n\nconst typeScriptWithoutJsx = /\\.[mc]?ts$/;\nconst typeScriptWithJsx = /\\.tsx$/;\n\n/**\n * Derive the SWC parser configuration for a single file.\n *\n * JSX is not allowed in `.ts`, `.mts` and `.cts`\n * therefore we must parse these as pure TS/JS and must not return JSX\n *\n * This is inspired by next.js own handling.\n */\nexport function getSwcParserOptions(filename: string): ParserConfig {\n // module ids may carry a query string (`/a/b.ts?v=1`)\n const [path] = filename.split(\"?\");\n if (typeScriptWithoutJsx.test(path)) {\n return { syntax: \"typescript\", tsx: false, dynamicImport: true };\n }\n if (typeScriptWithJsx.test(path)) {\n return { syntax: \"typescript\", tsx: true, dynamicImport: true };\n }\n return { syntax: \"ecmascript\", jsx: true, dynamicImport: true };\n}\n","/**\n * Turbopack evaluator adapter.\n *\n * Bridges the low-level `Evaluator` (worker-thread module evaluator) and\n * turbopack's loader lifecycle. A single `Evaluator` instance is kept as a\n * singleton on `globalThis` because turbopack may create multiple loader\n * instances that share the same process — `Symbol.for` keys guarantee all\n * instances converge on the same evaluator and modification time map.\n *\n * Invalidation uses synchronous modification time polling rather than `fs.watch` because\n * turbopack can re-run a loader before a filesystem watcher event fires,\n * which would cause the evaluator to return stale cached results.\n */\nimport { statSync } from \"node:fs\";\nimport type { Evaluator } from \"../isolated-source-eval/index.js\";\n\nconst EVALUATOR_KEY = Symbol.for(\"@yak/react-evaluator\");\nconst MTIMES_KEY = Symbol.for(\"@yak/react-mtimes\");\n\n/**\n * A shared `Map` of file paths to their last known modification times, used to detect changes on disk\n *\n * e.g. bar.ts -> 1680000000000 (Sat Mar 28 2024 12:00:00 GMT+0000)\n *\n * fs.fileWatch is not used as it might be out of sync with turbopacks own file watching also turbopack\n * spawns a loader pool which could cause a lot of file watchers to be created which can cause performance issues and hitting OS limits\n */\nconst getFileModificationTimes = () =>\n ((globalThis as typeof globalThis & { [MTIMES_KEY]?: Map<string, number> })[MTIMES_KEY] ??=\n new Map<string, number>());\n\n/**\n * Returns the shared evaluator, creating it on first call.\n *\n * Uses `Symbol.for` keys on `globalThis` so every turbopack loader instance\n * in the process converges on the same evaluator and modification time map. A\n * `beforeExit` handler terminates the worker threads when the process winds\n * down.\n */\nexport const getEvaluatorSingleton = async (): Promise<Evaluator> => {\n const processGlobal = globalThis as typeof globalThis & {\n [EVALUATOR_KEY]?: Promise<Evaluator>;\n };\n if (!processGlobal[EVALUATOR_KEY]) {\n processGlobal[EVALUATOR_KEY] = import(\"../isolated-source-eval/index.js\").then(\n ({ createEvaluator }) => createEvaluator(),\n );\n // Kill the worker threads when the process exits\n process.on(\"beforeExit\", async () => {\n const evaluator = await processGlobal[EVALUATOR_KEY]!;\n await evaluator.dispose();\n });\n }\n return processGlobal[EVALUATOR_KEY]!;\n};\n\n/**\n * Turbopack runs the loader for the same compilation file-by-file, but multiple files can share the\n * same dependency. This function detects which dependencies actually changed\n * on disk and invalidates them once — this prevents re-evaluating the same module multiple times in the same compilation\n */\nfunction invalidateDependenciesWithDiskModifications(evaluator: Evaluator): void {\n const modificationTimes = getFileModificationTimes();\n const modifiedDependencies: string[] = [];\n for (const [dep, lastModificationTime] of modificationTimes) {\n try {\n const currentModificationTime = statSync(dep).mtimeMs;\n if (currentModificationTime !== lastModificationTime) {\n modifiedDependencies.push(dep);\n modificationTimes.set(dep, currentModificationTime);\n }\n } catch {\n modifiedDependencies.push(dep);\n modificationTimes.delete(dep);\n }\n }\n if (modifiedDependencies.length > 0) {\n evaluator.invalidate(...modifiedDependencies);\n }\n}\n\n/** Snapshots the current modification times of `deps` so the next evaluation can detect changes. */\nfunction recordModificationTimes(deps: string[]): void {\n const modificationTimes = getFileModificationTimes();\n for (const dep of deps) {\n try {\n modificationTimes.set(dep, statSync(dep).mtimeMs);\n } catch {\n /* file may not exist */\n }\n }\n}\n\n/**\n * Creates an evaluator function scoped to a single loader invocation.\n *\n * Before evaluation, checks whether any previously recorded dependency has\n * changed on disk and invalidates the evaluator cache if so. After a\n * successful evaluation, records fresh modification times and notifies the caller of\n * every transitive dependency via `onDependency`.\n *\n * @returns A function that evaluates a yak module and returns its exports.\n * The returned function accepts:\n * - `modulePath` — absolute path to the module to evaluate.\n * - `onDependency` — called once per transitive dependency so the loader\n * can register file watchers with turbopack.\n * @throws If the evaluated module throws at runtime — the original stack\n * trace from the worker thread is preserved.\n */\nexport async function createCompilationEvaluator(): Promise<\n (modulePath: string, onDependency?: (dep: string) => void) => Promise<Record<string, unknown>>\n> {\n const evaluator = await getEvaluatorSingleton();\n invalidateDependenciesWithDiskModifications(evaluator);\n\n return async (modulePath, onDependency?) => {\n const result = await evaluator.evaluate(modulePath);\n if (!result.ok) {\n const error = new Error(result.error.message);\n if (result.error.stack) {\n error.stack = result.error.stack;\n }\n throw error;\n }\n // Store times of newly discovered dependencies for next compilation\n recordModificationTimes(result.dependencies);\n if (onDependency) {\n for (const dep of result.dependencies) {\n onDependency(dep);\n }\n }\n return result.value;\n };\n}\n","import { transform as swcTransform } from \"@swc/core\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport type { LoaderContext } from \"webpack\";\nimport { parseModule } from \"yak-internals/cross-file-resolver/parse-module\";\nimport { resolveCrossFileConstant } from \"yak-internals/cross-file-resolver/resolve\";\nimport { rewriteRelativeCssUrls } from \"yak-internals/cross-file-resolver/rewrite-relative-css-urls\";\nimport type { YakConfigOptions } from \"../withYak/index.js\";\nimport { createDebugLogger } from \"yak-internals/debug-logger\";\nimport { extractCss } from \"yak-internals/extract-css\";\nimport { parseExports } from \"yak-internals/parse-exports\";\nimport { getSwcParserOptions } from \"yak-internals/swc-parser-options\";\n\nconst require = createRequire(import.meta.url);\nconst yakSwcPluginPath = require.resolve(\"@yak/swc\");\nconst dataUrlImportPrefix = 'import \"data:text/css;base64,';\n\n/**\n * This loader transforms styled-components styles to a static data-url import\n * The compile-time nexy-yak transformation takes javascript/typescript as input,\n * strips all inline css code and adds the css as static css urls\n * e.g.: `import \"data:text/css;base64,\"`\n */\nexport default async function cssExtractLoader(\n this: LoaderContext<{\n yakOptions: YakConfigOptions;\n yakPluginOptions: any;\n /**\n * Rspack resolves the url() paths of a data: url css import from the\n * compiler root, not from the importing file. With this option the loader\n * rewrites relative paths to point from the root:\n * url(\"./img/a.png\") in src/Box.tsx -> url(\"./src/img/a.png\").\n * Turbopack resolves them from the importing file and needs no rewrite.\n */\n cssUrlsFromRoot?: boolean;\n }>,\n code: string,\n sourceMap: string | undefined,\n): Promise<string | void> {\n const callback = this.async();\n\n // process only files which include @yak/react for maximal compile performance\n if (!code.includes(\"@yak/react\")) {\n return callback(null, code, sourceMap);\n }\n\n const {\n yakPluginOptions,\n yakOptions: { debug },\n cssUrlsFromRoot,\n } = this.getOptions();\n const debugLog = createDebugLogger(debug, this.rootContext);\n const resolveTurbopack = this.getResolve({});\n const transform = createTransform(yakPluginOptions, yakSwcPluginPath);\n\n const resolveFn = (specifier: string, importer: string) => {\n return new Promise<string>((resolve, reject) => {\n resolveTurbopack(dirname(importer), specifier, (err, result) => {\n if (err) return reject(err);\n if (!result) return reject(new Error(`Could not resolve ${specifier}`));\n resolve(result);\n });\n });\n };\n\n const crossFileDeps = new Set<string>();\n let evaluate:\n | Awaited<ReturnType<typeof import(\"./turbo-evaluator.js\").createCompilationEvaluator>>\n | undefined;\n const fsReadFile = (filePath: string) => {\n crossFileDeps.add(filePath);\n return new Promise<string>((resolve, reject) =>\n this.fs.readFile(filePath, \"utf-8\", (err, result) => {\n if (err) return reject(err);\n if (!result) return reject(new Error(`File not found: ${filePath}`));\n resolve(result);\n }),\n );\n };\n\n try {\n const result = await transform(code, this.resourcePath, this.rootContext, sourceMap);\n debugLog(\"ts\", result.code, this.resourcePath);\n\n let css = extractCss(result.code);\n debugLog(\"css\", css, this.resourcePath);\n\n const { resolved } = await resolveCrossFileConstant(\n {\n parse: (modulePath) => {\n return parseModule(\n {\n extractExports: async (modulePath) => {\n const sourceContents = await fsReadFile(modulePath);\n return parseExports(sourceContents);\n },\n getTransformed: async (modulePath) => {\n const sourceContent = await fsReadFile(modulePath);\n return transform(sourceContent, modulePath, this.rootContext);\n },\n evaluateYakModule: async (modulePath: string) => {\n crossFileDeps.add(modulePath);\n /*\n * Turbopack doesn't let us know when a compilation start so by using a singleton evaluator we\n * we can at least ensture that we scan for file modifications only once per loader call\n */\n evaluate ??= await (\n await import(\"./turbo-evaluator.js\")\n ).createCompilationEvaluator();\n return evaluate(modulePath, (dep) => crossFileDeps.add(dep));\n },\n },\n modulePath,\n );\n },\n resolve: resolveFn,\n },\n this.resourcePath,\n css,\n );\n\n // Register cross-file dependencies so turbopack re-runs this loader\n // when any dependency changes (analogous to webpack's this.addDependency)\n for (const dep of crossFileDeps) {\n this.addDependency(dep);\n }\n\n // A file name in the root directory: the rewrite only uses its directory\n const dataUrlCss = cssUrlsFromRoot\n ? rewriteRelativeCssUrls(resolved, this.resourcePath, join(this.rootContext, \"root.css\"))\n : resolved;\n const codeWithCrossFileResolved = replaceDataUrlImport(result.code, dataUrlCss);\n\n debugLog(\"css-resolved\", dataUrlCss, this.resourcePath);\n // swc returns a JSON string, which babel-loader rejects as inputSourceMap\n return callback(\n null,\n codeWithCrossFileResolved,\n result.map ? JSON.parse(result.map) : undefined,\n );\n } catch (error) {\n // Register cross-file dependencies even on error so turbopack re-runs\n // this loader when a broken dependency is fixed.\n for (const dep of crossFileDeps) {\n this.addDependency(dep);\n }\n return callback(error instanceof Error ? error : new Error(String(error)));\n }\n}\n\n/**\n * Swap the data-url import the SWC plugin emitted for one carrying the resolved css.\n *\n * Modules which import @yak/react without declaring styles get no such import and are\n * returned unchanged. The import is matched from the start of the line so that source\n * code merely mentioning a data url cannot be mistaken for it.\n */\nfunction replaceDataUrlImport(code: string, resolvedCss: string): string {\n const lines = code.split(\"\\n\");\n const lineIndex = lines.findIndex((line) => line.trimStart().startsWith(dataUrlImportPrefix));\n if (lineIndex === -1) {\n return code;\n }\n lines[lineIndex] = `${dataUrlImportPrefix}${Buffer.from(resolvedCss).toString(\"base64\")}\";`;\n return lines.join(\"\\n\");\n}\n\nfunction createTransform(yakPluginOptions: any, yakSwcPluginPath: string) {\n return (data: string, modulePath: string, rootPath: string, sourceMap?: any) =>\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/loaders/next-swc-loader.ts#L143\n swcTransform(data, {\n filename: modulePath,\n inputSourceMap: sourceMap,\n sourceMaps: true,\n sourceFileName: modulePath,\n sourceRoot: rootPath,\n jsc: {\n // Derive the parser from the file name the same way Next.js does\n parser: getSwcParserOptions(modulePath),\n experimental: {\n // Keep `import data from \"./data.json\" with { type: \"json\" }` intact\n keepImportAttributes: true,\n plugins: [[yakSwcPluginPath, yakPluginOptions]],\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}\n"],"mappings":"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"}
|
|
@@ -39,35 +39,25 @@ type YakConfigOptions = {
|
|
|
39
39
|
* @defaultValue true
|
|
40
40
|
*/
|
|
41
41
|
strictCssProp?: boolean;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
types: Array<"ts" | "css" | "css-resolved">;
|
|
54
|
-
};
|
|
55
|
-
transpilationMode?: "CssModule" | "Css";
|
|
56
|
-
/**
|
|
57
|
-
* Suppress deprecation warnings for :global() selectors during migration period
|
|
58
|
-
* @defaultValue false
|
|
59
|
-
*/
|
|
60
|
-
suppressDeprecationWarnings?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Debug logging for transformed files.
|
|
44
|
+
* - `true` - log all files
|
|
45
|
+
* - `object` - filter by pattern and/or output types (at least one required)
|
|
46
|
+
*/
|
|
47
|
+
debug?: true | {
|
|
48
|
+
pattern: string;
|
|
49
|
+
types?: Array<"ts" | "css" | "css-resolved">;
|
|
50
|
+
} | {
|
|
51
|
+
pattern?: string;
|
|
52
|
+
types: Array<"ts" | "css" | "css-resolved">;
|
|
61
53
|
};
|
|
62
54
|
};
|
|
63
55
|
//#endregion
|
|
64
56
|
//#region ../yak-internals/loaders/vite-plugin-core.d.ts
|
|
65
57
|
type ViteYakPluginOptions = YakConfigOptions & {
|
|
66
58
|
/**
|
|
67
|
-
* Base path for
|
|
68
|
-
* Relative paths are resolved from Vite's project root.
|
|
69
|
-
* In monorepo setups where source files live outside the Vite project root,
|
|
70
|
-
* set this to the monorepo root to avoid broken CSS imports.
|
|
59
|
+
* Base path for the file paths yak-swc turns into stable class names and
|
|
60
|
+
* shows in debug output. Relative paths are resolved from Vite's project root.
|
|
71
61
|
* @defaultValue Vite's resolved `root`
|
|
72
62
|
*/
|
|
73
63
|
basePath?: string;
|
|
@@ -105,7 +95,7 @@ type SwcOverrides = Omit<Options, "filename" | "sourceFileName" | "inputSourceMa
|
|
|
105
95
|
* });
|
|
106
96
|
* ```
|
|
107
97
|
*/
|
|
108
|
-
declare const viteYak: (userOptions?: ViteYakPluginOptions) => Promise<import("vite").Plugin>;
|
|
98
|
+
export declare const viteYak: (userOptions?: ViteYakPluginOptions) => Promise<import("vite").Plugin>;
|
|
109
99
|
//#endregion
|
|
110
|
-
export {
|
|
100
|
+
export type { ViteYakPluginOptions };
|
|
111
101
|
//# sourceMappingURL=vite-plugin.d.ts.map
|