lunet 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +10 -10
- package/dist/index.js +2 -2
- package/dist/index.js.map +10 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,10 +5,14 @@
|
|
|
5
5
|
```bash
|
|
6
6
|
$ npm install lunet
|
|
7
7
|
# or
|
|
8
|
-
$ bun
|
|
8
|
+
$ bun add lunet
|
|
9
9
|
|
|
10
10
|
# こちらもお勧め
|
|
11
|
-
$
|
|
11
|
+
$ npm install alien-signals
|
|
12
|
+
$ npm install --save-dev lunet-transpiler
|
|
13
|
+
# or
|
|
14
|
+
$ bun add alien-signals
|
|
15
|
+
$ bun add -D lunet-transpiler
|
|
12
16
|
```
|
|
13
17
|
|
|
14
18
|
## 使い方のサンプル
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var{defineProperty:
|
|
1
|
+
var{defineProperty:M,getOwnPropertyNames:W,getOwnPropertyDescriptor:K}=Object,z=Object.prototype.hasOwnProperty;var k=new WeakMap,q=(e)=>{var t=k.get(e),n;if(t)return t;if(t=M({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")W(e).map((o)=>!z.call(t,o)&&M(t,o,{get:()=>e[o],enumerable:!(n=K(e,o))||n.enumerable}));return k.set(e,t),t};var G=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0,configurable:!0,set:(o)=>t[n]=()=>o})};var Z={};G(Z,{setBatch:()=>$,render:()=>Y,h:()=>E,fragment:()=>y,createComponent:()=>C});module.exports=q(Z);var C=(e)=>(t)=>[e,t];var y=(...e)=>[null,{},...e];var E=(e,t,...n)=>typeof e==="string"?[e,t??{},...n]:e===y?[null,t??{},...n]:e(t);var v=(e)=>{let t=new Text(e);return[[0,e,t],t]},O=(e,t)=>{if(e[1]!==t)e[2].textContent=e[1]=t},D=(e)=>e[2].remove(),w=(e,t)=>{e[2].parentNode?.insertBefore(t,e[2].nextSibling)};var Q=(e,t)=>typeof e==="string"||typeof t==="string"?typeof e===typeof t:e[0]===t[0]&&e[1].key===t[1].key,S=(e,t)=>{let n=[],o=Math.max(e.length,t.length),r=0;for(let a=0;a<o;a++){let p=e[a],i=t[a];if(!p&&i)n.push([1,r++,i]);else if(p&&!i)n.push([2,r,p]);else if(p&&i)if(Q(p,i))n.push([0,r++,i]);else n.push([2,r,p]),n.push([1,r++,i])}return n};var J=new WeakMap;function V(e){return J.get(this)?.[e.type]?.call(this,e)}var R=(e,t,n)=>{if(t.startsWith("$")){let o=t.substring(1);if(!["beforeMount","mount","beforeUpdate","update","beforeUnmount","unmount"].includes(o)){let r=J.get(e);if(!(o in r))e.addEventListener(o,V);if(typeof n==="function"||n==null)r[o]=n;else console.error("Invalid event handler: ",n),r[o]=void 0}}else switch(typeof n){case"string":e.setAttribute(t,n);break;case"function":case"object":if(n===null)e.removeAttribute(t);else console.error(`${typeof n} values cannot mount on attributes.`);break;default:if(n===void 0)e.removeAttribute(t);else e.setAttribute(t,String(n));break}},_=(e)=>{let[t,n,...o]=e;n.$beforeMount?.();let r=document.createElement(t);J.set(r,{}),n.$mount?.call(r,new CustomEvent("mount",{detail:r}));for(let[p,i]of Object.entries(n))R(r,p,i);let a=o.map(m);return r.append(...a.map((p)=>p[1])),[[1,e,r,a.map((p)=>p[0])],r]},A=(e,t)=>{let[,[,n,...o],r,a]=e,[,p,...i]=t;n.$beforeUpdate?.call(r,new CustomEvent("beforeupdate",{detail:r}));let g=Object.keys(n).filter((d)=>!(d in p));for(let[d,s]of Object.entries({...p,...Object.fromEntries(g.map((l)=>[l,void 0]))}))if(n[d]!==s)R(r,d,s);for(let[d,s,l]of S(o,i))switch(d){case 0:X(a[s],l);break;case 1:let[I,N]=m(l);if(a.splice(s,0,I),s===0)if(r.firstChild)r.firstChild.before(N);else r.append(N);else f(a[s-1],N);break;case 2:c(a.splice(s,1)[0]);break}e[1]=t,p.$update?.call(r,new CustomEvent("update",{detail:r}))},L=(e)=>{let[,[,t],n,o]=e;t.$beforeUnmount?.call(n,new CustomEvent("beforeunmount",{detail:n}));for(let r of o)c(r);J.delete(n),n.remove(),t.$unmount?.()},H=(e,t)=>{e[2].after(t)};var u=(e)=>{let[,,...t]=e,n=new Comment,o=document.createDocumentFragment(),r=t.map(m);return o.append(n,...r.map((a)=>a[1])),[[2,e,n,r.map((a)=>a[0])],o]},b=(e,t)=>{let[,[,,...n],o,r]=e,[,,...a]=t;for(let[p,i,g]of S(n,a))switch(p){case 0:X(r[i],g);break;case 1:let[d,s]=m(g);if(r.splice(i,0,d),i===0)o.after(s);else f(r[i-1],s);break;case 2:let[l]=r.splice(i,1);c(l);break}e[1]=t},x=(e)=>{for(let t of e[3])c(t);e[2].remove()},h=(e,t)=>{let n=e[3].at(-1);if(n)f(n,t);else e[2].after(t)};var T=(e)=>e(),$=(e)=>{T=e};var B=(e)=>{let[t,n]=e,o,r,a=t((p)=>{if(o)b(o,[null,{},p]);else[o,r]=u([null,{},p])},{...n});if(!r)console.error("never rendered Initial render."),[o,r]=u([null,{}]);return[[3,[t,a],o],r]},P=(e,t)=>{let n=e[1][1],o=t[1];T(()=>{for(let[r,a]of Object.entries(o))if(n[r]!==a)n[r]=a})},U=(e)=>x(e[2]),j=(e,t)=>h(e[2],t);var m=(e)=>{if(typeof e==="string")return v(e);else if(typeof e[0]==="string")return _(e);else if(e[0]===null)return u(e);else return B(e)},X=(e,t)=>{switch(e[0]){case 0:return O(e,t);case 1:return A(e,t);case 2:return b(e,t);case 3:return P(e,t)}},c=(e)=>{switch(e[0]){case 0:return D(e);case 1:return L(e);case 2:return x(e);case 3:return U(e)}},f=(e,t)=>{switch(e[0]){case 0:return w(e,t);case 1:return H(e,t);case 2:return h(e,t);case 3:return j(e,t)}};var F=new WeakMap,Y=(e,t)=>{if(F.has(e))c(F.get(e));let[n,o]=m(t);F.set(e,n),e.append(o)};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=A1002464CBF1D69064756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/jsx/component.ts", "../src/jsx/fragment.ts", "../src/jsx/likereact.ts", "../src/
|
|
3
|
+
"sources": ["../src/jsx/component.ts", "../src/jsx/fragment.ts", "../src/jsx/likereact.ts", "../src/mount/dom/text.ts", "../src/mount/diff.ts", "../src/mount/dom/element.ts", "../src/mount/dom/fragment.ts", "../src/batch.ts", "../src/mount/dom/component.ts", "../src/mount/dom/index.ts", "../src/mount/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { JSXComponent, JSXNode } from \".\";\n\nexport type ComponentFunction<T extends object> = (render: (jsx: JSXNode) => void, initProps: T) => T;\nexport type Component<T extends object> = (props: T) => JSXComponent;\n\nexport const createComponent = <T extends object>(component: ComponentFunction<T>): Component<T> =>\n (props: T): JSXComponent => [component, props];\n",
|
|
6
6
|
"import type { JSXFragment, JSXNode } from \".\";\n\nexport const fragment = (...children: JSXNode[]): JSXFragment =>\n [null, {}, ...children];\n",
|
|
7
7
|
"import type { JSXNode } from \".\";\nimport type { Component } from \"./component\";\nimport { fragment } from \"./fragment\";\n\ntype JSXFactoryFunction = <T extends keyof HTMLElementTagNameMap | Component<any> | typeof fragment>(\n type: T,\n props: null | ( T extends Component<infer P> ? P : { [key: string]: unknown } ),\n ...children: JSXNode[]\n) => JSXNode;\n\nexport const h: JSXFactoryFunction = (type, props, ...children) =>\n typeof type === \"string\"\n ? [type, props ?? {}, ...children]\n : type === fragment\n ? [null, props ?? {}, ...children]\n : type(props);\n",
|
|
8
|
-
"type
|
|
8
|
+
"import type { RenderedDOM } from \".\";\n\nexport const createText = (jsx: string): [RenderedDOM<string>, Text] => {\n const node = new Text(jsx);\n return [[0, jsx, node], node];\n}\n\nexport const updateText = (dom: RenderedDOM<string>, jsx: string) => {\n if (dom[1] !== jsx)\n dom[2]!.textContent = dom[1] = jsx;\n}\n\nexport const revokeText = (dom: RenderedDOM<string>): void => (\n dom[2].remove()\n)\n\nexport const afterText = (dom: RenderedDOM<string>, node: Node): void => {\n dom[2].parentNode?.insertBefore(node, dom[2].nextSibling)\n}\n",
|
|
9
9
|
"import type { JSXNode } from \"../jsx\";\n\nexport const isCompatibleNode = (before: JSXNode, after: JSXNode): boolean =>\n typeof before === \"string\" || typeof after === \"string\"\n ? typeof before === typeof after\n : before[0] === after[0] && before[1].key === after[1].key;\n\nexport type Patch =\n | [0, number, JSXNode] // 更新\n | [1, number, JSXNode] // 挿入\n | [2, number, JSXNode] // 削除\n\nexport const diff = (\n before_nodes: JSXNode[],\n after_nodes: JSXNode[],\n): Patch[] => {\n const patches: Patch[] = [];\n const max = Math.max(before_nodes.length, after_nodes.length);\n\n let index = 0;\n for(let i = 0;i < max;i++){\n const before = before_nodes[i];\n const after = after_nodes[i];\n \n if(!before && after)\n patches.push([1, index++, after]);\n else if(before && !after)\n patches.push([2, index, before]);\n else if(before && after)\n if(isCompatibleNode(before, after))\n patches.push([0, index++, after]);\n else{\n patches.push([2, index, before]);\n patches.push([1, index++, after]);\n }\n }\n\n return patches;\n}\n",
|
|
10
|
-
"import {
|
|
11
|
-
"import {
|
|
12
|
-
"
|
|
13
|
-
"import type
|
|
14
|
-
"import type { JSXComponent, JSXElement, JSXFragment, JSXNode } from \"../../jsx\";\nimport {
|
|
15
|
-
"import type { JSXNode } from \"../jsx\";\nimport {
|
|
10
|
+
"import { afterNode, createNode, revokeNode, updateNode, type RenderedDOM } from \".\";\nimport type { JSXElement } from \"../../jsx\";\nimport { diff } from \"../diff\";\n\nconst elementEvents: WeakMap<HTMLElement, Record<string, Function | undefined | null>> = new WeakMap;\n\nfunction handleEvent(this: HTMLElement, ev: Event){\n return elementEvents.get(this)?.[ev.type]?.call(this, ev);\n}\n\nconst setAttribute = (el: HTMLElement, name: string, value: unknown) => {\n if (name.startsWith(\"$\")) {\n const ev_name = name.substring(1);\n if (![\"beforeMount\", \"mount\", \"beforeUpdate\", \"update\", \"beforeUnmount\", \"unmount\"].includes(ev_name)) {\n const events = elementEvents.get(el)!;\n if(!(ev_name in events))\n el.addEventListener(ev_name, handleEvent);\n if (typeof value === \"function\" || value == null)\n events[ev_name] = value;\n else {\n console.error(\"Invalid event handler: \", value);\n events[ev_name] = undefined;\n }\n }\n } else switch(typeof value){\n case \"string\":\n el.setAttribute(name, value);\n break;\n case \"function\":\n case \"object\":\n if(value === null)\n el.removeAttribute(name);\n else\n console.error(`${typeof value} values cannot mount on attributes.`);\n break;\n default:\n if(value === undefined)\n el.removeAttribute(name);\n else\n el.setAttribute(name, String(value));\n break;\n }\n}\n\nexport const createElement = (jsx: JSXElement): [RenderedDOM<JSXElement>, HTMLElement] => {\n const [tag, props, ...children] = jsx;\n\n props.$beforeMount?.();\n const element = document.createElement(tag);\n elementEvents.set(element, {});\n props.$mount?.call<any, any, any>(element, new CustomEvent(\"mount\", { detail: element }));\n\n for (const [name, value] of Object.entries(props))\n setAttribute(element, name, value);\n\n const rendered_children = children.map(createNode);\n element.append(...rendered_children.map(e=>e[1]));\n\n return [[1, jsx, element, rendered_children.map(e=>e[0])], element];\n}\n\nexport const updateElement = (dom: RenderedDOM<JSXElement>, jsx: JSXElement) => {\n const [, [, old_props, ...old_children], element, rendered_children] = dom;\n const [, new_props, ...new_children] = jsx;\n old_props.$beforeUpdate?.call<any, any, any>(element, new CustomEvent(\"beforeupdate\", { detail: element! }));\n\n\n const removed_prop_keys = Object.keys(old_props).filter(key => !(key in new_props));\n\n for (const [name, value] of Object.entries({\n ...new_props,\n ...Object.fromEntries(\n removed_prop_keys.map(key => [key, undefined])\n )\n }))\n if((old_props as any)[name] !== value)\n setAttribute(element!, name, value);\n\n for (const [type, idx, jsx] of diff(old_children, new_children)) {\n switch(type){\n case 0:\n updateNode(rendered_children[idx], jsx);\n break;\n case 1:\n const [rendered, node] = createNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n if (idx === 0) {\n if (element!.firstChild) {\n element!.firstChild.before(node);\n } else {\n element!.append(node);\n }\n } else {\n afterNode(rendered_children[idx - 1], node);\n }\n break;\n case 2:\n revokeNode(rendered_children.splice(idx, 1)[0]);\n break;\n }\n }\n\n dom[1] = jsx;\n \n new_props.$update?.call<any, any, any>(element!, new CustomEvent(\"update\", { detail: element! }));\n}\n\nexport const revokeElement = (dom: RenderedDOM<JSXElement>) => {\n const [, [, props], element, rendered_children] = dom;\n props.$beforeUnmount?.call<any, any, any>(element!, new CustomEvent(\"beforeunmount\", { detail: element! }));\n\n for (const child of rendered_children)\n revokeNode(child);\n elementEvents.delete(element!);\n element!.remove();\n \n props.$unmount?.();\n}\n\nexport const afterElement = (dom: RenderedDOM<JSXElement>, node: Node) => {\n dom[2].after(node);\n}\n",
|
|
11
|
+
"import { afterNode, createNode, revokeNode, updateNode, type RenderedDOM } from \".\";\nimport type { JSXFragment } from \"../../jsx\";\nimport { diff } from \"../diff\";\n\nexport const createFragment = (jsx: JSXFragment): [RenderedDOM<JSXFragment>, DocumentFragment] => {\n const [,, ...children] = jsx;\n const mark = new Comment;\n const el = document.createDocumentFragment();\n\n const rendered_children = children.map(createNode);\n el.append(mark, ...rendered_children.map(e=>e[1]));\n\n return [[2, jsx, mark, rendered_children.map(e=>e[0])], el];\n}\n\nexport const updateFragment = (dom: RenderedDOM<JSXFragment>, jsx: JSXFragment) => {\n const [, [,, ...old_children], mark, rendered_children] = dom;\n const [,, ...new_children] = jsx;\n\n for (const [type, idx, jsx] of diff(old_children, new_children)) {\n switch(type){\n case 0:\n updateNode(rendered_children[idx], jsx);\n break;\n case 1:\n const [rendered, el] = createNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n if (idx === 0) {\n mark!.after(el);\n } else {\n afterNode(rendered_children[idx - 1], el);\n }\n break;\n case 2:\n const [removed] = rendered_children.splice(idx, 1);\n revokeNode(removed);\n break;\n }\n }\n \n dom[1] = jsx;\n}\n\nexport const revokeFragment = (dom: RenderedDOM<JSXFragment>) => {\n for (const child of dom[3])\n revokeNode(child);\n dom[2].remove();\n}\n\nexport const afterFragment = (dom: RenderedDOM<JSXFragment>, node: Node) => {\n const last_rendered_dom = dom[3].at(-1);\n if (last_rendered_dom)\n afterNode(last_rendered_dom, node);\n else\n dom[2].after(node);\n}\n",
|
|
12
|
+
"type BatchFn = (cb: () => void) => void;\n\nexport let batch: BatchFn = cb => cb();\n\nexport const setBatch = (fn: BatchFn): void => { batch = fn }\n",
|
|
13
|
+
"import { type RenderedDOM } from \".\";\nimport { batch } from \"../../batch\";\nimport type { JSXComponent, JSXFragment, JSXNode } from \"../../jsx\";\nimport { afterFragment, createFragment, revokeFragment, updateFragment } from \"./fragment\";\n\nexport const createComponent = (jsx: JSXComponent): [RenderedDOM<JSXComponent>, DocumentFragment] => {\n const [component, init_props/* , ...children */] = jsx;\n\n let rendered_dom: RenderedDOM<JSXFragment> | void;\n let doc_frag: DocumentFragment | void;\n\n const props = component((jsx: JSXNode) => {\n if (rendered_dom) updateFragment(rendered_dom, [null, {}, jsx]);\n else [rendered_dom, doc_frag] = createFragment([null, {}, jsx]);\n }, { ...init_props });\n\n //@ts-ignore\n if (!doc_frag) {\n console.error(\"never rendered Initial render.\");\n [rendered_dom, doc_frag] = createFragment([null, {}]);\n }\n\n return [\n [\n 3,\n [\n component,\n props,\n /* ...children */\n ] as JSXComponent,\n rendered_dom!\n ],\n doc_frag!\n ];\n}\n\nexport const updateComponent = (dom: RenderedDOM<JSXComponent>, jsx: JSXComponent) => {\n const old_props = dom[1][1];\n const new_props = jsx[1];\n\n batch(() => {\n for (const [key, value] of Object.entries(new_props)) //@ts-ignore\n if (old_props![key] !== value) old_props![key] = value;\n });\n}\n\nexport const revokeComponent = (dom: RenderedDOM<JSXComponent>) => (\n revokeFragment(dom[2])\n)\n\nexport const afterComponent = (dom: RenderedDOM<JSXComponent>, node: Node) => (\n afterFragment(dom[2], node)\n)\n",
|
|
14
|
+
"import type { JSXComponent, JSXElement, JSXFragment, JSXNode } from \"../../jsx\";\nimport { createText, updateText, revokeText, afterText } from \"./text\";\nimport { createElement, updateElement, revokeElement, afterElement } from \"./element\";\nimport { createFragment, updateFragment, revokeFragment, afterFragment } from \"./fragment\";\nimport { createComponent, updateComponent, revokeComponent, afterComponent } from \"./component\";\n\nexport type RenderedDOM<T extends JSXNode> =\n T extends string ? [0, string, Text] :\n T extends JSXElement ? [1, JSXElement, HTMLElement, RenderedDOM<any>[]] :\n T extends JSXFragment ? [2, JSXFragment, Comment, RenderedDOM<any>[]] :\n T extends JSXComponent ? [3, JSXComponent, RenderedDOM<JSXFragment>] :\n never;\n\nexport const createNode = (jsx: JSXNode): [RenderedDOM<any>, Node] => {\n if(typeof jsx === \"string\"){\n return createText(jsx);\n }else if(typeof jsx[0] === \"string\"){\n return createElement(jsx);\n }else if(jsx[0] === null){\n return createFragment(jsx);\n }else{\n return createComponent(jsx);\n }\n}\n\nexport const updateNode = (dom: RenderedDOM<any>, jsx: any) => {\n switch (dom[0]) {\n case 0: return updateText(dom, jsx);\n case 1: return updateElement(dom, jsx);\n case 2: return updateFragment(dom, jsx);\n case 3: return updateComponent(dom, jsx);\n }\n}\n\nexport const revokeNode = (dom: RenderedDOM<any>) => {\n switch (dom[0]) {\n case 0: return revokeText(dom);\n case 1: return revokeElement(dom);\n case 2: return revokeFragment(dom);\n case 3: return revokeComponent(dom);\n }\n}\n\nexport const afterNode = (dom: RenderedDOM<any>, node: Node) => {\n switch (dom[0]) {\n case 0: return afterText(dom, node);\n case 1: return afterElement(dom, node);\n case 2: return afterFragment(dom, node);\n case 3: return afterComponent(dom, node);\n }\n}\n",
|
|
15
|
+
"import type { JSXNode } from \"../jsx\";\nimport { createNode, revokeNode, type RenderedDOM } from \"./dom\";\n\ntype RenderFunction = (el: HTMLElement, jsx: JSXNode) => void;\n\nconst rootMap = new WeakMap<HTMLElement, RenderedDOM<any>>();\n\nexport const render: RenderFunction = (el, jsx) => {\n if (rootMap.has(el))\n revokeNode(rootMap.get(el)!);\n\n const [root, node] = createNode(jsx);\n\n rootMap.set(el, root);\n\n el.append(node);\n}\n"
|
|
16
16
|
],
|
|
17
|
-
"mappings": "sjBAKO,IAAM,EAAkB,CAAmB,IAC9C,CAAC,IAA2B,CAAC,EAAW,CAAK,ECJ1C,IAAM,EAAW,IAAI,IACxB,CAAC,KAAM,CAAC,EAAG,GAAG,CAAQ,ECOnB,IAAM,EAAwB,CAAC,EAAM,KAAU,IAClD,OAAO,IAAS,SACV,CAAC,EAAM,GAAS,CAAC,EAAG,GAAG,CAAQ,EAC/B,IAAS,EACL,CAAC,KAAM,GAAS,CAAC,EAAG,GAAG,CAAQ,EAC/B,EAAK,CAAK,ECbjB,IAAI,
|
|
18
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "A1002464CBF1D69064756E2164756E21",
|
|
19
19
|
"names": []
|
|
20
20
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var B=(e)=>(t)=>[e,t];var N=(...e)=>[null,{},...e];var P=(e,t,...n)=>typeof e==="string"?[e,t??{},...n]:e===N?[null,t??{},...n]:e(t);var F=(e)=>{let t=new Text(e);return[[0,e,t],t]},k=(e,t)=>{if(e[1]!==t)e[2].textContent=e[1]=t},C=(e)=>e[2].remove(),E=(e,t)=>{e[2].parentNode?.insertBefore(t,e[2].nextSibling)};var U=(e,t)=>typeof e==="string"||typeof t==="string"?typeof e===typeof t:e[0]===t[0]&&e[1].key===t[1].key,y=(e,t)=>{let n=[],o=Math.max(e.length,t.length),r=0;for(let a=0;a<o;a++){let p=e[a],i=t[a];if(!p&&i)n.push([1,r++,i]);else if(p&&!i)n.push([2,r,p]);else if(p&&i)if(U(p,i))n.push([0,r++,i]);else n.push([2,r,p]),n.push([1,r++,i])}return n};var S=new WeakMap;function j(e){return S.get(this)?.[e.type]?.call(this,e)}var v=(e,t,n)=>{if(t.startsWith("$")){let o=t.substring(1);if(!["beforeMount","mount","beforeUpdate","update","beforeUnmount","unmount"].includes(o)){let r=S.get(e);if(!(o in r))e.addEventListener(o,j);if(typeof n==="function"||n==null)r[o]=n;else console.error("Invalid event handler: ",n),r[o]=void 0}}else switch(typeof n){case"string":e.setAttribute(t,n);break;case"function":case"object":if(n===null)e.removeAttribute(t);else console.error(`${typeof n} values cannot mount on attributes.`);break;default:if(n===void 0)e.removeAttribute(t);else e.setAttribute(t,String(n));break}},O=(e)=>{let[t,n,...o]=e;n.$beforeMount?.();let r=document.createElement(t);S.set(r,{}),n.$mount?.call(r,new CustomEvent("mount",{detail:r}));for(let[p,i]of Object.entries(n))v(r,p,i);let a=o.map(m);return r.append(...a.map((p)=>p[1])),[[1,e,r,a.map((p)=>p[0])],r]},D=(e,t)=>{let[,[,n,...o],r,a]=e,[,p,...i]=t;n.$beforeUpdate?.call(r,new CustomEvent("beforeupdate",{detail:r}));let g=Object.keys(n).filter((d)=>!(d in p));for(let[d,s]of Object.entries({...p,...Object.fromEntries(g.map((l)=>[l,void 0]))}))if(n[d]!==s)v(r,d,s);for(let[d,s,l]of y(o,i))switch(d){case 0:J(a[s],l);break;case 1:let[$,h]=m(l);if(a.splice(s,0,$),s===0)if(r.firstChild)r.firstChild.before(h);else r.append(h);else f(a[s-1],h);break;case 2:c(a.splice(s,1)[0]);break}e[1]=t,p.$update?.call(r,new CustomEvent("update",{detail:r}))},w=(e)=>{let[,[,t],n,o]=e;t.$beforeUnmount?.call(n,new CustomEvent("beforeunmount",{detail:n}));for(let r of o)c(r);S.delete(n),n.remove(),t.$unmount?.()},R=(e,t)=>{e[2].after(t)};var u=(e)=>{let[,,...t]=e,n=new Comment,o=document.createDocumentFragment(),r=t.map(m);return o.append(n,...r.map((a)=>a[1])),[[2,e,n,r.map((a)=>a[0])],o]},X=(e,t)=>{let[,[,,...n],o,r]=e,[,,...a]=t;for(let[p,i,g]of y(n,a))switch(p){case 0:J(r[i],g);break;case 1:let[d,s]=m(g);if(r.splice(i,0,d),i===0)o.after(s);else f(r[i-1],s);break;case 2:let[l]=r.splice(i,1);c(l);break}e[1]=t},b=(e)=>{for(let t of e[3])c(t);e[2].remove()},x=(e,t)=>{let n=e[3].at(-1);if(n)f(n,t);else e[2].after(t)};var M=(e)=>e(),I=(e)=>{M=e};var _=(e)=>{let[t,n]=e,o,r,a=t((p)=>{if(o)X(o,[null,{},p]);else[o,r]=u([null,{},p])},{...n});if(!r)console.error("never rendered Initial render."),[o,r]=u([null,{}]);return[[3,[t,a],o],r]},A=(e,t)=>{let n=e[1][1],o=t[1];M(()=>{for(let[r,a]of Object.entries(o))if(n[r]!==a)n[r]=a})},L=(e)=>b(e[2]),H=(e,t)=>x(e[2],t);var m=(e)=>{if(typeof e==="string")return F(e);else if(typeof e[0]==="string")return O(e);else if(e[0]===null)return u(e);else return _(e)},J=(e,t)=>{switch(e[0]){case 0:return k(e,t);case 1:return D(e,t);case 2:return X(e,t);case 3:return A(e,t)}},c=(e)=>{switch(e[0]){case 0:return C(e);case 1:return w(e);case 2:return b(e);case 3:return L(e)}},f=(e,t)=>{switch(e[0]){case 0:return E(e,t);case 1:return R(e,t);case 2:return x(e,t);case 3:return H(e,t)}};var T=new WeakMap,Se=(e,t)=>{if(T.has(e))c(T.get(e));let[n,o]=m(t);T.set(e,n),e.append(o)};export{I as setBatch,Se as render,P as h,N as fragment,B as createComponent};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=53C4851E8EA2354964756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/jsx/component.ts", "../src/jsx/fragment.ts", "../src/jsx/likereact.ts", "../src/
|
|
3
|
+
"sources": ["../src/jsx/component.ts", "../src/jsx/fragment.ts", "../src/jsx/likereact.ts", "../src/mount/dom/text.ts", "../src/mount/diff.ts", "../src/mount/dom/element.ts", "../src/mount/dom/fragment.ts", "../src/batch.ts", "../src/mount/dom/component.ts", "../src/mount/dom/index.ts", "../src/mount/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { JSXComponent, JSXNode } from \".\";\n\nexport type ComponentFunction<T extends object> = (render: (jsx: JSXNode) => void, initProps: T) => T;\nexport type Component<T extends object> = (props: T) => JSXComponent;\n\nexport const createComponent = <T extends object>(component: ComponentFunction<T>): Component<T> =>\n (props: T): JSXComponent => [component, props];\n",
|
|
6
6
|
"import type { JSXFragment, JSXNode } from \".\";\n\nexport const fragment = (...children: JSXNode[]): JSXFragment =>\n [null, {}, ...children];\n",
|
|
7
7
|
"import type { JSXNode } from \".\";\nimport type { Component } from \"./component\";\nimport { fragment } from \"./fragment\";\n\ntype JSXFactoryFunction = <T extends keyof HTMLElementTagNameMap | Component<any> | typeof fragment>(\n type: T,\n props: null | ( T extends Component<infer P> ? P : { [key: string]: unknown } ),\n ...children: JSXNode[]\n) => JSXNode;\n\nexport const h: JSXFactoryFunction = (type, props, ...children) =>\n typeof type === \"string\"\n ? [type, props ?? {}, ...children]\n : type === fragment\n ? [null, props ?? {}, ...children]\n : type(props);\n",
|
|
8
|
-
"type
|
|
8
|
+
"import type { RenderedDOM } from \".\";\n\nexport const createText = (jsx: string): [RenderedDOM<string>, Text] => {\n const node = new Text(jsx);\n return [[0, jsx, node], node];\n}\n\nexport const updateText = (dom: RenderedDOM<string>, jsx: string) => {\n if (dom[1] !== jsx)\n dom[2]!.textContent = dom[1] = jsx;\n}\n\nexport const revokeText = (dom: RenderedDOM<string>): void => (\n dom[2].remove()\n)\n\nexport const afterText = (dom: RenderedDOM<string>, node: Node): void => {\n dom[2].parentNode?.insertBefore(node, dom[2].nextSibling)\n}\n",
|
|
9
9
|
"import type { JSXNode } from \"../jsx\";\n\nexport const isCompatibleNode = (before: JSXNode, after: JSXNode): boolean =>\n typeof before === \"string\" || typeof after === \"string\"\n ? typeof before === typeof after\n : before[0] === after[0] && before[1].key === after[1].key;\n\nexport type Patch =\n | [0, number, JSXNode] // 更新\n | [1, number, JSXNode] // 挿入\n | [2, number, JSXNode] // 削除\n\nexport const diff = (\n before_nodes: JSXNode[],\n after_nodes: JSXNode[],\n): Patch[] => {\n const patches: Patch[] = [];\n const max = Math.max(before_nodes.length, after_nodes.length);\n\n let index = 0;\n for(let i = 0;i < max;i++){\n const before = before_nodes[i];\n const after = after_nodes[i];\n \n if(!before && after)\n patches.push([1, index++, after]);\n else if(before && !after)\n patches.push([2, index, before]);\n else if(before && after)\n if(isCompatibleNode(before, after))\n patches.push([0, index++, after]);\n else{\n patches.push([2, index, before]);\n patches.push([1, index++, after]);\n }\n }\n\n return patches;\n}\n",
|
|
10
|
-
"import {
|
|
11
|
-
"import {
|
|
12
|
-
"
|
|
13
|
-
"import type
|
|
14
|
-
"import type { JSXComponent, JSXElement, JSXFragment, JSXNode } from \"../../jsx\";\nimport {
|
|
15
|
-
"import type { JSXNode } from \"../jsx\";\nimport {
|
|
10
|
+
"import { afterNode, createNode, revokeNode, updateNode, type RenderedDOM } from \".\";\nimport type { JSXElement } from \"../../jsx\";\nimport { diff } from \"../diff\";\n\nconst elementEvents: WeakMap<HTMLElement, Record<string, Function | undefined | null>> = new WeakMap;\n\nfunction handleEvent(this: HTMLElement, ev: Event){\n return elementEvents.get(this)?.[ev.type]?.call(this, ev);\n}\n\nconst setAttribute = (el: HTMLElement, name: string, value: unknown) => {\n if (name.startsWith(\"$\")) {\n const ev_name = name.substring(1);\n if (![\"beforeMount\", \"mount\", \"beforeUpdate\", \"update\", \"beforeUnmount\", \"unmount\"].includes(ev_name)) {\n const events = elementEvents.get(el)!;\n if(!(ev_name in events))\n el.addEventListener(ev_name, handleEvent);\n if (typeof value === \"function\" || value == null)\n events[ev_name] = value;\n else {\n console.error(\"Invalid event handler: \", value);\n events[ev_name] = undefined;\n }\n }\n } else switch(typeof value){\n case \"string\":\n el.setAttribute(name, value);\n break;\n case \"function\":\n case \"object\":\n if(value === null)\n el.removeAttribute(name);\n else\n console.error(`${typeof value} values cannot mount on attributes.`);\n break;\n default:\n if(value === undefined)\n el.removeAttribute(name);\n else\n el.setAttribute(name, String(value));\n break;\n }\n}\n\nexport const createElement = (jsx: JSXElement): [RenderedDOM<JSXElement>, HTMLElement] => {\n const [tag, props, ...children] = jsx;\n\n props.$beforeMount?.();\n const element = document.createElement(tag);\n elementEvents.set(element, {});\n props.$mount?.call<any, any, any>(element, new CustomEvent(\"mount\", { detail: element }));\n\n for (const [name, value] of Object.entries(props))\n setAttribute(element, name, value);\n\n const rendered_children = children.map(createNode);\n element.append(...rendered_children.map(e=>e[1]));\n\n return [[1, jsx, element, rendered_children.map(e=>e[0])], element];\n}\n\nexport const updateElement = (dom: RenderedDOM<JSXElement>, jsx: JSXElement) => {\n const [, [, old_props, ...old_children], element, rendered_children] = dom;\n const [, new_props, ...new_children] = jsx;\n old_props.$beforeUpdate?.call<any, any, any>(element, new CustomEvent(\"beforeupdate\", { detail: element! }));\n\n\n const removed_prop_keys = Object.keys(old_props).filter(key => !(key in new_props));\n\n for (const [name, value] of Object.entries({\n ...new_props,\n ...Object.fromEntries(\n removed_prop_keys.map(key => [key, undefined])\n )\n }))\n if((old_props as any)[name] !== value)\n setAttribute(element!, name, value);\n\n for (const [type, idx, jsx] of diff(old_children, new_children)) {\n switch(type){\n case 0:\n updateNode(rendered_children[idx], jsx);\n break;\n case 1:\n const [rendered, node] = createNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n if (idx === 0) {\n if (element!.firstChild) {\n element!.firstChild.before(node);\n } else {\n element!.append(node);\n }\n } else {\n afterNode(rendered_children[idx - 1], node);\n }\n break;\n case 2:\n revokeNode(rendered_children.splice(idx, 1)[0]);\n break;\n }\n }\n\n dom[1] = jsx;\n \n new_props.$update?.call<any, any, any>(element!, new CustomEvent(\"update\", { detail: element! }));\n}\n\nexport const revokeElement = (dom: RenderedDOM<JSXElement>) => {\n const [, [, props], element, rendered_children] = dom;\n props.$beforeUnmount?.call<any, any, any>(element!, new CustomEvent(\"beforeunmount\", { detail: element! }));\n\n for (const child of rendered_children)\n revokeNode(child);\n elementEvents.delete(element!);\n element!.remove();\n \n props.$unmount?.();\n}\n\nexport const afterElement = (dom: RenderedDOM<JSXElement>, node: Node) => {\n dom[2].after(node);\n}\n",
|
|
11
|
+
"import { afterNode, createNode, revokeNode, updateNode, type RenderedDOM } from \".\";\nimport type { JSXFragment } from \"../../jsx\";\nimport { diff } from \"../diff\";\n\nexport const createFragment = (jsx: JSXFragment): [RenderedDOM<JSXFragment>, DocumentFragment] => {\n const [,, ...children] = jsx;\n const mark = new Comment;\n const el = document.createDocumentFragment();\n\n const rendered_children = children.map(createNode);\n el.append(mark, ...rendered_children.map(e=>e[1]));\n\n return [[2, jsx, mark, rendered_children.map(e=>e[0])], el];\n}\n\nexport const updateFragment = (dom: RenderedDOM<JSXFragment>, jsx: JSXFragment) => {\n const [, [,, ...old_children], mark, rendered_children] = dom;\n const [,, ...new_children] = jsx;\n\n for (const [type, idx, jsx] of diff(old_children, new_children)) {\n switch(type){\n case 0:\n updateNode(rendered_children[idx], jsx);\n break;\n case 1:\n const [rendered, el] = createNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n if (idx === 0) {\n mark!.after(el);\n } else {\n afterNode(rendered_children[idx - 1], el);\n }\n break;\n case 2:\n const [removed] = rendered_children.splice(idx, 1);\n revokeNode(removed);\n break;\n }\n }\n \n dom[1] = jsx;\n}\n\nexport const revokeFragment = (dom: RenderedDOM<JSXFragment>) => {\n for (const child of dom[3])\n revokeNode(child);\n dom[2].remove();\n}\n\nexport const afterFragment = (dom: RenderedDOM<JSXFragment>, node: Node) => {\n const last_rendered_dom = dom[3].at(-1);\n if (last_rendered_dom)\n afterNode(last_rendered_dom, node);\n else\n dom[2].after(node);\n}\n",
|
|
12
|
+
"type BatchFn = (cb: () => void) => void;\n\nexport let batch: BatchFn = cb => cb();\n\nexport const setBatch = (fn: BatchFn): void => { batch = fn }\n",
|
|
13
|
+
"import { type RenderedDOM } from \".\";\nimport { batch } from \"../../batch\";\nimport type { JSXComponent, JSXFragment, JSXNode } from \"../../jsx\";\nimport { afterFragment, createFragment, revokeFragment, updateFragment } from \"./fragment\";\n\nexport const createComponent = (jsx: JSXComponent): [RenderedDOM<JSXComponent>, DocumentFragment] => {\n const [component, init_props/* , ...children */] = jsx;\n\n let rendered_dom: RenderedDOM<JSXFragment> | void;\n let doc_frag: DocumentFragment | void;\n\n const props = component((jsx: JSXNode) => {\n if (rendered_dom) updateFragment(rendered_dom, [null, {}, jsx]);\n else [rendered_dom, doc_frag] = createFragment([null, {}, jsx]);\n }, { ...init_props });\n\n //@ts-ignore\n if (!doc_frag) {\n console.error(\"never rendered Initial render.\");\n [rendered_dom, doc_frag] = createFragment([null, {}]);\n }\n\n return [\n [\n 3,\n [\n component,\n props,\n /* ...children */\n ] as JSXComponent,\n rendered_dom!\n ],\n doc_frag!\n ];\n}\n\nexport const updateComponent = (dom: RenderedDOM<JSXComponent>, jsx: JSXComponent) => {\n const old_props = dom[1][1];\n const new_props = jsx[1];\n\n batch(() => {\n for (const [key, value] of Object.entries(new_props)) //@ts-ignore\n if (old_props![key] !== value) old_props![key] = value;\n });\n}\n\nexport const revokeComponent = (dom: RenderedDOM<JSXComponent>) => (\n revokeFragment(dom[2])\n)\n\nexport const afterComponent = (dom: RenderedDOM<JSXComponent>, node: Node) => (\n afterFragment(dom[2], node)\n)\n",
|
|
14
|
+
"import type { JSXComponent, JSXElement, JSXFragment, JSXNode } from \"../../jsx\";\nimport { createText, updateText, revokeText, afterText } from \"./text\";\nimport { createElement, updateElement, revokeElement, afterElement } from \"./element\";\nimport { createFragment, updateFragment, revokeFragment, afterFragment } from \"./fragment\";\nimport { createComponent, updateComponent, revokeComponent, afterComponent } from \"./component\";\n\nexport type RenderedDOM<T extends JSXNode> =\n T extends string ? [0, string, Text] :\n T extends JSXElement ? [1, JSXElement, HTMLElement, RenderedDOM<any>[]] :\n T extends JSXFragment ? [2, JSXFragment, Comment, RenderedDOM<any>[]] :\n T extends JSXComponent ? [3, JSXComponent, RenderedDOM<JSXFragment>] :\n never;\n\nexport const createNode = (jsx: JSXNode): [RenderedDOM<any>, Node] => {\n if(typeof jsx === \"string\"){\n return createText(jsx);\n }else if(typeof jsx[0] === \"string\"){\n return createElement(jsx);\n }else if(jsx[0] === null){\n return createFragment(jsx);\n }else{\n return createComponent(jsx);\n }\n}\n\nexport const updateNode = (dom: RenderedDOM<any>, jsx: any) => {\n switch (dom[0]) {\n case 0: return updateText(dom, jsx);\n case 1: return updateElement(dom, jsx);\n case 2: return updateFragment(dom, jsx);\n case 3: return updateComponent(dom, jsx);\n }\n}\n\nexport const revokeNode = (dom: RenderedDOM<any>) => {\n switch (dom[0]) {\n case 0: return revokeText(dom);\n case 1: return revokeElement(dom);\n case 2: return revokeFragment(dom);\n case 3: return revokeComponent(dom);\n }\n}\n\nexport const afterNode = (dom: RenderedDOM<any>, node: Node) => {\n switch (dom[0]) {\n case 0: return afterText(dom, node);\n case 1: return afterElement(dom, node);\n case 2: return afterFragment(dom, node);\n case 3: return afterComponent(dom, node);\n }\n}\n",
|
|
15
|
+
"import type { JSXNode } from \"../jsx\";\nimport { createNode, revokeNode, type RenderedDOM } from \"./dom\";\n\ntype RenderFunction = (el: HTMLElement, jsx: JSXNode) => void;\n\nconst rootMap = new WeakMap<HTMLElement, RenderedDOM<any>>();\n\nexport const render: RenderFunction = (el, jsx) => {\n if (rootMap.has(el))\n revokeNode(rootMap.get(el)!);\n\n const [root, node] = createNode(jsx);\n\n rootMap.set(el, root);\n\n el.append(node);\n}\n"
|
|
16
16
|
],
|
|
17
|
-
"mappings": "AAKO,IAAM,EAAkB,CAAmB,IAC9C,CAAC,IAA2B,CAAC,EAAW,CAAK,ECJ1C,IAAM,EAAW,IAAI,IACxB,CAAC,KAAM,CAAC,EAAG,GAAG,CAAQ,ECOnB,IAAM,EAAwB,CAAC,EAAM,KAAU,IAClD,OAAO,IAAS,SACV,CAAC,EAAM,GAAS,CAAC,EAAG,GAAG,CAAQ,EAC/B,IAAS,EACL,CAAC,KAAM,GAAS,CAAC,EAAG,GAAG,CAAQ,EAC/B,EAAK,CAAK,ECbjB,IAAI,
|
|
18
|
-
"debugId": "
|
|
17
|
+
"mappings": "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",
|
|
18
|
+
"debugId": "53C4851E8EA2354964756E2164756E21",
|
|
19
19
|
"names": []
|
|
20
20
|
}
|