nine-9 1.2.2 → 1.3.1
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 +56 -14
- package/dist/examples/test.d.ts +2 -0
- package/dist/examples/test.js +2 -0
- package/dist/examples/test.js.map +1 -0
- package/dist/index.d.ts +37 -19
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
一个轻量、高性能、类型安全的 Vanilla DOM 响应式 UI 框架。
|
|
4
4
|
|
|
5
|
-
融合了 Vue 模板指令和 React Hooks
|
|
5
|
+
融合了 Vue 模板指令和 React Hooks 的优点,取两者之长。
|
|
6
|
+
同时运行及其轻量,甚至打包后可以用于 XXXMonkey UserScript。
|
|
6
7
|
|
|
7
8
|
## 特性
|
|
8
9
|
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
- **链式 API** - 流畅的 DOM 操作
|
|
14
15
|
- **Vue 风格指令** - 熟悉的 v-if、v-for 模式
|
|
15
16
|
- **JSX 风格表达式** - 响应式表达式可以放在模板任意位置
|
|
17
|
+
- **数据同步系统** - 使用更优的语法实现数据响应式
|
|
16
18
|
|
|
17
19
|
## 安装
|
|
18
20
|
|
|
@@ -20,42 +22,52 @@
|
|
|
20
22
|
npm install nine-9
|
|
21
23
|
```
|
|
22
24
|
|
|
23
|
-
##
|
|
25
|
+
## 示例用法
|
|
24
26
|
|
|
25
27
|
```typescript
|
|
26
|
-
|
|
28
|
+
// Counter.ts
|
|
29
|
+
import { $, createComponent, tree, sync, styleSet, createArray, when } from "@";
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
export default createComponent({ //创建组件
|
|
29
32
|
props: {
|
|
30
|
-
|
|
33
|
+
value: { //参数名
|
|
31
34
|
validate: Number.isInteger, //验证器
|
|
32
35
|
transform: Number, //转换器
|
|
33
36
|
required: false, //是否必填
|
|
34
37
|
shadow: 0, //默认值
|
|
38
|
+
downloadable: true, //(上游→下游)
|
|
39
|
+
uploadable: true, //(下游→上游),v-model双向绑定
|
|
35
40
|
}
|
|
36
41
|
}
|
|
37
42
|
}, (props) => {
|
|
38
|
-
const
|
|
39
|
-
const doubled = sync(() => count.get() * 2, [count]); //computed
|
|
43
|
+
const doubled = sync(() => props.value.get() * 2, [props.value]); //computed
|
|
40
44
|
return tree("div")
|
|
41
45
|
.use(styleSet().fontSize("20px").padding("10px"))
|
|
42
46
|
.append(
|
|
43
47
|
"敲木鱼", tree("br"),
|
|
44
48
|
tree("button")
|
|
45
|
-
.on("click", () =>
|
|
49
|
+
.on("click", () => props.value.set(props.value.get() + 1)) //参数uploadable,赋值会实时同步到上游
|
|
46
50
|
.textContent("点击加一"),
|
|
47
51
|
tree("button")
|
|
48
|
-
.on("click", () =>
|
|
52
|
+
.on("click", () => props.value.set(props.value.get() - 1))
|
|
49
53
|
.textContent("点击减一"),
|
|
50
54
|
tree("br"),
|
|
51
|
-
"当前值:", $(
|
|
55
|
+
"当前值:", $(props.value), //引用响应式的值,类似模板语法{{ count }}
|
|
52
56
|
"双倍值:", $(doubled),
|
|
53
|
-
sync(
|
|
54
|
-
|
|
57
|
+
$(sync( //只要是能渲染的东西,就能进行响应式引用
|
|
58
|
+
() => createArray(
|
|
59
|
+
doubled.get(),
|
|
60
|
+
() => tree("div").textContent("你点了一下")
|
|
61
|
+
),
|
|
62
|
+
[doubled]
|
|
63
|
+
)), //列表渲染v-for
|
|
64
|
+
when(
|
|
65
|
+
() => props.value.get() > 10,
|
|
66
|
+
() => tree("p").textContent("count > 10 时显示"),
|
|
67
|
+
[props.value]
|
|
68
|
+
), //条件渲染v-if
|
|
55
69
|
);
|
|
56
70
|
});
|
|
57
|
-
|
|
58
|
-
Counter({ initial: 0 }).mount("body");
|
|
59
71
|
```
|
|
60
72
|
|
|
61
73
|
## 与 Vue 对比
|
|
@@ -66,3 +78,33 @@ Counter({ initial: 0 }).mount("body");
|
|
|
66
78
|
| `sync()` | `computed()` | 响应式计算值 |
|
|
67
79
|
| `when(condition, tree)` | `v-if` | 条件渲染 |
|
|
68
80
|
| `sync(() => items.map(...))` | `v-for` | 列表渲染 |
|
|
81
|
+
| `Property.uploadable` | `v-model` | 双向绑定 |
|
|
82
|
+
|
|
83
|
+
## 运行时特性
|
|
84
|
+
|
|
85
|
+
### 性能
|
|
86
|
+
|
|
87
|
+
1. 由于框架不需要使用 **Runtime** 伴随运行,也无需通过虚拟节点重新生成整个节点树(对节点树的更改完全基于原生DOM操作命令),因此应用的运行性能相当高,甚至可以媲美Vanilla.js的速度了。
|
|
88
|
+
2. 框架处理动态的节点树时,本质上是通过对新旧节点的CRUD实现。但不同于 Vue 的是,**nine-9** 不需要分析diff树,用列表渲染(`sync` ← `v-for`)举例,框架使用 `TreeContext` 接口来描述一个XML节点,**HTML元素、字符串、数字、各类空值(null、undefined)、组件渲染结果**都可以被归一化为一个 `TreeContext` 接口,而这个接口必定会用于封装一个非空的XML节点,当使用 `append` 方法添加一个响应式数组时,`TreeContext` 会首先在当前封装的节点最后添加一个注释节点用于当做锚点,旧列表中渲染出的节点将会被删除,新列表中的节点插入到锚点的后面。
|
|
89
|
+
|
|
90
|
+
## 贡献指南
|
|
91
|
+
|
|
92
|
+
欢迎提交Issue和Pull Request!
|
|
93
|
+
|
|
94
|
+
## 许可证
|
|
95
|
+
|
|
96
|
+
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件
|
|
97
|
+
|
|
98
|
+
## 联系方式
|
|
99
|
+
|
|
100
|
+
如有问题或建议,请通过以下方式联系:
|
|
101
|
+
|
|
102
|
+
- 提交 [Issue](https://github.com/Rundll86/nine/issues)
|
|
103
|
+
|
|
104
|
+
## 致谢
|
|
105
|
+
|
|
106
|
+
感谢所有为本项目做出贡献的开发者和研究人员。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
> 用意念控制未来💫
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var w=class{subcribers=[];emitting=!1;subcribe(t,n=!1){this.subcribers.push({callback:t,once:n})}emit(...t){if(!this.emitting){this.emitting=!0;for(let n of this.subcribers)n.callback(...t);this.emitting=!1}}};function K(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}var D=Symbol("WrapperFlag");function y(e,t){let n=["push","pop","shift","unshift","splice","sort","reverse"],r=a=>{if(!Array.isArray(a))return a;let{proxy:c,revoke:T}=Proxy.revocable(a,{get(f,m,x){if(n.includes(m)){let b=Reflect.get(f,m,x);return typeof b=="function"?(...H)=>{let d=p.get();if(Array.isArray(d)){d=[...d];let O=b.call(f,...H);return p.event.emit(p.get(),d),O}}:Reflect.get(f,m,x)}else return Reflect.get(f,m,x)},set(f,m,x,b){if(Reflect.get(f,m,b)!==x){let d=p.get();if(Array.isArray(d)){d=[...d];let O=Reflect.set(f,m,x,b);return p.event.emit(p.get(),d),O}}return Reflect.set(f,m,x,b)}});return s=T,c},o=new w,s=null,i=r(e),p={get(){return i},set(a){if(i!==a){let c=i;Array.isArray(c)&&s?(s(),c=[...c],i=r(a)):i=a,this.event.emit(a,c)}},updateOnly(){this.event.emit(this.get(),this.get())},event:o,[D]:!0};return{...p,...t??{}}}function C(e,t=[]){let n=y(e()),r=()=>{let o=e();n.get()!==o&&n.set(o)};for(let o of t)u(o)&&o.event.subcribe(r);return n}function N(e,t,n=[]){return C(()=>{let r;return typeof e=="function"?r=e():r=e.get(),[r?t():null]},[...n,...u(e)?[e]:[]])}function u(e){return!!e&&Object.hasOwn(e,D)&&e[D]===!0}function $(e){return[...Array.isArray(e)?e:[e]]}function q(e,t){return new Array(e).fill(0).map(t)}var W=Symbol("TreeContextFlag");function j(e){return!!e&&Object.hasOwn(e,W)&&e[W]===!0}function l(e){let t=typeof e=="string"?document.createElement(e):e,n=new Proxy({element:t,append(...r){for(let o of r)if(u(o)){let s=[],i=new Comment("Tree anchor");t.appendChild(i);let p=a=>{let c=[...Array.isArray(a)?a:[a]],T=[];for(let f of c){let m=S(f);T.push(m),t.insertBefore(m.element,i.nextSibling)}for(let f of s)f.element.remove();s=T};o.event.subcribe(p),p(o.get())}else{let s=o;for(let i of $(s))t.appendChild(S(i).element)}return n},use(r){if(t instanceof HTMLElement){let o=s=>{for(let[i,p]of Object.entries(s))t.style.setProperty(K(String(i)),p)};u(r)?(r.event.subcribe(s=>o(s.rules)),o(r.get().rules)):o(r.rules)}return n},on(r,o,s){return t instanceof HTMLElement&&t.addEventListener(r,o,s),n},[W]:!0},{get(r,o,s){return Reflect.has(r,o)?Reflect.get(r,o,s):i=>{if(u(i)){let p=a=>t[o]=a;i.event.subcribe(p),p(i.get())}else t[o]=i;return n}}});return n}var g=class extends Error{},v=class extends Error{},P=class extends Error{},h=class extends Error{},k=class extends Error{};function M(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function z(e){for(let t in e){let n=e[t];if(n.shadow){if(n.required)throw new P(`The required property ${t} can't have a shadow.`);if(n.validate&&!n.validate(n.shadow))throw new g(`The shadow of ${t} can't pass the validation.`)}}}function F(e,t){e||(e={});let n={};for(let r in t){let o=M(t[r]),s=p=>{if(u(n[r]))n[r].set(p);else{let a=y(p);n[r]=a,a.event.subcribe(c=>{if(!(!u(e[r])||!u(n[r]))&&n[r].get()!==e[r].get()){if(!o.uploadable)throw new h(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(p,a)=>{if(!a&&!o.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!o.validate(p))throw new g(`The input value of ${r} can't pass the validation.`);s(o.transform(p))};if(!Object.hasOwn(e,r)){if(o.required)throw new v(`Missing a required property ${r}.`);s(o.shadow);continue}u(e[r])?(e[r].event.subcribe(p=>i(p,!1)),i(e[r].get(),!0)):i(e[r],!0)}return n}function A(e){return typeof e=="function"?y(e()):u(e)?A(e):y(e)}function S(e){let t;if(e instanceof HTMLElement)t=l(e);else if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")t=l(new Text(String(e)));else if(J(e))t=e.$;else if(e==null)t=l(new Comment("Empty tree context"));else if(j(e))t=e;else throw new k(`Failed to render ${e} into a Node.`);return t}var I=Symbol("RenderResultFlag");function J(e){return!!e&&Object.hasOwn(e,I)&&e[I]===!0}function R(e,t){z(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([o,s])=>[o,M(s)]));return Object.assign((o,s)=>{let i=t(F(o,n),A(s)),p=S(i);return{mount(a){let c=typeof a=="string"?[...document.querySelectorAll(a)]:[a];for(let T of c)T.appendChild(p.element)},$:p,[I]:!0}},{props:n})}function V(){let e={},t=new Proxy({rules:e},{get(n,r,o){return Reflect.has(n,r)?Reflect.get(n,r,o):s=>(e[r]=String(s),t)}});return t}function B(e){return e==null?!1:typeof e=="number"?isFinite(e):typeof e=="string"?e.trim()!==""&&!isNaN(Number(e)):!1}var E=R({props:{v1:{transform:Number,shadow:0,validate:B,required:!0,uploadable:!0,downloadable:!0},v2:{transform:Number,shadow:0,validate:B,required:!0,uploadable:!0,downloadable:!0}}},e=>l("div").append(e.v1,"+",e.v2,"=",C(()=>e.v1.get()+e.v2.get(),[e.v1,e.v2]),l("button").textContent("\u4E0B\u6E38 v1 -1").on("click",()=>e.v1.set(e.v1.get()-1)),l("button").textContent("\u4E0B\u6E38 v2 -1").on("click",()=>e.v2.set(e.v2.get()-1))));var Z=R({props:{value:{validate:Number.isInteger,transform:Number,required:!1,shadow:0,downloadable:!0,uploadable:!0}}},e=>{let t=C(()=>e.value.get()*2,[e.value]);return l("div").use(V().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",l("br"),l("button").on("click",()=>e.value.set(e.value.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),l("button").on("click",()=>e.value.set(e.value.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),l("br"),"\u5F53\u524D\u503C\uFF1A",e.value,"\u53CC\u500D\u503C\uFF1A",t,C(()=>q(t.get(),()=>l("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[t]),N(()=>e.value.get()>10,()=>l("p").textContent("count > 10 \u65F6\u663E\u793A"),[e.value]))});var G=R({},()=>{let e=y(10),t=y(20);return l("div").append("v1:",e,"v2:",t,E({v1:e,v2:t}),l("button").textContent("\u4E0A\u6E38 v1 +1").on("click",()=>e.set(e.get()+1)),l("button").textContent("\u4E0A\u6E38 v2 +1").on("click",()=>t.set(t.get()+1)))});var L={Counter:Z,AddExpression:E,ValuePot:G};L.ValuePot().mount("#app");
|
|
2
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/channel/event-subcriber.ts","../../src/util/char.ts","../../src/dom/reactive.ts","../../src/util/array.ts","../../src/dom/tree.ts","../../src/exceptions/index.ts","../../src/dom/property.ts","../../src/dom/slot.ts","../../src/dom/component.ts","../../src/dom/style.ts","../../src/examples/AddExpression.ts","../../src/examples/Counter.ts","../../src/examples/ValuePot.ts","../../src/examples/index.ts","../../src/examples/test.ts"],"sourcesContent":["interface SubcriberCallback<T extends unknown[]> {\r\n (...data: T): void;\r\n}\r\ninterface Subcriber<T extends unknown[]> {\r\n callback: SubcriberCallback<T>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[]> {\r\n private subcribers: Subcriber<T>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T) {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n for (const subcriber of this.subcribers) {\r\n subcriber.callback(...data);\r\n }\r\n this.emitting = false;\r\n }\r\n}","export function camelToHyphen(str: string) {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\r\n}\r\nexport function hyphenToCamel(str: string) {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n}","import { EventSubcriber } from \"@/channel/event-subcriber\";\r\nimport { TreeResult } from \"./component\";\r\n\r\nexport const wrapperSymbol = Symbol(\"WrapperFlag\");\r\nexport type Wrapper<T> = {\r\n get(): T;\r\n set(newData: T): void;\r\n updateOnly(): void;\r\n event: EventSubcriber<[T, T]>;\r\n} & { [K in typeof wrapperSymbol]: true; };\r\nexport function wrap<T>(initialData: T, wrapperOptions?: Partial<Wrapper<T>>): Wrapper<T> {\r\n const arrayActions = [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\"];\r\n const patch = (data: T) => {\r\n if (!Array.isArray(data)) { return data; }\r\n const { proxy, revoke: newRevoke } = Proxy.revocable(data, {\r\n get(target, p: string, receiver) {\r\n if (arrayActions.includes(p)) {\r\n const originalMethod = Reflect.get(target, p, receiver) as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === \"function\") {\r\n return (...args: unknown[]) => {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = originalMethod.call(target, ...args);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n };\r\n } else return Reflect.get(target, p, receiver);\r\n } else {\r\n return Reflect.get(target, p, receiver);\r\n }\r\n },\r\n set(target, p, newValue, receiver) {\r\n const oldValue = Reflect.get(target, p, receiver);\r\n if (oldValue !== newValue) {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = Reflect.set(target, p, newValue, receiver);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n }\r\n return Reflect.set(target, p, newValue, receiver);\r\n },\r\n });\r\n oldRevoke = newRevoke;\r\n return proxy;\r\n };\r\n const event = new EventSubcriber<[T, T]>();\r\n let oldRevoke: (() => void) | null = null;\r\n let currentData = patch(initialData);\r\n const wrapper: Wrapper<T> = {\r\n get() { return currentData; },\r\n set(newData) {\r\n if (currentData !== newData) {\r\n let oldData = currentData;\r\n if (Array.isArray(oldData) && oldRevoke) {\r\n oldRevoke();\r\n oldData = [...oldData] as T;\r\n currentData = patch(newData);\r\n } else {\r\n currentData = newData;\r\n };\r\n this.event.emit(newData, oldData);\r\n }\r\n },\r\n updateOnly() {\r\n this.event.emit(this.get(), this.get());\r\n },\r\n event,\r\n [wrapperSymbol]: true\r\n };\r\n return { ...wrapper, ...wrapperOptions ?? {} };\r\n}\r\nexport function sync<R>(effectRenderer: () => R, dependencies: unknown[] = []): Wrapper<R> {\r\n const internalWrapper = wrap(effectRenderer());\r\n const update = () => {\r\n const newData = effectRenderer();\r\n const currentData = internalWrapper.get();\r\n const hasChanged = currentData !== newData;\r\n if (hasChanged) {\r\n internalWrapper.set(newData);\r\n }\r\n };\r\n for (const dependency of dependencies) {\r\n if (!isWrapper(dependency)) continue;\r\n dependency.event.subcribe(update);\r\n }\r\n return internalWrapper;\r\n}\r\nexport function when(condition: Wrapper<boolean> | (() => boolean), tree: () => TreeResult, dependencies: unknown[] = []) {\r\n return sync(() => {\r\n let result: boolean;\r\n if (typeof condition === \"function\") {\r\n result = condition();\r\n } else {\r\n result = condition.get();\r\n }\r\n return [result ? tree() : null];\r\n }, [...dependencies, ...(isWrapper(condition) ? [condition] : [])]);\r\n}\r\nexport function isWrapper<T>(data: unknown): data is Wrapper<T> {\r\n return !!data && Object.hasOwn(data, wrapperSymbol) && data[wrapperSymbol] === true;\r\n}\r\n","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIn<T>(data: T) {\r\n return [...(Array.isArray(data) ? data : [data])] as T extends (infer R)[] ? R[] : [T];\r\n}\r\nexport function createArray<T>(length: number, filler: () => T): T[] {\r\n return new Array(length).fill(0).map(filler);\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, TreeResult } from \"./component\";\r\nimport { isWrapper, Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIn } from \"@/util/array\";\r\n\r\nexport type TreeContext<T extends HTMLElement = HTMLElement> = {\r\n [K in keyof T as T[K] extends (...args: unknown[]) => unknown ? never : K]: (data: T[K] | Wrapper<T[K]>) => TreeContext<T>;\r\n} & {\r\n element: T;\r\n append(...children: (\r\n TreeResult |\r\n TreeResult[] |\r\n Wrapper<TreeResult> |\r\n Wrapper<TreeResult[]> |\r\n Wrapper<TreeResult | TreeResult[]>\r\n )[]): TreeContext<T>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): TreeContext<T>;\r\n on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): TreeContext<T>;\r\n} & { [K in typeof treeContextSymbol]: true; };\r\nexport const treeContextSymbol = Symbol(\"TreeContextFlag\");\r\nexport function isTreeContext<T extends HTMLElement>(data: unknown): data is TreeContext<T> {\r\n return !!data && Object.hasOwn(data, treeContextSymbol) && data[treeContextSymbol] === true;\r\n}\r\nexport function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const context: TreeContext<HTMLElementTagNameMap[E]> = new Proxy({\r\n element,\r\n append(...children: (TreeResult | TreeResult[] | Wrapper<TreeResult | TreeResult[]>)[]) {\r\n for (const child of children) {\r\n if (isWrapper<TreeResult | TreeResult[]>(child)) {\r\n let oldChildren: TreeContext[] = [];\r\n const baseAnchor = new Comment(\"Tree anchor\");\r\n element.appendChild(baseAnchor);\r\n const update = (newTrees: TreeResult[] | TreeResult) => {\r\n const normalizedTrees = [...(Array.isArray(newTrees) ? newTrees : [newTrees])];\r\n const newChildren: TreeContext[] = [];\r\n for (const newTree of normalizedTrees) {\r\n const child = render(newTree);\r\n newChildren.push(child);\r\n element.insertBefore(child.element, baseAnchor.nextSibling);\r\n }\r\n for (const oldChild of oldChildren) {\r\n oldChild.element.remove();\r\n }\r\n oldChildren = newChildren;\r\n };\r\n child.event.subcribe(update);\r\n update(child.get());\r\n } else {\r\n const children = child;\r\n for (const child of putIn(children)) {\r\n element.appendChild(render(child).element);\r\n }\r\n }\r\n }\r\n return context;\r\n },\r\n use(styleSet: StyleSet | Wrapper<StyleSet>) {\r\n if (element instanceof HTMLElement) {\r\n const update = (rules: Record<string, string>) => {\r\n for (const [key, value] of Object.entries(rules)) {\r\n element.style.setProperty(camelToHyphen(String(key)), value);\r\n }\r\n };\r\n if (isWrapper<StyleSet>(styleSet)) {\r\n styleSet.event.subcribe((newData) => update(newData.rules));\r\n update(styleSet.get().rules);\r\n } else {\r\n update(styleSet.rules);\r\n }\r\n }\r\n return context;\r\n },\r\n on(key, handler, options) {\r\n if (element instanceof HTMLElement) {\r\n element.addEventListener(key, handler, options);\r\n }\r\n return context;\r\n },\r\n [treeContextSymbol]: true\r\n } as TreeContext<HTMLElementTagNameMap[E]>, {\r\n get<P extends keyof Node>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: HTMLElementTagNameMap[E][P] | Wrapper<HTMLElementTagNameMap[E][P]>) => {\r\n if (isWrapper<HTMLElementTagNameMap[E][P]>(data)) {\r\n const update = (newData: HTMLElementTagNameMap[E][P]) => element[p] = newData;\r\n data.event.subcribe(update);\r\n update(data.get());\r\n } else {\r\n element[p] = data;\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingFieldError extends Error { }\r\nexport class ConflictionError extends Error { }\r\nexport class AccessError extends Error { }\r\nexport class BrokenRendererError extends Error { }","import { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, ComponentPropertyStore } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingFieldError, ValidationFailed } from \"@/exceptions\";\r\nimport { isWrapper, wrap } from \"./reactive\";\r\n\r\nexport function normalizePropertyDescriptor\r\n <I, O, R extends boolean>(\r\n descriptor: ComponentPropertyDescriptor<I, O, R>\r\n): Required<ComponentPropertyDescriptor<I, O, R>> {\r\n return Object.assign({\r\n validate: () => true,\r\n transform: x => x,\r\n shadow: null,\r\n required: false,\r\n downloadable: true,\r\n uploadable: false\r\n } satisfies Required<ComponentPropertyDescriptor>, descriptor);\r\n}\r\nexport function validateStore(store: ComponentPropertyStore) {\r\n for (const propertyKey in store) {\r\n const descriptor = store[propertyKey];\r\n if (descriptor.shadow) {\r\n if (descriptor.required) {\r\n throw new ConflictionError(`The required property ${propertyKey} can't have a shadow.`);\r\n }\r\n if (descriptor.validate && !descriptor.validate(descriptor.shadow)) {\r\n throw new ValidationFailed(`The shadow of ${propertyKey} can't pass the validation.`);\r\n }\r\n }\r\n }\r\n}\r\nexport function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T) {\r\n if (!upstream) upstream = {} as ComponentPropertyInputDict<T>;\r\n const downstream: Record<string, unknown> = {};\r\n for (const propertyKey in store) {\r\n const descriptor = normalizePropertyDescriptor(store[propertyKey]);\r\n const setValue = (newValue: unknown) => {\r\n if (isWrapper(downstream[propertyKey])) {\r\n downstream[propertyKey].set(newValue);\r\n } else {\r\n const wrapper = wrap(newValue);\r\n downstream[propertyKey] = wrapper;\r\n wrapper.event.subcribe((newData) => {\r\n if (!isWrapper(upstream[propertyKey]) || !isWrapper(downstream[propertyKey])) return;\r\n if (downstream[propertyKey].get() === upstream[propertyKey].get()) return;\r\n if (!descriptor.uploadable) throw new AccessError(`Property ${propertyKey} isn't uploadable but being set.`);\r\n upstream[propertyKey].set(newData);\r\n });\r\n }\r\n };\r\n const update = (inputValue: unknown, firstSet: boolean) => {\r\n if (!firstSet && !descriptor.downloadable) {\r\n console.warn(`Property ${propertyKey} isn't downloadable but being emitted.`);\r\n return;\r\n }\r\n if (!descriptor.validate(inputValue)) {\r\n throw new ValidationFailed(`The input value of ${propertyKey} can't pass the validation.`);\r\n }\r\n setValue(descriptor.transform(inputValue));\r\n };\r\n if (!Object.hasOwn(upstream, propertyKey)) {\r\n if (descriptor.required) {\r\n throw new MissingFieldError(`Missing a required property ${propertyKey}.`);\r\n }\r\n setValue(descriptor.shadow);\r\n continue;\r\n }\r\n if (isWrapper(upstream[propertyKey])) {\r\n upstream[propertyKey].event.subcribe(e => update(e, false));\r\n update(upstream[propertyKey].get(), true);\r\n } else {\r\n update(upstream[propertyKey], true);\r\n }\r\n }\r\n return downstream as ComponentPropertyOutputDict<T>;\r\n}","import { TreeResult } from \"./component\";\r\nimport { isWrapper, wrap, Wrapper } from \"./reactive\";\r\n\r\nexport type RawSlotInput = TreeResult | (() => TreeResult);\r\nexport type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;\r\nexport type SlotOutput = Wrapper<TreeResult>;\r\n\r\nexport function pipeExtract(input: SlotInput): SlotOutput {\r\n if (typeof input === \"function\") {\r\n return wrap(input());\r\n } else if (isWrapper<RawSlotInput>(input)) {\r\n return pipeExtract(input);\r\n } else return wrap(input);\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { TreeContext, isTreeContext, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;\r\n}\r\nexport type Component<P extends ComponentPropertyStore> =\r\n ComponentRenderEntry<P> & ComponentOption<P>;\r\nexport interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {\r\n validate?: (data: I) => boolean;\r\n transform: (data: I) => O;\r\n shadow?: O;\r\n required?: R;\r\n downloadable?: boolean;\r\n uploadable?: boolean;\r\n}\r\nexport type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;\r\nexport type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P as P[K][\"required\"] extends true ? K : never]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> : never;\r\n} & {\r\n [K in keyof P as P[K][\"required\"] extends false | unknown ? K : never]?:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> | EmptyValue : never;\r\n}\r\nexport type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? Wrapper<R> : never;\r\n};\r\nexport interface ComponentOption<P extends ComponentPropertyStore> {\r\n props?: P;\r\n}\r\nexport type RenderResult = {\r\n mount(to: string | HTMLElement): void;\r\n $: TreeContext;\r\n} & { [K in typeof renderResultSymbol]: true; };\r\nexport type TreeResult =\r\n HTMLElement |\r\n TreeContext |\r\n string |\r\n number |\r\n boolean |\r\n EmptyValue |\r\n RenderResult;\r\nexport function render(nodeTree: TreeResult) {\r\n let result: TreeContext;\r\n if (nodeTree instanceof HTMLElement) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\") {\r\n result = tree(new Text(String(nodeTree)));\r\n } else if (isRenderResult(nodeTree)) {\r\n result = nodeTree.$;\r\n } else if (nodeTree === null || nodeTree === undefined) {\r\n result = tree(new Comment(\"Empty tree context\"));\r\n } else if (isTreeContext(nodeTree)) {\r\n result = nodeTree;\r\n } else {\r\n throw new BrokenRendererError(`Failed to render ${nodeTree} into a Node.`);\r\n }\r\n return result;\r\n}\r\nexport const renderResultSymbol = Symbol(\"RenderResultFlag\");\r\nexport function isRenderResult(data: unknown): data is RenderResult {\r\n return !!data && Object.hasOwn(data, renderResultSymbol) && data[renderResultSymbol] === true;\r\n}\r\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<TreeResult>;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore\r\n>(\r\n options: ComponentOption<P>,\r\n internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult\r\n): Component<P> {\r\n validateStore(options.props ?? {});\r\n const propStore = Object.fromEntries(\r\n Object\r\n .entries(options.props ?? {})\r\n .map(([key, value]) => [\r\n key,\r\n normalizePropertyDescriptor(value),\r\n ])\r\n ) as P;\r\n const entryRenderer = (props?: ComponentPropertyInputDict<P>, slot?: SlotInput) => {\r\n const nodeTree = internalRenderer(hostdown(props, propStore), pipeExtract(slot));\r\n const result = render(nodeTree);\r\n return {\r\n mount(to: string | HTMLElement) {\r\n const targets = typeof to === \"string\" ? [...document.querySelectorAll<HTMLElement>(to)] : [to];\r\n for (const target of targets) {\r\n target.appendChild(result.element);\r\n }\r\n },\r\n $: result,\r\n [renderResultSymbol]: true as const\r\n };\r\n };\r\n return Object.assign(entryRenderer, {\r\n props: propStore\r\n } satisfies ComponentOption<P>);\r\n}","export type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n toString(): string;\r\n};\r\nexport function styleSet() {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n } as StyleSet, {\r\n get<P extends string & keyof CSSStyleDeclaration>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: CSSStyleDeclaration[P]) => {\r\n rules[p] = String(data);\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","import { $, createComponent, sync, tree, TreeResult } from \"@\";\r\n\r\nfunction isNumeric(value: unknown) {\r\n if (value === null || value === undefined) return false;\r\n if (typeof value === \"number\") return isFinite(value);\r\n if (typeof value === \"string\") return value.trim() !== \"\" && !isNaN(Number(value));\r\n return false;\r\n}\r\nexport default createComponent({\r\n props: {\r\n v1: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n },\r\n v2: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n }\r\n }\r\n}, (props) =>\r\n tree(\"div\").append(\r\n $(props.v1), \"+\", $(props.v2), \"=\",\r\n sync<TreeResult>(() => props.v1.get() + props.v2.get(), [props.v1, props.v2]),\r\n tree(\"button\")\r\n .textContent(\"下游 v1 -1\")\r\n .on(\"click\", () => props.v1.set(props.v1.get() - 1)),\r\n tree(\"button\")\r\n .textContent(\"下游 v2 -1\")\r\n .on(\"click\", () => props.v2.set(props.v2.get() - 1)),\r\n ),\r\n);","import { $, createComponent, tree, sync, styleSet, createArray, when } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n value: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n downloadable: true, //(上游→下游)\r\n uploadable: true, //(下游→上游),v-model双向绑定\r\n }\r\n }\r\n}, (props) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n return tree(\"div\")\r\n .use(styleSet().fontSize(\"20px\").padding(\"10px\"))\r\n .append(\r\n \"敲木鱼\", tree(\"br\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() + 1)) //参数uploadable,赋值会实时同步到上游\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(props.value), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n $(sync( //只要是能渲染的东西,就能进行响应式引用\r\n () => createArray(\r\n doubled.get(),\r\n () => tree(\"div\").textContent(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").textContent(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import { $, createComponent, tree, wrap } from \"@\";\r\nimport AddExpression from \"./AddExpression\";\r\n\r\nexport default createComponent({}, () => {\r\n const v1 = wrap(10);\r\n const v2 = wrap(20);\r\n return tree(\"div\")\r\n .append(\r\n \"v1:\", $(v1), \"v2:\", $(v2),\r\n AddExpression({ v1, v2 }),\r\n tree(\"button\")\r\n .textContent(\"上游 v1 +1\")\r\n .on(\"click\", () => v1.set(v1.get() + 1)),\r\n tree(\"button\")\r\n .textContent(\"上游 v2 +1\")\r\n .on(\"click\", () => v2.set(v2.get() + 1)),\r\n );\r\n});","import AddExpression from \"./AddExpression\";\r\nimport Counter from \"./Counter\";\r\nimport ValuePot from \"./ValuePot\";\r\n\r\nexport default { Counter, AddExpression, ValuePot };","import { examples } from \"@\";\r\n\r\nexamples.ValuePot().mount(\"#app\");\r\n"],"mappings":"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","names":["EventSubcriber","callback","once","data","subcriber","camelToHyphen","str","letter","wrapperSymbol","wrap","initialData","wrapperOptions","arrayActions","patch","data","proxy","newRevoke","target","p","receiver","originalMethod","args","oldData","wrapper","result","newValue","oldRevoke","event","EventSubcriber","currentData","newData","sync","effectRenderer","dependencies","internalWrapper","update","dependency","isWrapper","when","condition","tree","putIn","data","createArray","length","filler","treeContextSymbol","isTreeContext","data","tree","element","context","children","child","isWrapper","oldChildren","baseAnchor","update","newTrees","normalizedTrees","newChildren","newTree","render","oldChild","putIn","styleSet","rules","key","value","camelToHyphen","newData","handler","options","target","p","receiver","ValidationFailed","MissingFieldError","ConflictionError","AccessError","BrokenRendererError","normalizePropertyDescriptor","descriptor","x","validateStore","store","propertyKey","ConflictionError","ValidationFailed","hostdown","upstream","downstream","setValue","newValue","isWrapper","wrapper","wrap","newData","AccessError","update","inputValue","firstSet","MissingFieldError","e","pipeExtract","input","wrap","isWrapper","render","nodeTree","result","tree","isRenderResult","isTreeContext","BrokenRendererError","renderResultSymbol","data","createComponent","options","internalRenderer","validateStore","propStore","key","value","normalizePropertyDescriptor","props","slot","nodeTree","hostdown","pipeExtract","result","render","to","targets","target","renderResultSymbol","styleSet","rules","context","target","p","receiver","data","isNumeric","value","AddExpression_default","createComponent","props","tree","sync","Counter_default","createComponent","props","doubled","sync","tree","styleSet","createArray","when","ValuePot_default","createComponent","v1","wrap","v2","tree","AddExpression_default","examples_default","Counter_default","AddExpression_default","ValuePot_default","examples_default"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,10 +3,8 @@ interface SubcriberCallback<T extends unknown[]> {
|
|
|
3
3
|
}
|
|
4
4
|
declare class EventSubcriber<T extends unknown[]> {
|
|
5
5
|
private subcribers;
|
|
6
|
+
private emitting;
|
|
6
7
|
subcribe(callback: SubcriberCallback<T>, once?: boolean): void;
|
|
7
|
-
once(): Promise<{
|
|
8
|
-
data: T;
|
|
9
|
-
}>;
|
|
10
8
|
emit(...data: T): void;
|
|
11
9
|
}
|
|
12
10
|
|
|
@@ -18,13 +16,12 @@ declare const wrapperSymbol: unique symbol;
|
|
|
18
16
|
type Wrapper<T> = {
|
|
19
17
|
get(): T;
|
|
20
18
|
set(newData: T): void;
|
|
21
|
-
emitEvent(newData: T, oldData: T): void;
|
|
22
19
|
updateOnly(): void;
|
|
23
20
|
event: EventSubcriber<[T, T]>;
|
|
24
21
|
} & {
|
|
25
22
|
[K in typeof wrapperSymbol]: true;
|
|
26
23
|
};
|
|
27
|
-
declare function wrap<T>(initialData: T): Wrapper<T>;
|
|
24
|
+
declare function wrap<T>(initialData: T, wrapperOptions?: Partial<Wrapper<T>>): Wrapper<T>;
|
|
28
25
|
declare function sync<R>(effectRenderer: () => R, dependencies?: unknown[]): Wrapper<R>;
|
|
29
26
|
declare function when(condition: Wrapper<boolean> | (() => boolean), tree: () => TreeResult, dependencies?: unknown[]): Wrapper<TreeResult[]>;
|
|
30
27
|
declare function isWrapper<T>(data: unknown): data is Wrapper<T>;
|
|
@@ -44,20 +41,17 @@ type TreeContext<T extends HTMLElement = HTMLElement> = {
|
|
|
44
41
|
append(...children: (TreeResult | TreeResult[] | Wrapper<TreeResult> | Wrapper<TreeResult[]> | Wrapper<TreeResult | TreeResult[]>)[]): TreeContext<T>;
|
|
45
42
|
use(styleSet: StyleSet | Wrapper<StyleSet>): TreeContext<T>;
|
|
46
43
|
on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): TreeContext<T>;
|
|
44
|
+
} & {
|
|
45
|
+
[K in typeof treeContextSymbol]: true;
|
|
47
46
|
};
|
|
47
|
+
declare const treeContextSymbol: unique symbol;
|
|
48
|
+
declare function isTreeContext<T extends HTMLElement>(data: unknown): data is TreeContext<T>;
|
|
48
49
|
declare function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node): TreeContext<HTMLElementTagNameMap[E]>;
|
|
49
50
|
|
|
50
51
|
type RawSlotInput = TreeResult | (() => TreeResult);
|
|
51
52
|
type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;
|
|
52
53
|
type SlotOutput = Wrapper<TreeResult>;
|
|
53
54
|
|
|
54
|
-
type RenderResult = {
|
|
55
|
-
mount(to: string | HTMLElement): void;
|
|
56
|
-
$: TreeContext;
|
|
57
|
-
} & {
|
|
58
|
-
[K in typeof renderResultSymbol]: true;
|
|
59
|
-
};
|
|
60
|
-
type TreeResult = HTMLElement | TreeContext | string | number | EmptyValue | RenderResult;
|
|
61
55
|
interface ComponentRenderEntry<P extends ComponentPropertyStore> {
|
|
62
56
|
(props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;
|
|
63
57
|
}
|
|
@@ -67,23 +61,32 @@ interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolea
|
|
|
67
61
|
transform: (data: I) => O;
|
|
68
62
|
shadow?: O;
|
|
69
63
|
required?: R;
|
|
64
|
+
downloadable?: boolean;
|
|
65
|
+
uploadable?: boolean;
|
|
70
66
|
}
|
|
71
67
|
type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;
|
|
72
68
|
type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {
|
|
73
|
-
[K in keyof P as P[K]["required"] extends true ? K : never]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R : never;
|
|
69
|
+
[K in keyof P as P[K]["required"] extends true ? K : never]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R | Wrapper<R> : never;
|
|
74
70
|
} & {
|
|
75
|
-
[K in keyof P as P[K]["required"] extends false | unknown ? K : never]?: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R |
|
|
71
|
+
[K in keyof P as P[K]["required"] extends false | unknown ? K : never]?: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R | Wrapper<R> | EmptyValue : never;
|
|
76
72
|
};
|
|
77
73
|
type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {
|
|
78
|
-
[K in keyof P]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R : never;
|
|
74
|
+
[K in keyof P]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? Wrapper<R> : never;
|
|
79
75
|
};
|
|
80
76
|
interface ComponentOption<P extends ComponentPropertyStore> {
|
|
81
77
|
props?: P;
|
|
82
78
|
}
|
|
79
|
+
type RenderResult = {
|
|
80
|
+
mount(to: string | HTMLElement): void;
|
|
81
|
+
$: TreeContext;
|
|
82
|
+
} & {
|
|
83
|
+
[K in typeof renderResultSymbol]: true;
|
|
84
|
+
};
|
|
85
|
+
type TreeResult = HTMLElement | TreeContext | string | number | boolean | EmptyValue | RenderResult;
|
|
86
|
+
declare function render(nodeTree: TreeResult): TreeContext;
|
|
83
87
|
declare const renderResultSymbol: unique symbol;
|
|
84
88
|
declare function isRenderResult(data: unknown): data is RenderResult;
|
|
85
89
|
declare function $<T>(data: Wrapper<T>): Wrapper<TreeResult>;
|
|
86
|
-
declare function render(nodeTree: TreeResult): TreeContext;
|
|
87
90
|
declare function createComponent<P extends ComponentPropertyStore>(options: ComponentOption<P>, internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult): Component<P>;
|
|
88
91
|
|
|
89
92
|
declare function camelToHyphen(str: string): string;
|
|
@@ -104,11 +107,26 @@ declare namespace index {
|
|
|
104
107
|
|
|
105
108
|
declare const _default: {
|
|
106
109
|
Counter: Component<{
|
|
107
|
-
|
|
108
|
-
transform: NumberConstructor;
|
|
110
|
+
initial: {
|
|
109
111
|
validate: (number: unknown) => boolean;
|
|
112
|
+
transform: NumberConstructor;
|
|
113
|
+
required: false;
|
|
114
|
+
shadow: number;
|
|
115
|
+
};
|
|
116
|
+
}>;
|
|
117
|
+
AddExpression: Component<{
|
|
118
|
+
v1: {
|
|
119
|
+
transform: NumberConstructor;
|
|
120
|
+
shadow: number;
|
|
121
|
+
validate: (value: unknown) => boolean;
|
|
122
|
+
};
|
|
123
|
+
v2: {
|
|
124
|
+
transform: NumberConstructor;
|
|
125
|
+
shadow: number;
|
|
126
|
+
validate: (value: unknown) => boolean;
|
|
110
127
|
};
|
|
111
128
|
}>;
|
|
129
|
+
ValuePot: Component<ComponentPropertyStore>;
|
|
112
130
|
};
|
|
113
131
|
|
|
114
|
-
export { $, type Component, type ComponentOption, type ComponentPropertyDescriptor, type ComponentPropertyInputDict, type ComponentPropertyOutputDict, type ComponentPropertyStore, type ComponentRenderEntry, type EmptyValue, EventSubcriber, type Normalize, type RenderResult, type StyleSet, type TreeContext, type TreeResult, type Valueof, type Wrapper, index as assets,
|
|
132
|
+
export { $, type Component, type ComponentOption, type ComponentPropertyDescriptor, type ComponentPropertyInputDict, type ComponentPropertyOutputDict, type ComponentPropertyStore, type ComponentRenderEntry, type EmptyValue, EventSubcriber, type Normalize, type RenderResult, type StyleSet, type TreeContext, type TreeResult, type Valueof, type Wrapper, index as assets, camelToHyphen, createArray, createComponent, _default as examples, hyphenToCamel, isRenderResult, isTreeContext, isWrapper, putIn, render, renderResultSymbol, styleSet, sync, tree, treeContextSymbol, typedIsArray, when, wrap, wrapperSymbol };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var I=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var re=Object.prototype.hasOwnProperty;var L=(e,t)=>{for(var o in t)I(e,o,{get:t[o],enumerable:!0})},ne=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of te(t))!re.call(e,n)&&n!==o&&I(e,n,{get:()=>t[n],enumerable:!(r=ee(t,n))||r.enumerable});return e};var oe=e=>ne(I({},"__esModule",{value:!0}),e);var ae={};L(ae,{$:()=>W,EventSubcriber:()=>C,assets:()=>V,camelToHyphen:()=>H,createArray:()=>q,createComponent:()=>b,examples:()=>_,hyphenToCamel:()=>se,isRenderResult:()=>J,isTreeContext:()=>$,isWrapper:()=>u,putIn:()=>N,render:()=>R,renderResultSymbol:()=>D,styleSet:()=>F,sync:()=>T,tree:()=>a,treeContextSymbol:()=>h,typedIsArray:()=>pe,when:()=>K,wrap:()=>d,wrapperSymbol:()=>S});module.exports=oe(ae);var C=class{subcribers=[];emitting=!1;subcribe(t,o=!1){this.subcribers.push({callback:t,once:o})}emit(...t){if(!this.emitting){this.emitting=!0;for(let o of this.subcribers)o.callback(...t);this.emitting=!1}}};function H(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function se(e){return e.replace(/-([a-z])/g,t=>t[1].toUpperCase())}var S=Symbol("WrapperFlag");function d(e,t){let o=["push","pop","shift","unshift","splice","sort","reverse"],r=l=>{if(!Array.isArray(l))return l;let{proxy:c,revoke:g}=Proxy.revocable(l,{get(f,m,x){if(o.includes(m)){let w=Reflect.get(f,m,x);return typeof w=="function"?(...U)=>{let y=p.get();if(Array.isArray(y)){y=[...y];let A=w.call(f,...U);return p.event.emit(p.get(),y),A}}:Reflect.get(f,m,x)}else return Reflect.get(f,m,x)},set(f,m,x,w){if(Reflect.get(f,m,w)!==x){let y=p.get();if(Array.isArray(y)){y=[...y];let A=Reflect.set(f,m,x,w);return p.event.emit(p.get(),y),A}}return Reflect.set(f,m,x,w)}});return s=g,c},n=new C,s=null,i=r(e),p={get(){return i},set(l){if(i!==l){let c=i;Array.isArray(c)&&s?(s(),c=[...c],i=r(l)):i=l,this.event.emit(l,c)}},updateOnly(){this.event.emit(this.get(),this.get())},event:n,[S]:!0};return{...p,...t??{}}}function T(e,t=[]){let o=d(e()),r=()=>{let n=e();o.get()!==n&&o.set(n)};for(let n of t)u(n)&&n.event.subcribe(r);return o}function K(e,t,o=[]){return T(()=>{let r;return typeof e=="function"?r=e():r=e.get(),[r?t():null]},[...o,...u(e)?[e]:[]])}function u(e){return!!e&&Object.hasOwn(e,S)&&e[S]===!0}function pe(e){return Array.isArray(e)}function N(e){return[...Array.isArray(e)?e:[e]]}function q(e,t){return new Array(e).fill(0).map(t)}var h=Symbol("TreeContextFlag");function $(e){return!!e&&Object.hasOwn(e,h)&&e[h]===!0}function a(e){let t=typeof e=="string"?document.createElement(e):e,o=new Proxy({element:t,append(...r){for(let n of r)if(u(n)){let s=[],i=new Comment("Tree anchor");t.appendChild(i);let p=l=>{let c=[...Array.isArray(l)?l:[l]],g=[];for(let f of c){let m=R(f);g.push(m),t.insertBefore(m.element,i.nextSibling)}for(let f of s)f.element.remove();s=g};n.event.subcribe(p),p(n.get())}else{let s=n;for(let i of N(s))t.appendChild(R(i).element)}return o},use(r){if(t instanceof HTMLElement){let n=s=>{for(let[i,p]of Object.entries(s))t.style.setProperty(H(String(i)),p)};u(r)?(r.event.subcribe(s=>n(s.rules)),n(r.get().rules)):n(r.rules)}return o},on(r,n,s){return t instanceof HTMLElement&&t.addEventListener(r,n,s),o},[h]:!0},{get(r,n,s){return Reflect.has(r,n)?Reflect.get(r,n,s):i=>{if(u(i)){let p=l=>t[n]=l;i.event.subcribe(p),p(i.get())}else t[n]=i;return o}}});return o}var v=class extends Error{},P=class extends Error{},k=class extends Error{},E=class extends Error{},O=class extends Error{};function j(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function Z(e){for(let t in e){let o=e[t];if(o.shadow){if(o.required)throw new k(`The required property ${t} can't have a shadow.`);if(o.validate&&!o.validate(o.shadow))throw new v(`The shadow of ${t} can't pass the validation.`)}}}function G(e,t){e||(e={});let o={};for(let r in t){let n=j(t[r]),s=p=>{if(u(o[r]))o[r].set(p);else{let l=d(p);o[r]=l,l.event.subcribe(c=>{if(!(!u(e[r])||!u(o[r]))&&o[r].get()!==e[r].get()){if(!n.uploadable)throw new E(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(p,l)=>{if(!l&&!n.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!n.validate(p))throw new v(`The input value of ${r} can't pass the validation.`);s(n.transform(p))};if(!Object.hasOwn(e,r)){if(n.required)throw new P(`Missing a required property ${r}.`);s(n.shadow);continue}u(e[r])?(e[r].event.subcribe(p=>i(p,!1)),i(e[r].get(),!0)):i(e[r],!0)}return o}function z(e){return typeof e=="function"?d(e()):u(e)?z(e):d(e)}function R(e){let t;if(e instanceof HTMLElement)t=a(e);else if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")t=a(new Text(String(e)));else if(J(e))t=e.$;else if(e==null)t=a(new Comment("Empty tree context"));else if($(e))t=e;else throw new O(`Failed to render ${e} into a Node.`);return t}var D=Symbol("RenderResultFlag");function J(e){return!!e&&Object.hasOwn(e,D)&&e[D]===!0}function W(e){return e}function b(e,t){Z(e.props??{});let o=Object.fromEntries(Object.entries(e.props??{}).map(([n,s])=>[n,j(s)]));return Object.assign((n,s)=>{let i=t(G(n,o),z(s)),p=R(i);return{mount(l){let c=typeof l=="string"?[...document.querySelectorAll(l)]:[l];for(let g of c)g.appendChild(p.element)},$:p,[D]:!0}},{props:o})}function F(){let e={},t=new Proxy({rules:e},{get(o,r,n){return Reflect.has(o,r)?Reflect.get(o,r,n):s=>(e[r]=String(s),t)}});return t}var V={};L(V,{logo:()=>B});var B={};L(B,{default:()=>le});var le='data:image/svg+xml,<?xml version="1.0" encoding="UTF-8"?>%0D%0A<svg fill="none" version="1.1" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">%0D%0A <g transform="matrix(1,0,0,-1,0,80)">%0D%0A <g transform="matrix(1,0,0,-1,0,160)">%0D%0A <path%0D%0A d="m9.4332 86.067-1.7864-1.782c-4.6571 3.6624-7.6468 9.3405-7.6468 15.715 0 5.3448 2.1018 10.2 5.5258 13.788l1.7728-1.7684c-2.9708-3.1349-4.7924-7.365-4.7924-12.019 0-5.6848 2.7174-10.737 6.927-13.933zm2.7405 29.575-1.8541 1.8496c2.8814 1.5984 6.1991 2.5088 9.7299 2.5088 10.396 0 18.945-7.8934 19.95-18h-2.5205c-0.9949 8.7231-8.4191 15.5-17.43 15.5-2.8321 0-5.5075-0.6695-7.8758-1.8584zm19.256-28.96 1.6169-1.9102c-3.5-2.9753-8.0385-4.7712-12.997-4.7712-1.6482 0-3.2499 0.19838-4.7825 0.57251l2.1313 2.126c0.8646-0.13074 1.75-0.19853 2.6512-0.19853 4.3427 0 8.3169 1.574 11.38 4.1814z"%0D%0A fill="%2330D34B" fill-rule="evenodd" />%0D%0A <path%0D%0A d="m20.05 86.045v-0.045285c-6.0798 0-11.257 3.8564-13.207 9.2507-1.9631 5.3748-0.47868 11.63 4.1686 15.519 5.4162 4.5336 13.258 4.2889 18.375-0.2846l-0.0192-0.0161c2.4219-2.1464 4.0939-5.1163 4.5748-8.4695h-5.0945q-0.1527 0.6663-0.4092 1.3128-0.6879 1.7331-2.0091 3.0512-1.3213 1.318-3.0587 2.0041-1.6001 0.6319-3.3211 0.6319-1.7209 0-3.321-0.6319-1.7374-0.6861-3.0587-2.0041-1.3213-1.3181-2.0091-3.0512-0.63347-1.5961-0.63346-3.3128 0-1.5702 0.52996-3.0395 0.54154-1.4842 1.5643-2.7 1.1062-1.3151 2.62-2.1316 1.6437-0.8866 3.5051-1.049 1.8615-0.16246 3.6345 0.42595 1.633 0.54193 2.9513 1.6454l3.2219-3.8302c-2.6269-2.1988-5.8244-3.2736-9.0047-3.2757z"%0D%0A fill="%231E9F33" fill-rule="evenodd" />%0D%0A </g>%0D%0A </g>%0D%0A</svg>';function Q(e){return e==null?!1:typeof e=="number"?isFinite(e):typeof e=="string"?e.trim()!==""&&!isNaN(Number(e)):!1}var M=b({props:{v1:{transform:Number,shadow:0,validate:Q,required:!0,uploadable:!0,downloadable:!0},v2:{transform:Number,shadow:0,validate:Q,required:!0,uploadable:!0,downloadable:!0}}},e=>a("div").append(e.v1,"+",e.v2,"=",T(()=>e.v1.get()+e.v2.get(),[e.v1,e.v2]),a("button").textContent("\u4E0B\u6E38 v1 -1").on("click",()=>e.v1.set(e.v1.get()-1)),a("button").textContent("\u4E0B\u6E38 v2 -1").on("click",()=>e.v2.set(e.v2.get()-1))));var X=b({props:{value:{validate:Number.isInteger,transform:Number,required:!1,shadow:0,downloadable:!0,uploadable:!0}}},e=>{let t=T(()=>e.value.get()*2,[e.value]);return a("div").use(F().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",a("br"),a("button").on("click",()=>e.value.set(e.value.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),a("button").on("click",()=>e.value.set(e.value.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),a("br"),"\u5F53\u524D\u503C\uFF1A",e.value,"\u53CC\u500D\u503C\uFF1A",t,T(()=>q(t.get(),()=>a("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[t]),K(()=>e.value.get()>10,()=>a("p").textContent("count > 10 \u65F6\u663E\u793A"),[e.value]))});var Y=b({},()=>{let e=d(10),t=d(20);return a("div").append("v1:",e,"v2:",t,M({v1:e,v2:t}),a("button").textContent("\u4E0A\u6E38 v1 +1").on("click",()=>e.set(e.get()+1)),a("button").textContent("\u4E0A\u6E38 v2 +1").on("click",()=>t.set(t.get()+1)))});var _={Counter:X,AddExpression:M,ValuePot:Y};0&&(module.exports={$,EventSubcriber,assets,camelToHyphen,createArray,createComponent,examples,hyphenToCamel,isRenderResult,isTreeContext,isWrapper,putIn,render,renderResultSymbol,styleSet,sync,tree,treeContextSymbol,typedIsArray,when,wrap,wrapperSymbol});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/channel/event-subcriber.ts","../src/util/char.ts","../src/dom/reactive.ts","../src/util/array.ts","../src/dom/tree.ts","../src/exceptions/index.ts","../src/dom/property.ts","../src/dom/slot.ts","../src/dom/component.ts","../src/dom/style.ts","../src/assets/index.ts","../src/builtins/Counter.ts","../src/builtins/index.ts"],"sourcesContent":["export * from \"./channel\";\r\nexport * from \"./dom\";\r\nexport * from \"./util\";\r\n\r\nexport * as assets from \"./assets\";\r\nexport { default as builtins } from \"./builtins\";\r\n","interface SubcriberCallback<T extends unknown[]> {\r\n (...data: T): void;\r\n}\r\ninterface Subcriber<T extends unknown[]> {\r\n callback: SubcriberCallback<T>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[]> {\r\n private subcribers: Subcriber<T>[] = [];\r\n\r\n subcribe(callback: SubcriberCallback<T>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n async once() {\r\n return new Promise<{ data: T }>((resolve) => {\r\n this.subcribe((...data) => resolve({ data }), true);\r\n });\r\n }\r\n emit(...data: T) {\r\n for (const subcriber of this.subcribers) {\r\n subcriber.callback(...data);\r\n }\r\n }\r\n}","export function camelToHyphen(str: string) {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\r\n}\r\nexport function hyphenToCamel(str: string) {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n}","import { EventSubcriber } from \"@/channel/event-subcriber\";\r\nimport { TreeResult } from \"./component\";\r\n\r\nexport const wrapperSymbol = Symbol(\"WrapperFlag\");\r\nexport type Wrapper<T> = {\r\n get(): T;\r\n set(newData: T): void;\r\n emitEvent(newData: T, oldData: T): void;\r\n updateOnly(): void;\r\n event: EventSubcriber<[T, T]>;\r\n} & { [K in typeof wrapperSymbol]: true; };\r\nexport function wrap<T>(initialData: T): Wrapper<T> {\r\n const arrayActions = [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\"];\r\n const patch = (data: T) => {\r\n if (!Array.isArray(data)) { return data; }\r\n const { proxy, revoke: newRevoke } = Proxy.revocable(data, {\r\n get(target, p: string, receiver) {\r\n if (arrayActions.includes(p)) {\r\n const originalMethod = Reflect.get(target, p, receiver) as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === \"function\") {\r\n return (...args: unknown[]) => {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = originalMethod.call(target, ...args);\r\n wrapper.emitEvent(wrapper.get(), oldData);\r\n return result;\r\n }\r\n };\r\n } else return Reflect.get(target, p, receiver);\r\n } else {\r\n return Reflect.get(target, p, receiver);\r\n }\r\n },\r\n set(target, p, newValue, receiver) {\r\n const oldValue = Reflect.get(target, p, receiver);\r\n if (oldValue !== newValue) {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = Reflect.set(target, p, newValue, receiver);\r\n wrapper.emitEvent(wrapper.get(), oldData);\r\n return result;\r\n }\r\n }\r\n return Reflect.set(target, p, newValue, receiver);\r\n },\r\n });\r\n oldRevoke = newRevoke;\r\n return proxy;\r\n };\r\n const event = new EventSubcriber<[T, T]>();\r\n let oldRevoke: (() => void) | null = null;\r\n let currentData = patch(initialData);\r\n const wrapper: Wrapper<T> = {\r\n get() { return currentData; },\r\n set(newData) {\r\n if (currentData !== newData) {\r\n const oldData = currentData;\r\n if (Array.isArray(oldData) && oldRevoke) {\r\n oldRevoke();\r\n currentData = patch(newData);\r\n } else {\r\n currentData = newData;\r\n };\r\n this.emitEvent(newData, oldData);\r\n }\r\n },\r\n emitEvent(newData, oldData) {\r\n event.emit(newData, oldData);\r\n },\r\n updateOnly() {\r\n this.emitEvent(this.get(), this.get());\r\n },\r\n event,\r\n [wrapperSymbol]: true\r\n };\r\n return wrapper;\r\n}\r\nexport function sync<R>(effectRenderer: () => R, dependencies: unknown[] = []): Wrapper<R> {\r\n const internalWrapper = wrap(effectRenderer());\r\n const update = () => {\r\n const newData = effectRenderer();\r\n const currentData = internalWrapper.get();\r\n const hasChanged = currentData !== newData;\r\n if (hasChanged) {\r\n internalWrapper.set(newData);\r\n }\r\n };\r\n for (const dependency of dependencies) {\r\n if (!isWrapper(dependency)) continue;\r\n dependency.event.subcribe(update);\r\n }\r\n return internalWrapper;\r\n}\r\nexport function when(condition: Wrapper<boolean> | (() => boolean), tree: () => TreeResult, dependencies: unknown[] = []) {\r\n return sync(() => {\r\n let result: boolean;\r\n if (typeof condition === \"function\") {\r\n result = condition();\r\n } else {\r\n result = condition.get();\r\n }\r\n return [result ? tree() : null];\r\n }, [...dependencies, ...(isWrapper(condition) ? [condition] : [])]);\r\n}\r\nexport function isWrapper<T>(data: unknown): data is Wrapper<T> {\r\n return !!data && Object.hasOwn(data, wrapperSymbol) && data[wrapperSymbol] === true;\r\n}\r\n","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIn<T>(data: T) {\r\n return [...(Array.isArray(data) ? data : [data])] as T extends (infer R)[] ? R[] : [T];\r\n}\r\nexport function createArray<T>(length: number, filler: () => T): T[] {\r\n return new Array(length).fill(0).map(filler);\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, TreeResult } from \"./component\";\r\nimport { isWrapper, Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIn } from \"@/util/array\";\r\n\r\nexport type TreeContext<T extends HTMLElement = HTMLElement> = {\r\n [K in keyof T as T[K] extends (...args: unknown[]) => unknown ? never : K]: (data: T[K] | Wrapper<T[K]>) => TreeContext<T>;\r\n} & {\r\n element: T;\r\n append(...children: (\r\n TreeResult |\r\n TreeResult[] |\r\n Wrapper<TreeResult> |\r\n Wrapper<TreeResult[]> |\r\n Wrapper<TreeResult | TreeResult[]>\r\n )[]): TreeContext<T>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): TreeContext<T>;\r\n on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): TreeContext<T>;\r\n};\r\nexport function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const context: TreeContext<HTMLElementTagNameMap[E]> = new Proxy({\r\n element,\r\n append(...children: (TreeResult | TreeResult[] | Wrapper<TreeResult | TreeResult[]>)[]) {\r\n for (const child of children) {\r\n if (isWrapper<TreeResult | TreeResult[]>(child)) {\r\n let oldChildren: TreeContext[] = [];\r\n const baseAnchor = new Comment(\"Tree anchor\");\r\n element.appendChild(baseAnchor);\r\n const update = (newTrees: TreeResult[] | TreeResult) => {\r\n const normalizedTrees = [...(Array.isArray(newTrees) ? newTrees : [newTrees])];\r\n const newChildren: TreeContext[] = [];\r\n for (const newTree of normalizedTrees) {\r\n const child = render(newTree);\r\n newChildren.push(child);\r\n element.insertBefore(child.element, baseAnchor.nextSibling);\r\n }\r\n for (const oldChild of oldChildren) {\r\n oldChild.element.remove();\r\n }\r\n oldChildren = newChildren;\r\n };\r\n child.event.subcribe(update);\r\n update(child.get());\r\n } else {\r\n const children = child;\r\n for (const child of putIn(children)) {\r\n element.appendChild(render(child).element);\r\n }\r\n }\r\n }\r\n return context;\r\n },\r\n use(styleSet: StyleSet | Wrapper<StyleSet>) {\r\n if (element instanceof HTMLElement) {\r\n const update = (rules: Record<string, string>) => {\r\n for (const [key, value] of Object.entries(rules)) {\r\n element.style.setProperty(camelToHyphen(String(key)), value);\r\n }\r\n };\r\n if (isWrapper<StyleSet>(styleSet)) {\r\n styleSet.event.subcribe((newData) => update(newData.rules));\r\n update(styleSet.get().rules);\r\n } else {\r\n update(styleSet.rules);\r\n }\r\n }\r\n return context;\r\n },\r\n on(key, handler, options) {\r\n if (element instanceof HTMLElement) {\r\n element.addEventListener(key, handler, options);\r\n }\r\n return context;\r\n },\r\n } as TreeContext<HTMLElementTagNameMap[E]>, {\r\n get<P extends keyof Node>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: HTMLElementTagNameMap[E][P] | Wrapper<HTMLElementTagNameMap[E][P]>) => {\r\n if (isWrapper<HTMLElementTagNameMap[E][P]>(data)) {\r\n const update = (newData: HTMLElementTagNameMap[E][P]) => element[p] = newData;\r\n data.event.subcribe(update);\r\n update(data.get());\r\n } else {\r\n element[p] = data;\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingFieldError extends Error { }\r\nexport class ConflictionError extends Error { }","import { Normalize } from \"@/util\";\r\nimport { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, ComponentPropertyStore } from \"./component\";\r\nimport { ConflictionError, MissingFieldError, ValidationFailed } from \"@/exceptions\";\r\n\r\nexport function normalizePropertyDescriptor\r\n <I, O, R extends boolean>(\r\n descriptor: ComponentPropertyDescriptor<I, O, R>\r\n ): Required<ComponentPropertyDescriptor<I, O, R>> {\r\n return Object.assign({\r\n validate: () => true,\r\n transform: x => x,\r\n shadow: null,\r\n required: false\r\n } satisfies Required<ComponentPropertyDescriptor>, descriptor);\r\n}\r\nexport function validateStore(store: ComponentPropertyStore) {\r\n for (const propertyKey in store) {\r\n const descriptor = store[propertyKey];\r\n if (descriptor.shadow) {\r\n if (descriptor.required) {\r\n throw new ConflictionError(`The required property ${propertyKey} can't have a shadow.`);\r\n }\r\n if (descriptor.validate && !descriptor.validate(descriptor.shadow)) {\r\n throw new ValidationFailed(`The shadow of ${propertyKey} can't pass the validation.`);\r\n }\r\n }\r\n }\r\n}\r\nexport function composeDict<T extends ComponentPropertyStore>(input?: ComponentPropertyInputDict<T>, store?: T) {\r\n if (!input) input = {} as ComponentPropertyInputDict<T>;\r\n const result: Record<string, unknown> = {};\r\n for (const propertyKey in store) {\r\n const descriptor = normalizePropertyDescriptor(store[propertyKey]);\r\n if (!Object.hasOwn(input, propertyKey)) {\r\n if (descriptor.required) {\r\n throw new MissingFieldError(`Missing a required property ${propertyKey}.`);\r\n }\r\n result[propertyKey] = descriptor.shadow;\r\n continue;\r\n }\r\n const value = input[propertyKey];\r\n if (!descriptor.validate(value)) {\r\n throw new ValidationFailed(`The input value of ${propertyKey} can't pass the validation.`);\r\n }\r\n result[propertyKey] = descriptor.transform(value);\r\n }\r\n return result as ComponentPropertyOutputDict<T>;\r\n}","import { TreeResult } from \"./component\";\r\nimport { isWrapper, wrap, Wrapper } from \"./reactive\";\r\n\r\nexport type RawSlotInput = TreeResult | (() => TreeResult);\r\nexport type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;\r\nexport type SlotOutput = Wrapper<TreeResult>;\r\n\r\nexport function pipeExtract(input: SlotInput): SlotOutput {\r\n if (typeof input === \"function\") {\r\n return wrap(input());\r\n } else if (isWrapper<RawSlotInput>(input)) {\r\n return pipeExtract(input);\r\n } else return wrap(input);\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { TreeContext, tree } from \"./tree\";\r\nimport { composeDict, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\r\n\r\nexport type RenderResult = {\r\n mount(to: string | HTMLElement): void;\r\n $: TreeContext;\r\n} & { [K in typeof renderResultSymbol]: true; };\r\n\r\nexport type TreeResult = HTMLElement | TreeContext | string | number | EmptyValue | RenderResult;\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;\r\n}\r\nexport type Component<P extends ComponentPropertyStore> =\r\n ComponentRenderEntry<P> & ComponentOption<P>;\r\nexport interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {\r\n validate?: (data: I) => boolean;\r\n transform: (data: I) => O;\r\n shadow?: O;\r\n required?: R;\r\n}\r\nexport type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;\r\nexport type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P as P[K][\"required\"] extends true ? K : never]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R : never;\r\n} & {\r\n [K in keyof P as P[K][\"required\"] extends false | unknown ? K : never]?:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | (P[K][\"shadow\"] extends unknown ? EmptyValue : R) : never;\r\n}\r\nexport type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R : never;\r\n};\r\nexport interface ComponentOption<P extends ComponentPropertyStore> {\r\n props?: P;\r\n}\r\nexport const renderResultSymbol = Symbol(\"RenderResultFlag\");\r\nexport function isRenderResult(data: unknown): data is RenderResult {\r\n return !!data && Object.hasOwn(data, renderResultSymbol) && data[renderResultSymbol] === true;\r\n}\r\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<TreeResult>;\r\n}\r\nexport function render(nodeTree: TreeResult) {\r\n let result: TreeContext;\r\n if (nodeTree instanceof HTMLElement) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\") {\r\n result = tree(new Text(String(nodeTree)));\r\n } else if (isRenderResult(nodeTree)) {\r\n result = nodeTree.$;\r\n } else if (!nodeTree) {\r\n result = tree(new Comment(\"Empty tree context\"));\r\n } else {\r\n result = nodeTree;\r\n }\r\n return result;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore\r\n>(\r\n options: ComponentOption<P>,\r\n internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult\r\n): Component<P> {\r\n validateStore(options.props ?? {});\r\n const propStore = Object.fromEntries(\r\n Object\r\n .entries(options.props ?? {})\r\n .map(([key, value]) => [\r\n key,\r\n normalizePropertyDescriptor(value),\r\n ])\r\n ) as P;\r\n const entryRenderer = (props?: ComponentPropertyInputDict<P>, slot?: SlotInput) => {\r\n const nodeTree = internalRenderer(composeDict(props, propStore), pipeExtract(slot));\r\n const result = render(nodeTree);\r\n return {\r\n mount(to: string | HTMLElement) {\r\n const targets = typeof to === \"string\" ? [...document.querySelectorAll<HTMLElement>(to)] : [to];\r\n for (const target of targets) {\r\n target.appendChild(result.element);\r\n }\r\n },\r\n $: result,\r\n [renderResultSymbol]: true as const\r\n };\r\n };\r\n return Object.assign(entryRenderer, {\r\n props: propStore\r\n } satisfies ComponentOption<P>);\r\n}","export type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n toString(): string;\r\n};\r\nexport function styleSet() {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n } as StyleSet, {\r\n get<P extends string & keyof CSSStyleDeclaration>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: CSSStyleDeclaration[P]) => {\r\n rules[p] = String(data);\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export * as logo from \"./logo.svg\";\r\n","import { $, createComponent, tree, wrap } from \"@\";\r\n\r\nexport default createComponent({\r\n props: {\r\n initialValue: {\r\n transform: Number,\r\n validate: Number.isInteger,\r\n // shadow: 0,\r\n // required: false\r\n }\r\n }\r\n}, (props) => {\r\n const currentValue = wrap(props.initialValue);\r\n return tree(\"div\")\r\n .append(\r\n \"当前数值:\", $(currentValue),\r\n tree(\"button\")\r\n .textContent(\"点击加一\")\r\n .on(\"click\", () => currentValue.set(currentValue.get() + 1)),\r\n tree(\"button\")\r\n .textContent(\"点击减一\")\r\n .on(\"click\", () => currentValue.set(currentValue.get() - 1))\r\n );\r\n});","import Counter from \"./Counter\";\r\n\r\nexport default { Counter };"],"mappings":"yaAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,4BAAAE,EAAA,WAAAC,EAAA,aAAAC,EAAA,kBAAAC,EAAA,gBAAAC,EAAA,oBAAAC,EAAA,kBAAAC,EAAA,mBAAAC,EAAA,cAAAC,EAAA,UAAAC,EAAA,WAAAC,EAAA,uBAAAC,EAAA,aAAAC,EAAA,SAAAC,EAAA,SAAAC,EAAA,iBAAAC,EAAA,SAAAC,EAAA,SAAAC,EAAA,kBAAAC,IAAA,eAAAC,EAAArB,ICOO,IAAMsB,EAAN,KAA0C,CACrC,WAA6B,CAAC,EAEtC,SAASC,EAAgCC,EAAO,GAAO,CACnD,KAAK,WAAW,KAAK,CACjB,SAAAD,EACA,KAAAC,CACJ,CAAC,CACL,CACA,MAAM,MAAO,CACT,OAAO,IAAI,QAAsBC,GAAY,CACzC,KAAK,SAAS,IAAIC,IAASD,EAAQ,CAAE,KAAAC,CAAK,CAAC,EAAG,EAAI,CACtD,CAAC,CACL,CACA,QAAQA,EAAS,CACb,QAAWC,KAAa,KAAK,WACzBA,EAAU,SAAS,GAAGD,CAAI,CAElC,CACJ,EC1BO,SAASE,EAAcC,EAAa,CACvC,OAAOA,EAAI,QAAQ,SAAUC,GAAU,IAAIA,EAAO,YAAY,CAAC,EAAE,CACrE,CACO,SAASC,EAAcF,EAAa,CACvC,OAAOA,EAAI,QAAQ,YAAcG,GAAMA,EAAE,CAAC,EAAE,YAAY,CAAC,CAC7D,CCFO,IAAMC,EAAgB,OAAO,aAAa,EAQ1C,SAASC,EAAQC,EAA4B,CAChD,IAAMC,EAAe,CAAC,OAAQ,MAAO,QAAS,UAAW,SAAU,OAAQ,SAAS,EAC9EC,EAASC,GAAY,CACvB,GAAI,CAAC,MAAM,QAAQA,CAAI,EAAK,OAAOA,EACnC,GAAM,CAAE,MAAAC,EAAO,OAAQC,CAAU,EAAI,MAAM,UAAUF,EAAM,CACvD,IAAIG,EAAQC,EAAWC,EAAU,CAC7B,GAAIP,EAAa,SAASM,CAAC,EAAG,CAC1B,IAAME,EAAiB,QAAQ,IAAIH,EAAQC,EAAGC,CAAQ,EACtD,OAAI,OAAOC,GAAmB,WACnB,IAAIC,IAAoB,CAC3B,IAAIC,EAAUC,EAAQ,IAAI,EAC1B,GAAI,MAAM,QAAQD,CAAO,EAAG,CACxBA,EAAU,CAAC,GAAGA,CAAO,EACrB,IAAME,EAASJ,EAAe,KAAKH,EAAQ,GAAGI,CAAI,EAClD,OAAAE,EAAQ,UAAUA,EAAQ,IAAI,EAAGD,CAAO,EACjCE,CACX,CACJ,EACU,QAAQ,IAAIP,EAAQC,EAAGC,CAAQ,CACjD,KACI,QAAO,QAAQ,IAAIF,EAAQC,EAAGC,CAAQ,CAE9C,EACA,IAAIF,EAAQC,EAAGO,EAAUN,EAAU,CAE/B,GADiB,QAAQ,IAAIF,EAAQC,EAAGC,CAAQ,IAC/BM,EAAU,CACvB,IAAIH,EAAUC,EAAQ,IAAI,EAC1B,GAAI,MAAM,QAAQD,CAAO,EAAG,CACxBA,EAAU,CAAC,GAAGA,CAAO,EACrB,IAAME,EAAS,QAAQ,IAAIP,EAAQC,EAAGO,EAAUN,CAAQ,EACxD,OAAAI,EAAQ,UAAUA,EAAQ,IAAI,EAAGD,CAAO,EACjCE,CACX,CACJ,CACA,OAAO,QAAQ,IAAIP,EAAQC,EAAGO,EAAUN,CAAQ,CACpD,CACJ,CAAC,EACD,OAAAO,EAAYV,EACLD,CACX,EACMY,EAAQ,IAAIC,EACdF,EAAiC,KACjCG,EAAchB,EAAMF,CAAW,EAC7BY,EAAsB,CACxB,KAAM,CAAE,OAAOM,CAAa,EAC5B,IAAIC,EAAS,CACT,GAAID,IAAgBC,EAAS,CACzB,IAAMR,EAAUO,EACZ,MAAM,QAAQP,CAAO,GAAKI,GAC1BA,EAAU,EACVG,EAAchB,EAAMiB,CAAO,GAE3BD,EAAcC,EAElB,KAAK,UAAUA,EAASR,CAAO,CACnC,CACJ,EACA,UAAUQ,EAASR,EAAS,CACxBK,EAAM,KAAKG,EAASR,CAAO,CAC/B,EACA,YAAa,CACT,KAAK,UAAU,KAAK,IAAI,EAAG,KAAK,IAAI,CAAC,CACzC,EACA,MAAAK,EACA,CAAClB,CAAa,EAAG,EACrB,EACA,OAAOc,CACX,CACO,SAASQ,EAAQC,EAAyBC,EAA0B,CAAC,EAAe,CACvF,IAAMC,EAAkBxB,EAAKsB,EAAe,CAAC,EACvCG,EAAS,IAAM,CACjB,IAAML,EAAUE,EAAe,EACXE,EAAgB,IAAI,IACLJ,GAE/BI,EAAgB,IAAIJ,CAAO,CAEnC,EACA,QAAWM,KAAcH,EAChBI,EAAUD,CAAU,GACzBA,EAAW,MAAM,SAASD,CAAM,EAEpC,OAAOD,CACX,CACO,SAASI,EAAKC,EAA+CC,EAAwBP,EAA0B,CAAC,EAAG,CACtH,OAAOF,EAAK,IAAM,CACd,IAAIP,EACJ,OAAI,OAAOe,GAAc,WACrBf,EAASe,EAAU,EAEnBf,EAASe,EAAU,IAAI,EAEpB,CAACf,EAASgB,EAAK,EAAI,IAAI,CAClC,EAAG,CAAC,GAAGP,EAAc,GAAII,EAAUE,CAAS,EAAI,CAACA,CAAS,EAAI,CAAC,CAAE,CAAC,CACtE,CACO,SAASF,EAAavB,EAAmC,CAC5D,MAAO,CAAC,CAACA,GAAQ,OAAO,OAAOA,EAAML,CAAa,GAAKK,EAAKL,CAAa,IAAM,EACnF,CC5GO,SAASgC,EAAgBC,EAA4B,CACxD,OAAO,MAAM,QAAQA,CAAG,CAC5B,CACO,SAASC,EAASC,EAAS,CAC9B,MAAO,CAAC,GAAI,MAAM,QAAQA,CAAI,EAAIA,EAAO,CAACA,CAAI,CAAE,CACpD,CACO,SAASC,EAAeC,EAAgBC,EAAsB,CACjE,OAAO,IAAI,MAAMD,CAAM,EAAE,KAAK,CAAC,EAAE,IAAIC,CAAM,CAC/C,CCYO,SAASC,EAA4CC,EAAgB,CACxE,IAAMC,EAAgB,OAAOD,GAAS,SAAW,SAAS,cAAcA,CAAI,EAAIA,EAC1EE,EAAiD,IAAI,MAAM,CAC7D,QAAAD,EACA,UAAUE,EAA8E,CACpF,QAAWC,KAASD,EAChB,GAAIE,EAAqCD,CAAK,EAAG,CAC7C,IAAIE,EAA6B,CAAC,EAC5BC,EAAa,IAAI,QAAQ,aAAa,EAC5CN,EAAQ,YAAYM,CAAU,EAC9B,IAAMC,EAAUC,GAAwC,CACpD,IAAMC,EAAkB,CAAC,GAAI,MAAM,QAAQD,CAAQ,EAAIA,EAAW,CAACA,CAAQ,CAAE,EACvEE,EAA6B,CAAC,EACpC,QAAWC,KAAWF,EAAiB,CACnC,IAAMN,EAAQS,EAAOD,CAAO,EAC5BD,EAAY,KAAKP,CAAK,EACtBH,EAAQ,aAAaG,EAAM,QAASG,EAAW,WAAW,CAC9D,CACA,QAAWO,KAAYR,EACnBQ,EAAS,QAAQ,OAAO,EAE5BR,EAAcK,CAClB,EACAP,EAAM,MAAM,SAASI,CAAM,EAC3BA,EAAOJ,EAAM,IAAI,CAAC,CACtB,KAAO,CACH,IAAMD,EAAWC,EACjB,QAAWA,KAASW,EAAMZ,CAAQ,EAC9BF,EAAQ,YAAYY,EAAOT,CAAK,EAAE,OAAO,CAEjD,CAEJ,OAAOF,CACX,EACA,IAAIc,EAAwC,CACxC,GAAIf,aAAmB,YAAa,CAChC,IAAMO,EAAUS,GAAkC,CAC9C,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQF,CAAK,EAC3ChB,EAAQ,MAAM,YAAYmB,EAAc,OAAOF,CAAG,CAAC,EAAGC,CAAK,CAEnE,EACId,EAAoBW,CAAQ,GAC5BA,EAAS,MAAM,SAAUK,GAAYb,EAAOa,EAAQ,KAAK,CAAC,EAC1Db,EAAOQ,EAAS,IAAI,EAAE,KAAK,GAE3BR,EAAOQ,EAAS,KAAK,CAE7B,CACA,OAAOd,CACX,EACA,GAAGgB,EAAKI,EAASC,EAAS,CACtB,OAAItB,aAAmB,aACnBA,EAAQ,iBAAiBiB,EAAKI,EAASC,CAAO,EAE3CrB,CACX,CACJ,EAA4C,CACxC,IAA0BsB,EAAiCC,EAAMC,EAAmB,CAChF,OAAI,QAAQ,IAAIF,EAAQC,CAAC,EACd,QAAQ,IAAID,EAAQC,EAAGC,CAAQ,EAE9B1B,GAA6E,CACjF,GAAIK,EAAuCL,CAAI,EAAG,CAC9C,IAAMQ,EAAUa,GAAyCpB,EAAQwB,CAAC,EAAIJ,EACtErB,EAAK,MAAM,SAASQ,CAAM,EAC1BA,EAAOR,EAAK,IAAI,CAAC,CACrB,MACIC,EAAQwB,CAAC,EAAIzB,EAEjB,OAAOE,CACX,CAER,CACJ,CAAC,EACD,OAAOA,CACX,CC/FO,IAAMyB,EAAN,cAA+B,KAAM,CAAE,EACjCC,EAAN,cAAgC,KAAM,CAAE,EAClCC,EAAN,cAA+B,KAAM,CAAE,ECEvC,SAASC,EAERC,EAC8C,CAClD,OAAO,OAAO,OAAO,CACjB,SAAU,IAAM,GAChB,UAAWC,GAAKA,EAChB,OAAQ,KACR,SAAU,EACd,EAAmDD,CAAU,CACjE,CACO,SAASE,EAAcC,EAA+B,CACzD,QAAWC,KAAeD,EAAO,CAC7B,IAAMH,EAAaG,EAAMC,CAAW,EACpC,GAAIJ,EAAW,OAAQ,CACnB,GAAIA,EAAW,SACX,MAAM,IAAIK,EAAiB,yBAAyBD,CAAW,uBAAuB,EAE1F,GAAIJ,EAAW,UAAY,CAACA,EAAW,SAASA,EAAW,MAAM,EAC7D,MAAM,IAAIM,EAAiB,iBAAiBF,CAAW,6BAA6B,CAE5F,CACJ,CACJ,CACO,SAASG,EAA8CC,EAAuCL,EAAW,CACvGK,IAAOA,EAAQ,CAAC,GACrB,IAAMC,EAAkC,CAAC,EACzC,QAAWL,KAAeD,EAAO,CAC7B,IAAMH,EAAaD,EAA4BI,EAAMC,CAAW,CAAC,EACjE,GAAI,CAAC,OAAO,OAAOI,EAAOJ,CAAW,EAAG,CACpC,GAAIJ,EAAW,SACX,MAAM,IAAIU,EAAkB,+BAA+BN,CAAW,GAAG,EAE7EK,EAAOL,CAAW,EAAIJ,EAAW,OACjC,QACJ,CACA,IAAMW,EAAQH,EAAMJ,CAAW,EAC/B,GAAI,CAACJ,EAAW,SAASW,CAAK,EAC1B,MAAM,IAAIL,EAAiB,sBAAsBF,CAAW,6BAA6B,EAE7FK,EAAOL,CAAW,EAAIJ,EAAW,UAAUW,CAAK,CACpD,CACA,OAAOF,CACX,CCxCO,SAASG,EAAYC,EAA8B,CACtD,OAAI,OAAOA,GAAU,WACVC,EAAKD,EAAM,CAAC,EACZE,EAAwBF,CAAK,EAC7BD,EAAYC,CAAK,EACdC,EAAKD,CAAK,CAC5B,CC4BO,IAAMG,EAAqB,OAAO,kBAAkB,EACpD,SAASC,EAAeC,EAAqC,CAChE,MAAO,CAAC,CAACA,GAAQ,OAAO,OAAOA,EAAMF,CAAkB,GAAKE,EAAKF,CAAkB,IAAM,EAC7F,CACO,SAAS,EAAKE,EAAkB,CACnC,OAAOA,CACX,CACO,SAASC,EAAOC,EAAsB,CACzC,IAAIC,EACJ,OAAID,aAAoB,YACpBC,EAASC,EAAKF,CAAQ,EACf,OAAOA,GAAa,UAAY,OAAOA,GAAa,SAC3DC,EAASC,EAAK,IAAI,KAAK,OAAOF,CAAQ,CAAC,CAAC,EACjCH,EAAeG,CAAQ,EAC9BC,EAASD,EAAS,EACVA,EAGRC,EAASD,EAFTC,EAASC,EAAK,IAAI,QAAQ,oBAAoB,CAAC,EAI5CD,CACX,CACO,SAASE,EAGZC,EACAC,EACY,CACZC,EAAcF,EAAQ,OAAS,CAAC,CAAC,EACjC,IAAMG,EAAY,OAAO,YACrB,OACK,QAAQH,EAAQ,OAAS,CAAC,CAAC,EAC3B,IAAI,CAAC,CAACI,EAAKC,CAAK,IAAM,CACnBD,EACAE,EAA4BD,CAAK,CACrC,CAAC,CACT,EAeA,OAAO,OAAO,OAdQ,CAACE,EAAuCC,IAAqB,CAC/E,IAAMZ,EAAWK,EAAiBQ,EAAYF,EAAOJ,CAAS,EAAGO,EAAYF,CAAI,CAAC,EAC5EX,EAASF,EAAOC,CAAQ,EAC9B,MAAO,CACH,MAAMe,EAA0B,CAC5B,IAAMC,EAAU,OAAOD,GAAO,SAAW,CAAC,GAAG,SAAS,iBAA8BA,CAAE,CAAC,EAAI,CAACA,CAAE,EAC9F,QAAWE,KAAUD,EACjBC,EAAO,YAAYhB,EAAO,OAAO,CAEzC,EACA,EAAGA,EACH,CAACL,CAAkB,EAAG,EAC1B,CACJ,EACoC,CAChC,MAAOW,CACX,CAA8B,CAClC,CCzFO,SAASW,GAAW,CACvB,IAAMC,EAAQ,CAAC,EACTC,EAAoB,IAAI,MAAM,CAChC,MAAAD,CACJ,EAAe,CACX,IAAkDE,EAAiCC,EAAMC,EAAmB,CACxG,OAAI,QAAQ,IAAIF,EAAQC,CAAC,EACd,QAAQ,IAAID,EAAQC,EAAGC,CAAQ,EAE9BC,IACJL,EAAMG,CAAC,EAAI,OAAOE,CAAI,EACfJ,EAGnB,CACJ,CAAC,EACD,OAAOA,CACX,CCvBA,IAAAK,EAAA,GAAAC,EAAAD,EAAA,UAAAE,I,gsDCEA,IAAOC,EAAQC,EAAgB,CAC3B,MAAO,CACH,aAAc,CACV,UAAW,OACX,SAAU,OAAO,SAGrB,CACJ,CACJ,EAAIC,GAAU,CACV,IAAMC,EAAeC,EAAKF,EAAM,YAAY,EAC5C,OAAOG,EAAK,KAAK,EACZ,OACG,iCAAWF,EACXE,EAAK,QAAQ,EACR,YAAY,0BAAM,EAClB,GAAG,QAAS,IAAMF,EAAa,IAAIA,EAAa,IAAI,EAAI,CAAC,CAAC,EAC/DE,EAAK,QAAQ,EACR,YAAY,0BAAM,EAClB,GAAG,QAAS,IAAMF,EAAa,IAAIA,EAAa,IAAI,EAAI,CAAC,CAAC,CACnE,CACR,CAAC,ECrBD,IAAOG,EAAQ,CAAE,QAAAC,CAAQ","names":["index_exports","__export","EventSubcriber","assets_exports","builtins_default","camelToHyphen","createArray","createComponent","hyphenToCamel","isRenderResult","isWrapper","putIn","render","renderResultSymbol","styleSet","sync","tree","typedIsArray","when","wrap","wrapperSymbol","__toCommonJS","EventSubcriber","callback","once","resolve","data","subcriber","camelToHyphen","str","letter","hyphenToCamel","g","wrapperSymbol","wrap","initialData","arrayActions","patch","data","proxy","newRevoke","target","p","receiver","originalMethod","args","oldData","wrapper","result","newValue","oldRevoke","event","EventSubcriber","currentData","newData","sync","effectRenderer","dependencies","internalWrapper","update","dependency","isWrapper","when","condition","tree","typedIsArray","arr","putIn","data","createArray","length","filler","tree","data","element","context","children","child","isWrapper","oldChildren","baseAnchor","update","newTrees","normalizedTrees","newChildren","newTree","render","oldChild","putIn","styleSet","rules","key","value","camelToHyphen","newData","handler","options","target","p","receiver","ValidationFailed","MissingFieldError","ConflictionError","normalizePropertyDescriptor","descriptor","x","validateStore","store","propertyKey","ConflictionError","ValidationFailed","composeDict","input","result","MissingFieldError","value","pipeExtract","input","wrap","isWrapper","renderResultSymbol","isRenderResult","data","render","nodeTree","result","tree","createComponent","options","internalRenderer","validateStore","propStore","key","value","normalizePropertyDescriptor","props","slot","composeDict","pipeExtract","to","targets","target","styleSet","rules","context","target","p","receiver","data","assets_exports","__export","logo_exports","Counter_default","createComponent","props","currentValue","wrap","tree","builtins_default","Counter_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/channel/event-subcriber.ts","../src/util/char.ts","../src/dom/reactive.ts","../src/util/array.ts","../src/dom/tree.ts","../src/exceptions/index.ts","../src/dom/property.ts","../src/dom/slot.ts","../src/dom/component.ts","../src/dom/style.ts","../src/assets/index.ts","../src/examples/AddExpression.ts","../src/examples/Counter.ts","../src/examples/ValuePot.ts","../src/examples/index.ts"],"sourcesContent":["export * from \"./channel\";\r\nexport * from \"./dom\";\r\nexport * from \"./util\";\r\n\r\nexport * as assets from \"./assets\";\r\nexport { default as examples } from \"./examples\";\r\n","interface SubcriberCallback<T extends unknown[]> {\r\n (...data: T): void;\r\n}\r\ninterface Subcriber<T extends unknown[]> {\r\n callback: SubcriberCallback<T>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[]> {\r\n private subcribers: Subcriber<T>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T) {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n for (const subcriber of this.subcribers) {\r\n subcriber.callback(...data);\r\n }\r\n this.emitting = false;\r\n }\r\n}","export function camelToHyphen(str: string) {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\r\n}\r\nexport function hyphenToCamel(str: string) {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n}","import { EventSubcriber } from \"@/channel/event-subcriber\";\r\nimport { TreeResult } from \"./component\";\r\n\r\nexport const wrapperSymbol = Symbol(\"WrapperFlag\");\r\nexport type Wrapper<T> = {\r\n get(): T;\r\n set(newData: T): void;\r\n updateOnly(): void;\r\n event: EventSubcriber<[T, T]>;\r\n} & { [K in typeof wrapperSymbol]: true; };\r\nexport function wrap<T>(initialData: T, wrapperOptions?: Partial<Wrapper<T>>): Wrapper<T> {\r\n const arrayActions = [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\"];\r\n const patch = (data: T) => {\r\n if (!Array.isArray(data)) { return data; }\r\n const { proxy, revoke: newRevoke } = Proxy.revocable(data, {\r\n get(target, p: string, receiver) {\r\n if (arrayActions.includes(p)) {\r\n const originalMethod = Reflect.get(target, p, receiver) as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === \"function\") {\r\n return (...args: unknown[]) => {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = originalMethod.call(target, ...args);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n };\r\n } else return Reflect.get(target, p, receiver);\r\n } else {\r\n return Reflect.get(target, p, receiver);\r\n }\r\n },\r\n set(target, p, newValue, receiver) {\r\n const oldValue = Reflect.get(target, p, receiver);\r\n if (oldValue !== newValue) {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = Reflect.set(target, p, newValue, receiver);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n }\r\n return Reflect.set(target, p, newValue, receiver);\r\n },\r\n });\r\n oldRevoke = newRevoke;\r\n return proxy;\r\n };\r\n const event = new EventSubcriber<[T, T]>();\r\n let oldRevoke: (() => void) | null = null;\r\n let currentData = patch(initialData);\r\n const wrapper: Wrapper<T> = {\r\n get() { return currentData; },\r\n set(newData) {\r\n if (currentData !== newData) {\r\n let oldData = currentData;\r\n if (Array.isArray(oldData) && oldRevoke) {\r\n oldRevoke();\r\n oldData = [...oldData] as T;\r\n currentData = patch(newData);\r\n } else {\r\n currentData = newData;\r\n };\r\n this.event.emit(newData, oldData);\r\n }\r\n },\r\n updateOnly() {\r\n this.event.emit(this.get(), this.get());\r\n },\r\n event,\r\n [wrapperSymbol]: true\r\n };\r\n return { ...wrapper, ...wrapperOptions ?? {} };\r\n}\r\nexport function sync<R>(effectRenderer: () => R, dependencies: unknown[] = []): Wrapper<R> {\r\n const internalWrapper = wrap(effectRenderer());\r\n const update = () => {\r\n const newData = effectRenderer();\r\n const currentData = internalWrapper.get();\r\n const hasChanged = currentData !== newData;\r\n if (hasChanged) {\r\n internalWrapper.set(newData);\r\n }\r\n };\r\n for (const dependency of dependencies) {\r\n if (!isWrapper(dependency)) continue;\r\n dependency.event.subcribe(update);\r\n }\r\n return internalWrapper;\r\n}\r\nexport function when(condition: Wrapper<boolean> | (() => boolean), tree: () => TreeResult, dependencies: unknown[] = []) {\r\n return sync(() => {\r\n let result: boolean;\r\n if (typeof condition === \"function\") {\r\n result = condition();\r\n } else {\r\n result = condition.get();\r\n }\r\n return [result ? tree() : null];\r\n }, [...dependencies, ...(isWrapper(condition) ? [condition] : [])]);\r\n}\r\nexport function isWrapper<T>(data: unknown): data is Wrapper<T> {\r\n return !!data && Object.hasOwn(data, wrapperSymbol) && data[wrapperSymbol] === true;\r\n}\r\n","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIn<T>(data: T) {\r\n return [...(Array.isArray(data) ? data : [data])] as T extends (infer R)[] ? R[] : [T];\r\n}\r\nexport function createArray<T>(length: number, filler: () => T): T[] {\r\n return new Array(length).fill(0).map(filler);\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, TreeResult } from \"./component\";\r\nimport { isWrapper, Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIn } from \"@/util/array\";\r\n\r\nexport type TreeContext<T extends HTMLElement = HTMLElement> = {\r\n [K in keyof T as T[K] extends (...args: unknown[]) => unknown ? never : K]: (data: T[K] | Wrapper<T[K]>) => TreeContext<T>;\r\n} & {\r\n element: T;\r\n append(...children: (\r\n TreeResult |\r\n TreeResult[] |\r\n Wrapper<TreeResult> |\r\n Wrapper<TreeResult[]> |\r\n Wrapper<TreeResult | TreeResult[]>\r\n )[]): TreeContext<T>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): TreeContext<T>;\r\n on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): TreeContext<T>;\r\n} & { [K in typeof treeContextSymbol]: true; };\r\nexport const treeContextSymbol = Symbol(\"TreeContextFlag\");\r\nexport function isTreeContext<T extends HTMLElement>(data: unknown): data is TreeContext<T> {\r\n return !!data && Object.hasOwn(data, treeContextSymbol) && data[treeContextSymbol] === true;\r\n}\r\nexport function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const context: TreeContext<HTMLElementTagNameMap[E]> = new Proxy({\r\n element,\r\n append(...children: (TreeResult | TreeResult[] | Wrapper<TreeResult | TreeResult[]>)[]) {\r\n for (const child of children) {\r\n if (isWrapper<TreeResult | TreeResult[]>(child)) {\r\n let oldChildren: TreeContext[] = [];\r\n const baseAnchor = new Comment(\"Tree anchor\");\r\n element.appendChild(baseAnchor);\r\n const update = (newTrees: TreeResult[] | TreeResult) => {\r\n const normalizedTrees = [...(Array.isArray(newTrees) ? newTrees : [newTrees])];\r\n const newChildren: TreeContext[] = [];\r\n for (const newTree of normalizedTrees) {\r\n const child = render(newTree);\r\n newChildren.push(child);\r\n element.insertBefore(child.element, baseAnchor.nextSibling);\r\n }\r\n for (const oldChild of oldChildren) {\r\n oldChild.element.remove();\r\n }\r\n oldChildren = newChildren;\r\n };\r\n child.event.subcribe(update);\r\n update(child.get());\r\n } else {\r\n const children = child;\r\n for (const child of putIn(children)) {\r\n element.appendChild(render(child).element);\r\n }\r\n }\r\n }\r\n return context;\r\n },\r\n use(styleSet: StyleSet | Wrapper<StyleSet>) {\r\n if (element instanceof HTMLElement) {\r\n const update = (rules: Record<string, string>) => {\r\n for (const [key, value] of Object.entries(rules)) {\r\n element.style.setProperty(camelToHyphen(String(key)), value);\r\n }\r\n };\r\n if (isWrapper<StyleSet>(styleSet)) {\r\n styleSet.event.subcribe((newData) => update(newData.rules));\r\n update(styleSet.get().rules);\r\n } else {\r\n update(styleSet.rules);\r\n }\r\n }\r\n return context;\r\n },\r\n on(key, handler, options) {\r\n if (element instanceof HTMLElement) {\r\n element.addEventListener(key, handler, options);\r\n }\r\n return context;\r\n },\r\n [treeContextSymbol]: true\r\n } as TreeContext<HTMLElementTagNameMap[E]>, {\r\n get<P extends keyof Node>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: HTMLElementTagNameMap[E][P] | Wrapper<HTMLElementTagNameMap[E][P]>) => {\r\n if (isWrapper<HTMLElementTagNameMap[E][P]>(data)) {\r\n const update = (newData: HTMLElementTagNameMap[E][P]) => element[p] = newData;\r\n data.event.subcribe(update);\r\n update(data.get());\r\n } else {\r\n element[p] = data;\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingFieldError extends Error { }\r\nexport class ConflictionError extends Error { }\r\nexport class AccessError extends Error { }\r\nexport class BrokenRendererError extends Error { }","import { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, ComponentPropertyStore } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingFieldError, ValidationFailed } from \"@/exceptions\";\r\nimport { isWrapper, wrap } from \"./reactive\";\r\n\r\nexport function normalizePropertyDescriptor\r\n <I, O, R extends boolean>(\r\n descriptor: ComponentPropertyDescriptor<I, O, R>\r\n): Required<ComponentPropertyDescriptor<I, O, R>> {\r\n return Object.assign({\r\n validate: () => true,\r\n transform: x => x,\r\n shadow: null,\r\n required: false,\r\n downloadable: true,\r\n uploadable: false\r\n } satisfies Required<ComponentPropertyDescriptor>, descriptor);\r\n}\r\nexport function validateStore(store: ComponentPropertyStore) {\r\n for (const propertyKey in store) {\r\n const descriptor = store[propertyKey];\r\n if (descriptor.shadow) {\r\n if (descriptor.required) {\r\n throw new ConflictionError(`The required property ${propertyKey} can't have a shadow.`);\r\n }\r\n if (descriptor.validate && !descriptor.validate(descriptor.shadow)) {\r\n throw new ValidationFailed(`The shadow of ${propertyKey} can't pass the validation.`);\r\n }\r\n }\r\n }\r\n}\r\nexport function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T) {\r\n if (!upstream) upstream = {} as ComponentPropertyInputDict<T>;\r\n const downstream: Record<string, unknown> = {};\r\n for (const propertyKey in store) {\r\n const descriptor = normalizePropertyDescriptor(store[propertyKey]);\r\n const setValue = (newValue: unknown) => {\r\n if (isWrapper(downstream[propertyKey])) {\r\n downstream[propertyKey].set(newValue);\r\n } else {\r\n const wrapper = wrap(newValue);\r\n downstream[propertyKey] = wrapper;\r\n wrapper.event.subcribe((newData) => {\r\n if (!isWrapper(upstream[propertyKey]) || !isWrapper(downstream[propertyKey])) return;\r\n if (downstream[propertyKey].get() === upstream[propertyKey].get()) return;\r\n if (!descriptor.uploadable) throw new AccessError(`Property ${propertyKey} isn't uploadable but being set.`);\r\n upstream[propertyKey].set(newData);\r\n });\r\n }\r\n };\r\n const update = (inputValue: unknown, firstSet: boolean) => {\r\n if (!firstSet && !descriptor.downloadable) {\r\n console.warn(`Property ${propertyKey} isn't downloadable but being emitted.`);\r\n return;\r\n }\r\n if (!descriptor.validate(inputValue)) {\r\n throw new ValidationFailed(`The input value of ${propertyKey} can't pass the validation.`);\r\n }\r\n setValue(descriptor.transform(inputValue));\r\n };\r\n if (!Object.hasOwn(upstream, propertyKey)) {\r\n if (descriptor.required) {\r\n throw new MissingFieldError(`Missing a required property ${propertyKey}.`);\r\n }\r\n setValue(descriptor.shadow);\r\n continue;\r\n }\r\n if (isWrapper(upstream[propertyKey])) {\r\n upstream[propertyKey].event.subcribe(e => update(e, false));\r\n update(upstream[propertyKey].get(), true);\r\n } else {\r\n update(upstream[propertyKey], true);\r\n }\r\n }\r\n return downstream as ComponentPropertyOutputDict<T>;\r\n}","import { TreeResult } from \"./component\";\r\nimport { isWrapper, wrap, Wrapper } from \"./reactive\";\r\n\r\nexport type RawSlotInput = TreeResult | (() => TreeResult);\r\nexport type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;\r\nexport type SlotOutput = Wrapper<TreeResult>;\r\n\r\nexport function pipeExtract(input: SlotInput): SlotOutput {\r\n if (typeof input === \"function\") {\r\n return wrap(input());\r\n } else if (isWrapper<RawSlotInput>(input)) {\r\n return pipeExtract(input);\r\n } else return wrap(input);\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { TreeContext, isTreeContext, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;\r\n}\r\nexport type Component<P extends ComponentPropertyStore> =\r\n ComponentRenderEntry<P> & ComponentOption<P>;\r\nexport interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {\r\n validate?: (data: I) => boolean;\r\n transform: (data: I) => O;\r\n shadow?: O;\r\n required?: R;\r\n downloadable?: boolean;\r\n uploadable?: boolean;\r\n}\r\nexport type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;\r\nexport type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P as P[K][\"required\"] extends true ? K : never]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> : never;\r\n} & {\r\n [K in keyof P as P[K][\"required\"] extends false | unknown ? K : never]?:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> | EmptyValue : never;\r\n}\r\nexport type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? Wrapper<R> : never;\r\n};\r\nexport interface ComponentOption<P extends ComponentPropertyStore> {\r\n props?: P;\r\n}\r\nexport type RenderResult = {\r\n mount(to: string | HTMLElement): void;\r\n $: TreeContext;\r\n} & { [K in typeof renderResultSymbol]: true; };\r\nexport type TreeResult =\r\n HTMLElement |\r\n TreeContext |\r\n string |\r\n number |\r\n boolean |\r\n EmptyValue |\r\n RenderResult;\r\nexport function render(nodeTree: TreeResult) {\r\n let result: TreeContext;\r\n if (nodeTree instanceof HTMLElement) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\") {\r\n result = tree(new Text(String(nodeTree)));\r\n } else if (isRenderResult(nodeTree)) {\r\n result = nodeTree.$;\r\n } else if (nodeTree === null || nodeTree === undefined) {\r\n result = tree(new Comment(\"Empty tree context\"));\r\n } else if (isTreeContext(nodeTree)) {\r\n result = nodeTree;\r\n } else {\r\n throw new BrokenRendererError(`Failed to render ${nodeTree} into a Node.`);\r\n }\r\n return result;\r\n}\r\nexport const renderResultSymbol = Symbol(\"RenderResultFlag\");\r\nexport function isRenderResult(data: unknown): data is RenderResult {\r\n return !!data && Object.hasOwn(data, renderResultSymbol) && data[renderResultSymbol] === true;\r\n}\r\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<TreeResult>;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore\r\n>(\r\n options: ComponentOption<P>,\r\n internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult\r\n): Component<P> {\r\n validateStore(options.props ?? {});\r\n const propStore = Object.fromEntries(\r\n Object\r\n .entries(options.props ?? {})\r\n .map(([key, value]) => [\r\n key,\r\n normalizePropertyDescriptor(value),\r\n ])\r\n ) as P;\r\n const entryRenderer = (props?: ComponentPropertyInputDict<P>, slot?: SlotInput) => {\r\n const nodeTree = internalRenderer(hostdown(props, propStore), pipeExtract(slot));\r\n const result = render(nodeTree);\r\n return {\r\n mount(to: string | HTMLElement) {\r\n const targets = typeof to === \"string\" ? [...document.querySelectorAll<HTMLElement>(to)] : [to];\r\n for (const target of targets) {\r\n target.appendChild(result.element);\r\n }\r\n },\r\n $: result,\r\n [renderResultSymbol]: true as const\r\n };\r\n };\r\n return Object.assign(entryRenderer, {\r\n props: propStore\r\n } satisfies ComponentOption<P>);\r\n}","export type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n toString(): string;\r\n};\r\nexport function styleSet() {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n } as StyleSet, {\r\n get<P extends string & keyof CSSStyleDeclaration>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: CSSStyleDeclaration[P]) => {\r\n rules[p] = String(data);\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export * as logo from \"./logo.svg\";\r\n","import { $, createComponent, sync, tree, TreeResult } from \"@\";\r\n\r\nfunction isNumeric(value: unknown) {\r\n if (value === null || value === undefined) return false;\r\n if (typeof value === \"number\") return isFinite(value);\r\n if (typeof value === \"string\") return value.trim() !== \"\" && !isNaN(Number(value));\r\n return false;\r\n}\r\nexport default createComponent({\r\n props: {\r\n v1: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n },\r\n v2: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n }\r\n }\r\n}, (props) =>\r\n tree(\"div\").append(\r\n $(props.v1), \"+\", $(props.v2), \"=\",\r\n sync<TreeResult>(() => props.v1.get() + props.v2.get(), [props.v1, props.v2]),\r\n tree(\"button\")\r\n .textContent(\"下游 v1 -1\")\r\n .on(\"click\", () => props.v1.set(props.v1.get() - 1)),\r\n tree(\"button\")\r\n .textContent(\"下游 v2 -1\")\r\n .on(\"click\", () => props.v2.set(props.v2.get() - 1)),\r\n ),\r\n);","import { $, createComponent, tree, sync, styleSet, createArray, when } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n value: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n downloadable: true, //(上游→下游)\r\n uploadable: true, //(下游→上游),v-model双向绑定\r\n }\r\n }\r\n}, (props) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n return tree(\"div\")\r\n .use(styleSet().fontSize(\"20px\").padding(\"10px\"))\r\n .append(\r\n \"敲木鱼\", tree(\"br\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() + 1)) //参数uploadable,赋值会实时同步到上游\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(props.value), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n $(sync( //只要是能渲染的东西,就能进行响应式引用\r\n () => createArray(\r\n doubled.get(),\r\n () => tree(\"div\").textContent(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").textContent(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import { $, createComponent, tree, wrap } from \"@\";\r\nimport AddExpression from \"./AddExpression\";\r\n\r\nexport default createComponent({}, () => {\r\n const v1 = wrap(10);\r\n const v2 = wrap(20);\r\n return tree(\"div\")\r\n .append(\r\n \"v1:\", $(v1), \"v2:\", $(v2),\r\n AddExpression({ v1, v2 }),\r\n tree(\"button\")\r\n .textContent(\"上游 v1 +1\")\r\n .on(\"click\", () => v1.set(v1.get() + 1)),\r\n tree(\"button\")\r\n .textContent(\"上游 v2 +1\")\r\n .on(\"click\", () => v2.set(v2.get() + 1)),\r\n );\r\n});","import AddExpression from \"./AddExpression\";\r\nimport Counter from \"./Counter\";\r\nimport ValuePot from \"./ValuePot\";\r\n\r\nexport default { Counter, AddExpression, ValuePot };"],"mappings":"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","names":["index_exports","__export","$","EventSubcriber","assets_exports","camelToHyphen","createArray","createComponent","examples_default","hyphenToCamel","isRenderResult","isTreeContext","isWrapper","putIn","render","renderResultSymbol","styleSet","sync","tree","treeContextSymbol","typedIsArray","when","wrap","wrapperSymbol","__toCommonJS","EventSubcriber","callback","once","data","subcriber","camelToHyphen","str","letter","hyphenToCamel","g","wrapperSymbol","wrap","initialData","wrapperOptions","arrayActions","patch","data","proxy","newRevoke","target","p","receiver","originalMethod","args","oldData","wrapper","result","newValue","oldRevoke","event","EventSubcriber","currentData","newData","sync","effectRenderer","dependencies","internalWrapper","update","dependency","isWrapper","when","condition","tree","typedIsArray","arr","putIn","data","createArray","length","filler","treeContextSymbol","isTreeContext","data","tree","element","context","children","child","isWrapper","oldChildren","baseAnchor","update","newTrees","normalizedTrees","newChildren","newTree","render","oldChild","putIn","styleSet","rules","key","value","camelToHyphen","newData","handler","options","target","p","receiver","ValidationFailed","MissingFieldError","ConflictionError","AccessError","BrokenRendererError","normalizePropertyDescriptor","descriptor","x","validateStore","store","propertyKey","ConflictionError","ValidationFailed","hostdown","upstream","downstream","setValue","newValue","isWrapper","wrapper","wrap","newData","AccessError","update","inputValue","firstSet","MissingFieldError","e","pipeExtract","input","wrap","isWrapper","render","nodeTree","result","tree","isRenderResult","isTreeContext","BrokenRendererError","renderResultSymbol","data","$","createComponent","options","internalRenderer","validateStore","propStore","key","value","normalizePropertyDescriptor","props","slot","hostdown","pipeExtract","to","targets","target","styleSet","rules","context","target","p","receiver","data","assets_exports","__export","logo_exports","isNumeric","value","AddExpression_default","createComponent","props","tree","sync","Counter_default","createComponent","props","doubled","sync","tree","styleSet","createArray","when","ValuePot_default","createComponent","v1","wrap","v2","tree","AddExpression_default","examples_default","Counter_default","AddExpression_default","ValuePot_default"]}
|