@wyw-in-js/esbuild 1.1.0 → 2.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -13
- package/esm/index.mjs +210 -233
- package/esm/index.mjs.map +1 -1
- package/package.json +13 -13
- package/types/index.d.ts +2 -2
- package/types/index.js +67 -58
- package/lib/index.js +0 -243
- package/lib/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -34,28 +34,35 @@ esbuild
|
|
|
34
34
|
.catch(() => process.exit(1));
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
##
|
|
37
|
+
## Eval resolver modes
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
`eval.resolver: 'native'` and the native step of `eval.resolver: 'hybrid'` use `oxc-resolver` with automatic
|
|
40
|
+
`tsconfig.json` discovery. The plugin also forwards esbuild's top-level `alias` option.
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
Use `hybrid` when evaluated imports may rely on esbuild `onResolve` plugins. Use `native` only when `oxc-resolver` can
|
|
43
|
+
resolve all evaluated imports, or mirror plugin-only aliases in `oxcOptions.resolver.alias`.
|
|
44
|
+
|
|
45
|
+
## Additional Oxc transformations
|
|
46
|
+
|
|
47
|
+
`@wyw-in-js/esbuild` runs WyW evaluation after an `esbuild.transform()` step, so transform options that must run on the
|
|
48
|
+
original TS/JSX source should be configured explicitly.
|
|
49
|
+
|
|
50
|
+
Enable `oxcTransform` to apply `oxcOptions.transform` to the original source code before the esbuild/WyW pipeline:
|
|
43
51
|
|
|
44
52
|
```js
|
|
45
53
|
wyw({
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
oxcTransform: true,
|
|
55
|
+
oxcOptions: {
|
|
56
|
+
transform: {
|
|
57
|
+
define: {
|
|
58
|
+
__DEV__: 'false',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
51
61
|
},
|
|
52
62
|
});
|
|
53
63
|
```
|
|
54
64
|
|
|
55
|
-
Order: `
|
|
56
|
-
|
|
57
|
-
Note: `babelOptions` are still used by WyW when parsing/evaluating modules. With `babelTransform: true`, the same plugins
|
|
58
|
-
may run both before esbuild and again during WyW's internal Babel stage. Prefer idempotent plugins.
|
|
65
|
+
Order: `Oxc(source) → esbuild.transform() → WyW transform`.
|
|
59
66
|
|
|
60
67
|
This is an opt-in feature and may increase build times, so it's recommended to keep `filter` narrow.
|
|
61
68
|
|
package/esm/index.mjs
CHANGED
|
@@ -1,236 +1,213 @@
|
|
|
1
1
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { transformSync as
|
|
10
|
-
import { slugify, transform, TransformCacheCollection, createFileReporter, loadWywOptions
|
|
11
|
-
import { asyncResolverFactory } from
|
|
12
|
-
const supportedFilterFlags = new Set([
|
|
2
|
+
* This file contains an esbuild loader for wyw-in-js.
|
|
3
|
+
* It uses the transform.ts function to generate class names from source code,
|
|
4
|
+
* returns transformed code without template literals and attaches generated source maps
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from "fs";
|
|
7
|
+
import { dirname, isAbsolute, join, parse, posix } from "path";
|
|
8
|
+
import { transformSync as esbuildTransformSync } from "esbuild";
|
|
9
|
+
import { transformSync as oxcTransformSync } from "oxc-transform";
|
|
10
|
+
import { disposeEvalBroker, slugify, transform, TransformCacheCollection, createFileReporter, loadWywOptions } from "@wyw-in-js/transform";
|
|
11
|
+
import { asyncResolverFactory, mergeOxcResolverAlias, toNativeResolverAlias } from "@wyw-in-js/shared";
|
|
12
|
+
const supportedFilterFlags = new Set([
|
|
13
|
+
"i",
|
|
14
|
+
"m",
|
|
15
|
+
"s"
|
|
16
|
+
]);
|
|
13
17
|
const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/;
|
|
14
|
-
export default function wywInJS({
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
contents,
|
|
209
|
-
loader,
|
|
210
|
-
resolveDir
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
let {
|
|
214
|
-
cssText
|
|
215
|
-
} = result;
|
|
216
|
-
const slug = slugify(cssText);
|
|
217
|
-
const cssFilename = `${filename}_${slug}.wyw.css`;
|
|
218
|
-
let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;
|
|
219
|
-
if (sourceMap && result.cssSourceMapText) {
|
|
220
|
-
const map = Buffer.from(result.cssSourceMapText).toString('base64');
|
|
221
|
-
cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;
|
|
222
|
-
const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString('base64');
|
|
223
|
-
contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
|
|
224
|
-
}
|
|
225
|
-
cssLookup.set(cssFilename, cssText);
|
|
226
|
-
cssResolveDirs.set(cssFilename, resolveDir);
|
|
227
|
-
return {
|
|
228
|
-
contents,
|
|
229
|
-
loader,
|
|
230
|
-
resolveDir
|
|
231
|
-
};
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
};
|
|
18
|
+
export default function wywInJS({ debug, sourceMap, keepComments, oxcTransform, prefixer, preprocessor, esbuildOptions, filter = /\.(js|jsx|ts|tsx)$/, transformLibraries, ...rest } = {}) {
|
|
19
|
+
let options = esbuildOptions;
|
|
20
|
+
const cache = new TransformCacheCollection();
|
|
21
|
+
const shouldRunOxcTransform = oxcTransform ?? false;
|
|
22
|
+
const resolvedWywOptions = shouldRunOxcTransform ? loadWywOptions(rest) : null;
|
|
23
|
+
const createAsyncResolver = asyncResolverFactory(async (resolved, token) => {
|
|
24
|
+
if (resolved.errors.length > 0) {
|
|
25
|
+
throw new Error(`Cannot resolve ${token}`);
|
|
26
|
+
}
|
|
27
|
+
return resolved.path.replace(/\\/g, posix.sep);
|
|
28
|
+
}, (what, importer) => [what, {
|
|
29
|
+
resolveDir: isAbsolute(importer) ? dirname(importer) : join(process.cwd(), dirname(importer)),
|
|
30
|
+
kind: "import-statement"
|
|
31
|
+
}]);
|
|
32
|
+
return {
|
|
33
|
+
name: "wyw-in-js",
|
|
34
|
+
setup(build) {
|
|
35
|
+
const cssLookup = new Map();
|
|
36
|
+
const cssResolveDirs = new Map();
|
|
37
|
+
const warnedFilters = new Set();
|
|
38
|
+
let warnedEmptyOxcOptions = false;
|
|
39
|
+
const nativeResolverAlias = toNativeResolverAlias(build.initialOptions.alias);
|
|
40
|
+
const { emitter, onDone } = createFileReporter(debug ?? false);
|
|
41
|
+
const warnOnUnsupportedFlags = (filterRegexp, removedFlags, sanitizedFlags) => {
|
|
42
|
+
const key = `${filterRegexp.source}/${filterRegexp.flags}`;
|
|
43
|
+
if (warnedFilters.has(key)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
warnedFilters.add(key);
|
|
47
|
+
const nextFlags = sanitizedFlags || "none";
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
console.warn(`[wyw-in-js] Ignoring unsupported RegExp flags "${removedFlags}" ` + `in esbuild filter /${filterRegexp.source}/${filterRegexp.flags}. ` + `Using flags "${nextFlags}".`);
|
|
50
|
+
};
|
|
51
|
+
const sanitizeFilter = (filterRegexp) => {
|
|
52
|
+
const { flags } = filterRegexp;
|
|
53
|
+
const sanitizedFlags = flags.split("").filter((flag) => supportedFilterFlags.has(flag)).join("");
|
|
54
|
+
if (sanitizedFlags === flags) {
|
|
55
|
+
return filterRegexp;
|
|
56
|
+
}
|
|
57
|
+
const removedFlags = flags.split("").filter((flag) => !supportedFilterFlags.has(flag)).join("");
|
|
58
|
+
warnOnUnsupportedFlags(filterRegexp, removedFlags, sanitizedFlags);
|
|
59
|
+
return new RegExp(filterRegexp.source, sanitizedFlags);
|
|
60
|
+
};
|
|
61
|
+
const getOxcLang = (loader) => {
|
|
62
|
+
if (loader === "tsx") return "tsx";
|
|
63
|
+
if (loader === "ts") return "ts";
|
|
64
|
+
if (loader === "jsx") return "jsx";
|
|
65
|
+
return "js";
|
|
66
|
+
};
|
|
67
|
+
const asyncResolve = createAsyncResolver(build.resolve);
|
|
68
|
+
build.onEnd(() => {
|
|
69
|
+
onDone(process.cwd());
|
|
70
|
+
disposeEvalBroker(cache);
|
|
71
|
+
});
|
|
72
|
+
build.onResolve({ filter: /\.wyw\.css$/ }, (args) => {
|
|
73
|
+
return {
|
|
74
|
+
namespace: "wyw-in-js",
|
|
75
|
+
path: args.path
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
build.onLoad({
|
|
79
|
+
filter: /.*/,
|
|
80
|
+
namespace: "wyw-in-js"
|
|
81
|
+
}, (args) => {
|
|
82
|
+
return {
|
|
83
|
+
contents: cssLookup.get(args.path),
|
|
84
|
+
loader: "css",
|
|
85
|
+
resolveDir: cssResolveDirs.get(args.path)
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
const filterRegexp = typeof filter === "string" ? new RegExp(filter) : sanitizeFilter(filter);
|
|
89
|
+
build.onLoad({ filter: filterRegexp }, async (args) => {
|
|
90
|
+
const rawCode = readFileSync(args.path, "utf8");
|
|
91
|
+
const { ext, name: filename } = parse(args.path);
|
|
92
|
+
const loader = ext.replace(/^\./, "");
|
|
93
|
+
if (!transformLibraries && nodeModulesRegex.test(args.path)) {
|
|
94
|
+
return {
|
|
95
|
+
loader,
|
|
96
|
+
contents: rawCode
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (!options) {
|
|
100
|
+
options = {};
|
|
101
|
+
if ("jsxFactory" in build.initialOptions) {
|
|
102
|
+
options.jsxFactory = build.initialOptions.jsxFactory;
|
|
103
|
+
}
|
|
104
|
+
if ("jsxFragment" in build.initialOptions) {
|
|
105
|
+
options.jsxFragment = build.initialOptions.jsxFragment;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
let codeForEsbuild = rawCode;
|
|
109
|
+
if (shouldRunOxcTransform) {
|
|
110
|
+
if (!resolvedWywOptions) {
|
|
111
|
+
throw new Error("[wyw-in-js] Internal error: oxcTransform is enabled but WyW options are not initialized");
|
|
112
|
+
}
|
|
113
|
+
const transformOptions = resolvedWywOptions.oxcOptions.transform;
|
|
114
|
+
if (!transformOptions || !Object.keys(transformOptions).length) {
|
|
115
|
+
if (!warnedEmptyOxcOptions) {
|
|
116
|
+
warnedEmptyOxcOptions = true;
|
|
117
|
+
// eslint-disable-next-line no-console
|
|
118
|
+
console.warn("[wyw-in-js] oxcTransform is enabled but oxcOptions.transform is empty; skipping Oxc transform.");
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
let oxcResult;
|
|
122
|
+
try {
|
|
123
|
+
oxcResult = oxcTransformSync(args.path, codeForEsbuild, {
|
|
124
|
+
cwd: process.cwd(),
|
|
125
|
+
lang: getOxcLang(loader),
|
|
126
|
+
sourceType: "module",
|
|
127
|
+
sourcemap: sourceMap,
|
|
128
|
+
...transformOptions
|
|
129
|
+
});
|
|
130
|
+
} catch (e) {
|
|
131
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
132
|
+
throw new Error(`[wyw-in-js] Oxc transform failed for ${args.path}: ${message}`);
|
|
133
|
+
}
|
|
134
|
+
if (oxcResult.errors.length > 0) {
|
|
135
|
+
const details = oxcResult.errors.map((error) => error.codeframe ? `${error.message}\n${error.codeframe}` : error.message).join("\n");
|
|
136
|
+
throw new Error(`[wyw-in-js] Oxc transform failed for ${args.path}: ${details}`);
|
|
137
|
+
}
|
|
138
|
+
codeForEsbuild = oxcResult.code;
|
|
139
|
+
if (sourceMap && oxcResult.map) {
|
|
140
|
+
const oxcMap = Buffer.from(JSON.stringify(oxcResult.map)).toString("base64");
|
|
141
|
+
codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${oxcMap}*/`;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const transformed = esbuildTransformSync(codeForEsbuild, {
|
|
146
|
+
...options,
|
|
147
|
+
sourcefile: args.path,
|
|
148
|
+
sourcemap: sourceMap,
|
|
149
|
+
loader
|
|
150
|
+
});
|
|
151
|
+
let { code } = transformed;
|
|
152
|
+
if (sourceMap) {
|
|
153
|
+
const esbuildMap = Buffer.from(transformed.map).toString("base64");
|
|
154
|
+
code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;
|
|
155
|
+
}
|
|
156
|
+
const transformServices = {
|
|
157
|
+
options: {
|
|
158
|
+
filename: args.path,
|
|
159
|
+
pluginOptions: {
|
|
160
|
+
...rest,
|
|
161
|
+
oxcOptions: mergeOxcResolverAlias(rest.oxcOptions, nativeResolverAlias)
|
|
162
|
+
},
|
|
163
|
+
prefixer,
|
|
164
|
+
keepComments,
|
|
165
|
+
preprocessor,
|
|
166
|
+
root: process.cwd()
|
|
167
|
+
},
|
|
168
|
+
cache,
|
|
169
|
+
eventEmitter: emitter
|
|
170
|
+
};
|
|
171
|
+
const result = await transform(transformServices, code, asyncResolve);
|
|
172
|
+
const resolveDir = dirname(args.path);
|
|
173
|
+
if (typeof result.cssText === "undefined") {
|
|
174
|
+
return {
|
|
175
|
+
contents: code,
|
|
176
|
+
loader,
|
|
177
|
+
resolveDir
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
if (result.cssText === "") {
|
|
181
|
+
let contents = result.code;
|
|
182
|
+
if (sourceMap && result.sourceMap) {
|
|
183
|
+
const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString("base64");
|
|
184
|
+
contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
contents,
|
|
188
|
+
loader,
|
|
189
|
+
resolveDir
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
let { cssText } = result;
|
|
193
|
+
const slug = slugify(cssText);
|
|
194
|
+
const cssFilename = `${filename}_${slug}.wyw.css`;
|
|
195
|
+
let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;
|
|
196
|
+
if (sourceMap && result.cssSourceMapText) {
|
|
197
|
+
const map = Buffer.from(result.cssSourceMapText).toString("base64");
|
|
198
|
+
cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;
|
|
199
|
+
const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString("base64");
|
|
200
|
+
contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
|
|
201
|
+
}
|
|
202
|
+
cssLookup.set(cssFilename, cssText);
|
|
203
|
+
cssResolveDirs.set(cssFilename, resolveDir);
|
|
204
|
+
return {
|
|
205
|
+
contents,
|
|
206
|
+
loader,
|
|
207
|
+
resolveDir
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
};
|
|
235
212
|
}
|
|
236
|
-
//# sourceMappingURL=index.mjs.map
|
|
213
|
+
//# sourceMappingURL=index.mjs.map
|
package/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["readFileSync","dirname","isAbsolute","join","parse","posix","transformSync","esbuildTransformSync","slugify","transform","TransformCacheCollection","createFileReporter","loadWywOptions","withDefaultServices","asyncResolverFactory","supportedFilterFlags","Set","nodeModulesRegex","wywInJS","babelTransform","debug","sourceMap","keepComments","prefixer","preprocessor","esbuildOptions","filter","transformLibraries","rest","options","cache","resolvedWywOptions","babel","filename","pluginOptions","root","process","cwd","createAsyncResolver","resolved","token","errors","length","Error","path","replace","sep","what","importer","resolveDir","kind","name","setup","build","cssLookup","Map","cssResolveDirs","warnedFilters","warnedEmptyBabelOptions","emitter","onDone","warnOnUnsupportedFlags","filterRegexp","removedFlags","sanitizedFlags","key","source","flags","has","add","nextFlags","console","warn","sanitizeFilter","split","flag","RegExp","asyncResolve","resolve","onEnd","onResolve","args","namespace","onLoad","contents","get","loader","rawCode","ext","test","initialOptions","jsxFactory","jsxFragment","codeForEsbuild","babelOptions","Object","keys","babelResult","ast","sourceFileName","sourceMaps","e","message","String","code","map","babelMap","Buffer","from","JSON","stringify","toString","transformed","sourcefile","sourcemap","esbuildMap","transformServices","eventEmitter","result","cssText","wywMap","slug","cssFilename","cssSourceMapText","set"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains an esbuild loader for wyw-in-js.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport { readFileSync } from 'fs';\nimport { dirname, isAbsolute, join, parse, posix } from 'path';\n\nimport type { Plugin, TransformOptions, Loader } from 'esbuild';\nimport { transformSync as esbuildTransformSync } from 'esbuild';\n\nimport type {\n PluginOptions,\n Preprocessor,\n IFileReporterOptions,\n} from '@wyw-in-js/transform';\nimport {\n slugify,\n transform,\n TransformCacheCollection,\n createFileReporter,\n loadWywOptions,\n withDefaultServices,\n} from '@wyw-in-js/transform';\nimport { asyncResolverFactory } from '@wyw-in-js/shared';\n\ntype EsbuildPluginOptions = {\n babelTransform?: boolean;\n debug?: IFileReporterOptions | false | null | undefined;\n esbuildOptions?: TransformOptions;\n filter?: RegExp | string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n transformLibraries?: boolean;\n} & Partial<PluginOptions>;\n\nconst supportedFilterFlags = new Set(['i', 'm', 's']);\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nexport default function wywInJS({\n babelTransform,\n debug,\n sourceMap,\n keepComments,\n prefixer,\n preprocessor,\n esbuildOptions,\n filter = /\\.(js|jsx|ts|tsx)$/,\n transformLibraries,\n ...rest\n}: EsbuildPluginOptions = {}): Plugin {\n let options = esbuildOptions;\n const cache = new TransformCacheCollection();\n let resolvedWywOptions: ReturnType<typeof loadWywOptions> | null = null;\n let babel: ReturnType<typeof withDefaultServices>['babel'] | null = null;\n if (babelTransform) {\n resolvedWywOptions = loadWywOptions(rest);\n babel = withDefaultServices({\n options: {\n filename: '<wyw-in-js/esbuild>',\n pluginOptions: resolvedWywOptions,\n root: process.cwd(),\n },\n }).babel;\n }\n const createAsyncResolver = asyncResolverFactory(\n async (\n resolved: {\n errors: unknown[];\n path: string;\n },\n token: string\n ): Promise<string> => {\n if (resolved.errors.length > 0) {\n throw new Error(`Cannot resolve ${token}`);\n }\n\n return resolved.path.replace(/\\\\/g, posix.sep);\n },\n (what, importer) => [\n what,\n {\n resolveDir: isAbsolute(importer)\n ? dirname(importer)\n : join(process.cwd(), dirname(importer)),\n kind: 'import-statement',\n },\n ]\n );\n return {\n name: 'wyw-in-js',\n setup(build) {\n const cssLookup = new Map<string, string>();\n const cssResolveDirs = new Map<string, string>();\n const warnedFilters = new Set<string>();\n let warnedEmptyBabelOptions = false;\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const warnOnUnsupportedFlags = (\n filterRegexp: RegExp,\n removedFlags: string,\n sanitizedFlags: string\n ) => {\n const key = `${filterRegexp.source}/${filterRegexp.flags}`;\n if (warnedFilters.has(key)) {\n return;\n }\n warnedFilters.add(key);\n const nextFlags = sanitizedFlags || 'none';\n // eslint-disable-next-line no-console\n console.warn(\n `[wyw-in-js] Ignoring unsupported RegExp flags \"${removedFlags}\" ` +\n `in esbuild filter /${filterRegexp.source}/${filterRegexp.flags}. ` +\n `Using flags \"${nextFlags}\".`\n );\n };\n\n const sanitizeFilter = (filterRegexp: RegExp): RegExp => {\n const { flags } = filterRegexp;\n const sanitizedFlags = flags\n .split('')\n .filter((flag) => supportedFilterFlags.has(flag))\n .join('');\n if (sanitizedFlags === flags) {\n return filterRegexp;\n }\n const removedFlags = flags\n .split('')\n .filter((flag) => !supportedFilterFlags.has(flag))\n .join('');\n warnOnUnsupportedFlags(filterRegexp, removedFlags, sanitizedFlags);\n return new RegExp(filterRegexp.source, sanitizedFlags);\n };\n\n const asyncResolve = createAsyncResolver(build.resolve);\n\n build.onEnd(() => {\n onDone(process.cwd());\n });\n\n build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => {\n return {\n namespace: 'wyw-in-js',\n path: args.path,\n };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, (args) => {\n return {\n contents: cssLookup.get(args.path),\n loader: 'css',\n resolveDir: cssResolveDirs.get(args.path),\n };\n });\n\n const filterRegexp =\n typeof filter === 'string'\n ? new RegExp(filter)\n : sanitizeFilter(filter);\n\n build.onLoad({ filter: filterRegexp }, async (args) => {\n const rawCode = readFileSync(args.path, 'utf8');\n const { ext, name: filename } = parse(args.path);\n const loader = ext.replace(/^\\./, '') as Loader;\n\n if (!transformLibraries && nodeModulesRegex.test(args.path)) {\n return {\n loader,\n contents: rawCode,\n };\n }\n\n if (!options) {\n options = {};\n if ('jsxFactory' in build.initialOptions) {\n options.jsxFactory = build.initialOptions.jsxFactory;\n }\n if ('jsxFragment' in build.initialOptions) {\n options.jsxFragment = build.initialOptions.jsxFragment;\n }\n }\n\n let codeForEsbuild = rawCode;\n if (babelTransform) {\n if (!babel || !resolvedWywOptions) {\n throw new Error(\n '[wyw-in-js] Internal error: babelTransform is enabled but Babel services are not initialized'\n );\n }\n\n const { babelOptions } = resolvedWywOptions;\n if (!Object.keys(babelOptions).length) {\n if (!warnedEmptyBabelOptions) {\n warnedEmptyBabelOptions = true;\n // eslint-disable-next-line no-console\n console.warn(\n '[wyw-in-js] babelTransform is enabled but babelOptions is empty; skipping Babel transform.'\n );\n }\n } else {\n let babelResult;\n try {\n babelResult = babel.transformSync(codeForEsbuild, {\n ...babelOptions,\n ast: false,\n filename: args.path,\n sourceFileName: args.path,\n sourceMaps: sourceMap,\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(\n `[wyw-in-js] Babel transform failed for ${args.path}: ${message}`\n );\n }\n\n if (!babelResult?.code) {\n throw new Error(\n `[wyw-in-js] Babel transform failed for ${args.path}`\n );\n }\n\n codeForEsbuild = babelResult.code;\n\n if (sourceMap && babelResult.map) {\n const babelMap = Buffer.from(\n JSON.stringify(babelResult.map)\n ).toString('base64');\n codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${babelMap}*/`;\n }\n }\n }\n\n const transformed = esbuildTransformSync(codeForEsbuild, {\n ...options,\n sourcefile: args.path,\n sourcemap: sourceMap,\n loader,\n });\n let { code } = transformed;\n\n if (sourceMap) {\n const esbuildMap = Buffer.from(transformed.map).toString('base64');\n code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;\n }\n\n const transformServices = {\n options: {\n filename: args.path,\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n const resolveDir = dirname(args.path);\n\n if (typeof result.cssText === 'undefined') {\n return {\n contents: code,\n loader,\n resolveDir,\n };\n }\n\n if (result.cssText === '') {\n let contents = result.code;\n\n if (sourceMap && result.sourceMap) {\n const wywMap = Buffer.from(\n JSON.stringify(result.sourceMap)\n ).toString('base64');\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n return {\n contents,\n loader,\n resolveDir,\n };\n }\n\n let { cssText } = result;\n\n const slug = slugify(cssText);\n const cssFilename = `${filename}_${slug}.wyw.css`;\n\n let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n 'base64'\n );\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n cssLookup.set(cssFilename, cssText);\n cssResolveDirs.set(cssFilename, resolveDir);\n\n return {\n contents,\n loader,\n resolveDir,\n };\n });\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"mappings":";;;;;AAMA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY,MAAM,OAAO,aAAa;AAGxD,SAAS,iBAAiB,4BAA4B;AACtD,SACE,iBAAiB,wBAEZ;AAOP,SACE,mBACA,SACA,WACA,0BACA,oBACA,sBACK;AACP,SACE,sBACA,uBACA,6BACK;AAcP,MAAM,uBAAuB,IAAI,IAAI;CAAC;CAAK;CAAK;CAAI,CAAC;AAErD,MAAM,mBAAmB;AAEzB,eAAe,SAAS,QAAQ,EAC9B,OACA,WACA,cACA,cACA,UACA,cACA,gBACA,SAAS,sBACT,oBACA,GAAG,SACqB,EAAE,EAAU;CACpC,IAAI,UAAU;CACd,MAAM,QAAQ,IAAI,0BAA0B;CAC5C,MAAM,wBAAwB,gBAAgB;CAC9C,MAAM,qBAAqB,wBACvB,eAAe,KAAK,GACpB;CACJ,MAAM,sBAAsB,qBAC1B,OACE,UAIA,UACoB;AACpB,MAAI,SAAS,OAAO,SAAS,GAAG;AAC9B,SAAM,IAAI,MAAM,kBAAkB,QAAQ;;AAG5C,SAAO,SAAS,KAAK,QAAQ,OAAO,MAAM,IAAI;KAE/C,MAAM,aAAa,CAClB,MACA;EACE,YAAY,WAAW,SAAS,GAC5B,QAAQ,SAAS,GACjB,KAAK,QAAQ,KAAK,EAAE,QAAQ,SAAS,CAAC;EAC1C,MAAM;EACP,CACF,CACF;AACD,QAAO;EACL,MAAM;EACN,MAAM,OAAO;GACX,MAAM,YAAY,IAAI,KAAqB;GAC3C,MAAM,iBAAiB,IAAI,KAAqB;GAChD,MAAM,gBAAgB,IAAI,KAAa;GACvC,IAAI,wBAAwB;GAC5B,MAAM,sBAAsB,sBAC1B,MAAM,eAAe,MACtB;GAED,MAAM,EAAE,SAAS,WAAW,mBAAmB,SAAS,MAAM;GAE9D,MAAM,0BACJ,cACA,cACA,mBACG;IACH,MAAM,MAAM,GAAG,aAAa,OAAO,GAAG,aAAa;AACnD,QAAI,cAAc,IAAI,IAAI,EAAE;AAC1B;;AAEF,kBAAc,IAAI,IAAI;IACtB,MAAM,YAAY,kBAAkB;;AAEpC,YAAQ,KACN,kDAAkD,aAAa,MAC7D,sBAAsB,aAAa,OAAO,GAAG,aAAa,MAAM,MAChE,gBAAgB,UAAU,IAC7B;;GAGH,MAAM,kBAAkB,iBAAiC;IACvD,MAAM,EAAE,UAAU;IAClB,MAAM,iBAAiB,MACpB,MAAM,GAAG,CACT,QAAQ,SAAS,qBAAqB,IAAI,KAAK,CAAC,CAChD,KAAK,GAAG;AACX,QAAI,mBAAmB,OAAO;AAC5B,YAAO;;IAET,MAAM,eAAe,MAClB,MAAM,GAAG,CACT,QAAQ,SAAS,CAAC,qBAAqB,IAAI,KAAK,CAAC,CACjD,KAAK,GAAG;AACX,2BAAuB,cAAc,cAAc,eAAe;AAClE,WAAO,IAAI,OAAO,aAAa,QAAQ,eAAe;;GAGxD,MAAM,cAAc,WAAgD;AAClE,QAAI,WAAW,MAAO,QAAO;AAC7B,QAAI,WAAW,KAAM,QAAO;AAC5B,QAAI,WAAW,MAAO,QAAO;AAC7B,WAAO;;GAGT,MAAM,eAAe,oBAAoB,MAAM,QAAQ;AAEvD,SAAM,YAAY;AAChB,WAAO,QAAQ,KAAK,CAAC;AACrB,sBAAkB,MAAM;KACxB;AAEF,SAAM,UAAU,EAAE,QAAQ,eAAe,GAAG,SAAS;AACnD,WAAO;KACL,WAAW;KACX,MAAM,KAAK;KACZ;KACD;AAEF,SAAM,OAAO;IAAE,QAAQ;IAAM,WAAW;IAAa,GAAG,SAAS;AAC/D,WAAO;KACL,UAAU,UAAU,IAAI,KAAK,KAAK;KAClC,QAAQ;KACR,YAAY,eAAe,IAAI,KAAK,KAAK;KAC1C;KACD;GAEF,MAAM,eACJ,OAAO,WAAW,WACd,IAAI,OAAO,OAAO,GAClB,eAAe,OAAO;AAE5B,SAAM,OAAO,EAAE,QAAQ,cAAc,EAAE,OAAO,SAAS;IACrD,MAAM,UAAU,aAAa,KAAK,MAAM,OAAO;IAC/C,MAAM,EAAE,KAAK,MAAM,aAAa,MAAM,KAAK,KAAK;IAChD,MAAM,SAAS,IAAI,QAAQ,OAAO,GAAG;AAErC,QAAI,CAAC,sBAAsB,iBAAiB,KAAK,KAAK,KAAK,EAAE;AAC3D,YAAO;MACL;MACA,UAAU;MACX;;AAGH,QAAI,CAAC,SAAS;AACZ,eAAU,EAAE;AACZ,SAAI,gBAAgB,MAAM,gBAAgB;AACxC,cAAQ,aAAa,MAAM,eAAe;;AAE5C,SAAI,iBAAiB,MAAM,gBAAgB;AACzC,cAAQ,cAAc,MAAM,eAAe;;;IAI/C,IAAI,iBAAiB;AACrB,QAAI,uBAAuB;AACzB,SAAI,CAAC,oBAAoB;AACvB,YAAM,IAAI,MACR,0FACD;;KAGH,MAAM,mBAAmB,mBAAmB,WAAW;AAGvD,SAAI,CAAC,oBAAoB,CAAC,OAAO,KAAK,iBAAiB,CAAC,QAAQ;AAC9D,UAAI,CAAC,uBAAuB;AAC1B,+BAAwB;;AAExB,eAAQ,KACN,iGACD;;YAEE;MACL,IAAI;AACJ,UAAI;AACF,mBAAY,iBAAiB,KAAK,MAAM,gBAAgB;QACtD,KAAK,QAAQ,KAAK;QAClB,MAAM,WAAW,OAAO;QACxB,YAAY;QACZ,WAAW;QACX,GAAG;QACJ,CAAC;eACK,GAAG;OACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,aAAM,IAAI,MACR,wCAAwC,KAAK,KAAK,IAAI,UACvD;;AAGH,UAAI,UAAU,OAAO,SAAS,GAAG;OAC/B,MAAM,UAAU,UAAU,OACvB,KAAK,UACJ,MAAM,YACF,GAAG,MAAM,QAAQ,IAAI,MAAM,cAC3B,MAAM,QACX,CACA,KAAK,KAAK;AACb,aAAM,IAAI,MACR,wCAAwC,KAAK,KAAK,IAAI,UACvD;;AAGH,uBAAiB,UAAU;AAE3B,UAAI,aAAa,UAAU,KAAK;OAC9B,MAAM,SAAS,OAAO,KACpB,KAAK,UAAU,UAAU,IAAI,CAC9B,CAAC,SAAS,SAAS;AACpB,yBAAkB,qDAAqD,OAAO;;;;IAKpF,MAAM,cAAc,qBAAqB,gBAAgB;KACvD,GAAG;KACH,YAAY,KAAK;KACjB,WAAW;KACX;KACD,CAAC;IACF,IAAI,EAAE,SAAS;AAEf,QAAI,WAAW;KACb,MAAM,aAAa,OAAO,KAAK,YAAY,IAAI,CAAC,SAAS,SAAS;AAClE,aAAQ,qDAAqD,WAAW;;IAG1E,MAAM,oBAAoB;KACxB,SAAS;MACP,UAAU,KAAK;MACf,eAAe;OACb,GAAG;OACH,YAAY,sBACV,KAAK,YACL,oBACD;OACF;MACD;MACA;MACA;MACA,MAAM,QAAQ,KAAK;MACpB;KACD;KACA,cAAc;KACf;IAED,MAAM,SAAS,MAAM,UAAU,mBAAmB,MAAM,aAAa;IACrE,MAAM,aAAa,QAAQ,KAAK,KAAK;AAErC,QAAI,OAAO,OAAO,YAAY,aAAa;AACzC,YAAO;MACL,UAAU;MACV;MACA;MACD;;AAGH,QAAI,OAAO,YAAY,IAAI;KACzB,IAAI,WAAW,OAAO;AAEtB,SAAI,aAAa,OAAO,WAAW;MACjC,MAAM,SAAS,OAAO,KACpB,KAAK,UAAU,OAAO,UAAU,CACjC,CAAC,SAAS,SAAS;AACpB,kBAAY,qDAAqD,OAAO;;AAG1E,YAAO;MACL;MACA;MACA;MACD;;IAGH,IAAI,EAAE,YAAY;IAElB,MAAM,OAAO,QAAQ,QAAQ;IAC7B,MAAM,cAAc,GAAG,SAAS,GAAG,KAAK;IAExC,IAAI,WAAW,UAAU,KAAK,UAAU,YAAY,CAAC,IAAI,OAAO;AAEhE,QAAI,aAAa,OAAO,kBAAkB;KACxC,MAAM,MAAM,OAAO,KAAK,OAAO,iBAAiB,CAAC,SAAS,SAAS;AACnE,gBAAW,qDAAqD,IAAI;KACpE,MAAM,SAAS,OAAO,KAAK,KAAK,UAAU,OAAO,UAAU,CAAC,CAAC,SAC3D,SACD;AACD,iBAAY,qDAAqD,OAAO;;AAG1E,cAAU,IAAI,aAAa,QAAQ;AACnC,mBAAe,IAAI,aAAa,WAAW;AAE3C,WAAO;KACL;KACA;KACA;KACD;KACD;;EAEL","names":[],"sources":["../src/index.ts"],"version":3,"sourcesContent":["/**\n * This file contains an esbuild loader for wyw-in-js.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport { readFileSync } from 'fs';\nimport { dirname, isAbsolute, join, parse, posix } from 'path';\n\nimport type { Plugin, TransformOptions, Loader } from 'esbuild';\nimport { transformSync as esbuildTransformSync } from 'esbuild';\nimport {\n transformSync as oxcTransformSync,\n type TransformOptions as OxcTransformOptions,\n} from 'oxc-transform';\n\nimport type {\n PluginOptions,\n Preprocessor,\n IFileReporterOptions,\n} from '@wyw-in-js/transform';\nimport {\n disposeEvalBroker,\n slugify,\n transform,\n TransformCacheCollection,\n createFileReporter,\n loadWywOptions,\n} from '@wyw-in-js/transform';\nimport {\n asyncResolverFactory,\n mergeOxcResolverAlias,\n toNativeResolverAlias,\n} from '@wyw-in-js/shared';\n\ntype EsbuildPluginOptions = {\n debug?: IFileReporterOptions | false | null | undefined;\n esbuildOptions?: TransformOptions;\n filter?: RegExp | string;\n keepComments?: boolean | RegExp;\n oxcTransform?: boolean;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n transformLibraries?: boolean;\n} & Partial<PluginOptions>;\n\nconst supportedFilterFlags = new Set(['i', 'm', 's']);\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nexport default function wywInJS({\n debug,\n sourceMap,\n keepComments,\n oxcTransform,\n prefixer,\n preprocessor,\n esbuildOptions,\n filter = /\\.(js|jsx|ts|tsx)$/,\n transformLibraries,\n ...rest\n}: EsbuildPluginOptions = {}): Plugin {\n let options = esbuildOptions;\n const cache = new TransformCacheCollection();\n const shouldRunOxcTransform = oxcTransform ?? false;\n const resolvedWywOptions = shouldRunOxcTransform\n ? loadWywOptions(rest)\n : null;\n const createAsyncResolver = asyncResolverFactory(\n async (\n resolved: {\n errors: unknown[];\n path: string;\n },\n token: string\n ): Promise<string> => {\n if (resolved.errors.length > 0) {\n throw new Error(`Cannot resolve ${token}`);\n }\n\n return resolved.path.replace(/\\\\/g, posix.sep);\n },\n (what, importer) => [\n what,\n {\n resolveDir: isAbsolute(importer)\n ? dirname(importer)\n : join(process.cwd(), dirname(importer)),\n kind: 'import-statement',\n },\n ]\n );\n return {\n name: 'wyw-in-js',\n setup(build) {\n const cssLookup = new Map<string, string>();\n const cssResolveDirs = new Map<string, string>();\n const warnedFilters = new Set<string>();\n let warnedEmptyOxcOptions = false;\n const nativeResolverAlias = toNativeResolverAlias(\n build.initialOptions.alias\n );\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const warnOnUnsupportedFlags = (\n filterRegexp: RegExp,\n removedFlags: string,\n sanitizedFlags: string\n ) => {\n const key = `${filterRegexp.source}/${filterRegexp.flags}`;\n if (warnedFilters.has(key)) {\n return;\n }\n warnedFilters.add(key);\n const nextFlags = sanitizedFlags || 'none';\n // eslint-disable-next-line no-console\n console.warn(\n `[wyw-in-js] Ignoring unsupported RegExp flags \"${removedFlags}\" ` +\n `in esbuild filter /${filterRegexp.source}/${filterRegexp.flags}. ` +\n `Using flags \"${nextFlags}\".`\n );\n };\n\n const sanitizeFilter = (filterRegexp: RegExp): RegExp => {\n const { flags } = filterRegexp;\n const sanitizedFlags = flags\n .split('')\n .filter((flag) => supportedFilterFlags.has(flag))\n .join('');\n if (sanitizedFlags === flags) {\n return filterRegexp;\n }\n const removedFlags = flags\n .split('')\n .filter((flag) => !supportedFilterFlags.has(flag))\n .join('');\n warnOnUnsupportedFlags(filterRegexp, removedFlags, sanitizedFlags);\n return new RegExp(filterRegexp.source, sanitizedFlags);\n };\n\n const getOxcLang = (loader: Loader): OxcTransformOptions['lang'] => {\n if (loader === 'tsx') return 'tsx';\n if (loader === 'ts') return 'ts';\n if (loader === 'jsx') return 'jsx';\n return 'js';\n };\n\n const asyncResolve = createAsyncResolver(build.resolve);\n\n build.onEnd(() => {\n onDone(process.cwd());\n disposeEvalBroker(cache);\n });\n\n build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => {\n return {\n namespace: 'wyw-in-js',\n path: args.path,\n };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, (args) => {\n return {\n contents: cssLookup.get(args.path),\n loader: 'css',\n resolveDir: cssResolveDirs.get(args.path),\n };\n });\n\n const filterRegexp =\n typeof filter === 'string'\n ? new RegExp(filter)\n : sanitizeFilter(filter);\n\n build.onLoad({ filter: filterRegexp }, async (args) => {\n const rawCode = readFileSync(args.path, 'utf8');\n const { ext, name: filename } = parse(args.path);\n const loader = ext.replace(/^\\./, '') as Loader;\n\n if (!transformLibraries && nodeModulesRegex.test(args.path)) {\n return {\n loader,\n contents: rawCode,\n };\n }\n\n if (!options) {\n options = {};\n if ('jsxFactory' in build.initialOptions) {\n options.jsxFactory = build.initialOptions.jsxFactory;\n }\n if ('jsxFragment' in build.initialOptions) {\n options.jsxFragment = build.initialOptions.jsxFragment;\n }\n }\n\n let codeForEsbuild = rawCode;\n if (shouldRunOxcTransform) {\n if (!resolvedWywOptions) {\n throw new Error(\n '[wyw-in-js] Internal error: oxcTransform is enabled but WyW options are not initialized'\n );\n }\n\n const transformOptions = resolvedWywOptions.oxcOptions.transform as\n | OxcTransformOptions\n | undefined;\n if (!transformOptions || !Object.keys(transformOptions).length) {\n if (!warnedEmptyOxcOptions) {\n warnedEmptyOxcOptions = true;\n // eslint-disable-next-line no-console\n console.warn(\n '[wyw-in-js] oxcTransform is enabled but oxcOptions.transform is empty; skipping Oxc transform.'\n );\n }\n } else {\n let oxcResult;\n try {\n oxcResult = oxcTransformSync(args.path, codeForEsbuild, {\n cwd: process.cwd(),\n lang: getOxcLang(loader),\n sourceType: 'module',\n sourcemap: sourceMap,\n ...transformOptions,\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(\n `[wyw-in-js] Oxc transform failed for ${args.path}: ${message}`\n );\n }\n\n if (oxcResult.errors.length > 0) {\n const details = oxcResult.errors\n .map((error) =>\n error.codeframe\n ? `${error.message}\\n${error.codeframe}`\n : error.message\n )\n .join('\\n');\n throw new Error(\n `[wyw-in-js] Oxc transform failed for ${args.path}: ${details}`\n );\n }\n\n codeForEsbuild = oxcResult.code;\n\n if (sourceMap && oxcResult.map) {\n const oxcMap = Buffer.from(\n JSON.stringify(oxcResult.map)\n ).toString('base64');\n codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${oxcMap}*/`;\n }\n }\n }\n\n const transformed = esbuildTransformSync(codeForEsbuild, {\n ...options,\n sourcefile: args.path,\n sourcemap: sourceMap,\n loader,\n });\n let { code } = transformed;\n\n if (sourceMap) {\n const esbuildMap = Buffer.from(transformed.map).toString('base64');\n code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;\n }\n\n const transformServices = {\n options: {\n filename: args.path,\n pluginOptions: {\n ...rest,\n oxcOptions: mergeOxcResolverAlias(\n rest.oxcOptions,\n nativeResolverAlias\n ),\n },\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n const resolveDir = dirname(args.path);\n\n if (typeof result.cssText === 'undefined') {\n return {\n contents: code,\n loader,\n resolveDir,\n };\n }\n\n if (result.cssText === '') {\n let contents = result.code;\n\n if (sourceMap && result.sourceMap) {\n const wywMap = Buffer.from(\n JSON.stringify(result.sourceMap)\n ).toString('base64');\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n return {\n contents,\n loader,\n resolveDir,\n };\n }\n\n let { cssText } = result;\n\n const slug = slugify(cssText);\n const cssFilename = `${filename}_${slug}.wyw.css`;\n\n let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n 'base64'\n );\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n cssLookup.set(cssFilename, cssText);\n cssResolveDirs.set(cssFilename, resolveDir);\n\n return {\n contents,\n loader,\n resolveDir,\n };\n });\n },\n };\n}\n"],"file":"index.mjs"}
|
package/package.json
CHANGED
|
@@ -1,32 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wyw-in-js/esbuild",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.1",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"dependencies": {
|
|
5
|
-
"@wyw-in-js/shared": "
|
|
6
|
-
"@wyw-in-js/transform": "
|
|
6
|
+
"@wyw-in-js/shared": "2.0.0-alpha.1",
|
|
7
|
+
"@wyw-in-js/transform": "2.0.0-alpha.1",
|
|
8
|
+
"oxc-transform": "0.127.0"
|
|
7
9
|
},
|
|
8
10
|
"devDependencies": {
|
|
9
|
-
"@types/node": "^
|
|
10
|
-
"@wyw-in-js/babel-config": "workspace:*",
|
|
11
|
+
"@types/node": "^22.0.0",
|
|
11
12
|
"@wyw-in-js/eslint-config": "workspace:*",
|
|
12
13
|
"@wyw-in-js/ts-config": "workspace:*",
|
|
13
14
|
"esbuild": "^0.15.16"
|
|
14
15
|
},
|
|
15
16
|
"engines": {
|
|
16
|
-
"node": ">=
|
|
17
|
+
"node": ">=22.0.0"
|
|
17
18
|
},
|
|
18
19
|
"exports": {
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./types/index.d.ts",
|
|
22
|
+
"default": "./esm/index.mjs"
|
|
23
|
+
}
|
|
22
24
|
},
|
|
23
25
|
"files": [
|
|
24
26
|
"esm/",
|
|
25
|
-
"lib/",
|
|
26
27
|
"types/"
|
|
27
28
|
],
|
|
28
29
|
"license": "MIT",
|
|
29
|
-
"main": "
|
|
30
|
+
"main": "esm/index.mjs",
|
|
30
31
|
"module": "esm/index.mjs",
|
|
31
32
|
"peerDependencies": {
|
|
32
33
|
"esbuild": ">=0.12.0"
|
|
@@ -35,8 +36,7 @@
|
|
|
35
36
|
"access": "public"
|
|
36
37
|
},
|
|
37
38
|
"scripts": {
|
|
38
|
-
"build:esm": "
|
|
39
|
-
"build:lib": "cross-env NODE_ENV=legacy babel src --out-dir lib --extensions '.js,.jsx,.ts,.tsx' --source-maps --delete-dir-on-start",
|
|
39
|
+
"build:esm": "node ../../scripts/build-esm-oxc.mjs --out-file-extension .mjs",
|
|
40
40
|
"build:types": "tsc --project ./tsconfig.lib.json --baseUrl . --rootDir ./src",
|
|
41
41
|
"lint": "eslint --ext .js,.ts .",
|
|
42
42
|
"test": "bun test src"
|
package/types/index.d.ts
CHANGED
|
@@ -6,15 +6,15 @@
|
|
|
6
6
|
import type { Plugin, TransformOptions } from 'esbuild';
|
|
7
7
|
import type { PluginOptions, Preprocessor, IFileReporterOptions } from '@wyw-in-js/transform';
|
|
8
8
|
type EsbuildPluginOptions = {
|
|
9
|
-
babelTransform?: boolean;
|
|
10
9
|
debug?: IFileReporterOptions | false | null | undefined;
|
|
11
10
|
esbuildOptions?: TransformOptions;
|
|
12
11
|
filter?: RegExp | string;
|
|
13
12
|
keepComments?: boolean | RegExp;
|
|
13
|
+
oxcTransform?: boolean;
|
|
14
14
|
prefixer?: boolean;
|
|
15
15
|
preprocessor?: Preprocessor;
|
|
16
16
|
sourceMap?: boolean;
|
|
17
17
|
transformLibraries?: boolean;
|
|
18
18
|
} & Partial<PluginOptions>;
|
|
19
|
-
export default function wywInJS({
|
|
19
|
+
export default function wywInJS({ debug, sourceMap, keepComments, oxcTransform, prefixer, preprocessor, esbuildOptions, filter, transformLibraries, ...rest }?: EsbuildPluginOptions): Plugin;
|
|
20
20
|
export {};
|
package/types/index.js
CHANGED
|
@@ -1,44 +1,34 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* This file contains an esbuild loader for wyw-in-js.
|
|
4
3
|
* It uses the transform.ts function to generate class names from source code,
|
|
5
4
|
* returns transformed code without template literals and attaches generated source maps
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const shared_1 = require("@wyw-in-js/shared");
|
|
6
|
+
import { readFileSync } from 'fs';
|
|
7
|
+
import { dirname, isAbsolute, join, parse, posix } from 'path';
|
|
8
|
+
import { transformSync as esbuildTransformSync } from 'esbuild';
|
|
9
|
+
import { transformSync as oxcTransformSync, } from 'oxc-transform';
|
|
10
|
+
import { disposeEvalBroker, slugify, transform, TransformCacheCollection, createFileReporter, loadWywOptions, } from '@wyw-in-js/transform';
|
|
11
|
+
import { asyncResolverFactory, mergeOxcResolverAlias, toNativeResolverAlias, } from '@wyw-in-js/shared';
|
|
14
12
|
const supportedFilterFlags = new Set(['i', 'm', 's']);
|
|
15
13
|
const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/;
|
|
16
|
-
function wywInJS({
|
|
14
|
+
export default function wywInJS({ debug, sourceMap, keepComments, oxcTransform, prefixer, preprocessor, esbuildOptions, filter = /\.(js|jsx|ts|tsx)$/, transformLibraries, ...rest } = {}) {
|
|
17
15
|
let options = esbuildOptions;
|
|
18
|
-
const cache = new
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
options: {
|
|
25
|
-
filename: '<wyw-in-js/esbuild>',
|
|
26
|
-
pluginOptions: resolvedWywOptions,
|
|
27
|
-
root: process.cwd(),
|
|
28
|
-
},
|
|
29
|
-
}).babel;
|
|
30
|
-
}
|
|
31
|
-
const createAsyncResolver = (0, shared_1.asyncResolverFactory)(async (resolved, token) => {
|
|
16
|
+
const cache = new TransformCacheCollection();
|
|
17
|
+
const shouldRunOxcTransform = oxcTransform ?? false;
|
|
18
|
+
const resolvedWywOptions = shouldRunOxcTransform
|
|
19
|
+
? loadWywOptions(rest)
|
|
20
|
+
: null;
|
|
21
|
+
const createAsyncResolver = asyncResolverFactory(async (resolved, token) => {
|
|
32
22
|
if (resolved.errors.length > 0) {
|
|
33
23
|
throw new Error(`Cannot resolve ${token}`);
|
|
34
24
|
}
|
|
35
|
-
return resolved.path.replace(/\\/g,
|
|
25
|
+
return resolved.path.replace(/\\/g, posix.sep);
|
|
36
26
|
}, (what, importer) => [
|
|
37
27
|
what,
|
|
38
28
|
{
|
|
39
|
-
resolveDir:
|
|
40
|
-
?
|
|
41
|
-
:
|
|
29
|
+
resolveDir: isAbsolute(importer)
|
|
30
|
+
? dirname(importer)
|
|
31
|
+
: join(process.cwd(), dirname(importer)),
|
|
42
32
|
kind: 'import-statement',
|
|
43
33
|
},
|
|
44
34
|
]);
|
|
@@ -48,8 +38,9 @@ function wywInJS({ babelTransform, debug, sourceMap, keepComments, prefixer, pre
|
|
|
48
38
|
const cssLookup = new Map();
|
|
49
39
|
const cssResolveDirs = new Map();
|
|
50
40
|
const warnedFilters = new Set();
|
|
51
|
-
let
|
|
52
|
-
const
|
|
41
|
+
let warnedEmptyOxcOptions = false;
|
|
42
|
+
const nativeResolverAlias = toNativeResolverAlias(build.initialOptions.alias);
|
|
43
|
+
const { emitter, onDone } = createFileReporter(debug ?? false);
|
|
53
44
|
const warnOnUnsupportedFlags = (filterRegexp, removedFlags, sanitizedFlags) => {
|
|
54
45
|
const key = `${filterRegexp.source}/${filterRegexp.flags}`;
|
|
55
46
|
if (warnedFilters.has(key)) {
|
|
@@ -78,9 +69,19 @@ function wywInJS({ babelTransform, debug, sourceMap, keepComments, prefixer, pre
|
|
|
78
69
|
warnOnUnsupportedFlags(filterRegexp, removedFlags, sanitizedFlags);
|
|
79
70
|
return new RegExp(filterRegexp.source, sanitizedFlags);
|
|
80
71
|
};
|
|
72
|
+
const getOxcLang = (loader) => {
|
|
73
|
+
if (loader === 'tsx')
|
|
74
|
+
return 'tsx';
|
|
75
|
+
if (loader === 'ts')
|
|
76
|
+
return 'ts';
|
|
77
|
+
if (loader === 'jsx')
|
|
78
|
+
return 'jsx';
|
|
79
|
+
return 'js';
|
|
80
|
+
};
|
|
81
81
|
const asyncResolve = createAsyncResolver(build.resolve);
|
|
82
82
|
build.onEnd(() => {
|
|
83
83
|
onDone(process.cwd());
|
|
84
|
+
disposeEvalBroker(cache);
|
|
84
85
|
});
|
|
85
86
|
build.onResolve({ filter: /\.wyw\.css$/ }, (args) => {
|
|
86
87
|
return {
|
|
@@ -99,8 +100,8 @@ function wywInJS({ babelTransform, debug, sourceMap, keepComments, prefixer, pre
|
|
|
99
100
|
? new RegExp(filter)
|
|
100
101
|
: sanitizeFilter(filter);
|
|
101
102
|
build.onLoad({ filter: filterRegexp }, async (args) => {
|
|
102
|
-
const rawCode =
|
|
103
|
-
const { ext, name: filename } =
|
|
103
|
+
const rawCode = readFileSync(args.path, 'utf8');
|
|
104
|
+
const { ext, name: filename } = parse(args.path);
|
|
104
105
|
const loader = ext.replace(/^\./, '');
|
|
105
106
|
if (!transformLibraries && nodeModulesRegex.test(args.path)) {
|
|
106
107
|
return {
|
|
@@ -118,44 +119,49 @@ function wywInJS({ babelTransform, debug, sourceMap, keepComments, prefixer, pre
|
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
121
|
let codeForEsbuild = rawCode;
|
|
121
|
-
if (
|
|
122
|
-
if (!
|
|
123
|
-
throw new Error('[wyw-in-js] Internal error:
|
|
122
|
+
if (shouldRunOxcTransform) {
|
|
123
|
+
if (!resolvedWywOptions) {
|
|
124
|
+
throw new Error('[wyw-in-js] Internal error: oxcTransform is enabled but WyW options are not initialized');
|
|
124
125
|
}
|
|
125
|
-
const
|
|
126
|
-
if (!Object.keys(
|
|
127
|
-
if (!
|
|
128
|
-
|
|
126
|
+
const transformOptions = resolvedWywOptions.oxcOptions.transform;
|
|
127
|
+
if (!transformOptions || !Object.keys(transformOptions).length) {
|
|
128
|
+
if (!warnedEmptyOxcOptions) {
|
|
129
|
+
warnedEmptyOxcOptions = true;
|
|
129
130
|
// eslint-disable-next-line no-console
|
|
130
|
-
console.warn('[wyw-in-js]
|
|
131
|
+
console.warn('[wyw-in-js] oxcTransform is enabled but oxcOptions.transform is empty; skipping Oxc transform.');
|
|
131
132
|
}
|
|
132
133
|
}
|
|
133
134
|
else {
|
|
134
|
-
let
|
|
135
|
+
let oxcResult;
|
|
135
136
|
try {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
137
|
+
oxcResult = oxcTransformSync(args.path, codeForEsbuild, {
|
|
138
|
+
cwd: process.cwd(),
|
|
139
|
+
lang: getOxcLang(loader),
|
|
140
|
+
sourceType: 'module',
|
|
141
|
+
sourcemap: sourceMap,
|
|
142
|
+
...transformOptions,
|
|
142
143
|
});
|
|
143
144
|
}
|
|
144
145
|
catch (e) {
|
|
145
146
|
const message = e instanceof Error ? e.message : String(e);
|
|
146
|
-
throw new Error(`[wyw-in-js]
|
|
147
|
+
throw new Error(`[wyw-in-js] Oxc transform failed for ${args.path}: ${message}`);
|
|
147
148
|
}
|
|
148
|
-
if (
|
|
149
|
-
|
|
149
|
+
if (oxcResult.errors.length > 0) {
|
|
150
|
+
const details = oxcResult.errors
|
|
151
|
+
.map((error) => error.codeframe
|
|
152
|
+
? `${error.message}\n${error.codeframe}`
|
|
153
|
+
: error.message)
|
|
154
|
+
.join('\n');
|
|
155
|
+
throw new Error(`[wyw-in-js] Oxc transform failed for ${args.path}: ${details}`);
|
|
150
156
|
}
|
|
151
|
-
codeForEsbuild =
|
|
152
|
-
if (sourceMap &&
|
|
153
|
-
const
|
|
154
|
-
codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${
|
|
157
|
+
codeForEsbuild = oxcResult.code;
|
|
158
|
+
if (sourceMap && oxcResult.map) {
|
|
159
|
+
const oxcMap = Buffer.from(JSON.stringify(oxcResult.map)).toString('base64');
|
|
160
|
+
codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${oxcMap}*/`;
|
|
155
161
|
}
|
|
156
162
|
}
|
|
157
163
|
}
|
|
158
|
-
const transformed = (
|
|
164
|
+
const transformed = esbuildTransformSync(codeForEsbuild, {
|
|
159
165
|
...options,
|
|
160
166
|
sourcefile: args.path,
|
|
161
167
|
sourcemap: sourceMap,
|
|
@@ -169,7 +175,10 @@ function wywInJS({ babelTransform, debug, sourceMap, keepComments, prefixer, pre
|
|
|
169
175
|
const transformServices = {
|
|
170
176
|
options: {
|
|
171
177
|
filename: args.path,
|
|
172
|
-
pluginOptions:
|
|
178
|
+
pluginOptions: {
|
|
179
|
+
...rest,
|
|
180
|
+
oxcOptions: mergeOxcResolverAlias(rest.oxcOptions, nativeResolverAlias),
|
|
181
|
+
},
|
|
173
182
|
prefixer,
|
|
174
183
|
keepComments,
|
|
175
184
|
preprocessor,
|
|
@@ -178,8 +187,8 @@ function wywInJS({ babelTransform, debug, sourceMap, keepComments, prefixer, pre
|
|
|
178
187
|
cache,
|
|
179
188
|
eventEmitter: emitter,
|
|
180
189
|
};
|
|
181
|
-
const result = await
|
|
182
|
-
const resolveDir =
|
|
190
|
+
const result = await transform(transformServices, code, asyncResolve);
|
|
191
|
+
const resolveDir = dirname(args.path);
|
|
183
192
|
if (typeof result.cssText === 'undefined') {
|
|
184
193
|
return {
|
|
185
194
|
contents: code,
|
|
@@ -200,7 +209,7 @@ function wywInJS({ babelTransform, debug, sourceMap, keepComments, prefixer, pre
|
|
|
200
209
|
};
|
|
201
210
|
}
|
|
202
211
|
let { cssText } = result;
|
|
203
|
-
const slug =
|
|
212
|
+
const slug = slugify(cssText);
|
|
204
213
|
const cssFilename = `${filename}_${slug}.wyw.css`;
|
|
205
214
|
let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;
|
|
206
215
|
if (sourceMap && result.cssSourceMapText) {
|
package/lib/index.js
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = wywInJS;
|
|
7
|
-
var _fs = require("fs");
|
|
8
|
-
var _path = require("path");
|
|
9
|
-
var _esbuild = require("esbuild");
|
|
10
|
-
var _transform = require("@wyw-in-js/transform");
|
|
11
|
-
var _shared = require("@wyw-in-js/shared");
|
|
12
|
-
/**
|
|
13
|
-
* This file contains an esbuild loader for wyw-in-js.
|
|
14
|
-
* It uses the transform.ts function to generate class names from source code,
|
|
15
|
-
* returns transformed code without template literals and attaches generated source maps
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const supportedFilterFlags = new Set(['i', 'm', 's']);
|
|
19
|
-
const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/;
|
|
20
|
-
function wywInJS({
|
|
21
|
-
babelTransform,
|
|
22
|
-
debug,
|
|
23
|
-
sourceMap,
|
|
24
|
-
keepComments,
|
|
25
|
-
prefixer,
|
|
26
|
-
preprocessor,
|
|
27
|
-
esbuildOptions,
|
|
28
|
-
filter = /\.(js|jsx|ts|tsx)$/,
|
|
29
|
-
transformLibraries,
|
|
30
|
-
...rest
|
|
31
|
-
} = {}) {
|
|
32
|
-
let options = esbuildOptions;
|
|
33
|
-
const cache = new _transform.TransformCacheCollection();
|
|
34
|
-
let resolvedWywOptions = null;
|
|
35
|
-
let babel = null;
|
|
36
|
-
if (babelTransform) {
|
|
37
|
-
resolvedWywOptions = (0, _transform.loadWywOptions)(rest);
|
|
38
|
-
babel = (0, _transform.withDefaultServices)({
|
|
39
|
-
options: {
|
|
40
|
-
filename: '<wyw-in-js/esbuild>',
|
|
41
|
-
pluginOptions: resolvedWywOptions,
|
|
42
|
-
root: process.cwd()
|
|
43
|
-
}
|
|
44
|
-
}).babel;
|
|
45
|
-
}
|
|
46
|
-
const createAsyncResolver = (0, _shared.asyncResolverFactory)(async (resolved, token) => {
|
|
47
|
-
if (resolved.errors.length > 0) {
|
|
48
|
-
throw new Error(`Cannot resolve ${token}`);
|
|
49
|
-
}
|
|
50
|
-
return resolved.path.replace(/\\/g, _path.posix.sep);
|
|
51
|
-
}, (what, importer) => [what, {
|
|
52
|
-
resolveDir: (0, _path.isAbsolute)(importer) ? (0, _path.dirname)(importer) : (0, _path.join)(process.cwd(), (0, _path.dirname)(importer)),
|
|
53
|
-
kind: 'import-statement'
|
|
54
|
-
}]);
|
|
55
|
-
return {
|
|
56
|
-
name: 'wyw-in-js',
|
|
57
|
-
setup(build) {
|
|
58
|
-
const cssLookup = new Map();
|
|
59
|
-
const cssResolveDirs = new Map();
|
|
60
|
-
const warnedFilters = new Set();
|
|
61
|
-
let warnedEmptyBabelOptions = false;
|
|
62
|
-
const {
|
|
63
|
-
emitter,
|
|
64
|
-
onDone
|
|
65
|
-
} = (0, _transform.createFileReporter)(debug !== null && debug !== void 0 ? debug : false);
|
|
66
|
-
const warnOnUnsupportedFlags = (filterRegexp, removedFlags, sanitizedFlags) => {
|
|
67
|
-
const key = `${filterRegexp.source}/${filterRegexp.flags}`;
|
|
68
|
-
if (warnedFilters.has(key)) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
warnedFilters.add(key);
|
|
72
|
-
const nextFlags = sanitizedFlags || 'none';
|
|
73
|
-
// eslint-disable-next-line no-console
|
|
74
|
-
console.warn(`[wyw-in-js] Ignoring unsupported RegExp flags "${removedFlags}" ` + `in esbuild filter /${filterRegexp.source}/${filterRegexp.flags}. ` + `Using flags "${nextFlags}".`);
|
|
75
|
-
};
|
|
76
|
-
const sanitizeFilter = filterRegexp => {
|
|
77
|
-
const {
|
|
78
|
-
flags
|
|
79
|
-
} = filterRegexp;
|
|
80
|
-
const sanitizedFlags = flags.split('').filter(flag => supportedFilterFlags.has(flag)).join('');
|
|
81
|
-
if (sanitizedFlags === flags) {
|
|
82
|
-
return filterRegexp;
|
|
83
|
-
}
|
|
84
|
-
const removedFlags = flags.split('').filter(flag => !supportedFilterFlags.has(flag)).join('');
|
|
85
|
-
warnOnUnsupportedFlags(filterRegexp, removedFlags, sanitizedFlags);
|
|
86
|
-
return new RegExp(filterRegexp.source, sanitizedFlags);
|
|
87
|
-
};
|
|
88
|
-
const asyncResolve = createAsyncResolver(build.resolve);
|
|
89
|
-
build.onEnd(() => {
|
|
90
|
-
onDone(process.cwd());
|
|
91
|
-
});
|
|
92
|
-
build.onResolve({
|
|
93
|
-
filter: /\.wyw\.css$/
|
|
94
|
-
}, args => {
|
|
95
|
-
return {
|
|
96
|
-
namespace: 'wyw-in-js',
|
|
97
|
-
path: args.path
|
|
98
|
-
};
|
|
99
|
-
});
|
|
100
|
-
build.onLoad({
|
|
101
|
-
filter: /.*/,
|
|
102
|
-
namespace: 'wyw-in-js'
|
|
103
|
-
}, args => {
|
|
104
|
-
return {
|
|
105
|
-
contents: cssLookup.get(args.path),
|
|
106
|
-
loader: 'css',
|
|
107
|
-
resolveDir: cssResolveDirs.get(args.path)
|
|
108
|
-
};
|
|
109
|
-
});
|
|
110
|
-
const filterRegexp = typeof filter === 'string' ? new RegExp(filter) : sanitizeFilter(filter);
|
|
111
|
-
build.onLoad({
|
|
112
|
-
filter: filterRegexp
|
|
113
|
-
}, async args => {
|
|
114
|
-
const rawCode = (0, _fs.readFileSync)(args.path, 'utf8');
|
|
115
|
-
const {
|
|
116
|
-
ext,
|
|
117
|
-
name: filename
|
|
118
|
-
} = (0, _path.parse)(args.path);
|
|
119
|
-
const loader = ext.replace(/^\./, '');
|
|
120
|
-
if (!transformLibraries && nodeModulesRegex.test(args.path)) {
|
|
121
|
-
return {
|
|
122
|
-
loader,
|
|
123
|
-
contents: rawCode
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
if (!options) {
|
|
127
|
-
options = {};
|
|
128
|
-
if ('jsxFactory' in build.initialOptions) {
|
|
129
|
-
options.jsxFactory = build.initialOptions.jsxFactory;
|
|
130
|
-
}
|
|
131
|
-
if ('jsxFragment' in build.initialOptions) {
|
|
132
|
-
options.jsxFragment = build.initialOptions.jsxFragment;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
let codeForEsbuild = rawCode;
|
|
136
|
-
if (babelTransform) {
|
|
137
|
-
if (!babel || !resolvedWywOptions) {
|
|
138
|
-
throw new Error('[wyw-in-js] Internal error: babelTransform is enabled but Babel services are not initialized');
|
|
139
|
-
}
|
|
140
|
-
const {
|
|
141
|
-
babelOptions
|
|
142
|
-
} = resolvedWywOptions;
|
|
143
|
-
if (!Object.keys(babelOptions).length) {
|
|
144
|
-
if (!warnedEmptyBabelOptions) {
|
|
145
|
-
warnedEmptyBabelOptions = true;
|
|
146
|
-
// eslint-disable-next-line no-console
|
|
147
|
-
console.warn('[wyw-in-js] babelTransform is enabled but babelOptions is empty; skipping Babel transform.');
|
|
148
|
-
}
|
|
149
|
-
} else {
|
|
150
|
-
var _babelResult;
|
|
151
|
-
let babelResult;
|
|
152
|
-
try {
|
|
153
|
-
babelResult = babel.transformSync(codeForEsbuild, {
|
|
154
|
-
...babelOptions,
|
|
155
|
-
ast: false,
|
|
156
|
-
filename: args.path,
|
|
157
|
-
sourceFileName: args.path,
|
|
158
|
-
sourceMaps: sourceMap
|
|
159
|
-
});
|
|
160
|
-
} catch (e) {
|
|
161
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
162
|
-
throw new Error(`[wyw-in-js] Babel transform failed for ${args.path}: ${message}`);
|
|
163
|
-
}
|
|
164
|
-
if (!((_babelResult = babelResult) !== null && _babelResult !== void 0 && _babelResult.code)) {
|
|
165
|
-
throw new Error(`[wyw-in-js] Babel transform failed for ${args.path}`);
|
|
166
|
-
}
|
|
167
|
-
codeForEsbuild = babelResult.code;
|
|
168
|
-
if (sourceMap && babelResult.map) {
|
|
169
|
-
const babelMap = Buffer.from(JSON.stringify(babelResult.map)).toString('base64');
|
|
170
|
-
codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${babelMap}*/`;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
const transformed = (0, _esbuild.transformSync)(codeForEsbuild, {
|
|
175
|
-
...options,
|
|
176
|
-
sourcefile: args.path,
|
|
177
|
-
sourcemap: sourceMap,
|
|
178
|
-
loader
|
|
179
|
-
});
|
|
180
|
-
let {
|
|
181
|
-
code
|
|
182
|
-
} = transformed;
|
|
183
|
-
if (sourceMap) {
|
|
184
|
-
const esbuildMap = Buffer.from(transformed.map).toString('base64');
|
|
185
|
-
code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;
|
|
186
|
-
}
|
|
187
|
-
const transformServices = {
|
|
188
|
-
options: {
|
|
189
|
-
filename: args.path,
|
|
190
|
-
pluginOptions: rest,
|
|
191
|
-
prefixer,
|
|
192
|
-
keepComments,
|
|
193
|
-
preprocessor,
|
|
194
|
-
root: process.cwd()
|
|
195
|
-
},
|
|
196
|
-
cache,
|
|
197
|
-
eventEmitter: emitter
|
|
198
|
-
};
|
|
199
|
-
const result = await (0, _transform.transform)(transformServices, code, asyncResolve);
|
|
200
|
-
const resolveDir = (0, _path.dirname)(args.path);
|
|
201
|
-
if (typeof result.cssText === 'undefined') {
|
|
202
|
-
return {
|
|
203
|
-
contents: code,
|
|
204
|
-
loader,
|
|
205
|
-
resolveDir
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
if (result.cssText === '') {
|
|
209
|
-
let contents = result.code;
|
|
210
|
-
if (sourceMap && result.sourceMap) {
|
|
211
|
-
const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString('base64');
|
|
212
|
-
contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
|
|
213
|
-
}
|
|
214
|
-
return {
|
|
215
|
-
contents,
|
|
216
|
-
loader,
|
|
217
|
-
resolveDir
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
let {
|
|
221
|
-
cssText
|
|
222
|
-
} = result;
|
|
223
|
-
const slug = (0, _transform.slugify)(cssText);
|
|
224
|
-
const cssFilename = `${filename}_${slug}.wyw.css`;
|
|
225
|
-
let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;
|
|
226
|
-
if (sourceMap && result.cssSourceMapText) {
|
|
227
|
-
const map = Buffer.from(result.cssSourceMapText).toString('base64');
|
|
228
|
-
cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;
|
|
229
|
-
const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString('base64');
|
|
230
|
-
contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
|
|
231
|
-
}
|
|
232
|
-
cssLookup.set(cssFilename, cssText);
|
|
233
|
-
cssResolveDirs.set(cssFilename, resolveDir);
|
|
234
|
-
return {
|
|
235
|
-
contents,
|
|
236
|
-
loader,
|
|
237
|
-
resolveDir
|
|
238
|
-
};
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_fs","require","_path","_esbuild","_transform","_shared","supportedFilterFlags","Set","nodeModulesRegex","wywInJS","babelTransform","debug","sourceMap","keepComments","prefixer","preprocessor","esbuildOptions","filter","transformLibraries","rest","options","cache","TransformCacheCollection","resolvedWywOptions","babel","loadWywOptions","withDefaultServices","filename","pluginOptions","root","process","cwd","createAsyncResolver","asyncResolverFactory","resolved","token","errors","length","Error","path","replace","posix","sep","what","importer","resolveDir","isAbsolute","dirname","join","kind","name","setup","build","cssLookup","Map","cssResolveDirs","warnedFilters","warnedEmptyBabelOptions","emitter","onDone","createFileReporter","warnOnUnsupportedFlags","filterRegexp","removedFlags","sanitizedFlags","key","source","flags","has","add","nextFlags","console","warn","sanitizeFilter","split","flag","RegExp","asyncResolve","resolve","onEnd","onResolve","args","namespace","onLoad","contents","get","loader","rawCode","readFileSync","ext","parse","test","initialOptions","jsxFactory","jsxFragment","codeForEsbuild","babelOptions","Object","keys","_babelResult","babelResult","transformSync","ast","sourceFileName","sourceMaps","e","message","String","code","map","babelMap","Buffer","from","JSON","stringify","toString","transformed","esbuildTransformSync","sourcefile","sourcemap","esbuildMap","transformServices","eventEmitter","result","transform","cssText","wywMap","slug","slugify","cssFilename","cssSourceMapText","set"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains an esbuild loader for wyw-in-js.\n * It uses the transform.ts function to generate class names from source code,\n * returns transformed code without template literals and attaches generated source maps\n */\n\nimport { readFileSync } from 'fs';\nimport { dirname, isAbsolute, join, parse, posix } from 'path';\n\nimport type { Plugin, TransformOptions, Loader } from 'esbuild';\nimport { transformSync as esbuildTransformSync } from 'esbuild';\n\nimport type {\n PluginOptions,\n Preprocessor,\n IFileReporterOptions,\n} from '@wyw-in-js/transform';\nimport {\n slugify,\n transform,\n TransformCacheCollection,\n createFileReporter,\n loadWywOptions,\n withDefaultServices,\n} from '@wyw-in-js/transform';\nimport { asyncResolverFactory } from '@wyw-in-js/shared';\n\ntype EsbuildPluginOptions = {\n babelTransform?: boolean;\n debug?: IFileReporterOptions | false | null | undefined;\n esbuildOptions?: TransformOptions;\n filter?: RegExp | string;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n transformLibraries?: boolean;\n} & Partial<PluginOptions>;\n\nconst supportedFilterFlags = new Set(['i', 'm', 's']);\n\nconst nodeModulesRegex = /^(?:.*[\\\\/])?node_modules(?:[\\\\/].*)?$/;\n\nexport default function wywInJS({\n babelTransform,\n debug,\n sourceMap,\n keepComments,\n prefixer,\n preprocessor,\n esbuildOptions,\n filter = /\\.(js|jsx|ts|tsx)$/,\n transformLibraries,\n ...rest\n}: EsbuildPluginOptions = {}): Plugin {\n let options = esbuildOptions;\n const cache = new TransformCacheCollection();\n let resolvedWywOptions: ReturnType<typeof loadWywOptions> | null = null;\n let babel: ReturnType<typeof withDefaultServices>['babel'] | null = null;\n if (babelTransform) {\n resolvedWywOptions = loadWywOptions(rest);\n babel = withDefaultServices({\n options: {\n filename: '<wyw-in-js/esbuild>',\n pluginOptions: resolvedWywOptions,\n root: process.cwd(),\n },\n }).babel;\n }\n const createAsyncResolver = asyncResolverFactory(\n async (\n resolved: {\n errors: unknown[];\n path: string;\n },\n token: string\n ): Promise<string> => {\n if (resolved.errors.length > 0) {\n throw new Error(`Cannot resolve ${token}`);\n }\n\n return resolved.path.replace(/\\\\/g, posix.sep);\n },\n (what, importer) => [\n what,\n {\n resolveDir: isAbsolute(importer)\n ? dirname(importer)\n : join(process.cwd(), dirname(importer)),\n kind: 'import-statement',\n },\n ]\n );\n return {\n name: 'wyw-in-js',\n setup(build) {\n const cssLookup = new Map<string, string>();\n const cssResolveDirs = new Map<string, string>();\n const warnedFilters = new Set<string>();\n let warnedEmptyBabelOptions = false;\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const warnOnUnsupportedFlags = (\n filterRegexp: RegExp,\n removedFlags: string,\n sanitizedFlags: string\n ) => {\n const key = `${filterRegexp.source}/${filterRegexp.flags}`;\n if (warnedFilters.has(key)) {\n return;\n }\n warnedFilters.add(key);\n const nextFlags = sanitizedFlags || 'none';\n // eslint-disable-next-line no-console\n console.warn(\n `[wyw-in-js] Ignoring unsupported RegExp flags \"${removedFlags}\" ` +\n `in esbuild filter /${filterRegexp.source}/${filterRegexp.flags}. ` +\n `Using flags \"${nextFlags}\".`\n );\n };\n\n const sanitizeFilter = (filterRegexp: RegExp): RegExp => {\n const { flags } = filterRegexp;\n const sanitizedFlags = flags\n .split('')\n .filter((flag) => supportedFilterFlags.has(flag))\n .join('');\n if (sanitizedFlags === flags) {\n return filterRegexp;\n }\n const removedFlags = flags\n .split('')\n .filter((flag) => !supportedFilterFlags.has(flag))\n .join('');\n warnOnUnsupportedFlags(filterRegexp, removedFlags, sanitizedFlags);\n return new RegExp(filterRegexp.source, sanitizedFlags);\n };\n\n const asyncResolve = createAsyncResolver(build.resolve);\n\n build.onEnd(() => {\n onDone(process.cwd());\n });\n\n build.onResolve({ filter: /\\.wyw\\.css$/ }, (args) => {\n return {\n namespace: 'wyw-in-js',\n path: args.path,\n };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'wyw-in-js' }, (args) => {\n return {\n contents: cssLookup.get(args.path),\n loader: 'css',\n resolveDir: cssResolveDirs.get(args.path),\n };\n });\n\n const filterRegexp =\n typeof filter === 'string'\n ? new RegExp(filter)\n : sanitizeFilter(filter);\n\n build.onLoad({ filter: filterRegexp }, async (args) => {\n const rawCode = readFileSync(args.path, 'utf8');\n const { ext, name: filename } = parse(args.path);\n const loader = ext.replace(/^\\./, '') as Loader;\n\n if (!transformLibraries && nodeModulesRegex.test(args.path)) {\n return {\n loader,\n contents: rawCode,\n };\n }\n\n if (!options) {\n options = {};\n if ('jsxFactory' in build.initialOptions) {\n options.jsxFactory = build.initialOptions.jsxFactory;\n }\n if ('jsxFragment' in build.initialOptions) {\n options.jsxFragment = build.initialOptions.jsxFragment;\n }\n }\n\n let codeForEsbuild = rawCode;\n if (babelTransform) {\n if (!babel || !resolvedWywOptions) {\n throw new Error(\n '[wyw-in-js] Internal error: babelTransform is enabled but Babel services are not initialized'\n );\n }\n\n const { babelOptions } = resolvedWywOptions;\n if (!Object.keys(babelOptions).length) {\n if (!warnedEmptyBabelOptions) {\n warnedEmptyBabelOptions = true;\n // eslint-disable-next-line no-console\n console.warn(\n '[wyw-in-js] babelTransform is enabled but babelOptions is empty; skipping Babel transform.'\n );\n }\n } else {\n let babelResult;\n try {\n babelResult = babel.transformSync(codeForEsbuild, {\n ...babelOptions,\n ast: false,\n filename: args.path,\n sourceFileName: args.path,\n sourceMaps: sourceMap,\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(\n `[wyw-in-js] Babel transform failed for ${args.path}: ${message}`\n );\n }\n\n if (!babelResult?.code) {\n throw new Error(\n `[wyw-in-js] Babel transform failed for ${args.path}`\n );\n }\n\n codeForEsbuild = babelResult.code;\n\n if (sourceMap && babelResult.map) {\n const babelMap = Buffer.from(\n JSON.stringify(babelResult.map)\n ).toString('base64');\n codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${babelMap}*/`;\n }\n }\n }\n\n const transformed = esbuildTransformSync(codeForEsbuild, {\n ...options,\n sourcefile: args.path,\n sourcemap: sourceMap,\n loader,\n });\n let { code } = transformed;\n\n if (sourceMap) {\n const esbuildMap = Buffer.from(transformed.map).toString('base64');\n code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;\n }\n\n const transformServices = {\n options: {\n filename: args.path,\n pluginOptions: rest,\n prefixer,\n keepComments,\n preprocessor,\n root: process.cwd(),\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n const resolveDir = dirname(args.path);\n\n if (typeof result.cssText === 'undefined') {\n return {\n contents: code,\n loader,\n resolveDir,\n };\n }\n\n if (result.cssText === '') {\n let contents = result.code;\n\n if (sourceMap && result.sourceMap) {\n const wywMap = Buffer.from(\n JSON.stringify(result.sourceMap)\n ).toString('base64');\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n return {\n contents,\n loader,\n resolveDir,\n };\n }\n\n let { cssText } = result;\n\n const slug = slugify(cssText);\n const cssFilename = `${filename}_${slug}.wyw.css`;\n\n let contents = `import ${JSON.stringify(cssFilename)}; ${result.code}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString(\n 'base64'\n );\n contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;\n }\n\n cssLookup.set(cssFilename, cssText);\n cssResolveDirs.set(cssFilename, resolveDir);\n\n return {\n contents,\n loader,\n resolveDir,\n };\n });\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|