lithent 1.18.2 → 1.18.3
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/README.md +15 -15
- package/package.json +1 -1
- package/ssr/dist/lithentSsr.mjs +125 -91
- 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/hydration.ts +3 -1
- package/ssr/src/tests/tostring.tsx +22 -7
package/README.md
CHANGED
|
@@ -90,14 +90,14 @@ pnpm add lithent
|
|
|
90
90
|
|
|
91
91
|
#### Or Use CDN
|
|
92
92
|
|
|
93
|
-
* UMD : https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
94
|
-
* UMD-HELPER: https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
95
|
-
* UMD-FTAGS: https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
96
|
-
* UMD-TAG: https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
97
|
-
* ESM : https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
98
|
-
* ESM-HELPER: https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
99
|
-
* ESM-FTAGS: https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
100
|
-
* ESM-TAG: https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
93
|
+
* UMD : https://cdn.jsdelivr.net/npm/lithent@1.18.3/dist/lithent.umd.js
|
|
94
|
+
* UMD-HELPER: https://cdn.jsdelivr.net/npm/lithent@1.18.3/helper/dist/lithentHelper.umd.js
|
|
95
|
+
* UMD-FTAGS: https://cdn.jsdelivr.net/npm/lithent@1.18.3/ftags/dist/lithentFTags.umd.js
|
|
96
|
+
* UMD-TAG: https://cdn.jsdelivr.net/npm/lithent@1.18.3/tag/dist/lithentTag.umd.js
|
|
97
|
+
* ESM : https://cdn.jsdelivr.net/npm/lithent@1.18.3/dist/lithent.mjs
|
|
98
|
+
* ESM-HELPER: https://cdn.jsdelivr.net/npm/lithent@1.18.3/helper/dist/lithentHelper.mjs
|
|
99
|
+
* ESM-FTAGS: https://cdn.jsdelivr.net/npm/lithent@1.18.3/ftags/dist/lithentFTags.mjs
|
|
100
|
+
* ESM-TAG: https://cdn.jsdelivr.net/npm/lithent@1.18.3/tag/dist/lithentTag.mjs
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
It's easier to use lithent with JSX or HTM.
|
|
@@ -122,9 +122,9 @@ import { fTags, fFragment, fMount } from 'lithent/ftags';
|
|
|
122
122
|
const { section, div, p, br, strong } = fTags;
|
|
123
123
|
|
|
124
124
|
/* UMD
|
|
125
|
-
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
126
|
-
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
127
|
-
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
125
|
+
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.3/dist/lithent.umd.js"></script>
|
|
126
|
+
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.3/helper/dist/lithentHelper.umd.js"></script>
|
|
127
|
+
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.3/ftags/dist/lithentFTags.umd.js"></script>
|
|
128
128
|
|
|
129
129
|
const { render } = lithent;
|
|
130
130
|
const { fTags, fMount, fFragment } = lithentFTags;
|
|
@@ -197,10 +197,10 @@ const destroy = render(lTag`<${Component} />`, document.getElementById('root'),
|
|
|
197
197
|
#### With UMD
|
|
198
198
|
|
|
199
199
|
```html
|
|
200
|
-
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
201
|
-
<!--script src="https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
202
|
-
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
203
|
-
<!--script src="https://cdn.jsdelivr.net/npm/lithent@1.18.
|
|
200
|
+
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.3/dist/lithent.umd.js"></script>
|
|
201
|
+
<!--script src="https://cdn.jsdelivr.net/npm/lithent@1.18.3/helper/dist/lithentHelper.umd.js"></script-->
|
|
202
|
+
<script src="https://cdn.jsdelivr.net/npm/lithent@1.18.3/tag/dist/lithentTag.umd.js"></script>
|
|
203
|
+
<!--script src="https://cdn.jsdelivr.net/npm/lithent@1.18.3/ftags/dist/lithentFTags.umd.js"></script-->
|
|
204
204
|
|
|
205
205
|
<div id="root"></div>
|
|
206
206
|
|
package/package.json
CHANGED
package/ssr/dist/lithentSsr.mjs
CHANGED
|
@@ -1,13 +1,47 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { h as f, mount as h, Fragment as x, render as k } from "lithent";
|
|
2
|
+
function s(e, n, t, r, i, o) {
|
|
3
|
+
const { children: c, ...u } = n;
|
|
4
|
+
if (c != null) {
|
|
5
|
+
const l = Array.isArray(c) ? c : [c];
|
|
6
|
+
return f(e, { ...u, key: t }, ...l);
|
|
7
|
+
}
|
|
8
|
+
return f(e, { ...u, key: t });
|
|
9
|
+
}
|
|
10
|
+
const S = h((e) => () => /* @__PURE__ */ s(x, { children: [
|
|
11
|
+
/* @__PURE__ */ s("meta", { name: "twitter:card1", content: "summary_large_image" }),
|
|
12
|
+
" ",
|
|
13
|
+
/* @__PURE__ */ s("meta", { name: "twitter:site2", content: "@superlucky84" })
|
|
14
|
+
] })), E = h((e) => {
|
|
15
|
+
let n = 1, t = "s";
|
|
4
16
|
const r = () => {
|
|
5
|
-
|
|
17
|
+
n += 1, t += "s", e();
|
|
6
18
|
};
|
|
7
|
-
return () => /* @__PURE__ */
|
|
19
|
+
return () => /* @__PURE__ */ s("div", { style: { border: `${n}px solid red` }, children: [
|
|
20
|
+
"asve",
|
|
21
|
+
/* @__PURE__ */ s("br", {}),
|
|
22
|
+
/* @__PURE__ */ s("section", { innerHTML: "<article>ss</article>" }),
|
|
23
|
+
/* @__PURE__ */ s("button", { disabled: !1, onClick: r, children: [
|
|
24
|
+
n,
|
|
25
|
+
" -== a1 - ",
|
|
26
|
+
n,
|
|
27
|
+
t
|
|
28
|
+
] }),
|
|
29
|
+
n,
|
|
30
|
+
/* @__PURE__ */ s("span", { id: "aa11", "data-max-string": "va", children: [
|
|
31
|
+
" ",
|
|
32
|
+
"123124"
|
|
33
|
+
] })
|
|
34
|
+
] });
|
|
8
35
|
});
|
|
9
|
-
h((
|
|
10
|
-
|
|
36
|
+
h((e) => () => /* @__PURE__ */ s("html", { lang: "en", children: [
|
|
37
|
+
/* @__PURE__ */ s("head", { children: [
|
|
38
|
+
/* @__PURE__ */ s("title", { children: "Express with Vite and JSX" }),
|
|
39
|
+
/* @__PURE__ */ s(S, {}),
|
|
40
|
+
/* @__PURE__ */ s("script", { src: "/dist/lithentSsr.umd.js" })
|
|
41
|
+
] }),
|
|
42
|
+
/* @__PURE__ */ s("body", { children: /* @__PURE__ */ s("div", { id: "app", children: /* @__PURE__ */ s(E, {}) }) })
|
|
43
|
+
] }));
|
|
44
|
+
const j = [
|
|
11
45
|
"area",
|
|
12
46
|
"base",
|
|
13
47
|
"br",
|
|
@@ -24,128 +58,128 @@ const k = [
|
|
|
24
58
|
"track",
|
|
25
59
|
"wbr"
|
|
26
60
|
];
|
|
27
|
-
function
|
|
28
|
-
return
|
|
61
|
+
function m(e) {
|
|
62
|
+
return j.includes(e);
|
|
29
63
|
}
|
|
30
|
-
function
|
|
31
|
-
return
|
|
64
|
+
function C(e) {
|
|
65
|
+
return e != null;
|
|
32
66
|
}
|
|
33
|
-
function L(
|
|
34
|
-
return
|
|
67
|
+
function L(e) {
|
|
68
|
+
return e && ["fragment", "loop"].includes(e);
|
|
35
69
|
}
|
|
36
|
-
function
|
|
37
|
-
return
|
|
70
|
+
function A(e, n) {
|
|
71
|
+
return e === "style" && typeof n == "object";
|
|
38
72
|
}
|
|
39
|
-
function N(
|
|
40
|
-
return
|
|
73
|
+
function N(e, n) {
|
|
74
|
+
return e === "ref" && typeof n == "object";
|
|
41
75
|
}
|
|
42
|
-
function v(
|
|
43
|
-
return Object.entries(
|
|
76
|
+
function v(e) {
|
|
77
|
+
return Object.entries(e).map(([n, t]) => `${n.replace(/([A-Z])/g, "-$1").toLowerCase()}: ${t};`).join(" ");
|
|
44
78
|
}
|
|
45
|
-
function
|
|
46
|
-
return
|
|
79
|
+
function y(e) {
|
|
80
|
+
return g(e);
|
|
47
81
|
}
|
|
48
|
-
function
|
|
49
|
-
let
|
|
50
|
-
const { type: t, tag: r, text:
|
|
82
|
+
function g(e) {
|
|
83
|
+
let n = "";
|
|
84
|
+
const { type: t, tag: r, text: i, props: o, children: c = [] } = e;
|
|
51
85
|
if (L(t))
|
|
52
|
-
|
|
86
|
+
n = d(c, n);
|
|
53
87
|
else if (t === "element" && r) {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
} else if (t === "text" &&
|
|
57
|
-
|
|
88
|
+
const l = o == null ? void 0 : o.innerHTML;
|
|
89
|
+
l ? n = `<${r}${p(o)}>${l}</${r}>` : m(r) && !c.length ? n = `<${r}${p(o)} />` : (n = `<${r}${p(o)}>`, n = d(c, n), n = `${n}</${r}>`);
|
|
90
|
+
} else if (t === "text" && C(i))
|
|
91
|
+
n = String(i), n = d(c, n);
|
|
58
92
|
else
|
|
59
93
|
throw new Error(
|
|
60
94
|
"An attempt was made to render an abnormal virtual DOM object."
|
|
61
95
|
);
|
|
62
|
-
return
|
|
96
|
+
return n;
|
|
63
97
|
}
|
|
64
|
-
function
|
|
65
|
-
return
|
|
66
|
-
if (
|
|
67
|
-
const
|
|
68
|
-
r +=
|
|
98
|
+
function d(e, n) {
|
|
99
|
+
return e.reduce((r, i) => {
|
|
100
|
+
if (i.type) {
|
|
101
|
+
const o = g(i);
|
|
102
|
+
r += o;
|
|
69
103
|
}
|
|
70
104
|
return r;
|
|
71
|
-
},
|
|
105
|
+
}, n || "");
|
|
72
106
|
}
|
|
73
|
-
function p(
|
|
74
|
-
let
|
|
75
|
-
return Object.entries(
|
|
107
|
+
function p(e) {
|
|
108
|
+
let n = [];
|
|
109
|
+
return Object.entries(e || {}).forEach(
|
|
76
110
|
([t, r]) => {
|
|
77
|
-
const
|
|
78
|
-
if (!(
|
|
79
|
-
if (
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
} else t && r === !0 ?
|
|
111
|
+
const i = t === "key", o = t === "portal" && typeof r == "object", c = t === "innerHTML" && typeof r == "string", u = N(t, r), l = t.match(/^on/);
|
|
112
|
+
if (!(i || o || c || u || l))
|
|
113
|
+
if (A(t, r)) {
|
|
114
|
+
const $ = v(r);
|
|
115
|
+
n.push(`style="${$}"`);
|
|
116
|
+
} else t && r === !0 ? n.push(`${t}="${t}"`) : t && typeof r != "boolean" && n.push(`${t}="${String(r)}"`);
|
|
83
117
|
}
|
|
84
|
-
),
|
|
118
|
+
), n.length ? " " + n.join(" ") : "";
|
|
85
119
|
}
|
|
86
|
-
function F(
|
|
87
|
-
return
|
|
120
|
+
function F(e, n) {
|
|
121
|
+
return H(e, n), k(e, n, null, !0);
|
|
88
122
|
}
|
|
89
|
-
function
|
|
90
|
-
const t =
|
|
91
|
-
t && (
|
|
92
|
-
const r =
|
|
93
|
-
t ? [...
|
|
94
|
-
),
|
|
95
|
-
r &&
|
|
123
|
+
function H(e, n) {
|
|
124
|
+
const t = e.type && ["fragment", "loop"].includes(e.type);
|
|
125
|
+
t && (e.el = new DocumentFragment());
|
|
126
|
+
const r = a(
|
|
127
|
+
t ? [...e.children || []] : [e]
|
|
128
|
+
), i = n.tagName === "HTML" ? [n] : Array.from(n.childNodes);
|
|
129
|
+
r && b(r, i);
|
|
96
130
|
}
|
|
97
|
-
function
|
|
131
|
+
function b(e, n) {
|
|
98
132
|
let t = 0;
|
|
99
|
-
|
|
100
|
-
let
|
|
101
|
-
const
|
|
102
|
-
let
|
|
103
|
-
if (((
|
|
104
|
-
`) && (t += 1,
|
|
105
|
-
if (
|
|
106
|
-
const { tFragment: u, nIndex:
|
|
107
|
-
|
|
133
|
+
n.filter((r) => M(r)).forEach((r) => {
|
|
134
|
+
let i = e[t];
|
|
135
|
+
const o = r.nodeType;
|
|
136
|
+
let c = !1;
|
|
137
|
+
if (((i == null ? void 0 : i.type) === null || (i == null ? void 0 : i.type) === "text" && (i == null ? void 0 : i.text) === `
|
|
138
|
+
` || (i == null ? void 0 : i.type) === "text" && o === 1) && (t += 1, i = e[t]), r && i && i.type && ["text", "element"].includes(i.type)) {
|
|
139
|
+
if (i.type === "text" && o === 3) {
|
|
140
|
+
const { tFragment: u, nIndex: l } = _(
|
|
141
|
+
e,
|
|
108
142
|
t
|
|
109
143
|
);
|
|
110
|
-
t =
|
|
111
|
-
} else
|
|
112
|
-
|
|
113
|
-
|
|
144
|
+
t = l, r.parentElement.replaceChild(u, r);
|
|
145
|
+
} else i.type === "element" && o === 1 && ((r.tagName || "").toLowerCase() !== i.tag ? c = !0 : i.el = r);
|
|
146
|
+
c || b(
|
|
147
|
+
a(i.children || []),
|
|
114
148
|
Array.from(r.childNodes)
|
|
115
149
|
);
|
|
116
150
|
}
|
|
117
|
-
|
|
151
|
+
c || (t += 1);
|
|
118
152
|
});
|
|
119
153
|
}
|
|
120
|
-
function
|
|
121
|
-
return !(
|
|
154
|
+
function M(e) {
|
|
155
|
+
return !(e.nodeType === 3 && !e.data.replace(/\s*/g, ""));
|
|
122
156
|
}
|
|
123
|
-
function
|
|
124
|
-
return
|
|
157
|
+
function a(e) {
|
|
158
|
+
return e.reduce((n, t) => (t.type && ["fragment", "loop"].includes(t.type) ? (t.el = new DocumentFragment(), n.push(...a((t == null ? void 0 : t.children) || []))) : n.push(t), n), []);
|
|
125
159
|
}
|
|
126
|
-
function
|
|
127
|
-
const t =
|
|
128
|
-
return t.forEach((
|
|
129
|
-
const
|
|
130
|
-
|
|
160
|
+
function _(e, n) {
|
|
161
|
+
const t = T(e, n, []), r = new DocumentFragment();
|
|
162
|
+
return t.forEach((i) => {
|
|
163
|
+
const o = document.createTextNode(String(i.text));
|
|
164
|
+
i.el = o, r.appendChild(o);
|
|
131
165
|
}), {
|
|
132
166
|
tFragment: r,
|
|
133
|
-
nIndex:
|
|
167
|
+
nIndex: n + (t.length - 1)
|
|
134
168
|
};
|
|
135
169
|
}
|
|
136
|
-
function
|
|
137
|
-
return n
|
|
170
|
+
function T(e, n, t) {
|
|
171
|
+
return e[n] && e[n].type === "text" ? (t.push(e[n]), T(e, n + 1, [...t])) : t;
|
|
138
172
|
}
|
|
139
|
-
const
|
|
140
|
-
function
|
|
141
|
-
return typeof window < "u" ?
|
|
173
|
+
const R = y, P = F;
|
|
174
|
+
function G(e) {
|
|
175
|
+
return typeof window < "u" ? P(f(e, {}), document.documentElement) : y(f(e, {}));
|
|
142
176
|
}
|
|
143
|
-
let
|
|
144
|
-
const
|
|
177
|
+
let W;
|
|
178
|
+
const J = W;
|
|
145
179
|
export {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
180
|
+
P as hydration,
|
|
181
|
+
R as renderToString,
|
|
182
|
+
G as renderWithHydration,
|
|
183
|
+
J as run
|
|
150
184
|
};
|
|
151
185
|
//# sourceMappingURL=lithentSsr.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lithentSsr.mjs","sources":["../src/tests/tostring.tsx","../src/helper/index.ts","../src/renderToString.ts","../src/hydration.ts","../src/index.ts"],"sourcesContent":["import { h, mount, Fragment } from 'lithent';\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 <Fragment>\n {' '}\n 111{/* <!-- aa --> */}222{' '}45\n <Children />\n <div>aaa</div>\n </Fragment>\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 && ['fragment', 'loop'].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 === 'element' && 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 === 'text' && 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 =\n wDomOrig.type && ['fragment', 'loop'].includes(wDomOrig.type);\n\n if (isVirtualType) {\n wDomOrig.el = new DocumentFragment();\n }\n const wDomList = flatFlagmentFromList(\n isVirtualType ? [...(wDomOrig.children || [])] : [wDomOrig]\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 === 'text' && wDomItem?.text === '\\n')\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['text', 'element'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 'text' && 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 === 'element' && 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 && ['fragment', 'loop'].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 === 'text') {\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":["Children","mount","r","v","k","increase","h","_r","Fragment","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","_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 && ['fragment', 'loop'].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 === 'element' && 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 === 'text' && 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 =\n wDomOrig.type && ['fragment', 'loop'].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 === 'text' && wDomItem?.text === '\\n') ||\n (wDomItem?.type === 'text' && nodeType === 1)\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['text', 'element'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 'text' && 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 === 'element' && 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 && ['fragment', 'loop'].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 === 'text') {\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,3 +1,3 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
|
|
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 s(e,n,t,r,i,o){const{children:c,...d}=n;if(c!=null){const f=Array.isArray(c)?c:[c];return l.h(e,{...d,key:t},...f)}return l.h(e,{...d,key:t})}const S=l.mount(e=>()=>s(l.Fragment,{children:[s("meta",{name:"twitter:card1",content:"summary_large_image"})," ",s("meta",{name:"twitter:site2",content:"@superlucky84"})]})),x=l.mount(e=>{let n=1,t="s";const r=()=>{n+=1,t+="s",e()};return()=>s("div",{style:{border:`${n}px solid red`},children:["asve",s("br",{}),s("section",{innerHTML:"<article>ss</article>"}),s("button",{disabled:!1,onClick:r,children:[n," -== a1 - ",n,t]}),n,s("span",{id:"aa11","data-max-string":"va",children:[" ","123124"]})]})});l.mount(e=>()=>s("html",{lang:"en",children:[s("head",{children:[s("title",{children:"Express with Vite and JSX"}),s(S,{}),s("script",{src:"/dist/lithentSsr.umd.js"})]}),s("body",{children:s("div",{id:"app",children:s(x,{})})})]}));const k=["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"];function m(e){return k.includes(e)}function j(e){return e!=null}function E(e){return e&&["fragment","loop"].includes(e)}function C(e,n){return e==="style"&&typeof n=="object"}function L(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 y(e){return g(e)}function g(e){let n="";const{type:t,tag:r,text:i,props:o,children:c=[]}=e;if(E(t))n=p(c,n);else if(t==="element"&&r){const f=o==null?void 0:o.innerHTML;f?n=`<${r}${h(o)}>${f}</${r}>`:m(r)&&!c.length?n=`<${r}${h(o)} />`:(n=`<${r}${h(o)}>`,n=p(c,n),n=`${n}</${r}>`)}else if(t==="text"&&j(i))n=String(i),n=p(c,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",c=t==="innerHTML"&&typeof r=="string",d=L(t,r),f=t.match(/^on/);if(!(i||o||c||d||f))if(C(t,r)){const W=v(r);n.push(`style="${W}"`)}else t&&r===!0?n.push(`${t}="${t}"`):t&&typeof r!="boolean"&&n.push(`${t}="${String(r)}"`)}),n.length?" "+n.join(" "):""}function A(e,n){return N(e,n),l.render(e,n,null,!0)}function N(e,n){const t=e.type&&["fragment","loop"].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 c=!1;if(((i==null?void 0:i.type)===null||(i==null?void 0:i.type)==="text"&&(i==null?void 0:i.text)===`
|
|
2
|
+
`||(i==null?void 0:i.type)==="text"&&o===1)&&(t+=1,i=e[t]),r&&i&&i.type&&["text","element"].includes(i.type)){if(i.type==="text"&&o===3){const{tFragment:d,nIndex:f}=H(e,t);t=f,r.parentElement.replaceChild(d,r)}else i.type==="element"&&o===1&&((r.tagName||"").toLowerCase()!==i.tag?c=!0:i.el=r);c||T(a(i.children||[]),Array.from(r.childNodes))}c||(t+=1)})}function F(e){return!(e.nodeType===3&&!e.data.replace(/\s*/g,""))}function a(e){return e.reduce((n,t)=>(t.type&&["fragment","loop"].includes(t.type)?(t.el=new DocumentFragment,n.push(...a((t==null?void 0:t.children)||[]))):n.push(t),n),[])}function H(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==="text"?(t.push(e[n]),b(e,n+1,[...t])):t}const M=y,$=A;function _(e){return typeof window<"u"?$(l.h(e,{}),document.documentElement):y(l.h(e,{}))}const P=void 0;u.hydration=$,u.renderToString=M,u.renderWithHydration=_,u.run=P,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
|
|
3
3
|
//# sourceMappingURL=lithentSsr.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lithentSsr.umd.js","sources":["../src/tests/tostring.tsx","../src/helper/index.ts","../src/renderToString.ts","../src/hydration.ts","../src/index.ts"],"sourcesContent":["import { h, mount, Fragment } from 'lithent';\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 <Fragment>\n {' '}\n 111{/* <!-- aa --> */}222{' '}45\n <Children />\n <div>aaa</div>\n </Fragment>\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 && ['fragment', 'loop'].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 === 'element' && 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 === 'text' && 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 =\n wDomOrig.type && ['fragment', 'loop'].includes(wDomOrig.type);\n\n if (isVirtualType) {\n wDomOrig.el = new DocumentFragment();\n }\n const wDomList = flatFlagmentFromList(\n isVirtualType ? [...(wDomOrig.children || [])] : [wDomOrig]\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 === 'text' && wDomItem?.text === '\\n')\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['text', 'element'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 'text' && 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 === 'element' && 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 && ['fragment', 'loop'].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 === 'text') {\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":["Children","mount","r","v","k","increase","h","_r","Fragment","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","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 && ['fragment', 'loop'].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 === 'element' && 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 === 'text' && 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 =\n wDomOrig.type && ['fragment', 'loop'].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 === 'text' && wDomItem?.text === '\\n') ||\n (wDomItem?.type === 'text' && nodeType === 1)\n ) {\n index += 1;\n wDomItem = wDomList[index];\n }\n\n if (\n realDomItem &&\n wDomItem &&\n wDomItem.type &&\n ['text', 'element'].includes(wDomItem.type)\n ) {\n if (wDomItem.type === 'text' && 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 === 'element' && 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 && ['fragment', 'loop'].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 === 'text') {\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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"}
|
package/ssr/src/hydration.ts
CHANGED
|
@@ -29,6 +29,7 @@ function addElement(wDomOrig: WDom, wrapElement: HTMLElement) {
|
|
|
29
29
|
const wDomList = flatFlagmentFromList(
|
|
30
30
|
isVirtualType ? [...(wDomOrig.children || [])] : [wDomOrig]
|
|
31
31
|
);
|
|
32
|
+
|
|
32
33
|
const realDomList =
|
|
33
34
|
wrapElement.tagName === 'HTML'
|
|
34
35
|
? [wrapElement]
|
|
@@ -53,7 +54,8 @@ function addElementProcessChildren(wDomList: WDom[], realDomList: ChildNode[]) {
|
|
|
53
54
|
|
|
54
55
|
if (
|
|
55
56
|
wDomItem?.type === null ||
|
|
56
|
-
(wDomItem?.type === 'text' && wDomItem?.text === '\n')
|
|
57
|
+
(wDomItem?.type === 'text' && wDomItem?.text === '\n') ||
|
|
58
|
+
(wDomItem?.type === 'text' && nodeType === 1)
|
|
57
59
|
) {
|
|
58
60
|
index += 1;
|
|
59
61
|
wDomItem = wDomList[index];
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mount, Fragment } from 'lithent';
|
|
2
|
+
|
|
3
|
+
const Meta = mount(_r => {
|
|
4
|
+
return () => (
|
|
5
|
+
<Fragment>
|
|
6
|
+
<meta name="twitter:card1" content="summary_large_image" />{' '}
|
|
7
|
+
<meta name="twitter:site2" content="@superlucky84" />
|
|
8
|
+
</Fragment>
|
|
9
|
+
);
|
|
10
|
+
});
|
|
2
11
|
|
|
3
12
|
const Children = mount(r => {
|
|
4
13
|
let v = 1;
|
|
@@ -29,12 +38,18 @@ const Children = mount(r => {
|
|
|
29
38
|
|
|
30
39
|
const Root = mount(_r => {
|
|
31
40
|
return () => (
|
|
32
|
-
<
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
<html lang="en">
|
|
42
|
+
<head>
|
|
43
|
+
<title>Express with Vite and JSX</title>
|
|
44
|
+
<Meta />
|
|
45
|
+
<script src="/dist/lithentSsr.umd.js"></script>
|
|
46
|
+
</head>
|
|
47
|
+
<body>
|
|
48
|
+
<div id="app">
|
|
49
|
+
<Children />
|
|
50
|
+
</div>
|
|
51
|
+
</body>
|
|
52
|
+
</html>
|
|
38
53
|
);
|
|
39
54
|
});
|
|
40
55
|
|