microtags 0.0.14 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +554 -20
  2. package/dist/build.cjs +412 -0
  3. package/dist/build.cjs.map +7 -0
  4. package/dist/build.d.ts +17 -0
  5. package/dist/build.d.ts.map +1 -0
  6. package/dist/build.js +395 -0
  7. package/dist/build.js.map +7 -0
  8. package/dist/builders.d.ts +70 -4
  9. package/dist/builders.d.ts.map +1 -1
  10. package/dist/{chunk-CCYWRJW6.js → chunk-46UEUDVX.js} +4 -26
  11. package/dist/chunk-46UEUDVX.js.map +7 -0
  12. package/dist/chunk-LS4L5QRD.js +26 -0
  13. package/dist/chunk-LS4L5QRD.js.map +7 -0
  14. package/dist/chunk-RKWPTT6P.js +69 -0
  15. package/dist/chunk-RKWPTT6P.js.map +7 -0
  16. package/dist/chunk-ZZ4ZLOQY.js +33 -0
  17. package/dist/chunk-ZZ4ZLOQY.js.map +7 -0
  18. package/dist/cli.cjs +536 -0
  19. package/dist/cli.cjs.map +7 -0
  20. package/dist/context.js +2 -1
  21. package/dist/esbuild.cjs +451 -0
  22. package/dist/esbuild.cjs.map +7 -0
  23. package/dist/esbuild.d.ts +7 -0
  24. package/dist/esbuild.d.ts.map +1 -0
  25. package/dist/esbuild.js +434 -0
  26. package/dist/esbuild.js.map +7 -0
  27. package/dist/factory.d.ts +7 -1
  28. package/dist/factory.d.ts.map +1 -1
  29. package/dist/htm.browser.cjs +591 -0
  30. package/dist/htm.browser.cjs.map +7 -0
  31. package/dist/htm.browser.d.ts +30 -0
  32. package/dist/htm.browser.d.ts.map +1 -0
  33. package/dist/htm.browser.js +498 -0
  34. package/dist/htm.browser.js.map +7 -0
  35. package/dist/htm.browser.min.js +3 -0
  36. package/dist/htm.browser.min.js.map +7 -0
  37. package/dist/htm.cjs +284 -0
  38. package/dist/htm.cjs.map +7 -0
  39. package/dist/htm.d.ts +14 -0
  40. package/dist/htm.d.ts.map +1 -0
  41. package/dist/htm.js +196 -0
  42. package/dist/htm.js.map +7 -0
  43. package/dist/htm.min.js +3 -0
  44. package/dist/htm.min.js.map +7 -0
  45. package/dist/index.cjs +125 -11
  46. package/dist/index.cjs.map +2 -2
  47. package/dist/index.d.ts +3 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +133 -17
  50. package/dist/index.js.map +2 -2
  51. package/dist/index.min.js +1 -1
  52. package/dist/index.min.js.map +3 -3
  53. package/dist/meta.json +411 -26
  54. package/dist/preact-shared.d.ts +61 -0
  55. package/dist/preact-shared.d.ts.map +1 -0
  56. package/dist/preact.browser.d.ts +8 -0
  57. package/dist/preact.browser.d.ts.map +1 -0
  58. package/dist/preact.browser.js +45 -0
  59. package/dist/preact.browser.js.map +7 -0
  60. package/dist/preact.browser.min.js +2 -0
  61. package/dist/preact.browser.min.js.map +7 -0
  62. package/dist/preact.cjs +128 -0
  63. package/dist/preact.cjs.map +7 -0
  64. package/dist/preact.d.ts +9 -0
  65. package/dist/preact.d.ts.map +1 -0
  66. package/dist/preact.js +35 -0
  67. package/dist/preact.js.map +7 -0
  68. package/dist/render-support.cjs +86 -0
  69. package/dist/render-support.cjs.map +7 -0
  70. package/dist/render-support.d.ts +23 -0
  71. package/dist/render-support.d.ts.map +1 -0
  72. package/dist/render-support.js +12 -0
  73. package/dist/render-support.js.map +7 -0
  74. package/dist/render-support.min.js +2 -0
  75. package/dist/render-support.min.js.map +7 -0
  76. package/dist/types.d.ts +8 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/dist/vite.cjs +448 -0
  79. package/dist/vite.cjs.map +7 -0
  80. package/dist/vite.d.ts +7 -0
  81. package/dist/vite.d.ts.map +1 -0
  82. package/dist/vite.js +429 -0
  83. package/dist/vite.js.map +7 -0
  84. package/package.json +92 -13
  85. package/dist/chunk-CCYWRJW6.js.map +0 -7
package/dist/cli.cjs ADDED
@@ -0,0 +1,536 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
+
6
+ // src/build.ts
7
+ var ts;
8
+ try {
9
+ ts = require("typescript");
10
+ } catch (err) {
11
+ const { code, message } = err;
12
+ if (code === "MODULE_NOT_FOUND" && message?.includes("'typescript'")) {
13
+ throw new Error(
14
+ 'microtags/build requires "typescript" as a peer dependency. Install it with: npm install --save-dev typescript'
15
+ );
16
+ }
17
+ throw new Error(
18
+ 'microtags/build could not load "typescript" because `require` is unavailable or unusable here. Load the entry from its built form (microtags/build, or dist/ in this repo) instead of from source.',
19
+ { cause: err }
20
+ );
21
+ }
22
+ function transform(code, options) {
23
+ const keep = options?.keep ?? [];
24
+ const filename = options?.filename;
25
+ const sf = ts.createSourceFile(
26
+ filename ?? "input.ts",
27
+ code,
28
+ ts.ScriptTarget.Latest,
29
+ true
30
+ );
31
+ const defineAliases = findDefineAliases(sf);
32
+ const spans = [];
33
+ const strippedBindings = /* @__PURE__ */ new Set();
34
+ const warnings = [];
35
+ let keptLink = false;
36
+ function visit(node) {
37
+ if (!ts.isCallExpression(node)) {
38
+ ts.forEachChild(node, visit);
39
+ return;
40
+ }
41
+ if (ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === "render") {
42
+ const receiver = node.expression.expression;
43
+ const chainRoot = findChainRoot(receiver);
44
+ if (chainRoot && isDefineCall(chainRoot, defineAliases)) {
45
+ const tagName = getDefineLiteralTag(chainRoot);
46
+ if (tagName === null && keep.length > 0) {
47
+ const line2 = sf.getLineAndCharacterOfPosition(
48
+ chainRoot.getStart()
49
+ ).line + 1;
50
+ warnings.push({
51
+ kind: "non-literal-tag",
52
+ file: filename,
53
+ line: line2,
54
+ message: "define() call with non-literal tag name cannot be matched by --keep"
55
+ });
56
+ }
57
+ if (shouldKeep(node, tagName, keep)) {
58
+ keptLink = true;
59
+ ts.forEachChild(node, visit);
60
+ return;
61
+ }
62
+ const binding = findBindingName(node);
63
+ if (binding) strippedBindings.add(binding);
64
+ spans.push({
65
+ start: dotPosition(node),
66
+ end: node.getEnd()
67
+ });
68
+ return;
69
+ }
70
+ const line = sf.getLineAndCharacterOfPosition(
71
+ node.getStart()
72
+ ).line + 1;
73
+ warnings.push({
74
+ kind: "outside-chain",
75
+ file: filename,
76
+ line,
77
+ message: ".render() call outside a define chain"
78
+ });
79
+ }
80
+ ts.forEachChild(node, visit);
81
+ }
82
+ __name(visit, "visit");
83
+ ts.forEachChild(sf, visit);
84
+ spans.sort((a, b) => b.start - a.start);
85
+ let result = code;
86
+ for (const span of spans) {
87
+ const removed = result.slice(span.start, span.end);
88
+ const newlines = removed.split("\n").length - 1;
89
+ result = result.slice(0, span.start) + "\n".repeat(newlines) + result.slice(span.end);
90
+ }
91
+ if (options?.cascade) {
92
+ result = cascadeRemove(result, filename);
93
+ }
94
+ if (strippedBindings.size > 0) {
95
+ const resultSf = ts.createSourceFile(
96
+ filename ?? "input.ts",
97
+ result,
98
+ ts.ScriptTarget.Latest,
99
+ true
100
+ );
101
+ findStrippedStaticCalls(
102
+ resultSf,
103
+ strippedBindings,
104
+ warnings,
105
+ filename
106
+ );
107
+ }
108
+ if (keptLink && !importsSupport(sf)) {
109
+ result += `
110
+ import '${SUPPORT}'
111
+ `;
112
+ }
113
+ return { code: result, warnings };
114
+ }
115
+ __name(transform, "transform");
116
+ var SUPPORT = "microtags/render-support";
117
+ function importsSupport(sf) {
118
+ return sf.statements.some(
119
+ (node) => ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text === SUPPORT
120
+ );
121
+ }
122
+ __name(importsSupport, "importsSupport");
123
+ function findDefineAliases(sf) {
124
+ const aliases = /* @__PURE__ */ new Set();
125
+ ts.forEachChild(sf, (node) => {
126
+ if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text === "microtags" && node.importClause?.namedBindings && ts.isNamedImports(
127
+ node.importClause.namedBindings
128
+ )) {
129
+ for (const spec of node.importClause.namedBindings.elements) {
130
+ const origName = spec.propertyName?.text ?? spec.name.text;
131
+ if (origName === "define") {
132
+ aliases.add(spec.name.text);
133
+ }
134
+ }
135
+ }
136
+ });
137
+ return aliases;
138
+ }
139
+ __name(findDefineAliases, "findDefineAliases");
140
+ function findChainRoot(node) {
141
+ if (ts.isCallExpression(node)) {
142
+ if (ts.isIdentifier(node.expression)) {
143
+ return node;
144
+ }
145
+ if (ts.isPropertyAccessExpression(node.expression)) {
146
+ return findChainRoot(
147
+ node.expression.expression
148
+ );
149
+ }
150
+ }
151
+ return null;
152
+ }
153
+ __name(findChainRoot, "findChainRoot");
154
+ function isDefineCall(node, aliases) {
155
+ return ts.isIdentifier(node.expression) && aliases.has(node.expression.text);
156
+ }
157
+ __name(isDefineCall, "isDefineCall");
158
+ function getDefineLiteralTag(node) {
159
+ if (node.arguments.length > 0 && ts.isStringLiteral(node.arguments[0])) {
160
+ return node.arguments[0].text;
161
+ }
162
+ return null;
163
+ }
164
+ __name(getDefineLiteralTag, "getDefineLiteralTag");
165
+ function shouldKeep(renderCall, tagName, keep) {
166
+ if (renderCall.arguments.length >= 2) {
167
+ const opts = renderCall.arguments[1];
168
+ if (ts.isObjectLiteralExpression(opts)) {
169
+ for (const prop of opts.properties) {
170
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === "client" && prop.initializer.kind === ts.SyntaxKind.TrueKeyword) {
171
+ return true;
172
+ }
173
+ }
174
+ }
175
+ }
176
+ if (tagName !== null && keep.includes(tagName)) {
177
+ return true;
178
+ }
179
+ return false;
180
+ }
181
+ __name(shouldKeep, "shouldKeep");
182
+ function dotPosition(renderCall) {
183
+ const pa = renderCall.expression;
184
+ return pa.expression.getEnd();
185
+ }
186
+ __name(dotPosition, "dotPosition");
187
+ function findBindingName(node) {
188
+ let current = node;
189
+ while (current.parent) {
190
+ current = current.parent;
191
+ if (ts.isVariableDeclaration(current) && ts.isIdentifier(current.name)) {
192
+ return current.name.text;
193
+ }
194
+ }
195
+ return null;
196
+ }
197
+ __name(findBindingName, "findBindingName");
198
+ function cascadeRemove(code, filename) {
199
+ let changed = true;
200
+ let result = code;
201
+ while (changed) {
202
+ changed = false;
203
+ const sf = ts.createSourceFile(
204
+ filename ?? "input.ts",
205
+ result,
206
+ ts.ScriptTarget.Latest,
207
+ true
208
+ );
209
+ const refs = collectReferences(sf);
210
+ const removeSpans = [];
211
+ ts.forEachChild(sf, (node) => {
212
+ if (ts.isImportDeclaration(node) && node.importClause) {
213
+ if (isExportedNode(node)) return;
214
+ const nb = node.importClause.namedBindings;
215
+ if (!nb) return;
216
+ if (!ts.isNamedImports(nb)) {
217
+ const name = node.importClause.name;
218
+ if (name && !refs.has(name.text)) {
219
+ removeSpans.push({
220
+ start: node.getStart(),
221
+ end: node.getEnd()
222
+ });
223
+ }
224
+ return;
225
+ }
226
+ const dead = [];
227
+ const live = [];
228
+ for (const el of nb.elements) {
229
+ if (refs.has(el.name.text)) {
230
+ live.push(el);
231
+ } else {
232
+ dead.push(el);
233
+ }
234
+ }
235
+ if (dead.length === 0) return;
236
+ if (live.length === 0) {
237
+ removeSpans.push({
238
+ start: node.getStart(),
239
+ end: node.getEnd()
240
+ });
241
+ } else {
242
+ for (const d of dead) {
243
+ let start = d.getStart();
244
+ let end = d.getEnd();
245
+ const text = result;
246
+ const after = text.slice(end);
247
+ const before = text.slice(0, start);
248
+ if (/^\s*,/.test(after)) {
249
+ end += after.match(
250
+ /^\s*,/
251
+ )[0].length;
252
+ } else if (/,\s*$/.test(before)) {
253
+ start = before.lastIndexOf(",");
254
+ }
255
+ removeSpans.push({ start, end });
256
+ }
257
+ }
258
+ return;
259
+ }
260
+ if (ts.isVariableStatement(node)) {
261
+ if (isExportedNode(node)) return;
262
+ const allDead = node.declarationList.declarations.every(
263
+ (d) => ts.isIdentifier(d.name) && !refs.has(d.name.text)
264
+ );
265
+ if (allDead) {
266
+ removeSpans.push({
267
+ start: node.getStart(),
268
+ end: node.getEnd()
269
+ });
270
+ }
271
+ return;
272
+ }
273
+ if (ts.isFunctionDeclaration(node)) {
274
+ if (isExportedNode(node)) return;
275
+ if (node.name && !refs.has(node.name.text)) {
276
+ removeSpans.push({
277
+ start: node.getStart(),
278
+ end: node.getEnd()
279
+ });
280
+ }
281
+ return;
282
+ }
283
+ if (ts.isClassDeclaration(node)) {
284
+ if (isExportedNode(node)) return;
285
+ if (node.name && !refs.has(node.name.text)) {
286
+ removeSpans.push({
287
+ start: node.getStart(),
288
+ end: node.getEnd()
289
+ });
290
+ }
291
+ }
292
+ });
293
+ if (removeSpans.length === 0) break;
294
+ changed = true;
295
+ removeSpans.sort((a, b) => b.start - a.start);
296
+ for (const span of removeSpans) {
297
+ const removed = result.slice(
298
+ span.start,
299
+ span.end
300
+ );
301
+ const newlines = removed.split("\n").length - 1;
302
+ result = result.slice(0, span.start) + "\n".repeat(newlines) + result.slice(span.end);
303
+ }
304
+ }
305
+ return result;
306
+ }
307
+ __name(cascadeRemove, "cascadeRemove");
308
+ function collectReferences(sf) {
309
+ const refs = /* @__PURE__ */ new Set();
310
+ const declared = /* @__PURE__ */ new Set();
311
+ ts.forEachChild(sf, (node) => {
312
+ if (ts.isImportDeclaration(node)) {
313
+ if (node.importClause?.namedBindings && ts.isNamedImports(
314
+ node.importClause.namedBindings
315
+ )) {
316
+ for (const el of node.importClause.namedBindings.elements) {
317
+ declared.add(el.name.text);
318
+ }
319
+ }
320
+ return;
321
+ }
322
+ if (ts.isVariableStatement(node)) {
323
+ for (const d of node.declarationList.declarations) {
324
+ if (ts.isIdentifier(d.name)) {
325
+ declared.add(d.name.text);
326
+ }
327
+ }
328
+ }
329
+ if (ts.isFunctionDeclaration(node) && node.name) {
330
+ declared.add(node.name.text);
331
+ }
332
+ if (ts.isClassDeclaration(node) && node.name) {
333
+ declared.add(node.name.text);
334
+ }
335
+ });
336
+ function visitRefs(node) {
337
+ if (ts.isIdentifier(node) && declared.has(node.text)) {
338
+ const parent = node.parent;
339
+ if (ts.isImportSpecifier(parent) || ts.isVariableDeclaration(parent) && parent.name === node || ts.isFunctionDeclaration(parent) && parent.name === node || ts.isClassDeclaration(parent) && parent.name === node) {
340
+ return;
341
+ }
342
+ refs.add(node.text);
343
+ }
344
+ ts.forEachChild(node, visitRefs);
345
+ }
346
+ __name(visitRefs, "visitRefs");
347
+ ts.forEachChild(sf, (node) => {
348
+ if (ts.isImportDeclaration(node)) return;
349
+ visitRefs(node);
350
+ });
351
+ return refs;
352
+ }
353
+ __name(collectReferences, "collectReferences");
354
+ function isExportedNode(node) {
355
+ if (!ts.canHaveModifiers(node)) return false;
356
+ const mods = ts.getModifiers(node);
357
+ if (!mods) return false;
358
+ return mods.some(
359
+ (m) => m.kind === ts.SyntaxKind.ExportKeyword
360
+ );
361
+ }
362
+ __name(isExportedNode, "isExportedNode");
363
+ function findStrippedStaticCalls(sf, bindings, warnings, filename) {
364
+ function visit(node) {
365
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(
366
+ node.expression
367
+ ) && node.expression.name.text === "render" && ts.isIdentifier(
368
+ node.expression.expression
369
+ ) && bindings.has(
370
+ node.expression.expression.text
371
+ )) {
372
+ const line = sf.getLineAndCharacterOfPosition(
373
+ node.getStart()
374
+ ).line + 1;
375
+ warnings.push({
376
+ kind: "stripped-static",
377
+ file: filename,
378
+ line,
379
+ message: `${node.expression.expression.text}.render() called but render was stripped`
380
+ });
381
+ }
382
+ ts.forEachChild(node, visit);
383
+ }
384
+ __name(visit, "visit");
385
+ ts.forEachChild(sf, visit);
386
+ }
387
+ __name(findStrippedStaticCalls, "findStrippedStaticCalls");
388
+
389
+ // src/cli.ts
390
+ var import_node_fs = require("node:fs");
391
+ var import_node_path = require("node:path");
392
+ var import_node_fs2 = require("node:fs");
393
+ var ts2 = require("typescript");
394
+ var USAGE = `Usage: microbuild [globs...] [options]
395
+
396
+ Options:
397
+ --outdir DIR Output directory (required in glob mode)
398
+ --root DIR Root directory for relative paths (default: cwd)
399
+ --cascade Remove dead imports and declarations
400
+ --keep TAG[,TAG] Keep render for these tag names (repeatable)
401
+ --help Show this help
402
+ `;
403
+ function main() {
404
+ const args = process.argv.slice(2);
405
+ let outdir;
406
+ let root = process.cwd();
407
+ let cascade = false;
408
+ const keep = [];
409
+ const globs = [];
410
+ let showHelp = false;
411
+ for (let i = 0; i < args.length; i++) {
412
+ const arg = args[i];
413
+ if (arg === "--help") {
414
+ showHelp = true;
415
+ } else if (arg === "--outdir") {
416
+ outdir = args[++i];
417
+ } else if (arg === "--root") {
418
+ root = args[++i];
419
+ } else if (arg === "--cascade") {
420
+ cascade = true;
421
+ } else if (arg === "--keep") {
422
+ const val = args[++i];
423
+ if (val) {
424
+ for (const t of val.split(",")) {
425
+ if (t) keep.push(t);
426
+ }
427
+ }
428
+ } else {
429
+ globs.push(arg);
430
+ }
431
+ }
432
+ if (showHelp) {
433
+ process.stdout.write(USAGE);
434
+ process.exit(0);
435
+ }
436
+ if (globs.length === 0) {
437
+ return stdinMode({ cascade, keep });
438
+ }
439
+ if (!outdir) {
440
+ process.stderr.write(
441
+ "Error: --outdir is required in glob mode\n"
442
+ );
443
+ process.exit(1);
444
+ }
445
+ globMode(globs, {
446
+ outdir: (0, import_node_path.resolve)(outdir),
447
+ root: (0, import_node_path.resolve)(root),
448
+ cascade,
449
+ keep
450
+ });
451
+ }
452
+ __name(main, "main");
453
+ function stdinMode(opts) {
454
+ let input;
455
+ try {
456
+ input = (0, import_node_fs.readFileSync)(0, "utf-8");
457
+ } catch {
458
+ process.stderr.write("Error: could not read stdin\n");
459
+ process.exit(1);
460
+ return;
461
+ }
462
+ let result;
463
+ try {
464
+ result = transform(input, {
465
+ cascade: opts.cascade,
466
+ keep: opts.keep
467
+ });
468
+ } catch (err) {
469
+ process.stderr.write(
470
+ "Error: " + (err?.message ?? "parse error") + "\n"
471
+ );
472
+ process.exit(1);
473
+ return;
474
+ }
475
+ if (hasSyntaxErrors(input)) {
476
+ process.stderr.write("Error: parse error\n");
477
+ process.exit(1);
478
+ return;
479
+ }
480
+ for (const w of result.warnings) {
481
+ process.stderr.write(
482
+ `warning: ${w.message}` + (w.line ? ` (line ${w.line})` : "") + "\n"
483
+ );
484
+ }
485
+ process.stdout.write(result.code);
486
+ }
487
+ __name(stdinMode, "stdinMode");
488
+ function globMode(patterns, opts) {
489
+ const files = [];
490
+ for (const pattern of patterns) {
491
+ for (const f of (0, import_node_fs2.globSync)(pattern)) {
492
+ files.push((0, import_node_path.resolve)(f));
493
+ }
494
+ }
495
+ for (const file of files) {
496
+ const input = (0, import_node_fs.readFileSync)(file, "utf-8");
497
+ let result;
498
+ try {
499
+ result = transform(input, {
500
+ cascade: opts.cascade,
501
+ keep: opts.keep,
502
+ filename: file
503
+ });
504
+ } catch {
505
+ process.stderr.write(
506
+ `Error: parse error in ${file}
507
+ `
508
+ );
509
+ process.exit(1);
510
+ return;
511
+ }
512
+ for (const w of result.warnings) {
513
+ process.stderr.write(
514
+ `warning: ${w.message}` + (w.file ? ` (${w.file}` : "(") + (w.line ? `:${w.line})` : ")") + "\n"
515
+ );
516
+ }
517
+ const rel = (0, import_node_path.relative)(opts.root, file);
518
+ const outPath = (0, import_node_path.join)(opts.outdir, rel);
519
+ (0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(outPath), { recursive: true });
520
+ (0, import_node_fs.writeFileSync)(outPath, result.code);
521
+ }
522
+ }
523
+ __name(globMode, "globMode");
524
+ function hasSyntaxErrors(code) {
525
+ const sf = ts2.createSourceFile(
526
+ "input.ts",
527
+ code,
528
+ ts2.ScriptTarget.Latest,
529
+ true
530
+ );
531
+ const diags = sf.parseDiagnostics;
532
+ return Array.isArray(diags) && diags.length > 0;
533
+ }
534
+ __name(hasSyntaxErrors, "hasSyntaxErrors");
535
+ main();
536
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/build.ts", "../src/cli.ts"],
4
+ "sourcesContent": ["import type TypeScript from 'typescript'\n\ndeclare const require:(id:string) => unknown\n\nlet ts:typeof TypeScript\ntry {\n ts = require('typescript') as typeof TypeScript\n} catch (err) {\n // Only a failure to resolve the bare name means typescript is\n // missing. Anything else is a context that cannot `require` it:\n // an ESM bundle without `require`, or a Vite config bundle, which\n // hands `require` a file URL.\n const { code, message } = err as { code?:string, message?:string }\n if (\n code === 'MODULE_NOT_FOUND' &&\n message?.includes(\"'typescript'\")\n ) {\n throw new Error(\n 'microtags/build requires \"typescript\" as a peer dependency. ' +\n 'Install it with: npm install --save-dev typescript'\n )\n }\n throw new Error(\n 'microtags/build could not load \"typescript\" because `require` ' +\n 'is unavailable or unusable here. Load the entry from its ' +\n 'built form (microtags/build, or dist/ in this repo) instead ' +\n 'of from source.',\n { cause: err }\n )\n}\n\nexport interface TransformWarning {\n kind:'outside-chain'|'stripped-static'|'non-literal-tag'\n file?:string\n line:number\n message:string\n}\n\nexport interface TransformOptions {\n cascade?:boolean\n keep?:string[]\n filename?:string\n}\n\nexport interface TransformResult {\n code:string\n warnings:TransformWarning[]\n}\n\nexport function transform (\n code:string,\n options?:TransformOptions\n):TransformResult {\n const keep = options?.keep ?? []\n const filename = options?.filename\n\n const sf = ts.createSourceFile(\n filename ?? 'input.ts',\n code,\n ts.ScriptTarget.Latest,\n true\n )\n\n const defineAliases = findDefineAliases(sf)\n const spans:{ start:number, end:number }[] = []\n const strippedBindings:Set<string> = new Set()\n const warnings:TransformWarning[] = []\n let keptLink = false\n\n function visit (node:TypeScript.Node) {\n if (!ts.isCallExpression(node)) {\n ts.forEachChild(node, visit)\n return\n }\n\n if (\n ts.isPropertyAccessExpression(node.expression) &&\n node.expression.name.text === 'render'\n ) {\n const receiver = node.expression.expression\n const chainRoot = findChainRoot(receiver)\n\n if (\n chainRoot &&\n isDefineCall(chainRoot, defineAliases)\n ) {\n const tagName = getDefineLiteralTag(chainRoot)\n\n if (tagName === null && keep.length > 0) {\n const line = sf.getLineAndCharacterOfPosition(\n chainRoot.getStart()\n ).line + 1\n warnings.push({\n kind: 'non-literal-tag',\n file: filename,\n line,\n message:\n 'define() call with non-literal ' +\n 'tag name cannot be matched ' +\n 'by --keep',\n })\n }\n\n if (shouldKeep(node, tagName, keep)) {\n keptLink = true\n ts.forEachChild(node, visit)\n return\n }\n\n const binding = findBindingName(node)\n if (binding) strippedBindings.add(binding)\n\n spans.push({\n start: dotPosition(node),\n end: node.getEnd(),\n })\n return\n }\n\n const line = sf.getLineAndCharacterOfPosition(\n node.getStart()\n ).line + 1\n warnings.push({\n kind: 'outside-chain',\n file: filename,\n line,\n message:\n '.render() call outside a define chain',\n })\n }\n\n ts.forEachChild(node, visit)\n }\n\n ts.forEachChild(sf, visit)\n\n spans.sort((a, b) => b.start - a.start)\n\n let result = code\n for (const span of spans) {\n const removed = result.slice(span.start, span.end)\n const newlines = removed.split('\\n').length - 1\n result = result.slice(0, span.start) +\n '\\n'.repeat(newlines) +\n result.slice(span.end)\n }\n\n if (options?.cascade) {\n result = cascadeRemove(result, filename)\n }\n\n if (strippedBindings.size > 0) {\n const resultSf = ts.createSourceFile(\n filename ?? 'input.ts',\n result,\n ts.ScriptTarget.Latest,\n true\n )\n findStrippedStaticCalls(\n resultSf, strippedBindings, warnings, filename\n )\n }\n\n // A kept render link needs the server render support module at\n // runtime (ADR-009). Appended so no existing line moves; imports\n // are hoisted, so its position does not matter.\n if (keptLink && !importsSupport(sf)) {\n result += `\\nimport '${SUPPORT}'\\n`\n }\n\n return { code: result, warnings }\n}\n\nconst SUPPORT = 'microtags/render-support'\n\nfunction importsSupport (sf:TypeScript.SourceFile):boolean {\n return sf.statements.some(node =>\n ts.isImportDeclaration(node) &&\n ts.isStringLiteral(node.moduleSpecifier) &&\n node.moduleSpecifier.text === SUPPORT\n )\n}\n\nfunction findDefineAliases (\n sf:TypeScript.SourceFile\n):Set<string> {\n const aliases = new Set<string>()\n ts.forEachChild(sf, node => {\n if (\n ts.isImportDeclaration(node) &&\n ts.isStringLiteral(node.moduleSpecifier) &&\n node.moduleSpecifier.text === 'microtags' &&\n node.importClause?.namedBindings &&\n ts.isNamedImports(\n node.importClause.namedBindings\n )\n ) {\n for (const spec of\n node.importClause.namedBindings.elements\n ) {\n const origName =\n spec.propertyName?.text ??\n spec.name.text\n if (origName === 'define') {\n aliases.add(spec.name.text)\n }\n }\n }\n })\n return aliases\n}\n\nfunction findChainRoot (\n node:TypeScript.Node\n):TypeScript.CallExpression | null {\n if (ts.isCallExpression(node)) {\n if (ts.isIdentifier(node.expression)) {\n return node\n }\n if (\n ts.isPropertyAccessExpression(node.expression)\n ) {\n return findChainRoot(\n node.expression.expression\n )\n }\n }\n return null\n}\n\nfunction isDefineCall (\n node:TypeScript.CallExpression,\n aliases:Set<string>\n):boolean {\n return ts.isIdentifier(node.expression) &&\n aliases.has(node.expression.text)\n}\n\nfunction getDefineLiteralTag (\n node:TypeScript.CallExpression\n):string | null {\n if (\n node.arguments.length > 0 &&\n ts.isStringLiteral(node.arguments[0])\n ) {\n return node.arguments[0].text\n }\n return null\n}\n\nfunction shouldKeep (\n renderCall:TypeScript.CallExpression,\n tagName:string | null,\n keep:string[]\n):boolean {\n if (renderCall.arguments.length >= 2) {\n const opts = renderCall.arguments[1]\n if (ts.isObjectLiteralExpression(opts)) {\n for (const prop of opts.properties) {\n if (\n ts.isPropertyAssignment(prop) &&\n ts.isIdentifier(prop.name) &&\n prop.name.text === 'client' &&\n prop.initializer.kind ===\n ts.SyntaxKind.TrueKeyword\n ) {\n return true\n }\n }\n }\n }\n\n if (tagName !== null && keep.includes(tagName)) {\n return true\n }\n\n return false\n}\n\nfunction dotPosition (\n renderCall:TypeScript.CallExpression\n):number {\n const pa = renderCall\n .expression as TypeScript.PropertyAccessExpression\n return pa.expression.getEnd()\n}\n\nfunction findBindingName (\n node:TypeScript.Node\n):string | null {\n let current:TypeScript.Node = node\n while (current.parent) {\n current = current.parent\n if (\n ts.isVariableDeclaration(current) &&\n ts.isIdentifier(current.name)\n ) {\n return current.name.text\n }\n }\n return null\n}\n\nfunction cascadeRemove (\n code:string,\n filename?:string\n):string {\n let changed = true\n let result = code\n while (changed) {\n changed = false\n const sf = ts.createSourceFile(\n filename ?? 'input.ts',\n result,\n ts.ScriptTarget.Latest,\n true\n )\n\n const refs = collectReferences(sf)\n const removeSpans:{\n start:number, end:number\n }[] = []\n\n ts.forEachChild(sf, node => {\n if (\n ts.isImportDeclaration(node) &&\n node.importClause\n ) {\n if (isExportedNode(node)) return\n const nb = node.importClause.namedBindings\n if (!nb) return\n if (!ts.isNamedImports(nb)) {\n const name = node.importClause.name\n if (\n name &&\n !refs.has(name.text)\n ) {\n removeSpans.push({\n start: node.getStart(),\n end: node.getEnd(),\n })\n }\n return\n }\n const dead:TypeScript.ImportSpecifier[] = []\n const live:TypeScript.ImportSpecifier[] = []\n for (const el of nb.elements) {\n if (refs.has(el.name.text)) {\n live.push(el)\n } else {\n dead.push(el)\n }\n }\n if (dead.length === 0) return\n if (live.length === 0) {\n removeSpans.push({\n start: node.getStart(),\n end: node.getEnd(),\n })\n } else {\n for (const d of dead) {\n let start = d.getStart()\n let end = d.getEnd()\n const text = result\n const after = text.slice(end)\n const before = text.slice(0, start)\n if (/^\\s*,/.test(after)) {\n end += after.match(\n /^\\s*,/\n )![0].length\n } else if (/,\\s*$/.test(before)) {\n start = before.lastIndexOf(',')\n }\n removeSpans.push({ start, end })\n }\n }\n return\n }\n\n if (ts.isVariableStatement(node)) {\n if (isExportedNode(node)) return\n const allDead = node\n .declarationList\n .declarations\n .every(d =>\n ts.isIdentifier(d.name) &&\n !refs.has(d.name.text)\n )\n if (allDead) {\n removeSpans.push({\n start: node.getStart(),\n end: node.getEnd(),\n })\n }\n return\n }\n\n if (ts.isFunctionDeclaration(node)) {\n if (isExportedNode(node)) return\n if (\n node.name &&\n !refs.has(node.name.text)\n ) {\n removeSpans.push({\n start: node.getStart(),\n end: node.getEnd(),\n })\n }\n return\n }\n\n if (ts.isClassDeclaration(node)) {\n if (isExportedNode(node)) return\n if (\n node.name &&\n !refs.has(node.name.text)\n ) {\n removeSpans.push({\n start: node.getStart(),\n end: node.getEnd(),\n })\n }\n }\n })\n\n if (removeSpans.length === 0) break\n\n changed = true\n removeSpans.sort((a, b) => b.start - a.start)\n for (const span of removeSpans) {\n const removed = result.slice(\n span.start, span.end\n )\n const newlines =\n removed.split('\\n').length - 1\n result = result.slice(0, span.start) +\n '\\n'.repeat(newlines) +\n result.slice(span.end)\n }\n }\n\n return result\n}\n\nfunction collectReferences (\n sf:TypeScript.SourceFile\n):Set<string> {\n const refs = new Set<string>()\n const declared = new Set<string>()\n\n ts.forEachChild(sf, node => {\n if (ts.isImportDeclaration(node)) {\n if (\n node.importClause?.namedBindings &&\n ts.isNamedImports(\n node.importClause.namedBindings\n )\n ) {\n for (const el of\n node.importClause\n .namedBindings.elements\n ) {\n declared.add(el.name.text)\n }\n }\n return\n }\n if (ts.isVariableStatement(node)) {\n for (const d of\n node.declarationList.declarations\n ) {\n if (ts.isIdentifier(d.name)) {\n declared.add(d.name.text)\n }\n }\n }\n if (\n ts.isFunctionDeclaration(node) && node.name\n ) {\n declared.add(node.name.text)\n }\n if (\n ts.isClassDeclaration(node) && node.name\n ) {\n declared.add(node.name.text)\n }\n })\n\n function visitRefs (node:TypeScript.Node) {\n if (\n ts.isIdentifier(node) &&\n declared.has(node.text)\n ) {\n const parent = node.parent\n if (\n ts.isImportSpecifier(parent) ||\n (\n ts.isVariableDeclaration(parent) &&\n parent.name === node\n ) ||\n (\n ts.isFunctionDeclaration(parent) &&\n parent.name === node\n ) ||\n (\n ts.isClassDeclaration(parent) &&\n parent.name === node\n )\n ) {\n return\n }\n refs.add(node.text)\n }\n ts.forEachChild(node, visitRefs)\n }\n\n ts.forEachChild(sf, node => {\n if (ts.isImportDeclaration(node)) return\n visitRefs(node)\n })\n\n return refs\n}\n\nfunction isExportedNode (\n node:TypeScript.Node\n):boolean {\n if (!ts.canHaveModifiers(node)) return false\n const mods = ts.getModifiers(node)\n if (!mods) return false\n return mods.some(\n m => m.kind === ts.SyntaxKind.ExportKeyword\n )\n}\n\nfunction findStrippedStaticCalls (\n sf:TypeScript.SourceFile,\n bindings:Set<string>,\n warnings:TransformWarning[],\n filename?:string\n) {\n function visit (node:TypeScript.Node) {\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(\n node.expression\n ) &&\n node.expression.name.text === 'render' &&\n ts.isIdentifier(\n node.expression.expression\n ) &&\n bindings.has(\n node.expression.expression.text\n )\n ) {\n const line = sf.getLineAndCharacterOfPosition(\n node.getStart()\n ).line + 1\n warnings.push({\n kind: 'stripped-static',\n file: filename,\n line,\n message:\n `${node.expression.expression.text}` +\n '.render() called but render ' +\n 'was stripped',\n })\n }\n ts.forEachChild(node, visit)\n }\n ts.forEachChild(sf, visit)\n}\n", "import { transform } from './build.js'\nimport type TypeScript from 'typescript'\n\ndeclare const require:(id:string) => unknown\nconst ts = require('typescript') as typeof TypeScript\nimport {\n readFileSync,\n writeFileSync,\n mkdirSync,\n} from 'node:fs'\nimport { resolve, relative, dirname, join } from 'node:path'\nimport { globSync } from 'node:fs'\n\nconst USAGE = `Usage: microbuild [globs...] [options]\n\nOptions:\n --outdir DIR Output directory (required in glob mode)\n --root DIR Root directory for relative paths (default: cwd)\n --cascade Remove dead imports and declarations\n --keep TAG[,TAG] Keep render for these tag names (repeatable)\n --help Show this help\n`\n\nfunction main () {\n const args = process.argv.slice(2)\n\n let outdir:string | undefined\n let root:string = process.cwd()\n let cascade = false\n const keep:string[] = []\n const globs:string[] = []\n let showHelp = false\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]\n if (arg === '--help') {\n showHelp = true\n } else if (arg === '--outdir') {\n outdir = args[++i]\n } else if (arg === '--root') {\n root = args[++i]\n } else if (arg === '--cascade') {\n cascade = true\n } else if (arg === '--keep') {\n const val = args[++i]\n if (val) {\n for (const t of val.split(',')) {\n if (t) keep.push(t)\n }\n }\n } else {\n globs.push(arg)\n }\n }\n\n if (showHelp) {\n process.stdout.write(USAGE)\n process.exit(0)\n }\n\n if (globs.length === 0) {\n return stdinMode({ cascade, keep })\n }\n\n if (!outdir) {\n process.stderr.write(\n 'Error: --outdir is required in glob mode\\n'\n )\n process.exit(1)\n }\n\n globMode(globs, {\n outdir: resolve(outdir),\n root: resolve(root),\n cascade,\n keep,\n })\n}\n\nfunction stdinMode (\n opts:{ cascade:boolean, keep:string[] }\n) {\n let input:string\n try {\n input = readFileSync(0, 'utf-8')\n } catch {\n process.stderr.write('Error: could not read stdin\\n')\n process.exit(1)\n return\n }\n\n let result\n try {\n result = transform(input, {\n cascade: opts.cascade,\n keep: opts.keep,\n })\n } catch (err:any) {\n process.stderr.write(\n 'Error: ' + (err?.message ?? 'parse error') +\n '\\n'\n )\n process.exit(1)\n return\n }\n\n if (hasSyntaxErrors(input)) {\n process.stderr.write('Error: parse error\\n')\n process.exit(1)\n return\n }\n\n for (const w of result.warnings) {\n process.stderr.write(\n `warning: ${w.message}` +\n (w.line ? ` (line ${w.line})` : '') +\n '\\n'\n )\n }\n\n process.stdout.write(result.code)\n}\n\ninterface GlobOpts {\n outdir:string\n root:string\n cascade:boolean\n keep:string[]\n}\n\nfunction globMode (patterns:string[], opts:GlobOpts) {\n const files:string[] = []\n for (const pattern of patterns) {\n for (const f of globSync(pattern)) {\n files.push(resolve(f))\n }\n }\n\n for (const file of files) {\n const input = readFileSync(file, 'utf-8')\n let result\n try {\n result = transform(input, {\n cascade: opts.cascade,\n keep: opts.keep,\n filename: file,\n })\n } catch {\n process.stderr.write(\n `Error: parse error in ${file}\\n`\n )\n process.exit(1)\n return\n }\n\n for (const w of result.warnings) {\n process.stderr.write(\n `warning: ${w.message}` +\n (w.file ? ` (${w.file}` : '(') +\n (w.line ? `:${w.line})` : ')') +\n '\\n'\n )\n }\n\n const rel = relative(opts.root, file)\n const outPath = join(opts.outdir, rel)\n mkdirSync(dirname(outPath), { recursive: true })\n writeFileSync(outPath, result.code)\n }\n}\n\nfunction hasSyntaxErrors (code:string):boolean {\n const sf = ts.createSourceFile(\n 'input.ts', code, ts.ScriptTarget.Latest, true\n )\n const diags = (sf as any).parseDiagnostics\n return Array.isArray(diags) && diags.length > 0\n}\n\nmain()\n"],
5
+ "mappings": "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",
6
+ "names": ["line", "import_node_fs", "ts"]
7
+ }
package/dist/context.js CHANGED
@@ -3,7 +3,8 @@ import {
3
3
  onContextAvailable,
4
4
  provide,
5
5
  resolveContextSignal
6
- } from "./chunk-CCYWRJW6.js";
6
+ } from "./chunk-46UEUDVX.js";
7
+ import "./chunk-ZZ4ZLOQY.js";
7
8
  import "./chunk-7QVYU63E.js";
8
9
  export {
9
10
  createContext,