nine-9 1.3.1 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -12,19 +12,15 @@ type EmptyValue = undefined | null | void | never;
12
12
  type Normalize<T extends Record<string, unknown>> = T extends Record<infer K, infer R> ? Record<K, Required<R>> : never;
13
13
  type Valueof<T> = T[keyof T];
14
14
 
15
- declare const wrapperSymbol: unique symbol;
16
15
  type Wrapper<T> = {
17
16
  get(): T;
18
17
  set(newData: T): void;
19
18
  updateOnly(): void;
20
19
  event: EventSubcriber<[T, T]>;
21
- } & {
22
- [K in typeof wrapperSymbol]: true;
23
20
  };
24
21
  declare function wrap<T>(initialData: T, wrapperOptions?: Partial<Wrapper<T>>): Wrapper<T>;
25
22
  declare function sync<R>(effectRenderer: () => R, dependencies?: unknown[]): Wrapper<R>;
26
- declare function when(condition: Wrapper<boolean> | (() => boolean), tree: () => TreeResult, dependencies?: unknown[]): Wrapper<TreeResult[]>;
27
- declare function isWrapper<T>(data: unknown): data is Wrapper<T>;
23
+ declare function when(condition: Wrapper<boolean> | (() => boolean), tree: () => SourceTree, dependencies?: unknown[]): Wrapper<SourceTree[]>;
28
24
 
29
25
  type StyleSet = {
30
26
  [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;
@@ -34,36 +30,50 @@ type StyleSet = {
34
30
  };
35
31
  declare function styleSet(): StyleSet;
36
32
 
37
- type TreeContext<T extends HTMLElement = HTMLElement> = {
38
- [K in keyof T as T[K] extends (...args: unknown[]) => unknown ? never : K]: (data: T[K] | Wrapper<T[K]>) => TreeContext<T>;
33
+ type HostTree<T extends HTMLElement = HTMLElement> = {
34
+ [K in keyof T as T[K] extends (...args: unknown[]) => unknown ? never : K]: (data: T[K] | Wrapper<T[K]>) => HostTree<T>;
39
35
  } & {
40
36
  element: T;
41
- append(...children: (TreeResult | TreeResult[] | Wrapper<TreeResult> | Wrapper<TreeResult[]> | Wrapper<TreeResult | TreeResult[]>)[]): TreeContext<T>;
42
- use(styleSet: StyleSet | Wrapper<StyleSet>): TreeContext<T>;
43
- on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): TreeContext<T>;
44
- } & {
45
- [K in typeof treeContextSymbol]: true;
37
+ append(...children: (SourceTree | SourceTree[] | Wrapper<SourceTree> | Wrapper<SourceTree[]> | Wrapper<SourceTree | SourceTree[]>)[]): HostTree<T>;
38
+ use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<T>;
39
+ on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): HostTree<T>;
40
+ on(key: string, handler: (...args: unknown[]) => unknown): HostTree<T>;
46
41
  };
47
- declare const treeContextSymbol: unique symbol;
48
- declare function isTreeContext<T extends HTMLElement>(data: unknown): data is TreeContext<T>;
49
- declare function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node): TreeContext<HTMLElementTagNameMap[E]>;
42
+ declare function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node): HostTree<HTMLElementTagNameMap[E]>;
50
43
 
51
- type RawSlotInput = TreeResult | (() => TreeResult);
44
+ type RawSlotInput = SourceTree | (() => SourceTree);
52
45
  type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;
53
- type SlotOutput = Wrapper<TreeResult>;
46
+ type SlotOutput = () => Wrapper<SourceTree>;
47
+ declare function pipeExtract(input: SlotInput): SlotOutput;
48
+
49
+ type EventDescriptor<T, N extends string> = {
50
+ name: N;
51
+ } & EventOptions<T>;
52
+ interface EventOptions<T> {
53
+ bubbleable?: boolean;
54
+ template?: T;
55
+ }
56
+ declare function defineEvent<T, N extends string>(name: N, options?: EventOptions<T>): EventDescriptor<T, N>;
54
57
 
55
- interface ComponentRenderEntry<P extends ComponentPropertyStore> {
56
- (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;
58
+ interface ComponentRenderEntry<P extends ComponentPropertyStore, E extends ComponentEventStore> {
59
+ (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): ComponentInstance<E>;
60
+ }
61
+ interface ComponentInternalRender<P extends ComponentPropertyStore, E extends ComponentEventStore> {
62
+ (options: ComponentPropertyOutputDict<P>, slot: SlotOutput, emit: <D extends E[number], K extends D["name"]>(key: K, data: D extends infer R extends EventDescriptor<unknown, string> ? R["name"] extends K ? R["template"] : never : never) => void): SourceTree;
63
+ }
64
+ type Component<P extends ComponentPropertyStore, E extends ComponentEventStore> = ComponentRenderEntry<P, E> & ComponentOption<P, E>;
65
+ interface PropertyTransformer<I, O> {
66
+ (data: I): O;
57
67
  }
58
- type Component<P extends ComponentPropertyStore> = ComponentRenderEntry<P> & ComponentOption<P>;
59
68
  interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {
60
69
  validate?: (data: I) => boolean;
61
- transform: (data: I) => O;
70
+ transform: PropertyTransformer<I, O>;
62
71
  shadow?: O;
63
72
  required?: R;
64
73
  downloadable?: boolean;
65
74
  uploadable?: boolean;
66
75
  }
76
+ type ComponentEventStore = EventDescriptor<unknown, string>[];
67
77
  type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;
68
78
  type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {
69
79
  [K in keyof P as P[K]["required"] extends true ? K : never]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R | Wrapper<R> : never;
@@ -73,21 +83,24 @@ type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {
73
83
  type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {
74
84
  [K in keyof P]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? Wrapper<R> : never;
75
85
  };
76
- interface ComponentOption<P extends ComponentPropertyStore> {
86
+ interface ComponentOption<P extends ComponentPropertyStore, E extends ComponentEventStore> {
77
87
  props?: P;
88
+ events?: E;
78
89
  }
79
- type RenderResult = {
90
+ type ComponentInstance<E extends ComponentEventStore = ComponentEventStore> = {
80
91
  mount(to: string | HTMLElement): void;
81
- $: TreeContext;
82
- } & {
83
- [K in typeof renderResultSymbol]: true;
92
+ on<D extends E[number], K extends D["name"]>(key: K, data: (data: D extends infer R extends EventDescriptor<unknown, string> ? R["name"] extends K ? R["template"] : never : never) => void): ComponentInstance<E>;
93
+ $: HostTree;
84
94
  };
85
- type TreeResult = HTMLElement | TreeContext | string | number | boolean | EmptyValue | RenderResult;
86
- declare function render(nodeTree: TreeResult): TreeContext;
87
- declare const renderResultSymbol: unique symbol;
88
- declare function isRenderResult(data: unknown): data is RenderResult;
89
- declare function $<T>(data: Wrapper<T>): Wrapper<TreeResult>;
90
- declare function createComponent<P extends ComponentPropertyStore>(options: ComponentOption<P>, internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult): Component<P>;
95
+ type SourceTree = HTMLElement | HostTree | string | number | boolean | EmptyValue | ComponentInstance;
96
+ declare function render(nodeTree: SourceTree): HostTree;
97
+ declare function $<T>(data: Wrapper<T>): Wrapper<SourceTree>;
98
+ declare function createComponent<P extends ComponentPropertyStore, E extends EventDescriptor<unknown, string>>(options: ComponentOption<P, E[]>, internalRenderer: ComponentInternalRender<P, E[]>): Component<P, E[]>;
99
+
100
+ declare function rawProperty<T>(): PropertyTransformer<unknown, T>;
101
+ declare function normalizePropertyDescriptor<I, O, R extends boolean>(descriptor: ComponentPropertyDescriptor<I, O, R>): Required<ComponentPropertyDescriptor<I, O, R>>;
102
+ declare function validateStore(store: ComponentPropertyStore): void;
103
+ declare function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T): ComponentPropertyOutputDict<T>;
91
104
 
92
105
  declare function camelToHyphen(str: string): string;
93
106
  declare function hyphenToCamel(str: string): string;
@@ -107,26 +120,32 @@ declare namespace index {
107
120
 
108
121
  declare const _default: {
109
122
  Counter: Component<{
110
- initial: {
123
+ value: {
111
124
  validate: (number: unknown) => boolean;
112
125
  transform: NumberConstructor;
113
126
  required: false;
114
127
  shadow: number;
128
+ downloadable: true;
129
+ uploadable: true;
115
130
  };
116
- }>;
117
- AddExpression: Component<{
118
- v1: {
119
- transform: NumberConstructor;
120
- shadow: number;
121
- validate: (value: unknown) => boolean;
131
+ }, (EventDescriptor<{
132
+ arg1: number;
133
+ arg2: boolean;
134
+ }, "up"> | EventDescriptor<{
135
+ arg3: string;
136
+ arg4: symbol;
137
+ }, "down">)[]>;
138
+ Selector: Component<{
139
+ items: {
140
+ transform: (x: unknown) => string[];
141
+ shadow: string[];
122
142
  };
123
- v2: {
143
+ value: {
124
144
  transform: NumberConstructor;
125
- shadow: number;
126
- validate: (value: unknown) => boolean;
145
+ uploadable: true;
146
+ required: true;
127
147
  };
128
- }>;
129
- ValuePot: Component<ComponentPropertyStore>;
148
+ }, (EventDescriptor<number, "select"> | EventDescriptor<boolean, "toggleState">)[]>;
130
149
  };
131
150
 
132
- export { $, type Component, type ComponentOption, type ComponentPropertyDescriptor, type ComponentPropertyInputDict, type ComponentPropertyOutputDict, type ComponentPropertyStore, type ComponentRenderEntry, type EmptyValue, EventSubcriber, type Normalize, type RenderResult, type StyleSet, type TreeContext, type TreeResult, type Valueof, type Wrapper, index as assets, camelToHyphen, createArray, createComponent, _default as examples, hyphenToCamel, isRenderResult, isTreeContext, isWrapper, putIn, render, renderResultSymbol, styleSet, sync, tree, treeContextSymbol, typedIsArray, when, wrap, wrapperSymbol };
151
+ export { $, type Component, type ComponentEventStore, type ComponentInstance, type ComponentInternalRender, type ComponentOption, type ComponentPropertyDescriptor, type ComponentPropertyInputDict, type ComponentPropertyOutputDict, type ComponentPropertyStore, type ComponentRenderEntry, type EmptyValue, type EventDescriptor, type EventOptions, EventSubcriber, type HostTree, type Normalize, type PropertyTransformer, type RawSlotInput, type SlotInput, type SlotOutput, type SourceTree, type StyleSet, type Valueof, type Wrapper, index as assets, camelToHyphen, createArray, createComponent, defineEvent, _default as examples, hostdown, hyphenToCamel, normalizePropertyDescriptor, pipeExtract, putIn, rawProperty, render, styleSet, sync, tree, typedIsArray, validateStore, when, wrap };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var I=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var re=Object.prototype.hasOwnProperty;var L=(e,t)=>{for(var o in t)I(e,o,{get:t[o],enumerable:!0})},ne=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of te(t))!re.call(e,n)&&n!==o&&I(e,n,{get:()=>t[n],enumerable:!(r=ee(t,n))||r.enumerable});return e};var oe=e=>ne(I({},"__esModule",{value:!0}),e);var ae={};L(ae,{$:()=>W,EventSubcriber:()=>C,assets:()=>V,camelToHyphen:()=>H,createArray:()=>q,createComponent:()=>b,examples:()=>_,hyphenToCamel:()=>se,isRenderResult:()=>J,isTreeContext:()=>$,isWrapper:()=>u,putIn:()=>N,render:()=>R,renderResultSymbol:()=>D,styleSet:()=>F,sync:()=>T,tree:()=>a,treeContextSymbol:()=>h,typedIsArray:()=>pe,when:()=>K,wrap:()=>d,wrapperSymbol:()=>S});module.exports=oe(ae);var C=class{subcribers=[];emitting=!1;subcribe(t,o=!1){this.subcribers.push({callback:t,once:o})}emit(...t){if(!this.emitting){this.emitting=!0;for(let o of this.subcribers)o.callback(...t);this.emitting=!1}}};function H(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function se(e){return e.replace(/-([a-z])/g,t=>t[1].toUpperCase())}var S=Symbol("WrapperFlag");function d(e,t){let o=["push","pop","shift","unshift","splice","sort","reverse"],r=l=>{if(!Array.isArray(l))return l;let{proxy:c,revoke:g}=Proxy.revocable(l,{get(f,m,x){if(o.includes(m)){let w=Reflect.get(f,m,x);return typeof w=="function"?(...U)=>{let y=p.get();if(Array.isArray(y)){y=[...y];let A=w.call(f,...U);return p.event.emit(p.get(),y),A}}:Reflect.get(f,m,x)}else return Reflect.get(f,m,x)},set(f,m,x,w){if(Reflect.get(f,m,w)!==x){let y=p.get();if(Array.isArray(y)){y=[...y];let A=Reflect.set(f,m,x,w);return p.event.emit(p.get(),y),A}}return Reflect.set(f,m,x,w)}});return s=g,c},n=new C,s=null,i=r(e),p={get(){return i},set(l){if(i!==l){let c=i;Array.isArray(c)&&s?(s(),c=[...c],i=r(l)):i=l,this.event.emit(l,c)}},updateOnly(){this.event.emit(this.get(),this.get())},event:n,[S]:!0};return{...p,...t??{}}}function T(e,t=[]){let o=d(e()),r=()=>{let n=e();o.get()!==n&&o.set(n)};for(let n of t)u(n)&&n.event.subcribe(r);return o}function K(e,t,o=[]){return T(()=>{let r;return typeof e=="function"?r=e():r=e.get(),[r?t():null]},[...o,...u(e)?[e]:[]])}function u(e){return!!e&&Object.hasOwn(e,S)&&e[S]===!0}function pe(e){return Array.isArray(e)}function N(e){return[...Array.isArray(e)?e:[e]]}function q(e,t){return new Array(e).fill(0).map(t)}var h=Symbol("TreeContextFlag");function $(e){return!!e&&Object.hasOwn(e,h)&&e[h]===!0}function a(e){let t=typeof e=="string"?document.createElement(e):e,o=new Proxy({element:t,append(...r){for(let n of r)if(u(n)){let s=[],i=new Comment("Tree anchor");t.appendChild(i);let p=l=>{let c=[...Array.isArray(l)?l:[l]],g=[];for(let f of c){let m=R(f);g.push(m),t.insertBefore(m.element,i.nextSibling)}for(let f of s)f.element.remove();s=g};n.event.subcribe(p),p(n.get())}else{let s=n;for(let i of N(s))t.appendChild(R(i).element)}return o},use(r){if(t instanceof HTMLElement){let n=s=>{for(let[i,p]of Object.entries(s))t.style.setProperty(H(String(i)),p)};u(r)?(r.event.subcribe(s=>n(s.rules)),n(r.get().rules)):n(r.rules)}return o},on(r,n,s){return t instanceof HTMLElement&&t.addEventListener(r,n,s),o},[h]:!0},{get(r,n,s){return Reflect.has(r,n)?Reflect.get(r,n,s):i=>{if(u(i)){let p=l=>t[n]=l;i.event.subcribe(p),p(i.get())}else t[n]=i;return o}}});return o}var v=class extends Error{},P=class extends Error{},k=class extends Error{},E=class extends Error{},O=class extends Error{};function j(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function Z(e){for(let t in e){let o=e[t];if(o.shadow){if(o.required)throw new k(`The required property ${t} can't have a shadow.`);if(o.validate&&!o.validate(o.shadow))throw new v(`The shadow of ${t} can't pass the validation.`)}}}function G(e,t){e||(e={});let o={};for(let r in t){let n=j(t[r]),s=p=>{if(u(o[r]))o[r].set(p);else{let l=d(p);o[r]=l,l.event.subcribe(c=>{if(!(!u(e[r])||!u(o[r]))&&o[r].get()!==e[r].get()){if(!n.uploadable)throw new E(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(p,l)=>{if(!l&&!n.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!n.validate(p))throw new v(`The input value of ${r} can't pass the validation.`);s(n.transform(p))};if(!Object.hasOwn(e,r)){if(n.required)throw new P(`Missing a required property ${r}.`);s(n.shadow);continue}u(e[r])?(e[r].event.subcribe(p=>i(p,!1)),i(e[r].get(),!0)):i(e[r],!0)}return o}function z(e){return typeof e=="function"?d(e()):u(e)?z(e):d(e)}function R(e){let t;if(e instanceof HTMLElement)t=a(e);else if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")t=a(new Text(String(e)));else if(J(e))t=e.$;else if(e==null)t=a(new Comment("Empty tree context"));else if($(e))t=e;else throw new O(`Failed to render ${e} into a Node.`);return t}var D=Symbol("RenderResultFlag");function J(e){return!!e&&Object.hasOwn(e,D)&&e[D]===!0}function W(e){return e}function b(e,t){Z(e.props??{});let o=Object.fromEntries(Object.entries(e.props??{}).map(([n,s])=>[n,j(s)]));return Object.assign((n,s)=>{let i=t(G(n,o),z(s)),p=R(i);return{mount(l){let c=typeof l=="string"?[...document.querySelectorAll(l)]:[l];for(let g of c)g.appendChild(p.element)},$:p,[D]:!0}},{props:o})}function F(){let e={},t=new Proxy({rules:e},{get(o,r,n){return Reflect.has(o,r)?Reflect.get(o,r,n):s=>(e[r]=String(s),t)}});return t}var V={};L(V,{logo:()=>B});var B={};L(B,{default:()=>le});var le='data:image/svg+xml,<?xml version="1.0" encoding="UTF-8"?>%0D%0A<svg fill="none" version="1.1" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">%0D%0A <g transform="matrix(1,0,0,-1,0,80)">%0D%0A <g transform="matrix(1,0,0,-1,0,160)">%0D%0A <path%0D%0A d="m9.4332 86.067-1.7864-1.782c-4.6571 3.6624-7.6468 9.3405-7.6468 15.715 0 5.3448 2.1018 10.2 5.5258 13.788l1.7728-1.7684c-2.9708-3.1349-4.7924-7.365-4.7924-12.019 0-5.6848 2.7174-10.737 6.927-13.933zm2.7405 29.575-1.8541 1.8496c2.8814 1.5984 6.1991 2.5088 9.7299 2.5088 10.396 0 18.945-7.8934 19.95-18h-2.5205c-0.9949 8.7231-8.4191 15.5-17.43 15.5-2.8321 0-5.5075-0.6695-7.8758-1.8584zm19.256-28.96 1.6169-1.9102c-3.5-2.9753-8.0385-4.7712-12.997-4.7712-1.6482 0-3.2499 0.19838-4.7825 0.57251l2.1313 2.126c0.8646-0.13074 1.75-0.19853 2.6512-0.19853 4.3427 0 8.3169 1.574 11.38 4.1814z"%0D%0A fill="%2330D34B" fill-rule="evenodd" />%0D%0A <path%0D%0A d="m20.05 86.045v-0.045285c-6.0798 0-11.257 3.8564-13.207 9.2507-1.9631 5.3748-0.47868 11.63 4.1686 15.519 5.4162 4.5336 13.258 4.2889 18.375-0.2846l-0.0192-0.0161c2.4219-2.1464 4.0939-5.1163 4.5748-8.4695h-5.0945q-0.1527 0.6663-0.4092 1.3128-0.6879 1.7331-2.0091 3.0512-1.3213 1.318-3.0587 2.0041-1.6001 0.6319-3.3211 0.6319-1.7209 0-3.321-0.6319-1.7374-0.6861-3.0587-2.0041-1.3213-1.3181-2.0091-3.0512-0.63347-1.5961-0.63346-3.3128 0-1.5702 0.52996-3.0395 0.54154-1.4842 1.5643-2.7 1.1062-1.3151 2.62-2.1316 1.6437-0.8866 3.5051-1.049 1.8615-0.16246 3.6345 0.42595 1.633 0.54193 2.9513 1.6454l3.2219-3.8302c-2.6269-2.1988-5.8244-3.2736-9.0047-3.2757z"%0D%0A fill="%231E9F33" fill-rule="evenodd" />%0D%0A </g>%0D%0A </g>%0D%0A</svg>';function Q(e){return e==null?!1:typeof e=="number"?isFinite(e):typeof e=="string"?e.trim()!==""&&!isNaN(Number(e)):!1}var M=b({props:{v1:{transform:Number,shadow:0,validate:Q,required:!0,uploadable:!0,downloadable:!0},v2:{transform:Number,shadow:0,validate:Q,required:!0,uploadable:!0,downloadable:!0}}},e=>a("div").append(e.v1,"+",e.v2,"=",T(()=>e.v1.get()+e.v2.get(),[e.v1,e.v2]),a("button").textContent("\u4E0B\u6E38 v1 -1").on("click",()=>e.v1.set(e.v1.get()-1)),a("button").textContent("\u4E0B\u6E38 v2 -1").on("click",()=>e.v2.set(e.v2.get()-1))));var X=b({props:{value:{validate:Number.isInteger,transform:Number,required:!1,shadow:0,downloadable:!0,uploadable:!0}}},e=>{let t=T(()=>e.value.get()*2,[e.value]);return a("div").use(F().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",a("br"),a("button").on("click",()=>e.value.set(e.value.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),a("button").on("click",()=>e.value.set(e.value.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),a("br"),"\u5F53\u524D\u503C\uFF1A",e.value,"\u53CC\u500D\u503C\uFF1A",t,T(()=>q(t.get(),()=>a("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[t]),K(()=>e.value.get()>10,()=>a("p").textContent("count > 10 \u65F6\u663E\u793A"),[e.value]))});var Y=b({},()=>{let e=d(10),t=d(20);return a("div").append("v1:",e,"v2:",t,M({v1:e,v2:t}),a("button").textContent("\u4E0A\u6E38 v1 +1").on("click",()=>e.set(e.get()+1)),a("button").textContent("\u4E0A\u6E38 v2 +1").on("click",()=>t.set(t.get()+1)))});var _={Counter:X,AddExpression:M,ValuePot:Y};0&&(module.exports={$,EventSubcriber,assets,camelToHyphen,createArray,createComponent,examples,hyphenToCamel,isRenderResult,isTreeContext,isWrapper,putIn,render,renderResultSymbol,styleSet,sync,tree,treeContextSymbol,typedIsArray,when,wrap,wrapperSymbol});
1
+ "use strict";var N=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var F=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},oe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of re(t))!ne.call(e,o)&&o!==n&&N(e,o,{get:()=>t[o],enumerable:!(r=te(t,o))||r.enumerable});return e};var se=e=>oe(N({},"__esModule",{value:!0}),e);var ue={};F(ue,{$:()=>U,EventSubcriber:()=>P,assets:()=>J,camelToHyphen:()=>L,createArray:()=>q,createComponent:()=>k,defineEvent:()=>E,examples:()=>ee,hostdown:()=>B,hyphenToCamel:()=>pe,normalizePropertyDescriptor:()=>A,pipeExtract:()=>W,putIn:()=>$,rawProperty:()=>_,render:()=>C,styleSet:()=>b,sync:()=>g,tree:()=>l,typedIsArray:()=>ae,validateStore:()=>z,when:()=>R,wrap:()=>T});module.exports=se(ue);var P=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()}`)}function pe(e){return e.replace(/-([a-z])/g,t=>t[1].toUpperCase())}function ae(e){return Array.isArray(e)}function $(e){return[...Array.isArray(e)?e:[e]]}function q(e,t){return new Array(e).fill(0).map(t)}var D=Symbol("HostTreeFlag"),j=Symbol("ComponentInstanceFlag"),f=Symbol("WrapperFlag");function w(e,t){return Object.assign(e,{[t]:!0})}function u(e,t){return e!=null&&typeof e=="object"&&Object.hasOwn(e,t)&&e[t]===!0}function l(e){let t=typeof e=="string"?document.createElement(e):e,n=new Proxy(w({element:t,append(...r){for(let o of r)if(u(o,f)){let s=[],i=new Comment("Tree anchor");t.appendChild(i);let a=p=>{let c=[...Array.isArray(p)?p:[p]].reverse(),d=[];for(let m of c){let y=C(m);d.push(y),t.insertBefore(y.element,i.nextSibling)}for(let m of s)m.element.remove();s=d};o.event.subcribe(a),a(o.get())}else{let s=o;for(let i of $(s))t.appendChild(C(i).element)}return n},use(r){if(t instanceof HTMLElement){let o=s=>{for(let[i,a]of Object.entries(s))t.style.setProperty(L(String(i)),a)};u(r,f)?(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}},D),{get(r,o,s){return Reflect.has(r,o)?Reflect.get(r,o,s):i=>{if(u(i,f)){let a=p=>t[o]=p;i.event.subcribe(a),a(i.get())}else t[o]=i;return n}}});return n}var h=class extends Error{},O=class extends Error{},H=class extends Error{},I=class extends Error{},M=class extends Error{};function T(e,t){let n=["push","pop","shift","unshift","splice","sort","reverse"],r=p=>{if(!Array.isArray(p))return p;let{proxy:c,revoke:d}=Proxy.revocable(p,{get(m,y,S){if(n.includes(y)){let v=Reflect.get(m,y,S);return typeof v=="function"?(...G)=>{let x=a.get();if(Array.isArray(x)){x=[...x];let K=v.call(m,...G);return a.event.emit(a.get(),x),K}}:Reflect.get(m,y,S)}else return Reflect.get(m,y,S)},set(m,y,S,v){if(Reflect.get(m,y,v)!==S){let x=a.get();if(Array.isArray(x)){x=[...x];let K=Reflect.set(m,y,S,v);return a.event.emit(a.get(),x),K}}return Reflect.set(m,y,S,v)}});return s=d,c},o=new P,s=null,i=r(e),a=w({get(){return i},set(p){if(i!==p){let c=i;Array.isArray(c)&&s?(c=[...c],s(),i=r(p)):i=p,this.event.emit(p,c)}},updateOnly(){this.event.emit(this.get(),this.get())},event:o},f);return{...a,...t??{}}}function g(e,t=[]){let n=T(e()),r=()=>{let o=e();n.get()!==o&&n.set(o)};for(let o of t)u(o,f)&&o.event.subcribe(r);return n}function R(e,t,n=[]){return g(()=>{let r;return typeof e=="function"?r=e():r=e.get(),[r?t():null]},[...n,...u(e,f)?[e]:[]])}function _(){return e=>e}function A(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function z(e){for(let t in e){let n=e[t];if(n.shadow){if(n.required)throw new H(`The required property ${t} can't have a shadow.`);if(n.validate&&!n.validate(n.shadow))throw new h(`The shadow of ${t} can't pass the validation.`)}}}function B(e,t){e||(e={});let n={};for(let r in t){let o=A(t[r]),s=a=>{if(u(n[r],f))n[r].set(a);else{let p=T(a);n[r]=p,p.event.subcribe(c=>{if(!(!u(e[r],f)||!u(n[r],f))&&n[r].get()!==e[r].get()){if(!o.uploadable)throw new I(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(a,p)=>{if(!p&&!o.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!o.validate(a))throw new h(`The input value of ${r} can't pass the validation.`);s(o.transform(a))};if(!Object.hasOwn(e,r)){if(o.required)throw new O(`Missing a required property ${r}.`);s(o.shadow);continue}u(e[r],f)?(e[r].event.subcribe(a=>i(a,!1)),i(e[r].get(),!0)):i(e[r],!0)}return n}function W(e){return typeof e=="function"?()=>T(e()):u(e,f)?W(e):()=>T(e)}function C(e){let t;if(e instanceof HTMLElement)t=l(e);else if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")t=l(new Text(String(e)));else if(u(e,j))t=e.$;else if(e==null)t=l(new Comment("Empty tree context"));else if(u(e,D))t=e;else throw new M(`Failed to render ${e} into a Node.`);return t}function U(e){return e}function k(e,t){z(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([o,s])=>[o,A(s)]));return Object.assign((o,s)=>{let i=t(B(o,n),W(s),(p,c)=>{let d=e.events?.find(m=>m.name===p);if(!d)throw new TypeError(`No events named ${p} to emit.`);a.element.dispatchEvent(new CustomEvent(p,{detail:c,bubbles:d.bubbleable,cancelable:!1}))}),a=C(i);return w({mount(p){let c=typeof p=="string"?[...document.querySelectorAll(p)]:[p];for(let d of c)d.appendChild(a.element)},on(p,c){return a.on(p,d=>d instanceof CustomEvent?c(d.detail):null),this},$:a},j)},{props:n,events:e.events})}function b(){let e={},t=new Proxy({rules:e},{get(n,r,o){return Reflect.has(n,r)?Reflect.get(n,r,o):s=>(e[r]=String(s),t)}});return t}function E(e,t){return{name:e,...t??{}}}var J={};F(J,{logo:()=>V});var V={};F(V,{default:()=>le});var le='data:image/svg+xml,<svg width="337" height="395" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="hidden"><defs><filter id="fx0" x="-10%" y="-10%" width="120%" height="120%" filterUnits="userSpaceOnUse" primitiveUnits="userSpaceOnUse"><feComponentTransfer color-interpolation-filters="sRGB"><feFuncR type="discrete" tableValues="1 1"/><feFuncG type="discrete" tableValues="0.752941 0.752941"/><feFuncB type="discrete" tableValues="0 0"/><feFuncA type="linear" slope="0.4" intercept="0"/></feComponentTransfer><feGaussianBlur stdDeviation="0 0"/></filter><clipPath id="clip1"><rect x="119" y="90" width="93" height="142"/></clipPath></defs><g transform="translate(-119 -128)"><g clip-path="url(%23clip1)" filter="url(%23fx0)" transform="translate(125 135)"><g><path d="M37.352-111.688C33.9173-107.395 32.2-101.261 32.2-93.288 32.2-85.4373 33.9173-79.5493 37.352-75.624 40.7867-71.6987 45.5093-69.736 51.52-69.736 60.5973-69.736 68.08-74.6427 73.968-84.456 71.76-107.027 63.9707-118.312 50.6-118.312 45.3253-118.312 40.9093-116.104 37.352-111.688ZM84.088-16.008C74.0293-3.61867 61.5787 2.576 46.736 2.576 32.016 2.576 21.5893-0.797334 15.456-7.544 13.3707-9.26133 11.96-8.34133 11.224-4.784 10.12-10.1813 11.96-15.5787 16.744-20.976 21.528-26.496 25.944-27.4773 29.992-23.92 31.832-20.976 36.9227-19.504 45.264-19.504 53.6053-19.504 60.352-23.0613 65.504-30.176 70.7787-37.4133 73.4773-45.8773 73.6-55.568 73.8453-58.6347 75.1333-60.1067 77.464-59.984 75.3787-63.4187 72.128-63.296 67.712-59.616 63.4187-56.0587 58.7573-53.2987 53.728-51.336 53.6053-50.7227 51.152-50.416 46.368-50.416 34.592-50.416 25.1467-54.0347 18.032-61.272 10.9173-68.632 7.36-79.1813 7.36-92.92 7.36-106.781 11.4693-117.883 19.688-126.224 28.0293-134.565 38.2107-138.736 50.232-138.736 64.216-138.736 75.8693-133.032 85.192-121.624 94.5147-110.339 99.176-93.0427 99.176-69.736 99.176-46.4293 94.1467-28.52 84.088-16.008Z" fill="%23ED7D31" transform="translate(111.796 229)"/></g></g><text fill="%23ED7D31" font-family="Swei Fist Sans CJK JP,Swei Fist Sans CJK JP_MSFontService,sans-serif" font-weight="700" font-size="184" transform="translate(229.799 357)">9</text></g></svg>';var Z=k({props:{value:{validate:Number.isInteger,transform:Number,required:!1,shadow:0,downloadable:!0,uploadable:!0}},events:[E("up",{template:{arg1:0,arg2:!1},bubbleable:!0}),E("down",{template:{arg3:"sb",arg4:Symbol()},bubbleable:!0})]},e=>{let t=g(()=>e.value.get()*2,[e.value]);return l("div").use(b().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",l("br"),l("button").on("click",()=>e.value.set(e.value.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),l("button").on("click",()=>e.value.set(e.value.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),l("br"),"\u5F53\u524D\u503C\uFF1A",e.value,"\u53CC\u500D\u503C\uFF1A",t,g(()=>q(t.get(),()=>l("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[t]),R(()=>e.value.get()>10,()=>l("p").textContent("count > 10 \u65F6\u663E\u793A"),[e.value]))});var Q=b().backgroundColor("blue").color("white"),X=b().display("flex").flexDirection("column"),Y=k({props:{items:{transform:_(),shadow:["OptionA","OptionB","OptionC"]},value:{transform:Number,uploadable:!0,required:!0}},events:[E("select",{template:0}),E("toggleState",{template:!1})]},(e,t,n)=>{let r=T(!1),o=s=>{e.value.set(s),r.set(!1),n("select",e.value.get())};return r.event.subcribe(s=>n("toggleState",s)),l("div").use(X).append(l("span").use(Q).use(b().backgroundColor("red")).textContent(g(()=>e.items.get()[e.value.get()],[e.items,e.value])).on("click",()=>r.set(!r.get())),t(),R(r,()=>l("div").use(X).append(g(()=>e.items.get().map((s,i)=>l("span").use(Q).textContent(s).on("click",()=>o(i))),[e.items]))))});var ee={Counter:Z,Selector:Y};0&&(module.exports={$,EventSubcriber,assets,camelToHyphen,createArray,createComponent,defineEvent,examples,hostdown,hyphenToCamel,normalizePropertyDescriptor,pipeExtract,putIn,rawProperty,render,styleSet,sync,tree,typedIsArray,validateStore,when,wrap});
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/examples/AddExpression.ts","../src/examples/Counter.ts","../src/examples/ValuePot.ts","../src/examples/index.ts"],"sourcesContent":["export * from \"./channel\";\r\nexport * from \"./dom\";\r\nexport * from \"./util\";\r\n\r\nexport * as assets from \"./assets\";\r\nexport { default as examples } from \"./examples\";\r\n","interface SubcriberCallback<T extends unknown[]> {\r\n (...data: T): void;\r\n}\r\ninterface Subcriber<T extends unknown[]> {\r\n callback: SubcriberCallback<T>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[]> {\r\n private subcribers: Subcriber<T>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T) {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n for (const subcriber of this.subcribers) {\r\n subcriber.callback(...data);\r\n }\r\n this.emitting = false;\r\n }\r\n}","export function camelToHyphen(str: string) {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\r\n}\r\nexport function hyphenToCamel(str: string) {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n}","import { EventSubcriber } from \"@/channel/event-subcriber\";\r\nimport { TreeResult } from \"./component\";\r\n\r\nexport const wrapperSymbol = Symbol(\"WrapperFlag\");\r\nexport type Wrapper<T> = {\r\n get(): T;\r\n set(newData: T): void;\r\n updateOnly(): void;\r\n event: EventSubcriber<[T, T]>;\r\n} & { [K in typeof wrapperSymbol]: true; };\r\nexport function wrap<T>(initialData: T, wrapperOptions?: Partial<Wrapper<T>>): Wrapper<T> {\r\n const arrayActions = [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\"];\r\n const patch = (data: T) => {\r\n if (!Array.isArray(data)) { return data; }\r\n const { proxy, revoke: newRevoke } = Proxy.revocable(data, {\r\n get(target, p: string, receiver) {\r\n if (arrayActions.includes(p)) {\r\n const originalMethod = Reflect.get(target, p, receiver) as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === \"function\") {\r\n return (...args: unknown[]) => {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = originalMethod.call(target, ...args);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n };\r\n } else return Reflect.get(target, p, receiver);\r\n } else {\r\n return Reflect.get(target, p, receiver);\r\n }\r\n },\r\n set(target, p, newValue, receiver) {\r\n const oldValue = Reflect.get(target, p, receiver);\r\n if (oldValue !== newValue) {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = Reflect.set(target, p, newValue, receiver);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n }\r\n return Reflect.set(target, p, newValue, receiver);\r\n },\r\n });\r\n oldRevoke = newRevoke;\r\n return proxy;\r\n };\r\n const event = new EventSubcriber<[T, T]>();\r\n let oldRevoke: (() => void) | null = null;\r\n let currentData = patch(initialData);\r\n const wrapper: Wrapper<T> = {\r\n get() { return currentData; },\r\n set(newData) {\r\n if (currentData !== newData) {\r\n let oldData = currentData;\r\n if (Array.isArray(oldData) && oldRevoke) {\r\n oldRevoke();\r\n oldData = [...oldData] as T;\r\n currentData = patch(newData);\r\n } else {\r\n currentData = newData;\r\n };\r\n this.event.emit(newData, oldData);\r\n }\r\n },\r\n updateOnly() {\r\n this.event.emit(this.get(), this.get());\r\n },\r\n event,\r\n [wrapperSymbol]: true\r\n };\r\n return { ...wrapper, ...wrapperOptions ?? {} };\r\n}\r\nexport function sync<R>(effectRenderer: () => R, dependencies: unknown[] = []): Wrapper<R> {\r\n const internalWrapper = wrap(effectRenderer());\r\n const update = () => {\r\n const newData = effectRenderer();\r\n const currentData = internalWrapper.get();\r\n const hasChanged = currentData !== newData;\r\n if (hasChanged) {\r\n internalWrapper.set(newData);\r\n }\r\n };\r\n for (const dependency of dependencies) {\r\n if (!isWrapper(dependency)) continue;\r\n dependency.event.subcribe(update);\r\n }\r\n return internalWrapper;\r\n}\r\nexport function when(condition: Wrapper<boolean> | (() => boolean), tree: () => TreeResult, dependencies: unknown[] = []) {\r\n return sync(() => {\r\n let result: boolean;\r\n if (typeof condition === \"function\") {\r\n result = condition();\r\n } else {\r\n result = condition.get();\r\n }\r\n return [result ? tree() : null];\r\n }, [...dependencies, ...(isWrapper(condition) ? [condition] : [])]);\r\n}\r\nexport function isWrapper<T>(data: unknown): data is Wrapper<T> {\r\n return !!data && Object.hasOwn(data, wrapperSymbol) && data[wrapperSymbol] === true;\r\n}\r\n","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIn<T>(data: T) {\r\n return [...(Array.isArray(data) ? data : [data])] as T extends (infer R)[] ? R[] : [T];\r\n}\r\nexport function createArray<T>(length: number, filler: () => T): T[] {\r\n return new Array(length).fill(0).map(filler);\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, TreeResult } from \"./component\";\r\nimport { isWrapper, Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIn } from \"@/util/array\";\r\n\r\nexport type TreeContext<T extends HTMLElement = HTMLElement> = {\r\n [K in keyof T as T[K] extends (...args: unknown[]) => unknown ? never : K]: (data: T[K] | Wrapper<T[K]>) => TreeContext<T>;\r\n} & {\r\n element: T;\r\n append(...children: (\r\n TreeResult |\r\n TreeResult[] |\r\n Wrapper<TreeResult> |\r\n Wrapper<TreeResult[]> |\r\n Wrapper<TreeResult | TreeResult[]>\r\n )[]): TreeContext<T>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): TreeContext<T>;\r\n on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): TreeContext<T>;\r\n} & { [K in typeof treeContextSymbol]: true; };\r\nexport const treeContextSymbol = Symbol(\"TreeContextFlag\");\r\nexport function isTreeContext<T extends HTMLElement>(data: unknown): data is TreeContext<T> {\r\n return !!data && Object.hasOwn(data, treeContextSymbol) && data[treeContextSymbol] === true;\r\n}\r\nexport function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const context: TreeContext<HTMLElementTagNameMap[E]> = new Proxy({\r\n element,\r\n append(...children: (TreeResult | TreeResult[] | Wrapper<TreeResult | TreeResult[]>)[]) {\r\n for (const child of children) {\r\n if (isWrapper<TreeResult | TreeResult[]>(child)) {\r\n let oldChildren: TreeContext[] = [];\r\n const baseAnchor = new Comment(\"Tree anchor\");\r\n element.appendChild(baseAnchor);\r\n const update = (newTrees: TreeResult[] | TreeResult) => {\r\n const normalizedTrees = [...(Array.isArray(newTrees) ? newTrees : [newTrees])];\r\n const newChildren: TreeContext[] = [];\r\n for (const newTree of normalizedTrees) {\r\n const child = render(newTree);\r\n newChildren.push(child);\r\n element.insertBefore(child.element, baseAnchor.nextSibling);\r\n }\r\n for (const oldChild of oldChildren) {\r\n oldChild.element.remove();\r\n }\r\n oldChildren = newChildren;\r\n };\r\n child.event.subcribe(update);\r\n update(child.get());\r\n } else {\r\n const children = child;\r\n for (const child of putIn(children)) {\r\n element.appendChild(render(child).element);\r\n }\r\n }\r\n }\r\n return context;\r\n },\r\n use(styleSet: StyleSet | Wrapper<StyleSet>) {\r\n if (element instanceof HTMLElement) {\r\n const update = (rules: Record<string, string>) => {\r\n for (const [key, value] of Object.entries(rules)) {\r\n element.style.setProperty(camelToHyphen(String(key)), value);\r\n }\r\n };\r\n if (isWrapper<StyleSet>(styleSet)) {\r\n styleSet.event.subcribe((newData) => update(newData.rules));\r\n update(styleSet.get().rules);\r\n } else {\r\n update(styleSet.rules);\r\n }\r\n }\r\n return context;\r\n },\r\n on(key, handler, options) {\r\n if (element instanceof HTMLElement) {\r\n element.addEventListener(key, handler, options);\r\n }\r\n return context;\r\n },\r\n [treeContextSymbol]: true\r\n } as TreeContext<HTMLElementTagNameMap[E]>, {\r\n get<P extends keyof Node>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: HTMLElementTagNameMap[E][P] | Wrapper<HTMLElementTagNameMap[E][P]>) => {\r\n if (isWrapper<HTMLElementTagNameMap[E][P]>(data)) {\r\n const update = (newData: HTMLElementTagNameMap[E][P]) => element[p] = newData;\r\n data.event.subcribe(update);\r\n update(data.get());\r\n } else {\r\n element[p] = data;\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingFieldError extends Error { }\r\nexport class ConflictionError extends Error { }\r\nexport class AccessError extends Error { }\r\nexport class BrokenRendererError extends Error { }","import { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, ComponentPropertyStore } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingFieldError, ValidationFailed } from \"@/exceptions\";\r\nimport { isWrapper, wrap } from \"./reactive\";\r\n\r\nexport function normalizePropertyDescriptor\r\n <I, O, R extends boolean>(\r\n descriptor: ComponentPropertyDescriptor<I, O, R>\r\n): Required<ComponentPropertyDescriptor<I, O, R>> {\r\n return Object.assign({\r\n validate: () => true,\r\n transform: x => x,\r\n shadow: null,\r\n required: false,\r\n downloadable: true,\r\n uploadable: false\r\n } satisfies Required<ComponentPropertyDescriptor>, descriptor);\r\n}\r\nexport function validateStore(store: ComponentPropertyStore) {\r\n for (const propertyKey in store) {\r\n const descriptor = store[propertyKey];\r\n if (descriptor.shadow) {\r\n if (descriptor.required) {\r\n throw new ConflictionError(`The required property ${propertyKey} can't have a shadow.`);\r\n }\r\n if (descriptor.validate && !descriptor.validate(descriptor.shadow)) {\r\n throw new ValidationFailed(`The shadow of ${propertyKey} can't pass the validation.`);\r\n }\r\n }\r\n }\r\n}\r\nexport function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T) {\r\n if (!upstream) upstream = {} as ComponentPropertyInputDict<T>;\r\n const downstream: Record<string, unknown> = {};\r\n for (const propertyKey in store) {\r\n const descriptor = normalizePropertyDescriptor(store[propertyKey]);\r\n const setValue = (newValue: unknown) => {\r\n if (isWrapper(downstream[propertyKey])) {\r\n downstream[propertyKey].set(newValue);\r\n } else {\r\n const wrapper = wrap(newValue);\r\n downstream[propertyKey] = wrapper;\r\n wrapper.event.subcribe((newData) => {\r\n if (!isWrapper(upstream[propertyKey]) || !isWrapper(downstream[propertyKey])) return;\r\n if (downstream[propertyKey].get() === upstream[propertyKey].get()) return;\r\n if (!descriptor.uploadable) throw new AccessError(`Property ${propertyKey} isn't uploadable but being set.`);\r\n upstream[propertyKey].set(newData);\r\n });\r\n }\r\n };\r\n const update = (inputValue: unknown, firstSet: boolean) => {\r\n if (!firstSet && !descriptor.downloadable) {\r\n console.warn(`Property ${propertyKey} isn't downloadable but being emitted.`);\r\n return;\r\n }\r\n if (!descriptor.validate(inputValue)) {\r\n throw new ValidationFailed(`The input value of ${propertyKey} can't pass the validation.`);\r\n }\r\n setValue(descriptor.transform(inputValue));\r\n };\r\n if (!Object.hasOwn(upstream, propertyKey)) {\r\n if (descriptor.required) {\r\n throw new MissingFieldError(`Missing a required property ${propertyKey}.`);\r\n }\r\n setValue(descriptor.shadow);\r\n continue;\r\n }\r\n if (isWrapper(upstream[propertyKey])) {\r\n upstream[propertyKey].event.subcribe(e => update(e, false));\r\n update(upstream[propertyKey].get(), true);\r\n } else {\r\n update(upstream[propertyKey], true);\r\n }\r\n }\r\n return downstream as ComponentPropertyOutputDict<T>;\r\n}","import { TreeResult } from \"./component\";\r\nimport { isWrapper, wrap, Wrapper } from \"./reactive\";\r\n\r\nexport type RawSlotInput = TreeResult | (() => TreeResult);\r\nexport type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;\r\nexport type SlotOutput = Wrapper<TreeResult>;\r\n\r\nexport function pipeExtract(input: SlotInput): SlotOutput {\r\n if (typeof input === \"function\") {\r\n return wrap(input());\r\n } else if (isWrapper<RawSlotInput>(input)) {\r\n return pipeExtract(input);\r\n } else return wrap(input);\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { TreeContext, isTreeContext, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;\r\n}\r\nexport type Component<P extends ComponentPropertyStore> =\r\n ComponentRenderEntry<P> & ComponentOption<P>;\r\nexport interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {\r\n validate?: (data: I) => boolean;\r\n transform: (data: I) => O;\r\n shadow?: O;\r\n required?: R;\r\n downloadable?: boolean;\r\n uploadable?: boolean;\r\n}\r\nexport type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;\r\nexport type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P as P[K][\"required\"] extends true ? K : never]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> : never;\r\n} & {\r\n [K in keyof P as P[K][\"required\"] extends false | unknown ? K : never]?:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> | EmptyValue : never;\r\n}\r\nexport type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? Wrapper<R> : never;\r\n};\r\nexport interface ComponentOption<P extends ComponentPropertyStore> {\r\n props?: P;\r\n}\r\nexport type RenderResult = {\r\n mount(to: string | HTMLElement): void;\r\n $: TreeContext;\r\n} & { [K in typeof renderResultSymbol]: true; };\r\nexport type TreeResult =\r\n HTMLElement |\r\n TreeContext |\r\n string |\r\n number |\r\n boolean |\r\n EmptyValue |\r\n RenderResult;\r\nexport function render(nodeTree: TreeResult) {\r\n let result: TreeContext;\r\n if (nodeTree instanceof HTMLElement) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\") {\r\n result = tree(new Text(String(nodeTree)));\r\n } else if (isRenderResult(nodeTree)) {\r\n result = nodeTree.$;\r\n } else if (nodeTree === null || nodeTree === undefined) {\r\n result = tree(new Comment(\"Empty tree context\"));\r\n } else if (isTreeContext(nodeTree)) {\r\n result = nodeTree;\r\n } else {\r\n throw new BrokenRendererError(`Failed to render ${nodeTree} into a Node.`);\r\n }\r\n return result;\r\n}\r\nexport const renderResultSymbol = Symbol(\"RenderResultFlag\");\r\nexport function isRenderResult(data: unknown): data is RenderResult {\r\n return !!data && Object.hasOwn(data, renderResultSymbol) && data[renderResultSymbol] === true;\r\n}\r\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<TreeResult>;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore\r\n>(\r\n options: ComponentOption<P>,\r\n internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult\r\n): Component<P> {\r\n validateStore(options.props ?? {});\r\n const propStore = Object.fromEntries(\r\n Object\r\n .entries(options.props ?? {})\r\n .map(([key, value]) => [\r\n key,\r\n normalizePropertyDescriptor(value),\r\n ])\r\n ) as P;\r\n const entryRenderer = (props?: ComponentPropertyInputDict<P>, slot?: SlotInput) => {\r\n const nodeTree = internalRenderer(hostdown(props, propStore), pipeExtract(slot));\r\n const result = render(nodeTree);\r\n return {\r\n mount(to: string | HTMLElement) {\r\n const targets = typeof to === \"string\" ? [...document.querySelectorAll<HTMLElement>(to)] : [to];\r\n for (const target of targets) {\r\n target.appendChild(result.element);\r\n }\r\n },\r\n $: result,\r\n [renderResultSymbol]: true as const\r\n };\r\n };\r\n return Object.assign(entryRenderer, {\r\n props: propStore\r\n } satisfies ComponentOption<P>);\r\n}","export type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n toString(): string;\r\n};\r\nexport function styleSet() {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n } as StyleSet, {\r\n get<P extends string & keyof CSSStyleDeclaration>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: CSSStyleDeclaration[P]) => {\r\n rules[p] = String(data);\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export * as logo from \"./logo.svg\";\r\n","import { $, createComponent, sync, tree, TreeResult } from \"@\";\r\n\r\nfunction isNumeric(value: unknown) {\r\n if (value === null || value === undefined) return false;\r\n if (typeof value === \"number\") return isFinite(value);\r\n if (typeof value === \"string\") return value.trim() !== \"\" && !isNaN(Number(value));\r\n return false;\r\n}\r\nexport default createComponent({\r\n props: {\r\n v1: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n },\r\n v2: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n }\r\n }\r\n}, (props) =>\r\n tree(\"div\").append(\r\n $(props.v1), \"+\", $(props.v2), \"=\",\r\n sync<TreeResult>(() => props.v1.get() + props.v2.get(), [props.v1, props.v2]),\r\n tree(\"button\")\r\n .textContent(\"下游 v1 -1\")\r\n .on(\"click\", () => props.v1.set(props.v1.get() - 1)),\r\n tree(\"button\")\r\n .textContent(\"下游 v2 -1\")\r\n .on(\"click\", () => props.v2.set(props.v2.get() - 1)),\r\n ),\r\n);","import { $, createComponent, tree, sync, styleSet, createArray, when } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n value: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n downloadable: true, //(上游→下游)\r\n uploadable: true, //(下游→上游),v-model双向绑定\r\n }\r\n }\r\n}, (props) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n return tree(\"div\")\r\n .use(styleSet().fontSize(\"20px\").padding(\"10px\"))\r\n .append(\r\n \"敲木鱼\", tree(\"br\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() + 1)) //参数uploadable,赋值会实时同步到上游\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(props.value), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n $(sync( //只要是能渲染的东西,就能进行响应式引用\r\n () => createArray(\r\n doubled.get(),\r\n () => tree(\"div\").textContent(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").textContent(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import { $, createComponent, tree, wrap } from \"@\";\r\nimport AddExpression from \"./AddExpression\";\r\n\r\nexport default createComponent({}, () => {\r\n const v1 = wrap(10);\r\n const v2 = wrap(20);\r\n return tree(\"div\")\r\n .append(\r\n \"v1:\", $(v1), \"v2:\", $(v2),\r\n AddExpression({ v1, v2 }),\r\n tree(\"button\")\r\n .textContent(\"上游 v1 +1\")\r\n .on(\"click\", () => v1.set(v1.get() + 1)),\r\n tree(\"button\")\r\n .textContent(\"上游 v2 +1\")\r\n .on(\"click\", () => v2.set(v2.get() + 1)),\r\n );\r\n});","import AddExpression from \"./AddExpression\";\r\nimport Counter from \"./Counter\";\r\nimport ValuePot from \"./ValuePot\";\r\n\r\nexport default { Counter, AddExpression, ValuePot };"],"mappings":"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","names":["index_exports","__export","$","EventSubcriber","assets_exports","camelToHyphen","createArray","createComponent","examples_default","hyphenToCamel","isRenderResult","isTreeContext","isWrapper","putIn","render","renderResultSymbol","styleSet","sync","tree","treeContextSymbol","typedIsArray","when","wrap","wrapperSymbol","__toCommonJS","EventSubcriber","callback","once","data","subcriber","camelToHyphen","str","letter","hyphenToCamel","g","wrapperSymbol","wrap","initialData","wrapperOptions","arrayActions","patch","data","proxy","newRevoke","target","p","receiver","originalMethod","args","oldData","wrapper","result","newValue","oldRevoke","event","EventSubcriber","currentData","newData","sync","effectRenderer","dependencies","internalWrapper","update","dependency","isWrapper","when","condition","tree","typedIsArray","arr","putIn","data","createArray","length","filler","treeContextSymbol","isTreeContext","data","tree","element","context","children","child","isWrapper","oldChildren","baseAnchor","update","newTrees","normalizedTrees","newChildren","newTree","render","oldChild","putIn","styleSet","rules","key","value","camelToHyphen","newData","handler","options","target","p","receiver","ValidationFailed","MissingFieldError","ConflictionError","AccessError","BrokenRendererError","normalizePropertyDescriptor","descriptor","x","validateStore","store","propertyKey","ConflictionError","ValidationFailed","hostdown","upstream","downstream","setValue","newValue","isWrapper","wrapper","wrap","newData","AccessError","update","inputValue","firstSet","MissingFieldError","e","pipeExtract","input","wrap","isWrapper","render","nodeTree","result","tree","isRenderResult","isTreeContext","BrokenRendererError","renderResultSymbol","data","$","createComponent","options","internalRenderer","validateStore","propStore","key","value","normalizePropertyDescriptor","props","slot","hostdown","pipeExtract","to","targets","target","styleSet","rules","context","target","p","receiver","data","assets_exports","__export","logo_exports","isNumeric","value","AddExpression_default","createComponent","props","tree","sync","Counter_default","createComponent","props","doubled","sync","tree","styleSet","createArray","when","ValuePot_default","createComponent","v1","wrap","v2","tree","AddExpression_default","examples_default","Counter_default","AddExpression_default","ValuePot_default"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/channel/event-subcriber.ts","../src/util/char.ts","../src/util/array.ts","../src/constants/flags.ts","../src/dom/tree.ts","../src/exceptions/index.ts","../src/dom/reactive.ts","../src/dom/property.ts","../src/dom/slot.ts","../src/dom/component.ts","../src/dom/style.ts","../src/dom/event.ts","../src/assets/index.ts","../src/examples/Counter.ts","../src/examples/Selector.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}","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 { ComponentInstance, HostTree, Wrapper } from \"@/dom\";\r\n\r\ntype FlagMap<T> =\r\n { [K in typeof HOST_TREE]: HostTree; }\r\n & { [K in typeof COMPONENT_INSTANCE]: ComponentInstance; }\r\n & { [K in typeof WRAPPER]: Wrapper<T>; }\r\n\r\nexport const HOST_TREE = Symbol(\"HostTreeFlag\");\r\nexport const COMPONENT_INSTANCE = Symbol(\"ComponentInstanceFlag\");\r\nexport const WRAPPER = Symbol(\"WrapperFlag\");\r\n\r\nexport function appendFlag<T extends object, F extends keyof FlagMap<unknown>>(data: T, flag: F) {\r\n return Object.assign(data, { [flag]: true }) as T & { [K in F]: true };\r\n}\r\nexport function matchFlag<T, K extends keyof FlagMap<T>>(data: unknown, flag: K): data is FlagMap<T>[K] {\r\n return (\r\n (data !== null && data !== undefined)\r\n && typeof data === \"object\"\r\n && Object.hasOwn(data, flag)\r\n && data[flag] === true\r\n );\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, SourceTree } from \"./component\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIn } from \"@/util/array\";\r\nimport { appendFlag, HOST_TREE, matchFlag, WRAPPER } from \"@/constants/flags\";\r\n\r\nexport type HostTree<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]>) => HostTree<T>;\r\n} & {\r\n element: T;\r\n append(...children: (\r\n SourceTree |\r\n SourceTree[] |\r\n Wrapper<SourceTree> |\r\n Wrapper<SourceTree[]> |\r\n Wrapper<SourceTree | SourceTree[]>\r\n )[]): HostTree<T>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<T>;\r\n on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): HostTree<T>;\r\n on(key: string, handler: (...args: unknown[]) => unknown): HostTree<T>;\r\n};\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: HostTree<HTMLElementTagNameMap[E]> = new Proxy(appendFlag({\r\n element,\r\n append(...children: (SourceTree | SourceTree[] | Wrapper<SourceTree | SourceTree[]>)[]) {\r\n for (const child of children) {\r\n if (matchFlag<SourceTree | SourceTree[], typeof WRAPPER>(child, WRAPPER)) {\r\n let oldChildren: HostTree[] = [];\r\n const baseAnchor = new Comment(\"Tree anchor\");\r\n element.appendChild(baseAnchor);\r\n const update = (newTrees: SourceTree[] | SourceTree) => {\r\n const normalizedTrees = [...(Array.isArray(newTrees) ? newTrees : [newTrees])].reverse();\r\n const newChildren: HostTree[] = [];\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 (matchFlag<StyleSet, typeof WRAPPER>(styleSet, WRAPPER)) {\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 HostTree<HTMLElementTagNameMap[E]>, HOST_TREE), {\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 (matchFlag<HTMLElementTagNameMap[E][P], typeof WRAPPER>(data, WRAPPER)) {\r\n const update = (newData: HTMLElementTagNameMap[E][P]) => element[p] = newData;\r\n data.event.subcribe(update);\r\n update(data.get());\r\n } else {\r\n element[p] = data;\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingFieldError extends Error { }\r\nexport class ConflictionError extends Error { }\r\nexport class AccessError extends Error { }\r\nexport class BrokenRendererError extends Error { }","import { EventSubcriber } from \"@/channel/event-subcriber\";\r\nimport { SourceTree } from \"./component\";\r\nimport { appendFlag, matchFlag, WRAPPER } from \"@/constants/flags\";\r\n\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};\r\n\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> = appendFlag({\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 oldData = [...oldData] as T;\r\n oldRevoke();\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 }, WRAPPER);\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 (!matchFlag(dependency, WRAPPER)) continue;\r\n dependency.event.subcribe(update);\r\n }\r\n return internalWrapper;\r\n}\r\nexport function when(condition: Wrapper<boolean> | (() => boolean), tree: () => SourceTree, 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, ...(matchFlag(condition, WRAPPER) ? [condition] : [])]);\r\n}\r\n","import { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, ComponentPropertyStore, PropertyTransformer } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingFieldError, ValidationFailed } from \"@/exceptions\";\r\nimport { matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { wrap } from \"./reactive\";\r\n\r\nexport function rawProperty<T>(): PropertyTransformer<unknown, T> {\r\n return (x) => x as T;\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 (matchFlag(downstream[propertyKey], WRAPPER)) {\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 (!matchFlag(upstream[propertyKey], WRAPPER) || !matchFlag(downstream[propertyKey], WRAPPER)) 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 (matchFlag(upstream[propertyKey], WRAPPER)) {\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 { matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { SourceTree } from \"./component\";\r\nimport { wrap, Wrapper } from \"./reactive\";\r\n\r\nexport type RawSlotInput = SourceTree | (() => SourceTree);\r\nexport type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;\r\nexport type SlotOutput = () => Wrapper<SourceTree>;\r\n\r\nexport function pipeExtract(input: SlotInput): SlotOutput {\r\n if (typeof input === \"function\") {\r\n return () => wrap(input());\r\n } else if (matchFlag<RawSlotInput, typeof WRAPPER>(input, WRAPPER)) {\r\n return pipeExtract(input);\r\n } else return () => wrap(input);\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { HostTree, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\nimport { appendFlag, COMPONENT_INSTANCE, HOST_TREE, matchFlag } from \"@/constants/flags\";\r\nimport { EventDescriptor } from \"./event\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore, E extends ComponentEventStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): ComponentInstance<E>;\r\n}\r\nexport interface ComponentInternalRender<P extends ComponentPropertyStore, E extends ComponentEventStore> {\r\n (\r\n options: ComponentPropertyOutputDict<P>,\r\n slot: SlotOutput,\r\n emit: <D extends E[number], K extends D[\"name\"]>(\r\n key: K,\r\n data: D extends infer R extends EventDescriptor<unknown, string> ? R[\"name\"] extends K ? R[\"template\"] : never : never\r\n ) => void\r\n ): SourceTree;\r\n}\r\nexport type Component<P extends ComponentPropertyStore, E extends ComponentEventStore> =\r\n ComponentRenderEntry<P, E> & ComponentOption<P, E>;\r\nexport interface PropertyTransformer<I, O> {\r\n (data: I): O;\r\n}\r\nexport interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {\r\n validate?: (data: I) => boolean;\r\n transform: PropertyTransformer<I, O>;\r\n shadow?: O;\r\n required?: R;\r\n downloadable?: boolean;\r\n uploadable?: boolean;\r\n}\r\nexport type ComponentEventStore = EventDescriptor<unknown, string>[];\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, E extends ComponentEventStore> {\r\n props?: P;\r\n events?: E;\r\n}\r\nexport type ComponentInstance<E extends ComponentEventStore = ComponentEventStore> = {\r\n mount(to: string | HTMLElement): void;\r\n on<D extends E[number], K extends D[\"name\"]>(\r\n key: K,\r\n data: (data: D extends infer R extends EventDescriptor<unknown, string> ? R[\"name\"] extends K ? R[\"template\"] : never : never) => void\r\n ): ComponentInstance<E>;\r\n $: HostTree;\r\n};\r\nexport type SourceTree =\r\n HTMLElement |\r\n HostTree |\r\n string |\r\n number |\r\n boolean |\r\n EmptyValue |\r\n ComponentInstance;\r\nexport function render(nodeTree: SourceTree) {\r\n let result: HostTree;\r\n if (nodeTree instanceof HTMLElement) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\") {\r\n result = tree(new Text(String(nodeTree)));\r\n } else if (matchFlag(nodeTree, COMPONENT_INSTANCE)) {\r\n result = nodeTree.$;\r\n } else if (nodeTree === null || nodeTree === undefined) {\r\n result = tree(new Comment(\"Empty tree context\"));\r\n } else if (matchFlag(nodeTree, HOST_TREE)) {\r\n result = nodeTree;\r\n } else {\r\n throw new BrokenRendererError(`Failed to render ${nodeTree} into a Node.`);\r\n }\r\n return result;\r\n}\r\n\r\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<SourceTree>;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore,\r\n E extends EventDescriptor<unknown, string>\r\n>(\r\n options: ComponentOption<P, E[]>,\r\n internalRenderer: ComponentInternalRender<P, E[]>\r\n): Component<P, E[]> {\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), (key, data) => {\r\n const targetEvent = options.events?.find(e => e.name === key);\r\n if (!targetEvent) throw new TypeError(`No events named ${key} to emit.`);\r\n result.element.dispatchEvent(new CustomEvent(key, {\r\n detail: data,\r\n bubbles: targetEvent.bubbleable,\r\n cancelable: false\r\n }));\r\n });\r\n const result = render(nodeTree);\r\n return appendFlag({\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 on(key: string, handler: (data: unknown) => void) {\r\n result.on(key, event => event instanceof CustomEvent ? handler(event.detail) : null);\r\n return this;\r\n },\r\n $: result\r\n }, COMPONENT_INSTANCE);\r\n };\r\n return Object.assign(entryRenderer, {\r\n props: propStore,\r\n events: options.events\r\n } as Component<P, E[]>);\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 type EventDescriptor<T, N extends string> = {\r\n name: N;\r\n} & EventOptions<T>;\r\nexport interface EventOptions<T> {\r\n bubbleable?: boolean;\r\n template?: T;\r\n}\r\n\r\nexport function defineEvent<T, N extends string>(name: N, options?: EventOptions<T>): EventDescriptor<T, N> {\r\n return { name, ...options ?? {} };\r\n}","export * as logo from \"./logo.svg\";\r\n","import { $, createComponent, tree, sync, styleSet, createArray, when, defineEvent } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n value: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n downloadable: true, //(上游→下游)\r\n uploadable: true, //(下游→上游),v-model双向绑定\r\n }\r\n },\r\n events: [\r\n defineEvent(\"up\", {\r\n template: {\r\n arg1: 0,\r\n arg2: false\r\n },\r\n bubbleable: true\r\n }),\r\n defineEvent(\"down\", {\r\n template: {\r\n arg3: \"sb\",\r\n arg4: Symbol()\r\n },\r\n bubbleable: true\r\n })\r\n ]\r\n}, (props) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n return tree(\"div\")\r\n .use(styleSet().fontSize(\"20px\").padding(\"10px\"))\r\n .append(\r\n \"敲木鱼\", tree(\"br\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() + 1)) //参数uploadable,赋值会实时同步到上游\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(props.value), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n $(sync( //只要是能渲染的东西,就能进行响应式引用\r\n () => createArray(\r\n doubled.get(),\r\n () => tree(\"div\").textContent(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").textContent(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import { $, createComponent, defineEvent, rawProperty, styleSet, sync, tree, when, wrap } from \"@\";\r\n\r\nconst option = styleSet().backgroundColor(\"blue\").color(\"white\");\r\nconst flexdown = styleSet().display(\"flex\").flexDirection(\"column\");\r\n\r\nexport default createComponent({\r\n props: {\r\n items: {\r\n transform: rawProperty<string[]>(),\r\n shadow: [\"OptionA\", \"OptionB\", \"OptionC\"]\r\n },\r\n value: {\r\n transform: Number,\r\n uploadable: true,\r\n required: true\r\n }\r\n },\r\n events: [\r\n defineEvent(\"select\", { template: 0 }),\r\n defineEvent(\"toggleState\", { template: false })\r\n ]\r\n}, (props, slot, emit) => {\r\n const showing = wrap(false);\r\n const select = (index: number) => {\r\n props.value.set(index);\r\n showing.set(false);\r\n emit(\"select\", props.value.get());\r\n };\r\n showing.event.subcribe(e => emit(\"toggleState\", e));\r\n\r\n return tree(\"div\")\r\n .use(flexdown)\r\n .append(\r\n tree(\"span\")\r\n .use(option).use(styleSet().backgroundColor(\"red\"))\r\n .textContent(sync(() => props.items.get()[props.value.get()], [props.items, props.value]))\r\n .on(\"click\", () => showing.set(!showing.get())),\r\n slot(),\r\n when(showing, () =>\r\n tree(\"div\")\r\n .use(flexdown)\r\n .append(\r\n $(sync(() =>\r\n props.items.get().map((label, index) =>\r\n tree(\"span\")\r\n .use(option)\r\n .textContent(label)\r\n .on(\"click\", () => select(index))\r\n ), [props.items]))\r\n )\r\n )\r\n );\r\n});","import Counter from \"./Counter\";\r\nimport Selector from \"./Selector\";\r\n\r\nexport default { Counter, Selector };"],"mappings":"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","names":["index_exports","__export","$","EventSubcriber","assets_exports","camelToHyphen","createArray","createComponent","defineEvent","examples_default","hostdown","hyphenToCamel","normalizePropertyDescriptor","pipeExtract","putIn","rawProperty","render","styleSet","sync","tree","typedIsArray","validateStore","when","wrap","__toCommonJS","EventSubcriber","callback","once","data","subcriber","camelToHyphen","str","letter","hyphenToCamel","g","typedIsArray","arr","putIn","data","createArray","length","filler","HOST_TREE","COMPONENT_INSTANCE","WRAPPER","appendFlag","data","flag","matchFlag","tree","data","element","context","appendFlag","children","child","matchFlag","WRAPPER","oldChildren","baseAnchor","update","newTrees","normalizedTrees","newChildren","newTree","render","oldChild","putIn","styleSet","rules","key","value","camelToHyphen","newData","handler","options","HOST_TREE","target","p","receiver","ValidationFailed","MissingFieldError","ConflictionError","AccessError","BrokenRendererError","wrap","initialData","wrapperOptions","arrayActions","patch","data","proxy","newRevoke","target","p","receiver","originalMethod","args","oldData","wrapper","result","newValue","oldRevoke","event","EventSubcriber","currentData","appendFlag","newData","WRAPPER","sync","effectRenderer","dependencies","internalWrapper","update","dependency","matchFlag","when","condition","tree","rawProperty","x","normalizePropertyDescriptor","descriptor","validateStore","store","propertyKey","ConflictionError","ValidationFailed","hostdown","upstream","downstream","setValue","newValue","matchFlag","WRAPPER","wrapper","wrap","newData","AccessError","update","inputValue","firstSet","MissingFieldError","e","pipeExtract","input","wrap","matchFlag","WRAPPER","render","nodeTree","result","tree","matchFlag","COMPONENT_INSTANCE","HOST_TREE","BrokenRendererError","$","data","createComponent","options","internalRenderer","validateStore","propStore","key","value","normalizePropertyDescriptor","props","slot","hostdown","pipeExtract","targetEvent","e","appendFlag","to","targets","target","handler","event","styleSet","rules","context","target","p","receiver","data","defineEvent","name","options","assets_exports","__export","logo_exports","Counter_default","createComponent","defineEvent","props","doubled","sync","tree","styleSet","createArray","when","option","styleSet","flexdown","Selector_default","createComponent","rawProperty","defineEvent","props","slot","emit","showing","wrap","select","index","e","tree","sync","when","label","examples_default","Counter_default","Selector_default"]}
package/dist/test.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";function $(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function q(e){return[...Array.isArray(e)?e:[e]]}function j(e,t){return new Array(e).fill(0).map(t)}var w=Symbol("HostTreeFlag"),M=Symbol("ComponentInstanceFlag"),m=Symbol("WrapperFlag");function E(e,t){return Object.assign(e,{[t]:!0})}function l(e,t){return e!=null&&typeof e=="object"&&Object.hasOwn(e,t)&&e[t]===!0}function u(e){let t=typeof e=="string"?document.createElement(e):e,n=new Proxy(E({element:t,append(...r){for(let o of r)if(l(o,m)){let p=[],i=new Comment("Tree anchor");t.appendChild(i);let a=s=>{let c=[...Array.isArray(s)?s:[s]].reverse(),d=[];for(let f of c){let y=h(f);d.push(y),t.insertBefore(y.element,i.nextSibling)}for(let f of p)f.element.remove();p=d};o.event.subcribe(a),a(o.get())}else{let p=o;for(let i of q(p))t.appendChild(h(i).element)}return n},use(r){if(t instanceof HTMLElement){let o=p=>{for(let[i,a]of Object.entries(p))t.style.setProperty($(String(i)),a)};l(r,m)?(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}},w),{get(r,o,p){return Reflect.has(r,o)?Reflect.get(r,o,p):i=>{if(l(i,m)){let a=s=>t[o]=s;i.event.subcribe(a),a(i.get())}else t[o]=i;return n}}});return n}var C=class extends Error{},R=class extends Error{},k=class extends Error{},O=class extends Error{},D=class extends Error{};var H=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 T(e,t){let n=["push","pop","shift","unshift","splice","sort","reverse"],r=s=>{if(!Array.isArray(s))return s;let{proxy:c,revoke:d}=Proxy.revocable(s,{get(f,y,b){if(n.includes(y)){let S=Reflect.get(f,y,b);return typeof S=="function"?(...L)=>{let x=a.get();if(Array.isArray(x)){x=[...x];let A=S.call(f,...L);return a.event.emit(a.get(),x),A}}:Reflect.get(f,y,b)}else return Reflect.get(f,y,b)},set(f,y,b,S){if(Reflect.get(f,y,S)!==b){let x=a.get();if(Array.isArray(x)){x=[...x];let A=Reflect.set(f,y,b,S);return a.event.emit(a.get(),x),A}}return Reflect.set(f,y,b,S)}});return p=d,c},o=new H,p=null,i=r(e),a=E({get(){return i},set(s){if(i!==s){let c=i;Array.isArray(c)&&p?(c=[...c],p(),i=r(s)):i=s,this.event.emit(s,c)}},updateOnly(){this.event.emit(this.get(),this.get())},event:o},m);return{...a,...t??{}}}function g(e,t=[]){let n=T(e()),r=()=>{let o=e();n.get()!==o&&n.set(o)};for(let o of t)l(o,m)&&o.event.subcribe(r);return n}function I(e,t,n=[]){return g(()=>{let r;return typeof e=="function"?r=e():r=e.get(),[r?t():null]},[...n,...l(e,m)?[e]:[]])}function _(){return e=>e}function N(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function z(e){for(let t in e){let n=e[t];if(n.shadow){if(n.required)throw new k(`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 B(e,t){e||(e={});let n={};for(let r in t){let o=N(t[r]),p=a=>{if(l(n[r],m))n[r].set(a);else{let s=T(a);n[r]=s,s.event.subcribe(c=>{if(!(!l(e[r],m)||!l(n[r],m))&&n[r].get()!==e[r].get()){if(!o.uploadable)throw new O(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(a,s)=>{if(!s&&!o.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!o.validate(a))throw new C(`The input value of ${r} can't pass the validation.`);p(o.transform(a))};if(!Object.hasOwn(e,r)){if(o.required)throw new R(`Missing a required property ${r}.`);p(o.shadow);continue}l(e[r],m)?(e[r].event.subcribe(a=>i(a,!1)),i(e[r].get(),!0)):i(e[r],!0)}return n}function K(e){return typeof e=="function"?()=>T(e()):l(e,m)?K(e):()=>T(e)}function h(e){let t;if(e instanceof HTMLElement)t=u(e);else if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")t=u(new Text(String(e)));else if(l(e,M))t=e.$;else if(e==null)t=u(new Comment("Empty tree context"));else if(l(e,w))t=e;else throw new D(`Failed to render ${e} into a Node.`);return t}function W(e,t){z(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([o,p])=>[o,N(p)]));return Object.assign((o,p)=>{let i=t(B(o,n),K(p),(s,c)=>{let d=e.events?.find(f=>f.name===s);if(!d)throw new TypeError(`No events named ${s} to emit.`);a.element.dispatchEvent(new CustomEvent(s,{detail:c,bubbles:d.bubbleable,cancelable:!1}))}),a=h(i);return E({mount(s){let c=typeof s=="string"?[...document.querySelectorAll(s)]:[s];for(let d of c)d.appendChild(a.element)},on(s,c){return a.on(s,d=>d instanceof CustomEvent?c(d.detail):null),this},$:a},M)},{props:n,events:e.events})}function v(){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 P(e,t){return{name:e,...t??{}}}var V=W({props:{value:{validate:Number.isInteger,transform:Number,required:!1,shadow:0,downloadable:!0,uploadable:!0}},events:[P("up",{template:{arg1:0,arg2:!1},bubbleable:!0}),P("down",{template:{arg3:"sb",arg4:Symbol()},bubbleable:!0})]},e=>{let t=g(()=>e.value.get()*2,[e.value]);return u("div").use(v().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",u("br"),u("button").on("click",()=>e.value.set(e.value.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),u("button").on("click",()=>e.value.set(e.value.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),u("br"),"\u5F53\u524D\u503C\uFF1A",e.value,"\u53CC\u500D\u503C\uFF1A",t,g(()=>j(t.get(),()=>u("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[t]),I(()=>e.value.get()>10,()=>u("p").textContent("count > 10 \u65F6\u663E\u793A"),[e.value]))});var U=v().backgroundColor("blue").color("white"),Z=v().display("flex").flexDirection("column"),G=W({props:{items:{transform:_(),shadow:["OptionA","OptionB","OptionC"]},value:{transform:Number,uploadable:!0,required:!0}},events:[P("select",{template:0}),P("toggleState",{template:!1})]},(e,t,n)=>{let r=T(!1),o=p=>{e.value.set(p),r.set(!1),n("select",e.value.get())};return r.event.subcribe(p=>n("toggleState",p)),u("div").use(Z).append(u("span").use(U).use(v().backgroundColor("red")).textContent(g(()=>e.items.get()[e.value.get()],[e.items,e.value])).on("click",()=>r.set(!r.get())),t(),I(r,()=>u("div").use(Z).append(g(()=>e.items.get().map((p,i)=>u("span").use(U).textContent(p).on("click",()=>o(i))),[e.items]))))});var F={Counter:V,Selector:G};var X=T(0);F.Selector({value:X}).on("select",e=>console.log("\u5F53\u524D\u9009\u9879\uFF1A",e)).on("toggleState",e=>console.log("\u5F53\u524D\u662F\u5426\u5F00\u5173\uFF1A",e)).mount("#app");
2
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util/char.ts","../src/util/array.ts","../src/constants/flags.ts","../src/dom/tree.ts","../src/exceptions/index.ts","../src/channel/event-subcriber.ts","../src/dom/reactive.ts","../src/dom/property.ts","../src/dom/slot.ts","../src/dom/component.ts","../src/dom/style.ts","../src/dom/event.ts","../src/examples/Counter.ts","../src/examples/Selector.ts","../src/examples/index.ts","../src/test.ts"],"sourcesContent":["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}","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 { ComponentInstance, HostTree, Wrapper } from \"@/dom\";\r\n\r\ntype FlagMap<T> =\r\n { [K in typeof HOST_TREE]: HostTree; }\r\n & { [K in typeof COMPONENT_INSTANCE]: ComponentInstance; }\r\n & { [K in typeof WRAPPER]: Wrapper<T>; }\r\n\r\nexport const HOST_TREE = Symbol(\"HostTreeFlag\");\r\nexport const COMPONENT_INSTANCE = Symbol(\"ComponentInstanceFlag\");\r\nexport const WRAPPER = Symbol(\"WrapperFlag\");\r\n\r\nexport function appendFlag<T extends object, F extends keyof FlagMap<unknown>>(data: T, flag: F) {\r\n return Object.assign(data, { [flag]: true }) as T & { [K in F]: true };\r\n}\r\nexport function matchFlag<T, K extends keyof FlagMap<T>>(data: unknown, flag: K): data is FlagMap<T>[K] {\r\n return (\r\n (data !== null && data !== undefined)\r\n && typeof data === \"object\"\r\n && Object.hasOwn(data, flag)\r\n && data[flag] === true\r\n );\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, SourceTree } from \"./component\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIn } from \"@/util/array\";\r\nimport { appendFlag, HOST_TREE, matchFlag, WRAPPER } from \"@/constants/flags\";\r\n\r\nexport type HostTree<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]>) => HostTree<T>;\r\n} & {\r\n element: T;\r\n append(...children: (\r\n SourceTree |\r\n SourceTree[] |\r\n Wrapper<SourceTree> |\r\n Wrapper<SourceTree[]> |\r\n Wrapper<SourceTree | SourceTree[]>\r\n )[]): HostTree<T>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<T>;\r\n on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): HostTree<T>;\r\n on(key: string, handler: (...args: unknown[]) => unknown): HostTree<T>;\r\n};\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: HostTree<HTMLElementTagNameMap[E]> = new Proxy(appendFlag({\r\n element,\r\n append(...children: (SourceTree | SourceTree[] | Wrapper<SourceTree | SourceTree[]>)[]) {\r\n for (const child of children) {\r\n if (matchFlag<SourceTree | SourceTree[], typeof WRAPPER>(child, WRAPPER)) {\r\n let oldChildren: HostTree[] = [];\r\n const baseAnchor = new Comment(\"Tree anchor\");\r\n element.appendChild(baseAnchor);\r\n const update = (newTrees: SourceTree[] | SourceTree) => {\r\n const normalizedTrees = [...(Array.isArray(newTrees) ? newTrees : [newTrees])].reverse();\r\n const newChildren: HostTree[] = [];\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 (matchFlag<StyleSet, typeof WRAPPER>(styleSet, WRAPPER)) {\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 HostTree<HTMLElementTagNameMap[E]>, HOST_TREE), {\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 (matchFlag<HTMLElementTagNameMap[E][P], typeof WRAPPER>(data, WRAPPER)) {\r\n const update = (newData: HTMLElementTagNameMap[E][P]) => element[p] = newData;\r\n data.event.subcribe(update);\r\n update(data.get());\r\n } else {\r\n element[p] = data;\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingFieldError extends Error { }\r\nexport class ConflictionError extends Error { }\r\nexport class AccessError extends Error { }\r\nexport class BrokenRendererError extends Error { }","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}","import { EventSubcriber } from \"@/channel/event-subcriber\";\r\nimport { SourceTree } from \"./component\";\r\nimport { appendFlag, matchFlag, WRAPPER } from \"@/constants/flags\";\r\n\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};\r\n\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> = appendFlag({\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 oldData = [...oldData] as T;\r\n oldRevoke();\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 }, WRAPPER);\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 (!matchFlag(dependency, WRAPPER)) continue;\r\n dependency.event.subcribe(update);\r\n }\r\n return internalWrapper;\r\n}\r\nexport function when(condition: Wrapper<boolean> | (() => boolean), tree: () => SourceTree, 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, ...(matchFlag(condition, WRAPPER) ? [condition] : [])]);\r\n}\r\n","import { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, ComponentPropertyStore, PropertyTransformer } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingFieldError, ValidationFailed } from \"@/exceptions\";\r\nimport { matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { wrap } from \"./reactive\";\r\n\r\nexport function rawProperty<T>(): PropertyTransformer<unknown, T> {\r\n return (x) => x as T;\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 (matchFlag(downstream[propertyKey], WRAPPER)) {\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 (!matchFlag(upstream[propertyKey], WRAPPER) || !matchFlag(downstream[propertyKey], WRAPPER)) 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 (matchFlag(upstream[propertyKey], WRAPPER)) {\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 { matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { SourceTree } from \"./component\";\r\nimport { wrap, Wrapper } from \"./reactive\";\r\n\r\nexport type RawSlotInput = SourceTree | (() => SourceTree);\r\nexport type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;\r\nexport type SlotOutput = () => Wrapper<SourceTree>;\r\n\r\nexport function pipeExtract(input: SlotInput): SlotOutput {\r\n if (typeof input === \"function\") {\r\n return () => wrap(input());\r\n } else if (matchFlag<RawSlotInput, typeof WRAPPER>(input, WRAPPER)) {\r\n return pipeExtract(input);\r\n } else return () => wrap(input);\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { HostTree, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\nimport { appendFlag, COMPONENT_INSTANCE, HOST_TREE, matchFlag } from \"@/constants/flags\";\r\nimport { EventDescriptor } from \"./event\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore, E extends ComponentEventStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): ComponentInstance<E>;\r\n}\r\nexport interface ComponentInternalRender<P extends ComponentPropertyStore, E extends ComponentEventStore> {\r\n (\r\n options: ComponentPropertyOutputDict<P>,\r\n slot: SlotOutput,\r\n emit: <D extends E[number], K extends D[\"name\"]>(\r\n key: K,\r\n data: D extends infer R extends EventDescriptor<unknown, string> ? R[\"name\"] extends K ? R[\"template\"] : never : never\r\n ) => void\r\n ): SourceTree;\r\n}\r\nexport type Component<P extends ComponentPropertyStore, E extends ComponentEventStore> =\r\n ComponentRenderEntry<P, E> & ComponentOption<P, E>;\r\nexport interface PropertyTransformer<I, O> {\r\n (data: I): O;\r\n}\r\nexport interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {\r\n validate?: (data: I) => boolean;\r\n transform: PropertyTransformer<I, O>;\r\n shadow?: O;\r\n required?: R;\r\n downloadable?: boolean;\r\n uploadable?: boolean;\r\n}\r\nexport type ComponentEventStore = EventDescriptor<unknown, string>[];\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, E extends ComponentEventStore> {\r\n props?: P;\r\n events?: E;\r\n}\r\nexport type ComponentInstance<E extends ComponentEventStore = ComponentEventStore> = {\r\n mount(to: string | HTMLElement): void;\r\n on<D extends E[number], K extends D[\"name\"]>(\r\n key: K,\r\n data: (data: D extends infer R extends EventDescriptor<unknown, string> ? R[\"name\"] extends K ? R[\"template\"] : never : never) => void\r\n ): ComponentInstance<E>;\r\n $: HostTree;\r\n};\r\nexport type SourceTree =\r\n HTMLElement |\r\n HostTree |\r\n string |\r\n number |\r\n boolean |\r\n EmptyValue |\r\n ComponentInstance;\r\nexport function render(nodeTree: SourceTree) {\r\n let result: HostTree;\r\n if (nodeTree instanceof HTMLElement) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\") {\r\n result = tree(new Text(String(nodeTree)));\r\n } else if (matchFlag(nodeTree, COMPONENT_INSTANCE)) {\r\n result = nodeTree.$;\r\n } else if (nodeTree === null || nodeTree === undefined) {\r\n result = tree(new Comment(\"Empty tree context\"));\r\n } else if (matchFlag(nodeTree, HOST_TREE)) {\r\n result = nodeTree;\r\n } else {\r\n throw new BrokenRendererError(`Failed to render ${nodeTree} into a Node.`);\r\n }\r\n return result;\r\n}\r\n\r\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<SourceTree>;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore,\r\n E extends EventDescriptor<unknown, string>\r\n>(\r\n options: ComponentOption<P, E[]>,\r\n internalRenderer: ComponentInternalRender<P, E[]>\r\n): Component<P, E[]> {\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), (key, data) => {\r\n const targetEvent = options.events?.find(e => e.name === key);\r\n if (!targetEvent) throw new TypeError(`No events named ${key} to emit.`);\r\n result.element.dispatchEvent(new CustomEvent(key, {\r\n detail: data,\r\n bubbles: targetEvent.bubbleable,\r\n cancelable: false\r\n }));\r\n });\r\n const result = render(nodeTree);\r\n return appendFlag({\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 on(key: string, handler: (data: unknown) => void) {\r\n result.on(key, event => event instanceof CustomEvent ? handler(event.detail) : null);\r\n return this;\r\n },\r\n $: result\r\n }, COMPONENT_INSTANCE);\r\n };\r\n return Object.assign(entryRenderer, {\r\n props: propStore,\r\n events: options.events\r\n } as Component<P, E[]>);\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 type EventDescriptor<T, N extends string> = {\r\n name: N;\r\n} & EventOptions<T>;\r\nexport interface EventOptions<T> {\r\n bubbleable?: boolean;\r\n template?: T;\r\n}\r\n\r\nexport function defineEvent<T, N extends string>(name: N, options?: EventOptions<T>): EventDescriptor<T, N> {\r\n return { name, ...options ?? {} };\r\n}","import { $, createComponent, tree, sync, styleSet, createArray, when, defineEvent } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n value: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n downloadable: true, //(上游→下游)\r\n uploadable: true, //(下游→上游),v-model双向绑定\r\n }\r\n },\r\n events: [\r\n defineEvent(\"up\", {\r\n template: {\r\n arg1: 0,\r\n arg2: false\r\n },\r\n bubbleable: true\r\n }),\r\n defineEvent(\"down\", {\r\n template: {\r\n arg3: \"sb\",\r\n arg4: Symbol()\r\n },\r\n bubbleable: true\r\n })\r\n ]\r\n}, (props) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n return tree(\"div\")\r\n .use(styleSet().fontSize(\"20px\").padding(\"10px\"))\r\n .append(\r\n \"敲木鱼\", tree(\"br\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() + 1)) //参数uploadable,赋值会实时同步到上游\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(props.value), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n $(sync( //只要是能渲染的东西,就能进行响应式引用\r\n () => createArray(\r\n doubled.get(),\r\n () => tree(\"div\").textContent(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").textContent(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import { $, createComponent, defineEvent, rawProperty, styleSet, sync, tree, when, wrap } from \"@\";\r\n\r\nconst option = styleSet().backgroundColor(\"blue\").color(\"white\");\r\nconst flexdown = styleSet().display(\"flex\").flexDirection(\"column\");\r\n\r\nexport default createComponent({\r\n props: {\r\n items: {\r\n transform: rawProperty<string[]>(),\r\n shadow: [\"OptionA\", \"OptionB\", \"OptionC\"]\r\n },\r\n value: {\r\n transform: Number,\r\n uploadable: true,\r\n required: true\r\n }\r\n },\r\n events: [\r\n defineEvent(\"select\", { template: 0 }),\r\n defineEvent(\"toggleState\", { template: false })\r\n ]\r\n}, (props, slot, emit) => {\r\n const showing = wrap(false);\r\n const select = (index: number) => {\r\n props.value.set(index);\r\n showing.set(false);\r\n emit(\"select\", props.value.get());\r\n };\r\n showing.event.subcribe(e => emit(\"toggleState\", e));\r\n\r\n return tree(\"div\")\r\n .use(flexdown)\r\n .append(\r\n tree(\"span\")\r\n .use(option).use(styleSet().backgroundColor(\"red\"))\r\n .textContent(sync(() => props.items.get()[props.value.get()], [props.items, props.value]))\r\n .on(\"click\", () => showing.set(!showing.get())),\r\n slot(),\r\n when(showing, () =>\r\n tree(\"div\")\r\n .use(flexdown)\r\n .append(\r\n $(sync(() =>\r\n props.items.get().map((label, index) =>\r\n tree(\"span\")\r\n .use(option)\r\n .textContent(label)\r\n .on(\"click\", () => select(index))\r\n ), [props.items]))\r\n )\r\n )\r\n );\r\n});","import Counter from \"./Counter\";\r\nimport Selector from \"./Selector\";\r\n\r\nexport default { Counter, Selector };","import { wrap } from \"./dom\";\r\nimport examples from \"./examples\";\r\n\r\nconst value = wrap(0);\r\n\r\nexamples.Selector({ value })\r\n .on(\"select\", e => console.log(\"当前选项:\", e))\r\n .on(\"toggleState\", e => console.log(\"当前是否开关:\", e))\r\n .mount(\"#app\");\r\n"],"mappings":"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","names":["camelToHyphen","str","letter","putIn","data","createArray","length","filler","HOST_TREE","COMPONENT_INSTANCE","WRAPPER","appendFlag","data","flag","matchFlag","tree","data","element","context","appendFlag","children","child","matchFlag","WRAPPER","oldChildren","baseAnchor","update","newTrees","normalizedTrees","newChildren","newTree","render","oldChild","putIn","styleSet","rules","key","value","camelToHyphen","newData","handler","options","HOST_TREE","target","p","receiver","ValidationFailed","MissingFieldError","ConflictionError","AccessError","BrokenRendererError","EventSubcriber","callback","once","data","subcriber","wrap","initialData","wrapperOptions","arrayActions","patch","data","proxy","newRevoke","target","p","receiver","originalMethod","args","oldData","wrapper","result","newValue","oldRevoke","event","EventSubcriber","currentData","appendFlag","newData","WRAPPER","sync","effectRenderer","dependencies","internalWrapper","update","dependency","matchFlag","when","condition","tree","rawProperty","x","normalizePropertyDescriptor","descriptor","validateStore","store","propertyKey","ConflictionError","ValidationFailed","hostdown","upstream","downstream","setValue","newValue","matchFlag","WRAPPER","wrapper","wrap","newData","AccessError","update","inputValue","firstSet","MissingFieldError","e","pipeExtract","input","wrap","matchFlag","WRAPPER","render","nodeTree","result","tree","matchFlag","COMPONENT_INSTANCE","HOST_TREE","BrokenRendererError","createComponent","options","internalRenderer","validateStore","propStore","key","value","normalizePropertyDescriptor","props","slot","nodeTree","hostdown","pipeExtract","data","targetEvent","e","result","render","appendFlag","to","targets","target","handler","event","COMPONENT_INSTANCE","styleSet","rules","context","target","p","receiver","data","defineEvent","name","options","Counter_default","createComponent","defineEvent","props","doubled","sync","tree","styleSet","createArray","when","option","styleSet","flexdown","Selector_default","createComponent","rawProperty","defineEvent","props","slot","emit","showing","wrap","select","index","e","tree","sync","when","label","examples_default","Counter_default","Selector_default","value","wrap","examples_default"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nine-9",
3
- "version": "1.3.1",
3
+ "version": "1.5.1",
4
4
  "description": "一个轻量、高性能、类型安全的 Vanilla DOM 响应式 UI 框架。",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,2 +0,0 @@
1
- "use strict";var w=class{subcribers=[];emitting=!1;subcribe(t,n=!1){this.subcribers.push({callback:t,once:n})}emit(...t){if(!this.emitting){this.emitting=!0;for(let n of this.subcribers)n.callback(...t);this.emitting=!1}}};function K(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}var D=Symbol("WrapperFlag");function y(e,t){let n=["push","pop","shift","unshift","splice","sort","reverse"],r=a=>{if(!Array.isArray(a))return a;let{proxy:c,revoke:T}=Proxy.revocable(a,{get(f,m,x){if(n.includes(m)){let b=Reflect.get(f,m,x);return typeof b=="function"?(...H)=>{let d=p.get();if(Array.isArray(d)){d=[...d];let O=b.call(f,...H);return p.event.emit(p.get(),d),O}}:Reflect.get(f,m,x)}else return Reflect.get(f,m,x)},set(f,m,x,b){if(Reflect.get(f,m,b)!==x){let d=p.get();if(Array.isArray(d)){d=[...d];let O=Reflect.set(f,m,x,b);return p.event.emit(p.get(),d),O}}return Reflect.set(f,m,x,b)}});return s=T,c},o=new w,s=null,i=r(e),p={get(){return i},set(a){if(i!==a){let c=i;Array.isArray(c)&&s?(s(),c=[...c],i=r(a)):i=a,this.event.emit(a,c)}},updateOnly(){this.event.emit(this.get(),this.get())},event:o,[D]:!0};return{...p,...t??{}}}function C(e,t=[]){let n=y(e()),r=()=>{let o=e();n.get()!==o&&n.set(o)};for(let o of t)u(o)&&o.event.subcribe(r);return n}function N(e,t,n=[]){return C(()=>{let r;return typeof e=="function"?r=e():r=e.get(),[r?t():null]},[...n,...u(e)?[e]:[]])}function u(e){return!!e&&Object.hasOwn(e,D)&&e[D]===!0}function $(e){return[...Array.isArray(e)?e:[e]]}function q(e,t){return new Array(e).fill(0).map(t)}var W=Symbol("TreeContextFlag");function j(e){return!!e&&Object.hasOwn(e,W)&&e[W]===!0}function l(e){let t=typeof e=="string"?document.createElement(e):e,n=new Proxy({element:t,append(...r){for(let o of r)if(u(o)){let s=[],i=new Comment("Tree anchor");t.appendChild(i);let p=a=>{let c=[...Array.isArray(a)?a:[a]],T=[];for(let f of c){let m=S(f);T.push(m),t.insertBefore(m.element,i.nextSibling)}for(let f of s)f.element.remove();s=T};o.event.subcribe(p),p(o.get())}else{let s=o;for(let i of $(s))t.appendChild(S(i).element)}return n},use(r){if(t instanceof HTMLElement){let o=s=>{for(let[i,p]of Object.entries(s))t.style.setProperty(K(String(i)),p)};u(r)?(r.event.subcribe(s=>o(s.rules)),o(r.get().rules)):o(r.rules)}return n},on(r,o,s){return t instanceof HTMLElement&&t.addEventListener(r,o,s),n},[W]:!0},{get(r,o,s){return Reflect.has(r,o)?Reflect.get(r,o,s):i=>{if(u(i)){let p=a=>t[o]=a;i.event.subcribe(p),p(i.get())}else t[o]=i;return n}}});return n}var g=class extends Error{},v=class extends Error{},P=class extends Error{},h=class extends Error{},k=class extends Error{};function M(e){return Object.assign({validate:()=>!0,transform:t=>t,shadow:null,required:!1,downloadable:!0,uploadable:!1},e)}function z(e){for(let t in e){let n=e[t];if(n.shadow){if(n.required)throw new P(`The required property ${t} can't have a shadow.`);if(n.validate&&!n.validate(n.shadow))throw new g(`The shadow of ${t} can't pass the validation.`)}}}function F(e,t){e||(e={});let n={};for(let r in t){let o=M(t[r]),s=p=>{if(u(n[r]))n[r].set(p);else{let a=y(p);n[r]=a,a.event.subcribe(c=>{if(!(!u(e[r])||!u(n[r]))&&n[r].get()!==e[r].get()){if(!o.uploadable)throw new h(`Property ${r} isn't uploadable but being set.`);e[r].set(c)}})}},i=(p,a)=>{if(!a&&!o.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!o.validate(p))throw new g(`The input value of ${r} can't pass the validation.`);s(o.transform(p))};if(!Object.hasOwn(e,r)){if(o.required)throw new v(`Missing a required property ${r}.`);s(o.shadow);continue}u(e[r])?(e[r].event.subcribe(p=>i(p,!1)),i(e[r].get(),!0)):i(e[r],!0)}return n}function A(e){return typeof e=="function"?y(e()):u(e)?A(e):y(e)}function S(e){let t;if(e instanceof HTMLElement)t=l(e);else if(typeof e=="string"||typeof e=="number"||typeof e=="boolean")t=l(new Text(String(e)));else if(J(e))t=e.$;else if(e==null)t=l(new Comment("Empty tree context"));else if(j(e))t=e;else throw new k(`Failed to render ${e} into a Node.`);return t}var I=Symbol("RenderResultFlag");function J(e){return!!e&&Object.hasOwn(e,I)&&e[I]===!0}function R(e,t){z(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([o,s])=>[o,M(s)]));return Object.assign((o,s)=>{let i=t(F(o,n),A(s)),p=S(i);return{mount(a){let c=typeof a=="string"?[...document.querySelectorAll(a)]:[a];for(let T of c)T.appendChild(p.element)},$:p,[I]:!0}},{props:n})}function V(){let e={},t=new Proxy({rules:e},{get(n,r,o){return Reflect.has(n,r)?Reflect.get(n,r,o):s=>(e[r]=String(s),t)}});return t}function B(e){return e==null?!1:typeof e=="number"?isFinite(e):typeof e=="string"?e.trim()!==""&&!isNaN(Number(e)):!1}var E=R({props:{v1:{transform:Number,shadow:0,validate:B,required:!0,uploadable:!0,downloadable:!0},v2:{transform:Number,shadow:0,validate:B,required:!0,uploadable:!0,downloadable:!0}}},e=>l("div").append(e.v1,"+",e.v2,"=",C(()=>e.v1.get()+e.v2.get(),[e.v1,e.v2]),l("button").textContent("\u4E0B\u6E38 v1 -1").on("click",()=>e.v1.set(e.v1.get()-1)),l("button").textContent("\u4E0B\u6E38 v2 -1").on("click",()=>e.v2.set(e.v2.get()-1))));var Z=R({props:{value:{validate:Number.isInteger,transform:Number,required:!1,shadow:0,downloadable:!0,uploadable:!0}}},e=>{let t=C(()=>e.value.get()*2,[e.value]);return l("div").use(V().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",l("br"),l("button").on("click",()=>e.value.set(e.value.get()+1)).textContent("\u70B9\u51FB\u52A0\u4E00"),l("button").on("click",()=>e.value.set(e.value.get()-1)).textContent("\u70B9\u51FB\u51CF\u4E00"),l("br"),"\u5F53\u524D\u503C\uFF1A",e.value,"\u53CC\u500D\u503C\uFF1A",t,C(()=>q(t.get(),()=>l("div").textContent("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[t]),N(()=>e.value.get()>10,()=>l("p").textContent("count > 10 \u65F6\u663E\u793A"),[e.value]))});var G=R({},()=>{let e=y(10),t=y(20);return l("div").append("v1:",e,"v2:",t,E({v1:e,v2:t}),l("button").textContent("\u4E0A\u6E38 v1 +1").on("click",()=>e.set(e.get()+1)),l("button").textContent("\u4E0A\u6E38 v2 +1").on("click",()=>t.set(t.get()+1)))});var L={Counter:Z,AddExpression:E,ValuePot:G};L.ValuePot().mount("#app");
2
- //# sourceMappingURL=test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/channel/event-subcriber.ts","../../src/util/char.ts","../../src/dom/reactive.ts","../../src/util/array.ts","../../src/dom/tree.ts","../../src/exceptions/index.ts","../../src/dom/property.ts","../../src/dom/slot.ts","../../src/dom/component.ts","../../src/dom/style.ts","../../src/examples/AddExpression.ts","../../src/examples/Counter.ts","../../src/examples/ValuePot.ts","../../src/examples/index.ts","../../src/examples/test.ts"],"sourcesContent":["interface SubcriberCallback<T extends unknown[]> {\r\n (...data: T): void;\r\n}\r\ninterface Subcriber<T extends unknown[]> {\r\n callback: SubcriberCallback<T>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[]> {\r\n private subcribers: Subcriber<T>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T) {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n for (const subcriber of this.subcribers) {\r\n subcriber.callback(...data);\r\n }\r\n this.emitting = false;\r\n }\r\n}","export function camelToHyphen(str: string) {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\r\n}\r\nexport function hyphenToCamel(str: string) {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\r\n}","import { EventSubcriber } from \"@/channel/event-subcriber\";\r\nimport { TreeResult } from \"./component\";\r\n\r\nexport const wrapperSymbol = Symbol(\"WrapperFlag\");\r\nexport type Wrapper<T> = {\r\n get(): T;\r\n set(newData: T): void;\r\n updateOnly(): void;\r\n event: EventSubcriber<[T, T]>;\r\n} & { [K in typeof wrapperSymbol]: true; };\r\nexport function wrap<T>(initialData: T, wrapperOptions?: Partial<Wrapper<T>>): Wrapper<T> {\r\n const arrayActions = [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\", \"sort\", \"reverse\"];\r\n const patch = (data: T) => {\r\n if (!Array.isArray(data)) { return data; }\r\n const { proxy, revoke: newRevoke } = Proxy.revocable(data, {\r\n get(target, p: string, receiver) {\r\n if (arrayActions.includes(p)) {\r\n const originalMethod = Reflect.get(target, p, receiver) as (...args: unknown[]) => unknown;\r\n if (typeof originalMethod === \"function\") {\r\n return (...args: unknown[]) => {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = originalMethod.call(target, ...args);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n };\r\n } else return Reflect.get(target, p, receiver);\r\n } else {\r\n return Reflect.get(target, p, receiver);\r\n }\r\n },\r\n set(target, p, newValue, receiver) {\r\n const oldValue = Reflect.get(target, p, receiver);\r\n if (oldValue !== newValue) {\r\n let oldData = wrapper.get();\r\n if (Array.isArray(oldData)) {\r\n oldData = [...oldData] as T;\r\n const result = Reflect.set(target, p, newValue, receiver);\r\n wrapper.event.emit(wrapper.get(), oldData);\r\n return result;\r\n }\r\n }\r\n return Reflect.set(target, p, newValue, receiver);\r\n },\r\n });\r\n oldRevoke = newRevoke;\r\n return proxy;\r\n };\r\n const event = new EventSubcriber<[T, T]>();\r\n let oldRevoke: (() => void) | null = null;\r\n let currentData = patch(initialData);\r\n const wrapper: Wrapper<T> = {\r\n get() { return currentData; },\r\n set(newData) {\r\n if (currentData !== newData) {\r\n let oldData = currentData;\r\n if (Array.isArray(oldData) && oldRevoke) {\r\n oldRevoke();\r\n oldData = [...oldData] as T;\r\n currentData = patch(newData);\r\n } else {\r\n currentData = newData;\r\n };\r\n this.event.emit(newData, oldData);\r\n }\r\n },\r\n updateOnly() {\r\n this.event.emit(this.get(), this.get());\r\n },\r\n event,\r\n [wrapperSymbol]: true\r\n };\r\n return { ...wrapper, ...wrapperOptions ?? {} };\r\n}\r\nexport function sync<R>(effectRenderer: () => R, dependencies: unknown[] = []): Wrapper<R> {\r\n const internalWrapper = wrap(effectRenderer());\r\n const update = () => {\r\n const newData = effectRenderer();\r\n const currentData = internalWrapper.get();\r\n const hasChanged = currentData !== newData;\r\n if (hasChanged) {\r\n internalWrapper.set(newData);\r\n }\r\n };\r\n for (const dependency of dependencies) {\r\n if (!isWrapper(dependency)) continue;\r\n dependency.event.subcribe(update);\r\n }\r\n return internalWrapper;\r\n}\r\nexport function when(condition: Wrapper<boolean> | (() => boolean), tree: () => TreeResult, dependencies: unknown[] = []) {\r\n return sync(() => {\r\n let result: boolean;\r\n if (typeof condition === \"function\") {\r\n result = condition();\r\n } else {\r\n result = condition.get();\r\n }\r\n return [result ? tree() : null];\r\n }, [...dependencies, ...(isWrapper(condition) ? [condition] : [])]);\r\n}\r\nexport function isWrapper<T>(data: unknown): data is Wrapper<T> {\r\n return !!data && Object.hasOwn(data, wrapperSymbol) && data[wrapperSymbol] === true;\r\n}\r\n","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIn<T>(data: T) {\r\n return [...(Array.isArray(data) ? data : [data])] as T extends (infer R)[] ? R[] : [T];\r\n}\r\nexport function createArray<T>(length: number, filler: () => T): T[] {\r\n return new Array(length).fill(0).map(filler);\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, TreeResult } from \"./component\";\r\nimport { isWrapper, Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIn } from \"@/util/array\";\r\n\r\nexport type TreeContext<T extends HTMLElement = HTMLElement> = {\r\n [K in keyof T as T[K] extends (...args: unknown[]) => unknown ? never : K]: (data: T[K] | Wrapper<T[K]>) => TreeContext<T>;\r\n} & {\r\n element: T;\r\n append(...children: (\r\n TreeResult |\r\n TreeResult[] |\r\n Wrapper<TreeResult> |\r\n Wrapper<TreeResult[]> |\r\n Wrapper<TreeResult | TreeResult[]>\r\n )[]): TreeContext<T>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): TreeContext<T>;\r\n on<E extends keyof HTMLElementEventMap>(key: E, handler: (data: HTMLElementEventMap[E]) => void, options?: AddEventListenerOptions): TreeContext<T>;\r\n} & { [K in typeof treeContextSymbol]: true; };\r\nexport const treeContextSymbol = Symbol(\"TreeContextFlag\");\r\nexport function isTreeContext<T extends HTMLElement>(data: unknown): data is TreeContext<T> {\r\n return !!data && Object.hasOwn(data, treeContextSymbol) && data[treeContextSymbol] === true;\r\n}\r\nexport function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const context: TreeContext<HTMLElementTagNameMap[E]> = new Proxy({\r\n element,\r\n append(...children: (TreeResult | TreeResult[] | Wrapper<TreeResult | TreeResult[]>)[]) {\r\n for (const child of children) {\r\n if (isWrapper<TreeResult | TreeResult[]>(child)) {\r\n let oldChildren: TreeContext[] = [];\r\n const baseAnchor = new Comment(\"Tree anchor\");\r\n element.appendChild(baseAnchor);\r\n const update = (newTrees: TreeResult[] | TreeResult) => {\r\n const normalizedTrees = [...(Array.isArray(newTrees) ? newTrees : [newTrees])];\r\n const newChildren: TreeContext[] = [];\r\n for (const newTree of normalizedTrees) {\r\n const child = render(newTree);\r\n newChildren.push(child);\r\n element.insertBefore(child.element, baseAnchor.nextSibling);\r\n }\r\n for (const oldChild of oldChildren) {\r\n oldChild.element.remove();\r\n }\r\n oldChildren = newChildren;\r\n };\r\n child.event.subcribe(update);\r\n update(child.get());\r\n } else {\r\n const children = child;\r\n for (const child of putIn(children)) {\r\n element.appendChild(render(child).element);\r\n }\r\n }\r\n }\r\n return context;\r\n },\r\n use(styleSet: StyleSet | Wrapper<StyleSet>) {\r\n if (element instanceof HTMLElement) {\r\n const update = (rules: Record<string, string>) => {\r\n for (const [key, value] of Object.entries(rules)) {\r\n element.style.setProperty(camelToHyphen(String(key)), value);\r\n }\r\n };\r\n if (isWrapper<StyleSet>(styleSet)) {\r\n styleSet.event.subcribe((newData) => update(newData.rules));\r\n update(styleSet.get().rules);\r\n } else {\r\n update(styleSet.rules);\r\n }\r\n }\r\n return context;\r\n },\r\n on(key, handler, options) {\r\n if (element instanceof HTMLElement) {\r\n element.addEventListener(key, handler, options);\r\n }\r\n return context;\r\n },\r\n [treeContextSymbol]: true\r\n } as TreeContext<HTMLElementTagNameMap[E]>, {\r\n get<P extends keyof Node>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: HTMLElementTagNameMap[E][P] | Wrapper<HTMLElementTagNameMap[E][P]>) => {\r\n if (isWrapper<HTMLElementTagNameMap[E][P]>(data)) {\r\n const update = (newData: HTMLElementTagNameMap[E][P]) => element[p] = newData;\r\n data.event.subcribe(update);\r\n update(data.get());\r\n } else {\r\n element[p] = data;\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingFieldError extends Error { }\r\nexport class ConflictionError extends Error { }\r\nexport class AccessError extends Error { }\r\nexport class BrokenRendererError extends Error { }","import { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, ComponentPropertyStore } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingFieldError, ValidationFailed } from \"@/exceptions\";\r\nimport { isWrapper, wrap } from \"./reactive\";\r\n\r\nexport function normalizePropertyDescriptor\r\n <I, O, R extends boolean>(\r\n descriptor: ComponentPropertyDescriptor<I, O, R>\r\n): Required<ComponentPropertyDescriptor<I, O, R>> {\r\n return Object.assign({\r\n validate: () => true,\r\n transform: x => x,\r\n shadow: null,\r\n required: false,\r\n downloadable: true,\r\n uploadable: false\r\n } satisfies Required<ComponentPropertyDescriptor>, descriptor);\r\n}\r\nexport function validateStore(store: ComponentPropertyStore) {\r\n for (const propertyKey in store) {\r\n const descriptor = store[propertyKey];\r\n if (descriptor.shadow) {\r\n if (descriptor.required) {\r\n throw new ConflictionError(`The required property ${propertyKey} can't have a shadow.`);\r\n }\r\n if (descriptor.validate && !descriptor.validate(descriptor.shadow)) {\r\n throw new ValidationFailed(`The shadow of ${propertyKey} can't pass the validation.`);\r\n }\r\n }\r\n }\r\n}\r\nexport function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T) {\r\n if (!upstream) upstream = {} as ComponentPropertyInputDict<T>;\r\n const downstream: Record<string, unknown> = {};\r\n for (const propertyKey in store) {\r\n const descriptor = normalizePropertyDescriptor(store[propertyKey]);\r\n const setValue = (newValue: unknown) => {\r\n if (isWrapper(downstream[propertyKey])) {\r\n downstream[propertyKey].set(newValue);\r\n } else {\r\n const wrapper = wrap(newValue);\r\n downstream[propertyKey] = wrapper;\r\n wrapper.event.subcribe((newData) => {\r\n if (!isWrapper(upstream[propertyKey]) || !isWrapper(downstream[propertyKey])) return;\r\n if (downstream[propertyKey].get() === upstream[propertyKey].get()) return;\r\n if (!descriptor.uploadable) throw new AccessError(`Property ${propertyKey} isn't uploadable but being set.`);\r\n upstream[propertyKey].set(newData);\r\n });\r\n }\r\n };\r\n const update = (inputValue: unknown, firstSet: boolean) => {\r\n if (!firstSet && !descriptor.downloadable) {\r\n console.warn(`Property ${propertyKey} isn't downloadable but being emitted.`);\r\n return;\r\n }\r\n if (!descriptor.validate(inputValue)) {\r\n throw new ValidationFailed(`The input value of ${propertyKey} can't pass the validation.`);\r\n }\r\n setValue(descriptor.transform(inputValue));\r\n };\r\n if (!Object.hasOwn(upstream, propertyKey)) {\r\n if (descriptor.required) {\r\n throw new MissingFieldError(`Missing a required property ${propertyKey}.`);\r\n }\r\n setValue(descriptor.shadow);\r\n continue;\r\n }\r\n if (isWrapper(upstream[propertyKey])) {\r\n upstream[propertyKey].event.subcribe(e => update(e, false));\r\n update(upstream[propertyKey].get(), true);\r\n } else {\r\n update(upstream[propertyKey], true);\r\n }\r\n }\r\n return downstream as ComponentPropertyOutputDict<T>;\r\n}","import { TreeResult } from \"./component\";\r\nimport { isWrapper, wrap, Wrapper } from \"./reactive\";\r\n\r\nexport type RawSlotInput = TreeResult | (() => TreeResult);\r\nexport type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;\r\nexport type SlotOutput = Wrapper<TreeResult>;\r\n\r\nexport function pipeExtract(input: SlotInput): SlotOutput {\r\n if (typeof input === \"function\") {\r\n return wrap(input());\r\n } else if (isWrapper<RawSlotInput>(input)) {\r\n return pipeExtract(input);\r\n } else return wrap(input);\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { TreeContext, isTreeContext, tree } from \"./tree\";\r\nimport { hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { SlotInput, SlotOutput, pipeExtract } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): RenderResult;\r\n}\r\nexport type Component<P extends ComponentPropertyStore> =\r\n ComponentRenderEntry<P> & ComponentOption<P>;\r\nexport interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {\r\n validate?: (data: I) => boolean;\r\n transform: (data: I) => O;\r\n shadow?: O;\r\n required?: R;\r\n downloadable?: boolean;\r\n uploadable?: boolean;\r\n}\r\nexport type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;\r\nexport type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P as P[K][\"required\"] extends true ? K : never]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> : never;\r\n} & {\r\n [K in keyof P as P[K][\"required\"] extends false | unknown ? K : never]?:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? R | Wrapper<R> | EmptyValue : never;\r\n}\r\nexport type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {\r\n [K in keyof P]:\r\n P[K] extends ComponentPropertyDescriptor<unknown, infer R>\r\n ? Wrapper<R> : never;\r\n};\r\nexport interface ComponentOption<P extends ComponentPropertyStore> {\r\n props?: P;\r\n}\r\nexport type RenderResult = {\r\n mount(to: string | HTMLElement): void;\r\n $: TreeContext;\r\n} & { [K in typeof renderResultSymbol]: true; };\r\nexport type TreeResult =\r\n HTMLElement |\r\n TreeContext |\r\n string |\r\n number |\r\n boolean |\r\n EmptyValue |\r\n RenderResult;\r\nexport function render(nodeTree: TreeResult) {\r\n let result: TreeContext;\r\n if (nodeTree instanceof HTMLElement) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\") {\r\n result = tree(new Text(String(nodeTree)));\r\n } else if (isRenderResult(nodeTree)) {\r\n result = nodeTree.$;\r\n } else if (nodeTree === null || nodeTree === undefined) {\r\n result = tree(new Comment(\"Empty tree context\"));\r\n } else if (isTreeContext(nodeTree)) {\r\n result = nodeTree;\r\n } else {\r\n throw new BrokenRendererError(`Failed to render ${nodeTree} into a Node.`);\r\n }\r\n return result;\r\n}\r\nexport const renderResultSymbol = Symbol(\"RenderResultFlag\");\r\nexport function isRenderResult(data: unknown): data is RenderResult {\r\n return !!data && Object.hasOwn(data, renderResultSymbol) && data[renderResultSymbol] === true;\r\n}\r\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<TreeResult>;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore\r\n>(\r\n options: ComponentOption<P>,\r\n internalRenderer: (options: ComponentPropertyOutputDict<P>, slot: SlotOutput) => TreeResult\r\n): Component<P> {\r\n validateStore(options.props ?? {});\r\n const propStore = Object.fromEntries(\r\n Object\r\n .entries(options.props ?? {})\r\n .map(([key, value]) => [\r\n key,\r\n normalizePropertyDescriptor(value),\r\n ])\r\n ) as P;\r\n const entryRenderer = (props?: ComponentPropertyInputDict<P>, slot?: SlotInput) => {\r\n const nodeTree = internalRenderer(hostdown(props, propStore), pipeExtract(slot));\r\n const result = render(nodeTree);\r\n return {\r\n mount(to: string | HTMLElement) {\r\n const targets = typeof to === \"string\" ? [...document.querySelectorAll<HTMLElement>(to)] : [to];\r\n for (const target of targets) {\r\n target.appendChild(result.element);\r\n }\r\n },\r\n $: result,\r\n [renderResultSymbol]: true as const\r\n };\r\n };\r\n return Object.assign(entryRenderer, {\r\n props: propStore\r\n } satisfies ComponentOption<P>);\r\n}","export type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n toString(): string;\r\n};\r\nexport function styleSet() {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n } as StyleSet, {\r\n get<P extends string & keyof CSSStyleDeclaration>(target: Record<string, unknown>, p: P, receiver: unknown) {\r\n if (Reflect.has(target, p)) {\r\n return Reflect.get(target, p, receiver);\r\n } else {\r\n return (data: CSSStyleDeclaration[P]) => {\r\n rules[p] = String(data);\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n return context;\r\n}","import { $, createComponent, sync, tree, TreeResult } from \"@\";\r\n\r\nfunction isNumeric(value: unknown) {\r\n if (value === null || value === undefined) return false;\r\n if (typeof value === \"number\") return isFinite(value);\r\n if (typeof value === \"string\") return value.trim() !== \"\" && !isNaN(Number(value));\r\n return false;\r\n}\r\nexport default createComponent({\r\n props: {\r\n v1: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n },\r\n v2: {\r\n transform: Number,\r\n shadow: 0,\r\n validate: isNumeric,\r\n required: true,\r\n uploadable: true,\r\n downloadable: true\r\n }\r\n }\r\n}, (props) =>\r\n tree(\"div\").append(\r\n $(props.v1), \"+\", $(props.v2), \"=\",\r\n sync<TreeResult>(() => props.v1.get() + props.v2.get(), [props.v1, props.v2]),\r\n tree(\"button\")\r\n .textContent(\"下游 v1 -1\")\r\n .on(\"click\", () => props.v1.set(props.v1.get() - 1)),\r\n tree(\"button\")\r\n .textContent(\"下游 v2 -1\")\r\n .on(\"click\", () => props.v2.set(props.v2.get() - 1)),\r\n ),\r\n);","import { $, createComponent, tree, sync, styleSet, createArray, when } from \"@\";\r\n\r\nexport default createComponent({ //创建组件\r\n props: {\r\n value: { //参数名\r\n validate: Number.isInteger, //验证器\r\n transform: Number, //转换器\r\n required: false, //是否必填\r\n shadow: 0, //默认值\r\n downloadable: true, //(上游→下游)\r\n uploadable: true, //(下游→上游),v-model双向绑定\r\n }\r\n }\r\n}, (props) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n return tree(\"div\")\r\n .use(styleSet().fontSize(\"20px\").padding(\"10px\"))\r\n .append(\r\n \"敲木鱼\", tree(\"br\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() + 1)) //参数uploadable,赋值会实时同步到上游\r\n .textContent(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .textContent(\"点击减一\"),\r\n tree(\"br\"),\r\n \"当前值:\", $(props.value), //引用响应式的值,类似模板语法{{ count }}\r\n \"双倍值:\", $(doubled),\r\n $(sync( //只要是能渲染的东西,就能进行响应式引用\r\n () => createArray(\r\n doubled.get(),\r\n () => tree(\"div\").textContent(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").textContent(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import { $, createComponent, tree, wrap } from \"@\";\r\nimport AddExpression from \"./AddExpression\";\r\n\r\nexport default createComponent({}, () => {\r\n const v1 = wrap(10);\r\n const v2 = wrap(20);\r\n return tree(\"div\")\r\n .append(\r\n \"v1:\", $(v1), \"v2:\", $(v2),\r\n AddExpression({ v1, v2 }),\r\n tree(\"button\")\r\n .textContent(\"上游 v1 +1\")\r\n .on(\"click\", () => v1.set(v1.get() + 1)),\r\n tree(\"button\")\r\n .textContent(\"上游 v2 +1\")\r\n .on(\"click\", () => v2.set(v2.get() + 1)),\r\n );\r\n});","import AddExpression from \"./AddExpression\";\r\nimport Counter from \"./Counter\";\r\nimport ValuePot from \"./ValuePot\";\r\n\r\nexport default { Counter, AddExpression, ValuePot };","import { examples } from \"@\";\r\n\r\nexamples.ValuePot().mount(\"#app\");\r\n"],"mappings":"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","names":["EventSubcriber","callback","once","data","subcriber","camelToHyphen","str","letter","wrapperSymbol","wrap","initialData","wrapperOptions","arrayActions","patch","data","proxy","newRevoke","target","p","receiver","originalMethod","args","oldData","wrapper","result","newValue","oldRevoke","event","EventSubcriber","currentData","newData","sync","effectRenderer","dependencies","internalWrapper","update","dependency","isWrapper","when","condition","tree","putIn","data","createArray","length","filler","treeContextSymbol","isTreeContext","data","tree","element","context","children","child","isWrapper","oldChildren","baseAnchor","update","newTrees","normalizedTrees","newChildren","newTree","render","oldChild","putIn","styleSet","rules","key","value","camelToHyphen","newData","handler","options","target","p","receiver","ValidationFailed","MissingFieldError","ConflictionError","AccessError","BrokenRendererError","normalizePropertyDescriptor","descriptor","x","validateStore","store","propertyKey","ConflictionError","ValidationFailed","hostdown","upstream","downstream","setValue","newValue","isWrapper","wrapper","wrap","newData","AccessError","update","inputValue","firstSet","MissingFieldError","e","pipeExtract","input","wrap","isWrapper","render","nodeTree","result","tree","isRenderResult","isTreeContext","BrokenRendererError","renderResultSymbol","data","createComponent","options","internalRenderer","validateStore","propStore","key","value","normalizePropertyDescriptor","props","slot","nodeTree","hostdown","pipeExtract","result","render","to","targets","target","renderResultSymbol","styleSet","rules","context","target","p","receiver","data","isNumeric","value","AddExpression_default","createComponent","props","tree","sync","Counter_default","createComponent","props","doubled","sync","tree","styleSet","createArray","when","ValuePot_default","createComponent","v1","wrap","v2","tree","AddExpression_default","examples_default","Counter_default","AddExpression_default","ValuePot_default","examples_default"]}
File without changes