nine-9 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  一个轻量、高性能、类型安全的 Vanilla DOM 响应式 UI 框架。
4
4
 
5
- 融合了 Vue 模板指令和 React Hooks 的优点,取两者之长。同时运行及其轻量,甚至打包后可以用于 XXXMonkey UserScript。
5
+ 融合了 Vue 模板指令和 React Hooks 的优点,取两者之长。
6
+ 同时运行及其轻量,甚至打包后可以用于 XXXMonkey UserScript。
6
7
 
7
8
  ## 特性
8
9
 
@@ -66,3 +67,13 @@ Counter({ initial: 0 }).mount("body");
66
67
  | `sync()` | `computed()` | 响应式计算值 |
67
68
  | `when(condition, tree)` | `v-if` | 条件渲染 |
68
69
  | `sync(() => items.map(...))` | `v-for` | 列表渲染 |
70
+
71
+ ## 运行时特性
72
+
73
+ ### 性能
74
+
75
+ 由于框架不需要使用 **Runtime** 伴随运行,也无需通过虚拟节点重新生成整个节点树(对节点树的更改完全基于原生DOM操作命令),因此应用的运行性能相当高,甚至可以媲美Vanilla.js的速度了。
76
+
77
+ ### 使用
78
+
79
+ 框架处理动态的节点树时,本质上是通过对新旧节点的增删改查实现。但不同于 Vue 的是,**nine-9** 不需要分析diff树,用列表渲染(`sync` ← `v-for`)举例,框架使用 `TreeContext` 接口来描述一个XML节点,**HTML元素、字符串、数字、各类空值(null、undefined)、组件渲染结果**都可以被归一化为一个 `TreeContext` 接口,而这个接口必定会用于封装一个非空的XML节点,当使用 `append` 方法添加一个响应式数组时,`TreeContext` 会首先在当前封装的节点最后添加一个注释节点用于当做锚点,旧列表中渲染出的节点将会被删除,新列表中的节点插入到锚点的后面。
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -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 L(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}var O=Symbol("WrapperFlag");function d(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"?(...I)=>{let y=s.get();if(Array.isArray(y)){y=[...y];let E=b.call(f,...I);return s.event.emit(s.get(),y),E}}: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 y=s.get();if(Array.isArray(y)){y=[...y];let E=Reflect.set(f,m,x,b);return s.event.emit(s.get(),y),E}}return Reflect.set(f,m,x,b)}});return p=T,c},o=new w,p=null,i=r(e),s={get(){return i},set(a){if(i!==a){let c=i;Array.isArray(c)&&p?(p(),c=[...c],i=r(a)):i=a,this.event.emit(a,c)}},updateOnly(){this.event.emit(this.get(),this.get())},event:o,[O]:!0};return{...s,...t??{}}}function R(e,t=[]){let n=d(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 H(e,t,n=[]){return R(()=>{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,O)&&e[O]===!0}function K(e){return[...Array.isArray(e)?e:[e]]}function N(e,t){return new Array(e).fill(0).map(t)}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 p=[],i=new Comment("Tree anchor");t.appendChild(i);let s=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 p)f.element.remove();p=T};o.event.subcribe(s),s(o.get())}else{let p=o;for(let i of K(p))t.appendChild(S(i).element)}return n},use(r){if(t instanceof HTMLElement){let o=p=>{for(let[i,s]of Object.entries(p))t.style.setProperty(L(String(i)),s)};u(r)?(r.event.subcribe(p=>o(p.rules)),o(r.get().rules)):o(r.rules)}return n},on(r,o,p){return t instanceof HTMLElement&&t.addEventListener(r,o,p),n}},{get(r,o,p){return Reflect.has(r,o)?Reflect.get(r,o,p):i=>{if(u(i)){let s=a=>t[o]=a;i.event.subcribe(s),s(i.get())}else t[o]=i;return n}}});return n}var C=class extends Error{},P=class extends Error{},h=class extends Error{},v=class extends Error{};function D(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function q(e){for(let t in e){let n=e[t];if(n.shadow){if(n.required)throw new h(`The required property ${t} can't have a shadow.`);if(n.validate&&!n.validate(n.shadow))throw new C(`The shadow of ${t} can't pass the validation.`)}}}function $(e,t){e||(e={});let n={};for(let r in t){let o=D(t[r]),p=s=>{if(u(n[r]))n[r].set(s);else{let a=d(s);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 v(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(s,a)=>{if(!a&&!o.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!o.validate(s))throw new C(`The input value of ${r} can't pass the validation.`);p(o.transform(s))};if(!Object.hasOwn(e,r)){if(o.required)throw new P(`Missing a required property ${r}.`);p(o.shadow);continue}u(e[r])?(e[r].event.subcribe(s=>i(s,!1)),i(e[r].get(),!0)):i(e[r],!0)}return n}function W(e){return typeof e=="function"?d(e()):u(e)?W(e):d(e)}function S(e){let t;return e instanceof HTMLElement?t=l(e):typeof e=="string"||typeof e=="number"?t=l(new Text(String(e))):U(e)?t=e.$:e?t=e:t=l(new Comment("Empty tree context")),t}var M=Symbol("RenderResultFlag");function U(e){return!!e&&Object.hasOwn(e,M)&&e[M]===!0}function g(e,t){q(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([o,p])=>[o,D(p)]));return Object.assign((o,p)=>{let i=t($(o,n),W(p)),s=S(i);return{mount(a){let c=typeof a=="string"?[...document.querySelectorAll(a)]:[a];for(let T of c)T.appendChild(s.element)},$:s,[M]:!0}},{props:n})}function j(){let e={},t=new Proxy({rules:e},{get(n,r,o){return Reflect.has(n,r)?Reflect.get(n,r,o):p=>(e[r]=String(p),t)}});return t}function z(e){return e==null?!1:typeof e=="number"?isFinite(e):typeof e=="string"?e.trim()!==""&&!isNaN(Number(e)):!1}var k=g({props:{v1:{transform:Number,shadow:0,validate:z,required:!0,uploadable:!0,downloadable:!0},v2:{transform:Number,shadow:0,validate:z,required:!0,uploadable:!0,downloadable:!0}}},e=>l("div").append(e.v1,"+",e.v2,"=",R(()=>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 F=g({props:{initial:{validate:Number.isInteger,transform:Number,required:!1,shadow:0}}},e=>{let t=d(e.initial.get()),n=R(()=>t.get()*2,[t]);return l("div").use(j().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",l("br"),l("button").on("click",()=>t.set(t.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),l("button").on("click",()=>t.set(t.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),l("br"),"\u5F53\u524D\u503C\uFF1A",t,"\u53CC\u500D\u503C\uFF1A",n,R(()=>N(n.get(),()=>l("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[n]),H(()=>t.get()>10,()=>l("p").textContent("count > 10 \u65F6\u663E\u793A"),[t]))});var B=g({},()=>{let e=d(10),t=d(20);return l("div").append("v1:",e,"v2:",t,k({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 A={Counter:F,AddExpression:k,ValuePot:B};A.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};\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 { }\r\nexport class AccessError 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, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\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 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\") {\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 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, wrap, TreeResult } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n initial: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n }\r\n }\r\n}, (props) => {\r\n const count = wrap(props.initial.get()); //ref\r\n const doubled = sync(() => count.get() * 2, [count]); //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\", () => count.set(count.get() + 1))\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => count.set(count.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(count), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n sync<TreeResult[]>(() => createArray(doubled.get(), () => tree(\"div\").textContent(\"你点了一下\")), [doubled]), //列表渲染v-for\r\n when(() => count.get() > 10, () => tree(\"p\").textContent(\"count > 10 时显示\"), [count]), //条件渲染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","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","AccessError","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","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","count","wrap","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>;
@@ -51,13 +48,6 @@ type RawSlotInput = TreeResult | (() => TreeResult);
51
48
  type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;
52
49
  type SlotOutput = Wrapper<TreeResult>;
53
50
 
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
51
  interface ComponentRenderEntry<P extends ComponentPropertyStore> {
62
52
  (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;
63
53
  }
@@ -67,23 +57,32 @@ interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolea
67
57
  transform: (data: I) => O;
68
58
  shadow?: O;
69
59
  required?: R;
60
+ downloadable?: boolean;
61
+ uploadable?: boolean;
70
62
  }
71
63
  type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;
72
64
  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;
65
+ [K in keyof P as P[K]["required"] extends true ? K : never]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R | Wrapper<R> : never;
74
66
  } & {
75
- [K in keyof P as P[K]["required"] extends false | unknown ? K : never]?: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R | (P[K]["shadow"] extends unknown ? EmptyValue : R) : never;
67
+ [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
68
  };
77
69
  type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {
78
- [K in keyof P]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R : never;
70
+ [K in keyof P]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? Wrapper<R> : never;
79
71
  };
80
72
  interface ComponentOption<P extends ComponentPropertyStore> {
81
73
  props?: P;
82
74
  }
75
+ type RenderResult = {
76
+ mount(to: string | HTMLElement): void;
77
+ $: TreeContext;
78
+ } & {
79
+ [K in typeof renderResultSymbol]: true;
80
+ };
81
+ type TreeResult = HTMLElement | TreeContext | string | number | EmptyValue | RenderResult;
82
+ declare function render(nodeTree: TreeResult): TreeContext;
83
83
  declare const renderResultSymbol: unique symbol;
84
84
  declare function isRenderResult(data: unknown): data is RenderResult;
85
85
  declare function $<T>(data: Wrapper<T>): Wrapper<TreeResult>;
86
- declare function render(nodeTree: TreeResult): TreeContext;
87
86
  declare function createComponent<P extends ComponentPropertyStore>(options: ComponentOption<P>, internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult): Component<P>;
88
87
 
89
88
  declare function camelToHyphen(str: string): string;
@@ -104,11 +103,26 @@ declare namespace index {
104
103
 
105
104
  declare const _default: {
106
105
  Counter: Component<{
107
- initialValue: {
108
- transform: NumberConstructor;
106
+ initial: {
109
107
  validate: (number: unknown) => boolean;
108
+ transform: NumberConstructor;
109
+ required: false;
110
+ shadow: number;
111
+ };
112
+ }>;
113
+ AddExpression: Component<{
114
+ v1: {
115
+ transform: NumberConstructor;
116
+ shadow: number;
117
+ validate: (value: unknown) => boolean;
118
+ };
119
+ v2: {
120
+ transform: NumberConstructor;
121
+ shadow: number;
122
+ validate: (value: unknown) => boolean;
110
123
  };
111
124
  }>;
125
+ ValuePot: Component<ComponentPropertyStore>;
112
126
  };
113
127
 
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, _default as builtins, camelToHyphen, createArray, createComponent, hyphenToCamel, isRenderResult, isWrapper, putIn, render, renderResultSymbol, styleSet, sync, tree, typedIsArray, when, wrap, wrapperSymbol };
128
+ 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, isWrapper, putIn, render, renderResultSymbol, styleSet, sync, tree, typedIsArray, when, wrap, wrapperSymbol };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var v=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var E=(e,t)=>{for(var n in t)v(e,n,{get:t[n],enumerable:!0})},U=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of F(t))!B.call(e,r)&&r!==n&&v(e,r,{get:()=>t[r],enumerable:!(o=V(t,r))||o.enumerable});return e};var Z=e=>U(v({},"__esModule",{value:!0}),e);var te={};E(te,{$:()=>$,EventSubcriber:()=>R,assets:()=>A,builtins:()=>j,camelToHyphen:()=>k,createArray:()=>X,createComponent:()=>W,hyphenToCamel:()=>G,isRenderResult:()=>q,isWrapper:()=>f,putIn:()=>D,render:()=>S,renderResultSymbol:()=>w,styleSet:()=>Y,sync:()=>L,tree:()=>y,typedIsArray:()=>Q,when:()=>J,wrap:()=>d,wrapperSymbol:()=>g});module.exports=Z(te);var R=class{subcribers=[];subcribe(t,n=!1){this.subcribers.push({callback:t,once:n})}async once(){return new Promise(t=>{this.subcribe((...n)=>t({data:n}),!0)})}emit(...t){for(let n of this.subcribers)n.callback(...t)}};function k(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function G(e){return e.replace(/-([a-z])/g,t=>t[1].toUpperCase())}var g=Symbol("WrapperFlag");function d(e){let t=["push","pop","shift","unshift","splice","sort","reverse"],n=i=>{if(!Array.isArray(i))return i;let{proxy:l,revoke:x}=Proxy.revocable(i,{get(a,u,c){if(t.includes(u)){let T=Reflect.get(a,u,c);return typeof T=="function"?(...K)=>{let m=s.get();if(Array.isArray(m)){m=[...m];let h=T.call(a,...K);return s.emitEvent(s.get(),m),h}}:Reflect.get(a,u,c)}else return Reflect.get(a,u,c)},set(a,u,c,T){if(Reflect.get(a,u,T)!==c){let m=s.get();if(Array.isArray(m)){m=[...m];let h=Reflect.set(a,u,c,T);return s.emitEvent(s.get(),m),h}}return Reflect.set(a,u,c,T)}});return r=x,l},o=new R,r=null,p=n(e),s={get(){return p},set(i){if(p!==i){let l=p;Array.isArray(l)&&r?(r(),p=n(i)):p=i,this.emitEvent(i,l)}},emitEvent(i,l){o.emit(i,l)},updateOnly(){this.emitEvent(this.get(),this.get())},event:o,[g]:!0};return s}function L(e,t=[]){let n=d(e()),o=()=>{let r=e();n.get()!==r&&n.set(r)};for(let r of t)f(r)&&r.event.subcribe(o);return n}function J(e,t,n=[]){return L(()=>{let o;return typeof e=="function"?o=e():o=e.get(),[o?t():null]},[...n,...f(e)?[e]:[]])}function f(e){return!!e&&Object.hasOwn(e,g)&&e[g]===!0}function Q(e){return Array.isArray(e)}function D(e){return[...Array.isArray(e)?e:[e]]}function X(e,t){return new Array(e).fill(0).map(t)}function y(e){let t=typeof e=="string"?document.createElement(e):e,n=new Proxy({element:t,append(...o){for(let r of o)if(f(r)){let p=[],s=new Comment("Tree anchor");t.appendChild(s);let i=l=>{let x=[...Array.isArray(l)?l:[l]],a=[];for(let u of x){let c=S(u);a.push(c),t.insertBefore(c.element,s.nextSibling)}for(let u of p)u.element.remove();p=a};r.event.subcribe(i),i(r.get())}else{let p=r;for(let s of D(p))t.appendChild(S(s).element)}return n},use(o){if(t instanceof HTMLElement){let r=p=>{for(let[s,i]of Object.entries(p))t.style.setProperty(k(String(s)),i)};f(o)?(o.event.subcribe(p=>r(p.rules)),r(o.get().rules)):r(o.rules)}return n},on(o,r,p){return t instanceof HTMLElement&&t.addEventListener(o,r,p),n}},{get(o,r,p){return Reflect.has(o,r)?Reflect.get(o,r,p):s=>{if(f(s)){let i=l=>t[r]=l;s.event.subcribe(i),i(s.get())}else t[r]=s;return n}}});return n}var C=class extends Error{},b=class extends Error{},P=class extends Error{};function O(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1},e)}function H(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 C(`The shadow of ${t} can't pass the validation.`)}}}function N(e,t){e||(e={});let n={};for(let o in t){let r=O(t[o]);if(!Object.hasOwn(e,o)){if(r.required)throw new b(`Missing a required property ${o}.`);n[o]=r.shadow;continue}let p=e[o];if(!r.validate(p))throw new C(`The input value of ${o} can't pass the validation.`);n[o]=r.transform(p)}return n}function M(e){return typeof e=="function"?d(e()):f(e)?M(e):d(e)}var w=Symbol("RenderResultFlag");function q(e){return!!e&&Object.hasOwn(e,w)&&e[w]===!0}function $(e){return e}function S(e){let t;return e instanceof HTMLElement?t=y(e):typeof e=="string"||typeof e=="number"?t=y(new Text(String(e))):q(e)?t=e.$:e?t=e:t=y(new Comment("Empty tree context")),t}function W(e,t){H(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([r,p])=>[r,O(p)]));return Object.assign((r,p)=>{let s=t(N(r,n),M(p)),i=S(s);return{mount(l){let x=typeof l=="string"?[...document.querySelectorAll(l)]:[l];for(let a of x)a.appendChild(i.element)},$:i,[w]:!0}},{props:n})}function Y(){let e={},t=new Proxy({rules:e},{get(n,o,r){return Reflect.has(n,o)?Reflect.get(n,o,r):p=>(e[o]=String(p),t)}});return t}var A={};E(A,{logo:()=>I});var I={};E(I,{default:()=>ee});var ee='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>';var z=W({props:{initialValue:{transform:Number,validate:Number.isInteger}}},e=>{let t=d(e.initialValue);return y("div").append("\u5F53\u524D\u6570\u503C\uFF1A",t,y("button").textContent("\u70B9\u51FB\u52A0\u4E00").on("click",()=>t.set(t.get()+1)),y("button").textContent("\u70B9\u51FB\u51CF\u4E00").on("click",()=>t.set(t.get()-1)))});var j={Counter:z};0&&(module.exports={$,EventSubcriber,assets,builtins,camelToHyphen,createArray,createComponent,hyphenToCamel,isRenderResult,isWrapper,putIn,render,renderResultSymbol,styleSet,sync,tree,typedIsArray,when,wrap,wrapperSymbol});
1
+ "use strict";var M=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var A=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0})},ee=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Y(t))!_.call(e,o)&&o!==n&&M(e,o,{get:()=>t[o],enumerable:!(r=X(t,o))||r.enumerable});return e};var te=e=>ee(M({},"__esModule",{value:!0}),e);var pe={};A(pe,{$:()=>D,EventSubcriber:()=>w,assets:()=>j,camelToHyphen:()=>I,createArray:()=>K,createComponent:()=>b,examples:()=>Q,hyphenToCamel:()=>re,isRenderResult:()=>U,isWrapper:()=>u,putIn:()=>H,render:()=>C,renderResultSymbol:()=>E,styleSet:()=>$,sync:()=>T,tree:()=>a,typedIsArray:()=>ne,when:()=>L,wrap:()=>m,wrapperSymbol:()=>v});module.exports=te(pe);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 I(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function re(e){return e.replace(/-([a-z])/g,t=>t[1].toUpperCase())}var v=Symbol("WrapperFlag");function m(e,t){let n=["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,d,x){if(n.includes(d)){let R=Reflect.get(f,d,x);return typeof R=="function"?(...F)=>{let y=p.get();if(Array.isArray(y)){y=[...y];let W=R.call(f,...F);return p.event.emit(p.get(),y),W}}:Reflect.get(f,d,x)}else return Reflect.get(f,d,x)},set(f,d,x,R){if(Reflect.get(f,d,R)!==x){let y=p.get();if(Array.isArray(y)){y=[...y];let W=Reflect.set(f,d,x,R);return p.event.emit(p.get(),y),W}}return Reflect.set(f,d,x,R)}});return s=g,c},o=new w,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:o,[v]:!0};return{...p,...t??{}}}function T(e,t=[]){let n=m(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 L(e,t,n=[]){return T(()=>{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,v)&&e[v]===!0}function ne(e){return Array.isArray(e)}function H(e){return[...Array.isArray(e)?e:[e]]}function K(e,t){return new Array(e).fill(0).map(t)}function a(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=l=>{let c=[...Array.isArray(l)?l:[l]],g=[];for(let f of c){let d=C(f);g.push(d),t.insertBefore(d.element,i.nextSibling)}for(let f of s)f.element.remove();s=g};o.event.subcribe(p),p(o.get())}else{let s=o;for(let i of H(s))t.appendChild(C(i).element)}return n},use(r){if(t instanceof HTMLElement){let o=s=>{for(let[i,p]of Object.entries(s))t.style.setProperty(I(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}},{get(r,o,s){return Reflect.has(r,o)?Reflect.get(r,o,s):i=>{if(u(i)){let p=l=>t[o]=l;i.event.subcribe(p),p(i.get())}else t[o]=i;return n}}});return n}var S=class extends Error{},h=class extends Error{},P=class extends Error{},k=class extends Error{};function N(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function B(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 S(`The shadow of ${t} can't pass the validation.`)}}}function V(e,t){e||(e={});let n={};for(let r in t){let o=N(t[r]),s=p=>{if(u(n[r]))n[r].set(p);else{let l=m(p);n[r]=l,l.event.subcribe(c=>{if(!(!u(e[r])||!u(n[r]))&&n[r].get()!==e[r].get()){if(!o.uploadable)throw new k(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(p,l)=>{if(!l&&!o.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!o.validate(p))throw new S(`The input value of ${r} can't pass the validation.`);s(o.transform(p))};if(!Object.hasOwn(e,r)){if(o.required)throw new h(`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 q(e){return typeof e=="function"?m(e()):u(e)?q(e):m(e)}function C(e){let t;return e instanceof HTMLElement?t=a(e):typeof e=="string"||typeof e=="number"?t=a(new Text(String(e))):U(e)?t=e.$:e?t=e:t=a(new Comment("Empty tree context")),t}var E=Symbol("RenderResultFlag");function U(e){return!!e&&Object.hasOwn(e,E)&&e[E]===!0}function D(e){return e}function b(e,t){B(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([o,s])=>[o,N(s)]));return Object.assign((o,s)=>{let i=t(V(o,n),q(s)),p=C(i);return{mount(l){let c=typeof l=="string"?[...document.querySelectorAll(l)]:[l];for(let g of c)g.appendChild(p.element)},$:p,[E]:!0}},{props:n})}function $(){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}var j={};A(j,{logo:()=>z});var z={};A(z,{default:()=>se});var se='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 Z(e){return e==null?!1:typeof e=="number"?isFinite(e):typeof e=="string"?e.trim()!==""&&!isNaN(Number(e)):!1}var O=b({props:{v1:{transform:Number,shadow:0,validate:Z,required:!0,uploadable:!0,downloadable:!0},v2:{transform:Number,shadow:0,validate:Z,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 G=b({props:{initial:{validate:Number.isInteger,transform:Number,required:!1,shadow:0}}},e=>{let t=m(e.initial.get()),n=T(()=>t.get()*2,[t]);return a("div").use($().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",a("br"),a("button").on("click",()=>t.set(t.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),a("button").on("click",()=>t.set(t.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),a("br"),"\u5F53\u524D\u503C\uFF1A",t,"\u53CC\u500D\u503C\uFF1A",n,T(()=>K(n.get(),()=>a("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[n]),L(()=>t.get()>10,()=>a("p").textContent("count > 10 \u65F6\u663E\u793A"),[t]))});var J=b({},()=>{let e=m(10),t=m(20);return a("div").append("v1:",e,"v2:",t,O({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 Q={Counter:G,AddExpression:O,ValuePot:J};0&&(module.exports={$,EventSubcriber,assets,camelToHyphen,createArray,createComponent,examples,hyphenToCamel,isRenderResult,isWrapper,putIn,render,renderResultSymbol,styleSet,sync,tree,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":"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","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};\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 { }\r\nexport class AccessError 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, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\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 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\") {\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 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, wrap, TreeResult } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n initial: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n }\r\n }\r\n}, (props) => {\r\n const count = wrap(props.initial.get()); //ref\r\n const doubled = sync(() => count.get() * 2, [count]); //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\", () => count.set(count.get() + 1))\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => count.set(count.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(count), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n sync<TreeResult[]>(() => createArray(doubled.get(), () => tree(\"div\").textContent(\"你点了一下\")), [doubled]), //列表渲染v-for\r\n when(() => count.get() > 10, () => tree(\"p\").textContent(\"count > 10 时显示\"), [count]), //条件渲染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","isWrapper","putIn","render","renderResultSymbol","styleSet","sync","tree","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","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","AccessError","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","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","count","wrap","doubled","sync","tree","styleSet","createArray","when","ValuePot_default","createComponent","v1","wrap","v2","tree","AddExpression_default","examples_default","Counter_default","AddExpression_default","ValuePot_default"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nine-9",
3
- "version": "1.2.2",
3
+ "version": "1.3.0",
4
4
  "description": "一个轻量、高性能、类型安全的 Vanilla DOM 响应式 UI 框架。",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",