nine-9 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,18 +3,18 @@
3
3
  一个轻量、高性能、类型安全的 Vanilla DOM 响应式 UI 框架。
4
4
 
5
5
  融合了 Vue 模板指令和 React Hooks 的优点,取两者之长。
6
- 同时运行及其轻量,甚至打包后可以用于 XXXMonkey UserScript
6
+ 同时运行及其轻量,甚至打包后可以用于 **单模块 UserScript**。
7
7
 
8
8
  ## 特性
9
9
 
10
10
  - **响应式** - 数据变化时自动更新 UI
11
11
  - **差量更新** - 只更新变化的 DOM,速度更快
12
12
  - **类型安全** - 完整的 TypeScript 支持,类型推断优秀
13
- - **轻量级** - 无依赖,体积小巧
13
+ - **轻量级** - 无依赖,打包后体积小巧
14
14
  - **链式 API** - 流畅的 DOM 操作
15
15
  - **Vue 风格指令** - 熟悉的 v-if、v-for 模式
16
16
  - **JSX 风格表达式** - 响应式表达式可以放在模板任意位置
17
- - **数据同步系统** - 使用更优的语法实现数据响应式
17
+ - **数据同步系统** - 使用完全基于表达式的语法实现数据实时响应
18
18
 
19
19
  ## 安装
20
20
 
@@ -26,7 +26,7 @@ npm install nine-9
26
26
 
27
27
  ```typescript
28
28
  // Counter.ts
29
- import { $, createComponent, tree, sync, styleSet, createArray, when } from "@";
29
+ import { $, createComponent, tree, sync, styleSet, createArray, when } from "nine";
30
30
 
31
31
  export default createComponent({ //创建组件
32
32
  props: {
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { IntrinsicElementAttributes, Events } from '@vue/runtime-dom';
2
+
1
3
  interface SubcriberCallback<T extends unknown[]> {
2
4
  (...data: T): void;
3
5
  }
@@ -11,6 +13,7 @@ declare class EventSubcriber<T extends unknown[]> {
11
13
  type EmptyValue = undefined | null | void | never;
12
14
  type Normalize<T extends Record<string, unknown>> = T extends Record<infer K, infer R> ? Record<K, Required<R>> : never;
13
15
  type Valueof<T> = T[keyof T];
16
+ type KebabToCamel<S extends string> = S extends `${infer First}-${infer Rest}` ? `${First}${Capitalize<KebabToCamel<Rest>>}` : S;
14
17
 
15
18
  type Wrapper<T> = {
16
19
  get(): T;
@@ -26,20 +29,36 @@ type StyleSet = {
26
29
  [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;
27
30
  } & {
28
31
  rules: Record<keyof CSSStyleDeclaration, string>;
29
- toString(): string;
32
+ selector?: string;
33
+ apply(selector?: string): StyleSet;
34
+ ruleString(): string;
35
+ selectorString(selector?: string): string;
36
+ };
37
+ declare function styleSet(selector?: string): StyleSet;
38
+
39
+ type HTMLEventAttributes = keyof Events;
40
+ type SupportedHTMLElements = keyof HTMLElementTagNameMap & keyof IntrinsicElementAttributes;
41
+ type SupportedHTMLRawAttributes = {
42
+ [K in SupportedHTMLElements]: Omit<IntrinsicElementAttributes[K], HTMLEventAttributes>;
30
43
  };
31
- declare function styleSet(): StyleSet;
32
44
 
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>;
45
+ interface HostTreeHooks {
46
+ update: [newTrees: HostTree[], oldTrees: HostTree[]];
47
+ }
48
+ type HostTreeHookStore = {
49
+ [K in keyof HostTreeHooks]: EventSubcriber<HostTreeHooks[K]>;
50
+ };
51
+ type HostTree<E extends SupportedHTMLElements = SupportedHTMLElements, T = HTMLElementTagNameMap[E], A = SupportedHTMLRawAttributes[E]> = {
52
+ [K in string & keyof A as KebabToCamel<K>]-?: (data: A[K] | Wrapper<A[K]>) => HostTree<E>;
35
53
  } & {
36
54
  element: T;
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>;
55
+ hooks: HostTreeHookStore;
56
+ append(...children: (RawSourceTree | HostTree | RawSourceTree[] | HostTree[] | (RawSourceTree | HostTree)[] | Wrapper<HostTree> | Wrapper<RawSourceTree> | Wrapper<RawSourceTree | HostTree> | Wrapper<(RawSourceTree | HostTree)[]> | Wrapper<RawSourceTree | RawSourceTree[]>)[]): HostTree<E>;
57
+ use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<E>;
58
+ on<K extends keyof HTMLElementEventMap>(key: K, handler: (data: HTMLElementEventMap[K]) => void, options?: AddEventListenerOptions): HostTree<E>;
59
+ on(key: string, handler: (...args: unknown[]) => unknown, options?: AddEventListenerOptions): HostTree<E>;
41
60
  };
42
- declare function tree<E extends keyof HTMLElementTagNameMap>(data: E | Node): HostTree<HTMLElementTagNameMap[E]>;
61
+ declare function tree<E extends SupportedHTMLElements>(data: E | Node): HostTree<E, HTMLElementTagNameMap[E], SupportedHTMLRawAttributes[E]>;
43
62
 
44
63
  type RawSlotInput = SourceTree | (() => SourceTree);
45
64
  type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;
@@ -62,9 +81,12 @@ interface ComponentInternalRender<P extends ComponentPropertyStore, E extends Co
62
81
  (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
82
  }
64
83
  type Component<P extends ComponentPropertyStore, E extends ComponentEventStore> = ComponentRenderEntry<P, E> & ComponentOption<P, E>;
84
+ interface PropertyTransformer<I, O> {
85
+ (data: I): O;
86
+ }
65
87
  interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {
66
88
  validate?: (data: I) => boolean;
67
- transform: (data: I) => O;
89
+ transform: PropertyTransformer<I, O>;
68
90
  shadow?: O;
69
91
  required?: R;
70
92
  downloadable?: boolean;
@@ -83,24 +105,36 @@ type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {
83
105
  interface ComponentOption<P extends ComponentPropertyStore, E extends ComponentEventStore> {
84
106
  props?: P;
85
107
  events?: E;
108
+ styles?: StyleSet[];
86
109
  }
87
110
  type ComponentInstance<E extends ComponentEventStore = ComponentEventStore> = {
88
111
  mount(to: string | HTMLElement): void;
89
112
  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>;
90
113
  $: HostTree;
91
114
  };
92
- type SourceTree = HTMLElement | HostTree | string | number | boolean | EmptyValue | ComponentInstance;
115
+ type RawSourceTree = [
116
+ HTMLElement,
117
+ string,
118
+ number,
119
+ boolean,
120
+ bigint,
121
+ EmptyValue,
122
+ ComponentInstance
123
+ ][number];
124
+ type SourceTree = RawSourceTree | HostTree;
93
125
  declare function render(nodeTree: SourceTree): HostTree;
94
126
  declare function $<T>(data: Wrapper<T>): Wrapper<SourceTree>;
127
+ declare function flagment<T extends string>(uuid: T): `nine_${string}`;
128
+ declare function attachUUID(root: Node, uuid: string): Node;
95
129
  declare function createComponent<P extends ComponentPropertyStore, E extends EventDescriptor<unknown, string>>(options: ComponentOption<P, E[]>, internalRenderer: ComponentInternalRender<P, E[]>): Component<P, E[]>;
96
130
 
97
- declare function rawProperty<T>(): (x: unknown) => T;
131
+ declare function rawProperty<T>(): PropertyTransformer<unknown, T>;
98
132
  declare function normalizePropertyDescriptor<I, O, R extends boolean>(descriptor: ComponentPropertyDescriptor<I, O, R>): Required<ComponentPropertyDescriptor<I, O, R>>;
99
133
  declare function validateStore(store: ComponentPropertyStore): void;
100
134
  declare function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T): ComponentPropertyOutputDict<T>;
101
135
 
102
- declare function camelToHyphen(str: string): string;
103
- declare function hyphenToCamel(str: string): string;
136
+ declare function camelToHyphen<T extends string>(str: T): T;
137
+ declare function hyphenToCamel<T extends string>(str: T): T;
104
138
 
105
139
  declare function typedIsArray<T>(arr: unknown[]): arr is T[];
106
140
  declare function putIn<T>(data: T): T extends (infer R)[] ? R[] : [T];
@@ -134,7 +168,7 @@ declare const _default: {
134
168
  }, "down">)[]>;
135
169
  Selector: Component<{
136
170
  items: {
137
- transform: (x: unknown) => string[];
171
+ transform: PropertyTransformer<unknown, string[]>;
138
172
  shadow: string[];
139
173
  };
140
174
  value: {
@@ -145,4 +179,4 @@ declare const _default: {
145
179
  }, (EventDescriptor<number, "select"> | EventDescriptor<boolean, "toggleState">)[]>;
146
180
  };
147
181
 
148
- 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 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 };
182
+ 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 HostTreeHookStore, type HostTreeHooks, type KebabToCamel, type Normalize, type PropertyTransformer, type RawSlotInput, type RawSourceTree, type SlotInput, type SlotOutput, type SourceTree, type StyleSet, type Valueof, type Wrapper, index as assets, attachUUID, camelToHyphen, createArray, createComponent, defineEvent, _default as examples, flagment, hostdown, hyphenToCamel, normalizePropertyDescriptor, pipeExtract, putIn, rawProperty, render, styleSet, sync, tree, typedIsArray, validateStore, when, wrap };
package/dist/index.js CHANGED
@@ -1,2 +1 @@
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:()=>W,pipeExtract:()=>I,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{},M=class extends Error{},A=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 W(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=W(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 M(`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 I(e){return typeof e=="function"?()=>T(e()):u(e,f)?I(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 A(`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,W(s)]));return Object.assign((o,s)=>{let i=t(B(o,n),I(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
- //# sourceMappingURL=index.js.map
1
+ "use strict";var L=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var $=(e,t)=>{for(var n in t)L(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&&L(e,o,{get:()=>t[o],enumerable:!(r=te(t,o))||r.enumerable});return e};var se=e=>oe(L({},"__esModule",{value:!0}),e);var ce={};$(ce,{$:()=>B,EventSubcriber:()=>b,assets:()=>Z,attachUUID:()=>N,camelToHyphen:()=>v,createArray:()=>j,createComponent:()=>H,defineEvent:()=>E,examples:()=>ee,flagment:()=>J,hostdown:()=>V,hyphenToCamel:()=>ae,normalizePropertyDescriptor:()=>K,pipeExtract:()=>M,putIn:()=>_,rawProperty:()=>U,render:()=>C,styleSet:()=>w,sync:()=>g,tree:()=>m,typedIsArray:()=>pe,validateStore:()=>z,when:()=>k,wrap:()=>x});module.exports=se(ce);var b=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 v(e){return e.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}function ae(e){return e.replace(/-([a-z])/g,t=>t[1].toUpperCase())}function pe(e){return Array.isArray(e)}function _(e){return[...Array.isArray(e)?e:[e]]}function j(e,t){return new Array(e).fill(0).map(t)}var O=Symbol("HostTreeFlag"),q=Symbol("ComponentInstanceFlag"),y=Symbol("WrapperFlag");function P(e,t){return Object.assign(e,{[t]:!0})}function f(e,t){return e!=null&&typeof e=="object"&&Object.hasOwn(e,t)&&e[t]===!0}function m(e){let t=typeof e=="string"?document.createElement(e):e,n={update:new b},r=new Proxy(P({element:t,hooks:n,append(...o){for(let a of o)if(f(a,y)){let s=[],p=new Comment("Tree anchor");t.appendChild(p);let i=l=>{let d=[...Array.isArray(l)?l:[l]].reverse(),c=[];for(let u of d){let T=C(u);c.push(T),t.insertBefore(T.element,p.nextSibling)}for(let u of s)u.element.remove();n.update.emit(c,s),s=c};a.event.subcribe(i),i(a.get())}else{let s=a;for(let p of _(s))t.appendChild(C(p).element)}return r},use(o){if(t instanceof HTMLElement){let a=s=>{for(let[p,i]of Object.entries(s))t.style.setProperty(v(String(p)),i)};f(o,y)?(o.event.subcribe(s=>a(s.rules)),a(o.get().rules)):a(o.rules)}return r},on(o,a,s){return t instanceof HTMLElement&&t.addEventListener(o,a,s),r}},O),{get(o,a,s){return Reflect.has(o,a)?Reflect.get(o,a,s):p=>{let i=l=>{Object.hasOwn(t,a)&&(t[a]=l),t instanceof Element&&t.setAttribute(v(a),String(l))};return f(p,y)?(p.event.subcribe(i),i(p.get())):i(p),r}}});return r}var R=class extends Error{},D=class extends Error{},A=class extends Error{},I=class extends Error{},W=class extends Error{};function x(e,t){let n=["push","pop","shift","unshift","splice","sort","reverse"],r=i=>{if(!Array.isArray(i))return i;let{proxy:l,revoke:d}=Proxy.revocable(i,{get(c,u,T){if(n.includes(u)){let h=Reflect.get(c,u,T);return typeof h=="function"?(...Q)=>{let S=p.get();if(Array.isArray(S)){S=[...S];let F=h.call(c,...Q);return p.event.emit(p.get(),S),F}}:Reflect.get(c,u,T)}else return Reflect.get(c,u,T)},set(c,u,T,h){if(Reflect.get(c,u,h)!==T){let S=p.get();if(Array.isArray(S)){S=[...S];let F=Reflect.set(c,u,T,h);return p.event.emit(p.get(),S),F}}return Reflect.set(c,u,T,h)}});return a=d,l},o=new b,a=null,s=r(e),p=P({get(){return s},set(i){if(s!==i){let l=s;Array.isArray(l)&&a?(l=[...l],a(),s=r(i)):s=i,this.event.emit(i,l)}},updateOnly(){this.event.emit(this.get(),this.get())},event:o},y);return{...p,...t??{}}}function g(e,t=[]){let n=x(e()),r=()=>{let o=e();n.get()!==o&&n.set(o)};for(let o of t)f(o,y)&&o.event.subcribe(r);return n}function k(e,t,n=[]){return g(()=>{let r;return typeof e=="function"?r=e():r=e.get(),[r?t():null]},[...n,...f(e,y)?[e]:[]])}function U(){return e=>e}function K(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 A(`The required property ${t} can't have a shadow.`);if(n.validate&&!n.validate(n.shadow))throw new R(`The shadow of ${t} can't pass the validation.`)}}}function V(e,t){e||(e={});let n={};for(let r in t){let o=K(t[r]),a=p=>{if(f(n[r],y))n[r].set(p);else{let i=x(p);n[r]=i,i.event.subcribe(l=>{if(!(!f(e[r],y)||!f(n[r],y))&&n[r].get()!==e[r].get()){if(!o.uploadable)throw new I(`Property ${r} isn't uploadable but being set.`);e[r].set(l)}})}},s=(p,i)=>{if(!i&&!o.downloadable){console.warn(`Property ${r} isn't downloadable but being emitted.`);return}if(!o.validate(p))throw new R(`The input value of ${r} can't pass the validation.`);a(o.transform(p))};if(!Object.hasOwn(e,r)){if(o.required)throw new D(`Missing a required property ${r}.`);a(o.shadow);continue}f(e[r],y)?(e[r].event.subcribe(p=>s(p,!1)),s(e[r].get(),!0)):s(e[r],!0)}return n}function M(e){return typeof e=="function"?()=>x(e()):f(e,y)?M(e):()=>x(e)}function C(e){let t;if(e instanceof Node)t=m(e);else if(typeof e=="string"||typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")t=m(new Text(String(e)));else if(f(e,q))t=e.$;else if(e==null)t=m(new Comment("Empty tree context"));else if(f(e,O))t=e;else throw new W(`Failed to render ${e} into a Node.`);return t}function B(e){return e}function J(e){return`nine_${e.replaceAll("-","_")}`}function N(e,t){for(let n of[e,...e.childNodes])n instanceof HTMLElement&&(n.dataset[J(t)]="true"),n!==e&&n.childNodes.length>0&&N(n,t);return e}function H(e,t){z(e.props??{});let n=Object.fromEntries(Object.entries(e.props??{}).map(([s,p])=>[s,K(p)])),r=crypto.randomUUID(),o=J(r);if(e.styles)for(let s of e.styles)s.apply(`[data-${o}="true"]`);return Object.assign((s,p)=>{let i=t(V(s,n),M(p),(d,c)=>{let u=e.events?.find(T=>T.name===d);if(!u)throw new TypeError(`No events named ${d} to emit.`);l.element.dispatchEvent(new CustomEvent(d,{detail:c,bubbles:u.bubbleable,cancelable:!1}))}),l=C(i);return N(l.element,r),l.hooks.update.subcribe(d=>d.forEach(c=>N(c.element,r))),P({mount(d){let c=typeof d=="string"?[...document.querySelectorAll(d)]:[d];for(let u of c)u.appendChild(l.element)},on(d,c){return l.on(d,u=>u instanceof CustomEvent?c(u.detail):null),this},$:l},q)},{props:n,events:e.events})}function w(e){let t={},n=new Proxy({rules:t,selector:e,apply(r){let o=document.createElement("style");document.head.appendChild(o),o.textContent=`${this.selectorString(r)}{${this.ruleString()}}`},ruleString(){return Object.entries(t).map(([r,o])=>`${v(String(r))}:${o};`).join("")},selectorString(r){return(this.selector||"")+(r||"")||"*"}},{get(r,o,a){return Reflect.has(r,o)?Reflect.get(r,o,a):s=>(t[o]=String(s),n)}});return n}function E(e,t){return{name:e,...t??{}}}var Z={};$(Z,{logo:()=>G});var G={};$(G,{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 X=H({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 m("div").use(w().fontSize("20px").padding("10px")).append("\u6572\u6728\u9C7C",m("br"),m("button").on("click",()=>e.value.set(e.value.get()+1)).append("\u70B9\u51FB\u52A0\u4E00"),m("button").on("click",()=>e.value.set(e.value.get()-1)).append("\u70B9\u51FB\u51CF\u4E00"),m("br"),"\u5F53\u524D\u503C\uFF1A",e.value,"\u53CC\u500D\u503C\uFF1A",t,g(()=>j(t.get(),()=>m("div").append("\u4F60\u70B9\u4E86\u4E00\u4E0B")),[t]),k(()=>e.value.get()>10,()=>m("p").append("count > 10 \u65F6\u663E\u793A"),[e.value]))});var Y=H({props:{items:{transform:U(),shadow:["OptionA","OptionB","OptionC"]},value:{transform:Number,uploadable:!0,required:!0}},events:[E("select",{template:0}),E("toggleState",{template:!1})],styles:[w(".item").backgroundColor("blue").color("white"),w(".flexdown").display("flex").flexDirection("column")]},(e,t,n)=>{let r=x(!1),o=a=>{e.value.set(a),r.set(!1),n("select",e.value.get())};return r.event.subcribe(a=>n("toggleState",a)),m("div").class("flexdown").ariaAtomic("false").append(m("span").class("item").use(w().backgroundColor("red")).append(g(()=>e.items.get()[e.value.get()],[e.items,e.value])).on("click",()=>r.set(!r.get())),t(),k(r,()=>m("div").class("flexdown").append(g(()=>e.items.get().map((a,s)=>m("span").class("item").append(a).on("click",()=>o(s))),[e.items]))))});var ee={Counter:X,Selector:Y};window.__NINE_ENV__?.mode==="development"&&console.warn("[Nine-9] Initialized in development mode.");0&&(module.exports={$,EventSubcriber,assets,attachUUID,camelToHyphen,createArray,createComponent,defineEvent,examples,flagment,hostdown,hyphenToCamel,normalizePropertyDescriptor,pipeExtract,putIn,rawProperty,render,styleSet,sync,tree,typedIsArray,validateStore,when,wrap});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nine-9",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "一个轻量、高性能、类型安全的 Vanilla DOM 响应式 UI 框架。",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,8 +20,8 @@
20
20
  "reactive"
21
21
  ],
22
22
  "scripts": {
23
- "dev": "tsup --watch",
24
- "build": "tsup",
23
+ "dev": "tsup --watch --env.NODE_ENV development",
24
+ "build": "tsup --env.NODE_ENV production",
25
25
  "lint": "eslint .",
26
26
  "lint:fix": "eslint . --fix",
27
27
  "check-type": "tsc --noEmit"
@@ -31,6 +31,8 @@
31
31
  "devDependencies": {
32
32
  "@eslint/js": "^10.0.1",
33
33
  "@turbowarp/types": "^0.0.14",
34
+ "@vue/runtime-dom": "^3.5.29",
35
+ "cross-env": "^10.1.0",
34
36
  "eslint": "^10.0.2",
35
37
  "globals": "^17.3.0",
36
38
  "jiti": "^2.6.1",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
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 } 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>(): (x: unknown) => T {\r\n return (x: unknown) => 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 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 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.d.ts DELETED
@@ -1,2 +0,0 @@
1
-
2
- export { }
package/dist/test.js DELETED
@@ -1,2 +0,0 @@
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 C=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}},C),{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 w=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 I=S.call(f,...L);return a.event.emit(a.get(),x),I}}: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 I=Reflect.set(f,y,b,S);return a.event.emit(a.get(),x),I}}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 W(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 w(`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 w(`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,C))t=e;else throw new D(`Failed to render ${e} into a Node.`);return t}function A(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=A({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]),W(()=>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=A({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(),W(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
package/dist/test.js.map DELETED
@@ -1 +0,0 @@
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 } 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>(): (x: unknown) => T {\r\n return (x: unknown) => 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 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 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\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"]}