@wyw-in-js/vite 0.8.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,6 +11,8 @@ npm i -D @wyw-in-js/vite
11
11
  yarn add --dev @wyw-in-js/vite
12
12
  # pnpm
13
13
  pnpm add -D @wyw-in-js/vite
14
+ # bun
15
+ bun add -d @wyw-in-js/vite
14
16
  ```
15
17
 
16
18
  ## Usage
@@ -27,4 +29,56 @@ export default defineConfig({
27
29
  });
28
30
  ```
29
31
 
32
+ ## Transforming libraries in `node_modules`
33
+
34
+ By default, the Vite plugin skips transforming files from `node_modules` for performance.
35
+
36
+ To transform a specific library, enable `transformLibraries` and narrow `include`/`exclude`:
37
+
38
+ ```js
39
+ wyw({
40
+ transformLibraries: true,
41
+ include: [/node_modules\\/(?:@fluentui)\\//],
42
+ });
43
+ ```
44
+
45
+ ## Disabling vendor prefixing
46
+
47
+ Stylis adds vendor-prefixed CSS by default. To disable it (and reduce CSS size), pass `prefixer: false`:
48
+
49
+ ```js
50
+ wyw({
51
+ prefixer: false,
52
+ });
53
+ ```
54
+
55
+ ## Preserving generated CSS paths
56
+
57
+ When `build.rollupOptions.output.preserveModules` is enabled, older Rollup versions (used by Vite 3/4) flatten asset names
58
+ and drop directories for WyW-generated `*.wyw-in-js.css` files.
59
+
60
+ To preserve the original directory layout for WyW CSS assets, enable `preserveCssPaths`:
61
+
62
+ ```js
63
+ import { defineConfig } from 'vite';
64
+ import wyw from '@wyw-in-js/vite';
65
+
66
+ export default defineConfig({
67
+ plugins: [wyw({ preserveCssPaths: true })],
68
+ build: {
69
+ rollupOptions: {
70
+ output: {
71
+ preserveModules: true,
72
+ preserveModulesRoot: 'src',
73
+ },
74
+ },
75
+ },
76
+ });
77
+ ```
78
+
79
+ ## `import.meta.env` during evaluation
80
+
81
+ WyW-in-JS evaluates part of your code at build time to extract styles. The Vite plugin injects Vite's `import.meta.env` values
82
+ into the evaluation context so `import.meta.env.*` works as expected.
83
+
30
84
  To get details about supported options by the plugin, please check [documentation](https://wyw-in-js.dev/bundlers/vite).
package/esm/index.mjs CHANGED
@@ -6,31 +6,217 @@
6
6
 
7
7
  import { existsSync } from 'fs';
8
8
  import path from 'path';
9
- import { optimizeDeps, createFilter } from 'vite';
10
- import { logger, syncResolve } from '@wyw-in-js/shared';
9
+ import { createFilter, loadEnv } from 'vite';
10
+ import { asyncResolverFactory, logger, syncResolve } from '@wyw-in-js/shared';
11
11
  import { createFileReporter, getFileIdx, transform, TransformCacheCollection } from '@wyw-in-js/transform';
12
+ const isWindowsAbsolutePath = value => /^[a-zA-Z]:[\\/]/.test(value);
13
+ const normalizeToPosix = value => value.replace(/\\/g, path.posix.sep);
14
+ const isInside = (childPath, parentPath) => {
15
+ const rel = path.relative(parentPath, childPath);
16
+ return rel === '' || !rel.startsWith('..') && !path.isAbsolute(rel);
17
+ };
18
+ const isWywCssAssetName = value => value.endsWith('.wyw-in-js.css');
19
+ const normalizeAssetRelativePath = value => {
20
+ const normalized = path.posix.normalize(normalizeToPosix(value).replace(/^\/+/, ''));
21
+ if (normalized.startsWith('..') || path.posix.isAbsolute(normalized)) {
22
+ return null;
23
+ }
24
+ return normalized;
25
+ };
26
+ const stripExtension = value => {
27
+ const ext = path.posix.extname(value);
28
+ return ext ? value.slice(0, -ext.length) : value;
29
+ };
30
+ const getWywCssAssetFileNames = (resolvedConfig, output, originalAssetFileNames) => {
31
+ if (!output.preserveModules) return null;
32
+ const rootDir = resolvedConfig.root;
33
+ const preserveModulesRootValue = output.preserveModulesRoot;
34
+ let preserveModulesRootAbs = null;
35
+ if (typeof preserveModulesRootValue === 'string') {
36
+ preserveModulesRootAbs = path.isAbsolute(preserveModulesRootValue) ? preserveModulesRootValue : path.resolve(rootDir, preserveModulesRootValue);
37
+ }
38
+ const preserveModulesRootRel = preserveModulesRootAbs && isInside(preserveModulesRootAbs, rootDir) ? normalizeToPosix(path.relative(rootDir, preserveModulesRootAbs)) : null;
39
+ return assetInfo => {
40
+ const template = typeof originalAssetFileNames === 'function' ? originalAssetFileNames(assetInfo) : originalAssetFileNames;
41
+ const assetName = assetInfo?.name;
42
+ if (typeof assetName !== 'string' || !isWywCssAssetName(assetName)) {
43
+ return template;
44
+ }
45
+ if (!template.includes('[')) {
46
+ return template;
47
+ }
48
+ let relativePath = null;
49
+ const assetNameNormalized = normalizeToPosix(assetName);
50
+ if (path.isAbsolute(assetName) || isWindowsAbsolutePath(assetNameNormalized)) {
51
+ const preserveRel = preserveModulesRootAbs && isInside(assetName, preserveModulesRootAbs) ? path.relative(preserveModulesRootAbs, assetName) : null;
52
+ if (preserveRel && !path.isAbsolute(preserveRel) && !preserveRel.startsWith('..')) {
53
+ relativePath = preserveRel;
54
+ } else if (isInside(assetName, rootDir)) {
55
+ relativePath = path.relative(rootDir, assetName);
56
+ }
57
+ } else if (preserveModulesRootRel && assetNameNormalized.startsWith(`${preserveModulesRootRel}/`)) {
58
+ relativePath = assetNameNormalized.slice(preserveModulesRootRel.length + 1);
59
+ } else {
60
+ relativePath = assetNameNormalized;
61
+ }
62
+ const normalized = relativePath ? normalizeAssetRelativePath(relativePath) : null;
63
+ if (!normalized) {
64
+ return template;
65
+ }
66
+ const withoutExt = stripExtension(normalized);
67
+ if (template.includes('[name]')) {
68
+ const dir = path.posix.dirname(withoutExt);
69
+ if (dir === '.' || dir === '') {
70
+ return template;
71
+ }
72
+ return template.replace(/\[name\]/g, `${dir}/[name]`);
73
+ }
74
+ const dir = path.posix.dirname(withoutExt);
75
+ if (dir === '.' || dir === '') {
76
+ return template;
77
+ }
78
+ const idx = template.indexOf('[');
79
+ if (idx < 0) {
80
+ return template;
81
+ }
82
+ const prefix = template.slice(0, idx);
83
+ if (prefix !== '' && !prefix.endsWith('/')) {
84
+ return template;
85
+ }
86
+ return `${prefix}${dir}/${template.slice(idx)}`;
87
+ };
88
+ };
12
89
  export default function wywInJS({
13
90
  debug,
14
91
  include,
15
92
  exclude,
16
93
  sourceMap,
94
+ preserveCssPaths,
95
+ keepComments,
17
96
  prefixer,
18
97
  preprocessor,
98
+ ssrDevCss,
99
+ ssrDevCssPath,
100
+ transformLibraries,
19
101
  ...rest
20
102
  } = {}) {
21
103
  const filter = createFilter(include, exclude);
22
104
  const cssLookup = {};
23
105
  const cssFileLookup = {};
106
+ const pendingCssReloads = new Set();
107
+ let pendingCssReloadTimer;
108
+ let ssrDevCssVersion = 0;
24
109
  let config;
25
110
  let devServer;
111
+ let importMetaEnvForEval = null;
112
+ const ssrDevCssEnabled = Boolean(ssrDevCss);
113
+ const [ssrDevCssPathname, ssrDevCssQuery] = (ssrDevCssPath ?? '/_wyw-in-js/ssr.css').split('?', 2);
114
+ const ssrDevCssRoute = ssrDevCssPathname.startsWith('/') ? ssrDevCssPathname : `/${ssrDevCssPathname}`;
115
+ const getSsrDevCssHref = () => {
116
+ const versionParam = `v=${ssrDevCssVersion}`;
117
+ const query = ssrDevCssQuery ? `${ssrDevCssQuery}&${versionParam}` : versionParam;
118
+ return `${ssrDevCssRoute}?${query}`;
119
+ };
120
+ const getSsrDevCssContents = () => {
121
+ const entries = Object.entries(cssLookup);
122
+ if (entries.length === 0) return '';
123
+ const merged = entries.sort(([a], [b]) => a.localeCompare(b)).map(([, cssText]) => cssText).join('\n');
124
+ return `${merged}\n`;
125
+ };
26
126
  const {
27
127
  emitter,
28
128
  onDone
29
129
  } = createFileReporter(debug ?? false);
130
+ const scheduleCssReload = cssFilename => {
131
+ if (!devServer?.moduleGraph) return;
132
+ pendingCssReloads.add(cssFilename);
133
+ if (pendingCssReloadTimer) return;
134
+ pendingCssReloadTimer = setTimeout(() => {
135
+ pendingCssReloadTimer = undefined;
136
+ const ids = Array.from(pendingCssReloads);
137
+ pendingCssReloads.clear();
138
+ for (const id of ids) {
139
+ const module = devServer.moduleGraph.getModuleById(id);
140
+ if (module) devServer.reloadModule(module);
141
+ }
142
+ }, 0);
143
+ };
30
144
 
31
145
  // <dependency id, targets>
32
146
  const targets = [];
33
147
  const cache = new TransformCacheCollection();
148
+ const isInsideCacheDir = filename => {
149
+ if (!config.cacheDir) {
150
+ return false;
151
+ }
152
+ const relative = path.relative(config.cacheDir, filename);
153
+ return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);
154
+ };
155
+ const getDepsOptimizer = () => {
156
+ if (!devServer) return null;
157
+ const server = devServer;
158
+ return server.environments?.client?.depsOptimizer ?? server.depsOptimizer ?? server._depsOptimizer ?? null;
159
+ };
160
+ const waitForOptimizedDep = async filename => {
161
+ const depsOptimizer = getDepsOptimizer();
162
+ if (!depsOptimizer?.isOptimizedDepFile?.(filename)) {
163
+ return false;
164
+ }
165
+ await depsOptimizer.init?.();
166
+ await depsOptimizer.scanProcessing;
167
+ const info = depsOptimizer.metadata?.depInfoList?.find(item => item.file === filename);
168
+ if (info?.processing) {
169
+ await info.processing;
170
+ }
171
+ return true;
172
+ };
173
+ const createAsyncResolver = asyncResolverFactory(async (resolved, what, importer, stack) => {
174
+ const log = logger.extend('vite').extend(getFileIdx(importer));
175
+ if (resolved) {
176
+ if (resolved.external) {
177
+ // If module is marked as external, Rollup will not resolve it,
178
+ // so we need to resolve it ourselves with default resolver
179
+ const resolvedId = syncResolve(what, importer, stack);
180
+ log("resolve ✅ '%s'@'%s -> %O\n%s", what, importer, resolved);
181
+ return resolvedId;
182
+ }
183
+ log("resolve ✅ '%s'@'%s -> %O\n%s", what, importer, resolved);
184
+
185
+ // Vite adds param like `?v=667939b3` to cached modules
186
+ const resolvedId = resolved.id.split('?', 1)[0];
187
+ if (resolvedId.startsWith('\0')) {
188
+ // \0 is a special character in Rollup that tells Rollup to not include this in the bundle
189
+ // https://rollupjs.org/guide/en/#outputexports
190
+ return null;
191
+ }
192
+ if (resolvedId.startsWith('/@')) {
193
+ return null;
194
+ }
195
+ if (!existsSync(resolvedId)) {
196
+ // When Vite resolves to an optimized deps entry (cacheDir) it may not be written yet.
197
+ // Wait for Vite's optimizer instead of calling optimizeDeps() manually (deprecated in Vite 7).
198
+ try {
199
+ await waitForOptimizedDep(resolvedId);
200
+ } catch {
201
+ // If optimizer failed, fall through to preserve previous behavior and surface the error.
202
+ }
203
+
204
+ // Vite can return an optimized deps entry (from cacheDir) before it's written to disk.
205
+ // Manually calling optimizeDeps is deprecated in Vite 7 and can also get called many times.
206
+ // Instead, fall back to resolving the original module path directly.
207
+ if (!existsSync(resolvedId) && isInsideCacheDir(resolvedId)) {
208
+ try {
209
+ return syncResolve(what, importer, stack);
210
+ } catch {
211
+ // Fall through to preserve previous behavior: return resolvedId and let WyW surface the error.
212
+ }
213
+ }
214
+ }
215
+ return resolvedId;
216
+ }
217
+ log("resolve ❌ '%s'@'%s", what, importer);
218
+ throw new Error(`Could not resolve ${what}`);
219
+ }, (what, importer) => [what, importer]);
34
220
  return {
35
221
  name: 'wyw-in-js',
36
222
  enforce: 'post',
@@ -39,9 +225,89 @@ export default function wywInJS({
39
225
  },
40
226
  configResolved(resolvedConfig) {
41
227
  config = resolvedConfig;
228
+ if (preserveCssPaths && config.command === 'build') {
229
+ const outputs = config.build.rollupOptions.output;
230
+ let outputEntries = [];
231
+ if (Array.isArray(outputs)) {
232
+ outputEntries = outputs;
233
+ } else if (outputs) {
234
+ outputEntries = [outputs];
235
+ }
236
+ outputEntries.forEach(entry => {
237
+ if (!entry || typeof entry !== 'object') return;
238
+ const output = entry;
239
+ if (!output.preserveModules) return;
240
+ const template = output.assetFileNames ?? `${config.build.assetsDir ?? 'assets'}/[name].[hash].[ext]`;
241
+ const assetFileNames = getWywCssAssetFileNames(config, output, template);
242
+ if (assetFileNames) output.assetFileNames = assetFileNames;
243
+ });
244
+ }
245
+ const envPrefix = config.envPrefix ?? 'VITE_';
246
+ const envDir =
247
+ // envDir is absolute in modern Vite, but keep a fallback for older versions
248
+ 'envDir' in config && typeof config.envDir === 'string' ? config.envDir : config.root;
249
+ const loaded = loadEnv(config.mode, envDir, envPrefix);
250
+ const base = {
251
+ ...loaded,
252
+ BASE_URL: config.base,
253
+ MODE: config.mode,
254
+ DEV: config.command === 'serve',
255
+ PROD: config.command === 'build'
256
+ };
257
+ importMetaEnvForEval = {
258
+ client: {
259
+ ...base,
260
+ SSR: false
261
+ },
262
+ ssr: {
263
+ ...base,
264
+ SSR: true
265
+ }
266
+ };
42
267
  },
43
268
  configureServer(_server) {
44
269
  devServer = _server;
270
+ if (!ssrDevCssEnabled || config.command !== 'serve') return;
271
+ devServer.middlewares.use((req, res, next) => {
272
+ const {
273
+ url
274
+ } = req;
275
+ if (!url) {
276
+ next();
277
+ return;
278
+ }
279
+ const [pathname] = url.split('?', 1);
280
+ if (pathname !== ssrDevCssRoute) {
281
+ next();
282
+ return;
283
+ }
284
+ const etag = `W/"${ssrDevCssVersion}"`;
285
+ const ifNoneMatch = req.headers['if-none-match'];
286
+ if (ifNoneMatch === etag) {
287
+ res.statusCode = 304;
288
+ res.end();
289
+ return;
290
+ }
291
+ res.statusCode = 200;
292
+ res.setHeader('Content-Type', 'text/css; charset=utf-8');
293
+ res.setHeader('Cache-Control', 'no-cache');
294
+ res.setHeader('ETag', etag);
295
+ res.end(getSsrDevCssContents());
296
+ });
297
+ },
298
+ transformIndexHtml(html) {
299
+ if (!ssrDevCssEnabled || config.command !== 'serve') return undefined;
300
+ return {
301
+ html,
302
+ tags: [{
303
+ tag: 'link',
304
+ attrs: {
305
+ rel: 'stylesheet',
306
+ href: getSsrDevCssHref()
307
+ },
308
+ injectTo: 'head-prepend'
309
+ }]
310
+ };
45
311
  },
46
312
  load(url) {
47
313
  const [id] = url.split('?', 1);
@@ -71,51 +337,39 @@ export default function wywInJS({
71
337
  }
72
338
  return affected.map(target => devServer.moduleGraph.getModuleById(target.id)).concat(ctx.modules).filter(m => !!m);
73
339
  },
74
- async transform(code, url) {
340
+ async transform(code, url, transformOptions) {
75
341
  const [id] = url.split('?', 1);
76
342
 
77
343
  // Do not transform ignored and generated files
78
- if (url.includes('node_modules') || !filter(url) || id in cssLookup) return;
344
+ if (!transformLibraries && url.includes('node_modules') || !filter(url) || id in cssLookup) return;
79
345
  const log = logger.extend('vite').extend(getFileIdx(id));
80
346
  log('transform %s', id);
81
- const asyncResolve = async (what, importer, stack) => {
82
- const resolved = await this.resolve(what, importer);
83
- if (resolved) {
84
- if (resolved.external) {
85
- // If module is marked as external, Rollup will not resolve it,
86
- // so we need to resolve it ourselves with default resolver
87
- const resolvedId = syncResolve(what, importer, stack);
88
- log("resolve '%s'@'%s -> %O\n%s", what, importer, resolved);
89
- return resolvedId;
90
- }
91
- log("resolve ✅ '%s'@'%s -> %O\n%s", what, importer, resolved);
92
- // Vite adds param like `?v=667939b3` to cached modules
93
- const resolvedId = resolved.id.split('?', 1)[0];
94
- if (resolvedId.startsWith('\0')) {
95
- // \0 is a special character in Rollup that tells Rollup to not include this in the bundle
96
- // https://rollupjs.org/guide/en/#outputexports
97
- return null;
98
- }
99
- if (!existsSync(resolvedId)) {
100
- await optimizeDeps(config);
101
- }
102
- return resolvedId;
103
- }
104
- log("resolve ❌ '%s'@'%s", what, importer);
105
- throw new Error(`Could not resolve ${what}`);
347
+ const overrideContext = (context, filename) => {
348
+ const isSsr = typeof transformOptions === 'boolean' ? transformOptions : Boolean(transformOptions?.ssr);
349
+ const env = importMetaEnvForEval?.[isSsr ? 'ssr' : 'client'];
350
+ const withEnv = env ? {
351
+ ...context,
352
+ __wyw_import_meta_env: env
353
+ } : context;
354
+ return rest.overrideContext ? rest.overrideContext(withEnv, filename) : withEnv;
106
355
  };
107
356
  const transformServices = {
108
357
  options: {
109
358
  filename: id,
110
359
  root: process.cwd(),
111
360
  prefixer,
361
+ keepComments,
112
362
  preprocessor,
113
- pluginOptions: rest
363
+ pluginOptions: {
364
+ ...rest,
365
+ overrideContext
366
+ }
114
367
  },
115
368
  cache,
369
+ emitWarning: message => this.warn(message),
116
370
  eventEmitter: emitter
117
371
  };
118
- const result = await transform(transformServices, code, asyncResolve);
372
+ const result = await transform(transformServices, code, createAsyncResolver(this.resolve));
119
373
  let {
120
374
  cssText,
121
375
  dependencies
@@ -144,6 +398,7 @@ export default function wywInJS({
144
398
  const map = Buffer.from(result.cssSourceMapText).toString('base64');
145
399
  cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;
146
400
  }
401
+ const didCssChange = cssLookup[cssFilename] !== cssText;
147
402
  cssLookup[cssFilename] = cssText;
148
403
  cssFileLookup[cssId] = cssFilename;
149
404
  result.code += `\nimport ${JSON.stringify(cssFilename)};\n`;
@@ -159,10 +414,10 @@ export default function wywInJS({
159
414
  id,
160
415
  dependencies
161
416
  });else target.dependencies = dependencies;
162
- if (devServer?.moduleGraph) {
163
- const module = devServer.moduleGraph.getModuleById(cssFilename);
164
- if (module) {
165
- devServer.reloadModule(module);
417
+ if (didCssChange) {
418
+ scheduleCssReload(cssFilename);
419
+ if (ssrDevCssEnabled && config.command === 'serve') {
420
+ ssrDevCssVersion += 1;
166
421
  }
167
422
  }
168
423
  /* eslint-disable-next-line consistent-return */
package/esm/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["existsSync","path","optimizeDeps","createFilter","logger","syncResolve","createFileReporter","getFileIdx","transform","TransformCacheCollection","wywInJS","debug","include","exclude","sourceMap","prefixer","preprocessor","rest","filter","cssLookup","cssFileLookup","config","devServer","emitter","onDone","targets","cache","name","enforce","buildEnd","process","cwd","configResolved","resolvedConfig","configureServer","_server","load","url","id","split","resolveId","importeeUrl","handleHotUpdate","ctx","modules","length","affected","x","dependencies","some","dep","file","m","deps","flatMap","target","depId","invalidateForFile","map","moduleGraph","getModuleById","concat","code","includes","log","extend","asyncResolve","what","importer","stack","resolved","resolve","external","resolvedId","startsWith","Error","transformServices","options","filename","root","pluginOptions","eventEmitter","result","cssText","cssFilename","normalize","replace","posix","sep","cssRelativePath","relative","cssId","cssSourceMapText","Buffer","from","toString","JSON","stringify","i","end","depModule","isEntry","find","t","push","module","reloadModule"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains a Vite 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 { existsSync } from 'fs';\nimport path from 'path';\n\nimport { optimizeDeps, createFilter } from 'vite';\nimport type {\n ModuleNode,\n Plugin,\n ResolvedConfig,\n ViteDevServer,\n FilterPattern,\n} from 'vite';\n\nimport { logger, syncResolve } from '@wyw-in-js/shared';\nimport type {\n IFileReporterOptions,\n PluginOptions,\n Preprocessor,\n} from '@wyw-in-js/transform';\nimport {\n createFileReporter,\n getFileIdx,\n transform,\n TransformCacheCollection,\n} from '@wyw-in-js/transform';\n\ntype VitePluginOptions = {\n debug?: IFileReporterOptions | false | null | undefined;\n exclude?: FilterPattern;\n include?: FilterPattern;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n sourceMap?: boolean;\n} & Partial<PluginOptions>;\n\nexport { Plugin };\n\nexport default function wywInJS({\n debug,\n include,\n exclude,\n sourceMap,\n prefixer,\n preprocessor,\n ...rest\n}: VitePluginOptions = {}): Plugin {\n const filter = createFilter(include, exclude);\n const cssLookup: { [key: string]: string } = {};\n const cssFileLookup: { [key: string]: string } = {};\n let config: ResolvedConfig;\n let devServer: ViteDevServer;\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n // <dependency id, targets>\n const targets: { dependencies: string[]; id: string }[] = [];\n const cache = new TransformCacheCollection();\n return {\n name: 'wyw-in-js',\n enforce: 'post',\n buildEnd() {\n onDone(process.cwd());\n },\n configResolved(resolvedConfig: ResolvedConfig) {\n config = resolvedConfig;\n },\n configureServer(_server) {\n devServer = _server;\n },\n load(url: string) {\n const [id] = url.split('?', 1);\n return cssLookup[id];\n },\n /* eslint-disable-next-line consistent-return */\n resolveId(importeeUrl: string) {\n const [id] = importeeUrl.split('?', 1);\n if (cssLookup[id]) return id;\n return cssFileLookup[id];\n },\n handleHotUpdate(ctx) {\n // it's module, so just transform it\n if (ctx.modules.length) return ctx.modules;\n\n // Select affected modules of changed dependency\n const affected = targets.filter(\n (x) =>\n // file is dependency of any target\n x.dependencies.some((dep) => dep === ctx.file) ||\n // or changed module is a dependency of any target\n x.dependencies.some((dep) => ctx.modules.some((m) => m.file === dep))\n );\n const deps = affected.flatMap((target) => target.dependencies);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const depId of deps) {\n cache.invalidateForFile(depId);\n }\n\n return affected\n .map((target) => devServer.moduleGraph.getModuleById(target.id))\n .concat(ctx.modules)\n .filter((m): m is ModuleNode => !!m);\n },\n async transform(code: string, url: string) {\n const [id] = url.split('?', 1);\n\n // Do not transform ignored and generated files\n if (url.includes('node_modules') || !filter(url) || id in cssLookup)\n return;\n\n const log = logger.extend('vite').extend(getFileIdx(id));\n\n log('transform %s', id);\n\n const asyncResolve = async (\n what: string,\n importer: string,\n stack: string[]\n ) => {\n const resolved = await this.resolve(what, importer);\n if (resolved) {\n if (resolved.external) {\n // If module is marked as external, Rollup will not resolve it,\n // so we need to resolve it ourselves with default resolver\n const resolvedId = syncResolve(what, importer, stack);\n log(\"resolve ✅ '%s'@'%s -> %O\\n%s\", what, importer, resolved);\n return resolvedId;\n }\n\n log(\"resolve ✅ '%s'@'%s -> %O\\n%s\", what, importer, resolved);\n // Vite adds param like `?v=667939b3` to cached modules\n const resolvedId = resolved.id.split('?', 1)[0];\n\n if (resolvedId.startsWith('\\0')) {\n // \\0 is a special character in Rollup that tells Rollup to not include this in the bundle\n // https://rollupjs.org/guide/en/#outputexports\n return null;\n }\n\n if (!existsSync(resolvedId)) {\n await optimizeDeps(config);\n }\n\n return resolvedId;\n }\n\n log(\"resolve ❌ '%s'@'%s\", what, importer);\n throw new Error(`Could not resolve ${what}`);\n };\n\n const transformServices = {\n options: {\n filename: id,\n root: process.cwd(),\n prefixer,\n preprocessor,\n pluginOptions: rest,\n },\n cache,\n eventEmitter: emitter,\n };\n\n const result = await transform(transformServices, code, asyncResolve);\n\n let { cssText, dependencies } = result;\n\n // Heads up, there are three cases:\n // 1. cssText is undefined, it means that file was not transformed\n // 2. cssText is empty, it means that file was transformed, but it does not contain any styles\n // 3. cssText is not empty, it means that file was transformed and it contains styles\n\n if (typeof cssText === 'undefined') {\n return;\n }\n\n if (cssText === '') {\n /* eslint-disable-next-line consistent-return */\n return {\n code: result.code,\n map: result.sourceMap,\n };\n }\n\n dependencies ??= [];\n\n const cssFilename = path\n .normalize(`${id.replace(/\\.[jt]sx?$/, '')}.wyw-in-js.css`)\n .replace(/\\\\/g, path.posix.sep);\n\n const cssRelativePath = path\n .relative(config.root, cssFilename)\n .replace(/\\\\/g, path.posix.sep);\n\n const cssId = `/${cssRelativePath}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n }\n\n cssLookup[cssFilename] = cssText;\n cssFileLookup[cssId] = cssFilename;\n\n result.code += `\\nimport ${JSON.stringify(cssFilename)};\\n`;\n\n for (let i = 0, end = dependencies.length; i < end; i++) {\n // eslint-disable-next-line no-await-in-loop\n const depModule = await this.resolve(dependencies[i], url, {\n isEntry: false,\n });\n if (depModule) dependencies[i] = depModule.id;\n }\n const target = targets.find((t) => t.id === id);\n if (!target) targets.push({ id, dependencies });\n else target.dependencies = dependencies;\n\n if (devServer?.moduleGraph) {\n const module = devServer.moduleGraph.getModuleById(cssFilename);\n\n if (module) {\n devServer.reloadModule(module);\n }\n }\n /* eslint-disable-next-line consistent-return */\n return { code: result.code, map: result.sourceMap };\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["existsSync","path","createFilter","loadEnv","asyncResolverFactory","logger","syncResolve","createFileReporter","getFileIdx","transform","TransformCacheCollection","isWindowsAbsolutePath","value","test","normalizeToPosix","replace","posix","sep","isInside","childPath","parentPath","rel","relative","startsWith","isAbsolute","isWywCssAssetName","endsWith","normalizeAssetRelativePath","normalized","normalize","stripExtension","ext","extname","slice","length","getWywCssAssetFileNames","resolvedConfig","output","originalAssetFileNames","preserveModules","rootDir","root","preserveModulesRootValue","preserveModulesRoot","preserveModulesRootAbs","resolve","preserveModulesRootRel","assetInfo","template","assetName","name","includes","relativePath","assetNameNormalized","preserveRel","withoutExt","dir","dirname","idx","indexOf","prefix","wywInJS","debug","include","exclude","sourceMap","preserveCssPaths","keepComments","prefixer","preprocessor","ssrDevCss","ssrDevCssPath","transformLibraries","rest","filter","cssLookup","cssFileLookup","pendingCssReloads","Set","pendingCssReloadTimer","ssrDevCssVersion","config","devServer","importMetaEnvForEval","ssrDevCssEnabled","Boolean","ssrDevCssPathname","ssrDevCssQuery","split","ssrDevCssRoute","getSsrDevCssHref","versionParam","query","getSsrDevCssContents","entries","Object","merged","sort","a","b","localeCompare","map","cssText","join","emitter","onDone","scheduleCssReload","cssFilename","moduleGraph","add","setTimeout","undefined","ids","Array","from","clear","id","module","getModuleById","reloadModule","targets","cache","isInsideCacheDir","filename","cacheDir","getDepsOptimizer","server","environments","client","depsOptimizer","_depsOptimizer","waitForOptimizedDep","isOptimizedDepFile","init","scanProcessing","info","metadata","depInfoList","find","item","file","processing","createAsyncResolver","resolved","what","importer","stack","log","extend","external","resolvedId","Error","enforce","buildEnd","process","cwd","configResolved","command","outputs","build","rollupOptions","outputEntries","isArray","forEach","entry","assetFileNames","assetsDir","envPrefix","envDir","loaded","mode","base","BASE_URL","MODE","DEV","PROD","SSR","ssr","configureServer","_server","middlewares","use","req","res","next","url","pathname","etag","ifNoneMatch","headers","statusCode","end","setHeader","transformIndexHtml","html","tags","tag","attrs","href","injectTo","load","resolveId","importeeUrl","handleHotUpdate","ctx","modules","affected","x","dependencies","some","dep","m","deps","flatMap","target","depId","invalidateForFile","concat","code","transformOptions","overrideContext","context","isSsr","env","withEnv","__wyw_import_meta_env","transformServices","options","pluginOptions","emitWarning","message","warn","eventEmitter","result","cssRelativePath","cssId","cssSourceMapText","Buffer","toString","didCssChange","JSON","stringify","i","depModule","isEntry","t","push"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * This file contains a Vite 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 { existsSync } from 'fs';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport path from 'path';\n\nimport { createFilter, loadEnv } from 'vite';\nimport type {\n ModuleNode,\n Plugin,\n ResolvedConfig,\n ViteDevServer,\n FilterPattern,\n} from 'vite';\n\nimport { asyncResolverFactory, logger, syncResolve } from '@wyw-in-js/shared';\nimport type {\n IFileReporterOptions,\n PluginOptions,\n Preprocessor,\n} from '@wyw-in-js/transform';\nimport {\n createFileReporter,\n getFileIdx,\n transform,\n TransformCacheCollection,\n} from '@wyw-in-js/transform';\n\ntype VitePluginOptions = {\n debug?: IFileReporterOptions | false | null | undefined;\n exclude?: FilterPattern;\n include?: FilterPattern;\n keepComments?: boolean | RegExp;\n prefixer?: boolean;\n preprocessor?: Preprocessor;\n preserveCssPaths?: boolean;\n sourceMap?: boolean;\n ssrDevCss?: boolean;\n ssrDevCssPath?: string;\n transformLibraries?: boolean;\n} & Partial<PluginOptions>;\n\ntype OverrideContext = NonNullable<PluginOptions['overrideContext']>;\n\nexport { Plugin };\n\ntype AssetInfoLike = { name?: unknown };\ntype AssetFileNames = string | ((assetInfo: AssetInfoLike) => string);\ntype RollupOutputLike = {\n assetFileNames?: AssetFileNames;\n preserveModules?: boolean;\n preserveModulesRoot?: unknown;\n} & Record<string, unknown>;\n\nconst isWindowsAbsolutePath = (value: string): boolean =>\n /^[a-zA-Z]:[\\\\/]/.test(value);\n\nconst normalizeToPosix = (value: string): string =>\n value.replace(/\\\\/g, path.posix.sep);\n\nconst isInside = (childPath: string, parentPath: string): boolean => {\n const rel = path.relative(parentPath, childPath);\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n};\n\nconst isWywCssAssetName = (value: string): boolean =>\n value.endsWith('.wyw-in-js.css');\n\nconst normalizeAssetRelativePath = (value: string): string | null => {\n const normalized = path.posix.normalize(\n normalizeToPosix(value).replace(/^\\/+/, '')\n );\n if (normalized.startsWith('..') || path.posix.isAbsolute(normalized)) {\n return null;\n }\n\n return normalized;\n};\n\nconst stripExtension = (value: string): string => {\n const ext = path.posix.extname(value);\n return ext ? value.slice(0, -ext.length) : value;\n};\n\nconst getWywCssAssetFileNames = (\n resolvedConfig: ResolvedConfig,\n output: RollupOutputLike,\n originalAssetFileNames: AssetFileNames\n): ((assetInfo: AssetInfoLike) => string) | null => {\n if (!output.preserveModules) return null;\n\n const rootDir = resolvedConfig.root;\n\n const preserveModulesRootValue = output.preserveModulesRoot;\n let preserveModulesRootAbs: string | null = null;\n if (typeof preserveModulesRootValue === 'string') {\n preserveModulesRootAbs = path.isAbsolute(preserveModulesRootValue)\n ? preserveModulesRootValue\n : path.resolve(rootDir, preserveModulesRootValue);\n }\n\n const preserveModulesRootRel =\n preserveModulesRootAbs && isInside(preserveModulesRootAbs, rootDir)\n ? normalizeToPosix(path.relative(rootDir, preserveModulesRootAbs))\n : null;\n\n return (assetInfo) => {\n const template =\n typeof originalAssetFileNames === 'function'\n ? originalAssetFileNames(assetInfo)\n : originalAssetFileNames;\n\n const assetName = assetInfo?.name;\n if (typeof assetName !== 'string' || !isWywCssAssetName(assetName)) {\n return template;\n }\n\n if (!template.includes('[')) {\n return template;\n }\n\n let relativePath: string | null = null;\n\n const assetNameNormalized = normalizeToPosix(assetName);\n\n if (\n path.isAbsolute(assetName) ||\n isWindowsAbsolutePath(assetNameNormalized)\n ) {\n const preserveRel =\n preserveModulesRootAbs && isInside(assetName, preserveModulesRootAbs)\n ? path.relative(preserveModulesRootAbs, assetName)\n : null;\n\n if (\n preserveRel &&\n !path.isAbsolute(preserveRel) &&\n !preserveRel.startsWith('..')\n ) {\n relativePath = preserveRel;\n } else if (isInside(assetName, rootDir)) {\n relativePath = path.relative(rootDir, assetName);\n }\n } else if (\n preserveModulesRootRel &&\n assetNameNormalized.startsWith(`${preserveModulesRootRel}/`)\n ) {\n relativePath = assetNameNormalized.slice(\n preserveModulesRootRel.length + 1\n );\n } else {\n relativePath = assetNameNormalized;\n }\n\n const normalized = relativePath\n ? normalizeAssetRelativePath(relativePath)\n : null;\n if (!normalized) {\n return template;\n }\n\n const withoutExt = stripExtension(normalized);\n\n if (template.includes('[name]')) {\n const dir = path.posix.dirname(withoutExt);\n if (dir === '.' || dir === '') {\n return template;\n }\n\n return template.replace(/\\[name\\]/g, `${dir}/[name]`);\n }\n\n const dir = path.posix.dirname(withoutExt);\n if (dir === '.' || dir === '') {\n return template;\n }\n\n const idx = template.indexOf('[');\n if (idx < 0) {\n return template;\n }\n\n const prefix = template.slice(0, idx);\n if (prefix !== '' && !prefix.endsWith('/')) {\n return template;\n }\n\n return `${prefix}${dir}/${template.slice(idx)}`;\n };\n};\n\nexport default function wywInJS({\n debug,\n include,\n exclude,\n sourceMap,\n preserveCssPaths,\n keepComments,\n prefixer,\n preprocessor,\n ssrDevCss,\n ssrDevCssPath,\n transformLibraries,\n ...rest\n}: VitePluginOptions = {}): Plugin {\n const filter = createFilter(include, exclude);\n const cssLookup: { [key: string]: string } = {};\n const cssFileLookup: { [key: string]: string } = {};\n const pendingCssReloads = new Set<string>();\n let pendingCssReloadTimer: ReturnType<typeof setTimeout> | undefined;\n let ssrDevCssVersion = 0;\n let config: ResolvedConfig;\n let devServer: ViteDevServer;\n let importMetaEnvForEval: {\n client: Record<string, unknown>;\n ssr: Record<string, unknown>;\n } | null = null;\n\n const ssrDevCssEnabled = Boolean(ssrDevCss);\n const [ssrDevCssPathname, ssrDevCssQuery] = (\n ssrDevCssPath ?? '/_wyw-in-js/ssr.css'\n ).split('?', 2);\n const ssrDevCssRoute = ssrDevCssPathname.startsWith('/')\n ? ssrDevCssPathname\n : `/${ssrDevCssPathname}`;\n\n const getSsrDevCssHref = () => {\n const versionParam = `v=${ssrDevCssVersion}`;\n const query = ssrDevCssQuery\n ? `${ssrDevCssQuery}&${versionParam}`\n : versionParam;\n return `${ssrDevCssRoute}?${query}`;\n };\n\n const getSsrDevCssContents = () => {\n const entries = Object.entries(cssLookup);\n if (entries.length === 0) return '';\n\n const merged = entries\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([, cssText]) => cssText)\n .join('\\n');\n return `${merged}\\n`;\n };\n\n const { emitter, onDone } = createFileReporter(debug ?? false);\n\n const scheduleCssReload = (cssFilename: string) => {\n if (!devServer?.moduleGraph) return;\n\n pendingCssReloads.add(cssFilename);\n\n if (pendingCssReloadTimer) return;\n pendingCssReloadTimer = setTimeout(() => {\n pendingCssReloadTimer = undefined;\n\n const ids = Array.from(pendingCssReloads);\n pendingCssReloads.clear();\n\n for (const id of ids) {\n const module = devServer.moduleGraph.getModuleById(id);\n if (module) devServer.reloadModule(module);\n }\n }, 0);\n };\n\n // <dependency id, targets>\n const targets: { dependencies: string[]; id: string }[] = [];\n const cache = new TransformCacheCollection();\n\n type DepInfoLike = { file: string; processing?: Promise<void> };\n type DepsOptimizerLike = {\n init?: () => Promise<void>;\n isOptimizedDepFile?: (id: string) => boolean;\n metadata?: { depInfoList?: DepInfoLike[] };\n scanProcessing?: Promise<void>;\n };\n\n type ViteServerWithDepsOptimizer = ViteDevServer & {\n _depsOptimizer?: DepsOptimizerLike;\n depsOptimizer?: DepsOptimizerLike;\n environments?: Record<string, { depsOptimizer?: DepsOptimizerLike }>;\n };\n\n const isInsideCacheDir = (filename: string): boolean => {\n if (!config.cacheDir) {\n return false;\n }\n\n const relative = path.relative(config.cacheDir, filename);\n return (\n relative !== '' &&\n !relative.startsWith('..') &&\n !path.isAbsolute(relative)\n );\n };\n\n const getDepsOptimizer = (): DepsOptimizerLike | null => {\n if (!devServer) return null;\n\n const server = devServer as unknown as ViteServerWithDepsOptimizer;\n return (\n server.environments?.client?.depsOptimizer ??\n server.depsOptimizer ??\n server._depsOptimizer ??\n null\n );\n };\n\n const waitForOptimizedDep = async (filename: string): Promise<boolean> => {\n const depsOptimizer = getDepsOptimizer();\n if (!depsOptimizer?.isOptimizedDepFile?.(filename)) {\n return false;\n }\n\n await depsOptimizer.init?.();\n await depsOptimizer.scanProcessing;\n\n const info = depsOptimizer.metadata?.depInfoList?.find(\n (item) => item.file === filename\n );\n if (info?.processing) {\n await info.processing;\n }\n\n return true;\n };\n\n const createAsyncResolver = asyncResolverFactory(\n async (\n resolved: { external: boolean | 'absolute'; id: string } | null,\n what: string,\n importer: string,\n stack: string[]\n ): Promise<string | null> => {\n const log = logger.extend('vite').extend(getFileIdx(importer));\n\n if (resolved) {\n if (resolved.external) {\n // If module is marked as external, Rollup will not resolve it,\n // so we need to resolve it ourselves with default resolver\n const resolvedId = syncResolve(what, importer, stack);\n log(\"resolve ✅ '%s'@'%s -> %O\\n%s\", what, importer, resolved);\n return resolvedId;\n }\n\n log(\"resolve ✅ '%s'@'%s -> %O\\n%s\", what, importer, resolved);\n\n // Vite adds param like `?v=667939b3` to cached modules\n const resolvedId = resolved.id.split('?', 1)[0];\n\n if (resolvedId.startsWith('\\0')) {\n // \\0 is a special character in Rollup that tells Rollup to not include this in the bundle\n // https://rollupjs.org/guide/en/#outputexports\n return null;\n }\n\n if (resolvedId.startsWith('/@')) {\n return null;\n }\n\n if (!existsSync(resolvedId)) {\n // When Vite resolves to an optimized deps entry (cacheDir) it may not be written yet.\n // Wait for Vite's optimizer instead of calling optimizeDeps() manually (deprecated in Vite 7).\n try {\n await waitForOptimizedDep(resolvedId);\n } catch {\n // If optimizer failed, fall through to preserve previous behavior and surface the error.\n }\n\n // Vite can return an optimized deps entry (from cacheDir) before it's written to disk.\n // Manually calling optimizeDeps is deprecated in Vite 7 and can also get called many times.\n // Instead, fall back to resolving the original module path directly.\n if (!existsSync(resolvedId) && isInsideCacheDir(resolvedId)) {\n try {\n return syncResolve(what, importer, stack);\n } catch {\n // Fall through to preserve previous behavior: return resolvedId and let WyW surface the error.\n }\n }\n }\n\n return resolvedId;\n }\n\n log(\"resolve ❌ '%s'@'%s\", what, importer);\n throw new Error(`Could not resolve ${what}`);\n },\n (what, importer) => [what, importer]\n );\n\n return {\n name: 'wyw-in-js',\n enforce: 'post',\n buildEnd() {\n onDone(process.cwd());\n },\n configResolved(resolvedConfig: ResolvedConfig) {\n config = resolvedConfig;\n\n if (preserveCssPaths && config.command === 'build') {\n const outputs = config.build.rollupOptions.output;\n let outputEntries: unknown[] = [];\n if (Array.isArray(outputs)) {\n outputEntries = outputs;\n } else if (outputs) {\n outputEntries = [outputs];\n }\n\n outputEntries.forEach((entry) => {\n if (!entry || typeof entry !== 'object') return;\n\n const output = entry as RollupOutputLike;\n if (!output.preserveModules) return;\n\n const template: AssetFileNames =\n output.assetFileNames ??\n `${config.build.assetsDir ?? 'assets'}/[name].[hash].[ext]`;\n\n const assetFileNames = getWywCssAssetFileNames(\n config,\n output,\n template\n );\n if (assetFileNames) output.assetFileNames = assetFileNames;\n });\n }\n\n const envPrefix = config.envPrefix ?? 'VITE_';\n const envDir =\n // envDir is absolute in modern Vite, but keep a fallback for older versions\n 'envDir' in config && typeof config.envDir === 'string'\n ? config.envDir\n : config.root;\n\n const loaded = loadEnv(config.mode, envDir, envPrefix);\n const base = {\n ...loaded,\n BASE_URL: config.base,\n MODE: config.mode,\n DEV: config.command === 'serve',\n PROD: config.command === 'build',\n };\n\n importMetaEnvForEval = {\n client: { ...base, SSR: false },\n ssr: { ...base, SSR: true },\n };\n },\n configureServer(_server) {\n devServer = _server;\n\n if (!ssrDevCssEnabled || config.command !== 'serve') return;\n\n devServer.middlewares.use(\n (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const { url } = req;\n if (!url) {\n next();\n return;\n }\n\n const [pathname] = url.split('?', 1);\n if (pathname !== ssrDevCssRoute) {\n next();\n return;\n }\n\n const etag = `W/\"${ssrDevCssVersion}\"`;\n const ifNoneMatch = req.headers['if-none-match'];\n if (ifNoneMatch === etag) {\n res.statusCode = 304;\n res.end();\n return;\n }\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/css; charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('ETag', etag);\n res.end(getSsrDevCssContents());\n }\n );\n },\n transformIndexHtml(html) {\n if (!ssrDevCssEnabled || config.command !== 'serve') return undefined;\n\n return {\n html,\n tags: [\n {\n tag: 'link',\n attrs: { rel: 'stylesheet', href: getSsrDevCssHref() },\n injectTo: 'head-prepend',\n },\n ],\n };\n },\n load(url: string) {\n const [id] = url.split('?', 1);\n return cssLookup[id];\n },\n /* eslint-disable-next-line consistent-return */\n resolveId(importeeUrl: string) {\n const [id] = importeeUrl.split('?', 1);\n if (cssLookup[id]) return id;\n return cssFileLookup[id];\n },\n handleHotUpdate(ctx) {\n // it's module, so just transform it\n if (ctx.modules.length) return ctx.modules;\n\n // Select affected modules of changed dependency\n const affected = targets.filter(\n (x) =>\n // file is dependency of any target\n x.dependencies.some((dep) => dep === ctx.file) ||\n // or changed module is a dependency of any target\n x.dependencies.some((dep) => ctx.modules.some((m) => m.file === dep))\n );\n const deps = affected.flatMap((target) => target.dependencies);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const depId of deps) {\n cache.invalidateForFile(depId);\n }\n\n return affected\n .map((target) => devServer.moduleGraph.getModuleById(target.id))\n .concat(ctx.modules)\n .filter((m): m is ModuleNode => !!m);\n },\n async transform(\n code: string,\n url: string,\n transformOptions?: boolean | { ssr?: boolean }\n ) {\n const [id] = url.split('?', 1);\n\n // Do not transform ignored and generated files\n if (\n (!transformLibraries && url.includes('node_modules')) ||\n !filter(url) ||\n id in cssLookup\n )\n return;\n\n const log = logger.extend('vite').extend(getFileIdx(id));\n\n log('transform %s', id);\n\n const overrideContext: OverrideContext = (context, filename) => {\n const isSsr =\n typeof transformOptions === 'boolean'\n ? transformOptions\n : Boolean(transformOptions?.ssr);\n const env = importMetaEnvForEval?.[isSsr ? 'ssr' : 'client'];\n const withEnv = env\n ? { ...context, __wyw_import_meta_env: env }\n : context;\n\n return rest.overrideContext\n ? rest.overrideContext(withEnv, filename)\n : withEnv;\n };\n\n const transformServices = {\n options: {\n filename: id,\n root: process.cwd(),\n prefixer,\n keepComments,\n preprocessor,\n pluginOptions: {\n ...rest,\n overrideContext,\n },\n },\n cache,\n emitWarning: (message: string) => this.warn(message),\n eventEmitter: emitter,\n };\n\n const result = await transform(\n transformServices,\n code,\n createAsyncResolver(this.resolve)\n );\n\n let { cssText, dependencies } = result;\n\n // Heads up, there are three cases:\n // 1. cssText is undefined, it means that file was not transformed\n // 2. cssText is empty, it means that file was transformed, but it does not contain any styles\n // 3. cssText is not empty, it means that file was transformed and it contains styles\n\n if (typeof cssText === 'undefined') {\n return;\n }\n\n if (cssText === '') {\n /* eslint-disable-next-line consistent-return */\n return {\n code: result.code,\n map: result.sourceMap,\n };\n }\n\n dependencies ??= [];\n\n const cssFilename = path\n .normalize(`${id.replace(/\\.[jt]sx?$/, '')}.wyw-in-js.css`)\n .replace(/\\\\/g, path.posix.sep);\n\n const cssRelativePath = path\n .relative(config.root, cssFilename)\n .replace(/\\\\/g, path.posix.sep);\n\n const cssId = `/${cssRelativePath}`;\n\n if (sourceMap && result.cssSourceMapText) {\n const map = Buffer.from(result.cssSourceMapText).toString('base64');\n cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;\n }\n\n const didCssChange = cssLookup[cssFilename] !== cssText;\n cssLookup[cssFilename] = cssText;\n cssFileLookup[cssId] = cssFilename;\n\n result.code += `\\nimport ${JSON.stringify(cssFilename)};\\n`;\n\n for (let i = 0, end = dependencies.length; i < end; i++) {\n // eslint-disable-next-line no-await-in-loop\n const depModule = await this.resolve(dependencies[i], url, {\n isEntry: false,\n });\n if (depModule) dependencies[i] = depModule.id;\n }\n const target = targets.find((t) => t.id === id);\n if (!target) targets.push({ id, dependencies });\n else target.dependencies = dependencies;\n\n if (didCssChange) {\n scheduleCssReload(cssFilename);\n if (ssrDevCssEnabled && config.command === 'serve') {\n ssrDevCssVersion += 1;\n }\n }\n /* eslint-disable-next-line consistent-return */\n return { code: result.code, map: result.sourceMap };\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}