@blinkk/root 3.1.4 → 3.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-AJR6VAT7.js +694 -0
- package/dist/chunk-AJR6VAT7.js.map +7 -0
- package/dist/core/types.d.ts +7 -0
- package/dist/jsx/jsx-render.d.ts +6 -1
- package/dist/jsx.js +1 -1
- package/dist/render/render.d.ts +3 -0
- package/dist/render.js +16 -10
- package/dist/render.js.map +2 -2
- package/package.json +1 -1
- package/dist/chunk-OQRFLH2X.js +0 -545
- package/dist/chunk-OQRFLH2X.js.map +0 -7
package/package.json
CHANGED
package/dist/chunk-OQRFLH2X.js
DELETED
|
@@ -1,545 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Fragment
|
|
3
|
-
} from "./chunk-3Z5TNZEP.js";
|
|
4
|
-
|
|
5
|
-
// src/jsx/jsx-render.ts
|
|
6
|
-
import { options as preactOptions } from "preact";
|
|
7
|
-
var VOID_ELEMENTS = /* @__PURE__ */ new Set([
|
|
8
|
-
"area",
|
|
9
|
-
"base",
|
|
10
|
-
"br",
|
|
11
|
-
"col",
|
|
12
|
-
"embed",
|
|
13
|
-
"hr",
|
|
14
|
-
"img",
|
|
15
|
-
"input",
|
|
16
|
-
"link",
|
|
17
|
-
"meta",
|
|
18
|
-
"param",
|
|
19
|
-
"source",
|
|
20
|
-
"track",
|
|
21
|
-
"wbr"
|
|
22
|
-
]);
|
|
23
|
-
var RAW_CONTENT_ELEMENTS = /* @__PURE__ */ new Set(["pre", "textarea", "script", "style"]);
|
|
24
|
-
var DEFAULT_BLOCK_ELEMENTS = /* @__PURE__ */ new Set([
|
|
25
|
-
"address",
|
|
26
|
-
"article",
|
|
27
|
-
"aside",
|
|
28
|
-
"base",
|
|
29
|
-
"blockquote",
|
|
30
|
-
"body",
|
|
31
|
-
"dd",
|
|
32
|
-
"details",
|
|
33
|
-
"dialog",
|
|
34
|
-
"div",
|
|
35
|
-
"dl",
|
|
36
|
-
"dt",
|
|
37
|
-
"fieldset",
|
|
38
|
-
"figcaption",
|
|
39
|
-
"figure",
|
|
40
|
-
"footer",
|
|
41
|
-
"form",
|
|
42
|
-
"h1",
|
|
43
|
-
"h2",
|
|
44
|
-
"h3",
|
|
45
|
-
"h4",
|
|
46
|
-
"h5",
|
|
47
|
-
"h6",
|
|
48
|
-
"head",
|
|
49
|
-
"header",
|
|
50
|
-
"hgroup",
|
|
51
|
-
"hr",
|
|
52
|
-
"html",
|
|
53
|
-
"li",
|
|
54
|
-
"link",
|
|
55
|
-
"main",
|
|
56
|
-
"meta",
|
|
57
|
-
"nav",
|
|
58
|
-
"noscript",
|
|
59
|
-
"ol",
|
|
60
|
-
"optgroup",
|
|
61
|
-
"option",
|
|
62
|
-
"p",
|
|
63
|
-
"pre",
|
|
64
|
-
"script",
|
|
65
|
-
"search",
|
|
66
|
-
"section",
|
|
67
|
-
"select",
|
|
68
|
-
"style",
|
|
69
|
-
"summary",
|
|
70
|
-
"table",
|
|
71
|
-
"tbody",
|
|
72
|
-
"td",
|
|
73
|
-
"tfoot",
|
|
74
|
-
"th",
|
|
75
|
-
"thead",
|
|
76
|
-
"title",
|
|
77
|
-
"tr",
|
|
78
|
-
"ul"
|
|
79
|
-
]);
|
|
80
|
-
var ALWAYS_BLOCK_ELEMENTS = /* @__PURE__ */ new Set([
|
|
81
|
-
"base",
|
|
82
|
-
"link",
|
|
83
|
-
"meta",
|
|
84
|
-
"script",
|
|
85
|
-
"style",
|
|
86
|
-
"title"
|
|
87
|
-
]);
|
|
88
|
-
var BOOLEAN_ATTRS = /* @__PURE__ */ new Set([
|
|
89
|
-
"allowfullscreen",
|
|
90
|
-
"async",
|
|
91
|
-
"autofocus",
|
|
92
|
-
"autoplay",
|
|
93
|
-
"capture",
|
|
94
|
-
"checked",
|
|
95
|
-
"controls",
|
|
96
|
-
"default",
|
|
97
|
-
"defer",
|
|
98
|
-
"disabled",
|
|
99
|
-
"disableremoteplayback",
|
|
100
|
-
"download",
|
|
101
|
-
"draggable",
|
|
102
|
-
"formnovalidate",
|
|
103
|
-
"hidden",
|
|
104
|
-
"inert",
|
|
105
|
-
"ismap",
|
|
106
|
-
"itemscope",
|
|
107
|
-
"loop",
|
|
108
|
-
"multiple",
|
|
109
|
-
"muted",
|
|
110
|
-
"nomodule",
|
|
111
|
-
"novalidate",
|
|
112
|
-
"open",
|
|
113
|
-
"playsinline",
|
|
114
|
-
"popover",
|
|
115
|
-
"readonly",
|
|
116
|
-
"required",
|
|
117
|
-
"reversed",
|
|
118
|
-
"selected"
|
|
119
|
-
]);
|
|
120
|
-
var PROP_TO_ATTR = {
|
|
121
|
-
acceptCharset: "accept-charset",
|
|
122
|
-
autoCapitalize: "autocapitalize",
|
|
123
|
-
autoComplete: "autocomplete",
|
|
124
|
-
autoFocus: "autofocus",
|
|
125
|
-
autoPlay: "autoplay",
|
|
126
|
-
charSet: "charset",
|
|
127
|
-
className: "class",
|
|
128
|
-
colSpan: "colspan",
|
|
129
|
-
contentEditable: "contenteditable",
|
|
130
|
-
crossOrigin: "crossorigin",
|
|
131
|
-
dateTime: "datetime",
|
|
132
|
-
disableRemotePlayback: "disableremoteplayback",
|
|
133
|
-
encType: "enctype",
|
|
134
|
-
formAction: "formaction",
|
|
135
|
-
formEncType: "formenctype",
|
|
136
|
-
formMethod: "formmethod",
|
|
137
|
-
formNoValidate: "formnovalidate",
|
|
138
|
-
formTarget: "formtarget",
|
|
139
|
-
frameBorder: "frameborder",
|
|
140
|
-
hrefLang: "hreflang",
|
|
141
|
-
htmlFor: "for",
|
|
142
|
-
httpEquiv: "http-equiv",
|
|
143
|
-
inputMode: "inputmode",
|
|
144
|
-
itemProp: "itemprop",
|
|
145
|
-
itemRef: "itemref",
|
|
146
|
-
itemScope: "itemscope",
|
|
147
|
-
itemType: "itemtype",
|
|
148
|
-
maxLength: "maxlength",
|
|
149
|
-
mediaGroup: "mediagroup",
|
|
150
|
-
minLength: "minlength",
|
|
151
|
-
noModule: "nomodule",
|
|
152
|
-
noValidate: "novalidate",
|
|
153
|
-
playsInline: "playsinline",
|
|
154
|
-
readOnly: "readonly",
|
|
155
|
-
referrerPolicy: "referrerpolicy",
|
|
156
|
-
rowSpan: "rowspan",
|
|
157
|
-
spellCheck: "spellcheck",
|
|
158
|
-
srcDoc: "srcdoc",
|
|
159
|
-
srcLang: "srclang",
|
|
160
|
-
srcSet: "srcset",
|
|
161
|
-
tabIndex: "tabindex",
|
|
162
|
-
useMap: "usemap",
|
|
163
|
-
// SVG presentation attributes (camelCase -> kebab-case).
|
|
164
|
-
clipPath: "clip-path",
|
|
165
|
-
clipRule: "clip-rule",
|
|
166
|
-
colorInterpolation: "color-interpolation",
|
|
167
|
-
colorInterpolationFilters: "color-interpolation-filters",
|
|
168
|
-
dominantBaseline: "dominant-baseline",
|
|
169
|
-
fillOpacity: "fill-opacity",
|
|
170
|
-
fillRule: "fill-rule",
|
|
171
|
-
floodColor: "flood-color",
|
|
172
|
-
floodOpacity: "flood-opacity",
|
|
173
|
-
imageRendering: "image-rendering",
|
|
174
|
-
letterSpacing: "letter-spacing",
|
|
175
|
-
lightingColor: "lighting-color",
|
|
176
|
-
markerEnd: "marker-end",
|
|
177
|
-
markerMid: "marker-mid",
|
|
178
|
-
markerStart: "marker-start",
|
|
179
|
-
paintOrder: "paint-order",
|
|
180
|
-
pointerEvents: "pointer-events",
|
|
181
|
-
shapeRendering: "shape-rendering",
|
|
182
|
-
stopColor: "stop-color",
|
|
183
|
-
stopOpacity: "stop-opacity",
|
|
184
|
-
strokeDasharray: "stroke-dasharray",
|
|
185
|
-
strokeDashoffset: "stroke-dashoffset",
|
|
186
|
-
strokeLinecap: "stroke-linecap",
|
|
187
|
-
strokeLinejoin: "stroke-linejoin",
|
|
188
|
-
strokeMiterlimit: "stroke-miterlimit",
|
|
189
|
-
strokeOpacity: "stroke-opacity",
|
|
190
|
-
strokeWidth: "stroke-width",
|
|
191
|
-
textAnchor: "text-anchor",
|
|
192
|
-
textDecoration: "text-decoration",
|
|
193
|
-
textRendering: "text-rendering",
|
|
194
|
-
transformOrigin: "transform-origin",
|
|
195
|
-
vectorEffect: "vector-effect",
|
|
196
|
-
wordSpacing: "word-spacing",
|
|
197
|
-
writingMode: "writing-mode"
|
|
198
|
-
};
|
|
199
|
-
var AMP = "&";
|
|
200
|
-
var LT = "<";
|
|
201
|
-
var GT = ">";
|
|
202
|
-
var QUOT = """;
|
|
203
|
-
var HTML_ESCAPE_RE = /[&<>]/;
|
|
204
|
-
var ATTR_ESCAPE_RE = /[&<>"]/;
|
|
205
|
-
var EMPTY_GLOBAL_CTX = {};
|
|
206
|
-
function isDef(value) {
|
|
207
|
-
return value !== null && value !== void 0;
|
|
208
|
-
}
|
|
209
|
-
function escapeHtml(str) {
|
|
210
|
-
if (!HTML_ESCAPE_RE.test(str)) return str;
|
|
211
|
-
let result = "";
|
|
212
|
-
let last = 0;
|
|
213
|
-
for (let i = 0; i < str.length; i++) {
|
|
214
|
-
const ch = str.charCodeAt(i);
|
|
215
|
-
let escaped;
|
|
216
|
-
if (ch === 38) escaped = AMP;
|
|
217
|
-
else if (ch === 60) escaped = LT;
|
|
218
|
-
else if (ch === 62) escaped = GT;
|
|
219
|
-
if (escaped) {
|
|
220
|
-
result += str.slice(last, i) + escaped;
|
|
221
|
-
last = i + 1;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return result + str.slice(last);
|
|
225
|
-
}
|
|
226
|
-
function escapeAttr(str) {
|
|
227
|
-
if (!ATTR_ESCAPE_RE.test(str)) return str;
|
|
228
|
-
let result = "";
|
|
229
|
-
let last = 0;
|
|
230
|
-
for (let i = 0; i < str.length; i++) {
|
|
231
|
-
const ch = str.charCodeAt(i);
|
|
232
|
-
let escaped;
|
|
233
|
-
if (ch === 38) escaped = AMP;
|
|
234
|
-
else if (ch === 34) escaped = QUOT;
|
|
235
|
-
else if (ch === 60) escaped = LT;
|
|
236
|
-
else if (ch === 62) escaped = GT;
|
|
237
|
-
if (escaped) {
|
|
238
|
-
result += str.slice(last, i) + escaped;
|
|
239
|
-
last = i + 1;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
return result + str.slice(last);
|
|
243
|
-
}
|
|
244
|
-
var STYLE_KEY_CACHE = /* @__PURE__ */ new Map();
|
|
245
|
-
var UPPERCASE_RE = /[A-Z]/g;
|
|
246
|
-
function toKebabCase(key) {
|
|
247
|
-
let cached = STYLE_KEY_CACHE.get(key);
|
|
248
|
-
if (cached === void 0) {
|
|
249
|
-
cached = key.replace(UPPERCASE_RE, (m) => "-" + m.toLowerCase());
|
|
250
|
-
STYLE_KEY_CACHE.set(key, cached);
|
|
251
|
-
}
|
|
252
|
-
return cached;
|
|
253
|
-
}
|
|
254
|
-
function styleToString(style) {
|
|
255
|
-
let result = "";
|
|
256
|
-
let first = true;
|
|
257
|
-
for (const key in style) {
|
|
258
|
-
const value = style[key];
|
|
259
|
-
if (!isDef(value) || value === "") continue;
|
|
260
|
-
if (first) {
|
|
261
|
-
first = false;
|
|
262
|
-
} else {
|
|
263
|
-
result += ";";
|
|
264
|
-
}
|
|
265
|
-
result += `${toKebabCase(key)}:${value}`;
|
|
266
|
-
}
|
|
267
|
-
return result;
|
|
268
|
-
}
|
|
269
|
-
function renderJsxToString(vnode, options) {
|
|
270
|
-
const mode = options?.mode ?? "pretty";
|
|
271
|
-
const isPretty = mode === "pretty";
|
|
272
|
-
let blockSet = DEFAULT_BLOCK_ELEMENTS;
|
|
273
|
-
if (isPretty && options?.blockElements && options.blockElements.length > 0) {
|
|
274
|
-
const merged = new Set(DEFAULT_BLOCK_ELEMENTS);
|
|
275
|
-
for (const el of options.blockElements) {
|
|
276
|
-
merged.add(el);
|
|
277
|
-
}
|
|
278
|
-
blockSet = merged;
|
|
279
|
-
}
|
|
280
|
-
let contextStacks;
|
|
281
|
-
let ctxVersion = 0;
|
|
282
|
-
let cachedGlobalCtx = EMPTY_GLOBAL_CTX;
|
|
283
|
-
let cachedGlobalCtxVersion = 0;
|
|
284
|
-
let nlFlag = false;
|
|
285
|
-
function pushCtx(contextId, value) {
|
|
286
|
-
if (!contextStacks) {
|
|
287
|
-
contextStacks = /* @__PURE__ */ new Map();
|
|
288
|
-
}
|
|
289
|
-
let stack = contextStacks.get(contextId);
|
|
290
|
-
if (!stack) {
|
|
291
|
-
stack = [];
|
|
292
|
-
contextStacks.set(contextId, stack);
|
|
293
|
-
}
|
|
294
|
-
stack.push(value);
|
|
295
|
-
ctxVersion++;
|
|
296
|
-
}
|
|
297
|
-
function popCtx(contextId) {
|
|
298
|
-
const stack = contextStacks?.get(contextId);
|
|
299
|
-
if (stack) {
|
|
300
|
-
stack.pop();
|
|
301
|
-
if (stack.length === 0) {
|
|
302
|
-
contextStacks?.delete(contextId);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
ctxVersion++;
|
|
306
|
-
}
|
|
307
|
-
function buildGlobalContext() {
|
|
308
|
-
if (ctxVersion === cachedGlobalCtxVersion) return cachedGlobalCtx;
|
|
309
|
-
if (!contextStacks || contextStacks.size === 0) {
|
|
310
|
-
cachedGlobalCtx = EMPTY_GLOBAL_CTX;
|
|
311
|
-
cachedGlobalCtxVersion = ctxVersion;
|
|
312
|
-
return cachedGlobalCtx;
|
|
313
|
-
}
|
|
314
|
-
const globalCtx = {};
|
|
315
|
-
for (const [contextId, stack] of contextStacks) {
|
|
316
|
-
if (stack.length > 0) {
|
|
317
|
-
globalCtx[contextId] = {
|
|
318
|
-
props: { value: stack[stack.length - 1] },
|
|
319
|
-
sub: noop
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
cachedGlobalCtx = globalCtx;
|
|
324
|
-
cachedGlobalCtxVersion = ctxVersion;
|
|
325
|
-
return globalCtx;
|
|
326
|
-
}
|
|
327
|
-
function render(node, inline) {
|
|
328
|
-
if (!isDef(node) || typeof node === "boolean") {
|
|
329
|
-
nlFlag = false;
|
|
330
|
-
return "";
|
|
331
|
-
}
|
|
332
|
-
if (typeof node === "string") {
|
|
333
|
-
nlFlag = isPretty && node.indexOf("\n") >= 0;
|
|
334
|
-
return escapeHtml(node);
|
|
335
|
-
}
|
|
336
|
-
if (typeof node === "number" || typeof node === "bigint") {
|
|
337
|
-
nlFlag = false;
|
|
338
|
-
return String(node);
|
|
339
|
-
}
|
|
340
|
-
if (Array.isArray(node)) {
|
|
341
|
-
let out = "";
|
|
342
|
-
let anyNewline = false;
|
|
343
|
-
for (let i = 0; i < node.length; i++) {
|
|
344
|
-
out += render(node[i], inline);
|
|
345
|
-
anyNewline = anyNewline || nlFlag;
|
|
346
|
-
}
|
|
347
|
-
nlFlag = anyNewline;
|
|
348
|
-
return out;
|
|
349
|
-
}
|
|
350
|
-
if (typeof node !== "object" || !("type" in node)) {
|
|
351
|
-
nlFlag = false;
|
|
352
|
-
return "";
|
|
353
|
-
}
|
|
354
|
-
const { type, props } = node;
|
|
355
|
-
if (type === Fragment) {
|
|
356
|
-
return renderChildren(props?.children);
|
|
357
|
-
}
|
|
358
|
-
if (typeof type === "function") {
|
|
359
|
-
return renderComponent(node);
|
|
360
|
-
}
|
|
361
|
-
if (typeof type === "string") {
|
|
362
|
-
return renderElement(type, props, inline);
|
|
363
|
-
}
|
|
364
|
-
return "";
|
|
365
|
-
}
|
|
366
|
-
function renderComponent(vnode2) {
|
|
367
|
-
const { type, props } = vnode2;
|
|
368
|
-
const fn = type;
|
|
369
|
-
const fnAny = fn;
|
|
370
|
-
if (fnAny._isProvider && fnAny._context) {
|
|
371
|
-
const ctx = fnAny._context;
|
|
372
|
-
ctx._stack.push(props.value);
|
|
373
|
-
const result = renderChildren(props.children);
|
|
374
|
-
ctx._stack.pop();
|
|
375
|
-
return result;
|
|
376
|
-
}
|
|
377
|
-
let contextId;
|
|
378
|
-
if (typeof fnAny.__c === "string" && fnAny.__c.startsWith("__cC")) {
|
|
379
|
-
contextId = fnAny.__c;
|
|
380
|
-
} else if (fnAny.__ && typeof fnAny.__ === "object" && fnAny.__.__c) {
|
|
381
|
-
contextId = fnAny.__.__c;
|
|
382
|
-
}
|
|
383
|
-
if (contextId) {
|
|
384
|
-
pushCtx(contextId, props.value);
|
|
385
|
-
const result = renderChildren(props.children);
|
|
386
|
-
popCtx(contextId);
|
|
387
|
-
return result;
|
|
388
|
-
}
|
|
389
|
-
if (fn.contextType) {
|
|
390
|
-
const ctx = fn.contextType;
|
|
391
|
-
const ctxId = ctx.__c;
|
|
392
|
-
const stack = contextStacks?.get(ctxId);
|
|
393
|
-
const value = stack && stack.length > 0 ? stack[stack.length - 1] : ctx.__;
|
|
394
|
-
if (typeof props.children === "function") {
|
|
395
|
-
return render(props.children(value));
|
|
396
|
-
}
|
|
397
|
-
return renderChildren(props.children);
|
|
398
|
-
}
|
|
399
|
-
const component = {
|
|
400
|
-
props,
|
|
401
|
-
context: buildGlobalContext(),
|
|
402
|
-
state: {},
|
|
403
|
-
__v: vnode2,
|
|
404
|
-
// _vnode
|
|
405
|
-
__d: false,
|
|
406
|
-
// _dirty
|
|
407
|
-
__h: [],
|
|
408
|
-
// _renderCallbacks
|
|
409
|
-
__s: {},
|
|
410
|
-
// _nextState
|
|
411
|
-
__H: null
|
|
412
|
-
// _hooks (initialised by hooks addon)
|
|
413
|
-
};
|
|
414
|
-
vnode2.__c = component;
|
|
415
|
-
preactOptions.__b?.(vnode2);
|
|
416
|
-
preactOptions.__r?.(vnode2);
|
|
417
|
-
try {
|
|
418
|
-
if (fn.prototype && fn.prototype.render) {
|
|
419
|
-
const instance = new fn(props, component.context);
|
|
420
|
-
instance.__n = component.__n;
|
|
421
|
-
instance.__H = component.__H;
|
|
422
|
-
vnode2.__c = instance;
|
|
423
|
-
preactOptions.__r?.(vnode2);
|
|
424
|
-
return render(instance.render(instance.props, instance.state));
|
|
425
|
-
}
|
|
426
|
-
const rendered = fn(props, component.context);
|
|
427
|
-
return render(rendered);
|
|
428
|
-
} finally {
|
|
429
|
-
preactOptions.diffed?.(vnode2);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
function renderElement(tag, props, inline) {
|
|
433
|
-
const isBlock = isPretty && (ALWAYS_BLOCK_ELEMENTS.has(tag) || !inline && blockSet.has(tag));
|
|
434
|
-
const isVoid = VOID_ELEMENTS.has(tag);
|
|
435
|
-
const attrs = renderAttrs(tag, props);
|
|
436
|
-
let result = "<" + tag + attrs + ">";
|
|
437
|
-
if (isVoid) {
|
|
438
|
-
if (isBlock) {
|
|
439
|
-
result += "\n";
|
|
440
|
-
nlFlag = true;
|
|
441
|
-
} else {
|
|
442
|
-
nlFlag = false;
|
|
443
|
-
}
|
|
444
|
-
return result;
|
|
445
|
-
}
|
|
446
|
-
let inner = "";
|
|
447
|
-
let innerHasNewline = false;
|
|
448
|
-
if (isDef(props?.dangerouslySetInnerHTML?.__html)) {
|
|
449
|
-
inner = props.dangerouslySetInnerHTML.__html;
|
|
450
|
-
innerHasNewline = isPretty && inner.includes("\n");
|
|
451
|
-
} else if (isDef(props?.children)) {
|
|
452
|
-
inner = renderChildren(props.children);
|
|
453
|
-
innerHasNewline = nlFlag;
|
|
454
|
-
} else if (tag === "textarea" && props) {
|
|
455
|
-
const textVal = props.value ?? props.defaultValue;
|
|
456
|
-
if (isDef(textVal)) {
|
|
457
|
-
inner = escapeHtml(String(textVal));
|
|
458
|
-
innerHasNewline = isPretty && inner.includes("\n");
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
if (isBlock) {
|
|
462
|
-
const hasBlockChildren = !RAW_CONTENT_ELEMENTS.has(tag) && innerHasNewline;
|
|
463
|
-
if (hasBlockChildren) {
|
|
464
|
-
result += "\n" + inner + "</" + tag + ">\n";
|
|
465
|
-
} else {
|
|
466
|
-
result += inner + "</" + tag + ">\n";
|
|
467
|
-
}
|
|
468
|
-
nlFlag = true;
|
|
469
|
-
} else {
|
|
470
|
-
result += inner + "</" + tag + ">";
|
|
471
|
-
nlFlag = innerHasNewline;
|
|
472
|
-
}
|
|
473
|
-
return result;
|
|
474
|
-
}
|
|
475
|
-
function renderAttrs(tag, props) {
|
|
476
|
-
if (!props) return "";
|
|
477
|
-
let result = "";
|
|
478
|
-
for (const key in props) {
|
|
479
|
-
if (key === "children" || key === "dangerouslySetInnerHTML" || key === "key" || key === "ref" || key === "__self" || key === "__source") {
|
|
480
|
-
continue;
|
|
481
|
-
}
|
|
482
|
-
if (tag === "textarea" && (key === "value" || key === "defaultValue")) {
|
|
483
|
-
continue;
|
|
484
|
-
}
|
|
485
|
-
let value = props[key];
|
|
486
|
-
if (!isDef(value)) continue;
|
|
487
|
-
if (typeof value === "function") continue;
|
|
488
|
-
const attrName = PROP_TO_ATTR[key] || key;
|
|
489
|
-
if (value === false && BOOLEAN_ATTRS.has(attrName)) continue;
|
|
490
|
-
if (value === true && BOOLEAN_ATTRS.has(attrName)) {
|
|
491
|
-
result += " " + attrName;
|
|
492
|
-
continue;
|
|
493
|
-
}
|
|
494
|
-
if (key === "style" && typeof value === "object") {
|
|
495
|
-
value = styleToString(value);
|
|
496
|
-
if (!value) continue;
|
|
497
|
-
}
|
|
498
|
-
result += " " + attrName + '="' + escapeAttr(String(value)) + '"';
|
|
499
|
-
}
|
|
500
|
-
return result;
|
|
501
|
-
}
|
|
502
|
-
function isTextNode(child) {
|
|
503
|
-
if (!isDef(child) || typeof child === "boolean") return false;
|
|
504
|
-
return typeof child === "string" || typeof child === "number" || typeof child === "bigint";
|
|
505
|
-
}
|
|
506
|
-
function hasMixedContent(children) {
|
|
507
|
-
let hasText = false;
|
|
508
|
-
let hasElement = false;
|
|
509
|
-
for (const child of children) {
|
|
510
|
-
if (isTextNode(child)) {
|
|
511
|
-
hasText = true;
|
|
512
|
-
} else if (isDef(child) && typeof child === "object" && "type" in child) {
|
|
513
|
-
hasElement = true;
|
|
514
|
-
}
|
|
515
|
-
if (hasText && hasElement) return true;
|
|
516
|
-
}
|
|
517
|
-
return false;
|
|
518
|
-
}
|
|
519
|
-
function renderChildren(children) {
|
|
520
|
-
if (!isDef(children)) {
|
|
521
|
-
nlFlag = false;
|
|
522
|
-
return "";
|
|
523
|
-
}
|
|
524
|
-
if (Array.isArray(children)) {
|
|
525
|
-
const inline = isPretty && hasMixedContent(children);
|
|
526
|
-
let out = "";
|
|
527
|
-
let anyNewline = false;
|
|
528
|
-
for (let i = 0; i < children.length; i++) {
|
|
529
|
-
out += render(children[i], inline);
|
|
530
|
-
anyNewline = anyNewline || nlFlag;
|
|
531
|
-
}
|
|
532
|
-
nlFlag = anyNewline;
|
|
533
|
-
return out;
|
|
534
|
-
}
|
|
535
|
-
return render(children);
|
|
536
|
-
}
|
|
537
|
-
return render(vnode);
|
|
538
|
-
}
|
|
539
|
-
function noop() {
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
export {
|
|
543
|
-
renderJsxToString
|
|
544
|
-
};
|
|
545
|
-
//# sourceMappingURL=chunk-OQRFLH2X.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/jsx/jsx-render.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable n/no-extraneous-import */\nimport {options as preactOptions} from 'preact';\nimport {VNode, Fragment} from './jsx-runtime.js';\n\n/** HTML void elements (self-closing, no end tag). */\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\n/** Tags whose text content may contain literal newlines that should not be treated as block-child indicators. */\nconst RAW_CONTENT_ELEMENTS = new Set(['pre', 'textarea', 'script', 'style']);\n\n/**\n * Standard HTML block-level elements. Also includes the `<select>` content\n * model (`select`/`optgroup`/`option`) so that each `<option>` renders on its\n * own line in pretty mode, even though those tags aren't block-level per CSS.\n */\nconst DEFAULT_BLOCK_ELEMENTS = new Set([\n 'address',\n 'article',\n 'aside',\n 'base',\n 'blockquote',\n 'body',\n 'dd',\n 'details',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'li',\n 'link',\n 'main',\n 'meta',\n 'nav',\n 'noscript',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'pre',\n 'script',\n 'search',\n 'section',\n 'select',\n 'style',\n 'summary',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'title',\n 'tr',\n 'ul',\n]);\n\n/**\n * Non-visual metadata and resource elements. These produce no inline rendered\n * content, so in pretty mode they always start on their own line \u2014 even inside\n * a parent with mixed text/element children, where the inline heuristic would\n * otherwise keep all siblings on a single line. (`base`/`link`/`meta` are void;\n * `script`/`style`/`title` render no visible text.)\n */\nconst ALWAYS_BLOCK_ELEMENTS = new Set([\n 'base',\n 'link',\n 'meta',\n 'script',\n 'style',\n 'title',\n]);\n\n/**\n * HTML/SVG boolean attributes.\n * When present with a truthy value, render as a minimized attribute.\n */\nconst BOOLEAN_ATTRS = new Set([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'capture',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'popover',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n]);\n\n/** JSX prop name -> HTML attribute name. */\nconst PROP_TO_ATTR: Record<string, string> = {\n acceptCharset: 'accept-charset',\n autoCapitalize: 'autocapitalize',\n autoComplete: 'autocomplete',\n autoFocus: 'autofocus',\n autoPlay: 'autoplay',\n charSet: 'charset',\n className: 'class',\n colSpan: 'colspan',\n contentEditable: 'contenteditable',\n crossOrigin: 'crossorigin',\n dateTime: 'datetime',\n disableRemotePlayback: 'disableremoteplayback',\n encType: 'enctype',\n formAction: 'formaction',\n formEncType: 'formenctype',\n formMethod: 'formmethod',\n formNoValidate: 'formnovalidate',\n formTarget: 'formtarget',\n frameBorder: 'frameborder',\n hrefLang: 'hreflang',\n htmlFor: 'for',\n httpEquiv: 'http-equiv',\n inputMode: 'inputmode',\n itemProp: 'itemprop',\n itemRef: 'itemref',\n itemScope: 'itemscope',\n itemType: 'itemtype',\n maxLength: 'maxlength',\n mediaGroup: 'mediagroup',\n minLength: 'minlength',\n noModule: 'nomodule',\n noValidate: 'novalidate',\n playsInline: 'playsinline',\n readOnly: 'readonly',\n referrerPolicy: 'referrerpolicy',\n rowSpan: 'rowspan',\n spellCheck: 'spellcheck',\n srcDoc: 'srcdoc',\n srcLang: 'srclang',\n srcSet: 'srcset',\n tabIndex: 'tabindex',\n useMap: 'usemap',\n\n // SVG presentation attributes (camelCase -> kebab-case).\n clipPath: 'clip-path',\n clipRule: 'clip-rule',\n colorInterpolation: 'color-interpolation',\n colorInterpolationFilters: 'color-interpolation-filters',\n dominantBaseline: 'dominant-baseline',\n fillOpacity: 'fill-opacity',\n fillRule: 'fill-rule',\n floodColor: 'flood-color',\n floodOpacity: 'flood-opacity',\n imageRendering: 'image-rendering',\n letterSpacing: 'letter-spacing',\n lightingColor: 'lighting-color',\n markerEnd: 'marker-end',\n markerMid: 'marker-mid',\n markerStart: 'marker-start',\n paintOrder: 'paint-order',\n pointerEvents: 'pointer-events',\n shapeRendering: 'shape-rendering',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n strokeDasharray: 'stroke-dasharray',\n strokeDashoffset: 'stroke-dashoffset',\n strokeLinecap: 'stroke-linecap',\n strokeLinejoin: 'stroke-linejoin',\n strokeMiterlimit: 'stroke-miterlimit',\n strokeOpacity: 'stroke-opacity',\n strokeWidth: 'stroke-width',\n textAnchor: 'text-anchor',\n textDecoration: 'text-decoration',\n textRendering: 'text-rendering',\n transformOrigin: 'transform-origin',\n vectorEffect: 'vector-effect',\n wordSpacing: 'word-spacing',\n writingMode: 'writing-mode',\n};\n\nconst AMP = '&';\nconst LT = '<';\nconst GT = '>';\nconst QUOT = '"';\n\n// Single-pass native prechecks for the common case where a string needs no\n// escaping (most class names, URLs, and text). `RegExp.test` scans in native\n// code, which is substantially faster than the JS `charCodeAt` loop below, so\n// strings that don't match return immediately without entering the loop.\nconst HTML_ESCAPE_RE = /[&<>]/;\nconst ATTR_ESCAPE_RE = /[&<>\"]/;\n\n// Shared empty object reused as the per-component context map when no contexts\n// have ever been pushed. Components only ever read from this map, so sharing is\n// safe and avoids a per-render allocation in the common case.\nconst EMPTY_GLOBAL_CTX: Record<string, any> = {};\n\n/** Returns `true` when `value` is neither `null` nor `undefined`. */\nfunction isDef<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nfunction escapeHtml(str: string): string {\n if (!HTML_ESCAPE_RE.test(str)) return str;\n let result = '';\n let last = 0;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n let escaped: string | undefined;\n if (ch === 38) escaped = AMP;\n else if (ch === 60) escaped = LT;\n else if (ch === 62) escaped = GT;\n if (escaped) {\n result += str.slice(last, i) + escaped;\n last = i + 1;\n }\n }\n return result + str.slice(last);\n}\n\nfunction escapeAttr(str: string): string {\n if (!ATTR_ESCAPE_RE.test(str)) return str;\n let result = '';\n let last = 0;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n let escaped: string | undefined;\n if (ch === 38) escaped = AMP;\n else if (ch === 34) escaped = QUOT;\n else if (ch === 60) escaped = LT;\n else if (ch === 62) escaped = GT;\n if (escaped) {\n result += str.slice(last, i) + escaped;\n last = i + 1;\n }\n }\n return result + str.slice(last);\n}\n\nconst STYLE_KEY_CACHE = new Map<string, string>();\nconst UPPERCASE_RE = /[A-Z]/g;\n\nfunction toKebabCase(key: string): string {\n let cached = STYLE_KEY_CACHE.get(key);\n if (cached === undefined) {\n cached = key.replace(UPPERCASE_RE, (m) => '-' + m.toLowerCase());\n STYLE_KEY_CACHE.set(key, cached);\n }\n return cached;\n}\n\nfunction styleToString(style: Record<string, any>): string {\n let result = '';\n let first = true;\n for (const key in style) {\n const value = style[key];\n if (!isDef(value) || value === '') continue;\n if (first) {\n first = false;\n } else {\n result += ';';\n }\n result += `${toKebabCase(key)}:${value}`;\n }\n return result;\n}\n\nexport interface JsxRenderOptions {\n /** Render mode. `'pretty'` adds newlines around block elements; `'minimal'` outputs compact HTML. Default: `'pretty'`. */\n mode?: 'pretty' | 'minimal';\n /** Additional tag names to treat as block-level elements in pretty mode. */\n blockElements?: string[];\n}\n\n/**\n * Renders a Preact VNode tree to an HTML string.\n */\nexport function renderJsxToString(\n vnode: VNode,\n options?: JsxRenderOptions\n): string {\n const mode = options?.mode ?? 'pretty';\n const isPretty = mode === 'pretty';\n // In minimal mode `blockSet` is unused (the `isPretty` guard short-circuits\n // any `.has()` call). In pretty mode without custom block elements, reuse the\n // module-level Set instead of allocating a copy.\n let blockSet: ReadonlySet<string> = DEFAULT_BLOCK_ELEMENTS;\n if (isPretty && options?.blockElements && options.blockElements.length > 0) {\n const merged = new Set(DEFAULT_BLOCK_ELEMENTS);\n for (const el of options.blockElements) {\n merged.add(el);\n }\n blockSet = merged;\n }\n\n // Context stacks: context.__c (id) -> value[]\n let contextStacks: Map<string, any[]> | undefined;\n\n // Version counter that bumps whenever a context value is pushed or popped.\n // `buildGlobalContext` uses it to skip rebuilding when nothing changed\n // between sibling component renders (the common case).\n let ctxVersion = 0;\n let cachedGlobalCtx: Record<string, any> = EMPTY_GLOBAL_CTX;\n let cachedGlobalCtxVersion = 0;\n\n // Side-channel reporting whether the most recently returned render string\n // contains a newline. Pretty mode uses this to decide whether a block\n // element's children start on their own line, instead of re-scanning the\n // element's concatenated inner HTML via `inner.includes('\\n')`. Because block\n // elements nest, that rescan walked the same characters once per enclosing\n // block level (O(html_size * block_depth)); threading the flag up makes it a\n // single pass. This is safe because rendering is fully synchronous and\n // single-pass: every code path assigns `nlFlag` before returning, and each\n // caller reads it immediately after the call, before the next call can\n // overwrite it. It is only meaningful in pretty mode; in minimal mode the\n // leaf scans are skipped and the value is never read.\n let nlFlag = false;\n\n function pushCtx(contextId: string, value: any) {\n if (!contextStacks) {\n contextStacks = new Map<string, any[]>();\n }\n let stack = contextStacks.get(contextId);\n if (!stack) {\n stack = [];\n contextStacks.set(contextId, stack);\n }\n stack.push(value);\n ctxVersion++;\n }\n\n function popCtx(contextId: string) {\n const stack = contextStacks?.get(contextId);\n if (stack) {\n stack.pop();\n if (stack.length === 0) {\n contextStacks?.delete(contextId);\n }\n }\n ctxVersion++;\n }\n\n /** Builds the __n (global context) map for hooks. */\n function buildGlobalContext(): Record<string, any> {\n if (ctxVersion === cachedGlobalCtxVersion) return cachedGlobalCtx;\n if (!contextStacks || contextStacks.size === 0) {\n cachedGlobalCtx = EMPTY_GLOBAL_CTX;\n cachedGlobalCtxVersion = ctxVersion;\n return cachedGlobalCtx;\n }\n const globalCtx: Record<string, any> = {};\n for (const [contextId, stack] of contextStacks) {\n if (stack.length > 0) {\n // useContext expects provider.props.value and provider.sub().\n globalCtx[contextId] = {\n props: {value: stack[stack.length - 1]},\n sub: noop,\n };\n }\n }\n cachedGlobalCtx = globalCtx;\n cachedGlobalCtxVersion = ctxVersion;\n return globalCtx;\n }\n\n function render(node: any, inline?: boolean): string {\n if (!isDef(node) || typeof node === 'boolean') {\n nlFlag = false;\n return '';\n }\n if (typeof node === 'string') {\n // escapeHtml only replaces &<>, so it never adds or removes newlines; the\n // raw text's newline status is preserved. Only scan in pretty mode, and\n // only this leaf string (each text node is scanned once, never re-walked\n // by ancestors).\n nlFlag = isPretty && node.indexOf('\\n') >= 0;\n return escapeHtml(node);\n }\n if (typeof node === 'number' || typeof node === 'bigint') {\n nlFlag = false;\n return String(node);\n }\n if (Array.isArray(node)) {\n let out = '';\n let anyNewline = false;\n for (let i = 0; i < node.length; i++) {\n out += render(node[i], inline);\n anyNewline = anyNewline || nlFlag;\n }\n nlFlag = anyNewline;\n return out;\n }\n\n // Must be a VNode-like object.\n if (typeof node !== 'object' || !('type' in node)) {\n nlFlag = false;\n return '';\n }\n\n const {type, props} = node;\n\n // Fragment.\n if (type === Fragment) {\n return renderChildren(props?.children);\n }\n\n // Component (function or class).\n if (typeof type === 'function') {\n return renderComponent(node);\n }\n\n // HTML element.\n if (typeof type === 'string') {\n return renderElement(type, props, inline);\n }\n\n return '';\n }\n\n function renderComponent(vnode: VNode): string {\n const {type, props} = vnode;\n const fn = type as Function;\n\n // Detect context Provider.\n // Root.js local JSX runtime: Provider._isProvider === true, Provider._context\n // is the Context object with a _stack array.\n // Preact >=10.27: Provider === Context (same function). `fn.__c` is the\n // context id string (e.g. \"__cC0\").\n // Preact <10.27: Provider._contextRef (mangled `fn.__`) points to the\n // context object which has `__c` (id) and `__` (default value).\n const fnAny = fn as any;\n if (fnAny._isProvider && fnAny._context) {\n const ctx = fnAny._context;\n ctx._stack.push((props as any).value);\n const result = renderChildren(props.children);\n ctx._stack.pop();\n return result;\n }\n let contextId: string | undefined;\n if (typeof fnAny.__c === 'string' && fnAny.__c.startsWith('__cC')) {\n contextId = fnAny.__c;\n } else if (fnAny.__ && typeof fnAny.__ === 'object' && fnAny.__.__c) {\n contextId = fnAny.__.__c;\n }\n if (contextId) {\n pushCtx(contextId, (props as any).value);\n const result = renderChildren(props.children);\n popCtx(contextId);\n return result;\n }\n\n // Detect context Consumer.\n if ((fn as any).contextType) {\n const ctx = (fn as any).contextType;\n const ctxId: string = ctx.__c;\n const stack = contextStacks?.get(ctxId);\n const value =\n stack && stack.length > 0 ? stack[stack.length - 1] : ctx.__;\n if (typeof props.children === 'function') {\n return render(props.children(value));\n }\n return renderChildren(props.children);\n }\n\n // Regular component \u2014 set up a fake component instance so Preact hooks\n // (useContext, useState, useMemo, etc.) work during SSR.\n // Preact's useContext reads from `component.context[context.__c]`.\n const component: any = {\n props,\n context: buildGlobalContext(),\n state: {},\n __v: vnode, // _vnode\n __d: false, // _dirty\n __h: [], // _renderCallbacks\n __s: {}, // _nextState\n __H: null, // _hooks (initialised by hooks addon)\n };\n (vnode as any).__c = component;\n\n // Trigger Preact option hooks so the hooks addon can set currentComponent.\n (preactOptions as any).__b?.(vnode);\n (preactOptions as any).__r?.(vnode);\n\n try {\n // Class component.\n if (fn.prototype && fn.prototype.render) {\n const instance = new (fn as any)(props, component.context);\n instance.__n = component.__n;\n instance.__H = component.__H;\n (vnode as any).__c = instance;\n (preactOptions as any).__r?.(vnode);\n return render(instance.render(instance.props, instance.state));\n }\n\n // Functional component.\n const rendered = fn(props, component.context);\n return render(rendered);\n } finally {\n preactOptions.diffed?.(vnode as any);\n }\n }\n\n function renderElement(\n tag: string,\n props: Record<string, any>,\n inline?: boolean\n ): string {\n // Metadata/resource elements always break onto their own line, even within\n // mixed (text + element) content where the inline heuristic applies, since\n // they render no inline visual output.\n const isBlock =\n isPretty &&\n (ALWAYS_BLOCK_ELEMENTS.has(tag) || (!inline && blockSet.has(tag)));\n const isVoid = VOID_ELEMENTS.has(tag);\n const attrs = renderAttrs(tag, props);\n let result = '<' + tag + attrs + '>';\n\n if (isVoid) {\n if (isBlock) {\n result += '\\n';\n nlFlag = true;\n } else {\n nlFlag = false;\n }\n return result;\n }\n\n let inner = '';\n // Whether `inner` contains a newline. For the children path this is read\n // from `nlFlag` (threaded up from the recursive render, no rescan). For the\n // raw-HTML and textarea leaf paths the string is scanned once here; only in\n // pretty mode, since minimal mode never consults it.\n let innerHasNewline = false;\n if (isDef(props?.dangerouslySetInnerHTML?.__html)) {\n inner = props.dangerouslySetInnerHTML.__html;\n innerHasNewline = isPretty && inner.includes('\\n');\n } else if (isDef(props?.children)) {\n inner = renderChildren(props.children);\n innerHasNewline = nlFlag;\n } else if (tag === 'textarea' && props) {\n // For <textarea>, render value/defaultValue as text content since\n // browsers ignore the value attribute on textarea elements.\n const textVal = props.value ?? props.defaultValue;\n if (isDef(textVal)) {\n inner = escapeHtml(String(textVal));\n innerHasNewline = isPretty && inner.includes('\\n');\n }\n }\n\n if (isBlock) {\n // When inner content contains block children (indicated by newlines),\n // add a newline after the opening tag so content starts on its own line.\n // Exempt raw-content elements (pre, textarea, script, style) where\n // newlines are literal text, not block-child indicators.\n const hasBlockChildren =\n !RAW_CONTENT_ELEMENTS.has(tag) && innerHasNewline;\n if (hasBlockChildren) {\n result += '\\n' + inner + '</' + tag + '>\\n';\n } else {\n result += inner + '</' + tag + '>\\n';\n }\n // Block elements always end with a trailing newline.\n nlFlag = true;\n } else {\n result += inner + '</' + tag + '>';\n // Opening/closing tags add no newlines, so the element's newline status\n // is exactly that of its inner content.\n nlFlag = innerHasNewline;\n }\n\n return result;\n }\n\n function renderAttrs(tag: string, props: Record<string, any>): string {\n if (!props) return '';\n let result = '';\n for (const key in props) {\n if (\n key === 'children' ||\n key === 'dangerouslySetInnerHTML' ||\n key === 'key' ||\n key === 'ref' ||\n key === '__self' ||\n key === '__source'\n ) {\n continue;\n }\n // Skip value/defaultValue on textarea \u2014 rendered as text content.\n if (tag === 'textarea' && (key === 'value' || key === 'defaultValue')) {\n continue;\n }\n\n let value = props[key];\n if (!isDef(value)) continue;\n // Skip function-valued props such as event handlers (e.g. onClick={fn}):\n // client-side handler functions can't be serialized to HTML. String\n // values like <select onChange=\"...\"> are inline HTML event attributes,\n // so they are preserved and rendered as-is.\n if (typeof value === 'function') continue;\n\n const attrName = PROP_TO_ATTR[key] || key;\n\n // For boolean attributes, `false` removes the attribute. For all other\n // attributes, `false` is stringified (e.g. data-foo=\"false\").\n if (value === false && BOOLEAN_ATTRS.has(attrName)) continue;\n\n // Boolean attributes are minimized when true; other attributes use\n // explicit string serialization (e.g. id=\"true\", data-foo=\"true\").\n if (value === true && BOOLEAN_ATTRS.has(attrName)) {\n result += ' ' + attrName;\n continue;\n }\n\n // Style objects.\n if (key === 'style' && typeof value === 'object') {\n value = styleToString(value);\n if (!value) continue;\n }\n\n result += ' ' + attrName + '=\"' + escapeAttr(String(value)) + '\"';\n }\n return result;\n }\n\n /**\n * Returns true if a child node is a text-like value (string, number).\n */\n function isTextNode(child: any): boolean {\n if (!isDef(child) || typeof child === 'boolean') return false;\n return (\n typeof child === 'string' ||\n typeof child === 'number' ||\n typeof child === 'bigint'\n );\n }\n\n /**\n * Checks if an array of children contains a mix of text nodes and elements.\n * When mixed, block elements should render inline to avoid breaking text flow.\n */\n function hasMixedContent(children: any[]): boolean {\n let hasText = false;\n let hasElement = false;\n for (const child of children) {\n if (isTextNode(child)) {\n hasText = true;\n } else if (isDef(child) && typeof child === 'object' && 'type' in child) {\n hasElement = true;\n }\n if (hasText && hasElement) return true;\n }\n return false;\n }\n\n function renderChildren(children: any): string {\n if (!isDef(children)) {\n nlFlag = false;\n return '';\n }\n if (Array.isArray(children)) {\n const inline = isPretty && hasMixedContent(children);\n let out = '';\n let anyNewline = false;\n for (let i = 0; i < children.length; i++) {\n out += render(children[i], inline);\n anyNewline = anyNewline || nlFlag;\n }\n nlFlag = anyNewline;\n return out;\n }\n return render(children);\n }\n\n return render(vnode);\n}\n\nfunction noop() {}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["vnode"]
|
|
7
|
-
}
|