lunet 0.0.0 → 0.0.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
@@ -1,6 +1,16 @@
1
1
  # lunet
2
2
  より柔軟なWebフロントエンドライブラリ。
3
3
 
4
+ ## インストール
5
+ ```bash
6
+ $ npm install lunet
7
+ # or
8
+ $ bun i lunet
9
+
10
+ # こちらもお勧め
11
+ $ bun i lunet-transpiler
12
+ ```
13
+
4
14
  ## 使い方のサンプル
5
15
  ```jsx
6
16
  import { createComponent, render, setBatch } from "lunet";
@@ -30,17 +40,3 @@ const App = createComponent((render, init) => {
30
40
  render(document.getElementById("root"), <App msg="Count:" />);
31
41
 
32
42
  ```
33
-
34
- To install dependencies:
35
-
36
- ```bash
37
- bun install
38
- ```
39
-
40
- To run:
41
-
42
- ```bash
43
- bun run src/index.ts
44
- ```
45
-
46
- This project was created using `bun init` in bun v1.2.19. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime.
package/dist/index.cjs ADDED
@@ -0,0 +1,4 @@
1
+ var{defineProperty:N,getOwnPropertyNames:O,getOwnPropertyDescriptor:$}=Object,D=Object.prototype.hasOwnProperty;var w=new WeakMap,P=(e)=>{var o=w.get(e),t;if(o)return o;if(o=N({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")O(e).map((n)=>!D.call(o,n)&&N(o,n,{get:()=>e[n],enumerable:!(t=$(e,n))||t.enumerable}));return w.set(e,o),o};var U=(e,o)=>{for(var t in o)N(e,t,{get:o[t],enumerable:!0,configurable:!0,set:(n)=>o[t]=()=>n})};var B={};U(B,{setBatch:()=>x,render:()=>K,h:()=>C,fragment:()=>k,createComponent:()=>E});module.exports=P(B);var E=(e)=>(o)=>[e,o];var k=(...e)=>[null,{},...e];var C=(e,o,...t)=>typeof e==="string"?[e,o??{},...t]:e===k?[null,o??{},...t]:e(o);var v=(e)=>e(),x=(e)=>v=e;var I=(e,o)=>typeof e==="string"||typeof o==="string"?typeof e===typeof o:e[0]===o[0]&&e[1].key===o[1].key,T=(e,o)=>{let t=[],n=Math.max(e.length,o.length);for(let r=0;r<n;r++){let p=e[r],i=o[r];if(!p&&i)t.push([1,r,i]);else if(p&&!i)t.push([2,r,i]);else if(p&&i)if(I(p,i))t.push([0,r,i]);else t.push([2,r,i]),t.push([1,r,i])}return t};var J=(e)=>{let o=e,t=[],n;return{type:2,flat:()=>t.flatMap((r)=>r.flat()),update(r){let[,,...p]=o,[,,...i]=r,c=T(p,i),s=0;for(let[a,g,u]of c){let m=g-s;switch(a){case 0:t[m].update(u);break;case 1:let S=l(u);t.splice(m,0,S);let y=S.render(),b=null;if(n&&n.parentNode){let f=n.nextSibling,h=0;while(f){if(h===m){b=f;break}f=f.nextSibling,h++}if(b)n.parentNode.insertBefore(y,b);else n.parentNode.appendChild(y)}break;case 2:s++;let[X]=t.splice(m,1);X.revoke();break}}o=r},render(){let[,,...r]=o,p=document.createDocumentFragment();return n=document.createComment(""),t=r.map(l),p.append(n,...t.map((i)=>i.render())),p},revoke(){for(let r of t)r.revoke()}}};var F=(e)=>{let o=e,t=null,n,r=(p)=>{if(t)t.update([null,{},p]);else t=J([null,{},p])};return{type:3,flat:()=>t?.flat()??[],update(p){let[,i]=o=p;v(()=>{for(let[c,s]of Object.entries(i))if(n[c]!==s)n[c]=s})},render(){t?.revoke(),t=null;let[p,i]=o;if(n=p(r,{...i}),!t)console.error("never rendered Initial render."),t=J([null,{}]);return t.render()},revoke(){t?.revoke()}}};var d=new WeakMap;var M=new WeakMap;function W(e){return M.get(this)?.[e.type]?.()}var A=(e,o,t)=>{if(e instanceof HTMLInputElement)switch(o){case"checked":if(typeof t==="boolean"){e.checked=t;return}break;case"value":if(typeof t==="string"){e.value=t;return}break}switch(typeof t){case"string":e.setAttribute(o,t);break;case"function":if(o.startsWith("$")){if(!["$beforeMount","$mount","$beforeUnmount","$unmount"].includes(o)){let n=o.substring(1),r=M.get(e);if(!(n in r))e.addEventListener(n,W);r[n]=t}}else console.error("function values cannot mount on attributes.");break;case"object":if(t===null)e.removeAttribute(o);else console.error(`${typeof t} values cannot mount on attributes.`);break;default:if(t===void 0)e.removeAttribute(o);else e.setAttribute(o,String(t));break}},R=(e)=>{let o=e,t=[],n,r=()=>{let[p,i,...c]=o;i.$beforeMount?.();let s=document.createElement(p);M.set(s,{}),i.$mount?.call(s,new CustomEvent("mount",{detail:s}));for(let[a,g]of Object.entries(i))A(s,a,g);return t=c.map(l),s.append(...t.map((a)=>a.render())),d.set(s,()=>{i.$beforeUnmount?.call(s,new CustomEvent("beforeunmount",{detail:s}));for(let a of t)a.revoke();d.delete(s),M.delete(s),s.remove(),i.$unmount?.()}),n=s};return{type:1,flat:()=>[o],update(p){let[,,...i]=o,[,c,...s]=p;for(let[u,m]of Object.entries(c))if(o[1][u]!==m)A(n,u,m);let a=T(i,s),g=0;for(let[u,m,S]of a){let y=m-g;switch(u){case 0:t[y].update(S);break;case 1:let b=l(S);t.splice(y,0,b);let X=t.reduce((h,H)=>h+H.flat().length,0),f=b.render();if(X>=n.childNodes.length)n.append(f);else n.childNodes[X].before(f);break;case 2:g++,t.splice(y,1)[0].revoke();break}}o=p},render(){return n&&d.get(n)?.(),r()},revoke(){n&&d.get(n)?.()}}};var L=(e)=>{let o=e,t=new Text(o);return{type:0,flat:()=>[o],update(n){o!==n&&(t.textContent=o=n)},render:()=>t,revoke(){t.remove()}}};var l=(e)=>{if(typeof e==="string")return L(e);else if(typeof e[0]==="string")return R(e);else if(e[0]===null)return J(e);else return F(e)};var K=(e,o)=>{e.childNodes.forEach((t)=>{d.get(t)?.(),t.remove()}),e.append(l(o).render())};
2
+
3
+ //# debugId=7BD2198C93C418C264756E2164756E21
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/jsx/component.ts", "../src/jsx/fragment.ts", "../src/jsx/likereact.ts", "../src/batch.ts", "../src/mount/diff.ts", "../src/mount/dom/fragment.ts", "../src/mount/dom/component.ts", "../src/mount/revokerMap.ts", "../src/mount/dom/element.ts", "../src/mount/dom/text.ts", "../src/mount/dom/index.ts", "../src/mount/index.ts"],
4
+ "sourcesContent": [
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
+ "import type { JSXFragment, JSXNode } from \".\";\n\nexport const fragment = (...children: JSXNode[]): JSXFragment =>\n [null, {}, ...children];\n",
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
+ "export let batch: ((cb: () => void) => void) = cb => cb();\n\nexport const setBatch = (fn: typeof batch) => batch = fn;\n",
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 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, i, after]);\n else if(before && !after)\n patches.push([2, i, after]);\n else if(before && after)\n if(isCompatibleNode(before, after))\n patches.push([0, i, after]);\n else{\n patches.push([2, i, after]);\n patches.push([1, i, after]);\n }\n }\n\n return patches;\n}\n",
10
+ "import { renderNode, type RenderedDOM, type UnknownRenderedDOM } from \".\";\nimport type { JSXFragment } from \"../../jsx\";\nimport { diff } from \"../diff\";\n\nexport const renderFragment = (jsx: JSXFragment): RenderedDOM<JSXFragment> => {\n let currentJSX = jsx;\n\n let rendered_children: UnknownRenderedDOM[] = [];\n let mark: Comment | void;\n\n return {\n type: 2,\n flat: () => rendered_children.flatMap(e=>e.flat()),\n update(jsx){\n const [,, ...old_children] = currentJSX;\n const [,, ...new_children] = jsx;\n\n const patches = diff(old_children, new_children);\n let removes = 0;\n\n for (const [type, idx_, jsx] of patches) {\n const idx = idx_ - removes;\n switch(type){\n case 0:\n rendered_children[idx].update(jsx as any);\n break;\n case 1:\n const rendered = renderNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n const dom = rendered.render();\n let refNode: ChildNode | null = null; // TODO: ここら辺を最適化する\n if (mark && mark.parentNode) {\n let node: ChildNode | null = mark.nextSibling;\n let count = 0;\n while (node) {\n if (count === idx) {\n refNode = node;\n break;\n }\n node = node.nextSibling;\n count++;\n }\n if (refNode) {\n mark.parentNode.insertBefore(dom, refNode);\n } else {\n mark.parentNode.appendChild(dom);\n }\n }\n break;\n case 2:\n removes++;\n const [removed] = rendered_children.splice(idx, 1);\n removed.revoke();\n break;\n }\n }\n \n currentJSX = jsx;\n },\n render(){\n const [,, ...children] = currentJSX;\n\n const el = document.createDocumentFragment();\n mark = document.createComment(\"\");\n\n rendered_children = children.map(renderNode);\n el.append(mark, ...rendered_children.map(e=>e.render()));\n\n return el;\n },\n revoke(){\n for (const child of rendered_children)\n child.revoke();\n },\n }\n}\n",
11
+ "import { type RenderedDOM } from \".\";\nimport { batch } from \"../../batch\";\nimport type { JSXComponent, JSXFragment, JSXNode } from \"../../jsx\";\nimport { renderFragment } from \"./fragment\";\n\nexport const renderComponent = (jsx: JSXComponent): RenderedDOM<JSXComponent> => {\n let currentJSX = jsx;\n\n let rendered_dom = null as RenderedDOM<JSXFragment> | null;\n\n let props: { [key: string]: unknown } | null;\n\n const render = (jsx: JSXNode) => {\n if(rendered_dom) rendered_dom.update([null, {}, jsx]);\n else rendered_dom = renderFragment([null, {}, jsx]);\n }\n\n return {\n type: 3,\n flat: () => rendered_dom?.flat() ?? [],\n update(jsx){\n const [, afterProps/*, ...children*/] = currentJSX = jsx;\n\n batch(() => {\n for (const [key, value] of Object.entries(afterProps))\n if (props![key] !== value)\n props![key] = value;\n });\n },\n render(){\n rendered_dom?.revoke();\n rendered_dom = null;\n\n const [component, init_props/*, ...children*/] = currentJSX;\n\n props = component(render, { ...init_props });\n\n if(!rendered_dom) {\n console.error(\"never rendered Initial render.\");\n rendered_dom = renderFragment([null, {}]);\n }\n\n return rendered_dom.render();\n },\n revoke(){ rendered_dom?.revoke() },\n }\n}\n",
12
+ "export const revokerMap = new WeakMap<Node, () => void>();\n",
13
+ "import { renderNode, type RenderedDOM, type UnknownRenderedDOM } from \".\";\nimport type { JSXElement, JSXNode } from \"../../jsx\";\nimport { revokerMap } from \"../revokerMap\";\nimport { diff } from \"../diff\";\n\nconst elementEvents: WeakMap<HTMLElement, Record<string, Function>> = new WeakMap;\n\nfunction handleEvent(this: HTMLElement, ev: Event){\n return elementEvents.get(this)?.[ev.type]?.();\n}\n\nconst setAttribute = (el: HTMLElement, name: string, value: unknown) => {\n if(el instanceof HTMLInputElement) {\n switch(name){\n case \"checked\":\n if(typeof value === \"boolean\"){\n el.checked = value;\n return;\n }\n break;\n case \"value\":\n if(typeof value === \"string\"){\n el.value = value;\n return;\n }\n break;\n }\n }\n switch(typeof value){\n case \"string\":\n el.setAttribute(name, value);\n break;\n case \"function\":\n if(name.startsWith(\"$\")){\n if(![\"$beforeMount\", \"$mount\", \"$beforeUnmount\", \"$unmount\"].includes(name)){\n const ev_name = name.substring(1);\n const events = elementEvents.get(el)!;\n if(!(ev_name in events))\n el.addEventListener(ev_name, handleEvent);\n events[ev_name] = value;\n }\n }else\n console.error(\"function values cannot mount on attributes.\");\n break;\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 renderElement = (jsx: JSXElement): RenderedDOM<JSXElement> => {\n let currentJSX = jsx;\n\n let rendered_children: UnknownRenderedDOM[] = [];\n let element: HTMLElement | void;\n\n const render = () => {\n const [tag, props, ...children] = currentJSX;\n\n props.$beforeMount?.();\n const el = document.createElement(tag);\n elementEvents.set(el, {});\n props.$mount?.call(el, new CustomEvent(\"mount\", { detail: el as any }));\n\n for (const [name, value] of Object.entries(props))\n setAttribute(el, name, value);\n\n rendered_children = children.map(renderNode);\n el.append(...rendered_children.map(e=>e.render()));\n\n revokerMap.set(el, () => {\n props.$beforeUnmount?.call(el, new CustomEvent(\"beforeunmount\", { detail: el as any }));\n\n for (const child of rendered_children)\n child.revoke();\n revokerMap.delete(el);\n elementEvents.delete(el);\n el.remove();\n \n props.$unmount?.();\n });\n\n return element = el;\n }\n\n return {\n type: 1,\n flat: () => [currentJSX],\n update(jsx){\n const [,, ...old_children] = currentJSX;\n const [, props, ...new_children] = jsx;\n\n for (const [name, value] of Object.entries(props))\n if((currentJSX[1] as any)[name] !== value)\n setAttribute(element!, name, value);\n\n const patches = diff(old_children, new_children);\n let removes = 0;\n for (const [type, idx_, jsx] of patches) {\n const idx = idx_ - removes;\n switch(type){\n case 0:\n rendered_children[idx].update(jsx as any);\n break;\n case 1:\n const rendered = renderNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n\n const dom_index = rendered_children.reduce((p,c)=>p+c.flat().length, 0);\n const el = rendered.render();\n\n if(dom_index >= element!.childNodes.length)\n element!.append(el);\n else\n element!.childNodes[dom_index]!.before(el);\n\n break;\n case 2:\n removes++;\n rendered_children.splice(idx, 1)[0].revoke();\n break;\n }\n }\n\n currentJSX = jsx;\n },\n render(){\n element && revokerMap.get(element)?.();\n return render();\n },\n revoke(){ element && revokerMap.get(element)?.() },\n }\n}\n",
14
+ "import type { RenderedDOM } from \".\";\n\nexport const renderText = (jsx: string): RenderedDOM<string> => {\n let currentText = jsx;\n const node = new Text(currentText);\n\n return {\n type: 0,\n flat: () => [currentText],\n update(jsx){ currentText !== jsx && (node.textContent = currentText = jsx) },\n render: () => node,\n revoke(){ node.remove() },\n }\n}\n",
15
+ "import type { JSXComponent, JSXElement, JSXFragment, JSXNode } from \"../../jsx\";\nimport { renderComponent } from \"./component\";\nimport { renderElement } from \"./element\";\nimport { renderFragment } from \"./fragment\";\nimport { renderText } from \"./text\";\n\nexport type RenderedDOM<T extends JSXNode> = {\n type: T extends string ? 0 : T extends JSXElement ? 1 : T extends JSXFragment ? 2 : T extends JSXComponent ? 3 : never, // 0 種類\n flat(): (JSXElement | string)[], // 1 差分比較用のフラットJSX出力関数\n update(jsx: T): void, // 2 差分更新関数\n render(): Node, // 3 初回・トラブル時にフル描画をする関数\n revoke(): void, // 4 破棄関数\n}\n\nexport type UnknownRenderedDOM = RenderedDOM<string> | RenderedDOM<JSXElement> | RenderedDOM<JSXFragment> | RenderedDOM<JSXComponent>;\n\nexport const renderNode = (jsx: JSXNode): UnknownRenderedDOM => {\n if(typeof jsx === \"string\"){\n return renderText(jsx);\n }else if(typeof jsx[0] === \"string\"){\n return renderElement(jsx);\n }else if(jsx[0] === null){\n return renderFragment(jsx);\n }else{\n return renderComponent(jsx);\n }\n}\n",
16
+ "import type { JSXNode } from \"../jsx\";\nimport { renderNode } from \"./dom\";\nimport { revokerMap } from \"./revokerMap\";\n\ntype RenderFunction = (el: HTMLElement, jsx: JSXNode) => void;\n\nexport const render: RenderFunction = (el, jsx) => {\n el.childNodes.forEach(e=>{\n revokerMap.get(e)?.();\n e.remove();\n });\n\n el.append(renderNode(jsx).render());\n}\n"
17
+ ],
18
+ "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,ECfjB,IAAI,EAAoC,KAAM,EAAG,EAE3C,EAAW,CAAC,IAAqB,EAAQ,ECA/C,IAAM,EAAmB,CAAC,EAAiB,IAC9C,OAAO,IAAW,UAAY,OAAO,IAAU,SACzC,OAAO,IAAW,OAAO,EACzB,EAAO,KAAO,EAAM,IAAM,EAAO,GAAG,MAAQ,EAAM,GAAG,IAOlD,EAAO,CAChB,EACA,IACU,CACV,IAAM,EAAmB,CAAC,EACpB,EAAM,KAAK,IAAI,EAAa,OAAQ,EAAY,MAAM,EAE5D,QAAQ,EAAI,EAAE,EAAI,EAAI,IAAI,CACtB,IAAM,EAAS,EAAa,GACtB,EAAQ,EAAY,GAE1B,GAAG,CAAC,GAAU,EACV,EAAQ,KAAK,CAAC,EAAG,EAAG,CAAK,CAAC,EACzB,QAAG,GAAU,CAAC,EACf,EAAQ,KAAK,CAAC,EAAG,EAAG,CAAK,CAAC,EACzB,QAAG,GAAU,EACd,GAAG,EAAiB,EAAQ,CAAK,EAC7B,EAAQ,KAAK,CAAC,EAAG,EAAG,CAAK,CAAC,EAE1B,OAAQ,KAAK,CAAC,EAAG,EAAG,CAAK,CAAC,EAC1B,EAAQ,KAAK,CAAC,EAAG,EAAG,CAAK,CAAC,EAItC,OAAO,GChCJ,IAAM,EAAiB,CAAC,IAA+C,CAC1E,IAAI,EAAa,EAEb,EAA0C,CAAC,EAC3C,EAEJ,MAAO,CACH,KAAM,EACN,KAAM,IAAM,EAAkB,QAAQ,KAAG,EAAE,KAAK,CAAC,EACjD,MAAM,CAAC,EAAI,CACP,SAAa,GAAgB,QAChB,GAAgB,EAEvB,EAAU,EAAK,EAAc,CAAY,EAC3C,EAAU,EAEd,QAAY,EAAM,EAAM,KAAQ,EAAS,CACrC,IAAM,EAAM,EAAO,EACnB,OAAO,OACE,GACD,EAAkB,GAAK,OAAO,CAAU,EACxC,UACC,GACD,IAAM,EAAW,EAAW,CAAG,EAC/B,EAAkB,OAAO,EAAK,EAAG,CAAQ,EACzC,IAAM,EAAM,EAAS,OAAO,EACxB,EAA4B,KAChC,GAAI,GAAQ,EAAK,WAAY,CACzB,IAAI,EAAyB,EAAK,YAC9B,EAAQ,EACZ,MAAO,EAAM,CACT,GAAI,IAAU,EAAK,CACf,EAAU,EACV,MAEJ,EAAO,EAAK,YACZ,IAEJ,GAAI,EACA,EAAK,WAAW,aAAa,EAAK,CAAO,EAEzC,OAAK,WAAW,YAAY,CAAG,EAGvC,UACC,GACD,IACA,IAAO,GAAW,EAAkB,OAAO,EAAK,CAAC,EACjD,EAAQ,OAAO,EACf,OAIZ,EAAa,GAEjB,MAAM,EAAE,CACJ,SAAa,GAAY,EAEnB,EAAK,SAAS,uBAAuB,EAM3C,OALA,EAAO,SAAS,cAAc,EAAE,EAEhC,EAAoB,EAAS,IAAI,CAAU,EAC3C,EAAG,OAAO,EAAM,GAAG,EAAkB,IAAI,KAAG,EAAE,OAAO,CAAC,CAAC,EAEhD,GAEX,MAAM,EAAE,CACJ,QAAW,KAAS,EAChB,EAAM,OAAO,EAEzB,GCrEG,IAAM,EAAkB,CAAC,IAAiD,CAC7E,IAAI,EAAa,EAEb,EAAe,KAEf,EAEE,EAAS,CAAC,IAAiB,CAC7B,GAAG,EAAc,EAAa,OAAO,CAAC,KAAM,CAAC,EAAG,CAAG,CAAC,EAC/C,OAAe,EAAe,CAAC,KAAM,CAAC,EAAG,CAAG,CAAC,GAGtD,MAAO,CACH,KAAM,EACN,KAAM,IAAM,GAAc,KAAK,GAAK,CAAC,EACrC,MAAM,CAAC,EAAI,CACP,KAAS,GAA+B,EAAa,EAErD,EAAM,IAAM,CACR,QAAY,EAAK,KAAU,OAAO,QAAQ,CAAU,EAChD,GAAI,EAAO,KAAS,EAChB,EAAO,GAAO,EACzB,GAEL,MAAM,EAAE,CACJ,GAAc,OAAO,EACrB,EAAe,KAEf,IAAO,EAAW,GAA+B,EAIjD,GAFA,EAAQ,EAAU,EAAQ,IAAK,CAAW,CAAC,EAExC,CAAC,EACA,QAAQ,MAAM,gCAAgC,EAC9C,EAAe,EAAe,CAAC,KAAM,CAAC,CAAC,CAAC,EAG5C,OAAO,EAAa,OAAO,GAE/B,MAAM,EAAE,CAAE,GAAc,OAAO,EACnC,GC7CG,IAAM,EAAa,IAAI,QCK9B,IAAM,EAAgE,IAAI,QAE1E,SAAS,CAAW,CAAoB,EAAU,CAC9C,OAAO,EAAc,IAAI,IAAI,IAAI,EAAG,QAAQ,EAGhD,IAAM,EAAe,CAAC,EAAiB,EAAc,IAAmB,CACpE,GAAG,aAAc,iBACb,OAAO,OACE,UACD,GAAG,OAAO,IAAU,UAAU,CAC1B,EAAG,QAAU,EACb,OAEJ,UACC,QACD,GAAG,OAAO,IAAU,SAAS,CACzB,EAAG,MAAQ,EACX,OAEJ,MAGZ,OAAO,OAAO,OACL,SACD,EAAG,aAAa,EAAM,CAAK,EAC3B,UACC,WACD,GAAG,EAAK,WAAW,GAAG,GAClB,GAAG,CAAC,CAAC,eAAgB,SAAU,iBAAkB,UAAU,EAAE,SAAS,CAAI,EAAE,CACxE,IAAM,EAAU,EAAK,UAAU,CAAC,EAC1B,EAAS,EAAc,IAAI,CAAE,EACnC,GAAG,EAAE,KAAW,GACZ,EAAG,iBAAiB,EAAS,CAAW,EAC5C,EAAO,GAAW,GAGtB,aAAQ,MAAM,6CAA6C,EAC/D,UACC,SACD,GAAG,IAAU,KACT,EAAG,gBAAgB,CAAI,EAEvB,aAAQ,MAAM,GAAG,OAAO,sCAA0C,EACtE,cAEA,GAAG,IAAU,OACT,EAAG,gBAAgB,CAAI,EAEvB,OAAG,aAAa,EAAM,OAAO,CAAK,CAAC,EACvC,QAIC,EAAgB,CAAC,IAA6C,CACvE,IAAI,EAAa,EAEb,EAA0C,CAAC,EAC3C,EAEE,EAAS,IAAM,CACjB,IAAO,EAAK,KAAU,GAAY,EAElC,EAAM,eAAe,EACrB,IAAM,EAAK,SAAS,cAAc,CAAG,EACrC,EAAc,IAAI,EAAI,CAAC,CAAC,EACxB,EAAM,QAAQ,KAAK,EAAI,IAAI,YAAY,QAAS,CAAE,OAAQ,CAAU,CAAC,CAAC,EAEtE,QAAY,EAAM,KAAU,OAAO,QAAQ,CAAK,EAC5C,EAAa,EAAI,EAAM,CAAK,EAiBhC,OAfA,EAAoB,EAAS,IAAI,CAAU,EAC3C,EAAG,OAAO,GAAG,EAAkB,IAAI,KAAG,EAAE,OAAO,CAAC,CAAC,EAEjD,EAAW,IAAI,EAAI,IAAM,CACrB,EAAM,gBAAgB,KAAK,EAAI,IAAI,YAAY,gBAAiB,CAAE,OAAQ,CAAU,CAAC,CAAC,EAEtF,QAAW,KAAS,EAChB,EAAM,OAAO,EACjB,EAAW,OAAO,CAAE,EACpB,EAAc,OAAO,CAAE,EACvB,EAAG,OAAO,EAEV,EAAM,WAAW,EACpB,EAEM,EAAU,GAGrB,MAAO,CACH,KAAM,EACN,KAAM,IAAM,CAAC,CAAU,EACvB,MAAM,CAAC,EAAI,CACP,SAAa,GAAgB,IACpB,KAAU,GAAgB,EAEnC,QAAY,EAAM,KAAU,OAAO,QAAQ,CAAK,EAC5C,GAAI,EAAW,GAAW,KAAU,EAChC,EAAa,EAAU,EAAM,CAAK,EAE1C,IAAM,EAAU,EAAK,EAAc,CAAY,EAC3C,EAAU,EACd,QAAY,EAAM,EAAM,KAAQ,EAAS,CACrC,IAAM,EAAM,EAAO,EACnB,OAAO,OACE,GACD,EAAkB,GAAK,OAAO,CAAU,EACxC,UACC,GACD,IAAM,EAAW,EAAW,CAAG,EAC/B,EAAkB,OAAO,EAAK,EAAG,CAAQ,EAEzC,IAAM,EAAY,EAAkB,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAQ,CAAC,EAChE,EAAK,EAAS,OAAO,EAE3B,GAAG,GAAa,EAAS,WAAW,OAChC,EAAS,OAAO,CAAE,EAElB,OAAS,WAAW,GAAY,OAAO,CAAE,EAE7C,UACC,GACD,IACA,EAAkB,OAAO,EAAK,CAAC,EAAE,GAAG,OAAO,EAC3C,OAIZ,EAAa,GAEjB,MAAM,EAAE,CAEJ,OADA,GAAW,EAAW,IAAI,CAAO,IAAI,EAC9B,EAAO,GAElB,MAAM,EAAE,CAAE,GAAW,EAAW,IAAI,CAAO,IAAI,EACnD,GC1IG,IAAM,EAAa,CAAC,IAAqC,CAC5D,IAAI,EAAc,EACZ,EAAO,IAAI,KAAK,CAAW,EAEjC,MAAO,CACH,KAAM,EACN,KAAM,IAAM,CAAC,CAAW,EACxB,MAAM,CAAC,EAAI,CAAE,IAAgB,IAAQ,EAAK,YAAc,EAAc,IACtE,OAAQ,IAAM,EACd,MAAM,EAAE,CAAE,EAAK,OAAO,EAC1B,GCIG,IAAM,EAAa,CAAC,IAAqC,CAC5D,GAAG,OAAO,IAAQ,SACd,OAAO,EAAW,CAAG,EACnB,QAAG,OAAO,EAAI,KAAO,SACvB,OAAO,EAAc,CAAG,EACtB,QAAG,EAAI,KAAO,KAChB,OAAO,EAAe,CAAG,EAEzB,YAAO,EAAgB,CAAG,GClB3B,IAAM,EAAyB,CAAC,EAAI,IAAQ,CAC/C,EAAG,WAAW,QAAQ,KAAG,CACrB,EAAW,IAAI,CAAC,IAAI,EACpB,EAAE,OAAO,EACZ,EAED,EAAG,OAAO,EAAW,CAAG,EAAE,OAAO,CAAC",
19
+ "debugId": "7BD2198C93C418C264756E2164756E21",
20
+ "names": []
21
+ }
@@ -0,0 +1,212 @@
1
+ type ComponentFunction<T extends object> = (render: (jsx: JSXNode) => void, initProps: T) => T;
2
+ type Component<T extends object> = (props: T) => JSXComponent;
3
+ declare const createComponent: <T extends object>(component: ComponentFunction<T>) => Component<T>;
4
+ declare const fragment: (...children: JSXNode[]) => JSXFragment;
5
+ type JSXFactoryFunction = <T extends keyof HTMLElementTagNameMap | Component<any> | typeof fragment>(type: T, props: null | (T extends Component<infer P> ? P : {
6
+ [key: string]: unknown
7
+ }), ...children: JSXNode[]) => JSXNode;
8
+ declare const h: JSXFactoryFunction;
9
+ type Key = {
10
+ key?: unknown
11
+ };
12
+ type JSXNode = JSXElement | JSXComponent | JSXFragment | string;
13
+ type JSXElement<T extends keyof HTMLElementTagNameMap = keyof HTMLElementTagNameMap> = [T, JSX.IntrinsicElements[T], ...JSXNode[]];
14
+ type JSXComponent = [ComponentFunction<any>, object & Key, ...JSXNode[]];
15
+ type JSXFragment = [null, Key, ...JSXNode[]];
16
+ interface HTMLElAttrEvMap {
17
+ "$fullscreenchange": Event;
18
+ "$fullscreenerror": Event;
19
+ "$abort": UIEvent;
20
+ "$animationcancel": AnimationEvent;
21
+ "$animationend": AnimationEvent;
22
+ "$animationiteration": AnimationEvent;
23
+ "$animationstart": AnimationEvent;
24
+ "$auxclick": PointerEvent;
25
+ "$beforeinput": InputEvent;
26
+ "$beforetoggle": ToggleEvent;
27
+ "$blur": FocusEvent;
28
+ "$cancel": Event;
29
+ "$canplay": Event;
30
+ "$canplaythrough": Event;
31
+ "$change": Event;
32
+ "$click": MouseEvent;
33
+ "$close": Event;
34
+ "$compositionend": CompositionEvent;
35
+ "$compositionstart": CompositionEvent;
36
+ "$compositionupdate": CompositionEvent;
37
+ "$contextlost": Event;
38
+ "$contextmenu": PointerEvent;
39
+ "$contextrestored": Event;
40
+ "$copy": ClipboardEvent;
41
+ "$cuechange": Event;
42
+ "$cut": ClipboardEvent;
43
+ "$dblclick": MouseEvent;
44
+ "$drag": DragEvent;
45
+ "$dragend": DragEvent;
46
+ "$dragenter": DragEvent;
47
+ "$dragleave": DragEvent;
48
+ "$dragover": DragEvent;
49
+ "$dragstart": DragEvent;
50
+ "$drop": DragEvent;
51
+ "$durationchange": Event;
52
+ "$emptied": Event;
53
+ "$ended": Event;
54
+ "$error": ErrorEvent;
55
+ "$focus": FocusEvent;
56
+ "$focusin": FocusEvent;
57
+ "$focusout": FocusEvent;
58
+ "$formdata": FormDataEvent;
59
+ "$gotpointercapture": PointerEvent;
60
+ "$input": Event;
61
+ "$invalid": Event;
62
+ "$keydown": KeyboardEvent;
63
+ "$keypress": KeyboardEvent;
64
+ "$keyup": KeyboardEvent;
65
+ "$load": Event;
66
+ "$loadeddata": Event;
67
+ "$loadedmetadata": Event;
68
+ "$loadstart": Event;
69
+ "$lostpointercapture": PointerEvent;
70
+ "$mousedown": MouseEvent;
71
+ "$mouseenter": MouseEvent;
72
+ "$mouseleave": MouseEvent;
73
+ "$mousemove": MouseEvent;
74
+ "$mouseout": MouseEvent;
75
+ "$mouseover": MouseEvent;
76
+ "$mouseup": MouseEvent;
77
+ "$paste": ClipboardEvent;
78
+ "$pause": Event;
79
+ "$play": Event;
80
+ "$playing": Event;
81
+ "$pointercancel": PointerEvent;
82
+ "$pointerdown": PointerEvent;
83
+ "$pointerenter": PointerEvent;
84
+ "$pointerleave": PointerEvent;
85
+ "$pointermove": PointerEvent;
86
+ "$pointerout": PointerEvent;
87
+ "$pointerover": PointerEvent;
88
+ "$pointerup": PointerEvent;
89
+ "$progress": ProgressEvent;
90
+ "$ratechange": Event;
91
+ "$reset": Event;
92
+ "$resize": UIEvent;
93
+ "$scroll": Event;
94
+ "$scrollend": Event;
95
+ "$securitypolicyviolation": SecurityPolicyViolationEvent;
96
+ "$seeked": Event;
97
+ "$seeking": Event;
98
+ "$select": Event;
99
+ "$selectionchange": Event;
100
+ "$selectstart": Event;
101
+ "$slotchange": Event;
102
+ "$stalled": Event;
103
+ "$submit": SubmitEvent;
104
+ "$suspend": Event;
105
+ "$timeupdate": Event;
106
+ "$toggle": ToggleEvent;
107
+ "$touchcancel": TouchEvent;
108
+ "$touchend": TouchEvent;
109
+ "$touchmove": TouchEvent;
110
+ "$touchstart": TouchEvent;
111
+ "$transitioncancel": TransitionEvent;
112
+ "$transitionend": TransitionEvent;
113
+ "$transitionrun": TransitionEvent;
114
+ "$transitionstart": TransitionEvent;
115
+ "$volumechange": Event;
116
+ "$waiting": Event;
117
+ "$webkitanimationend": Event;
118
+ "$webkitanimationiteration": Event;
119
+ "$webkitanimationstart": Event;
120
+ "$webkittransitionend": Event;
121
+ "$wheel": WheelEvent;
122
+ }
123
+ type Attributes<
124
+ N extends keyof HTMLElementTagNameMap,
125
+ T extends object = {}
126
+ > = Partial<HTMLAttributes & T & Key & { [key in keyof HTMLElAttrEvMap] : (this: HTMLElement, ev: HTMLElAttrEvMap[key]) => unknown } & {
127
+ $beforeMount: () => unknown
128
+ $mount: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
129
+ $beforeUpdate: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
130
+ $update: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
131
+ $beforeUnmount: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
132
+ $unmount: () => unknown
133
+ }>;
134
+ type HTMLAttributes = {
135
+ accesskey: string
136
+ autocapitalize: "off" | "none" | "on" | "sentences" | "words" | "characters"
137
+ class: string
138
+ contenteditable: boolean | "" | "plaintext-only"
139
+ dir: "ltr" | "rtl"
140
+ draggable: boolean
141
+ hidden: "" | "hidden" | "until-found"
142
+ id: string
143
+ itemprop: string
144
+ lang: string
145
+ role: string
146
+ slot: string
147
+ spellcheck: boolean
148
+ style: string
149
+ tabindex: number
150
+ title: string
151
+ translate: "yes" | "no"
152
+ };
153
+ type Target = "_self" | "_blank" | "_parent" | "_top";
154
+ declare global {
155
+ namespace JSX {
156
+ type Element = JSXNode;
157
+ type IntrinsicElements = { [key in keyof HTMLElementTagNameMap] : Attributes<key> } & {
158
+ div: Attributes<"div">
159
+ ul: Attributes<"ul">
160
+ ol: Attributes<"ol">
161
+ li: Attributes<"li">
162
+ br: Attributes<"br">
163
+ button: Attributes<"button">
164
+ a: Attributes<"a", {
165
+ href: string
166
+ download: string
167
+ target: Target
168
+ hreflang: string
169
+ media: string
170
+ ping: string
171
+ referrerpolicy: string
172
+ rel: string
173
+ shape: string
174
+ }>
175
+ input: Attributes<"input", {
176
+ accept: string
177
+ alt: string
178
+ autocomplete: "off" | "on" | string
179
+ checked: boolean
180
+ disabled: boolean
181
+ formonvalidate: boolean
182
+ formtarget: Target
183
+ type: "button" | "checkbox" | "color" | "date" | "datetime-local" | "email" | "file" | "hidden" | "image" | "month" | "number" | "password" | "radio" | "range" | "reset" | "search" | "submit" | "tel" | "text" | "time" | "url" | "week"
184
+ value: string
185
+ }>
186
+ form: Attributes<"form", {
187
+ "accept-charset": "UTF-8"
188
+ autocomplete: "off" | "on"
189
+ name: string
190
+ enctype: "application/x-www-form-urlencoded" | "multipart/form-data" | "text/plain"
191
+ method: "post" | "get" | "dalog"
192
+ target: Target | "_unfencedTop"
193
+ }>
194
+ iframe: Attributes<"iframe", {
195
+ allow: string
196
+ allowfullscreen: boolean
197
+ width: number
198
+ height: number
199
+ loading: "eager" | "lazy"
200
+ name: string
201
+ referrerpolicy: "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-orgin" | "usafe-url"
202
+ sandbox: string
203
+ src: string
204
+ srcdoc: string
205
+ }>
206
+ };
207
+ }
208
+ }
209
+ type RenderFunction = (el: HTMLElement, jsx: JSXNode) => void;
210
+ declare const render: RenderFunction;
211
+ declare const setBatch: unknown;
212
+ export { setBatch, render, h, fragment, createComponent, Key, JSXNode, JSXFragment, JSXElement, JSXComponent, Component };
@@ -0,0 +1,212 @@
1
+ type ComponentFunction<T extends object> = (render: (jsx: JSXNode) => void, initProps: T) => T;
2
+ type Component<T extends object> = (props: T) => JSXComponent;
3
+ declare const createComponent: <T extends object>(component: ComponentFunction<T>) => Component<T>;
4
+ declare const fragment: (...children: JSXNode[]) => JSXFragment;
5
+ type JSXFactoryFunction = <T extends keyof HTMLElementTagNameMap | Component<any> | typeof fragment>(type: T, props: null | (T extends Component<infer P> ? P : {
6
+ [key: string]: unknown
7
+ }), ...children: JSXNode[]) => JSXNode;
8
+ declare const h: JSXFactoryFunction;
9
+ type Key = {
10
+ key?: unknown
11
+ };
12
+ type JSXNode = JSXElement | JSXComponent | JSXFragment | string;
13
+ type JSXElement<T extends keyof HTMLElementTagNameMap = keyof HTMLElementTagNameMap> = [T, JSX.IntrinsicElements[T], ...JSXNode[]];
14
+ type JSXComponent = [ComponentFunction<any>, object & Key, ...JSXNode[]];
15
+ type JSXFragment = [null, Key, ...JSXNode[]];
16
+ interface HTMLElAttrEvMap {
17
+ "$fullscreenchange": Event;
18
+ "$fullscreenerror": Event;
19
+ "$abort": UIEvent;
20
+ "$animationcancel": AnimationEvent;
21
+ "$animationend": AnimationEvent;
22
+ "$animationiteration": AnimationEvent;
23
+ "$animationstart": AnimationEvent;
24
+ "$auxclick": PointerEvent;
25
+ "$beforeinput": InputEvent;
26
+ "$beforetoggle": ToggleEvent;
27
+ "$blur": FocusEvent;
28
+ "$cancel": Event;
29
+ "$canplay": Event;
30
+ "$canplaythrough": Event;
31
+ "$change": Event;
32
+ "$click": MouseEvent;
33
+ "$close": Event;
34
+ "$compositionend": CompositionEvent;
35
+ "$compositionstart": CompositionEvent;
36
+ "$compositionupdate": CompositionEvent;
37
+ "$contextlost": Event;
38
+ "$contextmenu": PointerEvent;
39
+ "$contextrestored": Event;
40
+ "$copy": ClipboardEvent;
41
+ "$cuechange": Event;
42
+ "$cut": ClipboardEvent;
43
+ "$dblclick": MouseEvent;
44
+ "$drag": DragEvent;
45
+ "$dragend": DragEvent;
46
+ "$dragenter": DragEvent;
47
+ "$dragleave": DragEvent;
48
+ "$dragover": DragEvent;
49
+ "$dragstart": DragEvent;
50
+ "$drop": DragEvent;
51
+ "$durationchange": Event;
52
+ "$emptied": Event;
53
+ "$ended": Event;
54
+ "$error": ErrorEvent;
55
+ "$focus": FocusEvent;
56
+ "$focusin": FocusEvent;
57
+ "$focusout": FocusEvent;
58
+ "$formdata": FormDataEvent;
59
+ "$gotpointercapture": PointerEvent;
60
+ "$input": Event;
61
+ "$invalid": Event;
62
+ "$keydown": KeyboardEvent;
63
+ "$keypress": KeyboardEvent;
64
+ "$keyup": KeyboardEvent;
65
+ "$load": Event;
66
+ "$loadeddata": Event;
67
+ "$loadedmetadata": Event;
68
+ "$loadstart": Event;
69
+ "$lostpointercapture": PointerEvent;
70
+ "$mousedown": MouseEvent;
71
+ "$mouseenter": MouseEvent;
72
+ "$mouseleave": MouseEvent;
73
+ "$mousemove": MouseEvent;
74
+ "$mouseout": MouseEvent;
75
+ "$mouseover": MouseEvent;
76
+ "$mouseup": MouseEvent;
77
+ "$paste": ClipboardEvent;
78
+ "$pause": Event;
79
+ "$play": Event;
80
+ "$playing": Event;
81
+ "$pointercancel": PointerEvent;
82
+ "$pointerdown": PointerEvent;
83
+ "$pointerenter": PointerEvent;
84
+ "$pointerleave": PointerEvent;
85
+ "$pointermove": PointerEvent;
86
+ "$pointerout": PointerEvent;
87
+ "$pointerover": PointerEvent;
88
+ "$pointerup": PointerEvent;
89
+ "$progress": ProgressEvent;
90
+ "$ratechange": Event;
91
+ "$reset": Event;
92
+ "$resize": UIEvent;
93
+ "$scroll": Event;
94
+ "$scrollend": Event;
95
+ "$securitypolicyviolation": SecurityPolicyViolationEvent;
96
+ "$seeked": Event;
97
+ "$seeking": Event;
98
+ "$select": Event;
99
+ "$selectionchange": Event;
100
+ "$selectstart": Event;
101
+ "$slotchange": Event;
102
+ "$stalled": Event;
103
+ "$submit": SubmitEvent;
104
+ "$suspend": Event;
105
+ "$timeupdate": Event;
106
+ "$toggle": ToggleEvent;
107
+ "$touchcancel": TouchEvent;
108
+ "$touchend": TouchEvent;
109
+ "$touchmove": TouchEvent;
110
+ "$touchstart": TouchEvent;
111
+ "$transitioncancel": TransitionEvent;
112
+ "$transitionend": TransitionEvent;
113
+ "$transitionrun": TransitionEvent;
114
+ "$transitionstart": TransitionEvent;
115
+ "$volumechange": Event;
116
+ "$waiting": Event;
117
+ "$webkitanimationend": Event;
118
+ "$webkitanimationiteration": Event;
119
+ "$webkitanimationstart": Event;
120
+ "$webkittransitionend": Event;
121
+ "$wheel": WheelEvent;
122
+ }
123
+ type Attributes<
124
+ N extends keyof HTMLElementTagNameMap,
125
+ T extends object = {}
126
+ > = Partial<HTMLAttributes & T & Key & { [key in keyof HTMLElAttrEvMap] : (this: HTMLElement, ev: HTMLElAttrEvMap[key]) => unknown } & {
127
+ $beforeMount: () => unknown
128
+ $mount: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
129
+ $beforeUpdate: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
130
+ $update: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
131
+ $beforeUnmount: (this: HTMLElement, ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
132
+ $unmount: () => unknown
133
+ }>;
134
+ type HTMLAttributes = {
135
+ accesskey: string
136
+ autocapitalize: "off" | "none" | "on" | "sentences" | "words" | "characters"
137
+ class: string
138
+ contenteditable: boolean | "" | "plaintext-only"
139
+ dir: "ltr" | "rtl"
140
+ draggable: boolean
141
+ hidden: "" | "hidden" | "until-found"
142
+ id: string
143
+ itemprop: string
144
+ lang: string
145
+ role: string
146
+ slot: string
147
+ spellcheck: boolean
148
+ style: string
149
+ tabindex: number
150
+ title: string
151
+ translate: "yes" | "no"
152
+ };
153
+ type Target = "_self" | "_blank" | "_parent" | "_top";
154
+ declare global {
155
+ namespace JSX {
156
+ type Element = JSXNode;
157
+ type IntrinsicElements = { [key in keyof HTMLElementTagNameMap] : Attributes<key> } & {
158
+ div: Attributes<"div">
159
+ ul: Attributes<"ul">
160
+ ol: Attributes<"ol">
161
+ li: Attributes<"li">
162
+ br: Attributes<"br">
163
+ button: Attributes<"button">
164
+ a: Attributes<"a", {
165
+ href: string
166
+ download: string
167
+ target: Target
168
+ hreflang: string
169
+ media: string
170
+ ping: string
171
+ referrerpolicy: string
172
+ rel: string
173
+ shape: string
174
+ }>
175
+ input: Attributes<"input", {
176
+ accept: string
177
+ alt: string
178
+ autocomplete: "off" | "on" | string
179
+ checked: boolean
180
+ disabled: boolean
181
+ formonvalidate: boolean
182
+ formtarget: Target
183
+ type: "button" | "checkbox" | "color" | "date" | "datetime-local" | "email" | "file" | "hidden" | "image" | "month" | "number" | "password" | "radio" | "range" | "reset" | "search" | "submit" | "tel" | "text" | "time" | "url" | "week"
184
+ value: string
185
+ }>
186
+ form: Attributes<"form", {
187
+ "accept-charset": "UTF-8"
188
+ autocomplete: "off" | "on"
189
+ name: string
190
+ enctype: "application/x-www-form-urlencoded" | "multipart/form-data" | "text/plain"
191
+ method: "post" | "get" | "dalog"
192
+ target: Target | "_unfencedTop"
193
+ }>
194
+ iframe: Attributes<"iframe", {
195
+ allow: string
196
+ allowfullscreen: boolean
197
+ width: number
198
+ height: number
199
+ loading: "eager" | "lazy"
200
+ name: string
201
+ referrerpolicy: "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-orgin" | "usafe-url"
202
+ sandbox: string
203
+ src: string
204
+ srcdoc: string
205
+ }>
206
+ };
207
+ }
208
+ }
209
+ type RenderFunction = (el: HTMLElement, jsx: JSXNode) => void;
210
+ declare const render: RenderFunction;
211
+ declare const setBatch: unknown;
212
+ export { setBatch, render, h, fragment, createComponent, Key, JSXNode, JSXFragment, JSXElement, JSXComponent, Component };
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ var F=(t)=>(o)=>[t,o];var M=(...t)=>[null,{},...t];var A=(t,o,...e)=>typeof t==="string"?[t,o??{},...e]:t===M?[null,o??{},...e]:t(o);var N=(t)=>t(),R=(t)=>N=t;var L=(t,o)=>typeof t==="string"||typeof o==="string"?typeof t===typeof o:t[0]===o[0]&&t[1].key===o[1].key,k=(t,o)=>{let e=[],n=Math.max(t.length,o.length);for(let r=0;r<n;r++){let p=t[r],i=o[r];if(!p&&i)e.push([1,r,i]);else if(p&&!i)e.push([2,r,i]);else if(p&&i)if(L(p,i))e.push([0,r,i]);else e.push([2,r,i]),e.push([1,r,i])}return e};var J=(t)=>{let o=t,e=[],n;return{type:2,flat:()=>e.flatMap((r)=>r.flat()),update(r){let[,,...p]=o,[,,...i]=r,c=k(p,i),s=0;for(let[a,g,u]of c){let m=g-s;switch(a){case 0:e[m].update(u);break;case 1:let S=l(u);e.splice(m,0,S);let y=S.render(),b=null;if(n&&n.parentNode){let f=n.nextSibling,h=0;while(f){if(h===m){b=f;break}f=f.nextSibling,h++}if(b)n.parentNode.insertBefore(y,b);else n.parentNode.appendChild(y)}break;case 2:s++;let[X]=e.splice(m,1);X.revoke();break}}o=r},render(){let[,,...r]=o,p=document.createDocumentFragment();return n=document.createComment(""),e=r.map(l),p.append(n,...e.map((i)=>i.render())),p},revoke(){for(let r of e)r.revoke()}}};var v=(t)=>{let o=t,e=null,n,r=(p)=>{if(e)e.update([null,{},p]);else e=J([null,{},p])};return{type:3,flat:()=>e?.flat()??[],update(p){let[,i]=o=p;N(()=>{for(let[c,s]of Object.entries(i))if(n[c]!==s)n[c]=s})},render(){e?.revoke(),e=null;let[p,i]=o;if(n=p(r,{...i}),!e)console.error("never rendered Initial render."),e=J([null,{}]);return e.render()},revoke(){e?.revoke()}}};var d=new WeakMap;var T=new WeakMap;function H(t){return T.get(this)?.[t.type]?.()}var w=(t,o,e)=>{if(t instanceof HTMLInputElement)switch(o){case"checked":if(typeof e==="boolean"){t.checked=e;return}break;case"value":if(typeof e==="string"){t.value=e;return}break}switch(typeof e){case"string":t.setAttribute(o,e);break;case"function":if(o.startsWith("$")){if(!["$beforeMount","$mount","$beforeUnmount","$unmount"].includes(o)){let n=o.substring(1),r=T.get(t);if(!(n in r))t.addEventListener(n,H);r[n]=e}}else console.error("function values cannot mount on attributes.");break;case"object":if(e===null)t.removeAttribute(o);else console.error(`${typeof e} values cannot mount on attributes.`);break;default:if(e===void 0)t.removeAttribute(o);else t.setAttribute(o,String(e));break}},E=(t)=>{let o=t,e=[],n,r=()=>{let[p,i,...c]=o;i.$beforeMount?.();let s=document.createElement(p);T.set(s,{}),i.$mount?.call(s,new CustomEvent("mount",{detail:s}));for(let[a,g]of Object.entries(i))w(s,a,g);return e=c.map(l),s.append(...e.map((a)=>a.render())),d.set(s,()=>{i.$beforeUnmount?.call(s,new CustomEvent("beforeunmount",{detail:s}));for(let a of e)a.revoke();d.delete(s),T.delete(s),s.remove(),i.$unmount?.()}),n=s};return{type:1,flat:()=>[o],update(p){let[,,...i]=o,[,c,...s]=p;for(let[u,m]of Object.entries(c))if(o[1][u]!==m)w(n,u,m);let a=k(i,s),g=0;for(let[u,m,S]of a){let y=m-g;switch(u){case 0:e[y].update(S);break;case 1:let b=l(S);e.splice(y,0,b);let X=e.reduce((h,x)=>h+x.flat().length,0),f=b.render();if(X>=n.childNodes.length)n.append(f);else n.childNodes[X].before(f);break;case 2:g++,e.splice(y,1)[0].revoke();break}}o=p},render(){return n&&d.get(n)?.(),r()},revoke(){n&&d.get(n)?.()}}};var C=(t)=>{let o=t,e=new Text(o);return{type:0,flat:()=>[o],update(n){o!==n&&(e.textContent=o=n)},render:()=>e,revoke(){e.remove()}}};var l=(t)=>{if(typeof t==="string")return C(t);else if(typeof t[0]==="string")return E(t);else if(t[0]===null)return J(t);else return v(t)};var le=(t,o)=>{t.childNodes.forEach((e)=>{d.get(e)?.(),e.remove()}),t.append(l(o).render())};export{R as setBatch,le as render,A as h,M as fragment,F as createComponent};
2
+
3
+ //# debugId=12D646084CBFC33164756E2164756E21
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/jsx/component.ts", "../src/jsx/fragment.ts", "../src/jsx/likereact.ts", "../src/batch.ts", "../src/mount/diff.ts", "../src/mount/dom/fragment.ts", "../src/mount/dom/component.ts", "../src/mount/revokerMap.ts", "../src/mount/dom/element.ts", "../src/mount/dom/text.ts", "../src/mount/dom/index.ts", "../src/mount/index.ts"],
4
+ "sourcesContent": [
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
+ "import type { JSXFragment, JSXNode } from \".\";\n\nexport const fragment = (...children: JSXNode[]): JSXFragment =>\n [null, {}, ...children];\n",
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
+ "export let batch: ((cb: () => void) => void) = cb => cb();\n\nexport const setBatch = (fn: typeof batch) => batch = fn;\n",
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 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, i, after]);\n else if(before && !after)\n patches.push([2, i, after]);\n else if(before && after)\n if(isCompatibleNode(before, after))\n patches.push([0, i, after]);\n else{\n patches.push([2, i, after]);\n patches.push([1, i, after]);\n }\n }\n\n return patches;\n}\n",
10
+ "import { renderNode, type RenderedDOM, type UnknownRenderedDOM } from \".\";\nimport type { JSXFragment } from \"../../jsx\";\nimport { diff } from \"../diff\";\n\nexport const renderFragment = (jsx: JSXFragment): RenderedDOM<JSXFragment> => {\n let currentJSX = jsx;\n\n let rendered_children: UnknownRenderedDOM[] = [];\n let mark: Comment | void;\n\n return {\n type: 2,\n flat: () => rendered_children.flatMap(e=>e.flat()),\n update(jsx){\n const [,, ...old_children] = currentJSX;\n const [,, ...new_children] = jsx;\n\n const patches = diff(old_children, new_children);\n let removes = 0;\n\n for (const [type, idx_, jsx] of patches) {\n const idx = idx_ - removes;\n switch(type){\n case 0:\n rendered_children[idx].update(jsx as any);\n break;\n case 1:\n const rendered = renderNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n const dom = rendered.render();\n let refNode: ChildNode | null = null; // TODO: ここら辺を最適化する\n if (mark && mark.parentNode) {\n let node: ChildNode | null = mark.nextSibling;\n let count = 0;\n while (node) {\n if (count === idx) {\n refNode = node;\n break;\n }\n node = node.nextSibling;\n count++;\n }\n if (refNode) {\n mark.parentNode.insertBefore(dom, refNode);\n } else {\n mark.parentNode.appendChild(dom);\n }\n }\n break;\n case 2:\n removes++;\n const [removed] = rendered_children.splice(idx, 1);\n removed.revoke();\n break;\n }\n }\n \n currentJSX = jsx;\n },\n render(){\n const [,, ...children] = currentJSX;\n\n const el = document.createDocumentFragment();\n mark = document.createComment(\"\");\n\n rendered_children = children.map(renderNode);\n el.append(mark, ...rendered_children.map(e=>e.render()));\n\n return el;\n },\n revoke(){\n for (const child of rendered_children)\n child.revoke();\n },\n }\n}\n",
11
+ "import { type RenderedDOM } from \".\";\nimport { batch } from \"../../batch\";\nimport type { JSXComponent, JSXFragment, JSXNode } from \"../../jsx\";\nimport { renderFragment } from \"./fragment\";\n\nexport const renderComponent = (jsx: JSXComponent): RenderedDOM<JSXComponent> => {\n let currentJSX = jsx;\n\n let rendered_dom = null as RenderedDOM<JSXFragment> | null;\n\n let props: { [key: string]: unknown } | null;\n\n const render = (jsx: JSXNode) => {\n if(rendered_dom) rendered_dom.update([null, {}, jsx]);\n else rendered_dom = renderFragment([null, {}, jsx]);\n }\n\n return {\n type: 3,\n flat: () => rendered_dom?.flat() ?? [],\n update(jsx){\n const [, afterProps/*, ...children*/] = currentJSX = jsx;\n\n batch(() => {\n for (const [key, value] of Object.entries(afterProps))\n if (props![key] !== value)\n props![key] = value;\n });\n },\n render(){\n rendered_dom?.revoke();\n rendered_dom = null;\n\n const [component, init_props/*, ...children*/] = currentJSX;\n\n props = component(render, { ...init_props });\n\n if(!rendered_dom) {\n console.error(\"never rendered Initial render.\");\n rendered_dom = renderFragment([null, {}]);\n }\n\n return rendered_dom.render();\n },\n revoke(){ rendered_dom?.revoke() },\n }\n}\n",
12
+ "export const revokerMap = new WeakMap<Node, () => void>();\n",
13
+ "import { renderNode, type RenderedDOM, type UnknownRenderedDOM } from \".\";\nimport type { JSXElement, JSXNode } from \"../../jsx\";\nimport { revokerMap } from \"../revokerMap\";\nimport { diff } from \"../diff\";\n\nconst elementEvents: WeakMap<HTMLElement, Record<string, Function>> = new WeakMap;\n\nfunction handleEvent(this: HTMLElement, ev: Event){\n return elementEvents.get(this)?.[ev.type]?.();\n}\n\nconst setAttribute = (el: HTMLElement, name: string, value: unknown) => {\n if(el instanceof HTMLInputElement) {\n switch(name){\n case \"checked\":\n if(typeof value === \"boolean\"){\n el.checked = value;\n return;\n }\n break;\n case \"value\":\n if(typeof value === \"string\"){\n el.value = value;\n return;\n }\n break;\n }\n }\n switch(typeof value){\n case \"string\":\n el.setAttribute(name, value);\n break;\n case \"function\":\n if(name.startsWith(\"$\")){\n if(![\"$beforeMount\", \"$mount\", \"$beforeUnmount\", \"$unmount\"].includes(name)){\n const ev_name = name.substring(1);\n const events = elementEvents.get(el)!;\n if(!(ev_name in events))\n el.addEventListener(ev_name, handleEvent);\n events[ev_name] = value;\n }\n }else\n console.error(\"function values cannot mount on attributes.\");\n break;\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 renderElement = (jsx: JSXElement): RenderedDOM<JSXElement> => {\n let currentJSX = jsx;\n\n let rendered_children: UnknownRenderedDOM[] = [];\n let element: HTMLElement | void;\n\n const render = () => {\n const [tag, props, ...children] = currentJSX;\n\n props.$beforeMount?.();\n const el = document.createElement(tag);\n elementEvents.set(el, {});\n props.$mount?.call(el, new CustomEvent(\"mount\", { detail: el as any }));\n\n for (const [name, value] of Object.entries(props))\n setAttribute(el, name, value);\n\n rendered_children = children.map(renderNode);\n el.append(...rendered_children.map(e=>e.render()));\n\n revokerMap.set(el, () => {\n props.$beforeUnmount?.call(el, new CustomEvent(\"beforeunmount\", { detail: el as any }));\n\n for (const child of rendered_children)\n child.revoke();\n revokerMap.delete(el);\n elementEvents.delete(el);\n el.remove();\n \n props.$unmount?.();\n });\n\n return element = el;\n }\n\n return {\n type: 1,\n flat: () => [currentJSX],\n update(jsx){\n const [,, ...old_children] = currentJSX;\n const [, props, ...new_children] = jsx;\n\n for (const [name, value] of Object.entries(props))\n if((currentJSX[1] as any)[name] !== value)\n setAttribute(element!, name, value);\n\n const patches = diff(old_children, new_children);\n let removes = 0;\n for (const [type, idx_, jsx] of patches) {\n const idx = idx_ - removes;\n switch(type){\n case 0:\n rendered_children[idx].update(jsx as any);\n break;\n case 1:\n const rendered = renderNode(jsx);\n rendered_children.splice(idx, 0, rendered);\n\n const dom_index = rendered_children.reduce((p,c)=>p+c.flat().length, 0);\n const el = rendered.render();\n\n if(dom_index >= element!.childNodes.length)\n element!.append(el);\n else\n element!.childNodes[dom_index]!.before(el);\n\n break;\n case 2:\n removes++;\n rendered_children.splice(idx, 1)[0].revoke();\n break;\n }\n }\n\n currentJSX = jsx;\n },\n render(){\n element && revokerMap.get(element)?.();\n return render();\n },\n revoke(){ element && revokerMap.get(element)?.() },\n }\n}\n",
14
+ "import type { RenderedDOM } from \".\";\n\nexport const renderText = (jsx: string): RenderedDOM<string> => {\n let currentText = jsx;\n const node = new Text(currentText);\n\n return {\n type: 0,\n flat: () => [currentText],\n update(jsx){ currentText !== jsx && (node.textContent = currentText = jsx) },\n render: () => node,\n revoke(){ node.remove() },\n }\n}\n",
15
+ "import type { JSXComponent, JSXElement, JSXFragment, JSXNode } from \"../../jsx\";\nimport { renderComponent } from \"./component\";\nimport { renderElement } from \"./element\";\nimport { renderFragment } from \"./fragment\";\nimport { renderText } from \"./text\";\n\nexport type RenderedDOM<T extends JSXNode> = {\n type: T extends string ? 0 : T extends JSXElement ? 1 : T extends JSXFragment ? 2 : T extends JSXComponent ? 3 : never, // 0 種類\n flat(): (JSXElement | string)[], // 1 差分比較用のフラットJSX出力関数\n update(jsx: T): void, // 2 差分更新関数\n render(): Node, // 3 初回・トラブル時にフル描画をする関数\n revoke(): void, // 4 破棄関数\n}\n\nexport type UnknownRenderedDOM = RenderedDOM<string> | RenderedDOM<JSXElement> | RenderedDOM<JSXFragment> | RenderedDOM<JSXComponent>;\n\nexport const renderNode = (jsx: JSXNode): UnknownRenderedDOM => {\n if(typeof jsx === \"string\"){\n return renderText(jsx);\n }else if(typeof jsx[0] === \"string\"){\n return renderElement(jsx);\n }else if(jsx[0] === null){\n return renderFragment(jsx);\n }else{\n return renderComponent(jsx);\n }\n}\n",
16
+ "import type { JSXNode } from \"../jsx\";\nimport { renderNode } from \"./dom\";\nimport { revokerMap } from \"./revokerMap\";\n\ntype RenderFunction = (el: HTMLElement, jsx: JSXNode) => void;\n\nexport const render: RenderFunction = (el, jsx) => {\n el.childNodes.forEach(e=>{\n revokerMap.get(e)?.();\n e.remove();\n });\n\n el.append(renderNode(jsx).render());\n}\n"
17
+ ],
18
+ "mappings": "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",
19
+ "debugId": "12D646084CBFC33164756E2164756E21",
20
+ "names": []
21
+ }