@blinkk/root 3.0.1-beta.5 → 3.0.1-beta.7
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-CY5IQ4AQ.js → chunk-FQBA5QSG.js} +9 -8
- package/dist/chunk-FQBA5QSG.js.map +1 -0
- package/dist/{chunk-3OVMCKPA.js → chunk-M6WGW5VY.js} +68 -18
- package/dist/chunk-M6WGW5VY.js.map +1 -0
- package/dist/jsx/jsx-dev-runtime.js +1 -1
- package/dist/jsx/jsx-runtime.js +1 -1
- package/dist/jsx.js +2 -2
- package/dist/render.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-3OVMCKPA.js.map +0 -1
- package/dist/chunk-CY5IQ4AQ.js.map +0 -1
|
@@ -4,16 +4,17 @@ function Fragment(props) {
|
|
|
4
4
|
return props.children;
|
|
5
5
|
}
|
|
6
6
|
function jsx(type, props, key) {
|
|
7
|
-
const
|
|
7
|
+
const propsKey = props.key;
|
|
8
|
+
let finalProps = props;
|
|
9
|
+
if (propsKey !== void 0) {
|
|
10
|
+
const { key: _, ...rest } = props;
|
|
11
|
+
finalProps = rest;
|
|
12
|
+
}
|
|
8
13
|
const vnode = {
|
|
9
14
|
type,
|
|
10
|
-
props,
|
|
11
|
-
key:
|
|
15
|
+
props: finalProps,
|
|
16
|
+
key: key !== void 0 ? key : propsKey ?? null
|
|
12
17
|
};
|
|
13
|
-
if (props.key !== void 0) {
|
|
14
|
-
const { key: _, ...rest } = props;
|
|
15
|
-
vnode.props = rest;
|
|
16
|
-
}
|
|
17
18
|
if (options.vnode) {
|
|
18
19
|
options.vnode(vnode);
|
|
19
20
|
}
|
|
@@ -70,4 +71,4 @@ export {
|
|
|
70
71
|
createContext,
|
|
71
72
|
useContext
|
|
72
73
|
};
|
|
73
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-FQBA5QSG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jsx/jsx-runtime.ts"],"sourcesContent":["/**\n * @module jsx-runtime\n *\n * Server-side JSX runtime for Root.js. Replaces Preact as the JSX renderer\n * for server-side rendering (SSR/SSG). This module provides the automatic\n * JSX transform entry point (`jsxImportSource`).\n *\n * Supports:\n * - Automatic JSX transform (jsx, jsxs, Fragment)\n * - Classic JSX transform (createElement / h)\n * - Context API (createContext, useContext)\n * - Server-side renderToString\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type Key = string | number | null;\n\n/**\n * A virtual DOM node representing an element, component, or fragment.\n */\nexport interface VNode<P = Record<string, unknown>> {\n type:\n | string\n | FunctionalComponent<P>\n | typeof Fragment\n | (new (...args: any[]) => any);\n props: P;\n key: Key;\n}\n\n/**\n * Valid children types for JSX elements.\n */\nexport type ComponentChildren =\n | VNode<any>\n | string\n | number\n | bigint\n | boolean\n | null\n | undefined\n | ComponentChildren[];\n\nexport type ComponentChild = ComponentChildren;\n\n/**\n * A function component that receives props and returns a VNode or null.\n */\nexport interface FunctionalComponent<P = Record<string, unknown>> {\n (props: P): VNode<any> | null;\n displayName?: string;\n /** @internal Marks this component as a context Provider. */\n _isProvider?: boolean;\n /** @internal Reference to the context object for Provider components. */\n _context?: Context<any>;\n}\n\n/**\n * Generic component type (function components only for SSR).\n */\nexport type ComponentType<P = Record<string, unknown>> = FunctionalComponent<P>;\n\n// =============================================================================\n// Options (vnode lifecycle hook)\n// =============================================================================\n\n/**\n * Global options object. The `vnode` callback is invoked for every VNode\n * created via `jsx()`, `jsxs()`, or `createElement()`. This is used by the\n * renderer to inject nonce values into script/style tags.\n */\nexport const options: {vnode?: (vnode: VNode<any>) => void} = {};\n\n// =============================================================================\n// Fragment\n// =============================================================================\n\n/**\n * Fragment component. Renders its children without a wrapper DOM element.\n * Used as `<>...</>` or `<Fragment>...</Fragment>` in JSX.\n */\nexport function Fragment(props: {children?: ComponentChildren}): any {\n return props.children;\n}\n\n// =============================================================================\n// JSX Automatic Runtime (jsx / jsxs)\n// =============================================================================\n\n/**\n * Creates a VNode. Used by the automatic JSX transform for elements with\n * a single child or no children.\n */\nexport function jsx(\n type: string | FunctionalComponent<any> | typeof Fragment,\n props: Record<string, any>,\n key?: Key\n): VNode {\n const propsKey = props.key;\n // `key` is stored on the VNode directly; strip it from props when present so\n // it doesn't leak into rendered attributes.\n let finalProps = props;\n if (propsKey !== undefined) {\n const {key: _, ...rest} = props;\n finalProps = rest;\n }\n\n const vnode: VNode = {\n type,\n props: finalProps,\n key: key !== undefined ? key : propsKey ?? null,\n };\n\n if (options.vnode) {\n options.vnode(vnode);\n }\n\n return vnode;\n}\n\n/**\n * Creates a VNode with static children. Used by the automatic JSX transform\n * for elements with multiple children. Identical to `jsx()` for SSR since\n * we don't need to diff children.\n */\nexport {jsx as jsxs};\n\n// =============================================================================\n// Classic Runtime (createElement / h)\n// =============================================================================\n\n/**\n * Creates a VNode. Compatible with the classic `React.createElement` API.\n *\n * ```ts\n * createElement('div', {className: 'foo'}, 'Hello', ' ', 'World');\n * ```\n */\nexport function createElement(\n type: string | FunctionalComponent<any> | typeof Fragment,\n props?: Record<string, any> | null,\n ...children: any[]\n): VNode {\n const normalizedProps: Record<string, any> = {...(props || {})};\n\n if (children.length === 1) {\n normalizedProps.children = children[0];\n } else if (children.length > 1) {\n normalizedProps.children = children;\n }\n\n const vnode: VNode = {\n type,\n props: normalizedProps,\n key: normalizedProps.key ?? null,\n };\n\n if (normalizedProps.key !== undefined) {\n delete normalizedProps.key;\n }\n\n if (options.vnode) {\n options.vnode(vnode);\n }\n\n return vnode;\n}\n\nexport {createElement as h};\n\n// =============================================================================\n// Context API\n// =============================================================================\n\n/**\n * A context object created by `createContext()`. Provides a `Provider`\n * component and can be read via `useContext()`.\n */\nexport interface Context<T> {\n /** @internal Default value for this context. */\n _defaultValue: T;\n /** @internal Stack of provided values (managed by renderToString). */\n _stack: T[];\n /** Provider component that supplies a context value to descendants. */\n Provider: FunctionalComponent<{value: T; children?: ComponentChildren}>;\n}\n\n/**\n * Creates a new context with an optional default value. Returns a context\n * object with a `Provider` component.\n *\n * ```ts\n * const ThemeContext = createContext('light');\n *\n * // In a parent component:\n * <ThemeContext.Provider value=\"dark\">\n * <App />\n * </ThemeContext.Provider>\n *\n * // In a child component:\n * const theme = useContext(ThemeContext);\n * ```\n */\nexport function createContext<T>(defaultValue: T): Context<T> {\n const ctx: Context<T> = {\n _defaultValue: defaultValue,\n _stack: [],\n Provider: null as any,\n };\n\n const Provider: FunctionalComponent<{\n value: T;\n children?: ComponentChildren;\n }> = () => {\n // Provider rendering is handled specially by renderToString, which\n // pushes/pops the context value around rendering children. This function\n // body is never actually called during normal SSR rendering.\n return null;\n };\n Provider.displayName = 'ContextProvider';\n Provider._isProvider = true;\n Provider._context = ctx;\n ctx.Provider = Provider;\n\n return ctx;\n}\n\n/**\n * Reads the current value of a context. Must be called during the render\n * of a function component that is a descendant of a matching Provider.\n * Returns the default value if no Provider is found.\n *\n * ```ts\n * const theme = useContext(ThemeContext);\n * ```\n */\nexport function useContext<T>(context: Context<T>): T {\n const stack = context._stack;\n if (stack.length > 0) {\n return stack[stack.length - 1];\n }\n return context._defaultValue;\n}\n\n// Re-export JSX namespace for the automatic transform.\n// TypeScript resolves JSX types from `{jsxImportSource}/jsx-runtime`.\nexport type {JSX} from './types.js';\n"],"mappings":";AA0EO,IAAM,UAAiD,CAAC;AAUxD,SAAS,SAAS,OAA4C;AACnE,SAAO,MAAM;AACf;AAUO,SAAS,IACd,MACA,OACA,KACO;AACP,QAAM,WAAW,MAAM;AAGvB,MAAI,aAAa;AACjB,MAAI,aAAa,QAAW;AAC1B,UAAM,EAAC,KAAK,GAAG,GAAG,KAAI,IAAI;AAC1B,iBAAa;AAAA,EACf;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,KAAK,QAAQ,SAAY,MAAM,YAAY;AAAA,EAC7C;AAEA,MAAI,QAAQ,OAAO;AACjB,YAAQ,MAAM,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAoBO,SAAS,cACd,MACA,UACG,UACI;AACP,QAAM,kBAAuC,EAAC,GAAI,SAAS,CAAC,EAAE;AAE9D,MAAI,SAAS,WAAW,GAAG;AACzB,oBAAgB,WAAW,SAAS,CAAC;AAAA,EACvC,WAAW,SAAS,SAAS,GAAG;AAC9B,oBAAgB,WAAW;AAAA,EAC7B;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,KAAK,gBAAgB,OAAO;AAAA,EAC9B;AAEA,MAAI,gBAAgB,QAAQ,QAAW;AACrC,WAAO,gBAAgB;AAAA,EACzB;AAEA,MAAI,QAAQ,OAAO;AACjB,YAAQ,MAAM,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAqCO,SAAS,cAAiB,cAA6B;AAC5D,QAAM,MAAkB;AAAA,IACtB,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,IACT,UAAU;AAAA,EACZ;AAEA,QAAM,WAGD,MAAM;AAIT,WAAO;AAAA,EACT;AACA,WAAS,cAAc;AACvB,WAAS,cAAc;AACvB,WAAS,WAAW;AACpB,MAAI,WAAW;AAEf,SAAO;AACT;AAWO,SAAS,WAAc,SAAwB;AACpD,QAAM,QAAQ,QAAQ;AACtB,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,MAAM,MAAM,SAAS,CAAC;AAAA,EAC/B;AACA,SAAO,QAAQ;AACjB;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Fragment
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FQBA5QSG.js";
|
|
4
4
|
|
|
5
5
|
// src/jsx/jsx-render.ts
|
|
6
6
|
import { options as preactOptions } from "preact";
|
|
@@ -155,6 +155,7 @@ var AMP = "&";
|
|
|
155
155
|
var LT = "<";
|
|
156
156
|
var GT = ">";
|
|
157
157
|
var QUOT = """;
|
|
158
|
+
var EMPTY_GLOBAL_CTX = {};
|
|
158
159
|
function isDef(value) {
|
|
159
160
|
return value !== null && value !== void 0;
|
|
160
161
|
}
|
|
@@ -193,38 +194,75 @@ function escapeAttr(str) {
|
|
|
193
194
|
if (last === 0) return str;
|
|
194
195
|
return result + str.slice(last);
|
|
195
196
|
}
|
|
197
|
+
var STYLE_KEY_CACHE = /* @__PURE__ */ new Map();
|
|
198
|
+
var UPPERCASE_RE = /[A-Z]/g;
|
|
199
|
+
function toKebabCase(key) {
|
|
200
|
+
let cached = STYLE_KEY_CACHE.get(key);
|
|
201
|
+
if (cached === void 0) {
|
|
202
|
+
cached = key.replace(UPPERCASE_RE, (m) => "-" + m.toLowerCase());
|
|
203
|
+
STYLE_KEY_CACHE.set(key, cached);
|
|
204
|
+
}
|
|
205
|
+
return cached;
|
|
206
|
+
}
|
|
196
207
|
function styleToString(style) {
|
|
197
|
-
|
|
208
|
+
let result = "";
|
|
209
|
+
let first = true;
|
|
198
210
|
for (const key in style) {
|
|
199
211
|
const value = style[key];
|
|
200
212
|
if (!isDef(value) || value === "") continue;
|
|
201
|
-
|
|
202
|
-
|
|
213
|
+
if (first) {
|
|
214
|
+
first = false;
|
|
215
|
+
} else {
|
|
216
|
+
result += ";";
|
|
217
|
+
}
|
|
218
|
+
result += `${toKebabCase(key)}:${value}`;
|
|
203
219
|
}
|
|
204
|
-
return
|
|
220
|
+
return result;
|
|
205
221
|
}
|
|
206
222
|
function renderJsxToString(vnode, options) {
|
|
207
223
|
const mode = options?.mode ?? "pretty";
|
|
208
224
|
const isPretty = mode === "pretty";
|
|
209
|
-
|
|
210
|
-
if (options?.blockElements) {
|
|
225
|
+
let blockSet = DEFAULT_BLOCK_ELEMENTS;
|
|
226
|
+
if (isPretty && options?.blockElements && options.blockElements.length > 0) {
|
|
227
|
+
const merged = new Set(DEFAULT_BLOCK_ELEMENTS);
|
|
211
228
|
for (const el of options.blockElements) {
|
|
212
|
-
|
|
229
|
+
merged.add(el);
|
|
213
230
|
}
|
|
231
|
+
blockSet = merged;
|
|
214
232
|
}
|
|
215
|
-
|
|
233
|
+
let contextStacks;
|
|
234
|
+
let ctxVersion = 0;
|
|
235
|
+
let cachedGlobalCtx = EMPTY_GLOBAL_CTX;
|
|
236
|
+
let cachedGlobalCtxVersion = 0;
|
|
216
237
|
function pushCtx(contextId, value) {
|
|
238
|
+
if (!contextStacks) {
|
|
239
|
+
contextStacks = /* @__PURE__ */ new Map();
|
|
240
|
+
}
|
|
217
241
|
let stack = contextStacks.get(contextId);
|
|
218
242
|
if (!stack) {
|
|
219
243
|
stack = [];
|
|
220
244
|
contextStacks.set(contextId, stack);
|
|
221
245
|
}
|
|
222
246
|
stack.push(value);
|
|
247
|
+
ctxVersion++;
|
|
223
248
|
}
|
|
224
249
|
function popCtx(contextId) {
|
|
225
|
-
contextStacks
|
|
250
|
+
const stack = contextStacks?.get(contextId);
|
|
251
|
+
if (stack) {
|
|
252
|
+
stack.pop();
|
|
253
|
+
if (stack.length === 0) {
|
|
254
|
+
contextStacks?.delete(contextId);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
ctxVersion++;
|
|
226
258
|
}
|
|
227
259
|
function buildGlobalContext() {
|
|
260
|
+
if (ctxVersion === cachedGlobalCtxVersion) return cachedGlobalCtx;
|
|
261
|
+
if (!contextStacks || contextStacks.size === 0) {
|
|
262
|
+
cachedGlobalCtx = EMPTY_GLOBAL_CTX;
|
|
263
|
+
cachedGlobalCtxVersion = ctxVersion;
|
|
264
|
+
return cachedGlobalCtx;
|
|
265
|
+
}
|
|
228
266
|
const globalCtx = {};
|
|
229
267
|
for (const [contextId, stack] of contextStacks) {
|
|
230
268
|
if (stack.length > 0) {
|
|
@@ -234,6 +272,8 @@ function renderJsxToString(vnode, options) {
|
|
|
234
272
|
};
|
|
235
273
|
}
|
|
236
274
|
}
|
|
275
|
+
cachedGlobalCtx = globalCtx;
|
|
276
|
+
cachedGlobalCtxVersion = ctxVersion;
|
|
237
277
|
return globalCtx;
|
|
238
278
|
}
|
|
239
279
|
function render(node, inline) {
|
|
@@ -241,7 +281,13 @@ function renderJsxToString(vnode, options) {
|
|
|
241
281
|
if (typeof node === "string") return escapeHtml(node);
|
|
242
282
|
if (typeof node === "number" || typeof node === "bigint")
|
|
243
283
|
return String(node);
|
|
244
|
-
if (Array.isArray(node))
|
|
284
|
+
if (Array.isArray(node)) {
|
|
285
|
+
let out = "";
|
|
286
|
+
for (let i = 0; i < node.length; i++) {
|
|
287
|
+
out += render(node[i], inline);
|
|
288
|
+
}
|
|
289
|
+
return out;
|
|
290
|
+
}
|
|
245
291
|
if (typeof node !== "object" || !("type" in node)) return "";
|
|
246
292
|
const { type, props } = node;
|
|
247
293
|
if (type === Fragment) {
|
|
@@ -281,7 +327,7 @@ function renderJsxToString(vnode, options) {
|
|
|
281
327
|
if (fn.contextType) {
|
|
282
328
|
const ctx = fn.contextType;
|
|
283
329
|
const ctxId = ctx.__c;
|
|
284
|
-
const stack = contextStacks
|
|
330
|
+
const stack = contextStacks?.get(ctxId);
|
|
285
331
|
const value = stack && stack.length > 0 ? stack[stack.length - 1] : ctx.__;
|
|
286
332
|
if (typeof props.children === "function") {
|
|
287
333
|
return render(props.children(value));
|
|
@@ -355,7 +401,7 @@ function renderJsxToString(vnode, options) {
|
|
|
355
401
|
}
|
|
356
402
|
function renderAttrs(tag, props) {
|
|
357
403
|
if (!props) return "";
|
|
358
|
-
|
|
404
|
+
let result = "";
|
|
359
405
|
for (const key in props) {
|
|
360
406
|
if (key === "children" || key === "dangerouslySetInnerHTML" || key === "key" || key === "ref" || key === "__self" || key === "__source") {
|
|
361
407
|
continue;
|
|
@@ -369,16 +415,16 @@ function renderJsxToString(vnode, options) {
|
|
|
369
415
|
if (value === false && !key.startsWith("data-")) continue;
|
|
370
416
|
const attrName = PROP_TO_ATTR[key] || key;
|
|
371
417
|
if (value === true) {
|
|
372
|
-
|
|
418
|
+
result += " " + attrName;
|
|
373
419
|
continue;
|
|
374
420
|
}
|
|
375
421
|
if (key === "style" && typeof value === "object") {
|
|
376
422
|
value = styleToString(value);
|
|
377
423
|
if (!value) continue;
|
|
378
424
|
}
|
|
379
|
-
|
|
425
|
+
result += " " + attrName + '="' + escapeAttr(String(value)) + '"';
|
|
380
426
|
}
|
|
381
|
-
return
|
|
427
|
+
return result;
|
|
382
428
|
}
|
|
383
429
|
function isTextNode(child) {
|
|
384
430
|
if (!isDef(child) || typeof child === "boolean") return false;
|
|
@@ -401,7 +447,11 @@ function renderJsxToString(vnode, options) {
|
|
|
401
447
|
if (!isDef(children)) return "";
|
|
402
448
|
if (Array.isArray(children)) {
|
|
403
449
|
const inline = isPretty && hasMixedContent(children);
|
|
404
|
-
|
|
450
|
+
let out = "";
|
|
451
|
+
for (let i = 0; i < children.length; i++) {
|
|
452
|
+
out += render(children[i], inline);
|
|
453
|
+
}
|
|
454
|
+
return out;
|
|
405
455
|
}
|
|
406
456
|
return render(children);
|
|
407
457
|
}
|
|
@@ -413,4 +463,4 @@ function noop() {
|
|
|
413
463
|
export {
|
|
414
464
|
renderJsxToString
|
|
415
465
|
};
|
|
416
|
-
//# sourceMappingURL=chunk-
|
|
466
|
+
//# sourceMappingURL=chunk-M6WGW5VY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jsx/jsx-render.ts"],"sourcesContent":["import {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/** Standard HTML block-level elements. */\nconst DEFAULT_BLOCK_ELEMENTS = new Set([\n 'address',\n 'article',\n 'aside',\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 'p',\n 'pre',\n 'script',\n 'search',\n 'section',\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/** 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 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// 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 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 if (last === 0) return str;\n return result + str.slice(last);\n}\n\nfunction escapeAttr(str: string): string {\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 if (last === 0) return str;\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 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') return '';\n if (typeof node === 'string') return escapeHtml(node);\n if (typeof node === 'number' || typeof node === 'bigint')\n return String(node);\n if (Array.isArray(node)) {\n let out = '';\n for (let i = 0; i < node.length; i++) {\n out += render(node[i], inline);\n }\n return out;\n }\n\n // Must be a VNode-like object.\n if (typeof node !== 'object' || !('type' in node)) return '';\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 — 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 const isBlock = isPretty && !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) result += '\\n';\n return result;\n }\n\n let inner = '';\n if (isDef(props?.dangerouslySetInnerHTML?.__html)) {\n inner = props.dangerouslySetInnerHTML.__html;\n } else if (isDef(props?.children)) {\n inner = renderChildren(props.children);\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 }\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) && inner.includes('\\n');\n if (hasBlockChildren) {\n result += '\\n' + inner + '</' + tag + '>\\n';\n } else {\n result += inner + '</' + tag + '>\\n';\n }\n } else {\n result += inner + '</' + tag + '>';\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 — rendered as text content.\n if (tag === 'textarea' && (key === 'value' || key === 'defaultValue')) {\n continue;\n }\n // Skip event handlers.\n if (key.length > 2 && key[0] === 'o' && key[1] === 'n') continue;\n\n let value = props[key];\n if (!isDef(value)) continue;\n // For standard and boolean attributes, `false` removes the attribute.\n // For data-* attributes, `false` is rendered as the string \"false\".\n if (value === false && !key.startsWith('data-')) continue;\n\n const attrName = PROP_TO_ATTR[key] || key;\n\n // Boolean attributes.\n if (value === true) {\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)) return '';\n if (Array.isArray(children)) {\n const inline = isPretty && hasMixedContent(children);\n let out = '';\n for (let i = 0; i < children.length; i++) {\n out += render(children[i], inline);\n }\n return out;\n }\n return render(children);\n }\n\n return render(vnode);\n}\n\nfunction noop() {}\n"],"mappings":"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","names":["vnode"]}
|
package/dist/jsx/jsx-runtime.js
CHANGED
package/dist/jsx.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
renderJsxToString
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-M6WGW5VY.js";
|
|
4
4
|
import {
|
|
5
5
|
Fragment,
|
|
6
6
|
createContext,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
jsx,
|
|
9
9
|
options,
|
|
10
10
|
useContext
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-FQBA5QSG.js";
|
|
12
12
|
export {
|
|
13
13
|
Fragment,
|
|
14
14
|
createContext,
|
package/dist/render.js
CHANGED
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
} from "./chunk-6P3B7ZXL.js";
|
|
15
15
|
import {
|
|
16
16
|
renderJsxToString
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-M6WGW5VY.js";
|
|
18
|
+
import "./chunk-FQBA5QSG.js";
|
|
19
19
|
|
|
20
20
|
// src/render/render.tsx
|
|
21
21
|
import crypto from "crypto";
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/jsx/jsx-render.ts"],"sourcesContent":["import {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/** Standard HTML block-level elements. */\nconst DEFAULT_BLOCK_ELEMENTS = new Set([\n 'address',\n 'article',\n 'aside',\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 'p',\n 'pre',\n 'script',\n 'search',\n 'section',\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/** 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 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/** 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 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 if (last === 0) return str;\n return result + str.slice(last);\n}\n\nfunction escapeAttr(str: string): string {\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 if (last === 0) return str;\n return result + str.slice(last);\n}\n\nfunction styleToString(style: Record<string, any>): string {\n const parts: string[] = [];\n for (const key in style) {\n const value = style[key];\n if (!isDef(value) || value === '') continue;\n // Convert camelCase to kebab-case.\n const cssKey = key.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n parts.push(`${cssKey}:${value}`);\n }\n return parts.join(';');\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 const blockSet = new Set(DEFAULT_BLOCK_ELEMENTS);\n if (options?.blockElements) {\n for (const el of options.blockElements) {\n blockSet.add(el);\n }\n }\n\n // Context stacks: context.__c (id) -> value[]\n const contextStacks = new Map<string, any[]>();\n\n function pushCtx(contextId: string, value: any) {\n let stack = contextStacks.get(contextId);\n if (!stack) {\n stack = [];\n contextStacks.set(contextId, stack);\n }\n stack.push(value);\n }\n\n function popCtx(contextId: string) {\n contextStacks.get(contextId)?.pop();\n }\n\n /** Builds the __n (global context) map for hooks. */\n function buildGlobalContext(): Record<string, any> {\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 return globalCtx;\n }\n\n function render(node: any, inline?: boolean): string {\n if (!isDef(node) || typeof node === 'boolean') return '';\n if (typeof node === 'string') return escapeHtml(node);\n if (typeof node === 'number' || typeof node === 'bigint')\n return String(node);\n if (Array.isArray(node)) return node.map((n) => render(n, inline)).join('');\n\n // Must be a VNode-like object.\n if (typeof node !== 'object' || !('type' in node)) return '';\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 — 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 const isBlock = isPretty && !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) result += '\\n';\n return result;\n }\n\n let inner = '';\n if (isDef(props?.dangerouslySetInnerHTML?.__html)) {\n inner = props.dangerouslySetInnerHTML.__html;\n } else if (isDef(props?.children)) {\n inner = renderChildren(props.children);\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 }\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) && inner.includes('\\n');\n if (hasBlockChildren) {\n result += '\\n' + inner + '</' + tag + '>\\n';\n } else {\n result += inner + '</' + tag + '>\\n';\n }\n } else {\n result += inner + '</' + tag + '>';\n }\n\n return result;\n }\n\n function renderAttrs(tag: string, props: Record<string, any>): string {\n if (!props) return '';\n const parts: string[] = [];\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 — rendered as text content.\n if (tag === 'textarea' && (key === 'value' || key === 'defaultValue')) {\n continue;\n }\n // Skip event handlers.\n if (key.length > 2 && key[0] === 'o' && key[1] === 'n') continue;\n\n let value = props[key];\n if (!isDef(value)) continue;\n // For standard and boolean attributes, `false` removes the attribute.\n // For data-* attributes, `false` is rendered as the string \"false\".\n if (value === false && !key.startsWith('data-')) continue;\n\n const attrName = PROP_TO_ATTR[key] || key;\n\n // Boolean attributes.\n if (value === true) {\n parts.push(' ', 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 parts.push(' ', attrName, '=\"', escapeAttr(String(value)), '\"');\n }\n return parts.join('');\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)) return '';\n if (Array.isArray(children)) {\n const inline = isPretty && hasMixedContent(children);\n return children.map((child) => render(child, inline)).join('');\n }\n return render(children);\n }\n\n return render(vnode);\n}\n\nfunction noop() {}\n"],"mappings":"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","names":["vnode"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/jsx/jsx-runtime.ts"],"sourcesContent":["/**\n * @module jsx-runtime\n *\n * Server-side JSX runtime for Root.js. Replaces Preact as the JSX renderer\n * for server-side rendering (SSR/SSG). This module provides the automatic\n * JSX transform entry point (`jsxImportSource`).\n *\n * Supports:\n * - Automatic JSX transform (jsx, jsxs, Fragment)\n * - Classic JSX transform (createElement / h)\n * - Context API (createContext, useContext)\n * - Server-side renderToString\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type Key = string | number | null;\n\n/**\n * A virtual DOM node representing an element, component, or fragment.\n */\nexport interface VNode<P = Record<string, unknown>> {\n type:\n | string\n | FunctionalComponent<P>\n | typeof Fragment\n | (new (...args: any[]) => any);\n props: P;\n key: Key;\n}\n\n/**\n * Valid children types for JSX elements.\n */\nexport type ComponentChildren =\n | VNode<any>\n | string\n | number\n | bigint\n | boolean\n | null\n | undefined\n | ComponentChildren[];\n\nexport type ComponentChild = ComponentChildren;\n\n/**\n * A function component that receives props and returns a VNode or null.\n */\nexport interface FunctionalComponent<P = Record<string, unknown>> {\n (props: P): VNode<any> | null;\n displayName?: string;\n /** @internal Marks this component as a context Provider. */\n _isProvider?: boolean;\n /** @internal Reference to the context object for Provider components. */\n _context?: Context<any>;\n}\n\n/**\n * Generic component type (function components only for SSR).\n */\nexport type ComponentType<P = Record<string, unknown>> = FunctionalComponent<P>;\n\n// =============================================================================\n// Options (vnode lifecycle hook)\n// =============================================================================\n\n/**\n * Global options object. The `vnode` callback is invoked for every VNode\n * created via `jsx()`, `jsxs()`, or `createElement()`. This is used by the\n * renderer to inject nonce values into script/style tags.\n */\nexport const options: {vnode?: (vnode: VNode<any>) => void} = {};\n\n// =============================================================================\n// Fragment\n// =============================================================================\n\n/**\n * Fragment component. Renders its children without a wrapper DOM element.\n * Used as `<>...</>` or `<Fragment>...</Fragment>` in JSX.\n */\nexport function Fragment(props: {children?: ComponentChildren}): any {\n return props.children;\n}\n\n// =============================================================================\n// JSX Automatic Runtime (jsx / jsxs)\n// =============================================================================\n\n/**\n * Creates a VNode. Used by the automatic JSX transform for elements with\n * a single child or no children.\n */\nexport function jsx(\n type: string | FunctionalComponent<any> | typeof Fragment,\n props: Record<string, any>,\n key?: Key\n): VNode {\n const resolvedKey = key !== undefined ? key : props.key ?? null;\n const vnode: VNode = {\n type,\n props,\n key: resolvedKey,\n };\n\n // Strip `key` from props (it's stored on the VNode directly).\n if (props.key !== undefined) {\n const {key: _, ...rest} = props;\n vnode.props = rest;\n }\n\n if (options.vnode) {\n options.vnode(vnode);\n }\n\n return vnode;\n}\n\n/**\n * Creates a VNode with static children. Used by the automatic JSX transform\n * for elements with multiple children. Identical to `jsx()` for SSR since\n * we don't need to diff children.\n */\nexport {jsx as jsxs};\n\n// =============================================================================\n// Classic Runtime (createElement / h)\n// =============================================================================\n\n/**\n * Creates a VNode. Compatible with the classic `React.createElement` API.\n *\n * ```ts\n * createElement('div', {className: 'foo'}, 'Hello', ' ', 'World');\n * ```\n */\nexport function createElement(\n type: string | FunctionalComponent<any> | typeof Fragment,\n props?: Record<string, any> | null,\n ...children: any[]\n): VNode {\n const normalizedProps: Record<string, any> = {...(props || {})};\n\n if (children.length === 1) {\n normalizedProps.children = children[0];\n } else if (children.length > 1) {\n normalizedProps.children = children;\n }\n\n const vnode: VNode = {\n type,\n props: normalizedProps,\n key: normalizedProps.key ?? null,\n };\n\n if (normalizedProps.key !== undefined) {\n delete normalizedProps.key;\n }\n\n if (options.vnode) {\n options.vnode(vnode);\n }\n\n return vnode;\n}\n\nexport {createElement as h};\n\n// =============================================================================\n// Context API\n// =============================================================================\n\n/**\n * A context object created by `createContext()`. Provides a `Provider`\n * component and can be read via `useContext()`.\n */\nexport interface Context<T> {\n /** @internal Default value for this context. */\n _defaultValue: T;\n /** @internal Stack of provided values (managed by renderToString). */\n _stack: T[];\n /** Provider component that supplies a context value to descendants. */\n Provider: FunctionalComponent<{value: T; children?: ComponentChildren}>;\n}\n\n/**\n * Creates a new context with an optional default value. Returns a context\n * object with a `Provider` component.\n *\n * ```ts\n * const ThemeContext = createContext('light');\n *\n * // In a parent component:\n * <ThemeContext.Provider value=\"dark\">\n * <App />\n * </ThemeContext.Provider>\n *\n * // In a child component:\n * const theme = useContext(ThemeContext);\n * ```\n */\nexport function createContext<T>(defaultValue: T): Context<T> {\n const ctx: Context<T> = {\n _defaultValue: defaultValue,\n _stack: [],\n Provider: null as any,\n };\n\n const Provider: FunctionalComponent<{\n value: T;\n children?: ComponentChildren;\n }> = () => {\n // Provider rendering is handled specially by renderToString, which\n // pushes/pops the context value around rendering children. This function\n // body is never actually called during normal SSR rendering.\n return null;\n };\n Provider.displayName = 'ContextProvider';\n Provider._isProvider = true;\n Provider._context = ctx;\n ctx.Provider = Provider;\n\n return ctx;\n}\n\n/**\n * Reads the current value of a context. Must be called during the render\n * of a function component that is a descendant of a matching Provider.\n * Returns the default value if no Provider is found.\n *\n * ```ts\n * const theme = useContext(ThemeContext);\n * ```\n */\nexport function useContext<T>(context: Context<T>): T {\n const stack = context._stack;\n if (stack.length > 0) {\n return stack[stack.length - 1];\n }\n return context._defaultValue;\n}\n\n// Re-export JSX namespace for the automatic transform.\n// TypeScript resolves JSX types from `{jsxImportSource}/jsx-runtime`.\nexport type {JSX} from './types.js';\n"],"mappings":";AA0EO,IAAM,UAAiD,CAAC;AAUxD,SAAS,SAAS,OAA4C;AACnE,SAAO,MAAM;AACf;AAUO,SAAS,IACd,MACA,OACA,KACO;AACP,QAAM,cAAc,QAAQ,SAAY,MAAM,MAAM,OAAO;AAC3D,QAAM,QAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AAGA,MAAI,MAAM,QAAQ,QAAW;AAC3B,UAAM,EAAC,KAAK,GAAG,GAAG,KAAI,IAAI;AAC1B,UAAM,QAAQ;AAAA,EAChB;AAEA,MAAI,QAAQ,OAAO;AACjB,YAAQ,MAAM,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAoBO,SAAS,cACd,MACA,UACG,UACI;AACP,QAAM,kBAAuC,EAAC,GAAI,SAAS,CAAC,EAAE;AAE9D,MAAI,SAAS,WAAW,GAAG;AACzB,oBAAgB,WAAW,SAAS,CAAC;AAAA,EACvC,WAAW,SAAS,SAAS,GAAG;AAC9B,oBAAgB,WAAW;AAAA,EAC7B;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,IACP,KAAK,gBAAgB,OAAO;AAAA,EAC9B;AAEA,MAAI,gBAAgB,QAAQ,QAAW;AACrC,WAAO,gBAAgB;AAAA,EACzB;AAEA,MAAI,QAAQ,OAAO;AACjB,YAAQ,MAAM,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAqCO,SAAS,cAAiB,cAA6B;AAC5D,QAAM,MAAkB;AAAA,IACtB,eAAe;AAAA,IACf,QAAQ,CAAC;AAAA,IACT,UAAU;AAAA,EACZ;AAEA,QAAM,WAGD,MAAM;AAIT,WAAO;AAAA,EACT;AACA,WAAS,cAAc;AACvB,WAAS,cAAc;AACvB,WAAS,WAAW;AACpB,MAAI,WAAW;AAEf,SAAO;AACT;AAWO,SAAS,WAAc,SAAwB;AACpD,QAAM,QAAQ,QAAQ;AACtB,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,MAAM,MAAM,SAAS,CAAC;AAAA,EAC/B;AACA,SAAO,QAAQ;AACjB;","names":[]}
|