lithent 1.21.5 → 1.21.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/lithent-agent-addon.md +2 -2
- package/dist/skills/{SKILL.md → lithent/SKILL.md} +2 -2
- package/dist/skills/{constraints → lithent/constraints}/mistakes.md +1 -1
- package/dist/skills/{constraints → lithent/constraints}/rules.md +1 -1
- package/dist/skills/{constraints → lithent/constraints}/troubleshooting.md +1 -1
- package/dist/skills/{examples → lithent/examples}/quick-examples.md +1 -1
- package/dist/skills/{reference → lithent/reference}/children-type.md +1 -1
- package/dist/skills/{reference → lithent/reference}/lstore-inference.md +1 -1
- package/dist/skills/{reference → lithent/reference}/props-types.md +1 -1
- package/package.json +1 -1
- package/ssr/dist/lithentSsr.mjs +57 -54
- package/ssr/dist/lithentSsr.mjs.map +1 -1
- package/ssr/dist/lithentSsr.umd.js +2 -2
- package/ssr/dist/lithentSsr.umd.js.map +1 -1
- package/ssr/src/index.ts +3 -3
- package/ssr/src/renderToString.ts +10 -2
- package/ssr/src/tests/renderToString.test.tsx +81 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lithent Agent Addon
|
|
2
2
|
|
|
3
|
-
> Version: 1.21.
|
|
3
|
+
> Version: 1.21.7
|
|
4
4
|
|
|
5
5
|
You are a coding agent with Lithent virtual DOM guidance enabled.
|
|
6
6
|
|
|
@@ -120,7 +120,7 @@ COMMON MISTAKES TO CATCH:
|
|
|
120
120
|
REFERENCE MATERIALS (NOT PART OF BEHAVIORAL RULES):
|
|
121
121
|
|
|
122
122
|
For detailed code examples and API usage, refer to:
|
|
123
|
-
node_modules/lithent/dist/skills/SKILL.md
|
|
123
|
+
node_modules/lithent/dist/skills/lithent/SKILL.md
|
|
124
124
|
|
|
125
125
|
This reference material provides comprehensive examples, patterns,
|
|
126
126
|
and import references that complement the behavioral guidelines above.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lithent
|
|
3
3
|
title: Lithent Agent Skills
|
|
4
|
-
version: 1.21.
|
|
4
|
+
version: 1.21.7
|
|
5
5
|
description: AI agent skills for working with the Lithent library.
|
|
6
6
|
additional_materials:
|
|
7
7
|
- constraints/
|
|
@@ -11,7 +11,7 @@ additional_materials:
|
|
|
11
11
|
|
|
12
12
|
# Lithent Agent Skills
|
|
13
13
|
|
|
14
|
-
> Version: 1.21.
|
|
14
|
+
> Version: 1.21.7
|
|
15
15
|
|
|
16
16
|
This file provides AI agent skills for working with the Lithent library.
|
|
17
17
|
|
package/package.json
CHANGED
package/ssr/dist/lithentSsr.mjs
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import { h as f, mount as
|
|
2
|
-
function
|
|
3
|
-
const { children:
|
|
4
|
-
if (
|
|
5
|
-
const l = Array.isArray(
|
|
1
|
+
import { h as f, mount as a, Fragment as k, render as S } from "lithent";
|
|
2
|
+
function o(e, n, t, r, i, c) {
|
|
3
|
+
const { children: s, ...u } = n;
|
|
4
|
+
if (s != null) {
|
|
5
|
+
const l = Array.isArray(s) ? s : [s];
|
|
6
6
|
return f(e, { ...u, key: t }, ...l);
|
|
7
7
|
}
|
|
8
8
|
return f(e, { ...u, key: t });
|
|
9
9
|
}
|
|
10
|
-
const x =
|
|
11
|
-
/* @__PURE__ */
|
|
10
|
+
const x = a((e) => () => /* @__PURE__ */ o(k, { children: [
|
|
11
|
+
/* @__PURE__ */ o("meta", { name: "twitter:card1", content: "summary_large_image" }),
|
|
12
12
|
" ",
|
|
13
|
-
/* @__PURE__ */
|
|
14
|
-
] })), E =
|
|
13
|
+
/* @__PURE__ */ o("meta", { name: "twitter:site2", content: "@superlucky84" })
|
|
14
|
+
] })), E = a((e) => {
|
|
15
15
|
let n = 1, t = "s";
|
|
16
16
|
const r = () => {
|
|
17
17
|
n += 1, t += "s", e();
|
|
18
18
|
};
|
|
19
|
-
return () => /* @__PURE__ */
|
|
19
|
+
return () => /* @__PURE__ */ o("div", { style: { border: `${n}px solid red` }, children: [
|
|
20
20
|
"asve",
|
|
21
|
-
/* @__PURE__ */
|
|
22
|
-
/* @__PURE__ */
|
|
23
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ o("br", {}),
|
|
22
|
+
/* @__PURE__ */ o("section", { innerHTML: "<article>ss</article>" }),
|
|
23
|
+
/* @__PURE__ */ o("button", { disabled: !1, onClick: r, children: [
|
|
24
24
|
n,
|
|
25
25
|
" -== a1 - ",
|
|
26
26
|
n,
|
|
27
27
|
t
|
|
28
28
|
] }),
|
|
29
29
|
n,
|
|
30
|
-
/* @__PURE__ */
|
|
30
|
+
/* @__PURE__ */ o("span", { id: "aa11", "data-max-string": "va", children: [
|
|
31
31
|
" ",
|
|
32
32
|
"123124"
|
|
33
33
|
] })
|
|
34
34
|
] });
|
|
35
35
|
});
|
|
36
|
-
|
|
37
|
-
/* @__PURE__ */
|
|
38
|
-
/* @__PURE__ */
|
|
39
|
-
/* @__PURE__ */
|
|
40
|
-
/* @__PURE__ */
|
|
36
|
+
a((e) => () => /* @__PURE__ */ o("html", { lang: "en", children: [
|
|
37
|
+
/* @__PURE__ */ o("head", { children: [
|
|
38
|
+
/* @__PURE__ */ o("title", { children: "Express with Vite and JSX" }),
|
|
39
|
+
/* @__PURE__ */ o(x, {}),
|
|
40
|
+
/* @__PURE__ */ o("script", { src: "/dist/lithentSsr.umd.js" })
|
|
41
41
|
] }),
|
|
42
|
-
/* @__PURE__ */
|
|
42
|
+
/* @__PURE__ */ o("body", { children: /* @__PURE__ */ o("div", { id: "app", children: /* @__PURE__ */ o(E, {}) }) })
|
|
43
43
|
] }));
|
|
44
44
|
const j = [
|
|
45
45
|
"area",
|
|
@@ -76,19 +76,22 @@ function v(e, n) {
|
|
|
76
76
|
function F(e) {
|
|
77
77
|
return Object.entries(e).map(([n, t]) => `${n.replace(/([A-Z])/g, "-$1").toLowerCase()}: ${t};`).join(" ");
|
|
78
78
|
}
|
|
79
|
+
function H(e) {
|
|
80
|
+
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
81
|
+
}
|
|
79
82
|
function y(e) {
|
|
80
83
|
return g(e);
|
|
81
84
|
}
|
|
82
85
|
function g(e) {
|
|
83
86
|
let n = "";
|
|
84
|
-
const { type: t, tag: r, text: i, props:
|
|
87
|
+
const { type: t, tag: r, text: i, props: c, children: s = [] } = e;
|
|
85
88
|
if (A(t))
|
|
86
|
-
n = d(
|
|
89
|
+
n = d(s, n);
|
|
87
90
|
else if (t === "e" && r) {
|
|
88
|
-
const l =
|
|
89
|
-
l ? n = `<${r}${p(
|
|
91
|
+
const l = c == null ? void 0 : c.innerHTML;
|
|
92
|
+
l ? n = `<${r}${p(c)}>${l}</${r}>` : C(r) && !s.length ? n = `<${r}${p(c)} />` : (n = `<${r}${p(c)}>`, n = d(s, n), n = `${n}</${r}>`);
|
|
90
93
|
} else if (t === "t" && L(i))
|
|
91
|
-
n = String(i), n = d(
|
|
94
|
+
n = H(String(i)), n = d(s, n);
|
|
92
95
|
else
|
|
93
96
|
throw new Error(
|
|
94
97
|
"An attempt was made to render an abnormal virtual DOM object."
|
|
@@ -98,8 +101,8 @@ function g(e) {
|
|
|
98
101
|
function d(e, n) {
|
|
99
102
|
return e.reduce((r, i) => {
|
|
100
103
|
if (i.type) {
|
|
101
|
-
const
|
|
102
|
-
r +=
|
|
104
|
+
const c = g(i);
|
|
105
|
+
r += c;
|
|
103
106
|
}
|
|
104
107
|
return r;
|
|
105
108
|
}, n || "");
|
|
@@ -108,8 +111,8 @@ function p(e) {
|
|
|
108
111
|
let n = [];
|
|
109
112
|
return Object.entries(e || {}).forEach(
|
|
110
113
|
([t, r]) => {
|
|
111
|
-
const i = t === "key",
|
|
112
|
-
if (!(i ||
|
|
114
|
+
const i = t === "key", c = t === "portal" && typeof r == "object", s = t === "innerHTML" && typeof r == "string", u = v(t, r), l = t.match(/^on/);
|
|
115
|
+
if (!(i || c || s || u || l))
|
|
113
116
|
if (N(t, r)) {
|
|
114
117
|
const $ = F(r);
|
|
115
118
|
n.push(`style="${$}"`);
|
|
@@ -117,13 +120,13 @@ function p(e) {
|
|
|
117
120
|
}
|
|
118
121
|
), n.length ? " " + n.join(" ") : "";
|
|
119
122
|
}
|
|
120
|
-
function
|
|
123
|
+
function m(e, n) {
|
|
121
124
|
return M(e, n), S(e, n, null, !0);
|
|
122
125
|
}
|
|
123
126
|
function M(e, n) {
|
|
124
127
|
const t = e.type && ["f", "l"].includes(e.type);
|
|
125
128
|
t && (e.el = new DocumentFragment());
|
|
126
|
-
const r =
|
|
129
|
+
const r = h(
|
|
127
130
|
t ? [...e.children || []] : [e]
|
|
128
131
|
), i = n.tagName === "HTML" ? [n] : Array.from(n.childNodes);
|
|
129
132
|
r && b(r, i);
|
|
@@ -132,36 +135,36 @@ function b(e, n) {
|
|
|
132
135
|
let t = 0;
|
|
133
136
|
n.filter((r) => _(r)).forEach((r) => {
|
|
134
137
|
let i = e[t];
|
|
135
|
-
const
|
|
136
|
-
let
|
|
138
|
+
const c = r.nodeType;
|
|
139
|
+
let s = !1;
|
|
137
140
|
if (((i == null ? void 0 : i.type) === null || (i == null ? void 0 : i.type) === "t" && (i == null ? void 0 : i.text) === `
|
|
138
|
-
` || (i == null ? void 0 : i.type) === "t" &&
|
|
139
|
-
if (i.type === "t" &&
|
|
140
|
-
const { tFragment: u, nIndex: l } =
|
|
141
|
+
` || (i == null ? void 0 : i.type) === "t" && c === 1) && (t += 1, i = e[t]), r && i && i.type && ["t", "e"].includes(i.type)) {
|
|
142
|
+
if (i.type === "t" && c === 3) {
|
|
143
|
+
const { tFragment: u, nIndex: l } = P(
|
|
141
144
|
e,
|
|
142
145
|
t
|
|
143
146
|
);
|
|
144
147
|
t = l, r.parentElement.replaceChild(u, r);
|
|
145
|
-
} else i.type === "e" &&
|
|
146
|
-
|
|
147
|
-
|
|
148
|
+
} else i.type === "e" && c === 1 && ((r.tagName || "").toLowerCase() !== i.tag ? s = !0 : i.el = r);
|
|
149
|
+
s || b(
|
|
150
|
+
h(i.children || []),
|
|
148
151
|
Array.from(r.childNodes)
|
|
149
152
|
);
|
|
150
153
|
}
|
|
151
|
-
|
|
154
|
+
s || (t += 1);
|
|
152
155
|
});
|
|
153
156
|
}
|
|
154
157
|
function _(e) {
|
|
155
158
|
return !(e.nodeType === 3 && !e.data.replace(/\s*/g, ""));
|
|
156
159
|
}
|
|
157
|
-
function
|
|
158
|
-
return e.reduce((n, t) => (t.type && ["f", "l"].includes(t.type) ? (t.el = new DocumentFragment(), n.push(...
|
|
160
|
+
function h(e) {
|
|
161
|
+
return e.reduce((n, t) => (t.type && ["f", "l"].includes(t.type) ? (t.el = new DocumentFragment(), n.push(...h((t == null ? void 0 : t.children) || []))) : n.push(t), n), []);
|
|
159
162
|
}
|
|
160
|
-
function
|
|
163
|
+
function P(e, n) {
|
|
161
164
|
const t = T(e, n, []), r = new DocumentFragment();
|
|
162
165
|
return t.forEach((i) => {
|
|
163
|
-
const
|
|
164
|
-
i.el =
|
|
166
|
+
const c = document.createTextNode(String(i.text));
|
|
167
|
+
i.el = c, r.appendChild(c);
|
|
165
168
|
}), {
|
|
166
169
|
tFragment: r,
|
|
167
170
|
nIndex: n + (t.length - 1)
|
|
@@ -170,16 +173,16 @@ function m(e, n) {
|
|
|
170
173
|
function T(e, n, t) {
|
|
171
174
|
return e[n] && e[n].type === "t" ? (t.push(e[n]), T(e, n + 1, [...t])) : t;
|
|
172
175
|
}
|
|
173
|
-
const
|
|
174
|
-
function
|
|
175
|
-
return typeof window < "u" ?
|
|
176
|
+
const G = y, W = m;
|
|
177
|
+
function J(e) {
|
|
178
|
+
return typeof window < "u" ? W(f(e, {}), document.documentElement) : y(f(e, {}));
|
|
176
179
|
}
|
|
177
|
-
let
|
|
178
|
-
const
|
|
180
|
+
let O;
|
|
181
|
+
const X = O;
|
|
179
182
|
export {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
183
|
+
W as hydration,
|
|
184
|
+
G as renderToString,
|
|
185
|
+
J as renderWithHydration,
|
|
186
|
+
X as run
|
|
184
187
|
};
|
|
185
188
|
//# sourceMappingURL=lithentSsr.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lithentSsr.mjs","sources":["../../jsx-runtime/dist/jsxRuntime.mjs","../src/tests/tostring.tsx","../src/helper/index.ts","../src/renderToString.ts","../src/hydration.ts","../src/index.ts"],"sourcesContent":["import { h as o } from \"lithent\";\nimport { Fragment as h } from \"lithent\";\nfunction f(s, t, e, a, c, l) {\n const { children: r, ...n } = t;\n if (r != null) {\n const i = Array.isArray(r) ? r : [r];\n return o(s, { ...n, key: e }, ...i);\n }\n return o(s, { ...n, key: e });\n}\nexport {\n h as Fragment,\n f as jsx,\n f as jsxDEV,\n f as jsxs\n};\n//# sourceMappingURL=jsxRuntime.mjs.map\n","import { mount, Fragment } from 'lithent';\n\nconst Meta = mount(_r => {\n return () => (\n <Fragment>\n <meta name=\"twitter:card1\" content=\"summary_large_image\" />{' '}\n <meta name=\"twitter:site2\" content=\"@superlucky84\" />\n </Fragment>\n );\n});\n\nconst Children = mount(r => {\n let v = 1;\n let k = 's';\n\n const increase = () => {\n v += 1;\n k += 's';\n r();\n };\n\n return () => (\n <div style={{ border: `${v}px solid red` }}>\n asve\n <br />\n <section innerHTML=\"<article>ss</article>\" />\n <button disabled={false} onClick={increase}>\n {v} -== a1 - {v}\n {k}\n </button>\n {v}\n <span id=\"aa11\" data-max-string=\"va\">\n {' '}123124\n </span>\n </div>\n );\n});\n\nconst Root = mount(_r => {\n return () => (\n <html lang=\"en\">\n <head>\n <title>Express with Vite and JSX</title>\n <Meta />\n <script src=\"/dist/lithentSsr.umd.js\"></script>\n </head>\n <body>\n <div id=\"app\">\n <Children />\n </div>\n </body>\n </html>\n );\n});\n\nexport default Root;\n","const SELF_CLOSE_ALLLOW = [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n];\n\nexport function isAllowSelfClose(tagname: string) {\n return SELF_CLOSE_ALLLOW.includes(tagname);\n}\n\nexport function checkExisty(value: unknown) {\n return value !== null && value !== undefined;\n}\n\nexport function checkVirtualType(type?: string | null) {\n return type && ['f', 'l'].includes(type);\n}\n\nexport function checkStyleData(\n dataKey: string,\n dataValue: unknown\n): dataValue is Record<string, string> {\n return dataKey === 'style' && typeof dataValue === 'object';\n}\n\nexport function checkRefData(\n dataKey: string,\n dataValue: unknown\n): dataValue is {\n value: HTMLElement | Element | DocumentFragment | Text | undefined;\n} {\n return dataKey === 'ref' && typeof dataValue === 'object';\n}\n\nexport function styleObjectToString(styleObj: Record<string, string>) {\n return Object.entries(styleObj)\n .map(([key, value]) => {\n // camelCase를 kebab-case로 변환 (예: borderTop -> border-top)\n const kebabKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${kebabKey}: ${value};`;\n })\n .join(' ');\n}\n","import type { WDom, Props } from 'lithent';\nimport {\n isAllowSelfClose,\n checkExisty,\n checkVirtualType,\n checkStyleData,\n checkRefData,\n styleObjectToString,\n} from '@/helper';\n\n/**\n * Main function of renderToString\"\n */\nexport function renderToString(wDom: WDom) {\n return wDomToString(wDom);\n}\n\n/**\n * Converts a chunk of virtual DOM objects into string tags.\n */\nfunction wDomToString(wDom: WDom) {\n let element = '';\n const { type, tag, text, props, children = [] } = wDom;\n const isVirtualType = checkVirtualType(type);\n\n if (isVirtualType) {\n element = wDomChildrenToDom(children, element);\n } else if (type === 'e' && tag) {\n const innerHTML = props?.innerHTML;\n\n if (innerHTML) {\n element = `<${tag}${makeProp(props)}>${innerHTML}</${tag}>`;\n } else if (isAllowSelfClose(tag) && !children.length) {\n element = `<${tag}${makeProp(props)} />`;\n } else {\n element = `<${tag}${makeProp(props)}>`;\n element = wDomChildrenToDom(children, element);\n element = `${element}</${tag}>`;\n }\n } else if (type === 't' && checkExisty(text)) {\n element = String(text);\n element = wDomChildrenToDom(children, element);\n } else {\n throw new Error(\n 'An attempt was made to render an abnormal virtual DOM object.'\n );\n }\n\n return element;\n}\n\n/**\n * Converts all child nodes of a virtual DOM object into string tags.\n */\nfunction wDomChildrenToDom(children: WDom[], parentElement?: string) {\n const newString = children.reduce((acc: string, childItem: WDom) => {\n if (childItem.type) {\n const childElement = wDomToString(childItem);\n\n acc += childElement;\n }\n\n return acc;\n }, parentElement || '');\n\n return newString;\n}\n\n/**\n * Creates and attaches a prop string to the tag.\n */\nfunction makeProp(props?: Props) {\n let attrGroup: string[] = [];\n\n Object.entries(props || {}).forEach(\n ([dataKey, dataValue]: [string, unknown]) => {\n const isKey = dataKey === 'key';\n const isPortal = dataKey === 'portal' && typeof dataValue === 'object';\n const isHtml = dataKey === 'innerHTML' && typeof dataValue === 'string';\n const isRef = checkRefData(dataKey, dataValue);\n const isEvent = dataKey.match(/^on/);\n\n if (!(isKey || isPortal || isHtml || isRef || isEvent)) {\n if (checkStyleData(dataKey, dataValue)) {\n const cssString = styleObjectToString(dataValue);\n attrGroup.push(`style=\"${cssString}\"`);\n } else if (dataKey && dataValue === true) {\n attrGroup.push(`${dataKey}=\"${dataKey}\"`);\n } else if (dataKey && typeof dataValue !== 'boolean') {\n attrGroup.push(`${dataKey}=\"${String(dataValue)}\"`);\n }\n }\n }\n );\n\n return attrGroup.length ? ' ' + attrGroup.join(' ') : '';\n}\n","import { render } from 'lithent';\nimport type { WDom } from 'lithent';\n\n/**\n * hydration\n */\nexport function hydration(wDom: WDom, wrapElement: HTMLElement) {\n /**\n * Attach the el property to wDom.\n */\n addElement(wDom, wrapElement);\n\n /**\n * Attach events to wDom.\n */\n return render(wDom, wrapElement, null, true);\n}\n\n/**\n * Attach the el property to wDom.\n */\nfunction addElement(wDomOrig: WDom, wrapElement: HTMLElement) {\n const isVirtualType = wDomOrig.type && ['f', 'l'].includes(wDomOrig.type);\n\n if (isVirtualType) {\n wDomOrig.el = new DocumentFragment();\n }\n const wDomList = flatFlagmentFromList(\n isVirtualType ? [...(wDomOrig.children || [])] : [wDomOrig]\n );\n\n const realDomList =\n wrapElement.tagName === 'HTML'\n ? [wrapElement]\n : Array.from(wrapElement.childNodes);\n\n if (wDomList) {\n addElementProcessChildren(wDomList, realDomList);\n }\n}\n\n/**\n * Attach the el property to wDom recursively.\n */\nfunction addElementProcessChildren(wDomList: WDom[], realDomList: ChildNode[]) {\n let index = 0;\n realDomList\n .filter((item: any) => filteredEmptyTextNode(item))\n .forEach(realDomItem => {\n let wDomItem = wDomList[index];\n const nodeType = realDomItem.nodeType;\n let pass = false;\n\n if (\n wDomItem?.type === null ||\n (wDomItem?.type === 't' && wDomItem?.text === '\\n') ||\n (wDomItem?.type === 't' && nodeType === 1)\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['t', 'e'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 't' && nodeType === 3) {\n const { tFragment, nIndex } = processConsecutiveTextNodes(\n wDomList,\n index\n );\n index = nIndex;\n realDomItem!.parentElement!.replaceChild(tFragment, realDomItem);\n } else if (wDomItem.type === 'e' && nodeType === 1) {\n if (\n ((realDomItem as HTMLElement).tagName || '').toLowerCase() !==\n wDomItem.tag\n ) {\n // throw new Error('Hydration Error - not matched tagname');\n pass = true;\n } else {\n wDomItem.el = realDomItem as HTMLElement;\n }\n }\n\n if (!pass) {\n addElementProcessChildren(\n flatFlagmentFromList(wDomItem.children || []),\n Array.from(realDomItem.childNodes)\n );\n }\n }\n\n if (!pass) {\n index += 1;\n }\n });\n}\n\n/**\n * Whitespace or text nodes are ignored.\n */\nfunction filteredEmptyTextNode(item: HTMLElement | Text) {\n if (item.nodeType === 3 && !(item as Text).data.replace(/\\s*/g, '')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Flattens nested fragment types.\n */\nfunction flatFlagmentFromList(wDomlist: WDom[]) {\n return wDomlist.reduce((acc: WDom[], item: WDom) => {\n if (item.type && ['f', 'l'].includes(item.type)) {\n item.el = new DocumentFragment();\n acc.push(...flatFlagmentFromList(item?.children || []));\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n}\n\n/**\n * Hydration is applied to consecutively rendered text node objects.\n */\nfunction processConsecutiveTextNodes(wDomList: WDom[], cIndex: number) {\n const textWDomList: WDom[] = collectAdjacentTextNode(wDomList, cIndex, []);\n const tFragment = new DocumentFragment();\n textWDomList.forEach(item => {\n const textNode = document.createTextNode(String(item.text));\n item.el = textNode;\n tFragment.appendChild(textNode);\n });\n\n return {\n tFragment,\n nIndex: cIndex + (textWDomList.length - 1),\n };\n}\n\n/**\n * Collect consecutive text nodes.\n */\nfunction collectAdjacentTextNode(\n wDomList: WDom[],\n cIndex: number,\n acc: WDom[]\n): WDom[] {\n if (wDomList[cIndex] && wDomList[cIndex].type === 't') {\n acc.push(wDomList[cIndex]);\n\n return collectAdjacentTextNode(wDomList, cIndex + 1, [...acc]);\n }\n return acc;\n}\n","import { h } from 'lithent';\nimport type { TagFunction } from 'lithent';\nimport Test from '@/tests/tostring';\nimport { renderToString as _renderToString } from '@/renderToString';\nimport { hydration as _hydration } from '@/hydration';\n\nexport const renderToString = _renderToString;\nexport const hydration = _hydration;\n\nexport function renderWithHydration(tagFunction: TagFunction) {\n if (typeof window !== 'undefined') {\n return hydration(h(tagFunction, {}), document.documentElement);\n }\n\n return _renderToString(h(tagFunction, {}));\n}\n\nlet _run: ((wrap: HTMLElement) => void) | undefined;\n\nif (import.meta.env.MODE === 'development') {\n _run = (wrap: HTMLElement) => {\n hydration(h(Test as TagFunction, {}), wrap);\n };\n}\n\nexport const run = _run;\n"],"names":["f","s","t","e","a","c","l","r","n","i","o","Meta","mount","_r","Fragment","jsx","Children","v","k","increase","jsxs","SELF_CLOSE_ALLLOW","isAllowSelfClose","tagname","checkExisty","value","checkVirtualType","type","checkStyleData","dataKey","dataValue","checkRefData","styleObjectToString","styleObj","key","renderToString","wDom","wDomToString","element","tag","text","props","children","wDomChildrenToDom","innerHTML","makeProp","parentElement","acc","childItem","childElement","attrGroup","isKey","isPortal","isHtml","isRef","isEvent","cssString","hydration","wrapElement","addElement","render","wDomOrig","isVirtualType","wDomList","flatFlagmentFromList","realDomList","addElementProcessChildren","index","item","filteredEmptyTextNode","realDomItem","wDomItem","nodeType","pass","tFragment","nIndex","processConsecutiveTextNodes","wDomlist","cIndex","textWDomList","collectAdjacentTextNode","textNode","_renderToString","_hydration","renderWithHydration","tagFunction","h","_run","run"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lithentSsr.mjs","sources":["../../jsx-runtime/dist/jsxRuntime.mjs","../src/tests/tostring.tsx","../src/helper/index.ts","../src/renderToString.ts","../src/hydration.ts","../src/index.ts"],"sourcesContent":["import { h as o } from \"lithent\";\nimport { Fragment as h } from \"lithent\";\nfunction f(s, t, e, a, c, l) {\n const { children: r, ...n } = t;\n if (r != null) {\n const i = Array.isArray(r) ? r : [r];\n return o(s, { ...n, key: e }, ...i);\n }\n return o(s, { ...n, key: e });\n}\nexport {\n h as Fragment,\n f as jsx,\n f as jsxDEV,\n f as jsxs\n};\n//# sourceMappingURL=jsxRuntime.mjs.map\n","import { mount, Fragment } from 'lithent';\n\nconst Meta = mount(_r => {\n return () => (\n <Fragment>\n <meta name=\"twitter:card1\" content=\"summary_large_image\" />{' '}\n <meta name=\"twitter:site2\" content=\"@superlucky84\" />\n </Fragment>\n );\n});\n\nconst Children = mount(r => {\n let v = 1;\n let k = 's';\n\n const increase = () => {\n v += 1;\n k += 's';\n r();\n };\n\n return () => (\n <div style={{ border: `${v}px solid red` }}>\n asve\n <br />\n <section innerHTML=\"<article>ss</article>\" />\n <button disabled={false} onClick={increase}>\n {v} -== a1 - {v}\n {k}\n </button>\n {v}\n <span id=\"aa11\" data-max-string=\"va\">\n {' '}123124\n </span>\n </div>\n );\n});\n\nconst Root = mount(_r => {\n return () => (\n <html lang=\"en\">\n <head>\n <title>Express with Vite and JSX</title>\n <Meta />\n <script src=\"/dist/lithentSsr.umd.js\"></script>\n </head>\n <body>\n <div id=\"app\">\n <Children />\n </div>\n </body>\n </html>\n );\n});\n\nexport default Root;\n","const SELF_CLOSE_ALLLOW = [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n];\n\nexport function isAllowSelfClose(tagname: string) {\n return SELF_CLOSE_ALLLOW.includes(tagname);\n}\n\nexport function checkExisty(value: unknown) {\n return value !== null && value !== undefined;\n}\n\nexport function checkVirtualType(type?: string | null) {\n return type && ['f', 'l'].includes(type);\n}\n\nexport function checkStyleData(\n dataKey: string,\n dataValue: unknown\n): dataValue is Record<string, string> {\n return dataKey === 'style' && typeof dataValue === 'object';\n}\n\nexport function checkRefData(\n dataKey: string,\n dataValue: unknown\n): dataValue is {\n value: HTMLElement | Element | DocumentFragment | Text | undefined;\n} {\n return dataKey === 'ref' && typeof dataValue === 'object';\n}\n\nexport function styleObjectToString(styleObj: Record<string, string>) {\n return Object.entries(styleObj)\n .map(([key, value]) => {\n // camelCase를 kebab-case로 변환 (예: borderTop -> border-top)\n const kebabKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${kebabKey}: ${value};`;\n })\n .join(' ');\n}\n","import type { WDom, Props } from 'lithent';\nimport {\n isAllowSelfClose,\n checkExisty,\n checkVirtualType,\n checkStyleData,\n checkRefData,\n styleObjectToString,\n} from './helper';\n\n/**\n * Escape special HTML characters in text node content.\n * Prevents text like `<h-state>` from being parsed as HTML elements by the browser.\n */\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/**\n * Main function of renderToString\"\n */\nexport function renderToString(wDom: WDom) {\n return wDomToString(wDom);\n}\n\n/**\n * Converts a chunk of virtual DOM objects into string tags.\n */\nfunction wDomToString(wDom: WDom) {\n let element = '';\n const { type, tag, text, props, children = [] } = wDom;\n const isVirtualType = checkVirtualType(type);\n\n if (isVirtualType) {\n element = wDomChildrenToDom(children, element);\n } else if (type === 'e' && tag) {\n const innerHTML = props?.innerHTML;\n\n if (innerHTML) {\n element = `<${tag}${makeProp(props)}>${innerHTML}</${tag}>`;\n } else if (isAllowSelfClose(tag) && !children.length) {\n element = `<${tag}${makeProp(props)} />`;\n } else {\n element = `<${tag}${makeProp(props)}>`;\n element = wDomChildrenToDom(children, element);\n element = `${element}</${tag}>`;\n }\n } else if (type === 't' && checkExisty(text)) {\n element = escapeHtml(String(text));\n element = wDomChildrenToDom(children, element);\n } else {\n throw new Error(\n 'An attempt was made to render an abnormal virtual DOM object.'\n );\n }\n\n return element;\n}\n\n/**\n * Converts all child nodes of a virtual DOM object into string tags.\n */\nfunction wDomChildrenToDom(children: WDom[], parentElement?: string) {\n const newString = children.reduce((acc: string, childItem: WDom) => {\n if (childItem.type) {\n const childElement = wDomToString(childItem);\n\n acc += childElement;\n }\n\n return acc;\n }, parentElement || '');\n\n return newString;\n}\n\n/**\n * Creates and attaches a prop string to the tag.\n */\nfunction makeProp(props?: Props) {\n let attrGroup: string[] = [];\n\n Object.entries(props || {}).forEach(\n ([dataKey, dataValue]: [string, unknown]) => {\n const isKey = dataKey === 'key';\n const isPortal = dataKey === 'portal' && typeof dataValue === 'object';\n const isHtml = dataKey === 'innerHTML' && typeof dataValue === 'string';\n const isRef = checkRefData(dataKey, dataValue);\n const isEvent = dataKey.match(/^on/);\n\n if (!(isKey || isPortal || isHtml || isRef || isEvent)) {\n if (checkStyleData(dataKey, dataValue)) {\n const cssString = styleObjectToString(dataValue);\n attrGroup.push(`style=\"${cssString}\"`);\n } else if (dataKey && dataValue === true) {\n attrGroup.push(`${dataKey}=\"${dataKey}\"`);\n } else if (dataKey && typeof dataValue !== 'boolean') {\n attrGroup.push(`${dataKey}=\"${String(dataValue)}\"`);\n }\n }\n }\n );\n\n return attrGroup.length ? ' ' + attrGroup.join(' ') : '';\n}\n","import { render } from 'lithent';\nimport type { WDom } from 'lithent';\n\n/**\n * hydration\n */\nexport function hydration(wDom: WDom, wrapElement: HTMLElement) {\n /**\n * Attach the el property to wDom.\n */\n addElement(wDom, wrapElement);\n\n /**\n * Attach events to wDom.\n */\n return render(wDom, wrapElement, null, true);\n}\n\n/**\n * Attach the el property to wDom.\n */\nfunction addElement(wDomOrig: WDom, wrapElement: HTMLElement) {\n const isVirtualType = wDomOrig.type && ['f', 'l'].includes(wDomOrig.type);\n\n if (isVirtualType) {\n wDomOrig.el = new DocumentFragment();\n }\n const wDomList = flatFlagmentFromList(\n isVirtualType ? [...(wDomOrig.children || [])] : [wDomOrig]\n );\n\n const realDomList =\n wrapElement.tagName === 'HTML'\n ? [wrapElement]\n : Array.from(wrapElement.childNodes);\n\n if (wDomList) {\n addElementProcessChildren(wDomList, realDomList);\n }\n}\n\n/**\n * Attach the el property to wDom recursively.\n */\nfunction addElementProcessChildren(wDomList: WDom[], realDomList: ChildNode[]) {\n let index = 0;\n realDomList\n .filter((item: any) => filteredEmptyTextNode(item))\n .forEach(realDomItem => {\n let wDomItem = wDomList[index];\n const nodeType = realDomItem.nodeType;\n let pass = false;\n\n if (\n wDomItem?.type === null ||\n (wDomItem?.type === 't' && wDomItem?.text === '\\n') ||\n (wDomItem?.type === 't' && nodeType === 1)\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['t', 'e'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 't' && nodeType === 3) {\n const { tFragment, nIndex } = processConsecutiveTextNodes(\n wDomList,\n index\n );\n index = nIndex;\n realDomItem!.parentElement!.replaceChild(tFragment, realDomItem);\n } else if (wDomItem.type === 'e' && nodeType === 1) {\n if (\n ((realDomItem as HTMLElement).tagName || '').toLowerCase() !==\n wDomItem.tag\n ) {\n // throw new Error('Hydration Error - not matched tagname');\n pass = true;\n } else {\n wDomItem.el = realDomItem as HTMLElement;\n }\n }\n\n if (!pass) {\n addElementProcessChildren(\n flatFlagmentFromList(wDomItem.children || []),\n Array.from(realDomItem.childNodes)\n );\n }\n }\n\n if (!pass) {\n index += 1;\n }\n });\n}\n\n/**\n * Whitespace or text nodes are ignored.\n */\nfunction filteredEmptyTextNode(item: HTMLElement | Text) {\n if (item.nodeType === 3 && !(item as Text).data.replace(/\\s*/g, '')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Flattens nested fragment types.\n */\nfunction flatFlagmentFromList(wDomlist: WDom[]) {\n return wDomlist.reduce((acc: WDom[], item: WDom) => {\n if (item.type && ['f', 'l'].includes(item.type)) {\n item.el = new DocumentFragment();\n acc.push(...flatFlagmentFromList(item?.children || []));\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n}\n\n/**\n * Hydration is applied to consecutively rendered text node objects.\n */\nfunction processConsecutiveTextNodes(wDomList: WDom[], cIndex: number) {\n const textWDomList: WDom[] = collectAdjacentTextNode(wDomList, cIndex, []);\n const tFragment = new DocumentFragment();\n textWDomList.forEach(item => {\n const textNode = document.createTextNode(String(item.text));\n item.el = textNode;\n tFragment.appendChild(textNode);\n });\n\n return {\n tFragment,\n nIndex: cIndex + (textWDomList.length - 1),\n };\n}\n\n/**\n * Collect consecutive text nodes.\n */\nfunction collectAdjacentTextNode(\n wDomList: WDom[],\n cIndex: number,\n acc: WDom[]\n): WDom[] {\n if (wDomList[cIndex] && wDomList[cIndex].type === 't') {\n acc.push(wDomList[cIndex]);\n\n return collectAdjacentTextNode(wDomList, cIndex + 1, [...acc]);\n }\n return acc;\n}\n","import { h } from 'lithent';\nimport type { TagFunction } from 'lithent';\nimport Test from './tests/tostring';\nimport { renderToString as _renderToString } from './renderToString';\nimport { hydration as _hydration } from './hydration';\n\nexport const renderToString = _renderToString;\nexport const hydration = _hydration;\n\nexport function renderWithHydration(tagFunction: TagFunction) {\n if (typeof window !== 'undefined') {\n return hydration(h(tagFunction, {}), document.documentElement);\n }\n\n return _renderToString(h(tagFunction, {}));\n}\n\nlet _run: ((wrap: HTMLElement) => void) | undefined;\n\nif (import.meta.env.MODE === 'development') {\n _run = (wrap: HTMLElement) => {\n hydration(h(Test as TagFunction, {}), wrap);\n };\n}\n\nexport const run = _run;\n"],"names":["f","s","t","e","a","c","l","r","n","i","o","Meta","mount","_r","Fragment","jsx","Children","v","k","increase","jsxs","SELF_CLOSE_ALLLOW","isAllowSelfClose","tagname","checkExisty","value","checkVirtualType","type","checkStyleData","dataKey","dataValue","checkRefData","styleObjectToString","styleObj","key","escapeHtml","str","renderToString","wDom","wDomToString","element","tag","text","props","children","wDomChildrenToDom","innerHTML","makeProp","parentElement","acc","childItem","childElement","attrGroup","isKey","isPortal","isHtml","isRef","isEvent","cssString","hydration","wrapElement","addElement","render","wDomOrig","isVirtualType","wDomList","flatFlagmentFromList","realDomList","addElementProcessChildren","index","item","filteredEmptyTextNode","realDomItem","wDomItem","nodeType","pass","tFragment","nIndex","processConsecutiveTextNodes","wDomlist","cIndex","textWDomList","collectAdjacentTextNode","textNode","_renderToString","_hydration","renderWithHydration","tagFunction","h","_run","run"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(function(u,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("lithent")):typeof define=="function"&&define.amd?define(["exports","lithent"],l):(u=typeof globalThis<"u"?globalThis:u||self,l(u.lithentSsr={},u.lithent))})(this,function(u,l){"use strict";function
|
|
2
|
-
`||(i==null?void 0:i.type)==="t"&&o===1)&&(t+=1,i=e[t]),r&&i&&i.type&&["t","e"].includes(i.type)){if(i.type==="t"&&o===3){const{tFragment:d,nIndex:f}=
|
|
1
|
+
(function(u,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("lithent")):typeof define=="function"&&define.amd?define(["exports","lithent"],l):(u=typeof globalThis<"u"?globalThis:u||self,l(u.lithentSsr={},u.lithent))})(this,function(u,l){"use strict";function c(e,n,t,r,i,o){const{children:s,...d}=n;if(s!=null){const f=Array.isArray(s)?s:[s];return l.h(e,{...d,key:t},...f)}return l.h(e,{...d,key:t})}const S=l.mount(e=>()=>c(l.Fragment,{children:[c("meta",{name:"twitter:card1",content:"summary_large_image"})," ",c("meta",{name:"twitter:site2",content:"@superlucky84"})]})),k=l.mount(e=>{let n=1,t="s";const r=()=>{n+=1,t+="s",e()};return()=>c("div",{style:{border:`${n}px solid red`},children:["asve",c("br",{}),c("section",{innerHTML:"<article>ss</article>"}),c("button",{disabled:!1,onClick:r,children:[n," -== a1 - ",n,t]}),n,c("span",{id:"aa11","data-max-string":"va",children:[" ","123124"]})]})});l.mount(e=>()=>c("html",{lang:"en",children:[c("head",{children:[c("title",{children:"Express with Vite and JSX"}),c(S,{}),c("script",{src:"/dist/lithentSsr.umd.js"})]}),c("body",{children:c("div",{id:"app",children:c(k,{})})})]}));const j=["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"];function E(e){return j.includes(e)}function x(e){return e!=null}function C(e){return e&&["f","l"].includes(e)}function L(e,n){return e==="style"&&typeof n=="object"}function m(e,n){return e==="ref"&&typeof n=="object"}function v(e){return Object.entries(e).map(([n,t])=>`${n.replace(/([A-Z])/g,"-$1").toLowerCase()}: ${t};`).join(" ")}function A(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function y(e){return g(e)}function g(e){let n="";const{type:t,tag:r,text:i,props:o,children:s=[]}=e;if(C(t))n=p(s,n);else if(t==="e"&&r){const f=o==null?void 0:o.innerHTML;f?n=`<${r}${h(o)}>${f}</${r}>`:E(r)&&!s.length?n=`<${r}${h(o)} />`:(n=`<${r}${h(o)}>`,n=p(s,n),n=`${n}</${r}>`)}else if(t==="t"&&x(i))n=A(String(i)),n=p(s,n);else throw new Error("An attempt was made to render an abnormal virtual DOM object.");return n}function p(e,n){return e.reduce((r,i)=>{if(i.type){const o=g(i);r+=o}return r},n||"")}function h(e){let n=[];return Object.entries(e||{}).forEach(([t,r])=>{const i=t==="key",o=t==="portal"&&typeof r=="object",s=t==="innerHTML"&&typeof r=="string",d=m(t,r),f=t.match(/^on/);if(!(i||o||s||d||f))if(L(t,r)){const O=v(r);n.push(`style="${O}"`)}else t&&r===!0?n.push(`${t}="${t}"`):t&&typeof r!="boolean"&&n.push(`${t}="${String(r)}"`)}),n.length?" "+n.join(" "):""}function H(e,n){return N(e,n),l.render(e,n,null,!0)}function N(e,n){const t=e.type&&["f","l"].includes(e.type);t&&(e.el=new DocumentFragment);const r=a(t?[...e.children||[]]:[e]),i=n.tagName==="HTML"?[n]:Array.from(n.childNodes);r&&T(r,i)}function T(e,n){let t=0;n.filter(r=>F(r)).forEach(r=>{let i=e[t];const o=r.nodeType;let s=!1;if(((i==null?void 0:i.type)===null||(i==null?void 0:i.type)==="t"&&(i==null?void 0:i.text)===`
|
|
2
|
+
`||(i==null?void 0:i.type)==="t"&&o===1)&&(t+=1,i=e[t]),r&&i&&i.type&&["t","e"].includes(i.type)){if(i.type==="t"&&o===3){const{tFragment:d,nIndex:f}=M(e,t);t=f,r.parentElement.replaceChild(d,r)}else i.type==="e"&&o===1&&((r.tagName||"").toLowerCase()!==i.tag?s=!0:i.el=r);s||T(a(i.children||[]),Array.from(r.childNodes))}s||(t+=1)})}function F(e){return!(e.nodeType===3&&!e.data.replace(/\s*/g,""))}function a(e){return e.reduce((n,t)=>(t.type&&["f","l"].includes(t.type)?(t.el=new DocumentFragment,n.push(...a((t==null?void 0:t.children)||[]))):n.push(t),n),[])}function M(e,n){const t=b(e,n,[]),r=new DocumentFragment;return t.forEach(i=>{const o=document.createTextNode(String(i.text));i.el=o,r.appendChild(o)}),{tFragment:r,nIndex:n+(t.length-1)}}function b(e,n,t){return e[n]&&e[n].type==="t"?(t.push(e[n]),b(e,n+1,[...t])):t}const _=y,$=H;function P(e){return typeof window<"u"?$(l.h(e,{}),document.documentElement):y(l.h(e,{}))}const W=void 0;u.hydration=$,u.renderToString=_,u.renderWithHydration=P,u.run=W,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
3
3
|
//# sourceMappingURL=lithentSsr.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lithentSsr.umd.js","sources":["../../jsx-runtime/dist/jsxRuntime.mjs","../src/tests/tostring.tsx","../src/helper/index.ts","../src/renderToString.ts","../src/hydration.ts","../src/index.ts"],"sourcesContent":["import { h as o } from \"lithent\";\nimport { Fragment as h } from \"lithent\";\nfunction f(s, t, e, a, c, l) {\n const { children: r, ...n } = t;\n if (r != null) {\n const i = Array.isArray(r) ? r : [r];\n return o(s, { ...n, key: e }, ...i);\n }\n return o(s, { ...n, key: e });\n}\nexport {\n h as Fragment,\n f as jsx,\n f as jsxDEV,\n f as jsxs\n};\n//# sourceMappingURL=jsxRuntime.mjs.map\n","import { mount, Fragment } from 'lithent';\n\nconst Meta = mount(_r => {\n return () => (\n <Fragment>\n <meta name=\"twitter:card1\" content=\"summary_large_image\" />{' '}\n <meta name=\"twitter:site2\" content=\"@superlucky84\" />\n </Fragment>\n );\n});\n\nconst Children = mount(r => {\n let v = 1;\n let k = 's';\n\n const increase = () => {\n v += 1;\n k += 's';\n r();\n };\n\n return () => (\n <div style={{ border: `${v}px solid red` }}>\n asve\n <br />\n <section innerHTML=\"<article>ss</article>\" />\n <button disabled={false} onClick={increase}>\n {v} -== a1 - {v}\n {k}\n </button>\n {v}\n <span id=\"aa11\" data-max-string=\"va\">\n {' '}123124\n </span>\n </div>\n );\n});\n\nconst Root = mount(_r => {\n return () => (\n <html lang=\"en\">\n <head>\n <title>Express with Vite and JSX</title>\n <Meta />\n <script src=\"/dist/lithentSsr.umd.js\"></script>\n </head>\n <body>\n <div id=\"app\">\n <Children />\n </div>\n </body>\n </html>\n );\n});\n\nexport default Root;\n","const SELF_CLOSE_ALLLOW = [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n];\n\nexport function isAllowSelfClose(tagname: string) {\n return SELF_CLOSE_ALLLOW.includes(tagname);\n}\n\nexport function checkExisty(value: unknown) {\n return value !== null && value !== undefined;\n}\n\nexport function checkVirtualType(type?: string | null) {\n return type && ['f', 'l'].includes(type);\n}\n\nexport function checkStyleData(\n dataKey: string,\n dataValue: unknown\n): dataValue is Record<string, string> {\n return dataKey === 'style' && typeof dataValue === 'object';\n}\n\nexport function checkRefData(\n dataKey: string,\n dataValue: unknown\n): dataValue is {\n value: HTMLElement | Element | DocumentFragment | Text | undefined;\n} {\n return dataKey === 'ref' && typeof dataValue === 'object';\n}\n\nexport function styleObjectToString(styleObj: Record<string, string>) {\n return Object.entries(styleObj)\n .map(([key, value]) => {\n // camelCase를 kebab-case로 변환 (예: borderTop -> border-top)\n const kebabKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${kebabKey}: ${value};`;\n })\n .join(' ');\n}\n","import type { WDom, Props } from 'lithent';\nimport {\n isAllowSelfClose,\n checkExisty,\n checkVirtualType,\n checkStyleData,\n checkRefData,\n styleObjectToString,\n} from '@/helper';\n\n/**\n * Main function of renderToString\"\n */\nexport function renderToString(wDom: WDom) {\n return wDomToString(wDom);\n}\n\n/**\n * Converts a chunk of virtual DOM objects into string tags.\n */\nfunction wDomToString(wDom: WDom) {\n let element = '';\n const { type, tag, text, props, children = [] } = wDom;\n const isVirtualType = checkVirtualType(type);\n\n if (isVirtualType) {\n element = wDomChildrenToDom(children, element);\n } else if (type === 'e' && tag) {\n const innerHTML = props?.innerHTML;\n\n if (innerHTML) {\n element = `<${tag}${makeProp(props)}>${innerHTML}</${tag}>`;\n } else if (isAllowSelfClose(tag) && !children.length) {\n element = `<${tag}${makeProp(props)} />`;\n } else {\n element = `<${tag}${makeProp(props)}>`;\n element = wDomChildrenToDom(children, element);\n element = `${element}</${tag}>`;\n }\n } else if (type === 't' && checkExisty(text)) {\n element = String(text);\n element = wDomChildrenToDom(children, element);\n } else {\n throw new Error(\n 'An attempt was made to render an abnormal virtual DOM object.'\n );\n }\n\n return element;\n}\n\n/**\n * Converts all child nodes of a virtual DOM object into string tags.\n */\nfunction wDomChildrenToDom(children: WDom[], parentElement?: string) {\n const newString = children.reduce((acc: string, childItem: WDom) => {\n if (childItem.type) {\n const childElement = wDomToString(childItem);\n\n acc += childElement;\n }\n\n return acc;\n }, parentElement || '');\n\n return newString;\n}\n\n/**\n * Creates and attaches a prop string to the tag.\n */\nfunction makeProp(props?: Props) {\n let attrGroup: string[] = [];\n\n Object.entries(props || {}).forEach(\n ([dataKey, dataValue]: [string, unknown]) => {\n const isKey = dataKey === 'key';\n const isPortal = dataKey === 'portal' && typeof dataValue === 'object';\n const isHtml = dataKey === 'innerHTML' && typeof dataValue === 'string';\n const isRef = checkRefData(dataKey, dataValue);\n const isEvent = dataKey.match(/^on/);\n\n if (!(isKey || isPortal || isHtml || isRef || isEvent)) {\n if (checkStyleData(dataKey, dataValue)) {\n const cssString = styleObjectToString(dataValue);\n attrGroup.push(`style=\"${cssString}\"`);\n } else if (dataKey && dataValue === true) {\n attrGroup.push(`${dataKey}=\"${dataKey}\"`);\n } else if (dataKey && typeof dataValue !== 'boolean') {\n attrGroup.push(`${dataKey}=\"${String(dataValue)}\"`);\n }\n }\n }\n );\n\n return attrGroup.length ? ' ' + attrGroup.join(' ') : '';\n}\n","import { render } from 'lithent';\nimport type { WDom } from 'lithent';\n\n/**\n * hydration\n */\nexport function hydration(wDom: WDom, wrapElement: HTMLElement) {\n /**\n * Attach the el property to wDom.\n */\n addElement(wDom, wrapElement);\n\n /**\n * Attach events to wDom.\n */\n return render(wDom, wrapElement, null, true);\n}\n\n/**\n * Attach the el property to wDom.\n */\nfunction addElement(wDomOrig: WDom, wrapElement: HTMLElement) {\n const isVirtualType = wDomOrig.type && ['f', 'l'].includes(wDomOrig.type);\n\n if (isVirtualType) {\n wDomOrig.el = new DocumentFragment();\n }\n const wDomList = flatFlagmentFromList(\n isVirtualType ? [...(wDomOrig.children || [])] : [wDomOrig]\n );\n\n const realDomList =\n wrapElement.tagName === 'HTML'\n ? [wrapElement]\n : Array.from(wrapElement.childNodes);\n\n if (wDomList) {\n addElementProcessChildren(wDomList, realDomList);\n }\n}\n\n/**\n * Attach the el property to wDom recursively.\n */\nfunction addElementProcessChildren(wDomList: WDom[], realDomList: ChildNode[]) {\n let index = 0;\n realDomList\n .filter((item: any) => filteredEmptyTextNode(item))\n .forEach(realDomItem => {\n let wDomItem = wDomList[index];\n const nodeType = realDomItem.nodeType;\n let pass = false;\n\n if (\n wDomItem?.type === null ||\n (wDomItem?.type === 't' && wDomItem?.text === '\\n') ||\n (wDomItem?.type === 't' && nodeType === 1)\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['t', 'e'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 't' && nodeType === 3) {\n const { tFragment, nIndex } = processConsecutiveTextNodes(\n wDomList,\n index\n );\n index = nIndex;\n realDomItem!.parentElement!.replaceChild(tFragment, realDomItem);\n } else if (wDomItem.type === 'e' && nodeType === 1) {\n if (\n ((realDomItem as HTMLElement).tagName || '').toLowerCase() !==\n wDomItem.tag\n ) {\n // throw new Error('Hydration Error - not matched tagname');\n pass = true;\n } else {\n wDomItem.el = realDomItem as HTMLElement;\n }\n }\n\n if (!pass) {\n addElementProcessChildren(\n flatFlagmentFromList(wDomItem.children || []),\n Array.from(realDomItem.childNodes)\n );\n }\n }\n\n if (!pass) {\n index += 1;\n }\n });\n}\n\n/**\n * Whitespace or text nodes are ignored.\n */\nfunction filteredEmptyTextNode(item: HTMLElement | Text) {\n if (item.nodeType === 3 && !(item as Text).data.replace(/\\s*/g, '')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Flattens nested fragment types.\n */\nfunction flatFlagmentFromList(wDomlist: WDom[]) {\n return wDomlist.reduce((acc: WDom[], item: WDom) => {\n if (item.type && ['f', 'l'].includes(item.type)) {\n item.el = new DocumentFragment();\n acc.push(...flatFlagmentFromList(item?.children || []));\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n}\n\n/**\n * Hydration is applied to consecutively rendered text node objects.\n */\nfunction processConsecutiveTextNodes(wDomList: WDom[], cIndex: number) {\n const textWDomList: WDom[] = collectAdjacentTextNode(wDomList, cIndex, []);\n const tFragment = new DocumentFragment();\n textWDomList.forEach(item => {\n const textNode = document.createTextNode(String(item.text));\n item.el = textNode;\n tFragment.appendChild(textNode);\n });\n\n return {\n tFragment,\n nIndex: cIndex + (textWDomList.length - 1),\n };\n}\n\n/**\n * Collect consecutive text nodes.\n */\nfunction collectAdjacentTextNode(\n wDomList: WDom[],\n cIndex: number,\n acc: WDom[]\n): WDom[] {\n if (wDomList[cIndex] && wDomList[cIndex].type === 't') {\n acc.push(wDomList[cIndex]);\n\n return collectAdjacentTextNode(wDomList, cIndex + 1, [...acc]);\n }\n return acc;\n}\n","import { h } from 'lithent';\nimport type { TagFunction } from 'lithent';\nimport Test from '@/tests/tostring';\nimport { renderToString as _renderToString } from '@/renderToString';\nimport { hydration as _hydration } from '@/hydration';\n\nexport const renderToString = _renderToString;\nexport const hydration = _hydration;\n\nexport function renderWithHydration(tagFunction: TagFunction) {\n if (typeof window !== 'undefined') {\n return hydration(h(tagFunction, {}), document.documentElement);\n }\n\n return _renderToString(h(tagFunction, {}));\n}\n\nlet _run: ((wrap: HTMLElement) => void) | undefined;\n\nif (import.meta.env.MODE === 'development') {\n _run = (wrap: HTMLElement) => {\n hydration(h(Test as TagFunction, {}), wrap);\n };\n}\n\nexport const run = _run;\n"],"names":["f","s","t","e","a","c","l","r","n","i","o","Meta","mount","_r","Fragment","jsx","Children","v","k","increase","jsxs","SELF_CLOSE_ALLLOW","isAllowSelfClose","tagname","checkExisty","value","checkVirtualType","type","checkStyleData","dataKey","dataValue","checkRefData","styleObjectToString","styleObj","key","renderToString","wDom","wDomToString","element","tag","text","props","children","wDomChildrenToDom","innerHTML","makeProp","parentElement","acc","childItem","childElement","attrGroup","isKey","isPortal","isHtml","isRef","isEvent","cssString","hydration","wrapElement","addElement","render","wDomOrig","isVirtualType","wDomList","flatFlagmentFromList","realDomList","addElementProcessChildren","index","item","filteredEmptyTextNode","realDomItem","wDomItem","nodeType","pass","tFragment","nIndex","processConsecutiveTextNodes","wDomlist","cIndex","textWDomList","collectAdjacentTextNode","textNode","_renderToString","_hydration","renderWithHydration","tagFunction","h","run"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lithentSsr.umd.js","sources":["../../jsx-runtime/dist/jsxRuntime.mjs","../src/tests/tostring.tsx","../src/helper/index.ts","../src/renderToString.ts","../src/hydration.ts","../src/index.ts"],"sourcesContent":["import { h as o } from \"lithent\";\nimport { Fragment as h } from \"lithent\";\nfunction f(s, t, e, a, c, l) {\n const { children: r, ...n } = t;\n if (r != null) {\n const i = Array.isArray(r) ? r : [r];\n return o(s, { ...n, key: e }, ...i);\n }\n return o(s, { ...n, key: e });\n}\nexport {\n h as Fragment,\n f as jsx,\n f as jsxDEV,\n f as jsxs\n};\n//# sourceMappingURL=jsxRuntime.mjs.map\n","import { mount, Fragment } from 'lithent';\n\nconst Meta = mount(_r => {\n return () => (\n <Fragment>\n <meta name=\"twitter:card1\" content=\"summary_large_image\" />{' '}\n <meta name=\"twitter:site2\" content=\"@superlucky84\" />\n </Fragment>\n );\n});\n\nconst Children = mount(r => {\n let v = 1;\n let k = 's';\n\n const increase = () => {\n v += 1;\n k += 's';\n r();\n };\n\n return () => (\n <div style={{ border: `${v}px solid red` }}>\n asve\n <br />\n <section innerHTML=\"<article>ss</article>\" />\n <button disabled={false} onClick={increase}>\n {v} -== a1 - {v}\n {k}\n </button>\n {v}\n <span id=\"aa11\" data-max-string=\"va\">\n {' '}123124\n </span>\n </div>\n );\n});\n\nconst Root = mount(_r => {\n return () => (\n <html lang=\"en\">\n <head>\n <title>Express with Vite and JSX</title>\n <Meta />\n <script src=\"/dist/lithentSsr.umd.js\"></script>\n </head>\n <body>\n <div id=\"app\">\n <Children />\n </div>\n </body>\n </html>\n );\n});\n\nexport default Root;\n","const SELF_CLOSE_ALLLOW = [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n];\n\nexport function isAllowSelfClose(tagname: string) {\n return SELF_CLOSE_ALLLOW.includes(tagname);\n}\n\nexport function checkExisty(value: unknown) {\n return value !== null && value !== undefined;\n}\n\nexport function checkVirtualType(type?: string | null) {\n return type && ['f', 'l'].includes(type);\n}\n\nexport function checkStyleData(\n dataKey: string,\n dataValue: unknown\n): dataValue is Record<string, string> {\n return dataKey === 'style' && typeof dataValue === 'object';\n}\n\nexport function checkRefData(\n dataKey: string,\n dataValue: unknown\n): dataValue is {\n value: HTMLElement | Element | DocumentFragment | Text | undefined;\n} {\n return dataKey === 'ref' && typeof dataValue === 'object';\n}\n\nexport function styleObjectToString(styleObj: Record<string, string>) {\n return Object.entries(styleObj)\n .map(([key, value]) => {\n // camelCase를 kebab-case로 변환 (예: borderTop -> border-top)\n const kebabKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${kebabKey}: ${value};`;\n })\n .join(' ');\n}\n","import type { WDom, Props } from 'lithent';\nimport {\n isAllowSelfClose,\n checkExisty,\n checkVirtualType,\n checkStyleData,\n checkRefData,\n styleObjectToString,\n} from './helper';\n\n/**\n * Escape special HTML characters in text node content.\n * Prevents text like `<h-state>` from being parsed as HTML elements by the browser.\n */\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/**\n * Main function of renderToString\"\n */\nexport function renderToString(wDom: WDom) {\n return wDomToString(wDom);\n}\n\n/**\n * Converts a chunk of virtual DOM objects into string tags.\n */\nfunction wDomToString(wDom: WDom) {\n let element = '';\n const { type, tag, text, props, children = [] } = wDom;\n const isVirtualType = checkVirtualType(type);\n\n if (isVirtualType) {\n element = wDomChildrenToDom(children, element);\n } else if (type === 'e' && tag) {\n const innerHTML = props?.innerHTML;\n\n if (innerHTML) {\n element = `<${tag}${makeProp(props)}>${innerHTML}</${tag}>`;\n } else if (isAllowSelfClose(tag) && !children.length) {\n element = `<${tag}${makeProp(props)} />`;\n } else {\n element = `<${tag}${makeProp(props)}>`;\n element = wDomChildrenToDom(children, element);\n element = `${element}</${tag}>`;\n }\n } else if (type === 't' && checkExisty(text)) {\n element = escapeHtml(String(text));\n element = wDomChildrenToDom(children, element);\n } else {\n throw new Error(\n 'An attempt was made to render an abnormal virtual DOM object.'\n );\n }\n\n return element;\n}\n\n/**\n * Converts all child nodes of a virtual DOM object into string tags.\n */\nfunction wDomChildrenToDom(children: WDom[], parentElement?: string) {\n const newString = children.reduce((acc: string, childItem: WDom) => {\n if (childItem.type) {\n const childElement = wDomToString(childItem);\n\n acc += childElement;\n }\n\n return acc;\n }, parentElement || '');\n\n return newString;\n}\n\n/**\n * Creates and attaches a prop string to the tag.\n */\nfunction makeProp(props?: Props) {\n let attrGroup: string[] = [];\n\n Object.entries(props || {}).forEach(\n ([dataKey, dataValue]: [string, unknown]) => {\n const isKey = dataKey === 'key';\n const isPortal = dataKey === 'portal' && typeof dataValue === 'object';\n const isHtml = dataKey === 'innerHTML' && typeof dataValue === 'string';\n const isRef = checkRefData(dataKey, dataValue);\n const isEvent = dataKey.match(/^on/);\n\n if (!(isKey || isPortal || isHtml || isRef || isEvent)) {\n if (checkStyleData(dataKey, dataValue)) {\n const cssString = styleObjectToString(dataValue);\n attrGroup.push(`style=\"${cssString}\"`);\n } else if (dataKey && dataValue === true) {\n attrGroup.push(`${dataKey}=\"${dataKey}\"`);\n } else if (dataKey && typeof dataValue !== 'boolean') {\n attrGroup.push(`${dataKey}=\"${String(dataValue)}\"`);\n }\n }\n }\n );\n\n return attrGroup.length ? ' ' + attrGroup.join(' ') : '';\n}\n","import { render } from 'lithent';\nimport type { WDom } from 'lithent';\n\n/**\n * hydration\n */\nexport function hydration(wDom: WDom, wrapElement: HTMLElement) {\n /**\n * Attach the el property to wDom.\n */\n addElement(wDom, wrapElement);\n\n /**\n * Attach events to wDom.\n */\n return render(wDom, wrapElement, null, true);\n}\n\n/**\n * Attach the el property to wDom.\n */\nfunction addElement(wDomOrig: WDom, wrapElement: HTMLElement) {\n const isVirtualType = wDomOrig.type && ['f', 'l'].includes(wDomOrig.type);\n\n if (isVirtualType) {\n wDomOrig.el = new DocumentFragment();\n }\n const wDomList = flatFlagmentFromList(\n isVirtualType ? [...(wDomOrig.children || [])] : [wDomOrig]\n );\n\n const realDomList =\n wrapElement.tagName === 'HTML'\n ? [wrapElement]\n : Array.from(wrapElement.childNodes);\n\n if (wDomList) {\n addElementProcessChildren(wDomList, realDomList);\n }\n}\n\n/**\n * Attach the el property to wDom recursively.\n */\nfunction addElementProcessChildren(wDomList: WDom[], realDomList: ChildNode[]) {\n let index = 0;\n realDomList\n .filter((item: any) => filteredEmptyTextNode(item))\n .forEach(realDomItem => {\n let wDomItem = wDomList[index];\n const nodeType = realDomItem.nodeType;\n let pass = false;\n\n if (\n wDomItem?.type === null ||\n (wDomItem?.type === 't' && wDomItem?.text === '\\n') ||\n (wDomItem?.type === 't' && nodeType === 1)\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['t', 'e'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 't' && nodeType === 3) {\n const { tFragment, nIndex } = processConsecutiveTextNodes(\n wDomList,\n index\n );\n index = nIndex;\n realDomItem!.parentElement!.replaceChild(tFragment, realDomItem);\n } else if (wDomItem.type === 'e' && nodeType === 1) {\n if (\n ((realDomItem as HTMLElement).tagName || '').toLowerCase() !==\n wDomItem.tag\n ) {\n // throw new Error('Hydration Error - not matched tagname');\n pass = true;\n } else {\n wDomItem.el = realDomItem as HTMLElement;\n }\n }\n\n if (!pass) {\n addElementProcessChildren(\n flatFlagmentFromList(wDomItem.children || []),\n Array.from(realDomItem.childNodes)\n );\n }\n }\n\n if (!pass) {\n index += 1;\n }\n });\n}\n\n/**\n * Whitespace or text nodes are ignored.\n */\nfunction filteredEmptyTextNode(item: HTMLElement | Text) {\n if (item.nodeType === 3 && !(item as Text).data.replace(/\\s*/g, '')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Flattens nested fragment types.\n */\nfunction flatFlagmentFromList(wDomlist: WDom[]) {\n return wDomlist.reduce((acc: WDom[], item: WDom) => {\n if (item.type && ['f', 'l'].includes(item.type)) {\n item.el = new DocumentFragment();\n acc.push(...flatFlagmentFromList(item?.children || []));\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n}\n\n/**\n * Hydration is applied to consecutively rendered text node objects.\n */\nfunction processConsecutiveTextNodes(wDomList: WDom[], cIndex: number) {\n const textWDomList: WDom[] = collectAdjacentTextNode(wDomList, cIndex, []);\n const tFragment = new DocumentFragment();\n textWDomList.forEach(item => {\n const textNode = document.createTextNode(String(item.text));\n item.el = textNode;\n tFragment.appendChild(textNode);\n });\n\n return {\n tFragment,\n nIndex: cIndex + (textWDomList.length - 1),\n };\n}\n\n/**\n * Collect consecutive text nodes.\n */\nfunction collectAdjacentTextNode(\n wDomList: WDom[],\n cIndex: number,\n acc: WDom[]\n): WDom[] {\n if (wDomList[cIndex] && wDomList[cIndex].type === 't') {\n acc.push(wDomList[cIndex]);\n\n return collectAdjacentTextNode(wDomList, cIndex + 1, [...acc]);\n }\n return acc;\n}\n","import { h } from 'lithent';\nimport type { TagFunction } from 'lithent';\nimport Test from './tests/tostring';\nimport { renderToString as _renderToString } from './renderToString';\nimport { hydration as _hydration } from './hydration';\n\nexport const renderToString = _renderToString;\nexport const hydration = _hydration;\n\nexport function renderWithHydration(tagFunction: TagFunction) {\n if (typeof window !== 'undefined') {\n return hydration(h(tagFunction, {}), document.documentElement);\n }\n\n return _renderToString(h(tagFunction, {}));\n}\n\nlet _run: ((wrap: HTMLElement) => void) | undefined;\n\nif (import.meta.env.MODE === 'development') {\n _run = (wrap: HTMLElement) => {\n hydration(h(Test as TagFunction, {}), wrap);\n };\n}\n\nexport const run = _run;\n"],"names":["f","s","t","e","a","c","l","r","n","i","o","Meta","mount","_r","Fragment","jsx","Children","v","k","increase","jsxs","SELF_CLOSE_ALLLOW","isAllowSelfClose","tagname","checkExisty","value","checkVirtualType","type","checkStyleData","dataKey","dataValue","checkRefData","styleObjectToString","styleObj","key","escapeHtml","str","renderToString","wDom","wDomToString","element","tag","text","props","children","wDomChildrenToDom","innerHTML","makeProp","parentElement","acc","childItem","childElement","attrGroup","isKey","isPortal","isHtml","isRef","isEvent","cssString","hydration","wrapElement","addElement","render","wDomOrig","isVirtualType","wDomList","flatFlagmentFromList","realDomList","addElementProcessChildren","index","item","filteredEmptyTextNode","realDomItem","wDomItem","nodeType","pass","tFragment","nIndex","processConsecutiveTextNodes","wDomlist","cIndex","textWDomList","collectAdjacentTextNode","textNode","_renderToString","_hydration","renderWithHydration","tagFunction","h","run"],"mappings":"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"}
|
package/ssr/src/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { h } from 'lithent';
|
|
2
2
|
import type { TagFunction } from 'lithent';
|
|
3
|
-
import Test from '
|
|
4
|
-
import { renderToString as _renderToString } from '
|
|
5
|
-
import { hydration as _hydration } from '
|
|
3
|
+
import Test from './tests/tostring';
|
|
4
|
+
import { renderToString as _renderToString } from './renderToString';
|
|
5
|
+
import { hydration as _hydration } from './hydration';
|
|
6
6
|
|
|
7
7
|
export const renderToString = _renderToString;
|
|
8
8
|
export const hydration = _hydration;
|
|
@@ -6,7 +6,15 @@ import {
|
|
|
6
6
|
checkStyleData,
|
|
7
7
|
checkRefData,
|
|
8
8
|
styleObjectToString,
|
|
9
|
-
} from '
|
|
9
|
+
} from './helper';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Escape special HTML characters in text node content.
|
|
13
|
+
* Prevents text like `<h-state>` from being parsed as HTML elements by the browser.
|
|
14
|
+
*/
|
|
15
|
+
function escapeHtml(str: string): string {
|
|
16
|
+
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
17
|
+
}
|
|
10
18
|
|
|
11
19
|
/**
|
|
12
20
|
* Main function of renderToString"
|
|
@@ -38,7 +46,7 @@ function wDomToString(wDom: WDom) {
|
|
|
38
46
|
element = `${element}</${tag}>`;
|
|
39
47
|
}
|
|
40
48
|
} else if (type === 't' && checkExisty(text)) {
|
|
41
|
-
element = String(text);
|
|
49
|
+
element = escapeHtml(String(text));
|
|
42
50
|
element = wDomChildrenToDom(children, element);
|
|
43
51
|
} else {
|
|
44
52
|
throw new Error(
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { h, mount, Fragment } from 'lithent';
|
|
3
|
+
import { renderToString } from '../renderToString';
|
|
4
|
+
|
|
5
|
+
// ── helpers ──
|
|
6
|
+
|
|
7
|
+
/** Render a no-arg component to string */
|
|
8
|
+
function render(Comp: ReturnType<typeof mount>): string {
|
|
9
|
+
return renderToString(h(Comp, {}));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// ── Text node HTML escaping ──
|
|
13
|
+
|
|
14
|
+
describe('renderToString — text node HTML escaping', () => {
|
|
15
|
+
it('escapes < and > in text node content', () => {
|
|
16
|
+
const Comp = mount(_r => () => (
|
|
17
|
+
<p>{'Page shell with <h-state> anchors'}</p>
|
|
18
|
+
));
|
|
19
|
+
expect(render(Comp)).toBe('<p>Page shell with <h-state> anchors</p>');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('escapes & in text node content', () => {
|
|
23
|
+
const Comp = mount(_r => () => <p>{'foo & bar'}</p>);
|
|
24
|
+
expect(render(Comp)).toBe('<p>foo & bar</p>');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('escapes multiple occurrences', () => {
|
|
28
|
+
const Comp = mount(_r => () => <p>{'<b>bold</b> & <i>italic</i>'}</p>);
|
|
29
|
+
expect(render(Comp)).toBe(
|
|
30
|
+
'<p><b>bold</b> & <i>italic</i></p>'
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('does not escape plain text', () => {
|
|
35
|
+
const Comp = mount(_r => () => <p>{'hello world'}</p>);
|
|
36
|
+
expect(render(Comp)).toBe('<p>hello world</p>');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('does not escape innerHTML prop (raw HTML passthrough)', () => {
|
|
40
|
+
const Comp = mount(_r => () => (
|
|
41
|
+
<section innerHTML="<article>raw content</article>" />
|
|
42
|
+
));
|
|
43
|
+
expect(render(Comp)).toBe(
|
|
44
|
+
'<section><article>raw content</article></section>'
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('escapes text nodes inside nested elements', () => {
|
|
49
|
+
const Comp = mount(_r => () => (
|
|
50
|
+
<div>
|
|
51
|
+
<span>{'<script>alert(1)</script>'}</span>
|
|
52
|
+
</div>
|
|
53
|
+
));
|
|
54
|
+
expect(render(Comp)).toBe(
|
|
55
|
+
'<div><span><script>alert(1)</script></span></div>'
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('escapes text nodes mixed with other children', () => {
|
|
60
|
+
const Comp = mount(_r => () => (
|
|
61
|
+
<p>
|
|
62
|
+
{'prefix <tag> '}
|
|
63
|
+
<strong>bold</strong>
|
|
64
|
+
{' suffix'}
|
|
65
|
+
</p>
|
|
66
|
+
));
|
|
67
|
+
expect(render(Comp)).toBe(
|
|
68
|
+
'<p>prefix <tag> <strong>bold</strong> suffix</p>'
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('escapes text nodes inside Fragment', () => {
|
|
73
|
+
const Comp = mount(_r => () => (
|
|
74
|
+
<Fragment>
|
|
75
|
+
<p>{'<h-state> anchor'}</p>
|
|
76
|
+
<p>{'A & B'}</p>
|
|
77
|
+
</Fragment>
|
|
78
|
+
));
|
|
79
|
+
expect(render(Comp)).toBe('<p><h-state> anchor</p><p>A & B</p>');
|
|
80
|
+
});
|
|
81
|
+
});
|