lithent 1.17.2 → 1.17.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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "lithent",
|
|
4
|
-
"version": "1.17.
|
|
4
|
+
"version": "1.17.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",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"eslint-config-prettier": "^9.1.0",
|
|
112
112
|
"eslint-plugin-prettier": "^5.2.1",
|
|
113
113
|
"happy-dom": "^9.20.3",
|
|
114
|
-
"jsdom": "^
|
|
114
|
+
"jsdom": "^25.0.1",
|
|
115
115
|
"prettier": "^3.4.2",
|
|
116
116
|
"terser": "^5.18.1",
|
|
117
117
|
"typescript": "^5.6.3",
|
package/ssr/dist/lithentSsr.mjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { mount as h, h as l, Fragment as $, render as x } from "lithent";
|
|
2
|
-
const
|
|
2
|
+
const m = h((n) => {
|
|
3
3
|
let e = 1, t = "s";
|
|
4
4
|
const r = () => {
|
|
5
5
|
e += 1, t += "s", n();
|
|
6
6
|
};
|
|
7
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"));
|
|
8
8
|
});
|
|
9
|
-
h((n) => () => /* @__PURE__ */ l($, null, " ", "111", "222", " ", "45", /* @__PURE__ */ l(
|
|
10
|
-
const
|
|
9
|
+
h((n) => () => /* @__PURE__ */ l($, null, " ", "111", "222", " ", "45", /* @__PURE__ */ l(m, null), /* @__PURE__ */ l("div", null, "aaa")));
|
|
10
|
+
const S = [
|
|
11
11
|
"area",
|
|
12
12
|
"base",
|
|
13
13
|
"br",
|
|
@@ -24,16 +24,16 @@ const k = [
|
|
|
24
24
|
"track",
|
|
25
25
|
"wbr"
|
|
26
26
|
];
|
|
27
|
-
function
|
|
28
|
-
return
|
|
27
|
+
function k(n) {
|
|
28
|
+
return S.includes(n);
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function C(n) {
|
|
31
31
|
return n != null;
|
|
32
32
|
}
|
|
33
|
-
function
|
|
33
|
+
function E(n) {
|
|
34
34
|
return n && ["fragment", "loop"].includes(n);
|
|
35
35
|
}
|
|
36
|
-
function
|
|
36
|
+
function L(n, e) {
|
|
37
37
|
return n === "style" && typeof e == "object";
|
|
38
38
|
}
|
|
39
39
|
function j(n, e) {
|
|
@@ -48,12 +48,12 @@ function a(n) {
|
|
|
48
48
|
function y(n) {
|
|
49
49
|
let e = "";
|
|
50
50
|
const { type: t, tag: r, text: o, props: i, children: s = [] } = n;
|
|
51
|
-
if (
|
|
51
|
+
if (E(t))
|
|
52
52
|
e = f(s, e);
|
|
53
53
|
else if (t === "element" && r) {
|
|
54
54
|
const c = i == null ? void 0 : i.innerHTML;
|
|
55
|
-
c ? e = `<${r}${p(i)}>${c}</${r}>` :
|
|
56
|
-
} else if (t === "text" &&
|
|
55
|
+
c ? e = `<${r}${p(i)}>${c}</${r}>` : k(r) && !s.length ? e = `<${r}${p(i)} />` : (e = `<${r}${p(i)}>`, e = f(s, e), e = `${e}</${r}>`);
|
|
56
|
+
} else if (t === "text" && C(o))
|
|
57
57
|
e = String(o), e = f(s, e);
|
|
58
58
|
else
|
|
59
59
|
throw new Error(
|
|
@@ -76,9 +76,9 @@ function p(n) {
|
|
|
76
76
|
([t, r]) => {
|
|
77
77
|
const o = t === "key", i = t === "portal" && typeof r == "object", s = t === "innerHTML" && typeof r == "string", u = j(t, r), c = t.match(/^on/);
|
|
78
78
|
if (!(o || i || s || u || c))
|
|
79
|
-
if (
|
|
80
|
-
const
|
|
81
|
-
e.push(`style="${
|
|
79
|
+
if (L(t, r)) {
|
|
80
|
+
const T = N(r);
|
|
81
|
+
e.push(`style="${T}"`);
|
|
82
82
|
} else t && r === !0 ? e.push(`${t}="${t}"`) : t && typeof r != "boolean" && e.push(`${t}="${String(r)}"`);
|
|
83
83
|
}
|
|
84
84
|
), e.length ? " " + e.join(" ") : "";
|
|
@@ -96,18 +96,18 @@ function F(n, e) {
|
|
|
96
96
|
}
|
|
97
97
|
function g(n, e) {
|
|
98
98
|
let t = 0;
|
|
99
|
-
e.filter((r) =>
|
|
99
|
+
e.filter((r) => A(r)).forEach((r) => {
|
|
100
100
|
let o = n[t];
|
|
101
101
|
const i = r.nodeType;
|
|
102
102
|
let s = !1;
|
|
103
103
|
if ((o == null ? void 0 : o.type) === null && (t += 1, o = n[t]), r && o && o.type && ["text", "element"].includes(o.type)) {
|
|
104
104
|
if (o.type === "text" && i === 3) {
|
|
105
|
-
const { tFragment: u, nIndex: c } =
|
|
105
|
+
const { tFragment: u, nIndex: c } = H(
|
|
106
106
|
n,
|
|
107
107
|
t
|
|
108
108
|
);
|
|
109
109
|
t = c, r.parentElement.replaceChild(u, r);
|
|
110
|
-
} else o.type === "element" &&
|
|
110
|
+
} else o.type === "element" && i === 1 && ((r.tagName || "").toLowerCase() !== o.tag ? s = !0 : o.el = r);
|
|
111
111
|
s || g(
|
|
112
112
|
d(o.children || []),
|
|
113
113
|
Array.from(r.childNodes)
|
|
@@ -116,14 +116,14 @@ function g(n, e) {
|
|
|
116
116
|
s || (t += 1);
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
|
-
function
|
|
119
|
+
function A(n) {
|
|
120
120
|
return !(n.nodeType === 3 && !n.data.replace(/\s*/g, ""));
|
|
121
121
|
}
|
|
122
122
|
function d(n) {
|
|
123
123
|
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), []);
|
|
124
124
|
}
|
|
125
|
-
function
|
|
126
|
-
const t =
|
|
125
|
+
function H(n, e) {
|
|
126
|
+
const t = b(n, e, []), r = new DocumentFragment();
|
|
127
127
|
return t.forEach((o) => {
|
|
128
128
|
const i = document.createTextNode(String(o.text));
|
|
129
129
|
o.el = i, r.appendChild(i);
|
|
@@ -132,8 +132,8 @@ function A(n, e) {
|
|
|
132
132
|
nIndex: e + (t.length - 1)
|
|
133
133
|
};
|
|
134
134
|
}
|
|
135
|
-
function
|
|
136
|
-
return n[e] && n[e].type === "text" ? (t.push(n[e]),
|
|
135
|
+
function b(n, e, t) {
|
|
136
|
+
return n[e] && n[e].type === "text" ? (t.push(n[e]), b(n, e + 1, [...t])) : t;
|
|
137
137
|
}
|
|
138
138
|
const P = a, M = v;
|
|
139
139
|
function W(n) {
|
|
@@ -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 (wDomItem?.type === null) {\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 (\n wDomItem.type === 'element' &&\n realDomItem instanceof HTMLElement\n ) {\n if ((realDomItem.tagName || '').toLowerCase() !== wDomItem.tag) {\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":["../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 (wDomItem?.type === null) {\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,2 +1,2 @@
|
|
|
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 m(n){return S.includes(n)}function k(n){return n!=null}function x(n){return n&&["fragment","loop"].includes(n)}function j(n,e){return n==="style"&&typeof e=="object"}function
|
|
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 m(n){return S.includes(n)}function k(n){return n!=null}function x(n){return n&&["fragment","loop"].includes(n)}function j(n,e){return n==="style"&&typeof e=="object"}function C(n,e){return n==="ref"&&typeof e=="object"}function E(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(x(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}>`:m(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=C(t,r),l=t.match(/^on/);if(!(o||s||u||f||l))if(j(t,r)){const _=E(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 L(n,e){return v(n,e),i.render(n,e,null,!0)}function v(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=>N(r)).forEach(r=>{let o=n[t];const s=r.nodeType;let u=!1;if((o==null?void 0:o.type)===null&&(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 N(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=L;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"})});
|
|
2
2
|
//# 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 (wDomItem?.type === null) {\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 (\n wDomItem.type === 'element' &&\n realDomItem instanceof HTMLElement\n ) {\n if ((realDomItem.tagName || '').toLowerCase() !== wDomItem.tag) {\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":["../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 (wDomItem?.type === null) {\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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"}
|
package/ssr/src/hydration.ts
CHANGED
|
@@ -69,11 +69,11 @@ function addElementProcessChildren(wDomList: WDom[], realDomList: ChildNode[]) {
|
|
|
69
69
|
);
|
|
70
70
|
index = nIndex;
|
|
71
71
|
realDomItem!.parentElement!.replaceChild(tFragment, realDomItem);
|
|
72
|
-
} else if (
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
} else if (wDomItem.type === 'element' && nodeType === 1) {
|
|
73
|
+
if (
|
|
74
|
+
((realDomItem as HTMLElement).tagName || '').toLowerCase() !==
|
|
75
|
+
wDomItem.tag
|
|
76
|
+
) {
|
|
77
77
|
// throw new Error('Hydration Error - not matched tagname');
|
|
78
78
|
pass = true;
|
|
79
79
|
} else {
|