@wyw-in-js/turbopack-loader 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,14 @@
1
+ # `@wyw-in-js/turbopack-loader`
2
+
3
+ Turbopack-compatible loader for WyW-in-JS.
4
+
5
+ This package is designed to be used via Next.js `turbopack.rules`.
6
+
7
+ ## Output strategy
8
+
9
+ When a file produces CSS, the loader:
10
+
11
+ - writes `*.wyw-in-js.module.css` next to the source file (only if content changed, atomically);
12
+ - injects `import './<file>.wyw-in-js.module.css'` into the transformed module;
13
+ - wraps selectors in `:global(...)` so Next's CSS Modules pipeline does not rename WyW-generated class names.
14
+
@@ -0,0 +1,178 @@
1
+ const nestingAtRules = new Set(['container', 'document', 'layer', 'media', 'scope', 'starting-style', 'supports']);
2
+ function isWhitespace(char) {
3
+ return char === ' ' || char === '\n' || char === '\r' || char === '\t' || char === '\f';
4
+ }
5
+ function isKeyframesAtRule(name) {
6
+ return name.toLowerCase().endsWith('keyframes');
7
+ }
8
+ function readString(css, start) {
9
+ const quote = css[start];
10
+ let idx = start + 1;
11
+ while (idx < css.length) {
12
+ const char = css[idx];
13
+ if (char === '\\') {
14
+ idx += 2;
15
+ } else if (char === quote) {
16
+ return idx + 1;
17
+ } else {
18
+ idx += 1;
19
+ }
20
+ }
21
+ return css.length;
22
+ }
23
+ function readComment(css, start) {
24
+ const end = css.indexOf('*/', start + 2);
25
+ return end === -1 ? css.length : end + 2;
26
+ }
27
+ function findAtRuleTerminator(css, start) {
28
+ let idx = start;
29
+ let parenDepth = 0;
30
+ let bracketDepth = 0;
31
+ while (idx < css.length) {
32
+ const char = css[idx];
33
+ if (char === '/' && css[idx + 1] === '*') {
34
+ idx = readComment(css, idx);
35
+ } else if (char === '"' || char === "'") {
36
+ idx = readString(css, idx);
37
+ } else {
38
+ if (char === '(') parenDepth += 1;else if (char === ')' && parenDepth > 0) parenDepth -= 1;else if (char === '[') bracketDepth += 1;else if (char === ']' && bracketDepth > 0) bracketDepth -= 1;
39
+ if (parenDepth === 0 && bracketDepth === 0 && (char === ';' || char === '{')) {
40
+ return idx;
41
+ }
42
+ idx += 1;
43
+ }
44
+ }
45
+ return css.length;
46
+ }
47
+ function findMatchingBrace(css, openBraceIdx) {
48
+ let idx = openBraceIdx + 1;
49
+ let depth = 1;
50
+ while (idx < css.length) {
51
+ const char = css[idx];
52
+ if (char === '/' && css[idx + 1] === '*') {
53
+ idx = readComment(css, idx);
54
+ } else if (char === '"' || char === "'") {
55
+ idx = readString(css, idx);
56
+ } else {
57
+ if (char === '{') depth += 1;else if (char === '}') {
58
+ depth -= 1;
59
+ if (depth === 0) return idx;
60
+ }
61
+ idx += 1;
62
+ }
63
+ }
64
+ return -1;
65
+ }
66
+ function splitSelectorList(selectorText) {
67
+ const parts = [];
68
+ let start = 0;
69
+ let idx = 0;
70
+ let parenDepth = 0;
71
+ let bracketDepth = 0;
72
+ while (idx < selectorText.length) {
73
+ const char = selectorText[idx];
74
+ if (char === '/' && selectorText[idx + 1] === '*') {
75
+ idx = readComment(selectorText, idx);
76
+ } else if (char === '"' || char === "'") {
77
+ idx = readString(selectorText, idx);
78
+ } else {
79
+ if (char === '(') parenDepth += 1;else if (char === ')' && parenDepth > 0) parenDepth -= 1;else if (char === '[') bracketDepth += 1;else if (char === ']' && bracketDepth > 0) bracketDepth -= 1;
80
+ if (parenDepth === 0 && bracketDepth === 0 && char === ',') {
81
+ parts.push(selectorText.slice(start, idx));
82
+ start = idx + 1;
83
+ }
84
+ idx += 1;
85
+ }
86
+ }
87
+ parts.push(selectorText.slice(start));
88
+ return parts;
89
+ }
90
+ function wrapSelector(selectorText) {
91
+ const selectors = splitSelectorList(selectorText).map(s => s.trim()).filter(Boolean);
92
+ return selectors.map(selector => `:global(${selector})`).join(', ');
93
+ }
94
+ function wrapKeyframesHeader(prelude) {
95
+ let idx = 0;
96
+ while (idx < prelude.length && isWhitespace(prelude[idx])) idx += 1;
97
+ if (prelude.slice(idx).startsWith(':global(')) {
98
+ return prelude;
99
+ }
100
+ const match = /^[A-Za-z_-][A-Za-z0-9_-]*/.exec(prelude.slice(idx));
101
+ if (!match) return prelude;
102
+ const name = match[0];
103
+ const before = prelude.slice(0, idx);
104
+ const after = prelude.slice(idx + name.length);
105
+ return `${before}:global(${name})${after}`;
106
+ }
107
+ function makeCssModuleGlobalInner(css) {
108
+ let idx = 0;
109
+ let out = '';
110
+ while (idx < css.length) {
111
+ const char = css[idx];
112
+ if (isWhitespace(char)) {
113
+ out += char;
114
+ idx += 1;
115
+ } else if (char === '/' && css[idx + 1] === '*') {
116
+ const end = readComment(css, idx);
117
+ out += css.slice(idx, end);
118
+ idx = end;
119
+ } else if (char === '"' || char === "'") {
120
+ const end = readString(css, idx);
121
+ out += css.slice(idx, end);
122
+ idx = end;
123
+ } else if (char === '@') {
124
+ const nameStart = idx + 1;
125
+ let nameEnd = nameStart;
126
+ while (nameEnd < css.length && /[A-Za-z0-9_-]/.test(css[nameEnd])) {
127
+ nameEnd += 1;
128
+ }
129
+ const atRuleName = css.slice(nameStart, nameEnd);
130
+ const terminatorIdx = findAtRuleTerminator(css, nameEnd);
131
+ const terminator = css[terminatorIdx];
132
+ const prelude = css.slice(nameEnd, terminatorIdx);
133
+ if (terminator === ';') {
134
+ out += css.slice(idx, terminatorIdx + 1);
135
+ idx = terminatorIdx + 1;
136
+ } else if (terminator !== '{') {
137
+ out += css.slice(idx);
138
+ break;
139
+ } else {
140
+ const blockEndIdx = findMatchingBrace(css, terminatorIdx);
141
+ if (blockEndIdx === -1) {
142
+ out += css.slice(idx);
143
+ break;
144
+ }
145
+ const blockBody = css.slice(terminatorIdx + 1, blockEndIdx);
146
+ if (isKeyframesAtRule(atRuleName)) {
147
+ out += `@${atRuleName}${wrapKeyframesHeader(prelude)}{${blockBody}}`;
148
+ } else if (nestingAtRules.has(atRuleName.toLowerCase())) {
149
+ out += `@${atRuleName}${prelude}{${makeCssModuleGlobalInner(blockBody)}}`;
150
+ } else {
151
+ out += `@${atRuleName}${prelude}{${blockBody}}`;
152
+ }
153
+ idx = blockEndIdx + 1;
154
+ }
155
+ } else {
156
+ // A selector rule: read until '{' at top-level.
157
+ const openIdx = css.indexOf('{', idx);
158
+ if (openIdx === -1) {
159
+ out += css.slice(idx);
160
+ break;
161
+ }
162
+ const selectorText = css.slice(idx, openIdx).trim();
163
+ const blockEndIdx = findMatchingBrace(css, openIdx);
164
+ if (blockEndIdx === -1) {
165
+ out += css.slice(idx);
166
+ break;
167
+ }
168
+ const blockBody = css.slice(openIdx + 1, blockEndIdx);
169
+ out += `${wrapSelector(selectorText)}{${blockBody}}`;
170
+ idx = blockEndIdx + 1;
171
+ }
172
+ }
173
+ return out;
174
+ }
175
+ export function makeCssModuleGlobal(cssText) {
176
+ return makeCssModuleGlobalInner(cssText);
177
+ }
178
+ //# sourceMappingURL=css-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-modules.js","names":["nestingAtRules","Set","isWhitespace","char","isKeyframesAtRule","name","toLowerCase","endsWith","readString","css","start","quote","idx","length","readComment","end","indexOf","findAtRuleTerminator","parenDepth","bracketDepth","findMatchingBrace","openBraceIdx","depth","splitSelectorList","selectorText","parts","push","slice","wrapSelector","selectors","map","s","trim","filter","Boolean","selector","join","wrapKeyframesHeader","prelude","startsWith","match","exec","before","after","makeCssModuleGlobalInner","out","nameStart","nameEnd","test","atRuleName","terminatorIdx","terminator","blockEndIdx","blockBody","has","openIdx","makeCssModuleGlobal","cssText"],"sources":["../src/css-modules.ts"],"sourcesContent":["const nestingAtRules = new Set([\n 'container',\n 'document',\n 'layer',\n 'media',\n 'scope',\n 'starting-style',\n 'supports',\n]);\n\nfunction isWhitespace(char: string) {\n return (\n char === ' ' ||\n char === '\\n' ||\n char === '\\r' ||\n char === '\\t' ||\n char === '\\f'\n );\n}\n\nfunction isKeyframesAtRule(name: string) {\n return name.toLowerCase().endsWith('keyframes');\n}\n\nfunction readString(css: string, start: number) {\n const quote = css[start];\n let idx = start + 1;\n\n while (idx < css.length) {\n const char = css[idx];\n\n if (char === '\\\\') {\n idx += 2;\n } else if (char === quote) {\n return idx + 1;\n } else {\n idx += 1;\n }\n }\n\n return css.length;\n}\n\nfunction readComment(css: string, start: number) {\n const end = css.indexOf('*/', start + 2);\n return end === -1 ? css.length : end + 2;\n}\n\nfunction findAtRuleTerminator(css: string, start: number) {\n let idx = start;\n let parenDepth = 0;\n let bracketDepth = 0;\n\n while (idx < css.length) {\n const char = css[idx];\n\n if (char === '/' && css[idx + 1] === '*') {\n idx = readComment(css, idx);\n } else if (char === '\"' || char === \"'\") {\n idx = readString(css, idx);\n } else {\n if (char === '(') parenDepth += 1;\n else if (char === ')' && parenDepth > 0) parenDepth -= 1;\n else if (char === '[') bracketDepth += 1;\n else if (char === ']' && bracketDepth > 0) bracketDepth -= 1;\n\n if (\n parenDepth === 0 &&\n bracketDepth === 0 &&\n (char === ';' || char === '{')\n ) {\n return idx;\n }\n\n idx += 1;\n }\n }\n\n return css.length;\n}\n\nfunction findMatchingBrace(css: string, openBraceIdx: number) {\n let idx = openBraceIdx + 1;\n let depth = 1;\n\n while (idx < css.length) {\n const char = css[idx];\n\n if (char === '/' && css[idx + 1] === '*') {\n idx = readComment(css, idx);\n } else if (char === '\"' || char === \"'\") {\n idx = readString(css, idx);\n } else {\n if (char === '{') depth += 1;\n else if (char === '}') {\n depth -= 1;\n if (depth === 0) return idx;\n }\n\n idx += 1;\n }\n }\n\n return -1;\n}\n\nfunction splitSelectorList(selectorText: string) {\n const parts: string[] = [];\n let start = 0;\n let idx = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n\n while (idx < selectorText.length) {\n const char = selectorText[idx];\n\n if (char === '/' && selectorText[idx + 1] === '*') {\n idx = readComment(selectorText, idx);\n } else if (char === '\"' || char === \"'\") {\n idx = readString(selectorText, idx);\n } else {\n if (char === '(') parenDepth += 1;\n else if (char === ')' && parenDepth > 0) parenDepth -= 1;\n else if (char === '[') bracketDepth += 1;\n else if (char === ']' && bracketDepth > 0) bracketDepth -= 1;\n\n if (parenDepth === 0 && bracketDepth === 0 && char === ',') {\n parts.push(selectorText.slice(start, idx));\n start = idx + 1;\n }\n\n idx += 1;\n }\n }\n\n parts.push(selectorText.slice(start));\n\n return parts;\n}\n\nfunction wrapSelector(selectorText: string) {\n const selectors = splitSelectorList(selectorText)\n .map((s) => s.trim())\n .filter(Boolean);\n\n return selectors.map((selector) => `:global(${selector})`).join(', ');\n}\n\nfunction wrapKeyframesHeader(prelude: string) {\n let idx = 0;\n while (idx < prelude.length && isWhitespace(prelude[idx])) idx += 1;\n\n if (prelude.slice(idx).startsWith(':global(')) {\n return prelude;\n }\n\n const match = /^[A-Za-z_-][A-Za-z0-9_-]*/.exec(prelude.slice(idx));\n if (!match) return prelude;\n\n const name = match[0];\n const before = prelude.slice(0, idx);\n const after = prelude.slice(idx + name.length);\n return `${before}:global(${name})${after}`;\n}\n\nfunction makeCssModuleGlobalInner(css: string) {\n let idx = 0;\n let out = '';\n\n while (idx < css.length) {\n const char = css[idx];\n\n if (isWhitespace(char)) {\n out += char;\n idx += 1;\n } else if (char === '/' && css[idx + 1] === '*') {\n const end = readComment(css, idx);\n out += css.slice(idx, end);\n idx = end;\n } else if (char === '\"' || char === \"'\") {\n const end = readString(css, idx);\n out += css.slice(idx, end);\n idx = end;\n } else if (char === '@') {\n const nameStart = idx + 1;\n let nameEnd = nameStart;\n while (nameEnd < css.length && /[A-Za-z0-9_-]/.test(css[nameEnd])) {\n nameEnd += 1;\n }\n const atRuleName = css.slice(nameStart, nameEnd);\n const terminatorIdx = findAtRuleTerminator(css, nameEnd);\n const terminator = css[terminatorIdx];\n const prelude = css.slice(nameEnd, terminatorIdx);\n\n if (terminator === ';') {\n out += css.slice(idx, terminatorIdx + 1);\n idx = terminatorIdx + 1;\n } else if (terminator !== '{') {\n out += css.slice(idx);\n break;\n } else {\n const blockEndIdx = findMatchingBrace(css, terminatorIdx);\n if (blockEndIdx === -1) {\n out += css.slice(idx);\n break;\n }\n\n const blockBody = css.slice(terminatorIdx + 1, blockEndIdx);\n\n if (isKeyframesAtRule(atRuleName)) {\n out += `@${atRuleName}${wrapKeyframesHeader(prelude)}{${blockBody}}`;\n } else if (nestingAtRules.has(atRuleName.toLowerCase())) {\n out += `@${atRuleName}${prelude}{${makeCssModuleGlobalInner(\n blockBody\n )}}`;\n } else {\n out += `@${atRuleName}${prelude}{${blockBody}}`;\n }\n\n idx = blockEndIdx + 1;\n }\n } else {\n // A selector rule: read until '{' at top-level.\n const openIdx = css.indexOf('{', idx);\n if (openIdx === -1) {\n out += css.slice(idx);\n break;\n }\n\n const selectorText = css.slice(idx, openIdx).trim();\n const blockEndIdx = findMatchingBrace(css, openIdx);\n if (blockEndIdx === -1) {\n out += css.slice(idx);\n break;\n }\n\n const blockBody = css.slice(openIdx + 1, blockEndIdx);\n out += `${wrapSelector(selectorText)}{${blockBody}}`;\n idx = blockEndIdx + 1;\n }\n }\n\n return out;\n}\n\nexport function makeCssModuleGlobal(cssText: string) {\n return makeCssModuleGlobalInner(cssText);\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ export function writeFileIfChanged(filePath, content) {
4
+ let previous = null;
5
+ try {
6
+ previous = fs.readFileSync(filePath, 'utf8');
7
+ } catch (err) {
8
+ if (err.code !== 'ENOENT') {
9
+ throw err;
10
+ }
11
+ }
12
+ if (previous === content) {
13
+ return false;
14
+ }
15
+ const dir = path.dirname(filePath);
16
+ const tmpPath = path.join(dir, `${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`);
17
+ try {
18
+ fs.writeFileSync(tmpPath, content);
19
+ fs.renameSync(tmpPath, filePath);
20
+ } finally {
21
+ try {
22
+ fs.unlinkSync(tmpPath);
23
+ } catch {
24
+ // ignore
25
+ }
26
+ }
27
+ return true;
28
+ }
29
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","names":["fs","path","writeFileIfChanged","filePath","content","previous","readFileSync","err","code","dir","dirname","tmpPath","join","basename","process","pid","Date","now","writeFileSync","renameSync","unlinkSync"],"sources":["../src/file-utils.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nexport function writeFileIfChanged(filePath: string, content: string) {\n let previous: string | null = null;\n\n try {\n previous = fs.readFileSync(filePath, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n }\n\n if (previous === content) {\n return false;\n }\n\n const dir = path.dirname(filePath);\n const tmpPath = path.join(\n dir,\n `${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`\n );\n\n try {\n fs.writeFileSync(tmpPath, content);\n fs.renameSync(tmpPath, filePath);\n } finally {\n try {\n fs.unlinkSync(tmpPath);\n } catch {\n // ignore\n }\n }\n\n return true;\n}\n"],"mappings":"AAAA,OAAOA,EAAE,MAAM,IAAI;AACnB,OAAOC,IAAI,MAAM,MAAM;AAEvB,OAAO,SAASC,kBAAkBA,CAACC,QAAgB,EAAEC,OAAe,EAAE;EACpE,IAAIC,QAAuB,GAAG,IAAI;EAElC,IAAI;IACFA,QAAQ,GAAGL,EAAE,CAACM,YAAY,CAACH,QAAQ,EAAE,MAAM,CAAC;EAC9C,CAAC,CAAC,OAAOI,GAAG,EAAE;IACZ,IAAKA,GAAG,CAA2BC,IAAI,KAAK,QAAQ,EAAE;MACpD,MAAMD,GAAG;IACX;EACF;EAEA,IAAIF,QAAQ,KAAKD,OAAO,EAAE;IACxB,OAAO,KAAK;EACd;EAEA,MAAMK,GAAG,GAAGR,IAAI,CAACS,OAAO,CAACP,QAAQ,CAAC;EAClC,MAAMQ,OAAO,GAAGV,IAAI,CAACW,IAAI,CACvBH,GAAG,EACH,GAAGR,IAAI,CAACY,QAAQ,CAACV,QAAQ,CAAC,IAAIW,OAAO,CAACC,GAAG,IAAIC,IAAI,CAACC,GAAG,CAAC,CAAC,MACzD,CAAC;EAED,IAAI;IACFjB,EAAE,CAACkB,aAAa,CAACP,OAAO,EAAEP,OAAO,CAAC;IAClCJ,EAAE,CAACmB,UAAU,CAACR,OAAO,EAAER,QAAQ,CAAC;EAClC,CAAC,SAAS;IACR,IAAI;MACFH,EAAE,CAACoB,UAAU,CAACT,OAAO,CAAC;IACxB,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EAEA,OAAO,IAAI;AACb","ignoreList":[]}
package/esm/index.js ADDED
@@ -0,0 +1,119 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { logger } from '@wyw-in-js/shared';
4
+ import { transform, TransformCacheCollection } from '@wyw-in-js/transform';
5
+ import { makeCssModuleGlobal } from './css-modules';
6
+ import { writeFileIfChanged } from './file-utils';
7
+ import { insertImportStatement } from './insert-import';
8
+ const DEFAULT_EXTENSION = '.wyw-in-js.module.css';
9
+ const stripQueryAndHash = request => {
10
+ const queryIdx = request.indexOf('?');
11
+ const hashIdx = request.indexOf('#');
12
+ if (queryIdx === -1) {
13
+ return hashIdx === -1 ? request : request.slice(0, hashIdx);
14
+ }
15
+ if (hashIdx === -1) return request.slice(0, queryIdx);
16
+ return request.slice(0, Math.min(queryIdx, hashIdx));
17
+ };
18
+ const cache = new TransformCacheCollection();
19
+ function convertSourceMap(value, filename) {
20
+ if (typeof value === 'string' || !value) {
21
+ return undefined;
22
+ }
23
+ return {
24
+ ...value,
25
+ file: value.file ?? filename,
26
+ mappings: value.mappings ?? '',
27
+ names: value.names ?? [],
28
+ sources: value.sources ?? [],
29
+ version: value.version ?? 3
30
+ };
31
+ }
32
+ async function resolveWith(resolve, context, request) {
33
+ if (typeof resolve !== 'function') return false;
34
+ if (resolve.length >= 3) {
35
+ return new Promise((ok, fail) => {
36
+ resolve(context, request, (err, result) => {
37
+ if (err) fail(err);else ok(result ?? false);
38
+ });
39
+ });
40
+ }
41
+ return resolve(context, request);
42
+ }
43
+ const turbopackLoader = function turbopackLoader(content, inputSourceMap) {
44
+ const callbackFromAsync = typeof this.async === 'function' ? this.async() : undefined;
45
+ const callback = typeof callbackFromAsync === 'function' ? callbackFromAsync : this.callback;
46
+ if (typeof callback !== 'function') {
47
+ throw new Error('Async loader callback is not available');
48
+ }
49
+ logger('turbopack-loader %s', this.resourcePath);
50
+ const {
51
+ sourceMap,
52
+ keepComments,
53
+ prefixer,
54
+ configFile,
55
+ ...rest
56
+ } = this.getOptions() || {};
57
+ if (configFile) {
58
+ const configPath = path.isAbsolute(configFile) ? configFile : path.join(process.cwd(), configFile);
59
+ this.addDependency(configPath);
60
+ }
61
+ const cssFileName = `${path.basename(this.resourcePath, path.extname(this.resourcePath))}${DEFAULT_EXTENSION}`;
62
+ const cssFilePath = path.join(path.dirname(this.resourcePath), cssFileName);
63
+ const cssImportPath = `./${cssFileName}`;
64
+ const resolveModule = this.getResolve({
65
+ dependencyType: 'esm'
66
+ });
67
+ const asyncResolve = async (token, importer) => {
68
+ const context = path.isAbsolute(importer) ? path.dirname(importer) : path.join(process.cwd(), path.dirname(importer));
69
+ const result = await resolveWith(resolveModule, context, token);
70
+ if (!result) {
71
+ throw new Error(`Cannot resolve ${token} from ${context}`);
72
+ }
73
+ const filePath = stripQueryAndHash(result);
74
+ if (path.isAbsolute(filePath)) {
75
+ this.addDependency(filePath);
76
+ }
77
+ return result;
78
+ };
79
+ const transformServices = {
80
+ options: {
81
+ filename: this.resourcePath,
82
+ inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),
83
+ pluginOptions: {
84
+ configFile,
85
+ ...rest
86
+ },
87
+ prefixer,
88
+ keepComments,
89
+ root: process.cwd()
90
+ },
91
+ cache,
92
+ emitWarning: message => {
93
+ if (typeof this.emitWarning === 'function') {
94
+ this.emitWarning(new Error(message));
95
+ }
96
+ }
97
+ };
98
+ transform(transformServices, content.toString(), asyncResolve).then(async result => {
99
+ const rawCssText = result.cssText ?? '';
100
+ if (rawCssText.trim()) {
101
+ let cssText = makeCssModuleGlobal(rawCssText);
102
+ if (sourceMap && typeof result.cssSourceMapText !== 'undefined') {
103
+ cssText += `\n/*# sourceMappingURL=data:application/json;base64,${Buffer.from(result.cssSourceMapText).toString('base64')}*/\n`;
104
+ }
105
+ await Promise.all((result.dependencies ?? []).map(dep => asyncResolve(dep, this.resourcePath)));
106
+ writeFileIfChanged(cssFilePath, cssText);
107
+ const importStatement = `import ${JSON.stringify(cssImportPath)};`;
108
+ const finalCode = insertImportStatement(result.code, importStatement);
109
+ callback(null, finalCode, result.sourceMap ?? undefined);
110
+ return;
111
+ }
112
+ if (fs.existsSync(cssFilePath)) {
113
+ writeFileIfChanged(cssFilePath, '');
114
+ }
115
+ callback(null, result.code, result.sourceMap ?? undefined);
116
+ }).catch(err => callback(err));
117
+ };
118
+ export default turbopackLoader;
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["fs","path","logger","transform","TransformCacheCollection","makeCssModuleGlobal","writeFileIfChanged","insertImportStatement","DEFAULT_EXTENSION","stripQueryAndHash","request","queryIdx","indexOf","hashIdx","slice","Math","min","cache","convertSourceMap","value","filename","undefined","file","mappings","names","sources","version","resolveWith","resolve","context","length","Promise","ok","fail","err","result","turbopackLoader","content","inputSourceMap","callbackFromAsync","async","callback","Error","resourcePath","sourceMap","keepComments","prefixer","configFile","rest","getOptions","configPath","isAbsolute","join","process","cwd","addDependency","cssFileName","basename","extname","cssFilePath","dirname","cssImportPath","resolveModule","getResolve","dependencyType","asyncResolve","token","importer","filePath","transformServices","options","pluginOptions","root","emitWarning","message","toString","then","rawCssText","cssText","trim","cssSourceMapText","Buffer","from","all","dependencies","map","dep","importStatement","JSON","stringify","finalCode","code","existsSync","catch"],"sources":["../src/index.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport type { RawSourceMap } from 'source-map';\nimport type { LoaderContext, RawLoaderDefinitionFunction } from 'webpack';\n\nimport { logger } from '@wyw-in-js/shared';\nimport type { PluginOptions, Result } from '@wyw-in-js/transform';\nimport { transform, TransformCacheCollection } from '@wyw-in-js/transform';\n\nimport { makeCssModuleGlobal } from './css-modules';\nimport { writeFileIfChanged } from './file-utils';\nimport { insertImportStatement } from './insert-import';\n\nconst DEFAULT_EXTENSION = '.wyw-in-js.module.css';\n\nconst stripQueryAndHash = (request: string) => {\n const queryIdx = request.indexOf('?');\n const hashIdx = request.indexOf('#');\n\n if (queryIdx === -1) {\n return hashIdx === -1 ? request : request.slice(0, hashIdx);\n }\n if (hashIdx === -1) return request.slice(0, queryIdx);\n\n return request.slice(0, Math.min(queryIdx, hashIdx));\n};\n\nexport type LoaderOptions = {\n keepComments?: boolean;\n prefixer?: boolean;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\n\ntype Loader = RawLoaderDefinitionFunction<LoaderOptions>;\ntype ResolveFn = ReturnType<LoaderContext<LoaderOptions>['getResolve']>;\n\nconst cache = new TransformCacheCollection();\n\nfunction convertSourceMap(\n value: RawSourceMap | string | null | undefined,\n filename: string\n): RawSourceMap | undefined {\n if (typeof value === 'string' || !value) {\n return undefined;\n }\n\n return {\n ...value,\n file: value.file ?? filename,\n mappings: value.mappings ?? '',\n names: value.names ?? [],\n sources: value.sources ?? [],\n version: value.version ?? 3,\n };\n}\n\nasync function resolveWith(\n resolve: ResolveFn,\n context: string,\n request: string\n): Promise<string | false> {\n type ResolveCallback = (\n ctx: string,\n req: string,\n cb: (err: Error | null, result?: string) => void\n ) => void;\n type ResolveAsync = (ctx: string, req: string) => Promise<string | false>;\n\n if (typeof resolve !== 'function') return false;\n\n if (resolve.length >= 3) {\n return new Promise((ok, fail) => {\n (resolve as unknown as ResolveCallback)(\n context,\n request,\n (err, result) => {\n if (err) fail(err);\n else ok(result ?? false);\n }\n );\n });\n }\n\n return (resolve as unknown as ResolveAsync)(context, request);\n}\n\nconst turbopackLoader: Loader = function turbopackLoader(\n content,\n inputSourceMap\n) {\n const callbackFromAsync =\n typeof this.async === 'function' ? this.async() : undefined;\n const callback =\n typeof callbackFromAsync === 'function' ? callbackFromAsync : this.callback;\n\n if (typeof callback !== 'function') {\n throw new Error('Async loader callback is not available');\n }\n\n logger('turbopack-loader %s', this.resourcePath);\n\n const { sourceMap, keepComments, prefixer, configFile, ...rest } =\n this.getOptions() || {};\n\n if (configFile) {\n const configPath = path.isAbsolute(configFile)\n ? configFile\n : path.join(process.cwd(), configFile);\n this.addDependency(configPath);\n }\n\n const cssFileName = `${path.basename(\n this.resourcePath,\n path.extname(this.resourcePath)\n )}${DEFAULT_EXTENSION}`;\n const cssFilePath = path.join(path.dirname(this.resourcePath), cssFileName);\n const cssImportPath = `./${cssFileName}`;\n\n const resolveModule = this.getResolve({ dependencyType: 'esm' });\n\n const asyncResolve = async (token: string, importer: string) => {\n const context = path.isAbsolute(importer)\n ? path.dirname(importer)\n : path.join(process.cwd(), path.dirname(importer));\n\n const result = await resolveWith(resolveModule, context, token);\n\n if (!result) {\n throw new Error(`Cannot resolve ${token} from ${context}`);\n }\n\n const filePath = stripQueryAndHash(result);\n if (path.isAbsolute(filePath)) {\n this.addDependency(filePath);\n }\n\n return result;\n };\n\n const transformServices = {\n options: {\n filename: this.resourcePath,\n inputSourceMap: convertSourceMap(inputSourceMap, this.resourcePath),\n pluginOptions: { configFile, ...rest },\n prefixer,\n keepComments,\n root: process.cwd(),\n },\n cache,\n emitWarning: (message: string) => {\n if (typeof this.emitWarning === 'function') {\n this.emitWarning(new Error(message));\n }\n },\n };\n\n transform(transformServices, content.toString(), asyncResolve)\n .then(async (result: Result) => {\n const rawCssText = result.cssText ?? '';\n\n if (rawCssText.trim()) {\n let cssText = makeCssModuleGlobal(rawCssText);\n\n if (sourceMap && typeof result.cssSourceMapText !== 'undefined') {\n cssText += `\\n/*# sourceMappingURL=data:application/json;base64,${Buffer.from(\n result.cssSourceMapText\n ).toString('base64')}*/\\n`;\n }\n\n await Promise.all(\n (result.dependencies ?? []).map((dep) =>\n asyncResolve(dep, this.resourcePath)\n )\n );\n\n writeFileIfChanged(cssFilePath, cssText);\n\n const importStatement = `import ${JSON.stringify(cssImportPath)};`;\n const finalCode = insertImportStatement(result.code, importStatement);\n\n callback(null, finalCode, result.sourceMap ?? undefined);\n return;\n }\n\n if (fs.existsSync(cssFilePath)) {\n writeFileIfChanged(cssFilePath, '');\n }\n\n callback(null, result.code, result.sourceMap ?? undefined);\n })\n .catch((err: Error) => callback(err));\n};\n\nexport default turbopackLoader;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Insert an import statement in a safe position:
3
+ * - after the last existing import declaration,
4
+ * - otherwise after the directive prologue (e.g. 'use client'),
5
+ * - otherwise at the top of the file.
6
+ */
7
+ export function insertImportStatement(code, importStatement) {
8
+ if (code.includes(importStatement)) {
9
+ return code;
10
+ }
11
+ const importRegex = /^\s*(?:import\s+[^;]+?\s+from\s+["'][^"']+["'];|import\s*["'][^"']+["'];)/gm;
12
+ const importMatches = [...code.matchAll(importRegex)];
13
+ if (importMatches.length > 0) {
14
+ const lastImport = importMatches[importMatches.length - 1];
15
+ const insertPosition = lastImport.index + lastImport[0].length;
16
+ return `${code.slice(0, insertPosition)}\n${importStatement}${code.slice(insertPosition)}`;
17
+ }
18
+ const directiveRegex = /^(?:(?:\s*["']use \w+["'];?\s*\n?)+)/;
19
+ const directiveMatch = code.match(directiveRegex);
20
+ if (directiveMatch) {
21
+ const endOfDirectives = directiveMatch[0].length;
22
+ const needsNewline = !code.slice(0, endOfDirectives).endsWith('\n');
23
+ const separator = needsNewline ? '\n' : '';
24
+ return `${code.slice(0, endOfDirectives)}${separator}${importStatement}\n${code.slice(endOfDirectives)}`;
25
+ }
26
+ return `${importStatement}\n${code}`;
27
+ }
28
+ //# sourceMappingURL=insert-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-import.js","names":["insertImportStatement","code","importStatement","includes","importRegex","importMatches","matchAll","length","lastImport","insertPosition","index","slice","directiveRegex","directiveMatch","match","endOfDirectives","needsNewline","endsWith","separator"],"sources":["../src/insert-import.ts"],"sourcesContent":["/**\n * Insert an import statement in a safe position:\n * - after the last existing import declaration,\n * - otherwise after the directive prologue (e.g. 'use client'),\n * - otherwise at the top of the file.\n */\nexport function insertImportStatement(code: string, importStatement: string) {\n if (code.includes(importStatement)) {\n return code;\n }\n\n const importRegex =\n /^\\s*(?:import\\s+[^;]+?\\s+from\\s+[\"'][^\"']+[\"'];|import\\s*[\"'][^\"']+[\"'];)/gm;\n const importMatches = [...code.matchAll(importRegex)];\n if (importMatches.length > 0) {\n const lastImport = importMatches[importMatches.length - 1];\n const insertPosition = lastImport.index! + lastImport[0].length;\n return `${code.slice(0, insertPosition)}\\n${importStatement}${code.slice(\n insertPosition\n )}`;\n }\n\n const directiveRegex = /^(?:(?:\\s*[\"']use \\w+[\"'];?\\s*\\n?)+)/;\n const directiveMatch = code.match(directiveRegex);\n if (directiveMatch) {\n const endOfDirectives = directiveMatch[0].length;\n const needsNewline = !code.slice(0, endOfDirectives).endsWith('\\n');\n const separator = needsNewline ? '\\n' : '';\n return `${code.slice(\n 0,\n endOfDirectives\n )}${separator}${importStatement}\\n${code.slice(endOfDirectives)}`;\n }\n\n return `${importStatement}\\n${code}`;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,qBAAqBA,CAACC,IAAY,EAAEC,eAAuB,EAAE;EAC3E,IAAID,IAAI,CAACE,QAAQ,CAACD,eAAe,CAAC,EAAE;IAClC,OAAOD,IAAI;EACb;EAEA,MAAMG,WAAW,GACf,6EAA6E;EAC/E,MAAMC,aAAa,GAAG,CAAC,GAAGJ,IAAI,CAACK,QAAQ,CAACF,WAAW,CAAC,CAAC;EACrD,IAAIC,aAAa,CAACE,MAAM,GAAG,CAAC,EAAE;IAC5B,MAAMC,UAAU,GAAGH,aAAa,CAACA,aAAa,CAACE,MAAM,GAAG,CAAC,CAAC;IAC1D,MAAME,cAAc,GAAGD,UAAU,CAACE,KAAK,GAAIF,UAAU,CAAC,CAAC,CAAC,CAACD,MAAM;IAC/D,OAAO,GAAGN,IAAI,CAACU,KAAK,CAAC,CAAC,EAAEF,cAAc,CAAC,KAAKP,eAAe,GAAGD,IAAI,CAACU,KAAK,CACtEF,cACF,CAAC,EAAE;EACL;EAEA,MAAMG,cAAc,GAAG,sCAAsC;EAC7D,MAAMC,cAAc,GAAGZ,IAAI,CAACa,KAAK,CAACF,cAAc,CAAC;EACjD,IAAIC,cAAc,EAAE;IAClB,MAAME,eAAe,GAAGF,cAAc,CAAC,CAAC,CAAC,CAACN,MAAM;IAChD,MAAMS,YAAY,GAAG,CAACf,IAAI,CAACU,KAAK,CAAC,CAAC,EAAEI,eAAe,CAAC,CAACE,QAAQ,CAAC,IAAI,CAAC;IACnE,MAAMC,SAAS,GAAGF,YAAY,GAAG,IAAI,GAAG,EAAE;IAC1C,OAAO,GAAGf,IAAI,CAACU,KAAK,CAClB,CAAC,EACDI,eACF,CAAC,GAAGG,SAAS,GAAGhB,eAAe,KAAKD,IAAI,CAACU,KAAK,CAACI,eAAe,CAAC,EAAE;EACnE;EAEA,OAAO,GAAGb,eAAe,KAAKD,IAAI,EAAE;AACtC","ignoreList":[]}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeCssModuleGlobal = makeCssModuleGlobal;
7
+ const nestingAtRules = new Set(['container', 'document', 'layer', 'media', 'scope', 'starting-style', 'supports']);
8
+ function isWhitespace(char) {
9
+ return char === ' ' || char === '\n' || char === '\r' || char === '\t' || char === '\f';
10
+ }
11
+ function isKeyframesAtRule(name) {
12
+ return name.toLowerCase().endsWith('keyframes');
13
+ }
14
+ function readString(css, start) {
15
+ const quote = css[start];
16
+ let idx = start + 1;
17
+ while (idx < css.length) {
18
+ const char = css[idx];
19
+ if (char === '\\') {
20
+ idx += 2;
21
+ } else if (char === quote) {
22
+ return idx + 1;
23
+ } else {
24
+ idx += 1;
25
+ }
26
+ }
27
+ return css.length;
28
+ }
29
+ function readComment(css, start) {
30
+ const end = css.indexOf('*/', start + 2);
31
+ return end === -1 ? css.length : end + 2;
32
+ }
33
+ function findAtRuleTerminator(css, start) {
34
+ let idx = start;
35
+ let parenDepth = 0;
36
+ let bracketDepth = 0;
37
+ while (idx < css.length) {
38
+ const char = css[idx];
39
+ if (char === '/' && css[idx + 1] === '*') {
40
+ idx = readComment(css, idx);
41
+ } else if (char === '"' || char === "'") {
42
+ idx = readString(css, idx);
43
+ } else {
44
+ if (char === '(') parenDepth += 1;else if (char === ')' && parenDepth > 0) parenDepth -= 1;else if (char === '[') bracketDepth += 1;else if (char === ']' && bracketDepth > 0) bracketDepth -= 1;
45
+ if (parenDepth === 0 && bracketDepth === 0 && (char === ';' || char === '{')) {
46
+ return idx;
47
+ }
48
+ idx += 1;
49
+ }
50
+ }
51
+ return css.length;
52
+ }
53
+ function findMatchingBrace(css, openBraceIdx) {
54
+ let idx = openBraceIdx + 1;
55
+ let depth = 1;
56
+ while (idx < css.length) {
57
+ const char = css[idx];
58
+ if (char === '/' && css[idx + 1] === '*') {
59
+ idx = readComment(css, idx);
60
+ } else if (char === '"' || char === "'") {
61
+ idx = readString(css, idx);
62
+ } else {
63
+ if (char === '{') depth += 1;else if (char === '}') {
64
+ depth -= 1;
65
+ if (depth === 0) return idx;
66
+ }
67
+ idx += 1;
68
+ }
69
+ }
70
+ return -1;
71
+ }
72
+ function splitSelectorList(selectorText) {
73
+ const parts = [];
74
+ let start = 0;
75
+ let idx = 0;
76
+ let parenDepth = 0;
77
+ let bracketDepth = 0;
78
+ while (idx < selectorText.length) {
79
+ const char = selectorText[idx];
80
+ if (char === '/' && selectorText[idx + 1] === '*') {
81
+ idx = readComment(selectorText, idx);
82
+ } else if (char === '"' || char === "'") {
83
+ idx = readString(selectorText, idx);
84
+ } else {
85
+ if (char === '(') parenDepth += 1;else if (char === ')' && parenDepth > 0) parenDepth -= 1;else if (char === '[') bracketDepth += 1;else if (char === ']' && bracketDepth > 0) bracketDepth -= 1;
86
+ if (parenDepth === 0 && bracketDepth === 0 && char === ',') {
87
+ parts.push(selectorText.slice(start, idx));
88
+ start = idx + 1;
89
+ }
90
+ idx += 1;
91
+ }
92
+ }
93
+ parts.push(selectorText.slice(start));
94
+ return parts;
95
+ }
96
+ function wrapSelector(selectorText) {
97
+ const selectors = splitSelectorList(selectorText).map(s => s.trim()).filter(Boolean);
98
+ return selectors.map(selector => `:global(${selector})`).join(', ');
99
+ }
100
+ function wrapKeyframesHeader(prelude) {
101
+ let idx = 0;
102
+ while (idx < prelude.length && isWhitespace(prelude[idx])) idx += 1;
103
+ if (prelude.slice(idx).startsWith(':global(')) {
104
+ return prelude;
105
+ }
106
+ const match = /^[A-Za-z_-][A-Za-z0-9_-]*/.exec(prelude.slice(idx));
107
+ if (!match) return prelude;
108
+ const name = match[0];
109
+ const before = prelude.slice(0, idx);
110
+ const after = prelude.slice(idx + name.length);
111
+ return `${before}:global(${name})${after}`;
112
+ }
113
+ function makeCssModuleGlobalInner(css) {
114
+ let idx = 0;
115
+ let out = '';
116
+ while (idx < css.length) {
117
+ const char = css[idx];
118
+ if (isWhitespace(char)) {
119
+ out += char;
120
+ idx += 1;
121
+ } else if (char === '/' && css[idx + 1] === '*') {
122
+ const end = readComment(css, idx);
123
+ out += css.slice(idx, end);
124
+ idx = end;
125
+ } else if (char === '"' || char === "'") {
126
+ const end = readString(css, idx);
127
+ out += css.slice(idx, end);
128
+ idx = end;
129
+ } else if (char === '@') {
130
+ const nameStart = idx + 1;
131
+ let nameEnd = nameStart;
132
+ while (nameEnd < css.length && /[A-Za-z0-9_-]/.test(css[nameEnd])) {
133
+ nameEnd += 1;
134
+ }
135
+ const atRuleName = css.slice(nameStart, nameEnd);
136
+ const terminatorIdx = findAtRuleTerminator(css, nameEnd);
137
+ const terminator = css[terminatorIdx];
138
+ const prelude = css.slice(nameEnd, terminatorIdx);
139
+ if (terminator === ';') {
140
+ out += css.slice(idx, terminatorIdx + 1);
141
+ idx = terminatorIdx + 1;
142
+ } else if (terminator !== '{') {
143
+ out += css.slice(idx);
144
+ break;
145
+ } else {
146
+ const blockEndIdx = findMatchingBrace(css, terminatorIdx);
147
+ if (blockEndIdx === -1) {
148
+ out += css.slice(idx);
149
+ break;
150
+ }
151
+ const blockBody = css.slice(terminatorIdx + 1, blockEndIdx);
152
+ if (isKeyframesAtRule(atRuleName)) {
153
+ out += `@${atRuleName}${wrapKeyframesHeader(prelude)}{${blockBody}}`;
154
+ } else if (nestingAtRules.has(atRuleName.toLowerCase())) {
155
+ out += `@${atRuleName}${prelude}{${makeCssModuleGlobalInner(blockBody)}}`;
156
+ } else {
157
+ out += `@${atRuleName}${prelude}{${blockBody}}`;
158
+ }
159
+ idx = blockEndIdx + 1;
160
+ }
161
+ } else {
162
+ // A selector rule: read until '{' at top-level.
163
+ const openIdx = css.indexOf('{', idx);
164
+ if (openIdx === -1) {
165
+ out += css.slice(idx);
166
+ break;
167
+ }
168
+ const selectorText = css.slice(idx, openIdx).trim();
169
+ const blockEndIdx = findMatchingBrace(css, openIdx);
170
+ if (blockEndIdx === -1) {
171
+ out += css.slice(idx);
172
+ break;
173
+ }
174
+ const blockBody = css.slice(openIdx + 1, blockEndIdx);
175
+ out += `${wrapSelector(selectorText)}{${blockBody}}`;
176
+ idx = blockEndIdx + 1;
177
+ }
178
+ }
179
+ return out;
180
+ }
181
+ function makeCssModuleGlobal(cssText) {
182
+ return makeCssModuleGlobalInner(cssText);
183
+ }
184
+ //# sourceMappingURL=css-modules.js.map