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/build.js ADDED
@@ -0,0 +1,395 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined") return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
9
+
10
+ // src/build.ts
11
+ var ts;
12
+ try {
13
+ ts = __require("typescript");
14
+ } catch (err) {
15
+ const { code, message } = err;
16
+ if (code === "MODULE_NOT_FOUND" && message?.includes("'typescript'")) {
17
+ throw new Error(
18
+ 'microtags/build requires "typescript" as a peer dependency. Install it with: npm install --save-dev typescript'
19
+ );
20
+ }
21
+ throw new Error(
22
+ '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.',
23
+ { cause: err }
24
+ );
25
+ }
26
+ function transform(code, options) {
27
+ const keep = options?.keep ?? [];
28
+ const filename = options?.filename;
29
+ const sf = ts.createSourceFile(
30
+ filename ?? "input.ts",
31
+ code,
32
+ ts.ScriptTarget.Latest,
33
+ true
34
+ );
35
+ const defineAliases = findDefineAliases(sf);
36
+ const spans = [];
37
+ const strippedBindings = /* @__PURE__ */ new Set();
38
+ const warnings = [];
39
+ let keptLink = false;
40
+ function visit(node) {
41
+ if (!ts.isCallExpression(node)) {
42
+ ts.forEachChild(node, visit);
43
+ return;
44
+ }
45
+ if (ts.isPropertyAccessExpression(node.expression) && node.expression.name.text === "render") {
46
+ const receiver = node.expression.expression;
47
+ const chainRoot = findChainRoot(receiver);
48
+ if (chainRoot && isDefineCall(chainRoot, defineAliases)) {
49
+ const tagName = getDefineLiteralTag(chainRoot);
50
+ if (tagName === null && keep.length > 0) {
51
+ const line2 = sf.getLineAndCharacterOfPosition(
52
+ chainRoot.getStart()
53
+ ).line + 1;
54
+ warnings.push({
55
+ kind: "non-literal-tag",
56
+ file: filename,
57
+ line: line2,
58
+ message: "define() call with non-literal tag name cannot be matched by --keep"
59
+ });
60
+ }
61
+ if (shouldKeep(node, tagName, keep)) {
62
+ keptLink = true;
63
+ ts.forEachChild(node, visit);
64
+ return;
65
+ }
66
+ const binding = findBindingName(node);
67
+ if (binding) strippedBindings.add(binding);
68
+ spans.push({
69
+ start: dotPosition(node),
70
+ end: node.getEnd()
71
+ });
72
+ return;
73
+ }
74
+ const line = sf.getLineAndCharacterOfPosition(
75
+ node.getStart()
76
+ ).line + 1;
77
+ warnings.push({
78
+ kind: "outside-chain",
79
+ file: filename,
80
+ line,
81
+ message: ".render() call outside a define chain"
82
+ });
83
+ }
84
+ ts.forEachChild(node, visit);
85
+ }
86
+ __name(visit, "visit");
87
+ ts.forEachChild(sf, visit);
88
+ spans.sort((a, b) => b.start - a.start);
89
+ let result = code;
90
+ for (const span of spans) {
91
+ const removed = result.slice(span.start, span.end);
92
+ const newlines = removed.split("\n").length - 1;
93
+ result = result.slice(0, span.start) + "\n".repeat(newlines) + result.slice(span.end);
94
+ }
95
+ if (options?.cascade) {
96
+ result = cascadeRemove(result, filename);
97
+ }
98
+ if (strippedBindings.size > 0) {
99
+ const resultSf = ts.createSourceFile(
100
+ filename ?? "input.ts",
101
+ result,
102
+ ts.ScriptTarget.Latest,
103
+ true
104
+ );
105
+ findStrippedStaticCalls(
106
+ resultSf,
107
+ strippedBindings,
108
+ warnings,
109
+ filename
110
+ );
111
+ }
112
+ if (keptLink && !importsSupport(sf)) {
113
+ result += `
114
+ import '${SUPPORT}'
115
+ `;
116
+ }
117
+ return { code: result, warnings };
118
+ }
119
+ __name(transform, "transform");
120
+ var SUPPORT = "microtags/render-support";
121
+ function importsSupport(sf) {
122
+ return sf.statements.some(
123
+ (node) => ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text === SUPPORT
124
+ );
125
+ }
126
+ __name(importsSupport, "importsSupport");
127
+ function findDefineAliases(sf) {
128
+ const aliases = /* @__PURE__ */ new Set();
129
+ ts.forEachChild(sf, (node) => {
130
+ if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text === "microtags" && node.importClause?.namedBindings && ts.isNamedImports(
131
+ node.importClause.namedBindings
132
+ )) {
133
+ for (const spec of node.importClause.namedBindings.elements) {
134
+ const origName = spec.propertyName?.text ?? spec.name.text;
135
+ if (origName === "define") {
136
+ aliases.add(spec.name.text);
137
+ }
138
+ }
139
+ }
140
+ });
141
+ return aliases;
142
+ }
143
+ __name(findDefineAliases, "findDefineAliases");
144
+ function findChainRoot(node) {
145
+ if (ts.isCallExpression(node)) {
146
+ if (ts.isIdentifier(node.expression)) {
147
+ return node;
148
+ }
149
+ if (ts.isPropertyAccessExpression(node.expression)) {
150
+ return findChainRoot(
151
+ node.expression.expression
152
+ );
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ __name(findChainRoot, "findChainRoot");
158
+ function isDefineCall(node, aliases) {
159
+ return ts.isIdentifier(node.expression) && aliases.has(node.expression.text);
160
+ }
161
+ __name(isDefineCall, "isDefineCall");
162
+ function getDefineLiteralTag(node) {
163
+ if (node.arguments.length > 0 && ts.isStringLiteral(node.arguments[0])) {
164
+ return node.arguments[0].text;
165
+ }
166
+ return null;
167
+ }
168
+ __name(getDefineLiteralTag, "getDefineLiteralTag");
169
+ function shouldKeep(renderCall, tagName, keep) {
170
+ if (renderCall.arguments.length >= 2) {
171
+ const opts = renderCall.arguments[1];
172
+ if (ts.isObjectLiteralExpression(opts)) {
173
+ for (const prop of opts.properties) {
174
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === "client" && prop.initializer.kind === ts.SyntaxKind.TrueKeyword) {
175
+ return true;
176
+ }
177
+ }
178
+ }
179
+ }
180
+ if (tagName !== null && keep.includes(tagName)) {
181
+ return true;
182
+ }
183
+ return false;
184
+ }
185
+ __name(shouldKeep, "shouldKeep");
186
+ function dotPosition(renderCall) {
187
+ const pa = renderCall.expression;
188
+ return pa.expression.getEnd();
189
+ }
190
+ __name(dotPosition, "dotPosition");
191
+ function findBindingName(node) {
192
+ let current = node;
193
+ while (current.parent) {
194
+ current = current.parent;
195
+ if (ts.isVariableDeclaration(current) && ts.isIdentifier(current.name)) {
196
+ return current.name.text;
197
+ }
198
+ }
199
+ return null;
200
+ }
201
+ __name(findBindingName, "findBindingName");
202
+ function cascadeRemove(code, filename) {
203
+ let changed = true;
204
+ let result = code;
205
+ while (changed) {
206
+ changed = false;
207
+ const sf = ts.createSourceFile(
208
+ filename ?? "input.ts",
209
+ result,
210
+ ts.ScriptTarget.Latest,
211
+ true
212
+ );
213
+ const refs = collectReferences(sf);
214
+ const removeSpans = [];
215
+ ts.forEachChild(sf, (node) => {
216
+ if (ts.isImportDeclaration(node) && node.importClause) {
217
+ if (isExportedNode(node)) return;
218
+ const nb = node.importClause.namedBindings;
219
+ if (!nb) return;
220
+ if (!ts.isNamedImports(nb)) {
221
+ const name = node.importClause.name;
222
+ if (name && !refs.has(name.text)) {
223
+ removeSpans.push({
224
+ start: node.getStart(),
225
+ end: node.getEnd()
226
+ });
227
+ }
228
+ return;
229
+ }
230
+ const dead = [];
231
+ const live = [];
232
+ for (const el of nb.elements) {
233
+ if (refs.has(el.name.text)) {
234
+ live.push(el);
235
+ } else {
236
+ dead.push(el);
237
+ }
238
+ }
239
+ if (dead.length === 0) return;
240
+ if (live.length === 0) {
241
+ removeSpans.push({
242
+ start: node.getStart(),
243
+ end: node.getEnd()
244
+ });
245
+ } else {
246
+ for (const d of dead) {
247
+ let start = d.getStart();
248
+ let end = d.getEnd();
249
+ const text = result;
250
+ const after = text.slice(end);
251
+ const before = text.slice(0, start);
252
+ if (/^\s*,/.test(after)) {
253
+ end += after.match(
254
+ /^\s*,/
255
+ )[0].length;
256
+ } else if (/,\s*$/.test(before)) {
257
+ start = before.lastIndexOf(",");
258
+ }
259
+ removeSpans.push({ start, end });
260
+ }
261
+ }
262
+ return;
263
+ }
264
+ if (ts.isVariableStatement(node)) {
265
+ if (isExportedNode(node)) return;
266
+ const allDead = node.declarationList.declarations.every(
267
+ (d) => ts.isIdentifier(d.name) && !refs.has(d.name.text)
268
+ );
269
+ if (allDead) {
270
+ removeSpans.push({
271
+ start: node.getStart(),
272
+ end: node.getEnd()
273
+ });
274
+ }
275
+ return;
276
+ }
277
+ if (ts.isFunctionDeclaration(node)) {
278
+ if (isExportedNode(node)) return;
279
+ if (node.name && !refs.has(node.name.text)) {
280
+ removeSpans.push({
281
+ start: node.getStart(),
282
+ end: node.getEnd()
283
+ });
284
+ }
285
+ return;
286
+ }
287
+ if (ts.isClassDeclaration(node)) {
288
+ if (isExportedNode(node)) return;
289
+ if (node.name && !refs.has(node.name.text)) {
290
+ removeSpans.push({
291
+ start: node.getStart(),
292
+ end: node.getEnd()
293
+ });
294
+ }
295
+ }
296
+ });
297
+ if (removeSpans.length === 0) break;
298
+ changed = true;
299
+ removeSpans.sort((a, b) => b.start - a.start);
300
+ for (const span of removeSpans) {
301
+ const removed = result.slice(
302
+ span.start,
303
+ span.end
304
+ );
305
+ const newlines = removed.split("\n").length - 1;
306
+ result = result.slice(0, span.start) + "\n".repeat(newlines) + result.slice(span.end);
307
+ }
308
+ }
309
+ return result;
310
+ }
311
+ __name(cascadeRemove, "cascadeRemove");
312
+ function collectReferences(sf) {
313
+ const refs = /* @__PURE__ */ new Set();
314
+ const declared = /* @__PURE__ */ new Set();
315
+ ts.forEachChild(sf, (node) => {
316
+ if (ts.isImportDeclaration(node)) {
317
+ if (node.importClause?.namedBindings && ts.isNamedImports(
318
+ node.importClause.namedBindings
319
+ )) {
320
+ for (const el of node.importClause.namedBindings.elements) {
321
+ declared.add(el.name.text);
322
+ }
323
+ }
324
+ return;
325
+ }
326
+ if (ts.isVariableStatement(node)) {
327
+ for (const d of node.declarationList.declarations) {
328
+ if (ts.isIdentifier(d.name)) {
329
+ declared.add(d.name.text);
330
+ }
331
+ }
332
+ }
333
+ if (ts.isFunctionDeclaration(node) && node.name) {
334
+ declared.add(node.name.text);
335
+ }
336
+ if (ts.isClassDeclaration(node) && node.name) {
337
+ declared.add(node.name.text);
338
+ }
339
+ });
340
+ function visitRefs(node) {
341
+ if (ts.isIdentifier(node) && declared.has(node.text)) {
342
+ const parent = node.parent;
343
+ if (ts.isImportSpecifier(parent) || ts.isVariableDeclaration(parent) && parent.name === node || ts.isFunctionDeclaration(parent) && parent.name === node || ts.isClassDeclaration(parent) && parent.name === node) {
344
+ return;
345
+ }
346
+ refs.add(node.text);
347
+ }
348
+ ts.forEachChild(node, visitRefs);
349
+ }
350
+ __name(visitRefs, "visitRefs");
351
+ ts.forEachChild(sf, (node) => {
352
+ if (ts.isImportDeclaration(node)) return;
353
+ visitRefs(node);
354
+ });
355
+ return refs;
356
+ }
357
+ __name(collectReferences, "collectReferences");
358
+ function isExportedNode(node) {
359
+ if (!ts.canHaveModifiers(node)) return false;
360
+ const mods = ts.getModifiers(node);
361
+ if (!mods) return false;
362
+ return mods.some(
363
+ (m) => m.kind === ts.SyntaxKind.ExportKeyword
364
+ );
365
+ }
366
+ __name(isExportedNode, "isExportedNode");
367
+ function findStrippedStaticCalls(sf, bindings, warnings, filename) {
368
+ function visit(node) {
369
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(
370
+ node.expression
371
+ ) && node.expression.name.text === "render" && ts.isIdentifier(
372
+ node.expression.expression
373
+ ) && bindings.has(
374
+ node.expression.expression.text
375
+ )) {
376
+ const line = sf.getLineAndCharacterOfPosition(
377
+ node.getStart()
378
+ ).line + 1;
379
+ warnings.push({
380
+ kind: "stripped-static",
381
+ file: filename,
382
+ line,
383
+ message: `${node.expression.expression.text}.render() called but render was stripped`
384
+ });
385
+ }
386
+ ts.forEachChild(node, visit);
387
+ }
388
+ __name(visit, "visit");
389
+ ts.forEachChild(sf, visit);
390
+ }
391
+ __name(findStrippedStaticCalls, "findStrippedStaticCalls");
392
+ export {
393
+ transform
394
+ };
395
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/build.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"],
5
+ "mappings": "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",
6
+ "names": ["line"]
7
+ }
@@ -1,5 +1,23 @@
1
1
  import type { StandardSchemaV1 } from '@standard-schema/spec';
2
- import type { PropDef, PropertyOnlyProp, SetupContext, Coercer, RefDef, SingleRefDef, MultipleRefDef, RefsMap, ContextToken, ContextsMap } from './types.js';
2
+ import type { Markup } from './htm.js';
3
+ import type { Markup as BrowserMarkup } from './htm.browser.js';
4
+ import type { PropDef, PropType, PropertyOnlyProp, SetupContext, Coercer, RefDef, SingleRefDef, MultipleRefDef, RefsMap, ContextToken, ContextsMap } from './types.js';
5
+ export type PropKind = 'prop-only' | 'schema' | 'boolean' | 'json' | 'coercer';
6
+ export interface PropMeta {
7
+ kind: PropKind;
8
+ coercer: Coercer<unknown>;
9
+ }
10
+ /**
11
+ * What a `render` static hands the server render support module: tag,
12
+ * prop metadata, ref names and the render function. This shape is a
13
+ * contract between package copies; changing it needs a new symbol key.
14
+ */
15
+ export interface RenderRecord {
16
+ t: string;
17
+ m: Record<string, PropMeta>;
18
+ r: Record<string, string>;
19
+ f: RenderFn<any, any>;
20
+ }
3
21
  /** The DSL object passed to the withProps callback. */
4
22
  export type PropDSL = {
5
23
  number(): Coercer<number>;
@@ -43,12 +61,53 @@ export type ContextDSL = Record<never, never>;
43
61
  export type RefNames<RefDefs extends Record<string, RefDef>> = {
44
62
  readonly [K in keyof RefDefs]: K & string;
45
63
  };
64
+ /** Plain values for props (not signals) in the render context. */
65
+ export type RenderProps<Defs extends Record<string, PropDef>> = {
66
+ [K in keyof Defs]: PropType<Defs[K]>;
67
+ };
68
+ export interface RenderContext<Props extends Record<string, PropDef> = Record<never, never>, RefDefs extends Record<string, RefDef> = Record<never, never>> {
69
+ props: RenderProps<Props>;
70
+ refs: RefNames<RefDefs>;
71
+ TAG: string;
72
+ children: string;
73
+ attrs: Record<string, string>;
74
+ }
75
+ export type RenderFn<Props extends Record<string, PropDef> = Record<never, never>, RefDefs extends Record<string, RefDef> = Record<never, never>> = (ctx: RenderContext<Props, RefDefs>) => string | Markup | BrowserMarkup;
76
+ export interface RenderOptions {
77
+ client?: boolean;
78
+ }
79
+ export type StaticRenderFn<Props extends Record<string, PropDef>> = (props: RenderProps<Props>, options?: {
80
+ children?: string;
81
+ attrs?: Record<string, string>;
82
+ }) => string;
83
+ /**
84
+ * A component's server render as parts: the host tag name, its
85
+ * serialized host attributes (declared props first, then extra attrs,
86
+ * unescaped; a true boolean is the empty string) and the inner HTML.
87
+ */
88
+ export interface RenderParts {
89
+ tag: string;
90
+ attrs: Record<string, string>;
91
+ html: string;
92
+ }
93
+ export type StaticRenderPartsFn<Props extends Record<string, PropDef>> = (props: RenderProps<Props>, options?: {
94
+ children?: string;
95
+ attrs?: Record<string, string>;
96
+ }) => RenderParts;
97
+ /**
98
+ * A host element: an `HTMLElement` with a property accessor for each
99
+ * declared prop, typed as the prop's value. A signal bound with
100
+ * `bindProp` makes the prop read through to it.
101
+ */
102
+ export type MicrotagHost<Props extends Record<string, PropDef> = Record<never, never>> = HTMLElement & RenderProps<Props>;
46
103
  /**
47
104
  * A registered custom element class that also exposes, as static members,
48
105
  * the tag name it was registered under (`TAG`) and the names of its
49
106
  * declared refs (`refs`).
50
107
  */
51
- export type MicrotagElementClass<RefDefs extends Record<string, RefDef> = Record<never, never>> = typeof HTMLElement & {
108
+ export type MicrotagElementClass<Props extends Record<string, PropDef> = Record<never, never>, RefDefs extends Record<string, RefDef> = Record<never, never>> = {
109
+ new (): MicrotagHost<Props>;
110
+ readonly prototype: MicrotagHost<Props>;
52
111
  /** The custom element tag name, e.g. 'my-counter'. */
53
112
  readonly TAG: string;
54
113
  /**
@@ -57,6 +116,9 @@ export type MicrotagElementClass<RefDefs extends Record<string, RefDef> = Record
57
116
  * string: `MyCounter.refs.dec`.
58
117
  */
59
118
  readonly refs: RefNames<RefDefs>;
119
+ readonly render: StaticRenderFn<Props>;
120
+ readonly renderParts: StaticRenderPartsFn<Props>;
121
+ readonly props: readonly (keyof Props & string)[];
60
122
  };
61
123
  /**
62
124
  * Fluent builder that accumulates props/refs/contexts config
@@ -66,9 +128,12 @@ export declare class ComponentBuilder<Props extends Record<string, PropDef> = Re
66
128
  readonly tagName: string;
67
129
  private readonly _coercers;
68
130
  private readonly _observed;
131
+ private readonly _propNames;
132
+ private readonly _propMetas;
69
133
  private readonly _refDefs;
70
134
  private readonly _ctxDefs;
71
- constructor(tagName: string, coercers?: Record<string, Coercer<unknown>>, observed?: string[], refDefs?: Record<string, RefDef>, ctxDefs?: Record<string, ContextToken<unknown>>);
135
+ private readonly _renderFn?;
136
+ constructor(tagName: string, coercers?: Record<string, Coercer<unknown>>, observed?: string[], refDefs?: Record<string, RefDef>, ctxDefs?: Record<string, ContextToken<unknown>>, propNames?: string[], propMetas?: Record<string, PropMeta>, renderFn?: RenderFn<any, any>);
72
137
  /**
73
138
  * The custom element tag name, e.g. 'my-counter'. Available at every
74
139
  * point in the fluent chain since each builder method returns a new
@@ -78,7 +143,8 @@ export declare class ComponentBuilder<Props extends Record<string, PropDef> = Re
78
143
  withProps<P extends Record<string, PropDef>>(fn: (p: PropDSL) => P): ComponentBuilder<P, RefDefs, CtxDefs>;
79
144
  withRefs<R extends Record<string, RefDef>>(fn: (r: RefsDSL) => R): ComponentBuilder<Props, R, CtxDefs>;
80
145
  withContexts<C extends Record<string, ContextToken<unknown>>>(fn: (c: ContextDSL) => C): ComponentBuilder<Props, RefDefs, C>;
81
- setup(fn: (ctx: SetupContext<Props, RefsMap<RefDefs>, ContextsMap<CtxDefs>>) => void): MicrotagElementClass<RefDefs>;
146
+ render(fn: RenderFn<Props, RefDefs>, _options?: RenderOptions): ComponentBuilder<Props, RefDefs, CtxDefs>;
147
+ setup(fn: (ctx: SetupContext<Props, RefsMap<RefDefs>, ContextsMap<CtxDefs>>) => void): MicrotagElementClass<Props, RefDefs>;
82
148
  }
83
149
  /** Create a new component builder for the given tag name. */
84
150
  export declare function define(tagName: string): ComponentBuilder;
@@ -1 +1 @@
1
- {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,10 @@
1
+ import {
2
+ signal
3
+ } from "./chunk-ZZ4ZLOQY.js";
1
4
  import {
2
5
  __name
3
6
  } from "./chunk-7QVYU63E.js";
4
7
 
5
- // src/reactivity.ts
6
- import {
7
- signal,
8
- effect,
9
- effectScope,
10
- setActiveSub
11
- } from "alien-signals";
12
- function untracked(fn) {
13
- const prev = setActiveSub(void 0);
14
- try {
15
- return fn();
16
- } finally {
17
- setActiveSub(prev);
18
- }
19
- }
20
- __name(untracked, "untracked");
21
- function peek(sig) {
22
- return untracked(() => sig());
23
- }
24
- __name(peek, "peek");
25
-
26
8
  // src/context.ts
27
9
  var providerStorage = /* @__PURE__ */ new WeakMap();
28
10
  var pendingCallbacks = /* @__PURE__ */ new Map();
@@ -86,13 +68,9 @@ function notifyPending(id) {
86
68
  __name(notifyPending, "notifyPending");
87
69
 
88
70
  export {
89
- signal,
90
- effect,
91
- untracked,
92
- peek,
93
71
  createContext,
94
72
  provide,
95
73
  resolveContextSignal,
96
74
  onContextAvailable
97
75
  };
98
- //# sourceMappingURL=chunk-CCYWRJW6.js.map
76
+ //# sourceMappingURL=chunk-46UEUDVX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/context.ts"],
4
+ "sourcesContent": ["import { signal } from './reactivity.js'\nimport type { ContextToken, Signal } from './types.js'\n\n// Provider storage: element -> (contextId -> Signal)\nconst providerStorage = new WeakMap<Element, Map<symbol, Signal<unknown>>>()\n\n// Pending consumers waiting for a context by id\nconst pendingCallbacks = new Map<symbol, Set<() => void>>()\n\n/**\n * Create a new context token.\n * Each token uniquely identifies a type of shared context.\n */\nexport function createContext<T> ():ContextToken<T> {\n return { id: Symbol('microtag-context') }\n}\n\n/**\n * Provide a context value from an element to its descendants.\n * Returns a cleanup function that removes the provided value.\n */\nexport function provide<T> (\n element:Element,\n token:ContextToken<T>,\n value:T\n):() => void {\n let map = providerStorage.get(element)\n if (!map) {\n map = new Map()\n providerStorage.set(element, map)\n }\n\n const existing = map.get(token.id) as Signal<T> | undefined\n if (existing) {\n existing(value)\n } else {\n const sig = signal(value) as unknown as Signal<T>\n map.set(token.id, sig as Signal<unknown>)\n }\n\n notifyPending(token.id)\n\n return () => {\n const m = providerStorage.get(element)\n if (m) {\n m.delete(token.id)\n if (m.size === 0) providerStorage.delete(element)\n }\n }\n}\n\n/**\n * Walk up the DOM from element to find the nearest provider signal.\n * Returns the signal (not the value) so callers can subscribe to changes.\n */\nexport function resolveContextSignal<T> (\n element:Element,\n token:ContextToken<T>\n):Signal<T> | undefined {\n let current:Element | null = element.parentElement\n while (current) {\n const map = providerStorage.get(current)\n if (map && map.has(token.id)) {\n return map.get(token.id) as Signal<T>\n }\n current = current.parentElement\n }\n return undefined\n}\n\n/**\n * Register a callback to run when the given context becomes available.\n * Returns a cleanup function to unregister.\n */\nexport function onContextAvailable (\n id:symbol,\n callback:() => void\n):() => void {\n let set = pendingCallbacks.get(id)\n if (!set) {\n set = new Set()\n pendingCallbacks.set(id, set)\n }\n set.add(callback)\n return () => { pendingCallbacks.get(id)?.delete(callback) }\n}\n\nfunction notifyPending (id:symbol):void {\n const set = pendingCallbacks.get(id)\n if (set) {\n for (const cb of set) cb()\n }\n}\n"],
5
+ "mappings": ";;;;;;;;AAIA,IAAM,kBAAkB,oBAAI,QAA+C;AAG3E,IAAM,mBAAmB,oBAAI,IAA6B;AAMnD,SAAS,gBAAoC;AAChD,SAAO,EAAE,IAAI,uBAAO,kBAAkB,EAAE;AAC5C;AAFgB;AAQT,SAAS,QACZ,SACA,OACA,OACS;AACT,MAAI,MAAM,gBAAgB,IAAI,OAAO;AACrC,MAAI,CAAC,KAAK;AACN,UAAM,oBAAI,IAAI;AACd,oBAAgB,IAAI,SAAS,GAAG;AAAA,EACpC;AAEA,QAAM,WAAW,IAAI,IAAI,MAAM,EAAE;AACjC,MAAI,UAAU;AACV,aAAS,KAAK;AAAA,EAClB,OAAO;AACH,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,IAAI,MAAM,IAAI,GAAsB;AAAA,EAC5C;AAEA,gBAAc,MAAM,EAAE;AAEtB,SAAO,MAAM;AACT,UAAM,IAAI,gBAAgB,IAAI,OAAO;AACrC,QAAI,GAAG;AACH,QAAE,OAAO,MAAM,EAAE;AACjB,UAAI,EAAE,SAAS,EAAG,iBAAgB,OAAO,OAAO;AAAA,IACpD;AAAA,EACJ;AACJ;AA5BgB;AAkCT,SAAS,qBACZ,SACA,OACoB;AACpB,MAAI,UAAyB,QAAQ;AACrC,SAAO,SAAS;AACZ,UAAM,MAAM,gBAAgB,IAAI,OAAO;AACvC,QAAI,OAAO,IAAI,IAAI,MAAM,EAAE,GAAG;AAC1B,aAAO,IAAI,IAAI,MAAM,EAAE;AAAA,IAC3B;AACA,cAAU,QAAQ;AAAA,EACtB;AACA,SAAO;AACX;AAbgB;AAmBT,SAAS,mBACZ,IACA,UACS;AACT,MAAI,MAAM,iBAAiB,IAAI,EAAE;AACjC,MAAI,CAAC,KAAK;AACN,UAAM,oBAAI,IAAI;AACd,qBAAiB,IAAI,IAAI,GAAG;AAAA,EAChC;AACA,MAAI,IAAI,QAAQ;AAChB,SAAO,MAAM;AAAE,qBAAiB,IAAI,EAAE,GAAG,OAAO,QAAQ;AAAA,EAAE;AAC9D;AAXgB;AAahB,SAAS,cAAe,IAAgB;AACpC,QAAM,MAAM,iBAAiB,IAAI,EAAE;AACnC,MAAI,KAAK;AACL,eAAW,MAAM,IAAK,IAAG;AAAA,EAC7B;AACJ;AALS;",
6
+ "names": []
7
+ }