@jk2908/cxx 0.3.1 → 0.3.4

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
@@ -98,14 +98,11 @@ Use the Next integration when you want `cxx` transforms and generated class-key
98
98
 
99
99
  `watch.root` sets the tree used for type-regeneration watching. It defaults to the Vite root, and to the Turbopack root in Next (falling back to `process.cwd()`).
100
100
 
101
- `watch.ignore` adds extra globs on top of the built-in ignores (`node_modules`, `.next`, `.cxx`, `.git`). In Vite the globs are added to `server.watch.ignored`.
102
-
103
101
  ```ts
104
102
  export default withCxx(nextConfig, {
105
103
  typeSuffix: 'Classes',
106
104
  watch: {
107
105
  root: '../../',
108
- ignore: ['**/*.stories.tsx'],
109
106
  },
110
107
  })
111
108
  ```
package/dist/build.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import { type SourceMap } from 'magic-string';
2
- import type { BuildContext, PluginConfig, Tags } from './types.js';
2
+ import type { PluginConfig, Tags } from './types.js';
3
3
  /**
4
4
  * Returns whether the error was caused by a missing file or directory.
5
5
  */
6
6
  export declare function isENOENT(err: unknown): boolean;
7
7
  /**
8
- * Write a file only if the content actually differs from what is already on disk.
8
+ * Write a file only if the content differs from what is already on disk, so watchers are not woken
9
+ * by a needless mtime change.
9
10
  */
10
11
  export declare function maybeWrite(filePath: string, content: string): Promise<boolean>;
11
12
  export declare class DuplicateTagError extends Error {
@@ -27,20 +28,27 @@ export declare function collect(source: string, id: string, config: PluginConfig
27
28
  map: SourceMap | null;
28
29
  };
29
30
  /**
30
- * Write the generated declaration file for the current set of collected tags.
31
+ * Persist one file's tags to its own partial, then rebuild the shared types soon. Rebuilding is
32
+ * debounced and serialised, so a large build does not re-read every partial per file.
31
33
  */
32
- export declare function writeTypes(tags: Tags): Promise<void>;
34
+ export declare function writeTypesForFile(filePath: string, tags: Tags): Promise<void>;
33
35
  /**
34
- * Next-specific write path. Turbopack spreads loaders across worker processes, so each worker
35
- * persists its own per-file partial and rebuilds the shared declaration file from all of them.
36
+ * Rebuild `index.d.ts` from every partial.
36
37
  */
37
- export declare function writeTypesForFile(filePath: string, tags: Tags): Promise<void>;
38
+ export declare function flushTypes(): Promise<void>;
39
+ export declare const SOURCE_EXTENSIONS: Set<string>;
38
40
  /**
39
- * Render collected tags as a module augmentation for the package entrypoint.
41
+ * Read one file, collect its tags, and persist them. A file with no `cxx` usage has its partial
42
+ * removed, so stale tags drop out.
40
43
  */
41
- export declare function tagsToType(tags: Tags): string;
44
+ export declare function refreshFile(file: string, config: PluginConfig): Promise<void>;
42
45
  /**
43
- * Merge per-file tag maps into one application-wide tag map.
46
+ * Walk every source file under `root` and seed the type surface, so a fresh checkout (and a build
47
+ * with no edits) has types without waiting for a transform.
44
48
  */
45
- export declare function flattenTags(tagsByFile: BuildContext['tagsByFile']): Map<string, string[]>;
49
+ export declare function seedTypes(root: string, config: PluginConfig): Promise<void>;
50
+ /**
51
+ * Render collected tags as a module augmentation for the package entrypoint.
52
+ */
53
+ export declare function tagsToType(tags: Tags): string;
46
54
  //# sourceMappingURL=build.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAKA,OAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAiClE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,WAEpC;AA+BD;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAoBjE;AAiBD,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,IAAI,SAAsB;gBAEd,GAAG,EAAE,MAAM;CAGvB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACzC,IAAI,SAAoB;gBAEZ,GAAG,EAAE,MAAM;CAMvB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;YArH/D,MAAM;YACN,MAAM;cACJ,MAAM;UACV,IAAI;SACL,SAAS,GAAG,IAAI;EAmMrB;AAoCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,iBAEpC;AAuDD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,iBAiB7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,UAcpC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,yBAWjE"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAOA,OAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AA6BpD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,WAEpC;AAqCD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAUjE;AAiBD,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,IAAI,SAAsB;gBAEd,GAAG,EAAE,MAAM;CAGvB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACzC,IAAI,SAAoB;gBAEZ,GAAG,EAAE,MAAM;CAMvB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;YA5G/D,MAAM;YACN,MAAM;cACJ,MAAM;UACV,IAAI;SACL,SAAS,GAAG,IAAI;EAmMrB;AAsHD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,iBAmB7D;AAgBD;;GAEG;AACH,wBAAgB,UAAU,kBAgBzB;AAED,eAAO,MAAM,iBAAiB,aAA0C,CAAA;AA4BxE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,iBAanE;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,iBA4BjE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,UAepC"}
package/dist/build.js CHANGED
@@ -14,6 +14,86 @@ var PKG_NAME = `@jk2908/${NAME}`;
14
14
  var GENERATED_DIR = `.${NAME}`;
15
15
  var AUTOGEN_MSG = `// auto-generated by ${NAME}`;
16
16
 
17
+ // src/logger.ts
18
+ var LEVELS = {
19
+ debug: 0,
20
+ info: 1,
21
+ warn: 2,
22
+ error: 3,
23
+ fatal: 4
24
+ };
25
+ var defaultLevel = process.env["NODE_ENV"] === "production" ? "error" : "info";
26
+
27
+ class Logger {
28
+ name;
29
+ #level = defaultLevel;
30
+ constructor(name) {
31
+ this.name = name;
32
+ }
33
+ static toError(err) {
34
+ return err instanceof Error ? err : new Error(String(err), { cause: err });
35
+ }
36
+ static print(err) {
37
+ if (err instanceof Error) {
38
+ return err.message + (err.stack ? `
39
+ ${err.stack}` : "");
40
+ }
41
+ if (typeof err === "object" && err !== null) {
42
+ try {
43
+ return JSON.stringify(err, null, 2);
44
+ } catch {
45
+ return String(err);
46
+ }
47
+ }
48
+ return String(err);
49
+ }
50
+ set level(level) {
51
+ this.#level = level;
52
+ }
53
+ get level() {
54
+ return this.#level;
55
+ }
56
+ log(level, message, error) {
57
+ if (LEVELS[level] < LEVELS[this.level])
58
+ return;
59
+ const entry = {
60
+ ts: Date.now(),
61
+ level,
62
+ message
63
+ };
64
+ if (level === "error" || level === "fatal") {
65
+ entry.error = error ? Logger.toError(error) : new Error(message);
66
+ }
67
+ const line = `${this.name ? `[${this.name}]` : ""} [${entry.ts}] [${level.toUpperCase()}] ${message}`;
68
+ const extra = entry.error ? `
69
+ ${Logger.print(entry.error)}` : "";
70
+ if (level === "warn") {
71
+ console.warn(line, extra);
72
+ return;
73
+ }
74
+ if (level === "error" || level === "fatal") {
75
+ console.error(line, extra);
76
+ return;
77
+ }
78
+ console.log(line, extra);
79
+ }
80
+ debug(...messages) {
81
+ this.log("debug", messages.join(" "));
82
+ }
83
+ info(...messages) {
84
+ this.log("info", messages.join(" "));
85
+ }
86
+ warn(...messages) {
87
+ this.log("warn", messages.join(" "));
88
+ }
89
+ error(message, error) {
90
+ this.log("error", message, error === undefined ? undefined : Logger.toError(error));
91
+ }
92
+ fatal(message, error) {
93
+ this.log("fatal", message, error === undefined ? undefined : Logger.toError(error));
94
+ }
95
+ }
96
+
17
97
  // src/lru.ts
18
98
  var CACHE_MAX_SIZE = 100;
19
99
 
@@ -56,51 +136,12 @@ function capitalise(str) {
56
136
  function pascalise(str) {
57
137
  return str.split(/[ _-]+/).map(capitalise).join("");
58
138
  }
59
- function createBatcher(wait, flush) {
60
- const pending = new Map;
61
- let timer = null;
62
- let running = false;
63
- async function drain() {
64
- if (running)
65
- return;
66
- running = true;
67
- try {
68
- while (pending.size > 0) {
69
- const batch = new Map(pending);
70
- pending.clear();
71
- await flush(batch);
72
- }
73
- } finally {
74
- running = false;
75
- }
76
- }
77
- function schedule() {
78
- if (timer)
79
- clearTimeout(timer);
80
- timer = setTimeout(() => {
81
- timer = null;
82
- drain();
83
- }, wait);
84
- }
85
- return {
86
- add(key, value) {
87
- pending.set(key, value);
88
- schedule();
89
- },
90
- flush() {
91
- if (timer) {
92
- clearTimeout(timer);
93
- timer = null;
94
- }
95
- return drain();
96
- }
97
- };
98
- }
99
139
 
100
140
  // src/build.ts
141
+ var logger = new Logger(NAME);
101
142
  var decoder = new TextDecoder;
143
+ var encoder = new TextEncoder;
102
144
  var collectCache = new LruCache;
103
- var fileCache = new LruCache;
104
145
  var writeChain = Promise.resolve();
105
146
  function isENOENT(err) {
106
147
  return err instanceof Error && "code" in err && err.code === "ENOENT";
@@ -108,7 +149,12 @@ function isENOENT(err) {
108
149
  async function writeFileAtomic(filePath, content) {
109
150
  const tmp = `${filePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
110
151
  await fs.writeFile(tmp, content);
111
- await fs.rename(tmp, filePath);
152
+ try {
153
+ await fs.rename(tmp, filePath);
154
+ } catch (err) {
155
+ await fs.rm(tmp, { force: true });
156
+ throw err;
157
+ }
112
158
  }
113
159
  function enqueueWrite(task) {
114
160
  const run = writeChain.then(task, task);
@@ -120,20 +166,14 @@ function enqueueWrite(task) {
120
166
  return run;
121
167
  }
122
168
  async function maybeWrite(filePath, content) {
123
- const cached = fileCache.get(filePath);
124
- if (cached === content)
125
- return false;
126
169
  try {
127
- if (await fs.readFile(filePath, "utf-8") === content) {
128
- fileCache.set(filePath, content);
170
+ if (await fs.readFile(filePath, "utf-8") === content)
129
171
  return false;
130
- }
131
172
  } catch (err) {
132
173
  if (!isENOENT(err))
133
174
  throw err;
134
175
  }
135
176
  await writeFileAtomic(filePath, content);
136
- fileCache.set(filePath, content);
137
177
  return true;
138
178
  }
139
179
  var regex = /((?:export\s+)?)(?:const|var|let)\s*\[(\w*)\s*,?\s*(\w*)\s*,?\s*(\w*)\s*\]\s*=\s*cxx(?:\s*`([\s\S]*?)`|\s*\.\s*tag(?:\s*<[^>]+>)?\s*\(\s*(['"])(.*?)\6\s*\)\s*`([\s\S]*?)`)/gm;
@@ -169,14 +209,23 @@ function collect(source, id, config) {
169
209
  matched = true;
170
210
  const [, exp, varOne, varTwo, varThree, plainCss, , tag, taggedCss] = match;
171
211
  const css = plainCss ?? taggedCss;
172
- const { code, exports = {} } = transform({
173
- minify: true,
174
- cssModules: true,
175
- filename: id,
176
- code: new TextEncoder().encode(css)
177
- });
212
+ const matchIndex = match.index;
213
+ const { code, exports: classExports = {} } = (() => {
214
+ try {
215
+ return transform({
216
+ minify: true,
217
+ cssModules: true,
218
+ filename: id,
219
+ code: encoder.encode(css)
220
+ });
221
+ } catch (err) {
222
+ const line = source.slice(0, matchIndex).split(`
223
+ `).length;
224
+ throw new Error(`Failed to compile cxx CSS at ${id}:${line}`, { cause: err });
225
+ }
226
+ })();
178
227
  const href = hashCss(code);
179
- const styles = Object.fromEntries(Object.entries(exports).map(([k, v]) => [k, v.name]));
228
+ const styles = Object.fromEntries(Object.entries(classExports).map(([k, v]) => [k, v.name]));
180
229
  if (tag) {
181
230
  const suffix = typeof config.typeSuffix === "string" ? config.typeSuffix : config.typeSuffix === false ? "" : "Classes";
182
231
  const tagWithSuffix = pascalise(`${tag}${suffix}`);
@@ -196,7 +245,7 @@ function collect(source, id, config) {
196
245
  if (varThree) {
197
246
  statements.push(`${exp}const ${varThree} = ${JSON.stringify(href)}`);
198
247
  }
199
- magic.overwrite(match.index, match.index + match[0].length, statements.join(`
248
+ magic.overwrite(matchIndex, matchIndex + match[0].length, statements.join(`
200
249
  `));
201
250
  }
202
251
  const template = magic.toString();
@@ -222,16 +271,14 @@ async function writeRenderedTypes(tags) {
222
271
  const filePath = path.join(GENERATED_DIR, "index.d.ts");
223
272
  if (!tags.size) {
224
273
  await fs.rm(filePath, { force: true });
225
- fileCache.delete(filePath);
226
274
  return;
227
275
  }
228
276
  await fs.mkdir(GENERATED_DIR, { recursive: true });
229
277
  await maybeWrite(filePath, renderTypes(tags));
230
278
  }
231
- function writeTypes(tags) {
232
- return enqueueWrite(() => writeRenderedTypes(tags));
233
- }
234
279
  var PARTIAL_DIR = path.join(GENERATED_DIR, "tags");
280
+ var REBUILD_WAIT = 100;
281
+ var rebuildTimer = null;
235
282
  function partialPath(filePath) {
236
283
  return path.join(PARTIAL_DIR, `${createHash("sha1").update(filePath).digest("hex")}.json`);
237
284
  }
@@ -241,10 +288,12 @@ async function readPartials() {
241
288
  entries = await fs.readdir(PARTIAL_DIR);
242
289
  } catch (err) {
243
290
  if (isENOENT(err))
244
- return new Map;
291
+ return { tags: new Map, duplicates: [] };
245
292
  throw err;
246
293
  }
247
294
  const tags = new Map;
295
+ const fileByTag = new Map;
296
+ const duplicates = [];
248
297
  for (const entry of entries) {
249
298
  if (!entry.endsWith(".json"))
250
299
  continue;
@@ -255,19 +304,28 @@ async function readPartials() {
255
304
  } catch {
256
305
  continue;
257
306
  }
307
+ let source;
258
308
  try {
259
- await fs.access(parsed.file);
309
+ source = await fs.readFile(parsed.file, "utf-8");
260
310
  } catch {
261
311
  await fs.rm(partial, { force: true });
262
312
  continue;
263
313
  }
314
+ if (!source.includes("cxx")) {
315
+ await fs.rm(partial, { force: true });
316
+ continue;
317
+ }
264
318
  for (const [name, classes] of Object.entries(parsed.tags)) {
265
- if (tags.has(name))
266
- throw new DuplicateTagError(name);
319
+ const existing = fileByTag.get(name);
320
+ if (existing) {
321
+ duplicates.push({ tag: name, files: [existing, parsed.file] });
322
+ continue;
323
+ }
324
+ fileByTag.set(name, parsed.file);
267
325
  tags.set(name, classes);
268
326
  }
269
327
  }
270
- return tags;
328
+ return { tags, duplicates };
271
329
  }
272
330
  function writeTypesForFile(filePath, tags) {
273
331
  return enqueueWrite(async () => {
@@ -278,37 +336,101 @@ function writeTypesForFile(filePath, tags) {
278
336
  } else {
279
337
  await writeFileAtomic(partial, JSON.stringify({ file: filePath, tags: Object.fromEntries(tags) }));
280
338
  }
281
- await writeRenderedTypes(await readPartials());
339
+ }).then(() => scheduleRebuild()).catch((err) => {
340
+ logger.error(`failed to write types for ${filePath}`, err);
282
341
  });
283
342
  }
343
+ function scheduleRebuild() {
344
+ if (rebuildTimer)
345
+ clearTimeout(rebuildTimer);
346
+ rebuildTimer = setTimeout(() => {
347
+ rebuildTimer = null;
348
+ flushTypes().catch((err) => {
349
+ logger.error("failed to generate types", err);
350
+ });
351
+ }, REBUILD_WAIT);
352
+ }
353
+ function flushTypes() {
354
+ if (rebuildTimer) {
355
+ clearTimeout(rebuildTimer);
356
+ rebuildTimer = null;
357
+ }
358
+ return enqueueWrite(async () => {
359
+ const { tags, duplicates } = await readPartials();
360
+ await writeRenderedTypes(tags);
361
+ for (const duplicate of duplicates) {
362
+ logger.error(`Tag "${duplicate.tag}" is defined in multiple files: ${duplicate.files.join(", ")}`);
363
+ }
364
+ });
365
+ }
366
+ var SOURCE_EXTENSIONS = new Set([".js", ".jsx", ".ts", ".tsx"]);
367
+ var SKIP_DIRS = new Set(["node_modules", "dist", "build", "coverage", "out"]);
368
+ async function runWithConcurrency(items, concurrency, fn) {
369
+ let cursor = 0;
370
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
371
+ while (cursor < items.length) {
372
+ const index = cursor++;
373
+ await fn(items[index]);
374
+ }
375
+ });
376
+ await Promise.all(workers);
377
+ }
378
+ async function refreshFile(file, config) {
379
+ let source;
380
+ try {
381
+ source = await fs.readFile(file, "utf-8");
382
+ } catch (err) {
383
+ if (!isENOENT(err))
384
+ throw err;
385
+ await writeTypesForFile(file, new Map);
386
+ return;
387
+ }
388
+ const tags = source.includes("cxx") ? collect(source, file, config).tags : new Map;
389
+ await writeTypesForFile(file, tags);
390
+ }
391
+ async function seedTypes(root, config) {
392
+ async function scan(dir) {
393
+ let entries;
394
+ try {
395
+ entries = await fs.readdir(dir, { withFileTypes: true });
396
+ } catch {
397
+ return;
398
+ }
399
+ await runWithConcurrency(entries, 8, async (entry) => {
400
+ if (entry.name.startsWith(".") || SKIP_DIRS.has(entry.name))
401
+ return;
402
+ const full = path.join(dir, entry.name);
403
+ if (entry.isDirectory()) {
404
+ await scan(full);
405
+ return;
406
+ }
407
+ if (!SOURCE_EXTENSIONS.has(path.extname(entry.name)))
408
+ return;
409
+ await refreshFile(full, config);
410
+ });
411
+ }
412
+ await scan(root);
413
+ await flushTypes();
414
+ }
284
415
  function tagsToType(tags) {
285
- return [...tags].map(([tag, classes]) => {
416
+ return [...tags].toSorted(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([tag, classes]) => {
286
417
  const union = classes.length > 0 ? classes.toSorted((a, b) => a.length - b.length).map((c) => `'${c}'`).join(" | ") : "never";
287
418
  return ` export type ${tag} = ${union}`;
288
419
  }).join(`
289
420
  `);
290
421
  }
291
- function flattenTags(tagsByFile) {
292
- const tags = new Map;
293
- for (const fileTags of tagsByFile.values()) {
294
- for (const [name, classes] of fileTags) {
295
- if (tags.has(name))
296
- throw new DuplicateTagError(name);
297
- tags.set(name, classes);
298
- }
299
- }
300
- return tags;
301
- }
302
422
  export {
303
423
  DuplicateTagError,
304
424
  InvalidTagError,
425
+ SOURCE_EXTENSIONS,
305
426
  collect,
306
- flattenTags,
427
+ flushTypes,
307
428
  isENOENT,
308
429
  maybeWrite,
430
+ refreshFile,
431
+ seedTypes,
309
432
  tagsToType,
310
- writeTypes,
311
433
  writeTypesForFile
312
434
  };
313
435
 
314
- //# debugId=9492B787092F945A64756E2164756E21
436
+ //# debugId=8D46F05C41A9643264756E2164756E21
package/dist/build.js.map CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/build.ts", "../src/config.ts", "../src/lru.ts", "../src/utils.ts"],
3
+ "sources": ["../src/build.ts", "../src/config.ts", "../src/logger.ts", "../src/lru.ts", "../src/utils.ts"],
4
4
  "sourcesContent": [
5
- "import { createHash } from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { transform } from 'lightningcss'\nimport MagicString, { type SourceMap } from 'magic-string'\n\nimport type { BuildContext, PluginConfig, Tags } from './types.js'\nimport { AUTOGEN_MSG, GENERATED_DIR, PKG_NAME } from './config.js'\nimport { LruCache } from './lru.js'\nimport { pascalise } from './utils.js'\n\n// decode bytes to a string, then stringify into a safe literal. `${bytes}` only\n// works by accident for Buffer; a plain Uint8Array stringifies as `97,123,125`\nconst decoder = new TextDecoder()\n\n/**\n * LRU cache of `collect` results by file id + last seen source + config so watcher and transform\n * can reuse the same parsed template/tags.\n */\nconst collectCache = new LruCache<{\n\tsource: string\n\tconfig: string\n\ttemplate: string\n\ttags: Tags\n\tmap: SourceMap | null\n}>()\n\n/**\n * LRU cache for file content. Stores the last written content per file path so `maybeWrite`\n * can skip disk i/o when nothing has changed.\n */\nconst fileCache = new LruCache<string>()\n\n/**\n * Serialises type file writes inside a single process so overlapping `writeTypes` calls can't\n * interleave or land out of order.\n */\nlet writeChain: Promise<void> = Promise.resolve()\n\n/**\n * Returns whether the error was caused by a missing file or directory.\n */\nexport function isENOENT(err: unknown) {\n\treturn err instanceof Error && 'code' in err && err.code === 'ENOENT'\n}\n\n/**\n * Write a file by first writing to a unique temporary file and then renaming it into place, so\n * concurrent writers (e.g. Turbopack loader workers) never observe a partial file.\n */\nasync function writeFileAtomic(filePath: string, content: string) {\n\tconst tmp = `${filePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`\n\n\tawait fs.writeFile(tmp, content)\n\tawait fs.rename(tmp, filePath)\n}\n\n/**\n * Run a write task after all previously queued writes have settled. A rejection doesn't break the\n * chain for later tasks.\n */\nfunction enqueueWrite<T>(task: () => Promise<T>) {\n\t// wait for the previous write to finish, then run this one, even if the previous one failed\n\tconst run = writeChain.then(task, task)\n\n\t// move the queue on to this write, but turn either outcome into success so it never rejects\n\twriteChain = run.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t)\n\n\t// return the real promise, so the caller still sees this write's value or error\n\treturn run\n}\n\n/**\n * Write a file only if the content actually differs from what is already on disk.\n */\nexport async function maybeWrite(filePath: string, content: string) {\n\tconst cached = fileCache.get(filePath)\n\t// fast path: already wrote this exact content in this process\n\tif (cached === content) return false\n\n\t// verify against disk on a cold start (or when the cache is stale) so we\n\t// don't needlessly bump the mtime and invalidate downstream watchers\n\ttry {\n\t\tif ((await fs.readFile(filePath, 'utf-8')) === content) {\n\t\t\tfileCache.set(filePath, content)\n\t\t\treturn false\n\t\t}\n\t} catch (err) {\n\t\tif (!isENOENT(err)) throw err\n\t}\n\n\tawait writeFileAtomic(filePath, content)\n\tfileCache.set(filePath, content)\n\n\treturn true\n}\n\n// matches `[css, classes, href] = cxx\\`...\\`` and `cxx.tag<T>('name')\\`...\\``\n// capture groups: 1 optional `export `, 2-4 assigned variable names, 5 plain\n// css body, 6 quote kind, 7 tag name, 8 tagged css body\nconst regex =\n\t/((?:export\\s+)?)(?:const|var|let)\\s*\\[(\\w*)\\s*,?\\s*(\\w*)\\s*,?\\s*(\\w*)\\s*\\]\\s*=\\s*cxx(?:\\s*`([\\s\\S]*?)`|\\s*\\.\\s*tag(?:\\s*<[^>]+>)?\\s*\\(\\s*(['\"])(.*?)\\6\\s*\\)\\s*`([\\s\\S]*?)`)/gm\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/\n\n/**\n * Hash transformed CSS into a stable href for style deduplication.\n */\nfunction hashCss(code: Uint8Array) {\n\treturn `cxx-${createHash('sha256').update(code).digest('base64url').slice(0, 12)}`\n}\n\nexport class DuplicateTagError extends Error {\n\tname = 'DuplicateTagError'\n\n\tconstructor(tag: string) {\n\t\tsuper(`Tag ${tag} has already been seen. Tags must be unique across your application`)\n\t}\n}\n\nexport class InvalidTagError extends Error {\n\tname = 'InvalidTagError'\n\n\tconstructor(tag: string) {\n\t\tsuper(\n\t\t\t`Tag \"${tag}\" does not map to a valid TypeScript identifier. ` +\n\t\t\t\t`Use letters, numbers, spaces, \"_\" or \"-\"`,\n\t\t)\n\t}\n}\n\n/**\n * Transform `cxx` templates in one source file and collect any exported tag types.\n */\nexport function collect(source: string, id: string, config: PluginConfig) {\n\tconst configKey = JSON.stringify(config)\n\n\t// reuse the last result when the source and config are unchanged\n\tconst cached = collectCache.get(id)\n\tif (cached?.source === source && cached.config === configKey) return cached\n\n\tconst tags: Tags = new Map()\n\tconst magic = new MagicString(source)\n\tlet matched = false\n\n\t// the regex is global, so reset its cursor before scanning\n\tregex.lastIndex = 0\n\n\tlet match: RegExpExecArray | null\n\n\t// walk every cxx template and replace it in place\n\twhile ((match = regex.exec(source))) {\n\t\tmatched = true\n\n\t\t// capture groups: export, three bindings, plain css, (quote), tag, tagged css\n\t\tconst [, exp, varOne, varTwo, varThree, plainCss, , tag, taggedCss] = match\n\t\tconst css = plainCss ?? taggedCss\n\n\t\t// compile the CSS to minified CSS Modules\n\t\tconst { code, exports = {} } = transform({\n\t\t\tminify: true,\n\t\t\tcssModules: true,\n\t\t\tfilename: id,\n\t\t\tcode: new TextEncoder().encode(css),\n\t\t})\n\n\t\tconst href = hashCss(code)\n\t\t// map each class name to its generated (scoped) name\n\t\tconst styles = Object.fromEntries(\n\t\t\tObject.entries(exports).map(([k, v]) => [k, v.name]),\n\t\t)\n\n\t\tif (tag) {\n\t\t\tconst suffix =\n\t\t\t\ttypeof config.typeSuffix === 'string'\n\t\t\t\t\t? config.typeSuffix\n\t\t\t\t\t: config.typeSuffix === false\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: 'Classes'\n\t\t\tconst tagWithSuffix = pascalise(`${tag}${suffix}`)\n\n\t\t\tif (!IDENTIFIER.test(tagWithSuffix)) throw new InvalidTagError(tag)\n\t\t\tif (tags.has(tagWithSuffix)) throw new DuplicateTagError(tagWithSuffix)\n\n\t\t\t// side effect but necessary\n\t\t\ttags.set(tagWithSuffix, Object.keys(styles))\n\t\t}\n\n\t\tconst statements: string[] = []\n\n\t\tif (varOne) {\n\t\t\tstatements.push(`${exp}const ${varOne} = ${JSON.stringify(decoder.decode(code))}`)\n\t\t}\n\n\t\tif (varTwo) {\n\t\t\tstatements.push(`${exp}const ${varTwo} = ${JSON.stringify(styles)}`)\n\t\t}\n\n\t\tif (varThree) {\n\t\t\tstatements.push(`${exp}const ${varThree} = ${JSON.stringify(href)}`)\n\t\t}\n\n\t\t// swap the template for the generated declarations, keeping the export keyword\n\t\tmagic.overwrite(match.index, match.index + match[0].length, statements.join('\\n'))\n\t}\n\n\tconst template = magic.toString()\n\t// only build a map when something was actually rewritten\n\tconst map = matched\n\t\t? magic.generateMap({ source: id, includeContent: true, hires: true })\n\t\t: null\n\tconst result = { source, config: configKey, template, tags, map }\n\n\tcollectCache.set(id, result)\n\n\treturn result\n}\n\n/**\n * Render the generated declaration file contents for a set of collected tags.\n */\nfunction renderTypes(tags: Tags) {\n\treturn [\n\t\tAUTOGEN_MSG,\n\t\t'',\n\t\t`import '${PKG_NAME}'`,\n\t\t'',\n\t\t`declare module '${PKG_NAME}' {`,\n\t\ttagsToType(tags),\n\t\t'}',\n\t\t'',\n\t].join('\\n')\n}\n\n/**\n * Write (or remove) the generated `index.d.ts` for a full tag surface.\n */\nasync function writeRenderedTypes(tags: Tags) {\n\tconst filePath = path.join(GENERATED_DIR, 'index.d.ts')\n\n\tif (!tags.size) {\n\t\t// `force` makes this a no-op when the file is already absent\n\t\tawait fs.rm(filePath, { force: true })\n\t\tfileCache.delete(filePath)\n\n\t\treturn\n\t}\n\n\tawait fs.mkdir(GENERATED_DIR, { recursive: true })\n\tawait maybeWrite(filePath, renderTypes(tags))\n}\n\n/**\n * Write the generated declaration file for the current set of collected tags.\n */\nexport function writeTypes(tags: Tags) {\n\treturn enqueueWrite(() => writeRenderedTypes(tags))\n}\n\nconst PARTIAL_DIR = path.join(GENERATED_DIR, 'tags')\n\nfunction partialPath(filePath: string) {\n\treturn path.join(\n\t\tPARTIAL_DIR,\n\t\t`${createHash('sha1').update(filePath).digest('hex')}.json`,\n\t)\n}\n\n/**\n * Read every per-file partial written by the Next loader workers and merge them into one tag map.\n * Partials whose source file no longer exists are pruned so deleted files drop out of the types.\n */\nasync function readPartials() {\n\tlet entries: string[]\n\n\ttry {\n\t\tentries = await fs.readdir(PARTIAL_DIR)\n\t} catch (err) {\n\t\tif (isENOENT(err)) return new Map()\n\t\tthrow err\n\t}\n\n\tconst tags: Tags = new Map()\n\n\tfor (const entry of entries) {\n\t\tif (!entry.endsWith('.json')) continue\n\n\t\tconst partial = path.join(PARTIAL_DIR, entry)\n\t\tlet parsed: { file: string; tags: Record<string, string[]> }\n\n\t\ttry {\n\t\t\tparsed = JSON.parse(await fs.readFile(partial, 'utf-8'))\n\t\t} catch {\n\t\t\tcontinue\n\t\t}\n\n\t\ttry {\n\t\t\tawait fs.access(parsed.file)\n\t\t} catch {\n\t\t\tawait fs.rm(partial, { force: true })\n\t\t\tcontinue\n\t\t}\n\n\t\tfor (const [name, classes] of Object.entries(parsed.tags)) {\n\t\t\tif (tags.has(name)) throw new DuplicateTagError(name)\n\t\t\ttags.set(name, classes)\n\t\t}\n\t}\n\n\treturn tags\n}\n\n/**\n * Next-specific write path. Turbopack spreads loaders across worker processes, so each worker\n * persists its own per-file partial and rebuilds the shared declaration file from all of them.\n */\nexport function writeTypesForFile(filePath: string, tags: Tags) {\n\treturn enqueueWrite(async () => {\n\t\tawait fs.mkdir(PARTIAL_DIR, { recursive: true })\n\n\t\tconst partial = partialPath(filePath)\n\n\t\tif (!tags.size) {\n\t\t\tawait fs.rm(partial, { force: true })\n\t\t} else {\n\t\t\tawait writeFileAtomic(\n\t\t\t\tpartial,\n\t\t\t\tJSON.stringify({ file: filePath, tags: Object.fromEntries(tags) }),\n\t\t\t)\n\t\t}\n\n\t\tawait writeRenderedTypes(await readPartials())\n\t})\n}\n\n/**\n * Render collected tags as a module augmentation for the package entrypoint.\n */\nexport function tagsToType(tags: Tags) {\n\treturn [...tags]\n\t\t.map(([tag, classes]) => {\n\t\t\tconst union =\n\t\t\t\tclasses.length > 0\n\t\t\t\t\t? classes\n\t\t\t\t\t\t\t.toSorted((a, b) => a.length - b.length)\n\t\t\t\t\t\t\t.map(c => `'${c}'`)\n\t\t\t\t\t\t\t.join(' | ')\n\t\t\t\t\t: 'never'\n\n\t\t\treturn `\\texport type ${tag} = ${union}`\n\t\t})\n\t\t.join('\\n')\n}\n\n/**\n * Merge per-file tag maps into one application-wide tag map.\n */\nexport function flattenTags(tagsByFile: BuildContext['tagsByFile']) {\n\tconst tags = new Map<string, string[]>()\n\n\tfor (const fileTags of tagsByFile.values()) {\n\t\tfor (const [name, classes] of fileTags) {\n\t\t\tif (tags.has(name)) throw new DuplicateTagError(name)\n\t\t\ttags.set(name, classes)\n\t\t}\n\t}\n\n\treturn tags\n}\n",
5
+ "import type { Dirent } from 'node:fs'\n\nimport { createHash } from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { transform } from 'lightningcss'\nimport MagicString, { type SourceMap } from 'magic-string'\n\nimport type { PluginConfig, Tags } from './types.js'\nimport { AUTOGEN_MSG, GENERATED_DIR, NAME, PKG_NAME } from './config.js'\nimport { Logger } from './logger.js'\nimport { LruCache } from './lru.js'\nimport { pascalise } from './utils.js'\n\nconst logger = new Logger(NAME)\n\nconst decoder = new TextDecoder()\nconst encoder = new TextEncoder()\n\n/**\n * LRU cache of `collect` results by file id + last seen source + config so watcher and transform\n * can reuse the same parsed template/tags.\n */\nconst collectCache = new LruCache<{\n\tsource: string\n\tconfig: string\n\ttemplate: string\n\ttags: Tags\n\tmap: SourceMap | null\n}>()\n\n/**\n * Serialises type file writes inside a single process so overlapping writes can't interleave or\n * land out of order.\n */\nlet writeChain: Promise<void> = Promise.resolve()\n\n/**\n * Returns whether the error was caused by a missing file or directory.\n */\nexport function isENOENT(err: unknown) {\n\treturn err instanceof Error && 'code' in err && err.code === 'ENOENT'\n}\n\n/**\n * Write a file by writing to a unique temporary file and renaming it into place, so concurrent\n * writers never observe a partial file. The temp file is cleaned up if the rename fails.\n */\nasync function writeFileAtomic(filePath: string, content: string) {\n\tconst tmp = `${filePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`\n\n\tawait fs.writeFile(tmp, content)\n\n\ttry {\n\t\tawait fs.rename(tmp, filePath)\n\t} catch (err) {\n\t\tawait fs.rm(tmp, { force: true })\n\t\tthrow err\n\t}\n}\n\n/**\n * Run a write task after all previously queued writes have settled. A rejection doesn't break the\n * chain for later tasks.\n */\nfunction enqueueWrite<T>(task: () => Promise<T>) {\n\t// wait for the previous write to finish, then run this one, even if the previous one failed\n\tconst run = writeChain.then(task, task)\n\n\t// move the queue on to this write, but turn either outcome into success so it never rejects\n\twriteChain = run.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t)\n\n\t// return the real promise, so the caller still sees this write's value or error\n\treturn run\n}\n\n/**\n * Write a file only if the content differs from what is already on disk, so watchers are not woken\n * by a needless mtime change.\n */\nexport async function maybeWrite(filePath: string, content: string) {\n\ttry {\n\t\tif ((await fs.readFile(filePath, 'utf-8')) === content) return false\n\t} catch (err) {\n\t\tif (!isENOENT(err)) throw err\n\t}\n\n\tawait writeFileAtomic(filePath, content)\n\n\treturn true\n}\n\n// matches `[css, classes, href] = cxx\\`...\\`` and `cxx.tag<T>('name')\\`...\\``\n// capture groups: 1 optional `export `, 2-4 assigned variable names, 5 plain\n// css body, 6 quote kind, 7 tag name, 8 tagged css body\nconst regex =\n\t/((?:export\\s+)?)(?:const|var|let)\\s*\\[(\\w*)\\s*,?\\s*(\\w*)\\s*,?\\s*(\\w*)\\s*\\]\\s*=\\s*cxx(?:\\s*`([\\s\\S]*?)`|\\s*\\.\\s*tag(?:\\s*<[^>]+>)?\\s*\\(\\s*(['\"])(.*?)\\6\\s*\\)\\s*`([\\s\\S]*?)`)/gm\n\nconst IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/\n\n/**\n * Hash transformed CSS into a stable href for style deduplication.\n */\nfunction hashCss(code: Uint8Array) {\n\treturn `cxx-${createHash('sha256').update(code).digest('base64url').slice(0, 12)}`\n}\n\nexport class DuplicateTagError extends Error {\n\tname = 'DuplicateTagError'\n\n\tconstructor(tag: string) {\n\t\tsuper(`Tag ${tag} has already been seen. Tags must be unique across your application`)\n\t}\n}\n\nexport class InvalidTagError extends Error {\n\tname = 'InvalidTagError'\n\n\tconstructor(tag: string) {\n\t\tsuper(\n\t\t\t`Tag \"${tag}\" does not map to a valid TypeScript identifier. ` +\n\t\t\t\t`Use letters, numbers, spaces, \"_\" or \"-\"`,\n\t\t)\n\t}\n}\n\n/**\n * Transform `cxx` templates in one source file and collect any exported tag types.\n */\nexport function collect(source: string, id: string, config: PluginConfig) {\n\tconst configKey = JSON.stringify(config)\n\n\t// reuse the last result when the source and config are unchanged\n\tconst cached = collectCache.get(id)\n\tif (cached?.source === source && cached.config === configKey) return cached\n\n\tconst tags: Tags = new Map()\n\tconst magic = new MagicString(source)\n\n\tlet matched = false\n\n\t// the regex is global, so reset its cursor before scanning\n\tregex.lastIndex = 0\n\n\tlet match: RegExpExecArray | null\n\n\t// walk every cxx template and replace it in place\n\twhile ((match = regex.exec(source))) {\n\t\tmatched = true\n\n\t\t// capture groups: export, three bindings, plain css, (quote), tag, tagged css\n\t\tconst [, exp, varOne, varTwo, varThree, plainCss, , tag, taggedCss] = match\n\t\tconst css = plainCss ?? taggedCss\n\t\tconst matchIndex = match.index\n\n\t\t// compile the CSS to minified CSS Modules, reporting the source line on failure\n\t\tconst { code, exports: classExports = {} } = (() => {\n\t\t\ttry {\n\t\t\t\treturn transform({\n\t\t\t\t\tminify: true,\n\t\t\t\t\tcssModules: true,\n\t\t\t\t\tfilename: id,\n\t\t\t\t\tcode: encoder.encode(css),\n\t\t\t\t})\n\t\t\t} catch (err) {\n\t\t\t\tconst line = source.slice(0, matchIndex).split('\\n').length\n\t\t\t\tthrow new Error(`Failed to compile cxx CSS at ${id}:${line}`, { cause: err })\n\t\t\t}\n\t\t})()\n\n\t\tconst href = hashCss(code)\n\t\t// map each class name to its generated (scoped) name\n\t\tconst styles = Object.fromEntries(\n\t\t\tObject.entries(classExports).map(([k, v]) => [k, v.name]),\n\t\t)\n\n\t\tif (tag) {\n\t\t\tconst suffix =\n\t\t\t\ttypeof config.typeSuffix === 'string'\n\t\t\t\t\t? config.typeSuffix\n\t\t\t\t\t: config.typeSuffix === false\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: 'Classes'\n\t\t\tconst tagWithSuffix = pascalise(`${tag}${suffix}`)\n\n\t\t\tif (!IDENTIFIER.test(tagWithSuffix)) throw new InvalidTagError(tag)\n\t\t\tif (tags.has(tagWithSuffix)) throw new DuplicateTagError(tagWithSuffix)\n\n\t\t\t// side effect but necessary\n\t\t\ttags.set(tagWithSuffix, Object.keys(styles))\n\t\t}\n\n\t\tconst statements: string[] = []\n\n\t\tif (varOne) {\n\t\t\tstatements.push(`${exp}const ${varOne} = ${JSON.stringify(decoder.decode(code))}`)\n\t\t}\n\n\t\tif (varTwo) {\n\t\t\tstatements.push(`${exp}const ${varTwo} = ${JSON.stringify(styles)}`)\n\t\t}\n\n\t\tif (varThree) {\n\t\t\tstatements.push(`${exp}const ${varThree} = ${JSON.stringify(href)}`)\n\t\t}\n\n\t\t// swap the template for the generated declarations, keeping the export keyword\n\t\tmagic.overwrite(matchIndex, matchIndex + match[0].length, statements.join('\\n'))\n\t}\n\n\tconst template = magic.toString()\n\t// only build a map when something was actually rewritten\n\tconst map = matched\n\t\t? magic.generateMap({ source: id, includeContent: true, hires: true })\n\t\t: null\n\tconst result = { source, config: configKey, template, tags, map }\n\n\tcollectCache.set(id, result)\n\n\treturn result\n}\n\n/**\n * Render the generated declaration file contents for a set of collected tags.\n */\nfunction renderTypes(tags: Tags) {\n\treturn [\n\t\tAUTOGEN_MSG,\n\t\t'',\n\t\t`import '${PKG_NAME}'`,\n\t\t'',\n\t\t`declare module '${PKG_NAME}' {`,\n\t\ttagsToType(tags),\n\t\t'}',\n\t\t'',\n\t].join('\\n')\n}\n\n/**\n * Write (or remove) the generated `index.d.ts` for a full tag surface.\n */\nasync function writeRenderedTypes(tags: Tags) {\n\tconst filePath = path.join(GENERATED_DIR, 'index.d.ts')\n\n\tif (!tags.size) {\n\t\tawait fs.rm(filePath, { force: true })\n\t\treturn\n\t}\n\n\tawait fs.mkdir(GENERATED_DIR, { recursive: true })\n\tawait maybeWrite(filePath, renderTypes(tags))\n}\n\nconst PARTIAL_DIR = path.join(GENERATED_DIR, 'tags')\n\n// wait this long after the last file before rebuilding, so a burst of files\n// only re-reads the partials once\nconst REBUILD_WAIT = 100\n\nlet rebuildTimer: ReturnType<typeof setTimeout> | null = null\n\n/**\n * Map a source file to its partial file, named by a hash of the absolute path so each file has\n * exactly one partial.\n */\nfunction partialPath(filePath: string) {\n\treturn path.join(\n\t\tPARTIAL_DIR,\n\t\t`${createHash('sha1').update(filePath).digest('hex')}.json`,\n\t)\n}\n\ntype DuplicateTag = {\n\ttag: string\n\tfiles: string[]\n}\n\n/**\n * Read every per-file partial and merge them into one tag map. Partials whose source file no\n * longer exists are pruned, and duplicate tag names are reported with the files that define them.\n */\nasync function readPartials(): Promise<{ tags: Tags; duplicates: DuplicateTag[] }> {\n\tlet entries: string[]\n\n\ttry {\n\t\tentries = await fs.readdir(PARTIAL_DIR)\n\t} catch (err) {\n\t\tif (isENOENT(err)) return { tags: new Map(), duplicates: [] }\n\t\tthrow err\n\t}\n\n\tconst tags: Tags = new Map()\n\tconst fileByTag = new Map<string, string>()\n\tconst duplicates: DuplicateTag[] = []\n\n\tfor (const entry of entries) {\n\t\tif (!entry.endsWith('.json')) continue\n\n\t\tconst partial = path.join(PARTIAL_DIR, entry)\n\t\tlet parsed: { file: string; tags: Record<string, string[]> }\n\n\t\ttry {\n\t\t\tparsed = JSON.parse(await fs.readFile(partial, 'utf-8'))\n\t\t} catch {\n\t\t\tcontinue\n\t\t}\n\n\t\tlet source: string\n\n\t\ttry {\n\t\t\tsource = await fs.readFile(parsed.file, 'utf-8')\n\t\t} catch {\n\t\t\tawait fs.rm(partial, { force: true })\n\t\t\tcontinue\n\t\t}\n\n\t\t// drop partials for files that no longer use cxx, so their tags do not linger\n\t\tif (!source.includes('cxx')) {\n\t\t\tawait fs.rm(partial, { force: true })\n\t\t\tcontinue\n\t\t}\n\n\t\tfor (const [name, classes] of Object.entries(parsed.tags)) {\n\t\t\tconst existing = fileByTag.get(name)\n\n\t\t\tif (existing) {\n\t\t\t\tduplicates.push({ tag: name, files: [existing, parsed.file] })\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tfileByTag.set(name, parsed.file)\n\t\t\ttags.set(name, classes)\n\t\t}\n\t}\n\n\treturn { tags, duplicates }\n}\n\n/**\n * Persist one file's tags to its own partial, then rebuild the shared types soon. Rebuilding is\n * debounced and serialised, so a large build does not re-read every partial per file.\n */\nexport function writeTypesForFile(filePath: string, tags: Tags) {\n\treturn enqueueWrite(async () => {\n\t\tawait fs.mkdir(PARTIAL_DIR, { recursive: true })\n\n\t\tconst partial = partialPath(filePath)\n\n\t\tif (!tags.size) {\n\t\t\tawait fs.rm(partial, { force: true })\n\t\t} else {\n\t\t\tawait writeFileAtomic(\n\t\t\t\tpartial,\n\t\t\t\tJSON.stringify({ file: filePath, tags: Object.fromEntries(tags) }),\n\t\t\t)\n\t\t}\n\t})\n\t\t.then(() => scheduleRebuild())\n\t\t.catch(err => {\n\t\t\tlogger.error(`failed to write types for ${filePath}`, err)\n\t\t})\n}\n\n/**\n * Queue a rebuild of `index.d.ts` after a short delay, so a burst of writes only rebuilds once.\n */\nfunction scheduleRebuild() {\n\tif (rebuildTimer) clearTimeout(rebuildTimer)\n\n\trebuildTimer = setTimeout(() => {\n\t\trebuildTimer = null\n\t\tflushTypes().catch(err => {\n\t\t\tlogger.error('failed to generate types', err)\n\t\t})\n\t}, REBUILD_WAIT)\n}\n\n/**\n * Rebuild `index.d.ts` from every partial.\n */\nexport function flushTypes() {\n\tif (rebuildTimer) {\n\t\tclearTimeout(rebuildTimer)\n\t\trebuildTimer = null\n\t}\n\n\treturn enqueueWrite(async () => {\n\t\tconst { tags, duplicates } = await readPartials()\n\t\tawait writeRenderedTypes(tags)\n\n\t\tfor (const duplicate of duplicates) {\n\t\t\tlogger.error(\n\t\t\t\t`Tag \"${duplicate.tag}\" is defined in multiple files: ${duplicate.files.join(', ')}`,\n\t\t\t)\n\t\t}\n\t})\n}\n\nexport const SOURCE_EXTENSIONS = new Set(['.js', '.jsx', '.ts', '.tsx'])\n\n// directories that never contain source we transform\nconst SKIP_DIRS = new Set(['node_modules', 'dist', 'build', 'coverage', 'out'])\n\n/**\n * Run `fn` for every item, with at most `concurrency` calls in flight.\n */\nasync function runWithConcurrency<T>(\n\titems: T[],\n\tconcurrency: number,\n\tfn: (item: T) => Promise<void>,\n) {\n\tlet cursor = 0\n\n\tconst workers = Array.from(\n\t\t{ length: Math.min(concurrency, items.length) },\n\t\tasync () => {\n\t\t\twhile (cursor < items.length) {\n\t\t\t\tconst index = cursor++\n\t\t\t\tawait fn(items[index])\n\t\t\t}\n\t\t},\n\t)\n\n\tawait Promise.all(workers)\n}\n\n/**\n * Read one file, collect its tags, and persist them. A file with no `cxx` usage has its partial\n * removed, so stale tags drop out.\n */\nexport async function refreshFile(file: string, config: PluginConfig) {\n\tlet source: string\n\n\ttry {\n\t\tsource = await fs.readFile(file, 'utf-8')\n\t} catch (err) {\n\t\tif (!isENOENT(err)) throw err\n\t\tawait writeTypesForFile(file, new Map())\n\t\treturn\n\t}\n\n\tconst tags = source.includes('cxx') ? collect(source, file, config).tags : new Map()\n\tawait writeTypesForFile(file, tags)\n}\n\n/**\n * Walk every source file under `root` and seed the type surface, so a fresh checkout (and a build\n * with no edits) has types without waiting for a transform.\n */\nexport async function seedTypes(root: string, config: PluginConfig) {\n\tasync function scan(dir: string) {\n\t\tlet entries: Dirent[]\n\n\t\ttry {\n\t\t\tentries = await fs.readdir(dir, { withFileTypes: true })\n\t\t} catch {\n\t\t\treturn\n\t\t}\n\n\t\tawait runWithConcurrency(entries, 8, async entry => {\n\t\t\tif (entry.name.startsWith('.') || SKIP_DIRS.has(entry.name)) return\n\n\t\t\tconst full = path.join(dir, entry.name)\n\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tawait scan(full)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (!SOURCE_EXTENSIONS.has(path.extname(entry.name))) return\n\n\t\t\tawait refreshFile(full, config)\n\t\t})\n\t}\n\n\tawait scan(root)\n\tawait flushTypes()\n}\n\n/**\n * Render collected tags as a module augmentation for the package entrypoint.\n */\nexport function tagsToType(tags: Tags) {\n\treturn [...tags]\n\t\t.toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n\t\t.map(([tag, classes]) => {\n\t\t\tconst union =\n\t\t\t\tclasses.length > 0\n\t\t\t\t\t? classes\n\t\t\t\t\t\t\t.toSorted((a, b) => a.length - b.length)\n\t\t\t\t\t\t\t.map(c => `'${c}'`)\n\t\t\t\t\t\t\t.join(' | ')\n\t\t\t\t\t: 'never'\n\n\t\t\treturn `\\texport type ${tag} = ${union}`\n\t\t})\n\t\t.join('\\n')\n}\n",
6
6
  "export const NAME = 'cxx'\nexport const PKG_NAME = `@jk2908/${NAME}`\nexport const GENERATED_DIR = `.${NAME}`\nexport const AUTOGEN_MSG = `// auto-generated by ${NAME}`\n",
7
+ "const LEVELS = {\n\tdebug: 0,\n\tinfo: 1,\n\twarn: 2,\n\terror: 3,\n\tfatal: 4,\n} as const\n\nexport type LogLevel = keyof typeof LEVELS\n\nconst defaultLevel: LogLevel = process.env['NODE_ENV'] === 'production' ? 'error' : 'info'\n\ntype LogEntry = {\n\tts: number\n\tlevel: LogLevel\n\tmessage: string\n\terror?:\n\t\t| Error\n\t\t| {\n\t\t\t\tmessage: string\n\t\t\t\tstack?: string\n\t\t\t\tcause?: unknown\n\t\t }\n}\n\n/**\n * Log messages with different severity levels.\n */\nexport class Logger {\n\t#level: LogLevel = defaultLevel\n\n\tconstructor(public name?: string) {}\n\n\t/**\n\t * Convert a value to an Error instance.\n\t */\n\tstatic toError(err: unknown) {\n\t\treturn err instanceof Error ? err : new Error(String(err), { cause: err })\n\t}\n\n\t/**\n\t * Stringify the error for logging.\n\t */\n\tstatic print(err: unknown) {\n\t\tif (err instanceof Error) {\n\t\t\treturn err.message + (err.stack ? `\\n${err.stack}` : '')\n\t\t}\n\n\t\t// for plain objects, attempt to stringify with indentation\n\t\t// for readability\n\t\tif (typeof err === 'object' && err !== null) {\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(err, null, 2)\n\t\t\t} catch {\n\t\t\t\t// if stringify fails (e.g. circular reference), fall back\n\t\t\t\t// to basic string conversion\n\t\t\t\treturn String(err)\n\t\t\t}\n\t\t}\n\n\t\treturn String(err)\n\t}\n\n\tset level(level: LogLevel) {\n\t\tthis.#level = level\n\t}\n\n\tget level() {\n\t\treturn this.#level\n\t}\n\n\t/**\n\t * Log a message with a specific level.\n\t */\n\tlog(level: LogLevel, message: string, error?: Error) {\n\t\tif (LEVELS[level] < LEVELS[this.level]) return\n\n\t\tconst entry: LogEntry = {\n\t\t\tts: Date.now(),\n\t\t\tlevel,\n\t\t\tmessage,\n\t\t}\n\n\t\tif (level === 'error' || level === 'fatal') {\n\t\t\tentry.error = error ? Logger.toError(error) : new Error(message)\n\t\t}\n\n\t\tconst line = `${this.name ? `[${this.name}]` : ''} [${entry.ts}] [${level.toUpperCase()}] ${message}`\n\t\tconst extra = entry.error ? `\\n${Logger.print(entry.error)}` : ''\n\n\t\tif (level === 'warn') {\n\t\t\tconsole.warn(line, extra)\n\t\t\treturn\n\t\t}\n\n\t\tif (level === 'error' || level === 'fatal') {\n\t\t\tconsole.error(line, extra)\n\t\t\treturn\n\t\t}\n\n\t\tconsole.log(line, extra)\n\t}\n\n\t/**\n\t * Log a debug message.\n\t */\n\tdebug(...messages: string[]) {\n\t\tthis.log('debug', messages.join(' '))\n\t}\n\n\t/**\n\t * Log an info message.\n\t */\n\tinfo(...messages: string[]) {\n\t\tthis.log('info', messages.join(' '))\n\t}\n\n\t/**\n\t * Log a warning message.\n\t */\n\twarn(...messages: string[]) {\n\t\tthis.log('warn', messages.join(' '))\n\t}\n\n\t/**\n\t * Log an error message.\n\t */\n\terror(message: string, error?: unknown) {\n\t\tthis.log('error', message, error === undefined ? undefined : Logger.toError(error))\n\t}\n\n\t/**\n\t * Log a fatal error message.\n\t */\n\tfatal(message: string, error?: unknown) {\n\t\tthis.log('fatal', message, error === undefined ? undefined : Logger.toError(error))\n\t}\n}\n",
7
8
  "export const CACHE_MAX_SIZE = 100\n\nexport class LruCache<T> {\n\t#cache: Map<string, T> = new Map()\n\t#maxSize: number\n\n\tconstructor(maxSize = CACHE_MAX_SIZE) {\n\t\tthis.#maxSize = maxSize\n\t}\n\n\tget size() {\n\t\treturn this.#cache.size\n\t}\n\n\t/**\n\t * Retrieve a cached value and promote it to most-recently-used so it won't\n\t * be evicted while still actively referenced.\n\t */\n\tget(key: string) {\n\t\tconst cached = this.#cache.get(key)\n\t\tif (this.#cache.has(key)) this.set(key, cached as T)\n\n\t\treturn cached\n\t}\n\n\t/**\n\t * Promote an existing cache entry to most-recently-used by deleting and\n\t * re-inserting it, which moves it to the end of the Map's iteration\n\t * order. If the cache is at capacity, evict the least recently used\n\t * entry (front) before inserting.\n\t */\n\tset(key: string, value: T) {\n\t\t// drop any existing entry\n\t\tthis.#cache.delete(key)\n\n\t\tif (this.#cache.size >= this.#maxSize) {\n\t\t\tconst lru = this.#cache.keys().next().value\n\t\t\tif (lru !== undefined) this.#cache.delete(lru)\n\t\t}\n\n\t\tthis.#cache.set(key, value)\n\t}\n\n\tdelete(key: string) {\n\t\treturn this.#cache.delete(key)\n\t}\n\n\tclear() {\n\t\treturn this.#cache.clear()\n\t}\n}\n",
8
- "export function capitalise(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nexport function pascalise(str: string) {\n\treturn str\n\t\t.split(/[ _-]+/)\n\t\t.map(capitalise)\n\t\t.join('')\n}\n\nexport type Batcher<K, V> = {\n\t/**\n\t * Queue a value for a key. Queueing the same key again replaces the previous value.\n\t */\n\tadd: (key: K, value: V) => void\n\t/**\n\t * Run any waiting work now and resolve once it has finished.\n\t */\n\tflush: () => Promise<void>\n}\n\n/**\n * Group bursts of work and run them together. Every key queued within `wait` is\n * included once, and a key queued while a batch is running is handled in the next\n * batch instead of replacing the one in progress.\n */\nexport function createBatcher<K, V>(\n\twait: number,\n\tflush: (batch: Map<K, V>) => void | Promise<void>,\n): Batcher<K, V> {\n\t// work waiting to run, keyed so each key is only queued once\n\tconst pending = new Map<K, V>()\n\t// waits for a burst of changes to settle before running\n\tlet timer: ReturnType<typeof setTimeout> | null = null\n\t// true while a batch is running, so we never start a second one\n\tlet running = false\n\n\tasync function drain() {\n\t\t// a run is already going, so let it pick up the new work\n\t\tif (running) return\n\t\trunning = true\n\n\t\ttry {\n\t\t\t// keep looping while there is work, including work added during a flush\n\t\t\twhile (pending.size > 0) {\n\t\t\t\t// snapshot the queued work\n\t\t\t\tconst batch = new Map(pending)\n\t\t\t\t// empty the queue right away, so anything added during flush waits for the next loop\n\t\t\t\tpending.clear()\n\n\t\t\t\tawait flush(batch)\n\t\t\t}\n\t\t} finally {\n\t\t\t// always allow the next run, even if flush threw\n\t\t\trunning = false\n\t\t}\n\t}\n\n\tfunction schedule() {\n\t\t// cancel the previous wait, so the timer restarts from now\n\t\tif (timer) clearTimeout(timer)\n\n\t\t// run once the calls stop coming for `wait` ms\n\t\ttimer = setTimeout(() => {\n\t\t\t// the timer has fired, so drop the stale handle\n\t\t\ttimer = null\n\t\t\t// start the run without waiting for it (this is a timer callback)\n\t\t\tvoid drain()\n\t\t}, wait)\n\t}\n\n\treturn {\n\t\tadd(key, value) {\n\t\t\t// the newest value for this key wins\n\t\t\tpending.set(key, value)\n\t\t\tschedule()\n\t\t},\n\t\tflush() {\n\t\t\t// run now instead of waiting out the timer\n\t\t\tif (timer) {\n\t\t\t\tclearTimeout(timer)\n\t\t\t\ttimer = null\n\t\t\t}\n\n\t\t\treturn drain()\n\t\t},\n\t}\n}\n"
9
+ "export function capitalise(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nexport function pascalise(str: string) {\n\treturn str\n\t\t.split(/[ _-]+/)\n\t\t.map(capitalise)\n\t\t.join('')\n}\n"
9
10
  ],
10
- "mappings": "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",
11
- "debugId": "9492B787092F945A64756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "8D46F05C41A9643264756E2164756E21",
12
13
  "names": []
13
14
  }
package/dist/logger.d.ts CHANGED
@@ -12,7 +12,7 @@ export type LogLevel = keyof typeof LEVELS;
12
12
  export declare class Logger {
13
13
  #private;
14
14
  name?: string | undefined;
15
- constructor(level?: LogLevel, name?: string | undefined);
15
+ constructor(name?: string | undefined);
16
16
  /**
17
17
  * Convert a value to an Error instance.
18
18
  */
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,MAAM;;;;;;CAMF,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAA;AAiB1C;;GAEG;AACH,qBAAa,MAAM;;IAKV,IAAI,CAAC,EAAE,MAAM;gBADpB,KAAK,CAAC,EAAE,QAAQ,EACT,IAAI,CAAC,EAAE,MAAM,YAAA;IAKrB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO;IAI3B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO;IAoBzB,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,EAExB;IAED,IAAI,KAAK,IAJQ,QAAQ,CAMxB;IAED;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IA6BnD;;OAEG;IACH,KAAK,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE;IAI3B;;OAEG;IACH,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE;IAI1B;;OAEG;IACH,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE;IAI1B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAItC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAGtC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,MAAM;;;;;;CAMF,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAA;AAiB1C;;GAEG;AACH,qBAAa,MAAM;;IAGC,IAAI,CAAC,EAAE,MAAM;gBAAb,IAAI,CAAC,EAAE,MAAM,YAAA;IAEhC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO;IAI3B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO;IAoBzB,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,EAExB;IAED,IAAI,KAAK,IAJQ,QAAQ,CAMxB;IAED;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;IA6BnD;;OAEG;IACH,KAAK,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE;IAI3B;;OAEG;IACH,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE;IAI1B;;OAEG;IACH,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE;IAI1B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;IAItC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAGtC"}