lunet 0.0.7 → 0.0.9

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/build.ts ADDED
@@ -0,0 +1,82 @@
1
+ import { build, file, write } from "bun";
2
+ import { parse } from "@babel/parser";
3
+ import { generate } from "@babel/generator";
4
+ import { generateDts } from "typeroll";
5
+
6
+ const render1_res = await build({
7
+ entrypoints: [`${import.meta.dir}/src/render/index.ts`],
8
+ throw: true,
9
+ });
10
+
11
+ const render1_code = await render1_res.outputs[0]!.text();
12
+
13
+ const ast = parse(render1_code, {
14
+ sourceType: "module",
15
+ });
16
+
17
+ const export_statement = ast.program.body.at(-1);
18
+ if (!export_statement || export_statement.type !== "ExportNamedDeclaration") {
19
+ throw new Error("Not found export statement on last");
20
+ }
21
+
22
+ const nameset = new Set<string>();
23
+
24
+ for (const spec of export_statement.specifiers) {
25
+ if (
26
+ spec.type !== "ExportSpecifier" ||
27
+ spec.exported.type !== "Identifier" ||
28
+ spec.exported.name !== spec.local.name
29
+ ) {
30
+ throw new Error("AST assertion failed");
31
+ }
32
+ nameset.add(spec.local.name);
33
+ }
34
+
35
+ if (
36
+ !nameset.has("createFragment") ||
37
+ !nameset.has("updateFragment") ||
38
+ !nameset.has("revokeFragment")
39
+ ) {
40
+ throw new Error("AST assertion failed");
41
+ }
42
+
43
+ ast.program.body.pop();
44
+
45
+ const render2_code = generate(ast).code;
46
+
47
+ const entrypoint = `${import.meta.dir}/src/index.ts`;
48
+ const entry_src = await file(entrypoint).text();
49
+
50
+ const cfg = {
51
+ entrypoints: [entrypoint],
52
+ //@ts-ignore
53
+ files: {
54
+ [entrypoint]: entry_src.replace("//@INJECT", render2_code),
55
+ },
56
+ outdir: `${import.meta.dir}/dist/`
57
+ } as {
58
+ entrypoints: [string],
59
+ outdir: string,
60
+ };
61
+
62
+ await build({
63
+ ...cfg,
64
+ format: "esm",
65
+ naming: "index.js",
66
+ });
67
+
68
+ await build({
69
+ ...cfg,
70
+ format: "cjs",
71
+ naming: "index.cjs",
72
+ });
73
+
74
+ const dts_result = await generateDts([
75
+ entrypoint,
76
+ ]);
77
+
78
+ if (dts_result.errors.length) {
79
+ throw dts_result.errors;
80
+ }
81
+
82
+ await write(`${import.meta.dir}/dist/index.d.ts`, dts_result.files[0]!.dts);
package/dist/index.cjs CHANGED
@@ -1,4 +1,338 @@
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)};
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
2
28
 
3
- //# debugId=A1002464CBF1D69064756E2164756E21
4
- //# sourceMappingURL=index.cjs.map
29
+ // src/index.ts
30
+ var exports_src = {};
31
+ __export(exports_src, {
32
+ h: () => h,
33
+ fragment: () => fragment,
34
+ createRoot: () => createRoot,
35
+ createComponent: () => createComponent
36
+ });
37
+ module.exports = __toCommonJS(exports_src);
38
+
39
+ // src/jsx/component.ts
40
+ var createComponent = (component) => (props) => [component, props];
41
+ // src/jsx/fragment.ts
42
+ var fragment = (...children) => [null, {}, ...children];
43
+ // src/jsx/likereact.ts
44
+ var h = (type, props, ...children) => typeof type === "string" ? [type, props ?? {}, ...children] : type === fragment ? [null, props ?? {}, ...children] : type(props);
45
+ // src/index.ts
46
+ var createRoot = (el, options) => {
47
+ var createText = (jsx2) => {
48
+ const node2 = new Text(jsx2);
49
+ return [[0, jsx2, node2], node2];
50
+ };
51
+ var updateText = (dom2, jsx2) => {
52
+ if (dom2[1] !== jsx2)
53
+ dom2[2].textContent = dom2[1] = jsx2;
54
+ };
55
+ var revokeText = (dom2) => dom2[2].remove();
56
+ var afterText = (dom2, node2) => {
57
+ dom2[2].parentNode?.insertBefore(node2, dom2[2].nextSibling);
58
+ };
59
+ var isCompatibleNode = (before, after) => typeof before === "string" || typeof after === "string" ? typeof before === typeof after : before[0] === after[0] && before[1].key === after[1].key;
60
+ var diff = (before_nodes, after_nodes) => {
61
+ const patches = [];
62
+ const max = Math.max(before_nodes.length, after_nodes.length);
63
+ let index = 0;
64
+ for (let i = 0;i < max; i++) {
65
+ const before = before_nodes[i];
66
+ const after = after_nodes[i];
67
+ if (!before && after)
68
+ patches.push([1, index++, after]);
69
+ else if (before && !after)
70
+ patches.push([2, index, before]);
71
+ else if (before && after)
72
+ if (isCompatibleNode(before, after))
73
+ patches.push([0, index++, after]);
74
+ else {
75
+ patches.push([2, index, before]);
76
+ patches.push([1, index++, after]);
77
+ }
78
+ }
79
+ return patches;
80
+ };
81
+ var lifecycle_events = new Set(["beforeMount", "mount", "beforeUpdate", "update", "beforeUnmount", "unmount"]);
82
+ var elementEvents = new WeakMap;
83
+ function handleEvent(ev) {
84
+ return elementEvents.get(this)?.[ev.type]?.call(this, ev);
85
+ }
86
+ var setAttribute = (el2, name, value) => {
87
+ if (name.startsWith("$")) {
88
+ const ev_name = name.substring(1);
89
+ if (!lifecycle_events.has(ev_name)) {
90
+ const events = elementEvents.get(el2);
91
+ if (!(ev_name in events))
92
+ el2.addEventListener(ev_name, handleEvent);
93
+ if (typeof value === "function" || value == null)
94
+ events[ev_name] = value;
95
+ else {
96
+ console.error("Invalid event handler: ", value);
97
+ events[ev_name] = undefined;
98
+ }
99
+ }
100
+ } else
101
+ switch (typeof value) {
102
+ case "string":
103
+ el2.setAttribute(name, value);
104
+ break;
105
+ case "function":
106
+ case "object":
107
+ if (value === null)
108
+ el2.removeAttribute(name);
109
+ else
110
+ console.error(`${typeof value} values cannot mount on attributes.`);
111
+ break;
112
+ default:
113
+ if (value === undefined)
114
+ el2.removeAttribute(name);
115
+ else
116
+ el2.setAttribute(name, String(value));
117
+ break;
118
+ }
119
+ };
120
+ var createElement = (jsx2) => {
121
+ const [tag, props, ...children] = jsx2;
122
+ props.$beforeMount?.();
123
+ const element = document.createElement(tag);
124
+ elementEvents.set(element, {});
125
+ props.$mount?.call(element, new CustomEvent("mount", {
126
+ detail: element
127
+ }));
128
+ for (const [name, value] of Object.entries(props))
129
+ setAttribute(element, name, value);
130
+ const rendered_children = children.map(createNode);
131
+ element.append(...rendered_children.map((e) => e[1]));
132
+ return [[1, jsx2, element, rendered_children.map((e) => e[0])], element];
133
+ };
134
+ var updateElement = (dom2, jsx2) => {
135
+ const [, [, old_props, ...old_children], element, rendered_children] = dom2;
136
+ const [, new_props, ...new_children] = jsx2;
137
+ old_props.$beforeUpdate?.call(element, new CustomEvent("beforeupdate", {
138
+ detail: element
139
+ }));
140
+ const removed_prop_keys = Object.keys(old_props).filter((key) => !(key in new_props));
141
+ for (const [name, value] of Object.entries({
142
+ ...new_props,
143
+ ...Object.fromEntries(removed_prop_keys.map((key) => [key, undefined]))
144
+ }))
145
+ if (old_props[name] !== value)
146
+ setAttribute(element, name, value);
147
+ for (const [type, idx, jsx22] of diff(old_children, new_children)) {
148
+ switch (type) {
149
+ case 0:
150
+ updateNode(rendered_children[idx], jsx22);
151
+ break;
152
+ case 1:
153
+ const [rendered, node2] = createNode(jsx22);
154
+ rendered_children.splice(idx, 0, rendered);
155
+ if (idx === 0) {
156
+ if (element.firstChild) {
157
+ element.firstChild.before(node2);
158
+ } else {
159
+ element.append(node2);
160
+ }
161
+ } else {
162
+ afterNode(rendered_children[idx - 1], node2);
163
+ }
164
+ break;
165
+ case 2:
166
+ revokeNode(rendered_children.splice(idx, 1)[0]);
167
+ break;
168
+ }
169
+ }
170
+ dom2[1] = jsx2;
171
+ new_props.$update?.call(element, new CustomEvent("update", {
172
+ detail: element
173
+ }));
174
+ };
175
+ var revokeElement = (dom2) => {
176
+ const [, [, props], element, rendered_children] = dom2;
177
+ props.$beforeUnmount?.call(element, new CustomEvent("beforeunmount", {
178
+ detail: element
179
+ }));
180
+ for (const child of rendered_children)
181
+ revokeNode(child);
182
+ elementEvents.delete(element);
183
+ element.remove();
184
+ props.$unmount?.();
185
+ };
186
+ var afterElement = (dom2, node2) => {
187
+ dom2[2].after(node2);
188
+ };
189
+ var batch = options?.batch ?? ((cb) => cb());
190
+ var createComponent2 = (jsx2) => {
191
+ const [component, init_props] = jsx2;
192
+ let rendered_dom;
193
+ let doc_frag;
194
+ const props = component((jsx22) => {
195
+ if (rendered_dom)
196
+ updateFragment(rendered_dom, [null, {}, jsx22]);
197
+ else
198
+ [rendered_dom, doc_frag] = createFragment([null, {}, jsx22]);
199
+ }, {
200
+ ...init_props
201
+ });
202
+ if (!doc_frag) {
203
+ console.error("never rendered Initial render.");
204
+ [rendered_dom, doc_frag] = createFragment([null, {}]);
205
+ }
206
+ return [[3, [component, props], rendered_dom], doc_frag];
207
+ };
208
+ var updateComponent = (dom2, jsx2) => {
209
+ const old_props = dom2[1][1];
210
+ const new_props = jsx2[1];
211
+ batch(() => {
212
+ for (const [key, value] of Object.entries(new_props))
213
+ if (old_props[key] !== value)
214
+ old_props[key] = value;
215
+ });
216
+ };
217
+ var revokeComponent = (dom2) => revokeFragment(dom2[2]);
218
+ var afterComponent = (dom2, node2) => afterFragment(dom2[2], node2);
219
+ var createNode = (jsx2) => {
220
+ if (typeof jsx2 === "string")
221
+ return createText(jsx2);
222
+ if (Array.isArray(jsx2)) {
223
+ const [tag] = jsx2;
224
+ if (typeof tag === "string")
225
+ return createElement(jsx2);
226
+ if (typeof tag === "function")
227
+ return createComponent2(jsx2);
228
+ if (tag === null)
229
+ return createFragment(jsx2);
230
+ }
231
+ throw new Error(`Unrecognized JSX node`, {
232
+ cause: jsx2
233
+ });
234
+ };
235
+ var updateNode = (dom2, jsx2) => {
236
+ switch (dom2[0]) {
237
+ case 0:
238
+ updateText(dom2, jsx2);
239
+ break;
240
+ case 1:
241
+ updateElement(dom2, jsx2);
242
+ break;
243
+ case 2:
244
+ updateFragment(dom2, jsx2);
245
+ break;
246
+ case 3:
247
+ updateComponent(dom2, jsx2);
248
+ break;
249
+ }
250
+ };
251
+ var revokeNode = (dom2) => {
252
+ switch (dom2[0]) {
253
+ case 0:
254
+ revokeText(dom2);
255
+ break;
256
+ case 1:
257
+ revokeElement(dom2);
258
+ break;
259
+ case 2:
260
+ revokeFragment(dom2);
261
+ break;
262
+ case 3:
263
+ revokeComponent(dom2);
264
+ break;
265
+ }
266
+ };
267
+ var afterNode = (dom2, node2) => {
268
+ switch (dom2[0]) {
269
+ case 0:
270
+ afterText(dom2, node2);
271
+ break;
272
+ case 1:
273
+ afterElement(dom2, node2);
274
+ break;
275
+ case 2:
276
+ afterFragment(dom2, node2);
277
+ break;
278
+ case 3:
279
+ afterComponent(dom2, node2);
280
+ break;
281
+ }
282
+ };
283
+ var createFragment = (jsx2) => {
284
+ const [, , ...children] = jsx2;
285
+ const mark = new Comment;
286
+ const el2 = new DocumentFragment;
287
+ const rendered_children = children.map(createNode);
288
+ el2.append(mark, ...rendered_children.map((e) => e[1]));
289
+ return [[2, jsx2, mark, rendered_children.map((e) => e[0])], el2];
290
+ };
291
+ var updateFragment = (dom2, jsx2) => {
292
+ const [, [, , ...old_children], mark, rendered_children] = dom2;
293
+ const [, , ...new_children] = jsx2;
294
+ for (const [type, idx, jsx22] of diff(old_children, new_children)) {
295
+ switch (type) {
296
+ case 0:
297
+ updateNode(rendered_children[idx], jsx22);
298
+ break;
299
+ case 1:
300
+ const [rendered, el2] = createNode(jsx22);
301
+ rendered_children.splice(idx, 0, rendered);
302
+ if (idx === 0) {
303
+ mark.after(el2);
304
+ } else {
305
+ afterNode(rendered_children[idx - 1], el2);
306
+ }
307
+ break;
308
+ case 2:
309
+ const [removed] = rendered_children.splice(idx, 1);
310
+ revokeNode(removed);
311
+ break;
312
+ }
313
+ }
314
+ dom2[1] = jsx2;
315
+ };
316
+ var revokeFragment = (dom2) => {
317
+ for (const child of dom2[3])
318
+ revokeNode(child);
319
+ dom2[2].remove();
320
+ };
321
+ var afterFragment = (dom2, node2) => {
322
+ const last_rendered_dom = dom2[3].at(-1);
323
+ if (last_rendered_dom)
324
+ afterNode(last_rendered_dom, node2);
325
+ else
326
+ dom2[2].after(node2);
327
+ };
328
+ const [node, dom] = createFragment([null, {}]);
329
+ el.append(dom);
330
+ return {
331
+ render(jsx2) {
332
+ updateFragment(node, [null, {}, jsx2]);
333
+ },
334
+ unmount() {
335
+ revokeFragment(node);
336
+ }
337
+ };
338
+ };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ interface Options {
2
+ batch?: (cb: () => void) => void;
3
+ }
1
4
  type ComponentFunction<T extends object> = (render: (jsx: JSXNode) => void, initProps: T) => T;
2
5
  type Component<T extends object> = (props: T) => JSXComponent;
3
6
  declare const createComponent: <T extends object>(component: ComponentFunction<T>) => Component<T>;
@@ -13,201 +16,8 @@ type JSXNode = JSXElement | JSXComponent | JSXFragment | string;
13
16
  type JSXElement<T extends keyof HTMLElementTagNameMap = keyof HTMLElementTagNameMap> = [T, JSX.IntrinsicElements[T], ...JSXNode[]];
14
17
  type JSXComponent = [ComponentFunction<any>, object & Key, ...JSXNode[]];
15
18
  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: HTMLElementTagNameMap[N], ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
129
- $beforeUpdate: (this: HTMLElementTagNameMap[N], ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
130
- $update: (this: HTMLElementTagNameMap[N], ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
131
- $beforeUnmount: (this: HTMLElementTagNameMap[N], 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"
19
+ declare const createRoot: (el: HTMLElement, options?: Options) => {
20
+ render(jsx: JSX.Element): void
21
+ unmount(): void
152
22
  };
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
- type BatchFn = (cb: () => void) => void;
212
- declare const setBatch: (fn: BatchFn) => void;
213
- export { setBatch, render, h, fragment, createComponent, Key, JSXNode, JSXFragment, JSXElement, JSXComponent, Component };
23
+ export { h, fragment, createRoot, createComponent, Key, JSXNode, JSXFragment, JSXElement, JSXComponent, Component };
package/dist/index.js CHANGED
@@ -1,4 +1,306 @@
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
-
3
- //# debugId=53C4851E8EA2354964756E2164756E21
4
- //# sourceMappingURL=index.js.map
1
+ // src/jsx/component.ts
2
+ var createComponent = (component) => (props) => [component, props];
3
+ // src/jsx/fragment.ts
4
+ var fragment = (...children) => [null, {}, ...children];
5
+ // src/jsx/likereact.ts
6
+ var h = (type, props, ...children) => typeof type === "string" ? [type, props ?? {}, ...children] : type === fragment ? [null, props ?? {}, ...children] : type(props);
7
+ // src/index.ts
8
+ var createRoot = (el, options) => {
9
+ var createText = (jsx2) => {
10
+ const node2 = new Text(jsx2);
11
+ return [[0, jsx2, node2], node2];
12
+ };
13
+ var updateText = (dom2, jsx2) => {
14
+ if (dom2[1] !== jsx2)
15
+ dom2[2].textContent = dom2[1] = jsx2;
16
+ };
17
+ var revokeText = (dom2) => dom2[2].remove();
18
+ var afterText = (dom2, node2) => {
19
+ dom2[2].parentNode?.insertBefore(node2, dom2[2].nextSibling);
20
+ };
21
+ var isCompatibleNode = (before, after) => typeof before === "string" || typeof after === "string" ? typeof before === typeof after : before[0] === after[0] && before[1].key === after[1].key;
22
+ var diff = (before_nodes, after_nodes) => {
23
+ const patches = [];
24
+ const max = Math.max(before_nodes.length, after_nodes.length);
25
+ let index = 0;
26
+ for (let i = 0;i < max; i++) {
27
+ const before = before_nodes[i];
28
+ const after = after_nodes[i];
29
+ if (!before && after)
30
+ patches.push([1, index++, after]);
31
+ else if (before && !after)
32
+ patches.push([2, index, before]);
33
+ else if (before && after)
34
+ if (isCompatibleNode(before, after))
35
+ patches.push([0, index++, after]);
36
+ else {
37
+ patches.push([2, index, before]);
38
+ patches.push([1, index++, after]);
39
+ }
40
+ }
41
+ return patches;
42
+ };
43
+ var lifecycle_events = new Set(["beforeMount", "mount", "beforeUpdate", "update", "beforeUnmount", "unmount"]);
44
+ var elementEvents = new WeakMap;
45
+ function handleEvent(ev) {
46
+ return elementEvents.get(this)?.[ev.type]?.call(this, ev);
47
+ }
48
+ var setAttribute = (el2, name, value) => {
49
+ if (name.startsWith("$")) {
50
+ const ev_name = name.substring(1);
51
+ if (!lifecycle_events.has(ev_name)) {
52
+ const events = elementEvents.get(el2);
53
+ if (!(ev_name in events))
54
+ el2.addEventListener(ev_name, handleEvent);
55
+ if (typeof value === "function" || value == null)
56
+ events[ev_name] = value;
57
+ else {
58
+ console.error("Invalid event handler: ", value);
59
+ events[ev_name] = undefined;
60
+ }
61
+ }
62
+ } else
63
+ switch (typeof value) {
64
+ case "string":
65
+ el2.setAttribute(name, value);
66
+ break;
67
+ case "function":
68
+ case "object":
69
+ if (value === null)
70
+ el2.removeAttribute(name);
71
+ else
72
+ console.error(`${typeof value} values cannot mount on attributes.`);
73
+ break;
74
+ default:
75
+ if (value === undefined)
76
+ el2.removeAttribute(name);
77
+ else
78
+ el2.setAttribute(name, String(value));
79
+ break;
80
+ }
81
+ };
82
+ var createElement = (jsx2) => {
83
+ const [tag, props, ...children] = jsx2;
84
+ props.$beforeMount?.();
85
+ const element = document.createElement(tag);
86
+ elementEvents.set(element, {});
87
+ props.$mount?.call(element, new CustomEvent("mount", {
88
+ detail: element
89
+ }));
90
+ for (const [name, value] of Object.entries(props))
91
+ setAttribute(element, name, value);
92
+ const rendered_children = children.map(createNode);
93
+ element.append(...rendered_children.map((e) => e[1]));
94
+ return [[1, jsx2, element, rendered_children.map((e) => e[0])], element];
95
+ };
96
+ var updateElement = (dom2, jsx2) => {
97
+ const [, [, old_props, ...old_children], element, rendered_children] = dom2;
98
+ const [, new_props, ...new_children] = jsx2;
99
+ old_props.$beforeUpdate?.call(element, new CustomEvent("beforeupdate", {
100
+ detail: element
101
+ }));
102
+ const removed_prop_keys = Object.keys(old_props).filter((key) => !(key in new_props));
103
+ for (const [name, value] of Object.entries({
104
+ ...new_props,
105
+ ...Object.fromEntries(removed_prop_keys.map((key) => [key, undefined]))
106
+ }))
107
+ if (old_props[name] !== value)
108
+ setAttribute(element, name, value);
109
+ for (const [type, idx, jsx22] of diff(old_children, new_children)) {
110
+ switch (type) {
111
+ case 0:
112
+ updateNode(rendered_children[idx], jsx22);
113
+ break;
114
+ case 1:
115
+ const [rendered, node2] = createNode(jsx22);
116
+ rendered_children.splice(idx, 0, rendered);
117
+ if (idx === 0) {
118
+ if (element.firstChild) {
119
+ element.firstChild.before(node2);
120
+ } else {
121
+ element.append(node2);
122
+ }
123
+ } else {
124
+ afterNode(rendered_children[idx - 1], node2);
125
+ }
126
+ break;
127
+ case 2:
128
+ revokeNode(rendered_children.splice(idx, 1)[0]);
129
+ break;
130
+ }
131
+ }
132
+ dom2[1] = jsx2;
133
+ new_props.$update?.call(element, new CustomEvent("update", {
134
+ detail: element
135
+ }));
136
+ };
137
+ var revokeElement = (dom2) => {
138
+ const [, [, props], element, rendered_children] = dom2;
139
+ props.$beforeUnmount?.call(element, new CustomEvent("beforeunmount", {
140
+ detail: element
141
+ }));
142
+ for (const child of rendered_children)
143
+ revokeNode(child);
144
+ elementEvents.delete(element);
145
+ element.remove();
146
+ props.$unmount?.();
147
+ };
148
+ var afterElement = (dom2, node2) => {
149
+ dom2[2].after(node2);
150
+ };
151
+ var batch = options?.batch ?? ((cb) => cb());
152
+ var createComponent2 = (jsx2) => {
153
+ const [component, init_props] = jsx2;
154
+ let rendered_dom;
155
+ let doc_frag;
156
+ const props = component((jsx22) => {
157
+ if (rendered_dom)
158
+ updateFragment(rendered_dom, [null, {}, jsx22]);
159
+ else
160
+ [rendered_dom, doc_frag] = createFragment([null, {}, jsx22]);
161
+ }, {
162
+ ...init_props
163
+ });
164
+ if (!doc_frag) {
165
+ console.error("never rendered Initial render.");
166
+ [rendered_dom, doc_frag] = createFragment([null, {}]);
167
+ }
168
+ return [[3, [component, props], rendered_dom], doc_frag];
169
+ };
170
+ var updateComponent = (dom2, jsx2) => {
171
+ const old_props = dom2[1][1];
172
+ const new_props = jsx2[1];
173
+ batch(() => {
174
+ for (const [key, value] of Object.entries(new_props))
175
+ if (old_props[key] !== value)
176
+ old_props[key] = value;
177
+ });
178
+ };
179
+ var revokeComponent = (dom2) => revokeFragment(dom2[2]);
180
+ var afterComponent = (dom2, node2) => afterFragment(dom2[2], node2);
181
+ var createNode = (jsx2) => {
182
+ if (typeof jsx2 === "string")
183
+ return createText(jsx2);
184
+ if (Array.isArray(jsx2)) {
185
+ const [tag] = jsx2;
186
+ if (typeof tag === "string")
187
+ return createElement(jsx2);
188
+ if (typeof tag === "function")
189
+ return createComponent2(jsx2);
190
+ if (tag === null)
191
+ return createFragment(jsx2);
192
+ }
193
+ throw new Error(`Unrecognized JSX node`, {
194
+ cause: jsx2
195
+ });
196
+ };
197
+ var updateNode = (dom2, jsx2) => {
198
+ switch (dom2[0]) {
199
+ case 0:
200
+ updateText(dom2, jsx2);
201
+ break;
202
+ case 1:
203
+ updateElement(dom2, jsx2);
204
+ break;
205
+ case 2:
206
+ updateFragment(dom2, jsx2);
207
+ break;
208
+ case 3:
209
+ updateComponent(dom2, jsx2);
210
+ break;
211
+ }
212
+ };
213
+ var revokeNode = (dom2) => {
214
+ switch (dom2[0]) {
215
+ case 0:
216
+ revokeText(dom2);
217
+ break;
218
+ case 1:
219
+ revokeElement(dom2);
220
+ break;
221
+ case 2:
222
+ revokeFragment(dom2);
223
+ break;
224
+ case 3:
225
+ revokeComponent(dom2);
226
+ break;
227
+ }
228
+ };
229
+ var afterNode = (dom2, node2) => {
230
+ switch (dom2[0]) {
231
+ case 0:
232
+ afterText(dom2, node2);
233
+ break;
234
+ case 1:
235
+ afterElement(dom2, node2);
236
+ break;
237
+ case 2:
238
+ afterFragment(dom2, node2);
239
+ break;
240
+ case 3:
241
+ afterComponent(dom2, node2);
242
+ break;
243
+ }
244
+ };
245
+ var createFragment = (jsx2) => {
246
+ const [, , ...children] = jsx2;
247
+ const mark = new Comment;
248
+ const el2 = new DocumentFragment;
249
+ const rendered_children = children.map(createNode);
250
+ el2.append(mark, ...rendered_children.map((e) => e[1]));
251
+ return [[2, jsx2, mark, rendered_children.map((e) => e[0])], el2];
252
+ };
253
+ var updateFragment = (dom2, jsx2) => {
254
+ const [, [, , ...old_children], mark, rendered_children] = dom2;
255
+ const [, , ...new_children] = jsx2;
256
+ for (const [type, idx, jsx22] of diff(old_children, new_children)) {
257
+ switch (type) {
258
+ case 0:
259
+ updateNode(rendered_children[idx], jsx22);
260
+ break;
261
+ case 1:
262
+ const [rendered, el2] = createNode(jsx22);
263
+ rendered_children.splice(idx, 0, rendered);
264
+ if (idx === 0) {
265
+ mark.after(el2);
266
+ } else {
267
+ afterNode(rendered_children[idx - 1], el2);
268
+ }
269
+ break;
270
+ case 2:
271
+ const [removed] = rendered_children.splice(idx, 1);
272
+ revokeNode(removed);
273
+ break;
274
+ }
275
+ }
276
+ dom2[1] = jsx2;
277
+ };
278
+ var revokeFragment = (dom2) => {
279
+ for (const child of dom2[3])
280
+ revokeNode(child);
281
+ dom2[2].remove();
282
+ };
283
+ var afterFragment = (dom2, node2) => {
284
+ const last_rendered_dom = dom2[3].at(-1);
285
+ if (last_rendered_dom)
286
+ afterNode(last_rendered_dom, node2);
287
+ else
288
+ dom2[2].after(node2);
289
+ };
290
+ const [node, dom] = createFragment([null, {}]);
291
+ el.append(dom);
292
+ return {
293
+ render(jsx2) {
294
+ updateFragment(node, [null, {}, jsx2]);
295
+ },
296
+ unmount() {
297
+ revokeFragment(node);
298
+ }
299
+ };
300
+ };
301
+ export {
302
+ h,
303
+ fragment,
304
+ createRoot,
305
+ createComponent
306
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lunet",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "author": "TNTSuperMan",
5
5
  "license": "MIT",
6
6
  "description": "より柔軟なWebフロントエンドライブラリ。",
@@ -19,16 +19,14 @@
19
19
  "import": "./dist/index.js"
20
20
  }
21
21
  },
22
- "bunup": {
23
- "name": "lunet",
24
- "entry": ["src/index.ts"],
25
- "format": ["esm", "cjs"],
26
- "target": "browser",
27
- "sourcemap": "linked",
28
- "minify": true,
29
- "outDir": "dist"
22
+ "devDependencies": {
23
+ "@babel/generator": "^7.28.6",
24
+ "@babel/parser": "^7.28.6",
25
+ "@types/babel__generator": "^7.27.0",
26
+ "@types/babel__parser": "^7.1.5",
27
+ "typeroll": "^0.7.7"
30
28
  },
31
29
  "scripts": {
32
- "build": "bunup"
30
+ "build": "bun build.ts"
33
31
  }
34
32
  }
@@ -1,20 +0,0 @@
1
- {
2
- "version": 3,
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
- "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
- "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
- "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 { 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
- ],
17
- "mappings": "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",
18
- "debugId": "A1002464CBF1D69064756E2164756E21",
19
- "names": []
20
- }
package/dist/index.d.cts DELETED
@@ -1,213 +0,0 @@
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: HTMLElementTagNameMap[N], ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
129
- $beforeUpdate: (this: HTMLElementTagNameMap[N], ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
130
- $update: (this: HTMLElementTagNameMap[N], ev: CustomEvent<HTMLElementTagNameMap[N]>) => unknown
131
- $beforeUnmount: (this: HTMLElementTagNameMap[N], 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
- type BatchFn = (cb: () => void) => void;
212
- declare const setBatch: (fn: BatchFn) => void;
213
- export { setBatch, render, h, fragment, createComponent, Key, JSXNode, JSXFragment, JSXElement, JSXComponent, Component };
package/dist/index.js.map DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "version": 3,
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
- "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
- "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
- "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 { 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
- ],
17
- "mappings": "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",
18
- "debugId": "53C4851E8EA2354964756E2164756E21",
19
- "names": []
20
- }