murasaki 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/bin/murasaki.js +8 -3
  2. package/dist/cli/colors.d.ts +13 -0
  3. package/dist/cli/colors.d.ts.map +1 -0
  4. package/dist/cli/colors.js +14 -0
  5. package/dist/cli/colors.js.map +1 -0
  6. package/dist/cli/log.d.ts +14 -0
  7. package/dist/cli/log.d.ts.map +1 -0
  8. package/dist/cli/log.js +25 -0
  9. package/dist/cli/log.js.map +1 -0
  10. package/dist/components/Link.d.ts +9 -0
  11. package/dist/components/Link.d.ts.map +1 -0
  12. package/dist/components/Link.js +15 -0
  13. package/dist/components/Link.js.map +1 -0
  14. package/dist/dev.d.ts +2 -0
  15. package/dist/dev.d.ts.map +1 -0
  16. package/dist/dev.js +41 -0
  17. package/dist/dev.js.map +1 -0
  18. package/dist/env.d.ts +15 -0
  19. package/dist/env.d.ts.map +1 -0
  20. package/dist/env.js +43 -0
  21. package/dist/env.js.map +1 -0
  22. package/dist/index.d.ts +18 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/jsx/dom/index.d.ts +2 -0
  27. package/dist/jsx/dom/index.d.ts.map +1 -0
  28. package/dist/jsx/dom/index.js +3 -0
  29. package/dist/jsx/dom/index.js.map +1 -0
  30. package/dist/jsx/dom/runtime.d.ts +34 -0
  31. package/dist/jsx/dom/runtime.d.ts.map +1 -0
  32. package/dist/jsx/dom/runtime.js +303 -0
  33. package/dist/jsx/dom/runtime.js.map +1 -0
  34. package/dist/jsx/index.d.ts +3 -0
  35. package/dist/jsx/index.d.ts.map +1 -0
  36. package/dist/jsx/index.js +3 -0
  37. package/dist/jsx/index.js.map +1 -0
  38. package/dist/jsx/jsx-dev-runtime.d.ts +2 -0
  39. package/dist/jsx/jsx-dev-runtime.d.ts.map +1 -0
  40. package/dist/jsx/jsx-dev-runtime.js +7 -0
  41. package/dist/jsx/jsx-dev-runtime.js.map +1 -0
  42. package/dist/jsx/jsx-runtime.d.ts +2 -0
  43. package/dist/jsx/jsx-runtime.d.ts.map +1 -0
  44. package/{src/jsx/jsx-runtime.ts → dist/jsx/jsx-runtime.js} +4 -3
  45. package/dist/jsx/jsx-runtime.js.map +1 -0
  46. package/dist/jsx/runtime.d.ts +24 -0
  47. package/dist/jsx/runtime.d.ts.map +1 -0
  48. package/dist/jsx/runtime.js +273 -0
  49. package/dist/jsx/runtime.js.map +1 -0
  50. package/dist/jsx/types.d.ts +30 -0
  51. package/dist/jsx/types.d.ts.map +1 -0
  52. package/dist/jsx/types.js +3 -0
  53. package/dist/jsx/types.js.map +1 -0
  54. package/dist/runtime/bundle.d.ts +8 -0
  55. package/dist/runtime/bundle.d.ts.map +1 -0
  56. package/dist/runtime/bundle.js +98 -0
  57. package/dist/runtime/bundle.js.map +1 -0
  58. package/dist/runtime/hmr.d.ts +2 -0
  59. package/dist/runtime/hmr.d.ts.map +1 -0
  60. package/dist/runtime/hmr.js +28 -0
  61. package/dist/runtime/hmr.js.map +1 -0
  62. package/dist/runtime/render.d.ts +3 -0
  63. package/dist/runtime/render.d.ts.map +1 -0
  64. package/dist/runtime/render.js +226 -0
  65. package/dist/runtime/render.js.map +1 -0
  66. package/dist/runtime/routes.d.ts +10 -0
  67. package/dist/runtime/routes.d.ts.map +1 -0
  68. package/dist/runtime/routes.js +65 -0
  69. package/dist/runtime/routes.js.map +1 -0
  70. package/dist/runtime/shortcuts.d.ts +8 -0
  71. package/dist/runtime/shortcuts.d.ts.map +1 -0
  72. package/dist/runtime/shortcuts.js +29 -0
  73. package/dist/runtime/shortcuts.js.map +1 -0
  74. package/dist/runtime/window.d.ts +10 -0
  75. package/dist/runtime/window.d.ts.map +1 -0
  76. package/dist/runtime/window.js +93 -0
  77. package/dist/runtime/window.js.map +1 -0
  78. package/dist/types.d.ts +17 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +3 -0
  81. package/dist/types.js.map +1 -0
  82. package/package.json +17 -10
  83. package/src/cli/colors.ts +0 -16
  84. package/src/cli/log.ts +0 -42
  85. package/src/components/Link.tsx +0 -25
  86. package/src/dev.tsx +0 -60
  87. package/src/env.ts +0 -48
  88. package/src/index.ts +0 -24
  89. package/src/jsx/index.ts +0 -21
  90. package/src/jsx/jsx-dev-runtime.ts +0 -6
  91. package/src/jsx/runtime.ts +0 -298
  92. package/src/jsx/types.ts +0 -36
  93. package/src/runtime/hmr.ts +0 -26
  94. package/src/runtime/render.tsx +0 -225
  95. package/src/runtime/routes.ts +0 -73
  96. package/src/runtime/shortcuts.ts +0 -31
  97. package/src/runtime/window.ts +0 -94
  98. package/src/types.ts +0 -22
@@ -0,0 +1,273 @@
1
+ // murasaki/jsx — SSR-only JSX runtime.
2
+ //
3
+ // Inspired by hono/jsx but trimmed for desktop-server use:
4
+ // - no hooks (the view is rendered once per HMR cycle, no client state)
5
+ // - no DOM renderer (we ship HTML to the OS WebView and that's it)
6
+ // - no streaming / Suspense (single render → loadHtml())
7
+ // - React-compatible enough to swap in for renderToStaticMarkup
8
+ //
9
+ // Two-step pipeline:
10
+ // 1. jsx(tag, props) → JSXNode (tree)
11
+ // 2. JSXNode.toString() → HTML string
12
+ //
13
+ // User code that runs is the *user's* JSX (transformed to jsx() calls
14
+ // by tsx/esbuild with `jsxImportSource: "murasaki"`).
15
+ // ── HTML escape ──────────────────────────────────────────────────────
16
+ const AMP = /&/g;
17
+ const LT = /</g;
18
+ const GT = />/g;
19
+ const QT = /"/g;
20
+ function escapeHtml(s) {
21
+ return s.replace(AMP, '&amp;').replace(LT, '&lt;').replace(GT, '&gt;');
22
+ }
23
+ function escapeAttr(s) {
24
+ return s.replace(AMP, '&amp;').replace(QT, '&quot;');
25
+ }
26
+ // ── Void elements (no closing tag) ────────────────────────────────────
27
+ const VOID_ELEMENTS = new Set([
28
+ 'area',
29
+ 'base',
30
+ 'br',
31
+ 'col',
32
+ 'embed',
33
+ 'hr',
34
+ 'img',
35
+ 'input',
36
+ 'link',
37
+ 'meta',
38
+ 'source',
39
+ 'track',
40
+ 'wbr',
41
+ ]);
42
+ // ── Attribute name normalization (React → HTML) ───────────────────────
43
+ const ATTR_ALIAS = {
44
+ className: 'class',
45
+ htmlFor: 'for',
46
+ charSet: 'charset',
47
+ crossOrigin: 'crossorigin',
48
+ httpEquiv: 'http-equiv',
49
+ itemProp: 'itemprop',
50
+ fetchPriority: 'fetchpriority',
51
+ noModule: 'nomodule',
52
+ formAction: 'formaction',
53
+ acceptCharset: 'accept-charset',
54
+ autoComplete: 'autocomplete',
55
+ autoFocus: 'autofocus',
56
+ autoPlay: 'autoplay',
57
+ contentEditable: 'contenteditable',
58
+ defaultValue: 'value',
59
+ defaultChecked: 'checked',
60
+ encType: 'enctype',
61
+ formMethod: 'formmethod',
62
+ formNoValidate: 'formnovalidate',
63
+ formTarget: 'formtarget',
64
+ maxLength: 'maxlength',
65
+ minLength: 'minlength',
66
+ noValidate: 'novalidate',
67
+ readOnly: 'readonly',
68
+ rowSpan: 'rowspan',
69
+ colSpan: 'colspan',
70
+ spellCheck: 'spellcheck',
71
+ tabIndex: 'tabindex',
72
+ useMap: 'usemap',
73
+ srcDoc: 'srcdoc',
74
+ srcSet: 'srcset',
75
+ hrefLang: 'hreflang',
76
+ dateTime: 'datetime',
77
+ enterKeyHint: 'enterkeyhint',
78
+ inputMode: 'inputmode',
79
+ };
80
+ function normalizeAttrName(k) {
81
+ return ATTR_ALIAS[k] || k;
82
+ }
83
+ // ── Style object → CSS string ─────────────────────────────────────────
84
+ function camelToKebab(k) {
85
+ // Leave already-kebab keys and CSS custom props (--foo) alone.
86
+ if (k[0] === '-' || !/[A-Z]/.test(k))
87
+ return k;
88
+ return k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
89
+ }
90
+ // CSS properties that take unitless numbers (subset of React's list).
91
+ const UNITLESS = new Set([
92
+ 'animationIterationCount',
93
+ 'borderImageOutset',
94
+ 'borderImageSlice',
95
+ 'borderImageWidth',
96
+ 'boxFlex',
97
+ 'boxFlexGroup',
98
+ 'boxOrdinalGroup',
99
+ 'columnCount',
100
+ 'columns',
101
+ 'flex',
102
+ 'flexGrow',
103
+ 'flexShrink',
104
+ 'fontWeight',
105
+ 'gridArea',
106
+ 'gridColumn',
107
+ 'gridColumnEnd',
108
+ 'gridColumnStart',
109
+ 'gridRow',
110
+ 'gridRowEnd',
111
+ 'gridRowStart',
112
+ 'lineClamp',
113
+ 'lineHeight',
114
+ 'opacity',
115
+ 'order',
116
+ 'orphans',
117
+ 'tabSize',
118
+ 'widows',
119
+ 'zIndex',
120
+ 'zoom',
121
+ ]);
122
+ function styleObjToString(obj) {
123
+ let out = '';
124
+ for (const [k, v] of Object.entries(obj)) {
125
+ if (v == null || v === false)
126
+ continue;
127
+ let value;
128
+ if (typeof v === 'number') {
129
+ value = UNITLESS.has(k) ? String(v) : `${v}px`;
130
+ }
131
+ else if (typeof v === 'string') {
132
+ value = v;
133
+ }
134
+ else {
135
+ continue;
136
+ }
137
+ out += `${out ? ';' : ''}${camelToKebab(k)}:${value}`;
138
+ }
139
+ return out;
140
+ }
141
+ // ── Attribute rendering ──────────────────────────────────────────────
142
+ function renderAttrs(props) {
143
+ let out = '';
144
+ for (const k in props) {
145
+ if (k === 'children' || k === 'key' || k === 'ref' || k === '__source' || k === '__self')
146
+ continue;
147
+ const v = props[k];
148
+ if (v == null || v === false)
149
+ continue;
150
+ const name = normalizeAttrName(k);
151
+ // Boolean attribute
152
+ if (v === true) {
153
+ out += ` ${name}`;
154
+ continue;
155
+ }
156
+ // Inline style object
157
+ if (k === 'style' && typeof v === 'object') {
158
+ const css = styleObjToString(v);
159
+ if (css)
160
+ out += ` style="${escapeAttr(css)}"`;
161
+ continue;
162
+ }
163
+ // dangerouslySetInnerHTML is handled in JSXNode.toString(), skip here
164
+ if (k === 'dangerouslySetInnerHTML')
165
+ continue;
166
+ out += ` ${name}="${escapeAttr(String(v))}"`;
167
+ }
168
+ return out;
169
+ }
170
+ // ── Raw HTML escape hatch (pre-rendered HTML as a child) ─────────────
171
+ class RawHtml {
172
+ __isJSXNode = true;
173
+ tag = '__raw__';
174
+ props = {};
175
+ children = [];
176
+ html;
177
+ constructor(html) {
178
+ this.html = html;
179
+ }
180
+ toString() {
181
+ return this.html;
182
+ }
183
+ }
184
+ /** Wrap pre-rendered HTML so it's emitted verbatim as a JSX child. */
185
+ export function raw(html) {
186
+ return new RawHtml(html);
187
+ }
188
+ // ── Children rendering ───────────────────────────────────────────────
189
+ function renderChild(c) {
190
+ if (c == null || c === false || c === true)
191
+ return '';
192
+ if (typeof c === 'string')
193
+ return escapeHtml(c);
194
+ if (typeof c === 'number' || typeof c === 'bigint')
195
+ return String(c);
196
+ if (Array.isArray(c)) {
197
+ let s = '';
198
+ for (const item of c)
199
+ s += renderChild(item);
200
+ return s;
201
+ }
202
+ if (isJSXNode(c))
203
+ return c.toString();
204
+ return '';
205
+ }
206
+ // ── JSXNode ──────────────────────────────────────────────────────────
207
+ export class JSXNode {
208
+ __isJSXNode = true;
209
+ tag;
210
+ props;
211
+ children;
212
+ constructor(tag, props, children) {
213
+ this.tag = tag;
214
+ this.props = props;
215
+ this.children = children;
216
+ }
217
+ toString() {
218
+ const { tag, props, children } = this;
219
+ // Fragment / functional component
220
+ if (typeof tag === 'function') {
221
+ // Always pass children via props (React-compat)
222
+ const merged = { ...props, children: children.length === 1 ? children[0] : children };
223
+ const result = tag(merged);
224
+ return renderChild(result);
225
+ }
226
+ // Intrinsic element
227
+ const attrs = renderAttrs(props);
228
+ // dangerouslySetInnerHTML overrides children
229
+ const dsi = props.dangerouslySetInnerHTML;
230
+ if (dsi && typeof dsi.__html === 'string') {
231
+ return `<${tag}${attrs}>${dsi.__html}</${tag}>`;
232
+ }
233
+ if (VOID_ELEMENTS.has(tag)) {
234
+ // Self-closing for void elements
235
+ return `<${tag}${attrs}/>`;
236
+ }
237
+ let childHtml = '';
238
+ for (const c of children)
239
+ childHtml += renderChild(c);
240
+ return `<${tag}${attrs}>${childHtml}</${tag}>`;
241
+ }
242
+ }
243
+ export function isJSXNode(v) {
244
+ return typeof v === 'object' && v !== null && v.__isJSXNode === true;
245
+ }
246
+ // ── Public factory (React-compat: createElement / jsx) ────────────────
247
+ export function jsx(tag, props, ..._restChildren) {
248
+ const p = props ?? {};
249
+ const rawChildren = p.children;
250
+ const children = Array.isArray(rawChildren)
251
+ ? rawChildren
252
+ : rawChildren != null
253
+ ? [rawChildren]
254
+ : [];
255
+ // Strip children from props (it's stored separately)
256
+ const { children: _drop, ...rest } = p;
257
+ return new JSXNode(tag, rest, children);
258
+ }
259
+ /** React-compatible alias. */
260
+ export const createElement = jsx;
261
+ /** Fragment — renders children without a wrapper tag. */
262
+ export function Fragment(props) {
263
+ return props.children ?? null;
264
+ }
265
+ /** Check if something is a JSX element (React.isValidElement compat). */
266
+ export function isValidElement(v) {
267
+ return isJSXNode(v);
268
+ }
269
+ /** Convert any value (JSXNode, string, array, etc.) to an HTML string. */
270
+ export function renderToString(value) {
271
+ return renderChild(value);
272
+ }
273
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/jsx/runtime.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,2DAA2D;AAC3D,0EAA0E;AAC1E,qEAAqE;AACrE,2DAA2D;AAC3D,kEAAkE;AAClE,EAAE;AACF,qBAAqB;AACrB,yCAAyC;AACzC,wCAAwC;AACxC,EAAE;AACF,sEAAsE;AACtE,sDAAsD;AAItD,wEAAwE;AACxE,MAAM,GAAG,GAAG,IAAI,CAAA;AAChB,MAAM,EAAE,GAAG,IAAI,CAAA;AACf,MAAM,EAAE,GAAG,IAAI,CAAA;AACf,MAAM,EAAE,GAAG,IAAI,CAAA;AAEf,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AACxE,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;AACtD,CAAC;AAED,yEAAyE;AACzE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,MAAM;IACN,IAAI;IACJ,KAAK;IACL,OAAO;IACP,IAAI;IACJ,KAAK;IACL,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,KAAK;CACN,CAAC,CAAA;AAEF,yEAAyE;AACzE,MAAM,UAAU,GAA2B;IACzC,SAAS,EAAE,OAAO;IAClB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,eAAe;IAC9B,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,OAAO;IACrB,cAAc,EAAE,SAAS;IACzB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,cAAc,EAAE,gBAAgB;IAChC,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,WAAW;CACvB,CAAA;AAED,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,yEAAyE;AACzE,SAAS,YAAY,CAAC,CAAS;IAC7B,+DAA+D;IAC/D,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAC9C,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;AAC1D,CAAC;AAED,sEAAsE;AACtE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,yBAAyB;IACzB,mBAAmB;IACnB,kBAAkB;IAClB,kBAAkB;IAClB,SAAS;IACT,cAAc;IACd,iBAAiB;IACjB,aAAa;IACb,SAAS;IACT,MAAM;IACN,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,eAAe;IACf,iBAAiB;IACjB,SAAS;IACT,YAAY;IACZ,cAAc;IACd,WAAW;IACX,YAAY;IACZ,SAAS;IACT,OAAO;IACP,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;CACP,CAAC,CAAA;AAEF,SAAS,gBAAgB,CAAC,GAA4B;IACpD,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK;YAAE,SAAQ;QACtC,IAAI,KAAa,CAAA;QACjB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;QAChD,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;aAAM,CAAC;YACN,SAAQ;QACV,CAAC;QACD,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAA;IACvD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW,CAAC,KAAY;IAC/B,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,QAAQ;YACtF,SAAQ;QACV,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAClB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK;YAAE,SAAQ;QAEtC,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;QAEjC,oBAAoB;QACpB,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,GAAG,IAAI,IAAI,IAAI,EAAE,CAAA;YACjB,SAAQ;QACV,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAA4B,CAAC,CAAA;YAC1D,IAAI,GAAG;gBAAE,GAAG,IAAI,WAAW,UAAU,CAAC,GAAG,CAAC,GAAG,CAAA;YAC7C,SAAQ;QACV,CAAC;QAED,sEAAsE;QACtE,IAAI,CAAC,KAAK,yBAAyB;YAAE,SAAQ;QAE7C,GAAG,IAAI,IAAI,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAC9C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,wEAAwE;AACxE,MAAM,OAAO;IACF,WAAW,GAAG,IAAa,CAAA;IACpC,GAAG,GAAG,SAAS,CAAA;IACf,KAAK,GAAU,EAAE,CAAA;IACjB,QAAQ,GAAY,EAAE,CAAA;IACtB,IAAI,CAAQ;IACZ,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;AAC1B,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW,CAAC,CAAQ;IAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IACrD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAA;IAC/C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IACpE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,CAAA;QACV,KAAK,MAAM,IAAI,IAAI,CAAC;YAAE,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;QAC5C,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;IACrC,OAAO,EAAE,CAAA;AACX,CAAC;AAED,wEAAwE;AACxE,MAAM,OAAO,OAAO;IACT,WAAW,GAAG,IAAa,CAAA;IACpC,GAAG,CAAoB;IACvB,KAAK,CAAO;IACZ,QAAQ,CAAS;IAEjB,YAAY,GAAuB,EAAE,KAAY,EAAE,QAAiB;QAClE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED,QAAQ;QACN,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QAErC,kCAAkC;QAClC,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,gDAAgD;YAChD,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YACrF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;YAC1B,OAAO,WAAW,CAAC,MAAe,CAAC,CAAA;QACrC,CAAC;QAED,oBAAoB;QACpB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;QAEhC,6CAA6C;QAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,uBAA0D,CAAA;QAC5E,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,GAAG,CAAA;QACjD,CAAC;QAED,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,iCAAiC;YACjC,OAAO,IAAI,GAAG,GAAG,KAAK,IAAI,CAAA;QAC5B,CAAC;QAED,IAAI,SAAS,GAAG,EAAE,CAAA;QAClB,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;QAErD,OAAO,IAAI,GAAG,GAAG,KAAK,IAAI,SAAS,KAAK,GAAG,GAAG,CAAA;IAChD,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAiB,CAAC,WAAW,KAAK,IAAI,CAAA;AACvF,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,GAAG,CACjB,GAAuB,EACvB,KAAmB,EACnB,GAAG,aAAwB;IAE3B,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAA;IACrB,MAAM,WAAW,GAAI,CAA0B,CAAC,QAAQ,CAAA;IACxD,MAAM,QAAQ,GAAY,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAClD,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,WAAW,IAAI,IAAI;YACnB,CAAC,CAAC,CAAC,WAAW,CAAC;YACf,CAAC,CAAC,EAAE,CAAA;IACR,qDAAqD;IACrD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,CAAiC,CAAA;IACtE,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAEhC,yDAAyD;AACzD,MAAM,UAAU,QAAQ,CAAC,KAA2B;IAClD,OAAO,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAA;AAC/B,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,CAAU;IACvC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAA;AACrB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,KAAY;IACzC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,30 @@
1
+ export type Props = Record<string, unknown>;
2
+ export type Child = string | number | bigint | boolean | null | undefined | JSXNodeLike | Child[];
3
+ export interface JSXNodeLike {
4
+ readonly __isJSXNode: true;
5
+ tag: string | Component;
6
+ props: Props;
7
+ children: Child[];
8
+ toString(): string;
9
+ }
10
+ export type Component<P = Props> = (props: P & {
11
+ children?: Child;
12
+ }) => Child;
13
+ /** React-compatible alias used by most user code. */
14
+ export type FC<P = Props> = Component<P>;
15
+ /** For component refs / cloning. */
16
+ export type Element = JSXNodeLike;
17
+ declare global {
18
+ namespace JSX {
19
+ type Element = JSXNodeLike;
20
+ interface ElementChildrenAttribute {
21
+ children: object;
22
+ }
23
+ interface IntrinsicElements {
24
+ [tagName: string]: Record<string, unknown> & {
25
+ children?: Child;
26
+ };
27
+ }
28
+ }
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jsx/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3C,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,EAAE,CAAA;AAEjG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IACvB,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,KAAK,EAAE,CAAA;IACjB,QAAQ,IAAI,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,KAAK,KAAK,CAAA;AAE7E,qDAAqD;AACrD,MAAM,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAA;AAExC,oCAAoC;AACpC,MAAM,MAAM,OAAO,GAAG,WAAW,CAAA;AAEjC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,KAAK,OAAO,GAAG,WAAW,CAAA;QAC1B,UAAU,wBAAwB;YAChC,QAAQ,EAAE,MAAM,CAAA;SACjB;QAID,UAAU,iBAAiB;YACzB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;gBAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;aAAE,CAAA;SAClE;KACF;CACF"}
@@ -0,0 +1,3 @@
1
+ // Public JSX types for murasaki/jsx.
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/jsx/types.ts"],"names":[],"mappings":"AAAA,qCAAqC"}
@@ -0,0 +1,8 @@
1
+ import type { Route } from './routes.ts';
2
+ type BundleInput = {
3
+ routes: Route[];
4
+ rootLayoutFile: string | null;
5
+ };
6
+ export declare function bundleClient({ routes, rootLayoutFile }: BundleInput): Promise<string>;
7
+ export {};
8
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/runtime/bundle.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAsB,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA4F3F"}
@@ -0,0 +1,98 @@
1
+ // Generates the client-side JavaScript bundle that hydrates the WebView.
2
+ //
3
+ // We synthesize an entry that:
4
+ // 1. imports every page module (from src/app/.../page.tsx)
5
+ // 2. imports the root layout (if present)
6
+ // 3. wires hash-based routing
7
+ // 4. calls createRoot on #murasaki-root and re-renders on hashchange
8
+ //
9
+ // esbuild bundles the synthesized entry through the user's filesystem
10
+ // (resolveDir = projectRoot), pulling in murasaki/jsx/dom and the user's
11
+ // own code. The output is an IIFE that runs as soon as the <script> loads.
12
+ import * as esbuild from 'esbuild';
13
+ import { projectRoot } from "../env.js";
14
+ export async function bundleClient({ routes, rootLayoutFile }) {
15
+ // Each route gets a numbered Page import so we can wire them by URL path.
16
+ const pageImports = routes
17
+ .map((r, i) => `import Page${i} from ${JSON.stringify(r.pageFile)}`)
18
+ .join('\n');
19
+ const layoutImport = rootLayoutFile
20
+ ? `import RootLayout from ${JSON.stringify(rootLayoutFile)}`
21
+ : '';
22
+ // path → Page component map
23
+ const routesMap = routes.map((r, i) => ` ${JSON.stringify(r.path)}: Page${i},`).join('\n');
24
+ const wrap = rootLayoutFile ? 'jsx(RootLayout, { children: jsx(Page, null) })' : 'jsx(Page, null)';
25
+ const entry = `
26
+ ${pageImports}
27
+ ${layoutImport}
28
+ import { createRoot, jsx } from 'murasaki/jsx/dom'
29
+
30
+ const ROUTES = {
31
+ ${routesMap}
32
+ }
33
+
34
+ function currentPath() {
35
+ const h = (typeof location !== 'undefined' && location.hash) || ''
36
+ return h.startsWith('#') ? (h.slice(1) || '/') : '/'
37
+ }
38
+
39
+ const container = document.getElementById('murasaki-root')
40
+ if (!container) {
41
+ throw new Error('[murasaki] mount point #murasaki-root not found')
42
+ }
43
+ container.textContent = ''
44
+
45
+ let _root
46
+ function render() {
47
+ const path = currentPath()
48
+ const Page = ROUTES[path] || ROUTES['/']
49
+ if (!Page) {
50
+ container.textContent = '404'
51
+ return
52
+ }
53
+ const tree = ${wrap}
54
+ if (!_root) _root = createRoot(container)
55
+ _root.render(tree)
56
+ }
57
+
58
+ render()
59
+ window.addEventListener('hashchange', render)
60
+
61
+ // Intercept anchor clicks marked with data-murasaki-link
62
+ document.addEventListener('click', function (e) {
63
+ let t = e.target
64
+ while (t && t.nodeType === 1) {
65
+ if (t.tagName === 'A' && t.hasAttribute('data-murasaki-link')) {
66
+ e.preventDefault()
67
+ const href = t.getAttribute('data-murasaki-link')
68
+ if ('#' + href !== location.hash) location.hash = href
69
+ else render()
70
+ return
71
+ }
72
+ t = t.parentNode
73
+ }
74
+ })
75
+ `;
76
+ const result = await esbuild.build({
77
+ stdin: {
78
+ contents: entry,
79
+ loader: 'tsx',
80
+ resolveDir: projectRoot,
81
+ sourcefile: '<murasaki-client-entry>.tsx',
82
+ },
83
+ bundle: true,
84
+ write: false,
85
+ format: 'iife',
86
+ target: ['safari16', 'chrome120', 'firefox120'],
87
+ jsx: 'automatic',
88
+ jsxImportSource: 'murasaki',
89
+ minify: false,
90
+ sourcemap: 'inline',
91
+ logLevel: 'silent',
92
+ });
93
+ if (result.errors.length) {
94
+ throw new Error(`[murasaki] client bundle failed:\n${result.errors.map((e) => e.text).join('\n')}`);
95
+ }
96
+ return result.outputFiles[0].text;
97
+ }
98
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/runtime/bundle.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,+BAA+B;AAC/B,6DAA6D;AAC7D,4CAA4C;AAC5C,gCAAgC;AAChC,uEAAuE;AACvE,EAAE;AACF,sEAAsE;AACtE,yEAAyE;AACzE,2EAA2E;AAE3E,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAQvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAe;IACxE,0EAA0E;IAC1E,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;SACnE,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE;QAC5D,CAAC,CAAC,EAAE,CAAA;IAEN,4BAA4B;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE3F,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAElG,MAAM,KAAK,GAAG;EACd,WAAW;EACX,YAAY;;;;EAIZ,SAAS;;;;;;;;;;;;;;;;;;;;;;iBAsBM,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBpB,CAAA;IAEC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;QACjC,KAAK,EAAE;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,6BAA6B;SAC1C;QACD,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC;QAC/C,GAAG,EAAE,WAAW;QAChB,eAAe,EAAE,UAAU;QAC3B,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAA;IAEF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnF,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setupHmr(onChange: (filename: string) => void): void;
2
+ //# sourceMappingURL=hmr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmr.d.ts","sourceRoot":"","sources":["../../src/runtime/hmr.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAmBnE"}
@@ -0,0 +1,28 @@
1
+ // File watcher for src/ — debounces multi-event saves and triggers reload.
2
+ import { existsSync, watch } from 'node:fs';
3
+ import { printHint } from "../cli/log.js";
4
+ import { SRC_DIR } from "../env.js";
5
+ export function setupHmr(onChange) {
6
+ if (!existsSync(SRC_DIR)) {
7
+ printHint('src/ directory not found — nothing to watch');
8
+ return;
9
+ }
10
+ let debounce = null;
11
+ let lastFile = '';
12
+ try {
13
+ watch(SRC_DIR, { recursive: true }, (_event, filename) => {
14
+ if (!filename)
15
+ return;
16
+ if (debounce)
17
+ clearTimeout(debounce);
18
+ lastFile = filename.toString();
19
+ debounce = setTimeout(() => {
20
+ onChange(lastFile);
21
+ }, 80);
22
+ });
23
+ }
24
+ catch (e) {
25
+ printHint(`HMR watcher failed: ${e.message}`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=hmr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmr.js","sourceRoot":"","sources":["../../src/runtime/hmr.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,UAAU,QAAQ,CAAC,QAAoC;IAC3D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,6CAA6C,CAAC,CAAA;QACxD,OAAM;IACR,CAAC;IACD,IAAI,QAAQ,GAA0B,IAAI,CAAA;IAC1C,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,IAAI,CAAC;QACH,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACvD,IAAI,CAAC,QAAQ;gBAAE,OAAM;YACrB,IAAI,QAAQ;gBAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;YACpC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAA;YAC9B,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE;gBACzB,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACpB,CAAC,EAAE,EAAE,CAAC,CAAA;QACR,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,SAAS,CAAC,uBAAuB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderResult } from '../types.ts';
2
+ export declare function renderApp(): Promise<RenderResult>;
3
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/runtime/render.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAmJ/C,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAUvD"}