@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 CHANGED
@@ -34,28 +34,35 @@ esbuild
34
34
  .catch(() => process.exit(1));
35
35
  ```
36
36
 
37
- ## Additional Babel transformations
37
+ ## Eval resolver modes
38
38
 
39
- `@wyw-in-js/esbuild` runs WyW evaluation after an `esbuild.transform()` step, so some Babel plugins may not be able to
40
- operate on the original TS/JSX source.
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
- Enable `babelTransform` to apply `babelOptions` to the original source code before the esbuild/WyW pipeline:
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
- babelTransform: true,
47
- babelOptions: {
48
- plugins: [
49
- // your custom Babel plugins
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: `Babel(source) → esbuild.transform() → WyW transform`.
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
- * 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
-
7
- import { readFileSync } from 'fs';
8
- import { dirname, isAbsolute, join, parse, posix } from 'path';
9
- import { transformSync as esbuildTransformSync } from 'esbuild';
10
- import { slugify, transform, TransformCacheCollection, createFileReporter, loadWywOptions, withDefaultServices } from '@wyw-in-js/transform';
11
- import { asyncResolverFactory } from '@wyw-in-js/shared';
12
- const supportedFilterFlags = new Set(['i', 'm', 's']);
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
- babelTransform,
16
- debug,
17
- sourceMap,
18
- keepComments,
19
- prefixer,
20
- preprocessor,
21
- esbuildOptions,
22
- filter = /\.(js|jsx|ts|tsx)$/,
23
- transformLibraries,
24
- ...rest
25
- } = {}) {
26
- let options = esbuildOptions;
27
- const cache = new TransformCacheCollection();
28
- let resolvedWywOptions = null;
29
- let babel = null;
30
- if (babelTransform) {
31
- resolvedWywOptions = loadWywOptions(rest);
32
- babel = withDefaultServices({
33
- options: {
34
- filename: '<wyw-in-js/esbuild>',
35
- pluginOptions: resolvedWywOptions,
36
- root: process.cwd()
37
- }
38
- }).babel;
39
- }
40
- const createAsyncResolver = asyncResolverFactory(async (resolved, token) => {
41
- if (resolved.errors.length > 0) {
42
- throw new Error(`Cannot resolve ${token}`);
43
- }
44
- return resolved.path.replace(/\\/g, posix.sep);
45
- }, (what, importer) => [what, {
46
- resolveDir: isAbsolute(importer) ? dirname(importer) : join(process.cwd(), dirname(importer)),
47
- kind: 'import-statement'
48
- }]);
49
- return {
50
- name: 'wyw-in-js',
51
- setup(build) {
52
- const cssLookup = new Map();
53
- const cssResolveDirs = new Map();
54
- const warnedFilters = new Set();
55
- let warnedEmptyBabelOptions = false;
56
- const {
57
- emitter,
58
- onDone
59
- } = createFileReporter(debug ?? false);
60
- const warnOnUnsupportedFlags = (filterRegexp, removedFlags, sanitizedFlags) => {
61
- const key = `${filterRegexp.source}/${filterRegexp.flags}`;
62
- if (warnedFilters.has(key)) {
63
- return;
64
- }
65
- warnedFilters.add(key);
66
- const nextFlags = sanitizedFlags || 'none';
67
- // eslint-disable-next-line no-console
68
- console.warn(`[wyw-in-js] Ignoring unsupported RegExp flags "${removedFlags}" ` + `in esbuild filter /${filterRegexp.source}/${filterRegexp.flags}. ` + `Using flags "${nextFlags}".`);
69
- };
70
- const sanitizeFilter = filterRegexp => {
71
- const {
72
- flags
73
- } = filterRegexp;
74
- const sanitizedFlags = flags.split('').filter(flag => supportedFilterFlags.has(flag)).join('');
75
- if (sanitizedFlags === flags) {
76
- return filterRegexp;
77
- }
78
- const removedFlags = flags.split('').filter(flag => !supportedFilterFlags.has(flag)).join('');
79
- warnOnUnsupportedFlags(filterRegexp, removedFlags, sanitizedFlags);
80
- return new RegExp(filterRegexp.source, sanitizedFlags);
81
- };
82
- const asyncResolve = createAsyncResolver(build.resolve);
83
- build.onEnd(() => {
84
- onDone(process.cwd());
85
- });
86
- build.onResolve({
87
- filter: /\.wyw\.css$/
88
- }, args => {
89
- return {
90
- namespace: 'wyw-in-js',
91
- path: args.path
92
- };
93
- });
94
- build.onLoad({
95
- filter: /.*/,
96
- namespace: 'wyw-in-js'
97
- }, args => {
98
- return {
99
- contents: cssLookup.get(args.path),
100
- loader: 'css',
101
- resolveDir: cssResolveDirs.get(args.path)
102
- };
103
- });
104
- const filterRegexp = typeof filter === 'string' ? new RegExp(filter) : sanitizeFilter(filter);
105
- build.onLoad({
106
- filter: filterRegexp
107
- }, async args => {
108
- const rawCode = readFileSync(args.path, 'utf8');
109
- const {
110
- ext,
111
- name: filename
112
- } = parse(args.path);
113
- const loader = ext.replace(/^\./, '');
114
- if (!transformLibraries && nodeModulesRegex.test(args.path)) {
115
- return {
116
- loader,
117
- contents: rawCode
118
- };
119
- }
120
- if (!options) {
121
- options = {};
122
- if ('jsxFactory' in build.initialOptions) {
123
- options.jsxFactory = build.initialOptions.jsxFactory;
124
- }
125
- if ('jsxFragment' in build.initialOptions) {
126
- options.jsxFragment = build.initialOptions.jsxFragment;
127
- }
128
- }
129
- let codeForEsbuild = rawCode;
130
- if (babelTransform) {
131
- if (!babel || !resolvedWywOptions) {
132
- throw new Error('[wyw-in-js] Internal error: babelTransform is enabled but Babel services are not initialized');
133
- }
134
- const {
135
- babelOptions
136
- } = resolvedWywOptions;
137
- if (!Object.keys(babelOptions).length) {
138
- if (!warnedEmptyBabelOptions) {
139
- warnedEmptyBabelOptions = true;
140
- // eslint-disable-next-line no-console
141
- console.warn('[wyw-in-js] babelTransform is enabled but babelOptions is empty; skipping Babel transform.');
142
- }
143
- } else {
144
- let babelResult;
145
- try {
146
- babelResult = babel.transformSync(codeForEsbuild, {
147
- ...babelOptions,
148
- ast: false,
149
- filename: args.path,
150
- sourceFileName: args.path,
151
- sourceMaps: sourceMap
152
- });
153
- } catch (e) {
154
- const message = e instanceof Error ? e.message : String(e);
155
- throw new Error(`[wyw-in-js] Babel transform failed for ${args.path}: ${message}`);
156
- }
157
- if (!babelResult?.code) {
158
- throw new Error(`[wyw-in-js] Babel transform failed for ${args.path}`);
159
- }
160
- codeForEsbuild = babelResult.code;
161
- if (sourceMap && babelResult.map) {
162
- const babelMap = Buffer.from(JSON.stringify(babelResult.map)).toString('base64');
163
- codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${babelMap}*/`;
164
- }
165
- }
166
- }
167
- const transformed = esbuildTransformSync(codeForEsbuild, {
168
- ...options,
169
- sourcefile: args.path,
170
- sourcemap: sourceMap,
171
- loader
172
- });
173
- let {
174
- code
175
- } = transformed;
176
- if (sourceMap) {
177
- const esbuildMap = Buffer.from(transformed.map).toString('base64');
178
- code += `/*# sourceMappingURL=data:application/json;base64,${esbuildMap}*/`;
179
- }
180
- const transformServices = {
181
- options: {
182
- filename: args.path,
183
- pluginOptions: rest,
184
- prefixer,
185
- keepComments,
186
- preprocessor,
187
- root: process.cwd()
188
- },
189
- cache,
190
- eventEmitter: emitter
191
- };
192
- const result = await transform(transformServices, code, asyncResolve);
193
- const resolveDir = dirname(args.path);
194
- if (typeof result.cssText === 'undefined') {
195
- return {
196
- contents: code,
197
- loader,
198
- resolveDir
199
- };
200
- }
201
- if (result.cssText === '') {
202
- let contents = result.code;
203
- if (sourceMap && result.sourceMap) {
204
- const wywMap = Buffer.from(JSON.stringify(result.sourceMap)).toString('base64');
205
- contents += `/*# sourceMappingURL=data:application/json;base64,${wywMap}*/`;
206
- }
207
- return {
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":"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","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": "1.1.0",
3
+ "version": "2.0.0-alpha.1",
4
+ "type": "module",
4
5
  "dependencies": {
5
- "@wyw-in-js/shared": "1.1.0",
6
- "@wyw-in-js/transform": "1.1.0"
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": "^16.18.55",
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": ">=20.0.0"
17
+ "node": ">=22.0.0"
17
18
  },
18
19
  "exports": {
19
- "import": "./esm/index.mjs",
20
- "require": "./lib/index.js",
21
- "types": "./types/index.d.ts"
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": "lib/index.js",
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": "babel src --out-dir esm --out-file-extension .mjs --extensions '.js,.jsx,.ts,.tsx' --source-maps --delete-dir-on-start",
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({ babelTransform, debug, sourceMap, keepComments, prefixer, preprocessor, esbuildOptions, filter, transformLibraries, ...rest }?: EsbuildPluginOptions): Plugin;
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
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.default = wywInJS;
9
- const fs_1 = require("fs");
10
- const path_1 = require("path");
11
- const esbuild_1 = require("esbuild");
12
- const transform_1 = require("@wyw-in-js/transform");
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({ babelTransform, debug, sourceMap, keepComments, prefixer, preprocessor, esbuildOptions, filter = /\.(js|jsx|ts|tsx)$/, transformLibraries, ...rest } = {}) {
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 transform_1.TransformCacheCollection();
19
- let resolvedWywOptions = null;
20
- let babel = null;
21
- if (babelTransform) {
22
- resolvedWywOptions = (0, transform_1.loadWywOptions)(rest);
23
- babel = (0, transform_1.withDefaultServices)({
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, path_1.posix.sep);
25
+ return resolved.path.replace(/\\/g, posix.sep);
36
26
  }, (what, importer) => [
37
27
  what,
38
28
  {
39
- resolveDir: (0, path_1.isAbsolute)(importer)
40
- ? (0, path_1.dirname)(importer)
41
- : (0, path_1.join)(process.cwd(), (0, path_1.dirname)(importer)),
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 warnedEmptyBabelOptions = false;
52
- const { emitter, onDone } = (0, transform_1.createFileReporter)(debug ?? false);
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 = (0, fs_1.readFileSync)(args.path, 'utf8');
103
- const { ext, name: filename } = (0, path_1.parse)(args.path);
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 (babelTransform) {
122
- if (!babel || !resolvedWywOptions) {
123
- throw new Error('[wyw-in-js] Internal error: babelTransform is enabled but Babel services are not initialized');
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 { babelOptions } = resolvedWywOptions;
126
- if (!Object.keys(babelOptions).length) {
127
- if (!warnedEmptyBabelOptions) {
128
- warnedEmptyBabelOptions = true;
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] babelTransform is enabled but babelOptions is empty; skipping Babel transform.');
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 babelResult;
135
+ let oxcResult;
135
136
  try {
136
- babelResult = babel.transformSync(codeForEsbuild, {
137
- ...babelOptions,
138
- ast: false,
139
- filename: args.path,
140
- sourceFileName: args.path,
141
- sourceMaps: sourceMap,
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] Babel transform failed for ${args.path}: ${message}`);
147
+ throw new Error(`[wyw-in-js] Oxc transform failed for ${args.path}: ${message}`);
147
148
  }
148
- if (!babelResult?.code) {
149
- throw new Error(`[wyw-in-js] Babel transform failed for ${args.path}`);
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 = babelResult.code;
152
- if (sourceMap && babelResult.map) {
153
- const babelMap = Buffer.from(JSON.stringify(babelResult.map)).toString('base64');
154
- codeForEsbuild += `/*# sourceMappingURL=data:application/json;base64,${babelMap}*/`;
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 = (0, esbuild_1.transformSync)(codeForEsbuild, {
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: rest,
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 (0, transform_1.transform)(transformServices, code, asyncResolve);
182
- const resolveDir = (0, path_1.dirname)(args.path);
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 = (0, transform_1.slugify)(cssText);
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":[]}