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 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.2/dist/lithent.umd.js
94
- * UMD-HELPER: https://cdn.jsdelivr.net/npm/lithent@1.18.2/helper/dist/lithentHelper.umd.js
95
- * UMD-FTAGS: https://cdn.jsdelivr.net/npm/lithent@1.18.2/ftags/dist/lithentFTags.umd.js
96
- * UMD-TAG: https://cdn.jsdelivr.net/npm/lithent@1.18.2/tag/dist/lithentTag.umd.js
97
- * ESM : https://cdn.jsdelivr.net/npm/lithent@1.18.2/dist/lithent.mjs
98
- * ESM-HELPER: https://cdn.jsdelivr.net/npm/lithent@1.18.2/helper/dist/lithentHelper.mjs
99
- * ESM-FTAGS: https://cdn.jsdelivr.net/npm/lithent@1.18.2/ftags/dist/lithentFTags.mjs
100
- * ESM-TAG: https://cdn.jsdelivr.net/npm/lithent@1.18.2/tag/dist/lithentTag.mjs
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.2/dist/lithent.umd.js"></script>
126
- <script src="https://cdn.jsdelivr.net/npm/lithent@1.18.2/helper/dist/lithentHelper.umd.js"></script>
127
- <script src="https://cdn.jsdelivr.net/npm/lithent@1.18.2/ftags/dist/lithentFTags.umd.js"></script>
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.2/dist/lithent.umd.js"></script>
201
- <!--script src="https://cdn.jsdelivr.net/npm/lithent@1.18.2/helper/dist/lithentHelper.umd.js"></script-->
202
- <script src="https://cdn.jsdelivr.net/npm/lithent@1.18.2/tag/dist/lithentTag.umd.js"></script>
203
- <!--script src="https://cdn.jsdelivr.net/npm/lithent@1.18.2/ftags/dist/lithentFTags.umd.js"></script-->
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "lithent",
4
- "version": "1.18.2",
4
+ "version": "1.18.3",
5
5
  "description": "An extensible virtual DOM library for lightweight use in a variety of environments.",
6
6
  "packageManager": "pnpm@9.12.3",
7
7
  "main": "./dist/lithent.umd.js",
@@ -1,13 +1,47 @@
1
- import { mount as h, h as l, Fragment as $, render as x } from "lithent";
2
- const S = h((n) => {
3
- let e = 1, t = "s";
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
- e += 1, t += "s", n();
17
+ n += 1, t += "s", e();
6
18
  };
7
- return () => /* @__PURE__ */ l("div", { style: { border: `${e}px solid red` } }, "asve", /* @__PURE__ */ l("br", null), /* @__PURE__ */ l("section", { innerHTML: "<article>ss</article>" }), /* @__PURE__ */ l("button", { disabled: !1, onClick: r }, e, " -== a1 - ", e, t), e, /* @__PURE__ */ l("span", { id: "aa11", "data-max-string": "va" }, " ", "123124"));
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((n) => () => /* @__PURE__ */ l($, null, " ", "111", "222", " ", "45", /* @__PURE__ */ l(S, null), /* @__PURE__ */ l("div", null, "aaa")));
10
- const k = [
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 C(n) {
28
- return k.includes(n);
61
+ function m(e) {
62
+ return j.includes(e);
29
63
  }
30
- function E(n) {
31
- return n != null;
64
+ function C(e) {
65
+ return e != null;
32
66
  }
33
- function L(n) {
34
- return n && ["fragment", "loop"].includes(n);
67
+ function L(e) {
68
+ return e && ["fragment", "loop"].includes(e);
35
69
  }
36
- function j(n, e) {
37
- return n === "style" && typeof e == "object";
70
+ function A(e, n) {
71
+ return e === "style" && typeof n == "object";
38
72
  }
39
- function N(n, e) {
40
- return n === "ref" && typeof e == "object";
73
+ function N(e, n) {
74
+ return e === "ref" && typeof n == "object";
41
75
  }
42
- function v(n) {
43
- return Object.entries(n).map(([e, t]) => `${e.replace(/([A-Z])/g, "-$1").toLowerCase()}: ${t};`).join(" ");
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 a(n) {
46
- return y(n);
79
+ function y(e) {
80
+ return g(e);
47
81
  }
48
- function y(n) {
49
- let e = "";
50
- const { type: t, tag: r, text: o, props: i, children: s = [] } = n;
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
- e = f(s, e);
86
+ n = d(c, n);
53
87
  else if (t === "element" && r) {
54
- const c = i == null ? void 0 : i.innerHTML;
55
- c ? e = `<${r}${p(i)}>${c}</${r}>` : C(r) && !s.length ? e = `<${r}${p(i)} />` : (e = `<${r}${p(i)}>`, e = f(s, e), e = `${e}</${r}>`);
56
- } else if (t === "text" && E(o))
57
- e = String(o), e = f(s, e);
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 e;
96
+ return n;
63
97
  }
64
- function f(n, e) {
65
- return n.reduce((r, o) => {
66
- if (o.type) {
67
- const i = y(o);
68
- r += i;
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
- }, e || "");
105
+ }, n || "");
72
106
  }
73
- function p(n) {
74
- let e = [];
75
- return Object.entries(n || {}).forEach(
107
+ function p(e) {
108
+ let n = [];
109
+ return Object.entries(e || {}).forEach(
76
110
  ([t, r]) => {
77
- const o = t === "key", i = t === "portal" && typeof r == "object", s = t === "innerHTML" && typeof r == "string", u = N(t, r), c = t.match(/^on/);
78
- if (!(o || i || s || u || c))
79
- if (j(t, r)) {
80
- const T = v(r);
81
- e.push(`style="${T}"`);
82
- } else t && r === !0 ? e.push(`${t}="${t}"`) : t && typeof r != "boolean" && e.push(`${t}="${String(r)}"`);
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
- ), e.length ? " " + e.join(" ") : "";
118
+ ), n.length ? " " + n.join(" ") : "";
85
119
  }
86
- function F(n, e) {
87
- return A(n, e), x(n, e, null, !0);
120
+ function F(e, n) {
121
+ return H(e, n), k(e, n, null, !0);
88
122
  }
89
- function A(n, e) {
90
- const t = n.type && ["fragment", "loop"].includes(n.type);
91
- t && (n.el = new DocumentFragment());
92
- const r = d(
93
- t ? [...n.children || []] : [n]
94
- ), o = e.tagName === "HTML" ? [e] : Array.from(e.childNodes);
95
- r && g(r, o);
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 g(n, e) {
131
+ function b(e, n) {
98
132
  let t = 0;
99
- e.filter((r) => H(r)).forEach((r) => {
100
- let o = n[t];
101
- const i = r.nodeType;
102
- let s = !1;
103
- if (((o == null ? void 0 : o.type) === null || (o == null ? void 0 : o.type) === "text" && (o == null ? void 0 : o.text) === `
104
- `) && (t += 1, o = n[t]), r && o && o.type && ["text", "element"].includes(o.type)) {
105
- if (o.type === "text" && i === 3) {
106
- const { tFragment: u, nIndex: c } = m(
107
- n,
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 = c, r.parentElement.replaceChild(u, r);
111
- } else o.type === "element" && i === 1 && ((r.tagName || "").toLowerCase() !== o.tag ? s = !0 : o.el = r);
112
- s || g(
113
- d(o.children || []),
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
- s || (t += 1);
151
+ c || (t += 1);
118
152
  });
119
153
  }
120
- function H(n) {
121
- return !(n.nodeType === 3 && !n.data.replace(/\s*/g, ""));
154
+ function M(e) {
155
+ return !(e.nodeType === 3 && !e.data.replace(/\s*/g, ""));
122
156
  }
123
- function d(n) {
124
- return n.reduce((e, t) => (t.type && ["fragment", "loop"].includes(t.type) ? (t.el = new DocumentFragment(), e.push(...d((t == null ? void 0 : t.children) || []))) : e.push(t), e), []);
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 m(n, e) {
127
- const t = b(n, e, []), r = new DocumentFragment();
128
- return t.forEach((o) => {
129
- const i = document.createTextNode(String(o.text));
130
- o.el = i, r.appendChild(i);
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: e + (t.length - 1)
167
+ nIndex: n + (t.length - 1)
134
168
  };
135
169
  }
136
- function b(n, e, t) {
137
- return n[e] && n[e].type === "text" ? (t.push(n[e]), b(n, e + 1, [...t])) : t;
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 W = a, M = F;
140
- function O(n) {
141
- return typeof window < "u" ? M(l(n, {}), document.documentElement) : a(l(n, {}));
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 R = _;
177
+ let W;
178
+ const J = W;
145
179
  export {
146
- M as hydration,
147
- W as renderToString,
148
- O as renderWithHydration,
149
- R as run
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(c,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("lithent")):typeof define=="function"&&define.amd?define(["exports","lithent"],i):(c=typeof globalThis<"u"?globalThis:c||self,i(c.lithentSsr={},c.lithent))})(this,function(c,i){"use strict";const $=i.mount(n=>{let e=1,t="s";const r=()=>{e+=1,t+="s",n()};return()=>i.h("div",{style:{border:`${e}px solid red`}},"asve",i.h("br",null),i.h("section",{innerHTML:"<article>ss</article>"}),i.h("button",{disabled:!1,onClick:r},e," -== a1 - ",e,t),e,i.h("span",{id:"aa11","data-max-string":"va"}," ","123124"))});i.mount(n=>()=>i.h(i.Fragment,null," ","111","222"," ","45",i.h($,null),i.h("div",null,"aaa")));const S=["area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"];function x(n){return S.includes(n)}function k(n){return n!=null}function j(n){return n&&["fragment","loop"].includes(n)}function C(n,e){return n==="style"&&typeof e=="object"}function E(n,e){return n==="ref"&&typeof e=="object"}function L(n){return Object.entries(n).map(([e,t])=>`${e.replace(/([A-Z])/g,"-$1").toLowerCase()}: ${t};`).join(" ")}function y(n){return a(n)}function a(n){let e="";const{type:t,tag:r,text:o,props:s,children:u=[]}=n;if(j(t))e=d(u,e);else if(t==="element"&&r){const l=s==null?void 0:s.innerHTML;l?e=`<${r}${p(s)}>${l}</${r}>`:x(r)&&!u.length?e=`<${r}${p(s)} />`:(e=`<${r}${p(s)}>`,e=d(u,e),e=`${e}</${r}>`)}else if(t==="text"&&k(o))e=String(o),e=d(u,e);else throw new Error("An attempt was made to render an abnormal virtual DOM object.");return e}function d(n,e){return n.reduce((r,o)=>{if(o.type){const s=a(o);r+=s}return r},e||"")}function p(n){let e=[];return Object.entries(n||{}).forEach(([t,r])=>{const o=t==="key",s=t==="portal"&&typeof r=="object",u=t==="innerHTML"&&typeof r=="string",f=E(t,r),l=t.match(/^on/);if(!(o||s||u||f||l))if(C(t,r)){const _=L(r);e.push(`style="${_}"`)}else t&&r===!0?e.push(`${t}="${t}"`):t&&typeof r!="boolean"&&e.push(`${t}="${String(r)}"`)}),e.length?" "+e.join(" "):""}function v(n,e){return N(n,e),i.render(n,e,null,!0)}function N(n,e){const t=n.type&&["fragment","loop"].includes(n.type);t&&(n.el=new DocumentFragment);const r=h(t?[...n.children||[]]:[n]),o=e.tagName==="HTML"?[e]:Array.from(e.childNodes);r&&g(r,o)}function g(n,e){let t=0;e.filter(r=>m(r)).forEach(r=>{let o=n[t];const s=r.nodeType;let u=!1;if(((o==null?void 0:o.type)===null||(o==null?void 0:o.type)==="text"&&(o==null?void 0:o.text)===`
2
- `)&&(t+=1,o=n[t]),r&&o&&o.type&&["text","element"].includes(o.type)){if(o.type==="text"&&s===3){const{tFragment:f,nIndex:l}=F(n,t);t=l,r.parentElement.replaceChild(f,r)}else o.type==="element"&&s===1&&((r.tagName||"").toLowerCase()!==o.tag?u=!0:o.el=r);u||g(h(o.children||[]),Array.from(r.childNodes))}u||(t+=1)})}function m(n){return!(n.nodeType===3&&!n.data.replace(/\s*/g,""))}function h(n){return n.reduce((e,t)=>(t.type&&["fragment","loop"].includes(t.type)?(t.el=new DocumentFragment,e.push(...h((t==null?void 0:t.children)||[]))):e.push(t),e),[])}function F(n,e){const t=T(n,e,[]),r=new DocumentFragment;return t.forEach(o=>{const s=document.createTextNode(String(o.text));o.el=s,r.appendChild(s)}),{tFragment:r,nIndex:e+(t.length-1)}}function T(n,e,t){return n[e]&&n[e].type==="text"?(t.push(n[e]),T(n,e+1,[...t])):t}const H=y,b=v;function A(n){return typeof window<"u"?b(i.h(n,{}),document.documentElement):y(i.h(n,{}))}const M=void 0;c.hydration=b,c.renderToString=H,c.renderWithHydration=A,c.run=M,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
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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"}
@@ -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 { h, mount, Fragment } from 'lithent';
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
- <Fragment>
33
- {' '}
34
- 111{/* <!-- aa --> */}222{' '}45
35
- <Children />
36
- <div>aaa</div>
37
- </Fragment>
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