nine-9 1.8.1 → 1.9.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/dist/index.d.ts CHANGED
@@ -17,6 +17,7 @@ type KebabToCamel<S extends string> = S extends `${infer First}-${infer Rest}` ?
17
17
  type ObjectToEntryUnion<T> = {
18
18
  [K in keyof T]: [K, T[K]];
19
19
  }[keyof T];
20
+ declare function defineTemplate<T = void>(): T;
20
21
 
21
22
  type Wrapper<T> = {
22
23
  get(): T;
@@ -24,6 +25,7 @@ type Wrapper<T> = {
24
25
  updateOnly(): void;
25
26
  event: EventSubcriber<[T, T]>;
26
27
  };
28
+ declare function normalizeWrap<T>(data: T | Wrapper<T>): Wrapper<T>;
27
29
  declare function wrap<T>(initialData: T, wrapperOptions?: Partial<Wrapper<T>>): Wrapper<T>;
28
30
  declare function sync<R>(effectRenderer: () => R, dependencies?: unknown[]): Wrapper<R>;
29
31
  declare function when(condition: Wrapper<boolean> | (() => boolean), tree: () => SourceTree, dependencies?: unknown[]): Wrapper<SourceTree[]>;
@@ -70,30 +72,13 @@ type HostTree<E extends SupportedHTMLElements = SupportedHTMLElements, T = HTMLE
70
72
  };
71
73
  declare function tree<E extends SupportedHTMLElements>(data: E | Node): HostTree<E, HTMLElementTagNameMap[E], SupportedHTMLRawAttributes[E]>;
72
74
 
73
- type RawSlotInput = SourceTree | (() => SourceTree);
74
- type SlotInput = RawSlotInput | Wrapper<RawSlotInput>;
75
- type SlotOutput = () => Wrapper<SourceTree>;
76
- declare function pipeExtract(input: SlotInput): SlotOutput;
75
+ declare function camelToHyphen<T extends string>(str: T): T;
76
+ declare function hyphenToCamel<T extends string>(str: T): T;
77
77
 
78
- type EventDescriptor<T, N extends string> = {
79
- name: N;
80
- } & EventOptions<T>;
81
- interface EventOptions<T> {
82
- bubbleable?: boolean;
83
- template?: T;
84
- }
85
- declare function defineEvent<T, N extends string>(name: N, options?: EventOptions<T>): EventDescriptor<T, N>;
78
+ declare function typedIsArray<T>(arr: unknown[]): arr is T[];
79
+ declare function putIntoArray<T>(data: T): T extends (infer R)[] ? R[] : [T];
80
+ declare function createArray<T>(length: number, filler: () => T): T[];
86
81
 
87
- interface ComponentRenderEntry<P extends ComponentPropertyStore, E extends ComponentEventStore> {
88
- (props?: ComponentPropertyInputDict<P>, slot?: SlotInput): ComponentInstance<E>;
89
- }
90
- interface ComponentInternalRender<P extends ComponentPropertyStore, E extends ComponentEventStore> {
91
- (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;
92
- }
93
- type Component<P extends ComponentPropertyStore, E extends ComponentEventStore> = ComponentRenderEntry<P, E> & ComponentOption<P, E>;
94
- interface PropertyTransformer<I, O> {
95
- (data: I): O;
96
- }
97
82
  interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolean = boolean> {
98
83
  validate?: (data: I) => boolean;
99
84
  transform: PropertyTransformer<I, O>;
@@ -102,8 +87,6 @@ interface ComponentPropertyDescriptor<I = unknown, O = unknown, R extends boolea
102
87
  downloadable?: boolean;
103
88
  uploadable?: boolean;
104
89
  }
105
- type ComponentEventStore = EventDescriptor<unknown, string>[];
106
- type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;
107
90
  type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {
108
91
  [K in keyof P as P[K]["required"] extends true ? K : never]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? R | Wrapper<R> : never;
109
92
  } & {
@@ -112,14 +95,67 @@ type ComponentPropertyInputDict<P extends ComponentPropertyStore> = {
112
95
  type ComponentPropertyOutputDict<P extends ComponentPropertyStore> = {
113
96
  [K in keyof P]: P[K] extends ComponentPropertyDescriptor<unknown, infer R> ? Wrapper<R> : never;
114
97
  };
115
- interface ComponentOption<P extends ComponentPropertyStore, E extends ComponentEventStore> {
98
+ declare function rawProperty<T>(): PropertyTransformer<unknown, T>;
99
+ declare function normalizePropertyDescriptor<I, O, R extends boolean>(descriptor: ComponentPropertyDescriptor<I, O, R>): Required<ComponentPropertyDescriptor<I, O, R>>;
100
+ declare function validateStore(store: ComponentPropertyStore): void;
101
+ declare function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T): ComponentPropertyOutputDict<T>;
102
+
103
+ type SlotDescriptor<T = unknown, N extends string = string, R extends boolean = boolean> = {
104
+ name: N;
105
+ } & SlotOptions<T, R>;
106
+ interface SlotOptions<T, R extends boolean> {
107
+ template: T;
108
+ required?: R;
109
+ defaultValue?: SourceTree;
110
+ }
111
+ type SlotInput<T> = (data: Wrapper<T>) => SourceTree | Wrapper<SourceTree>;
112
+ type SlotOutput<T> = (data: T | Wrapper<T>) => Wrapper<SourceTree>;
113
+ type ComponentSlotInputDict<T extends ComponentSlotStore> = {
114
+ [K in T[number] as K["name"]]?: SlotInput<K["template"]>;
115
+ };
116
+ type ComponentSlotOutputDict<T extends ComponentSlotStore> = {
117
+ [K in T[number] as K["name"]]-?: SlotOutput<K["template"]>;
118
+ };
119
+ declare function extractInput<T>(render: SlotInput<T>): SlotOutput<T>;
120
+ declare function renderSlots<T extends ComponentSlotStore>(rawInput?: ComponentSlotInputDict<T>, store?: T): ComponentSlotOutputDict<T>;
121
+ declare function defineSlot<N extends string, R extends boolean, T>(name: N, options: SlotOptions<T, R>): {
122
+ template: T;
123
+ required?: R | undefined;
124
+ defaultValue?: SourceTree;
125
+ name: N;
126
+ };
127
+
128
+ type EventDescriptor<T = unknown, N extends string = string> = {
129
+ name: N;
130
+ } & EventOptions<T>;
131
+ interface EventOptions<T> {
132
+ bubbleable?: boolean;
133
+ template?: T;
134
+ }
135
+ declare function defineEvent<T, N extends string>(name: N, options?: EventOptions<T>): EventDescriptor<T, N>;
136
+
137
+ interface ComponentRenderEntry<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {
138
+ (props?: ComponentPropertyInputDict<P>, slot?: ComponentSlotInputDict<S>): ComponentInstance<E>;
139
+ }
140
+ interface ComponentInternalRender<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {
141
+ (options: ComponentPropertyOutputDict<P>, slot: ComponentSlotOutputDict<S>, emit: <D extends E[number], K extends D["name"]>(key: K, data: D extends infer R extends EventDescriptor ? R["name"] extends K ? R["template"] : never : never) => void): SourceTree;
142
+ }
143
+ type Component<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> = ComponentRenderEntry<P, E, S> & ComponentOption<P, E, S>;
144
+ interface PropertyTransformer<I, O> {
145
+ (data: I): O;
146
+ }
147
+ type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;
148
+ type ComponentEventStore = EventDescriptor[];
149
+ type ComponentSlotStore = SlotDescriptor[];
150
+ interface ComponentOption<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {
116
151
  props?: P;
117
152
  events?: E;
118
153
  styles?: StyleSet[];
154
+ slots?: S;
119
155
  }
120
156
  type ComponentInstance<E extends ComponentEventStore = ComponentEventStore> = {
121
157
  mount(to: string | HTMLElement): void;
122
- 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>;
158
+ on<D extends E[number], K extends D["name"]>(key: K, data: (data: D extends infer R extends EventDescriptor ? R["name"] extends K ? R["template"] : never : never) => void): ComponentInstance<E>;
123
159
  $: HostTree;
124
160
  };
125
161
  type RawSourceTree = [
@@ -136,19 +172,7 @@ declare function render(nodeTree: SourceTree): HostTree;
136
172
  declare function $<T>(data: Wrapper<T>): Wrapper<SourceTree>;
137
173
  declare function flagment<T extends string>(uuid: T): `nine_${string}`;
138
174
  declare function attachUUID(root: Node, uuid: string): Node;
139
- declare function createComponent<P extends ComponentPropertyStore, E extends EventDescriptor<unknown, string>>(options: ComponentOption<P, E[]>, internalRenderer: ComponentInternalRender<P, E[]>): Component<P, E[]>;
140
-
141
- declare function rawProperty<T>(): PropertyTransformer<unknown, T>;
142
- declare function normalizePropertyDescriptor<I, O, R extends boolean>(descriptor: ComponentPropertyDescriptor<I, O, R>): Required<ComponentPropertyDescriptor<I, O, R>>;
143
- declare function validateStore(store: ComponentPropertyStore): void;
144
- declare function hostdown<T extends ComponentPropertyStore>(upstream?: ComponentPropertyInputDict<T>, store?: T): ComponentPropertyOutputDict<T>;
145
-
146
- declare function camelToHyphen<T extends string>(str: T): T;
147
- declare function hyphenToCamel<T extends string>(str: T): T;
148
-
149
- declare function typedIsArray<T>(arr: unknown[]): arr is T[];
150
- declare function putIntoArray<T>(data: T): T extends (infer R)[] ? R[] : [T];
151
- declare function createArray<T>(length: number, filler: () => T): T[];
175
+ declare function createComponent<P extends ComponentPropertyStore, E extends EventDescriptor, S extends SlotDescriptor>(options: ComponentOption<P, E[], S[]>, internalRenderer: ComponentInternalRender<P, E[], S[]>): Component<P, E[], S[]>;
152
176
 
153
177
  declare namespace logo {
154
178
  export { };
@@ -189,4 +213,4 @@ declare const _default: {
189
213
  }, (EventDescriptor<number, "select"> | EventDescriptor<boolean, "toggleState">)[]>;
190
214
  };
191
215
 
192
- 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 ObjectToEntryUnion, 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, putIntoArray, rawProperty, render, styleSet, sync, tree, typedIsArray, validateStore, when, wrap };
216
+ export { $, type Component, type ComponentEventStore, type ComponentInstance, type ComponentInternalRender, type ComponentOption, type ComponentPropertyDescriptor, type ComponentPropertyInputDict, type ComponentPropertyOutputDict, type ComponentPropertyStore, type ComponentRenderEntry, type ComponentSlotInputDict, type ComponentSlotOutputDict, type ComponentSlotStore, type EmptyValue, type EventDescriptor, type EventOptions, EventSubcriber, type HostTree, type HostTreeHookStore, type HostTreeHooks, type KebabToCamel, type Normalize, type ObjectToEntryUnion, type PropertyTransformer, type RawSourceTree, type SlotDescriptor, type SlotInput, type SlotOptions, type SlotOutput, type SourceTree, type StyleSet, type Valueof, type Wrapper, index as assets, attachUUID, camelToHyphen, createArray, createComponent, defineEvent, defineSlot, defineTemplate, _default as examples, extractInput, flagment, hostdown, hyphenToCamel, normalizePropertyDescriptor, normalizeWrap, putIntoArray, rawProperty, render, renderSlots, styleSet, sync, tree, typedIsArray, validateStore, when, wrap };
package/dist/index.js CHANGED
@@ -28,15 +28,19 @@ __export(index_exports, {
28
28
  createArray: () => createArray,
29
29
  createComponent: () => createComponent,
30
30
  defineEvent: () => defineEvent,
31
+ defineSlot: () => defineSlot,
32
+ defineTemplate: () => defineTemplate,
31
33
  examples: () => examples_default,
34
+ extractInput: () => extractInput,
32
35
  flagment: () => flagment,
33
36
  hostdown: () => hostdown,
34
37
  hyphenToCamel: () => hyphenToCamel,
35
38
  normalizePropertyDescriptor: () => normalizePropertyDescriptor,
36
- pipeExtract: () => pipeExtract,
39
+ normalizeWrap: () => normalizeWrap,
37
40
  putIntoArray: () => putIntoArray,
38
41
  rawProperty: () => rawProperty,
39
42
  render: () => render,
43
+ renderSlots: () => renderSlots,
40
44
  styleSet: () => styleSet,
41
45
  sync: () => sync,
42
46
  tree: () => tree,
@@ -202,7 +206,7 @@ function tree(data) {
202
206
  // src/exceptions/index.ts
203
207
  var ValidationFailed = class extends Error {
204
208
  };
205
- var MissingFieldError = class extends Error {
209
+ var MissingError = class extends Error {
206
210
  };
207
211
  var ConflictionError = class extends Error {
208
212
  };
@@ -212,6 +216,13 @@ var BrokenRendererError = class extends Error {
212
216
  };
213
217
 
214
218
  // src/dom/reactive.ts
219
+ function normalizeWrap(data) {
220
+ if (matchFlag(data, WRAPPER)) {
221
+ return data;
222
+ } else {
223
+ return wrap(data);
224
+ }
225
+ }
215
226
  function wrap(initialData, wrapperOptions) {
216
227
  const arrayActions = ["push", "pop", "shift", "unshift", "splice", "sort", "reverse"];
217
228
  const patch = (data) => {
@@ -368,7 +379,7 @@ function hostdown(upstream, store) {
368
379
  };
369
380
  if (!Object.hasOwn(upstream, propertyKey)) {
370
381
  if (descriptor.required) {
371
- throw new MissingFieldError(`Missing a required property ${propertyKey}.`);
382
+ throw new MissingError(`Missing a required property ${propertyKey}.`);
372
383
  }
373
384
  setValue(descriptor.shadow);
374
385
  continue;
@@ -384,12 +395,28 @@ function hostdown(upstream, store) {
384
395
  }
385
396
 
386
397
  // src/dom/slot.ts
387
- function pipeExtract(input) {
388
- if (typeof input === "function") {
389
- return () => wrap(input());
390
- } else if (matchFlag(input, WRAPPER)) {
391
- return pipeExtract(input);
392
- } else return () => wrap(input);
398
+ function extractInput(render2) {
399
+ return (data) => normalizeWrap(render2(normalizeWrap(data)));
400
+ }
401
+ function renderSlots(rawInput, store) {
402
+ if (!store) return {};
403
+ const input = rawInput;
404
+ return Object.fromEntries(store.map((descriptor) => {
405
+ if (descriptor.required && (!input || !Object.hasOwn(input, descriptor.name))) {
406
+ throw new MissingError(`Missing a required slot ${descriptor.name}.`);
407
+ }
408
+ if (!input) return [descriptor.name, () => null];
409
+ return [
410
+ descriptor.name,
411
+ extractInput(input[descriptor.name])
412
+ ];
413
+ }));
414
+ }
415
+ function defineSlot(name, options) {
416
+ return {
417
+ name,
418
+ ...options
419
+ };
393
420
  }
394
421
 
395
422
  // src/dom/component.ts
@@ -443,15 +470,19 @@ function createComponent(options, internalRenderer) {
443
470
  }
444
471
  }
445
472
  const entryRenderer = (props, slot) => {
446
- const nodeTree = internalRenderer(hostdown(props, propStore), pipeExtract(slot), (key, data) => {
447
- const targetEvent = options.events?.find((e) => e.name === key);
448
- if (!targetEvent) throw new TypeError(`No events named ${key} to emit.`);
449
- hostTree.element.dispatchEvent(new CustomEvent(key, {
450
- detail: data,
451
- bubbles: targetEvent.bubbleable,
452
- cancelable: false
453
- }));
454
- });
473
+ const nodeTree = internalRenderer(
474
+ hostdown(props, propStore),
475
+ renderSlots(slot, options.slots),
476
+ (key, data) => {
477
+ const targetEvent = options.events?.find((e) => e.name === key);
478
+ if (!targetEvent) throw new TypeError(`No events named ${key} to emit.`);
479
+ hostTree.element.dispatchEvent(new CustomEvent(key, {
480
+ detail: data,
481
+ bubbles: targetEvent.bubbleable,
482
+ cancelable: false
483
+ }));
484
+ }
485
+ );
455
486
  const hostTree = render(nodeTree);
456
487
  attachUUID(hostTree.element, rawComponentUUID);
457
488
  hostTree.hooks.treeUpdated.subcribe((newTrees) => newTrees.forEach((tree2) => attachUUID(tree2.element, rawComponentUUID)));
@@ -475,6 +506,11 @@ function createComponent(options, internalRenderer) {
475
506
  });
476
507
  }
477
508
 
509
+ // src/util/types.ts
510
+ function defineTemplate() {
511
+ return null;
512
+ }
513
+
478
514
  // src/dom/style.ts
479
515
  function styleSet(selector) {
480
516
  const rules = {};
@@ -547,22 +583,18 @@ var Counter_default = createComponent({
547
583
  },
548
584
  events: [
549
585
  defineEvent("up", {
550
- template: {
551
- arg1: 0,
552
- arg2: false
553
- },
586
+ template: defineTemplate(),
554
587
  bubbleable: true
555
588
  }),
556
589
  defineEvent("down", {
557
- template: {
558
- arg3: "sb",
559
- arg4: /* @__PURE__ */ Symbol()
560
- },
590
+ template: defineTemplate(),
561
591
  bubbleable: true
562
592
  })
563
593
  ]
564
- }, (props) => {
594
+ }, (props, _slot, emit) => {
565
595
  const doubled = sync(() => props.value.get() * 2, [props.value]);
596
+ emit("down", 0);
597
+ emit("up", {});
566
598
  return tree("div").use(styleSet().fontSize("20px").padding("10px")).append(
567
599
  "\u6572\u6728\u9C7C",
568
600
  tree("br"),
@@ -606,15 +638,24 @@ var Selector_default = createComponent({
606
638
  }
607
639
  },
608
640
  events: [
609
- defineEvent("select", { template: 0 }),
610
- defineEvent("toggleState", { template: false })
641
+ defineEvent("select", { template: defineTemplate() }),
642
+ defineEvent("toggleState", { template: defineTemplate() })
611
643
  ],
612
644
  styles: [
613
645
  styleSet(".item").backgroundColor("blue").color("white"),
614
646
  styleSet(".flexdown").display("flex").flexDirection("column")
647
+ ],
648
+ slots: [
649
+ defineSlot("title", {
650
+ template: defineTemplate()
651
+ })
615
652
  ]
616
653
  }, (props, slot, emit) => {
617
654
  const showing = wrap(false);
655
+ const text = sync(
656
+ () => props.items.get()[props.value.get()],
657
+ [props.items, props.value]
658
+ );
618
659
  const select = (index) => {
619
660
  props.value.set(index);
620
661
  showing.set(false);
@@ -622,8 +663,10 @@ var Selector_default = createComponent({
622
663
  };
623
664
  showing.event.subcribe((e) => emit("toggleState", e));
624
665
  return tree("div").class("flexdown").ariaAtomic("false").append(
625
- tree("span").class("item").use(styleSet().backgroundColor("red")).append($(sync(() => props.items.get()[props.value.get()], [props.items, props.value]))).on("click", () => showing.set(!showing.get())),
626
- slot(),
666
+ tree("span").class("item").use(styleSet().backgroundColor("red")).append(
667
+ tree("div").append($(text)),
668
+ slot.title(text)
669
+ ).on("click", () => showing.set(!showing.get())),
627
670
  when(
628
671
  showing,
629
672
  () => tree("div").class("flexdown").append(
@@ -652,15 +695,19 @@ if (window.__NINE_ENV__?.mode === "development") {
652
695
  createArray,
653
696
  createComponent,
654
697
  defineEvent,
698
+ defineSlot,
699
+ defineTemplate,
655
700
  examples,
701
+ extractInput,
656
702
  flagment,
657
703
  hostdown,
658
704
  hyphenToCamel,
659
705
  normalizePropertyDescriptor,
660
- pipeExtract,
706
+ normalizeWrap,
661
707
  putIntoArray,
662
708
  rawProperty,
663
709
  render,
710
+ renderSlots,
664
711
  styleSet,
665
712
  sync,
666
713
  tree,
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/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\r\nif (window.__NINE_ENV__?.mode === \"development\") {\r\n console.warn(\"[Nine-9] Initialized in development mode.\");\r\n}","interface SubcriberCallback<T extends unknown[], R> {\r\n (...data: T): R;\r\n}\r\ninterface Subcriber<T extends unknown[], R> {\r\n callback: SubcriberCallback<T, R>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[], R = void> {\r\n private subcribers: Subcriber<T, R>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T, R>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T): R[] | void {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n const result: R[] = [];\r\n for (const subcriber of this.subcribers) {\r\n result.push(subcriber.callback(...data));\r\n }\r\n this.emitting = false;\r\n return result;\r\n }\r\n}","export function camelToHyphen<T extends string>(str: T): T {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`) as T;\r\n}\r\nexport function hyphenToCamel<T extends string>(str: T): T {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()) as T;\r\n}","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIntoArray<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 attachFlag<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, RawSourceTree } from \"./component\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIntoArray } from \"@/util/array\";\r\nimport { attachFlag, HOST_TREE, matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { EventSubcriber } from \"@/channel\";\r\nimport { SupportedHTMLRawAttributes, SupportedHTMLElements, SupportedEventHandlerMap } from \"./element\";\r\nimport { KebabToCamel, ObjectToEntryUnion } from \"@/util/types\";\r\n\r\nexport interface HostTreeHooks {\r\n treeUpdated: [newTrees: HostTree[], oldTrees: HostTree[]];\r\n attributeUpdated: [attribute: string, newValue: unknown, oldValue: unknown];\r\n initialized: [rootTree: HostTree];\r\n $preventEvent: [ObjectToEntryUnion<SupportedEventHandlerMap>, boolean | void];\r\n}\r\nexport type HostTreeHookStore = {\r\n [K in keyof HostTreeHooks as K extends `$${infer R}` ? R : K]:\r\n K extends `$${string}`\r\n ? HostTreeHooks[K] extends [infer E extends unknown[], infer R]\r\n ? EventSubcriber<E, R>\r\n : EventSubcriber<HostTreeHooks[K]>\r\n : EventSubcriber<HostTreeHooks[K]>;\r\n};\r\nexport type HostTree<E extends SupportedHTMLElements = SupportedHTMLElements, T = HTMLElementTagNameMap[E], A = SupportedHTMLRawAttributes[E]> = {\r\n [K in string & keyof A as KebabToCamel<K>]-?: (data: A[K] | Wrapper<A[K]>) => HostTree<E>;\r\n} & {\r\n element: T;\r\n hooks: HostTreeHookStore;\r\n append(...children: (\r\n RawSourceTree |\r\n HostTree |\r\n RawSourceTree[] |\r\n HostTree[] |\r\n (RawSourceTree | HostTree)[] |\r\n Wrapper<HostTree> |\r\n Wrapper<RawSourceTree> |\r\n Wrapper<RawSourceTree | HostTree> |\r\n Wrapper<(RawSourceTree | HostTree)[]> |\r\n Wrapper<RawSourceTree | RawSourceTree[]>\r\n )[]): HostTree<E>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<E>;\r\n on<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options?: AddEventListenerOptions): HostTree<E>;\r\n on(key: string, handler: (...args: unknown[]) => unknown, options?: AddEventListenerOptions): HostTree<E>;\r\n};\r\n\r\nexport function tree<E extends SupportedHTMLElements>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const hooks: HostTreeHookStore = {\r\n treeUpdated: new EventSubcriber(),\r\n attributeUpdated: new EventSubcriber(),\r\n initialized: new EventSubcriber(),\r\n preventEvent: new EventSubcriber()\r\n };\r\n const context: HostTree<E> = new Proxy(attachFlag({\r\n element,\r\n hooks,\r\n append(...children: (RawSourceTree | RawSourceTree[] | Wrapper<RawSourceTree | RawSourceTree[]>)[]) {\r\n for (const child of children) {\r\n if (matchFlag<RawSourceTree | RawSourceTree[], 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: RawSourceTree[] | RawSourceTree) => {\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 hooks.treeUpdated.emit(newChildren, oldChildren);\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 putIntoArray(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<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options: AddEventListenerOptions) {\r\n if (element instanceof EventTarget) {\r\n element.addEventListener(key, (e) => {\r\n //@ts-expect-error 运行时这个本来就是配套的,ts推断不出来\r\n const emitResult = hooks.preventEvent.emit(key, handler);\r\n if (emitResult && !emitResult.some(Boolean)) {\r\n //@ts-expect-error 依旧是传参问题,ts推断不出来\r\n handler(e);\r\n }\r\n }, options);\r\n }\r\n return context;\r\n },\r\n } as HostTree<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 const update = (newData: HTMLElementTagNameMap[E][P], oldData: HTMLElementTagNameMap[E][P]) => {\r\n if (Object.hasOwn(element, p)) {\r\n element[p] = newData;\r\n }\r\n if (element instanceof Element) {\r\n element.setAttribute(camelToHyphen(p), String(newData));\r\n }\r\n hooks.attributeUpdated.emit(p, newData, oldData);\r\n };\r\n if (matchFlag<HTMLElementTagNameMap[E][P], typeof WRAPPER>(data, WRAPPER)) {\r\n data.event.subcribe(update);\r\n update(data.get(), data.get());\r\n } else {\r\n update(data, data);\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n Promise.resolve().then(() => hooks.initialized.emit(context as unknown as HostTree));\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 { attachFlag, 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> = attachFlag({\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 { attachFlag, COMPONENT_INSTANCE, HOST_TREE, matchFlag } from \"@/constants/flags\";\r\nimport { EventDescriptor } from \"./event\";\r\nimport { StyleSet } from \"./style\";\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 styles?: StyleSet[];\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 RawSourceTree = [\r\n HTMLElement,\r\n // HostTree,\r\n string,\r\n number,\r\n boolean,\r\n bigint,\r\n EmptyValue,\r\n ComponentInstance,\r\n][number];\r\nexport type SourceTree = RawSourceTree | HostTree;\r\n\r\nexport function render(nodeTree: SourceTree): HostTree {\r\n let result: HostTree;\r\n if (nodeTree instanceof Node) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\" || typeof nodeTree === \"bigint\") {\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\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<SourceTree>;\r\n}\r\nexport function flagment<T extends string>(uuid: T) {\r\n return `nine_${uuid.replaceAll(\"-\", \"_\")}` as const;\r\n}\r\nexport function attachUUID(root: Node, uuid: string): Node {\r\n for (const node of [root, ...root.childNodes]) {\r\n if (node instanceof HTMLElement) {\r\n node.dataset[flagment(uuid)] = \"true\";\r\n }\r\n if (node !== root && node.childNodes.length > 0) {\r\n attachUUID(node, uuid);\r\n }\r\n }\r\n return root;\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 rawComponentUUID = crypto.randomUUID();\r\n const flagmentedUUID = flagment(rawComponentUUID);\r\n if (options.styles) {\r\n for (const styleSet of options.styles) {\r\n styleSet.apply(`[data-${flagmentedUUID}=\"true\"]`);\r\n }\r\n }\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 hostTree.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 hostTree = render(nodeTree);\r\n attachUUID(hostTree.element, rawComponentUUID);\r\n hostTree.hooks.treeUpdated.subcribe((newTrees) => newTrees.forEach(tree => attachUUID(tree.element, rawComponentUUID)));\r\n return attachFlag({\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(hostTree.element);\r\n }\r\n },\r\n on(key: string, handler: (data: unknown) => void) {\r\n hostTree.on(key, event => event instanceof CustomEvent ? handler(event.detail) : null);\r\n return this;\r\n },\r\n $: hostTree\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}","import { camelToHyphen } from \"@/util\";\r\n\r\nexport type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n selector?: string;\r\n apply(selector?: string): StyleSet;\r\n ruleString(): string;\r\n selectorString(selector?: string): string;\r\n};\r\nexport function styleSet(selector?: string) {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n selector,\r\n apply(selector) {\r\n const style = document.createElement(\"style\");\r\n document.head.appendChild(style);\r\n style.textContent = `${this.selectorString(selector)}{${this.ruleString()}}`;\r\n },\r\n ruleString() {\r\n return Object.entries(rules).map(([key, value]) => `${camelToHyphen(String(key))}:${value};`).join(\"\");\r\n },\r\n selectorString(selector) {\r\n return ((this.selector || \"\") + (selector || \"\")) || \"*\";\r\n },\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 .append(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .append(\"点击减一\"),\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\").append(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").append(\"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\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 styles: [\r\n styleSet(\".item\")\r\n .backgroundColor(\"blue\")\r\n .color(\"white\"),\r\n styleSet(\".flexdown\")\r\n .display(\"flex\")\r\n .flexDirection(\"column\")\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 .class(\"flexdown\")\r\n .ariaAtomic(\"false\")\r\n .append(\r\n tree(\"span\")\r\n .class(\"item\")\r\n .use(styleSet().backgroundColor(\"red\"))\r\n .append($(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 .class(\"flexdown\")\r\n .append(\r\n $(sync(() =>\r\n props.items.get().map((label, index) =>\r\n tree(\"span\")\r\n .class(\"item\")\r\n .append(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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,iBAAN,MAAoD;AAAA,EAC/C,aAAgC,CAAC;AAAA,EACjC,WAAoB;AAAA,EAE5B,SAAS,UAAmC,OAAO,OAAO;AACtD,SAAK,WAAW,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,QAAQ,MAAqB;AACzB,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAChB,UAAM,SAAc,CAAC;AACrB,eAAW,aAAa,KAAK,YAAY;AACrC,aAAO,KAAK,UAAU,SAAS,GAAG,IAAI,CAAC;AAAA,IAC3C;AACA,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AACJ;;;AC3BO,SAAS,cAAgC,KAAW;AACvD,SAAO,IAAI,QAAQ,UAAU,YAAU,IAAI,OAAO,YAAY,CAAC,EAAE;AACrE;AACO,SAAS,cAAgC,KAAW;AACvD,SAAO,IAAI,QAAQ,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC;AAC7D;;;ACLO,SAAS,aAAgB,KAA4B;AACxD,SAAO,MAAM,QAAQ,GAAG;AAC5B;AACO,SAAS,aAAgB,MAAS;AACrC,SAAO,CAAC,GAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAE;AACpD;AACO,SAAS,YAAe,QAAgB,QAAsB;AACjE,SAAO,IAAI,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,MAAM;AAC/C;;;ACDO,IAAM,YAAY,uBAAO,cAAc;AACvC,IAAM,qBAAqB,uBAAO,uBAAuB;AACzD,IAAM,UAAU,uBAAO,aAAa;AAEpC,SAAS,WAA+D,MAAS,MAAS;AAC7F,SAAO,OAAO,OAAO,MAAM,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;AAC/C;AACO,SAAS,UAAyC,MAAe,MAAgC;AACpG,SACK,SAAS,QAAQ,SAAS,UACxB,OAAO,SAAS,YAChB,OAAO,OAAO,MAAM,IAAI,KACxB,KAAK,IAAI,MAAM;AAE1B;;;ACyBO,SAAS,KAAsC,MAAgB;AAClE,QAAM,UAAgB,OAAO,SAAS,WAAW,SAAS,cAAc,IAAI,IAAI;AAChF,QAAM,QAA2B;AAAA,IAC7B,aAAa,IAAI,eAAe;AAAA,IAChC,kBAAkB,IAAI,eAAe;AAAA,IACrC,aAAa,IAAI,eAAe;AAAA,IAChC,cAAc,IAAI,eAAe;AAAA,EACrC;AACA,QAAM,UAAuB,IAAI,MAAM,WAAW;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,UAAU,UAA0F;AAChG,iBAAW,SAAS,UAAU;AAC1B,YAAI,UAA2D,OAAO,OAAO,GAAG;AAC5E,cAAI,cAA0B,CAAC;AAC/B,gBAAM,aAAa,IAAI,QAAQ,aAAa;AAC5C,kBAAQ,YAAY,UAAU;AAC9B,gBAAM,SAAS,CAAC,aAA8C;AAC1D,kBAAM,kBAAkB,CAAC,GAAI,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAE,EAAE,QAAQ;AACvF,kBAAM,cAA0B,CAAC;AACjC,uBAAW,WAAW,iBAAiB;AACnC,oBAAMA,SAAQ,OAAO,OAAO;AAC5B,0BAAY,KAAKA,MAAK;AACtB,sBAAQ,aAAaA,OAAM,SAAS,WAAW,WAAW;AAAA,YAC9D;AACA,uBAAW,YAAY,aAAa;AAChC,uBAAS,QAAQ,OAAO;AAAA,YAC5B;AACA,kBAAM,YAAY,KAAK,aAAa,WAAW;AAC/C,0BAAc;AAAA,UAClB;AACA,gBAAM,MAAM,SAAS,MAAM;AAC3B,iBAAO,MAAM,IAAI,CAAC;AAAA,QACtB,OAAO;AACH,gBAAMC,YAAW;AACjB,qBAAWD,UAAS,aAAaC,SAAQ,GAAG;AACxC,oBAAQ,YAAY,OAAOD,MAAK,EAAE,OAAO;AAAA,UAC7C;AAAA,QACJ;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,IACA,IAAIE,WAAwC;AACxC,UAAI,mBAAmB,aAAa;AAChC,cAAM,SAAS,CAAC,UAAkC;AAC9C,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,oBAAQ,MAAM,YAAY,cAAc,OAAO,GAAG,CAAC,GAAG,KAAK;AAAA,UAC/D;AAAA,QACJ;AACA,YAAI,UAAoCA,WAAU,OAAO,GAAG;AACxD,UAAAA,UAAS,MAAM,SAAS,CAAC,YAAY,OAAO,QAAQ,KAAK,CAAC;AAC1D,iBAAOA,UAAS,IAAI,EAAE,KAAK;AAAA,QAC/B,OAAO;AACH,iBAAOA,UAAS,KAAK;AAAA,QACzB;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,IACA,GAA6C,KAAQ,SAAsC,SAAkC;AACzH,UAAI,mBAAmB,aAAa;AAChC,gBAAQ,iBAAiB,KAAK,CAAC,MAAM;AAEjC,gBAAM,aAAa,MAAM,aAAa,KAAK,KAAK,OAAO;AACvD,cAAI,cAAc,CAAC,WAAW,KAAK,OAAO,GAAG;AAEzC,oBAAQ,CAAC;AAAA,UACb;AAAA,QACJ,GAAG,OAAO;AAAA,MACd;AACA,aAAO;AAAA,IACX;AAAA,EACJ,GAAkB,SAAS,GAAG;AAAA,IAC1B,IAA0B,QAAiC,GAAM,UAAmB;AAChF,UAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG;AACxB,eAAO,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAAA,MAC1C,OAAO;AACH,eAAO,CAACC,UAA6E;AACjF,gBAAM,SAAS,CAAC,SAAsC,YAAyC;AAC3F,gBAAI,OAAO,OAAO,SAAS,CAAC,GAAG;AAC3B,sBAAQ,CAAC,IAAI;AAAA,YACjB;AACA,gBAAI,mBAAmB,SAAS;AAC5B,sBAAQ,aAAa,cAAc,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,YAC1D;AACA,kBAAM,iBAAiB,KAAK,GAAG,SAAS,OAAO;AAAA,UACnD;AACA,cAAI,UAAuDA,OAAM,OAAO,GAAG;AACvE,YAAAA,MAAK,MAAM,SAAS,MAAM;AAC1B,mBAAOA,MAAK,IAAI,GAAGA,MAAK,IAAI,CAAC;AAAA,UACjC,OAAO;AACH,mBAAOA,OAAMA,KAAI;AAAA,UACrB;AACA,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAC;AACD,UAAQ,QAAQ,EAAE,KAAK,MAAM,MAAM,YAAY,KAAK,OAA8B,CAAC;AACnF,SAAO;AACX;;;ACjJO,IAAM,mBAAN,cAA+B,MAAM;AAAE;AACvC,IAAM,oBAAN,cAAgC,MAAM;AAAE;AACxC,IAAM,mBAAN,cAA+B,MAAM;AAAE;AACvC,IAAM,cAAN,cAA0B,MAAM;AAAE;AAClC,IAAM,sBAAN,cAAkC,MAAM;AAAE;;;ACO1C,SAAS,KAAQ,aAAgB,gBAAkD;AACtF,QAAM,eAAe,CAAC,QAAQ,OAAO,SAAS,WAAW,UAAU,QAAQ,SAAS;AACpF,QAAM,QAAQ,CAAC,SAAY;AACvB,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AAAE,aAAO;AAAA,IAAM;AACzC,UAAM,EAAE,OAAO,QAAQ,UAAU,IAAI,MAAM,UAAU,MAAM;AAAA,MACvD,IAAI,QAAQ,GAAW,UAAU;AAC7B,YAAI,aAAa,SAAS,CAAC,GAAG;AAC1B,gBAAM,iBAAiB,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AACtD,cAAI,OAAO,mBAAmB,YAAY;AACtC,mBAAO,IAAI,SAAoB;AAC3B,kBAAI,UAAU,QAAQ,IAAI;AAC1B,kBAAI,MAAM,QAAQ,OAAO,GAAG;AACxB,0BAAU,CAAC,GAAG,OAAO;AACrB,sBAAM,SAAS,eAAe,KAAK,QAAQ,GAAG,IAAI;AAClD,wBAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG,OAAO;AACzC,uBAAO;AAAA,cACX;AAAA,YACJ;AAAA,UACJ,MAAO,QAAO,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAAA,QACjD,OAAO;AACH,iBAAO,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAAA,QAC1C;AAAA,MACJ;AAAA,MACA,IAAI,QAAQ,GAAG,UAAU,UAAU;AAC/B,cAAM,WAAW,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAChD,YAAI,aAAa,UAAU;AACvB,cAAI,UAAU,QAAQ,IAAI;AAC1B,cAAI,MAAM,QAAQ,OAAO,GAAG;AACxB,sBAAU,CAAC,GAAG,OAAO;AACrB,kBAAM,SAAS,QAAQ,IAAI,QAAQ,GAAG,UAAU,QAAQ;AACxD,oBAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG,OAAO;AACzC,mBAAO;AAAA,UACX;AAAA,QACJ;AACA,eAAO,QAAQ,IAAI,QAAQ,GAAG,UAAU,QAAQ;AAAA,MACpD;AAAA,IACJ,CAAC;AACD,gBAAY;AACZ,WAAO;AAAA,EACX;AACA,QAAM,QAAQ,IAAI,eAAuB;AACzC,MAAI,YAAiC;AACrC,MAAI,cAAc,MAAM,WAAW;AACnC,QAAM,UAAsB,WAAW;AAAA,IACnC,MAAM;AAAE,aAAO;AAAA,IAAa;AAAA,IAC5B,IAAI,SAAS;AACT,UAAI,gBAAgB,SAAS;AACzB,YAAI,UAAU;AACd,YAAI,MAAM,QAAQ,OAAO,KAAK,WAAW;AACrC,oBAAU,CAAC,GAAG,OAAO;AACrB,oBAAU;AACV,wBAAc,MAAM,OAAO;AAAA,QAC/B,OAAO;AACH,wBAAc;AAAA,QAClB;AAAC;AACD,aAAK,MAAM,KAAK,SAAS,OAAO;AAAA,MACpC;AAAA,IACJ;AAAA,IACA,aAAa;AACT,WAAK,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,IAC1C;AAAA,IACA;AAAA,EACJ,GAAG,OAAO;AACV,SAAO,EAAE,GAAG,SAAS,GAAG,kBAAkB,CAAC,EAAE;AACjD;AACO,SAAS,KAAQ,gBAAyB,eAA0B,CAAC,GAAe;AACvF,QAAM,kBAAkB,KAAK,eAAe,CAAC;AAC7C,QAAM,SAAS,MAAM;AACjB,UAAM,UAAU,eAAe;AAC/B,UAAM,cAAc,gBAAgB,IAAI;AACxC,UAAM,aAAa,gBAAgB;AACnC,QAAI,YAAY;AACZ,sBAAgB,IAAI,OAAO;AAAA,IAC/B;AAAA,EACJ;AACA,aAAW,cAAc,cAAc;AACnC,QAAI,CAAC,UAAU,YAAY,OAAO,EAAG;AACrC,eAAW,MAAM,SAAS,MAAM;AAAA,EACpC;AACA,SAAO;AACX;AACO,SAAS,KAAK,WAA+CC,OAAwB,eAA0B,CAAC,GAAG;AACtH,SAAO,KAAK,MAAM;AACd,QAAI;AACJ,QAAI,OAAO,cAAc,YAAY;AACjC,eAAS,UAAU;AAAA,IACvB,OAAO;AACH,eAAS,UAAU,IAAI;AAAA,IAC3B;AACA,WAAO,CAAC,SAASA,MAAK,IAAI,IAAI;AAAA,EAClC,GAAG,CAAC,GAAG,cAAc,GAAI,UAAU,WAAW,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,CAAE,CAAC;AAC/E;;;ACjGO,SAAS,cAAkD;AAC9D,SAAO,CAAC,MAAM;AAClB;AACO,SAAS,4BAEZ,YAC8C;AAC9C,SAAO,OAAO,OAAO;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB,WAAW,OAAK;AAAA,IAChB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,EAChB,GAAmD,UAAU;AACjE;AACO,SAAS,cAAc,OAA+B;AACzD,aAAW,eAAe,OAAO;AAC7B,UAAM,aAAa,MAAM,WAAW;AACpC,QAAI,WAAW,QAAQ;AACnB,UAAI,WAAW,UAAU;AACrB,cAAM,IAAI,iBAAiB,yBAAyB,WAAW,uBAAuB;AAAA,MAC1F;AACA,UAAI,WAAW,YAAY,CAAC,WAAW,SAAS,WAAW,MAAM,GAAG;AAChE,cAAM,IAAI,iBAAiB,iBAAiB,WAAW,6BAA6B;AAAA,MACxF;AAAA,IACJ;AAAA,EACJ;AACJ;AACO,SAAS,SAA2C,UAA0C,OAAW;AAC5G,MAAI,CAAC,SAAU,YAAW,CAAC;AAC3B,QAAM,aAAsC,CAAC;AAC7C,aAAW,eAAe,OAAO;AAC7B,UAAM,aAAa,4BAA4B,MAAM,WAAW,CAAC;AACjE,UAAM,WAAW,CAAC,aAAsB;AACpC,UAAI,UAAU,WAAW,WAAW,GAAG,OAAO,GAAG;AAC7C,mBAAW,WAAW,EAAE,IAAI,QAAQ;AAAA,MACxC,OAAO;AACH,cAAM,UAAU,KAAK,QAAQ;AAC7B,mBAAW,WAAW,IAAI;AAC1B,gBAAQ,MAAM,SAAS,CAAC,YAAY;AAChC,cAAI,CAAC,UAAU,SAAS,WAAW,GAAG,OAAO,KAAK,CAAC,UAAU,WAAW,WAAW,GAAG,OAAO,EAAG;AAChG,cAAI,WAAW,WAAW,EAAE,IAAI,MAAM,SAAS,WAAW,EAAE,IAAI,EAAG;AACnE,cAAI,CAAC,WAAW,WAAY,OAAM,IAAI,YAAY,YAAY,WAAW,kCAAkC;AAC3G,mBAAS,WAAW,EAAE,IAAI,OAAO;AAAA,QACrC,CAAC;AAAA,MACL;AAAA,IACJ;AACA,UAAM,SAAS,CAAC,YAAqB,aAAsB;AACvD,UAAI,CAAC,YAAY,CAAC,WAAW,cAAc;AACvC,gBAAQ,KAAK,YAAY,WAAW,wCAAwC;AAC5E;AAAA,MACJ;AACA,UAAI,CAAC,WAAW,SAAS,UAAU,GAAG;AAClC,cAAM,IAAI,iBAAiB,sBAAsB,WAAW,6BAA6B;AAAA,MAC7F;AACA,eAAS,WAAW,UAAU,UAAU,CAAC;AAAA,IAC7C;AACA,QAAI,CAAC,OAAO,OAAO,UAAU,WAAW,GAAG;AACvC,UAAI,WAAW,UAAU;AACrB,cAAM,IAAI,kBAAkB,+BAA+B,WAAW,GAAG;AAAA,MAC7E;AACA,eAAS,WAAW,MAAM;AAC1B;AAAA,IACJ;AACA,QAAI,UAAU,SAAS,WAAW,GAAG,OAAO,GAAG;AAC3C,eAAS,WAAW,EAAE,MAAM,SAAS,OAAK,OAAO,GAAG,KAAK,CAAC;AAC1D,aAAO,SAAS,WAAW,EAAE,IAAI,GAAG,IAAI;AAAA,IAC5C,OAAO;AACH,aAAO,SAAS,WAAW,GAAG,IAAI;AAAA,IACtC;AAAA,EACJ;AACA,SAAO;AACX;;;ACtEO,SAAS,YAAY,OAA8B;AACtD,MAAI,OAAO,UAAU,YAAY;AAC7B,WAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAC7B,WAAW,UAAwC,OAAO,OAAO,GAAG;AAChE,WAAO,YAAY,KAAK;AAAA,EAC5B,MAAO,QAAO,MAAM,KAAK,KAAK;AAClC;;;AC+DO,SAAS,OAAO,UAAgC;AACnD,MAAI;AACJ,MAAI,oBAAoB,MAAM;AAC1B,aAAS,KAAK,QAAQ;AAAA,EAC1B,WAAW,OAAO,aAAa,YAAY,OAAO,aAAa,YAAY,OAAO,aAAa,aAAa,OAAO,aAAa,UAAU;AACtI,aAAS,KAAK,IAAI,KAAK,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC5C,WAAW,UAAU,UAAU,kBAAkB,GAAG;AAChD,aAAS,SAAS;AAAA,EACtB,WAAW,aAAa,QAAQ,aAAa,QAAW;AACpD,aAAS,KAAK,IAAI,QAAQ,oBAAoB,CAAC;AAAA,EACnD,WAAW,UAAU,UAAU,SAAS,GAAG;AACvC,aAAS;AAAA,EACb,OAAO;AACH,UAAM,IAAI,oBAAoB,oBAAoB,QAAQ,eAAe;AAAA,EAC7E;AACA,SAAO;AACX;AACO,SAAS,EAAK,MAAkB;AACnC,SAAO;AACX;AACO,SAAS,SAA2B,MAAS;AAChD,SAAO,QAAQ,KAAK,WAAW,KAAK,GAAG,CAAC;AAC5C;AACO,SAAS,WAAW,MAAY,MAAoB;AACvD,aAAW,QAAQ,CAAC,MAAM,GAAG,KAAK,UAAU,GAAG;AAC3C,QAAI,gBAAgB,aAAa;AAC7B,WAAK,QAAQ,SAAS,IAAI,CAAC,IAAI;AAAA,IACnC;AACA,QAAI,SAAS,QAAQ,KAAK,WAAW,SAAS,GAAG;AAC7C,iBAAW,MAAM,IAAI;AAAA,IACzB;AAAA,EACJ;AACA,SAAO;AACX;AACO,SAAS,gBAIZ,SACA,kBACiB;AACjB,gBAAc,QAAQ,SAAS,CAAC,CAAC;AACjC,QAAM,YAAY,OAAO;AAAA,IACrB,OACK,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAC3B,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,MACnB;AAAA,MACA,4BAA4B,KAAK;AAAA,IACrC,CAAC;AAAA,EACT;AACA,QAAM,mBAAmB,OAAO,WAAW;AAC3C,QAAM,iBAAiB,SAAS,gBAAgB;AAChD,MAAI,QAAQ,QAAQ;AAChB,eAAWC,aAAY,QAAQ,QAAQ;AACnC,MAAAA,UAAS,MAAM,SAAS,cAAc,UAAU;AAAA,IACpD;AAAA,EACJ;AACA,QAAM,gBAAgB,CAAC,OAAuC,SAAqB;AAC/E,UAAM,WAAW,iBAAiB,SAAS,OAAO,SAAS,GAAG,YAAY,IAAI,GAAG,CAAC,KAAK,SAAS;AAC5F,YAAM,cAAc,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,GAAG;AAC5D,UAAI,CAAC,YAAa,OAAM,IAAI,UAAU,mBAAmB,GAAG,WAAW;AACvE,eAAS,QAAQ,cAAc,IAAI,YAAY,KAAK;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS,YAAY;AAAA,QACrB,YAAY;AAAA,MAChB,CAAC,CAAC;AAAA,IACN,CAAC;AACD,UAAM,WAAW,OAAO,QAAQ;AAChC,eAAW,SAAS,SAAS,gBAAgB;AAC7C,aAAS,MAAM,YAAY,SAAS,CAAC,aAAa,SAAS,QAAQ,CAAAC,UAAQ,WAAWA,MAAK,SAAS,gBAAgB,CAAC,CAAC;AACtH,WAAO,WAAW;AAAA,MACd,MAAM,IAA0B;AAC5B,cAAM,UAAU,OAAO,OAAO,WAAW,CAAC,GAAG,SAAS,iBAA8B,EAAE,CAAC,IAAI,CAAC,EAAE;AAC9F,mBAAW,UAAU,SAAS;AAC1B,iBAAO,YAAY,SAAS,OAAO;AAAA,QACvC;AAAA,MACJ;AAAA,MACA,GAAG,KAAa,SAAkC;AAC9C,iBAAS,GAAG,KAAK,WAAS,iBAAiB,cAAc,QAAQ,MAAM,MAAM,IAAI,IAAI;AACrF,eAAO;AAAA,MACX;AAAA,MACA,GAAG;AAAA,IACP,GAAG,kBAAkB;AAAA,EACzB;AACA,SAAO,OAAO,OAAO,eAAe;AAAA,IAChC,OAAO;AAAA,IACP,QAAQ,QAAQ;AAAA,EACpB,CAAsB;AAC1B;;;AC1JO,SAAS,SAAS,UAAmB;AACxC,QAAM,QAAQ,CAAC;AACf,QAAM,UAAoB,IAAI,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA,MAAMC,WAAU;AACZ,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,eAAS,KAAK,YAAY,KAAK;AAC/B,YAAM,cAAc,GAAG,KAAK,eAAeA,SAAQ,CAAC,IAAI,KAAK,WAAW,CAAC;AAAA,IAC7E;AAAA,IACA,aAAa;AACT,aAAO,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,cAAc,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE;AAAA,IACzG;AAAA,IACA,eAAeA,WAAU;AACrB,cAAS,KAAK,YAAY,OAAOA,aAAY,OAAQ;AAAA,IACzD;AAAA,EACJ,GAAe;AAAA,IACX,IAAkD,QAAiC,GAAM,UAAmB;AACxG,UAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG;AACxB,eAAO,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAAA,MAC1C,OAAO;AACH,eAAO,CAAC,SAAiC;AACrC,gBAAM,CAAC,IAAI,OAAO,IAAI;AACtB,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAC;AACD,SAAO;AACX;;;AChCO,SAAS,YAAiC,MAAS,SAAkD;AACxG,SAAO,EAAE,MAAM,GAAG,WAAW,CAAC,EAAE;AACpC;;;ACVA;AAAA;AAAA;AAAA;A;;;;;;;;;ACEA,IAAO,kBAAQ,gBAAgB;AAAA;AAAA,EAC3B,OAAO;AAAA,IACH,OAAO;AAAA;AAAA,MACH,UAAU,OAAO;AAAA;AAAA,MACjB,WAAW;AAAA;AAAA,MACX,UAAU;AAAA;AAAA,MACV,QAAQ;AAAA;AAAA,MACR,cAAc;AAAA;AAAA,MACd,YAAY;AAAA;AAAA,IAChB;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACJ,YAAY,MAAM;AAAA,MACd,UAAU;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACV;AAAA,MACA,YAAY;AAAA,IAChB,CAAC;AAAA,IACD,YAAY,QAAQ;AAAA,MAChB,UAAU;AAAA,QACN,MAAM;AAAA,QACN,MAAM,uBAAO;AAAA,MACjB;AAAA,MACA,YAAY;AAAA,IAChB,CAAC;AAAA,EACL;AACJ,GAAG,CAAC,UAAU;AACV,QAAM,UAAU,KAAK,MAAM,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAC/D,SAAO,KAAK,KAAK,EACZ,IAAI,SAAS,EAAE,SAAS,MAAM,EAAE,QAAQ,MAAM,CAAC,EAC/C;AAAA,IACG;AAAA,IAAO,KAAK,IAAI;AAAA,IAChB,KAAK,QAAQ,EACR,GAAG,SAAS,MAAM,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,IAAI,CAAC,CAAC,EACxD,OAAO,0BAAM;AAAA,IAClB,KAAK,QAAQ,EACR,GAAG,SAAS,MAAM,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,IAAI,CAAC,CAAC,EACxD,OAAO,0BAAM;AAAA,IAClB,KAAK,IAAI;AAAA,IACT;AAAA,IAAQ,EAAE,MAAM,KAAK;AAAA;AAAA,IACrB;AAAA,IAAQ,EAAE,OAAO;AAAA,IACjB,EAAE;AAAA;AAAA,MACE,MAAM;AAAA,QACF,QAAQ,IAAI;AAAA,QACZ,MAAM,KAAK,KAAK,EAAE,OAAO,gCAAO;AAAA,MACpC;AAAA,MACA,CAAC,OAAO;AAAA,IACZ,CAAC;AAAA;AAAA,IACD;AAAA,MACI,MAAM,MAAM,MAAM,IAAI,IAAI;AAAA,MAC1B,MAAM,KAAK,GAAG,EAAE,OAAO,+BAAgB;AAAA,MACvC,CAAC,MAAM,KAAK;AAAA,IAChB;AAAA;AAAA,EACJ;AACR,CAAC;;;ACvDD,IAAO,mBAAQ,gBAAgB;AAAA,EAC3B,OAAO;AAAA,IACH,OAAO;AAAA,MACH,WAAW,YAAsB;AAAA,MACjC,QAAQ,CAAC,WAAW,WAAW,SAAS;AAAA,IAC5C;AAAA,IACA,OAAO;AAAA,MACH,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,IACd;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACJ,YAAY,UAAU,EAAE,UAAU,EAAE,CAAC;AAAA,IACrC,YAAY,eAAe,EAAE,UAAU,MAAM,CAAC;AAAA,EAClD;AAAA,EACA,QAAQ;AAAA,IACJ,SAAS,OAAO,EACX,gBAAgB,MAAM,EACtB,MAAM,OAAO;AAAA,IAClB,SAAS,WAAW,EACf,QAAQ,MAAM,EACd,cAAc,QAAQ;AAAA,EAC/B;AACJ,GAAG,CAAC,OAAO,MAAM,SAAS;AACtB,QAAM,UAAU,KAAK,KAAK;AAC1B,QAAM,SAAS,CAAC,UAAkB;AAC9B,UAAM,MAAM,IAAI,KAAK;AACrB,YAAQ,IAAI,KAAK;AACjB,SAAK,UAAU,MAAM,MAAM,IAAI,CAAC;AAAA,EACpC;AACA,UAAQ,MAAM,SAAS,OAAK,KAAK,eAAe,CAAC,CAAC;AAElD,SAAO,KAAK,KAAK,EACZ,MAAM,UAAU,EAChB,WAAW,OAAO,EAClB;AAAA,IACG,KAAK,MAAM,EACN,MAAM,MAAM,EACZ,IAAI,SAAS,EAAE,gBAAgB,KAAK,CAAC,EACrC,OAAO,EAAE,KAAK,MAAM,MAAM,MAAM,IAAI,EAAE,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,EACtF,GAAG,SAAS,MAAM,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AAAA,IAClD,KAAK;AAAA,IACL;AAAA,MAAK;AAAA,MAAS,MACV,KAAK,KAAK,EACL,MAAM,UAAU,EAChB;AAAA,QACG,EAAE,KAAK,MACH,MAAM,MAAM,IAAI,EAAE;AAAA,UAAI,CAAC,OAAO,UAC1B,KAAK,MAAM,EACN,MAAM,MAAM,EACZ,OAAO,KAAK,EACZ,GAAG,SAAS,MAAM,OAAO,KAAK,CAAC;AAAA,QACxC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,MACzB;AAAA,IACR;AAAA,EACJ;AACR,CAAC;;;ACxDD,IAAO,mBAAQ,EAAE,0BAAS,2BAAS;;;AhBInC,IAAI,OAAO,cAAc,SAAS,eAAe;AAC7C,UAAQ,KAAK,2CAA2C;AAC5D;","names":["child","children","styleSet","data","tree","styleSet","tree","selector"]}
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/util/types.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\r\nif (window.__NINE_ENV__?.mode === \"development\") {\r\n console.warn(\"[Nine-9] Initialized in development mode.\");\r\n}","interface SubcriberCallback<T extends unknown[], R> {\r\n (...data: T): R;\r\n}\r\ninterface Subcriber<T extends unknown[], R> {\r\n callback: SubcriberCallback<T, R>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[], R = void> {\r\n private subcribers: Subcriber<T, R>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T, R>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T): R[] | void {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n const result: R[] = [];\r\n for (const subcriber of this.subcribers) {\r\n result.push(subcriber.callback(...data));\r\n }\r\n this.emitting = false;\r\n return result;\r\n }\r\n}","export function camelToHyphen<T extends string>(str: T): T {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`) as T;\r\n}\r\nexport function hyphenToCamel<T extends string>(str: T): T {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()) as T;\r\n}","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIntoArray<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 attachFlag<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, RawSourceTree } from \"./component\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIntoArray } from \"@/util/array\";\r\nimport { attachFlag, HOST_TREE, matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { EventSubcriber } from \"@/channel\";\r\nimport { SupportedHTMLRawAttributes, SupportedHTMLElements, SupportedEventHandlerMap } from \"./element\";\r\nimport { KebabToCamel, ObjectToEntryUnion } from \"@/util/types\";\r\n\r\nexport interface HostTreeHooks {\r\n treeUpdated: [newTrees: HostTree[], oldTrees: HostTree[]];\r\n attributeUpdated: [attribute: string, newValue: unknown, oldValue: unknown];\r\n initialized: [rootTree: HostTree];\r\n $preventEvent: [ObjectToEntryUnion<SupportedEventHandlerMap>, boolean | void];\r\n}\r\nexport type HostTreeHookStore = {\r\n [K in keyof HostTreeHooks as K extends `$${infer R}` ? R : K]:\r\n K extends `$${string}`\r\n ? HostTreeHooks[K] extends [infer E extends unknown[], infer R]\r\n ? EventSubcriber<E, R>\r\n : EventSubcriber<HostTreeHooks[K]>\r\n : EventSubcriber<HostTreeHooks[K]>;\r\n};\r\nexport type HostTree<E extends SupportedHTMLElements = SupportedHTMLElements, T = HTMLElementTagNameMap[E], A = SupportedHTMLRawAttributes[E]> = {\r\n [K in string & keyof A as KebabToCamel<K>]-?: (data: A[K] | Wrapper<A[K]>) => HostTree<E>;\r\n} & {\r\n element: T;\r\n hooks: HostTreeHookStore;\r\n append(...children: (\r\n RawSourceTree |\r\n HostTree |\r\n RawSourceTree[] |\r\n HostTree[] |\r\n (RawSourceTree | HostTree)[] |\r\n Wrapper<HostTree> |\r\n Wrapper<RawSourceTree> |\r\n Wrapper<RawSourceTree | HostTree> |\r\n Wrapper<(RawSourceTree | HostTree)[]> |\r\n Wrapper<RawSourceTree | RawSourceTree[]>\r\n )[]): HostTree<E>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<E>;\r\n on<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options?: AddEventListenerOptions): HostTree<E>;\r\n on(key: string, handler: (...args: unknown[]) => unknown, options?: AddEventListenerOptions): HostTree<E>;\r\n};\r\n\r\nexport function tree<E extends SupportedHTMLElements>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const hooks: HostTreeHookStore = {\r\n treeUpdated: new EventSubcriber(),\r\n attributeUpdated: new EventSubcriber(),\r\n initialized: new EventSubcriber(),\r\n preventEvent: new EventSubcriber()\r\n };\r\n const context: HostTree<E> = new Proxy(attachFlag({\r\n element,\r\n hooks,\r\n append(...children: (RawSourceTree | RawSourceTree[] | Wrapper<RawSourceTree | RawSourceTree[]>)[]) {\r\n for (const child of children) {\r\n if (matchFlag<RawSourceTree | RawSourceTree[], 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: RawSourceTree[] | RawSourceTree) => {\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 hooks.treeUpdated.emit(newChildren, oldChildren);\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 putIntoArray(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<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options: AddEventListenerOptions) {\r\n if (element instanceof EventTarget) {\r\n element.addEventListener(key, (e) => {\r\n //@ts-expect-error 运行时这个本来就是配套的,ts推断不出来\r\n const emitResult = hooks.preventEvent.emit(key, handler);\r\n if (emitResult && !emitResult.some(Boolean)) {\r\n //@ts-expect-error 依旧是传参问题,ts推断不出来\r\n handler(e);\r\n }\r\n }, options);\r\n }\r\n return context;\r\n },\r\n } as HostTree<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 const update = (newData: HTMLElementTagNameMap[E][P], oldData: HTMLElementTagNameMap[E][P]) => {\r\n if (Object.hasOwn(element, p)) {\r\n element[p] = newData;\r\n }\r\n if (element instanceof Element) {\r\n element.setAttribute(camelToHyphen(p), String(newData));\r\n }\r\n hooks.attributeUpdated.emit(p, newData, oldData);\r\n };\r\n if (matchFlag<HTMLElementTagNameMap[E][P], typeof WRAPPER>(data, WRAPPER)) {\r\n data.event.subcribe(update);\r\n update(data.get(), data.get());\r\n } else {\r\n update(data, data);\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n Promise.resolve().then(() => hooks.initialized.emit(context as unknown as HostTree));\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingError 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 { attachFlag, 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 normalizeWrap<T>(data: T | Wrapper<T>): Wrapper<T> {\r\n if (matchFlag<T, typeof WRAPPER>(data, WRAPPER)) {\r\n return data;\r\n } else {\r\n return wrap(data);\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> = attachFlag({\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 { ComponentPropertyStore, PropertyTransformer } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingError, ValidationFailed } from \"@/exceptions\";\r\nimport { matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { wrap, Wrapper } from \"./reactive\";\r\nimport { EmptyValue } from \"@/util\";\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 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\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 MissingError(`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}","\r\nimport { ComponentSlotStore, SourceTree } from \"./component\";\r\nimport { normalizeWrap, Wrapper } from \"./reactive\";\r\nimport { MissingError } from \"@/exceptions\";\r\n\r\nexport type SlotDescriptor<T = unknown, N extends string = string, R extends boolean = boolean> = {\r\n name: N;\r\n} & SlotOptions<T, R>;\r\nexport interface SlotOptions<T, R extends boolean> {\r\n template: T;\r\n required?: R;\r\n defaultValue?: SourceTree;\r\n}\r\nexport type SlotInput<T> = (data: Wrapper<T>) => SourceTree | Wrapper<SourceTree>;\r\nexport type SlotOutput<T> = (data: T | Wrapper<T>) => Wrapper<SourceTree>;\r\nexport type ComponentSlotInputDict<T extends ComponentSlotStore> = {\r\n [K in T[number]as K[\"name\"]]?: SlotInput<K[\"template\"]>;\r\n};\r\nexport type ComponentSlotOutputDict<T extends ComponentSlotStore> = {\r\n [K in T[number]as K[\"name\"]]-?: SlotOutput<K[\"template\"]>;\r\n}\r\n\r\nexport function extractInput<T>(render: SlotInput<T>): SlotOutput<T> {\r\n return (data: T | Wrapper<T>) => normalizeWrap(render(normalizeWrap(data)));\r\n}\r\nexport function renderSlots<T extends ComponentSlotStore>(rawInput?: ComponentSlotInputDict<T>, store?: T): ComponentSlotOutputDict<T> {\r\n if (!store) return {} as ComponentSlotOutputDict<T>;\r\n const input = rawInput as Record<string, SlotInput<T[number][\"template\"]>>;\r\n return Object.fromEntries(store.map(descriptor => {\r\n if (descriptor.required && (!input || !Object.hasOwn(input, descriptor.name))) {\r\n throw new MissingError(`Missing a required slot ${descriptor.name}.`);\r\n }\r\n if (!input) return [descriptor.name, () => null];\r\n return [\r\n descriptor.name,\r\n extractInput(input[descriptor.name])\r\n ];\r\n })) as ComponentSlotOutputDict<T>;\r\n}\r\nexport function defineSlot<N extends string, R extends boolean, T>(name: N, options: SlotOptions<T, R>) {\r\n return {\r\n name,\r\n ...options\r\n };\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { HostTree, tree } from \"./tree\";\r\nimport { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { ComponentSlotInputDict, ComponentSlotOutputDict, renderSlots, SlotDescriptor } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\nimport { attachFlag, COMPONENT_INSTANCE, HOST_TREE, matchFlag } from \"@/constants/flags\";\r\nimport { EventDescriptor } from \"./event\";\r\nimport { StyleSet } from \"./style\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: ComponentSlotInputDict<S>): ComponentInstance<E>;\r\n}\r\nexport interface ComponentInternalRender<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {\r\n (\r\n options: ComponentPropertyOutputDict<P>,\r\n slot: ComponentSlotOutputDict<S>,\r\n emit: <D extends E[number], K extends D[\"name\"]>(\r\n key: K,\r\n data: D extends infer R extends EventDescriptor ? 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, S extends ComponentSlotStore> =\r\n ComponentRenderEntry<P, E, S> & ComponentOption<P, E, S>;\r\nexport interface PropertyTransformer<I, O> {\r\n (data: I): O;\r\n}\r\n\r\nexport type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;\r\nexport type ComponentEventStore = EventDescriptor[];\r\nexport type ComponentSlotStore = SlotDescriptor[];\r\n\r\nexport interface ComponentOption<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {\r\n props?: P;\r\n events?: E;\r\n styles?: StyleSet[];\r\n slots?: S;\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 ? R[\"name\"] extends K ? R[\"template\"] : never : never) => void\r\n ): ComponentInstance<E>;\r\n $: HostTree;\r\n};\r\nexport type RawSourceTree = [\r\n HTMLElement,\r\n string,\r\n number,\r\n boolean,\r\n bigint,\r\n EmptyValue,\r\n ComponentInstance,\r\n][number];\r\nexport type SourceTree = RawSourceTree | HostTree;\r\n\r\nexport function render(nodeTree: SourceTree): HostTree {\r\n let result: HostTree;\r\n if (nodeTree instanceof Node) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\" || typeof nodeTree === \"bigint\") {\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\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<SourceTree>;\r\n}\r\nexport function flagment<T extends string>(uuid: T) {\r\n return `nine_${uuid.replaceAll(\"-\", \"_\")}` as const;\r\n}\r\nexport function attachUUID(root: Node, uuid: string): Node {\r\n for (const node of [root, ...root.childNodes]) {\r\n if (node instanceof HTMLElement) {\r\n node.dataset[flagment(uuid)] = \"true\";\r\n }\r\n if (node !== root && node.childNodes.length > 0) {\r\n attachUUID(node, uuid);\r\n }\r\n }\r\n return root;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore,\r\n E extends EventDescriptor,\r\n S extends SlotDescriptor\r\n>(\r\n options: ComponentOption<P, E[], S[]>,\r\n internalRenderer: ComponentInternalRender<P, E[], S[]>\r\n): Component<P, E[], S[]> {\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 rawComponentUUID = crypto.randomUUID();\r\n const flagmentedUUID = flagment(rawComponentUUID);\r\n if (options.styles) {\r\n for (const styleSet of options.styles) {\r\n styleSet.apply(`[data-${flagmentedUUID}=\"true\"]`);\r\n }\r\n }\r\n const entryRenderer = (props?: ComponentPropertyInputDict<P>, slot?: ComponentSlotInputDict<S[]>) => {\r\n const nodeTree = internalRenderer(\r\n hostdown(props, propStore),\r\n renderSlots(slot, options.slots),\r\n (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 hostTree.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 hostTree = render(nodeTree);\r\n attachUUID(hostTree.element, rawComponentUUID);\r\n hostTree.hooks.treeUpdated.subcribe((newTrees) => newTrees.forEach(tree => attachUUID(tree.element, rawComponentUUID)));\r\n return attachFlag({\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(hostTree.element);\r\n }\r\n },\r\n on(key: string, handler: (data: unknown) => void) {\r\n hostTree.on(key, event => event instanceof CustomEvent ? handler(event.detail) : null);\r\n return this;\r\n },\r\n $: hostTree\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[], S[]>);\r\n}","export type EmptyValue = undefined | null | void | never;\r\nexport type Normalize<T extends Record<string, unknown>> = T extends Record<infer K, infer R> ? Record<K, Required<R>> : never;\r\nexport type Valueof<T> = T[keyof T];\r\nexport type KebabToCamel<S extends string> =\r\n S extends `${infer First}-${infer Rest}`\r\n ? `${First}${Capitalize<KebabToCamel<Rest>>}`\r\n : S;\r\nexport type ObjectToEntryUnion<T> = {\r\n [K in keyof T]: [K, T[K]];\r\n}[keyof T];\r\n\r\nexport function defineTemplate<T = void>(): T {\r\n return null as T;\r\n}","import { camelToHyphen } from \"@/util\";\r\n\r\nexport type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n selector?: string;\r\n apply(selector?: string): StyleSet;\r\n ruleString(): string;\r\n selectorString(selector?: string): string;\r\n};\r\nexport function styleSet(selector?: string) {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n selector,\r\n apply(selector) {\r\n const style = document.createElement(\"style\");\r\n document.head.appendChild(style);\r\n style.textContent = `${this.selectorString(selector)}{${this.ruleString()}}`;\r\n },\r\n ruleString() {\r\n return Object.entries(rules).map(([key, value]) => `${camelToHyphen(String(key))}:${value};`).join(\"\");\r\n },\r\n selectorString(selector) {\r\n return ((this.selector || \"\") + (selector || \"\")) || \"*\";\r\n },\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 = unknown, N extends string = 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, defineTemplate } 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: defineTemplate<{}>(),\r\n bubbleable: true\r\n }),\r\n defineEvent(\"down\", {\r\n template: defineTemplate<number>(),\r\n bubbleable: true\r\n })\r\n ]\r\n}, (props, _slot, emit) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n emit(\"down\", 0);\r\n emit(\"up\", {});\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 .append(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .append(\"点击减一\"),\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\").append(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").append(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import {\r\n $,\r\n createComponent,\r\n defineEvent,\r\n defineSlot,\r\n defineTemplate,\r\n rawProperty,\r\n styleSet,\r\n sync,\r\n tree,\r\n when,\r\n wrap\r\n} from \"@\";\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: defineTemplate<number>() }),\r\n defineEvent(\"toggleState\", { template: defineTemplate<boolean>() })\r\n ],\r\n styles: [\r\n styleSet(\".item\")\r\n .backgroundColor(\"blue\")\r\n .color(\"white\"),\r\n styleSet(\".flexdown\")\r\n .display(\"flex\")\r\n .flexDirection(\"column\")\r\n ],\r\n slots: [\r\n defineSlot(\"title\", {\r\n template: defineTemplate<string>(),\r\n })\r\n ]\r\n}, (props, slot, emit) => {\r\n const showing = wrap(false);\r\n const text = sync(() =>\r\n props.items.get()[props.value.get()]\r\n , [props.items, props.value]);\r\n\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 .class(\"flexdown\")\r\n .ariaAtomic(\"false\")\r\n .append(\r\n tree(\"span\")\r\n .class(\"item\")\r\n .use(styleSet().backgroundColor(\"red\"))\r\n .append(\r\n tree(\"div\").append($(text)),\r\n slot.title(text)\r\n )\r\n .on(\"click\", () => showing.set(!showing.get())),\r\n when(showing, () =>\r\n tree(\"div\")\r\n .class(\"flexdown\")\r\n .append(\r\n $(sync(() =>\r\n props.items.get().map((label, index) =>\r\n tree(\"span\")\r\n .class(\"item\")\r\n .append(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":["child","children","styleSet","data","tree","render","styleSet","tree","selector"]}
package/dist/test.js CHANGED
@@ -1,5 +1,27 @@
1
1
  "use strict";
2
2
 
3
+ // src/channel/event-subcriber.ts
4
+ var EventSubcriber = class {
5
+ subcribers = [];
6
+ emitting = false;
7
+ subcribe(callback, once = false) {
8
+ this.subcribers.push({
9
+ callback,
10
+ once
11
+ });
12
+ }
13
+ emit(...data) {
14
+ if (this.emitting) return;
15
+ this.emitting = true;
16
+ const result = [];
17
+ for (const subcriber of this.subcribers) {
18
+ result.push(subcriber.callback(...data));
19
+ }
20
+ this.emitting = false;
21
+ return result;
22
+ }
23
+ };
24
+
3
25
  // src/util/char.ts
4
26
  function camelToHyphen(str) {
5
27
  return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
@@ -24,28 +46,6 @@ function matchFlag(data, flag) {
24
46
  return data !== null && data !== void 0 && typeof data === "object" && Object.hasOwn(data, flag) && data[flag] === true;
25
47
  }
26
48
 
27
- // src/channel/event-subcriber.ts
28
- var EventSubcriber = class {
29
- subcribers = [];
30
- emitting = false;
31
- subcribe(callback, once = false) {
32
- this.subcribers.push({
33
- callback,
34
- once
35
- });
36
- }
37
- emit(...data) {
38
- if (this.emitting) return;
39
- this.emitting = true;
40
- const result = [];
41
- for (const subcriber of this.subcribers) {
42
- result.push(subcriber.callback(...data));
43
- }
44
- this.emitting = false;
45
- return result;
46
- }
47
- };
48
-
49
49
  // src/dom/tree.ts
50
50
  function tree(data) {
51
51
  const element = typeof data === "string" ? document.createElement(data) : data;
@@ -149,7 +149,7 @@ function tree(data) {
149
149
  // src/exceptions/index.ts
150
150
  var ValidationFailed = class extends Error {
151
151
  };
152
- var MissingFieldError = class extends Error {
152
+ var MissingError = class extends Error {
153
153
  };
154
154
  var ConflictionError = class extends Error {
155
155
  };
@@ -159,6 +159,13 @@ var BrokenRendererError = class extends Error {
159
159
  };
160
160
 
161
161
  // src/dom/reactive.ts
162
+ function normalizeWrap(data) {
163
+ if (matchFlag(data, WRAPPER)) {
164
+ return data;
165
+ } else {
166
+ return wrap(data);
167
+ }
168
+ }
162
169
  function wrap(initialData, wrapperOptions) {
163
170
  const arrayActions = ["push", "pop", "shift", "unshift", "splice", "sort", "reverse"];
164
171
  const patch = (data) => {
@@ -315,7 +322,7 @@ function hostdown(upstream, store) {
315
322
  };
316
323
  if (!Object.hasOwn(upstream, propertyKey)) {
317
324
  if (descriptor.required) {
318
- throw new MissingFieldError(`Missing a required property ${propertyKey}.`);
325
+ throw new MissingError(`Missing a required property ${propertyKey}.`);
319
326
  }
320
327
  setValue(descriptor.shadow);
321
328
  continue;
@@ -331,12 +338,28 @@ function hostdown(upstream, store) {
331
338
  }
332
339
 
333
340
  // src/dom/slot.ts
334
- function pipeExtract(input) {
335
- if (typeof input === "function") {
336
- return () => wrap(input());
337
- } else if (matchFlag(input, WRAPPER)) {
338
- return pipeExtract(input);
339
- } else return () => wrap(input);
341
+ function extractInput(render2) {
342
+ return (data) => normalizeWrap(render2(normalizeWrap(data)));
343
+ }
344
+ function renderSlots(rawInput, store) {
345
+ if (!store) return {};
346
+ const input = rawInput;
347
+ return Object.fromEntries(store.map((descriptor) => {
348
+ if (descriptor.required && (!input || !Object.hasOwn(input, descriptor.name))) {
349
+ throw new MissingError(`Missing a required slot ${descriptor.name}.`);
350
+ }
351
+ if (!input) return [descriptor.name, () => null];
352
+ return [
353
+ descriptor.name,
354
+ extractInput(input[descriptor.name])
355
+ ];
356
+ }));
357
+ }
358
+ function defineSlot(name, options) {
359
+ return {
360
+ name,
361
+ ...options
362
+ };
340
363
  }
341
364
 
342
365
  // src/dom/component.ts
@@ -390,15 +413,19 @@ function createComponent(options, internalRenderer) {
390
413
  }
391
414
  }
392
415
  const entryRenderer = (props, slot) => {
393
- const nodeTree = internalRenderer(hostdown(props, propStore), pipeExtract(slot), (key, data) => {
394
- const targetEvent = options.events?.find((e) => e.name === key);
395
- if (!targetEvent) throw new TypeError(`No events named ${key} to emit.`);
396
- hostTree.element.dispatchEvent(new CustomEvent(key, {
397
- detail: data,
398
- bubbles: targetEvent.bubbleable,
399
- cancelable: false
400
- }));
401
- });
416
+ const nodeTree = internalRenderer(
417
+ hostdown(props, propStore),
418
+ renderSlots(slot, options.slots),
419
+ (key, data) => {
420
+ const targetEvent = options.events?.find((e) => e.name === key);
421
+ if (!targetEvent) throw new TypeError(`No events named ${key} to emit.`);
422
+ hostTree.element.dispatchEvent(new CustomEvent(key, {
423
+ detail: data,
424
+ bubbles: targetEvent.bubbleable,
425
+ cancelable: false
426
+ }));
427
+ }
428
+ );
402
429
  const hostTree = render(nodeTree);
403
430
  attachUUID(hostTree.element, rawComponentUUID);
404
431
  hostTree.hooks.treeUpdated.subcribe((newTrees) => newTrees.forEach((tree2) => attachUUID(tree2.element, rawComponentUUID)));
@@ -422,6 +449,11 @@ function createComponent(options, internalRenderer) {
422
449
  });
423
450
  }
424
451
 
452
+ // src/util/types.ts
453
+ function defineTemplate() {
454
+ return null;
455
+ }
456
+
425
457
  // src/dom/style.ts
426
458
  function styleSet(selector) {
427
459
  const rules = {};
@@ -459,11 +491,6 @@ function defineEvent(name, options) {
459
491
  return { name, ...options ?? {} };
460
492
  }
461
493
 
462
- // src/index.ts
463
- if (window.__NINE_ENV__?.mode === "development") {
464
- console.warn("[Nine-9] Initialized in development mode.");
465
- }
466
-
467
494
  // src/examples/Counter.ts
468
495
  var Counter_default = createComponent({
469
496
  //创建组件
@@ -486,22 +513,18 @@ var Counter_default = createComponent({
486
513
  },
487
514
  events: [
488
515
  defineEvent("up", {
489
- template: {
490
- arg1: 0,
491
- arg2: false
492
- },
516
+ template: defineTemplate(),
493
517
  bubbleable: true
494
518
  }),
495
519
  defineEvent("down", {
496
- template: {
497
- arg3: "sb",
498
- arg4: /* @__PURE__ */ Symbol()
499
- },
520
+ template: defineTemplate(),
500
521
  bubbleable: true
501
522
  })
502
523
  ]
503
- }, (props) => {
524
+ }, (props, _slot, emit) => {
504
525
  const doubled = sync(() => props.value.get() * 2, [props.value]);
526
+ emit("down", 0);
527
+ emit("up", {});
505
528
  return tree("div").use(styleSet().fontSize("20px").padding("10px")).append(
506
529
  "\u6572\u6728\u9C7C",
507
530
  tree("br"),
@@ -545,15 +568,24 @@ var Selector_default = createComponent({
545
568
  }
546
569
  },
547
570
  events: [
548
- defineEvent("select", { template: 0 }),
549
- defineEvent("toggleState", { template: false })
571
+ defineEvent("select", { template: defineTemplate() }),
572
+ defineEvent("toggleState", { template: defineTemplate() })
550
573
  ],
551
574
  styles: [
552
575
  styleSet(".item").backgroundColor("blue").color("white"),
553
576
  styleSet(".flexdown").display("flex").flexDirection("column")
577
+ ],
578
+ slots: [
579
+ defineSlot("title", {
580
+ template: defineTemplate()
581
+ })
554
582
  ]
555
583
  }, (props, slot, emit) => {
556
584
  const showing = wrap(false);
585
+ const text = sync(
586
+ () => props.items.get()[props.value.get()],
587
+ [props.items, props.value]
588
+ );
557
589
  const select = (index) => {
558
590
  props.value.set(index);
559
591
  showing.set(false);
@@ -561,8 +593,10 @@ var Selector_default = createComponent({
561
593
  };
562
594
  showing.event.subcribe((e) => emit("toggleState", e));
563
595
  return tree("div").class("flexdown").ariaAtomic("false").append(
564
- tree("span").class("item").use(styleSet().backgroundColor("red")).append($(sync(() => props.items.get()[props.value.get()], [props.items, props.value]))).on("click", () => showing.set(!showing.get())),
565
- slot(),
596
+ tree("span").class("item").use(styleSet().backgroundColor("red")).append(
597
+ tree("div").append($(text)),
598
+ slot.title(text)
599
+ ).on("click", () => showing.set(!showing.get())),
566
600
  when(
567
601
  showing,
568
602
  () => tree("div").class("flexdown").append(
@@ -577,7 +611,15 @@ var Selector_default = createComponent({
577
611
  // src/examples/index.ts
578
612
  var examples_default = { Counter: Counter_default, Selector: Selector_default };
579
613
 
614
+ // src/index.ts
615
+ if (window.__NINE_ENV__?.mode === "development") {
616
+ console.warn("[Nine-9] Initialized in development mode.");
617
+ }
618
+
580
619
  // src/test.ts
581
620
  var value = wrap(0);
582
- examples_default.Selector({ value }).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");
621
+ value.event.subcribe((e) => console.log("\u4E0B\u6E38\u66F4\u65B0\uFF1A", e));
622
+ examples_default.Selector({ value }, {
623
+ title: (text) => tree("span").append("\u5F53\u524D\u9009\u9879\u7684label\uFF1A", $(text))
624
+ }).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");
583
625
  //# sourceMappingURL=test.js.map
package/dist/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/char.ts","../src/util/array.ts","../src/constants/flags.ts","../src/channel/event-subcriber.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/index.ts","../src/examples/Counter.ts","../src/examples/Selector.ts","../src/examples/index.ts","../src/test.ts"],"sourcesContent":["export function camelToHyphen<T extends string>(str: T): T {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`) as T;\r\n}\r\nexport function hyphenToCamel<T extends string>(str: T): T {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()) as T;\r\n}","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIntoArray<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 attachFlag<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}","interface SubcriberCallback<T extends unknown[], R> {\r\n (...data: T): R;\r\n}\r\ninterface Subcriber<T extends unknown[], R> {\r\n callback: SubcriberCallback<T, R>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[], R = void> {\r\n private subcribers: Subcriber<T, R>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T, R>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T): R[] | void {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n const result: R[] = [];\r\n for (const subcriber of this.subcribers) {\r\n result.push(subcriber.callback(...data));\r\n }\r\n this.emitting = false;\r\n return result;\r\n }\r\n}","import { camelToHyphen } from \"@/util/char\";\r\nimport { render, RawSourceTree } from \"./component\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIntoArray } from \"@/util/array\";\r\nimport { attachFlag, HOST_TREE, matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { EventSubcriber } from \"@/channel\";\r\nimport { SupportedHTMLRawAttributes, SupportedHTMLElements, SupportedEventHandlerMap } from \"./element\";\r\nimport { KebabToCamel, ObjectToEntryUnion } from \"@/util/types\";\r\n\r\nexport interface HostTreeHooks {\r\n treeUpdated: [newTrees: HostTree[], oldTrees: HostTree[]];\r\n attributeUpdated: [attribute: string, newValue: unknown, oldValue: unknown];\r\n initialized: [rootTree: HostTree];\r\n $preventEvent: [ObjectToEntryUnion<SupportedEventHandlerMap>, boolean | void];\r\n}\r\nexport type HostTreeHookStore = {\r\n [K in keyof HostTreeHooks as K extends `$${infer R}` ? R : K]:\r\n K extends `$${string}`\r\n ? HostTreeHooks[K] extends [infer E extends unknown[], infer R]\r\n ? EventSubcriber<E, R>\r\n : EventSubcriber<HostTreeHooks[K]>\r\n : EventSubcriber<HostTreeHooks[K]>;\r\n};\r\nexport type HostTree<E extends SupportedHTMLElements = SupportedHTMLElements, T = HTMLElementTagNameMap[E], A = SupportedHTMLRawAttributes[E]> = {\r\n [K in string & keyof A as KebabToCamel<K>]-?: (data: A[K] | Wrapper<A[K]>) => HostTree<E>;\r\n} & {\r\n element: T;\r\n hooks: HostTreeHookStore;\r\n append(...children: (\r\n RawSourceTree |\r\n HostTree |\r\n RawSourceTree[] |\r\n HostTree[] |\r\n (RawSourceTree | HostTree)[] |\r\n Wrapper<HostTree> |\r\n Wrapper<RawSourceTree> |\r\n Wrapper<RawSourceTree | HostTree> |\r\n Wrapper<(RawSourceTree | HostTree)[]> |\r\n Wrapper<RawSourceTree | RawSourceTree[]>\r\n )[]): HostTree<E>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<E>;\r\n on<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options?: AddEventListenerOptions): HostTree<E>;\r\n on(key: string, handler: (...args: unknown[]) => unknown, options?: AddEventListenerOptions): HostTree<E>;\r\n};\r\n\r\nexport function tree<E extends SupportedHTMLElements>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const hooks: HostTreeHookStore = {\r\n treeUpdated: new EventSubcriber(),\r\n attributeUpdated: new EventSubcriber(),\r\n initialized: new EventSubcriber(),\r\n preventEvent: new EventSubcriber()\r\n };\r\n const context: HostTree<E> = new Proxy(attachFlag({\r\n element,\r\n hooks,\r\n append(...children: (RawSourceTree | RawSourceTree[] | Wrapper<RawSourceTree | RawSourceTree[]>)[]) {\r\n for (const child of children) {\r\n if (matchFlag<RawSourceTree | RawSourceTree[], 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: RawSourceTree[] | RawSourceTree) => {\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 hooks.treeUpdated.emit(newChildren, oldChildren);\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 putIntoArray(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<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options: AddEventListenerOptions) {\r\n if (element instanceof EventTarget) {\r\n element.addEventListener(key, (e) => {\r\n //@ts-expect-error 运行时这个本来就是配套的,ts推断不出来\r\n const emitResult = hooks.preventEvent.emit(key, handler);\r\n if (emitResult && !emitResult.some(Boolean)) {\r\n //@ts-expect-error 依旧是传参问题,ts推断不出来\r\n handler(e);\r\n }\r\n }, options);\r\n }\r\n return context;\r\n },\r\n } as HostTree<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 const update = (newData: HTMLElementTagNameMap[E][P], oldData: HTMLElementTagNameMap[E][P]) => {\r\n if (Object.hasOwn(element, p)) {\r\n element[p] = newData;\r\n }\r\n if (element instanceof Element) {\r\n element.setAttribute(camelToHyphen(p), String(newData));\r\n }\r\n hooks.attributeUpdated.emit(p, newData, oldData);\r\n };\r\n if (matchFlag<HTMLElementTagNameMap[E][P], typeof WRAPPER>(data, WRAPPER)) {\r\n data.event.subcribe(update);\r\n update(data.get(), data.get());\r\n } else {\r\n update(data, data);\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n Promise.resolve().then(() => hooks.initialized.emit(context as unknown as HostTree));\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 { attachFlag, 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> = attachFlag({\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 { attachFlag, COMPONENT_INSTANCE, HOST_TREE, matchFlag } from \"@/constants/flags\";\r\nimport { EventDescriptor } from \"./event\";\r\nimport { StyleSet } from \"./style\";\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 styles?: StyleSet[];\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 RawSourceTree = [\r\n HTMLElement,\r\n // HostTree,\r\n string,\r\n number,\r\n boolean,\r\n bigint,\r\n EmptyValue,\r\n ComponentInstance,\r\n][number];\r\nexport type SourceTree = RawSourceTree | HostTree;\r\n\r\nexport function render(nodeTree: SourceTree): HostTree {\r\n let result: HostTree;\r\n if (nodeTree instanceof Node) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\" || typeof nodeTree === \"bigint\") {\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\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<SourceTree>;\r\n}\r\nexport function flagment<T extends string>(uuid: T) {\r\n return `nine_${uuid.replaceAll(\"-\", \"_\")}` as const;\r\n}\r\nexport function attachUUID(root: Node, uuid: string): Node {\r\n for (const node of [root, ...root.childNodes]) {\r\n if (node instanceof HTMLElement) {\r\n node.dataset[flagment(uuid)] = \"true\";\r\n }\r\n if (node !== root && node.childNodes.length > 0) {\r\n attachUUID(node, uuid);\r\n }\r\n }\r\n return root;\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 rawComponentUUID = crypto.randomUUID();\r\n const flagmentedUUID = flagment(rawComponentUUID);\r\n if (options.styles) {\r\n for (const styleSet of options.styles) {\r\n styleSet.apply(`[data-${flagmentedUUID}=\"true\"]`);\r\n }\r\n }\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 hostTree.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 hostTree = render(nodeTree);\r\n attachUUID(hostTree.element, rawComponentUUID);\r\n hostTree.hooks.treeUpdated.subcribe((newTrees) => newTrees.forEach(tree => attachUUID(tree.element, rawComponentUUID)));\r\n return attachFlag({\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(hostTree.element);\r\n }\r\n },\r\n on(key: string, handler: (data: unknown) => void) {\r\n hostTree.on(key, event => event instanceof CustomEvent ? handler(event.detail) : null);\r\n return this;\r\n },\r\n $: hostTree\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}","import { camelToHyphen } from \"@/util\";\r\n\r\nexport type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n selector?: string;\r\n apply(selector?: string): StyleSet;\r\n ruleString(): string;\r\n selectorString(selector?: string): string;\r\n};\r\nexport function styleSet(selector?: string) {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n selector,\r\n apply(selector) {\r\n const style = document.createElement(\"style\");\r\n document.head.appendChild(style);\r\n style.textContent = `${this.selectorString(selector)}{${this.ruleString()}}`;\r\n },\r\n ruleString() {\r\n return Object.entries(rules).map(([key, value]) => `${camelToHyphen(String(key))}:${value};`).join(\"\");\r\n },\r\n selectorString(selector) {\r\n return ((this.selector || \"\") + (selector || \"\")) || \"*\";\r\n },\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 * 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\r\nif (window.__NINE_ENV__?.mode === \"development\") {\r\n console.warn(\"[Nine-9] Initialized in development mode.\");\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 .append(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .append(\"点击减一\"),\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\").append(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").append(\"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\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 styles: [\r\n styleSet(\".item\")\r\n .backgroundColor(\"blue\")\r\n .color(\"white\"),\r\n styleSet(\".flexdown\")\r\n .display(\"flex\")\r\n .flexDirection(\"column\")\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 .class(\"flexdown\")\r\n .ariaAtomic(\"false\")\r\n .append(\r\n tree(\"span\")\r\n .class(\"item\")\r\n .use(styleSet().backgroundColor(\"red\"))\r\n .append($(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 .class(\"flexdown\")\r\n .append(\r\n $(sync(() =>\r\n props.items.get().map((label, index) =>\r\n tree(\"span\")\r\n .class(\"item\")\r\n .append(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":["child","children","styleSet","value","data","tree","value","styleSet","tree","selector","value"]}
1
+ {"version":3,"sources":["../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/util/types.ts","../src/dom/style.ts","../src/dom/event.ts","../src/examples/Counter.ts","../src/examples/Selector.ts","../src/examples/index.ts","../src/index.ts","../src/test.ts"],"sourcesContent":["interface SubcriberCallback<T extends unknown[], R> {\r\n (...data: T): R;\r\n}\r\ninterface Subcriber<T extends unknown[], R> {\r\n callback: SubcriberCallback<T, R>;\r\n once: boolean;\r\n}\r\nexport class EventSubcriber<T extends unknown[], R = void> {\r\n private subcribers: Subcriber<T, R>[] = [];\r\n private emitting: boolean = false;\r\n\r\n subcribe(callback: SubcriberCallback<T, R>, once = false) {\r\n this.subcribers.push({\r\n callback,\r\n once,\r\n });\r\n }\r\n emit(...data: T): R[] | void {\r\n if (this.emitting) return;\r\n this.emitting = true;\r\n const result: R[] = [];\r\n for (const subcriber of this.subcribers) {\r\n result.push(subcriber.callback(...data));\r\n }\r\n this.emitting = false;\r\n return result;\r\n }\r\n}","export function camelToHyphen<T extends string>(str: T): T {\r\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`) as T;\r\n}\r\nexport function hyphenToCamel<T extends string>(str: T): T {\r\n return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()) as T;\r\n}","export function typedIsArray<T>(arr: unknown[]): arr is T[] {\r\n return Array.isArray(arr);\r\n}\r\nexport function putIntoArray<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 attachFlag<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, RawSourceTree } from \"./component\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { StyleSet } from \"./style\";\r\nimport { putIntoArray } from \"@/util/array\";\r\nimport { attachFlag, HOST_TREE, matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { EventSubcriber } from \"@/channel\";\r\nimport { SupportedHTMLRawAttributes, SupportedHTMLElements, SupportedEventHandlerMap } from \"./element\";\r\nimport { KebabToCamel, ObjectToEntryUnion } from \"@/util/types\";\r\n\r\nexport interface HostTreeHooks {\r\n treeUpdated: [newTrees: HostTree[], oldTrees: HostTree[]];\r\n attributeUpdated: [attribute: string, newValue: unknown, oldValue: unknown];\r\n initialized: [rootTree: HostTree];\r\n $preventEvent: [ObjectToEntryUnion<SupportedEventHandlerMap>, boolean | void];\r\n}\r\nexport type HostTreeHookStore = {\r\n [K in keyof HostTreeHooks as K extends `$${infer R}` ? R : K]:\r\n K extends `$${string}`\r\n ? HostTreeHooks[K] extends [infer E extends unknown[], infer R]\r\n ? EventSubcriber<E, R>\r\n : EventSubcriber<HostTreeHooks[K]>\r\n : EventSubcriber<HostTreeHooks[K]>;\r\n};\r\nexport type HostTree<E extends SupportedHTMLElements = SupportedHTMLElements, T = HTMLElementTagNameMap[E], A = SupportedHTMLRawAttributes[E]> = {\r\n [K in string & keyof A as KebabToCamel<K>]-?: (data: A[K] | Wrapper<A[K]>) => HostTree<E>;\r\n} & {\r\n element: T;\r\n hooks: HostTreeHookStore;\r\n append(...children: (\r\n RawSourceTree |\r\n HostTree |\r\n RawSourceTree[] |\r\n HostTree[] |\r\n (RawSourceTree | HostTree)[] |\r\n Wrapper<HostTree> |\r\n Wrapper<RawSourceTree> |\r\n Wrapper<RawSourceTree | HostTree> |\r\n Wrapper<(RawSourceTree | HostTree)[]> |\r\n Wrapper<RawSourceTree | RawSourceTree[]>\r\n )[]): HostTree<E>;\r\n use(styleSet: StyleSet | Wrapper<StyleSet>): HostTree<E>;\r\n on<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options?: AddEventListenerOptions): HostTree<E>;\r\n on(key: string, handler: (...args: unknown[]) => unknown, options?: AddEventListenerOptions): HostTree<E>;\r\n};\r\n\r\nexport function tree<E extends SupportedHTMLElements>(data: E | Node) {\r\n const element: Node = typeof data === \"string\" ? document.createElement(data) : data;\r\n const hooks: HostTreeHookStore = {\r\n treeUpdated: new EventSubcriber(),\r\n attributeUpdated: new EventSubcriber(),\r\n initialized: new EventSubcriber(),\r\n preventEvent: new EventSubcriber()\r\n };\r\n const context: HostTree<E> = new Proxy(attachFlag({\r\n element,\r\n hooks,\r\n append(...children: (RawSourceTree | RawSourceTree[] | Wrapper<RawSourceTree | RawSourceTree[]>)[]) {\r\n for (const child of children) {\r\n if (matchFlag<RawSourceTree | RawSourceTree[], 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: RawSourceTree[] | RawSourceTree) => {\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 hooks.treeUpdated.emit(newChildren, oldChildren);\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 putIntoArray(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<K extends keyof SupportedEventHandlerMap>(key: K, handler: SupportedEventHandlerMap[K], options: AddEventListenerOptions) {\r\n if (element instanceof EventTarget) {\r\n element.addEventListener(key, (e) => {\r\n //@ts-expect-error 运行时这个本来就是配套的,ts推断不出来\r\n const emitResult = hooks.preventEvent.emit(key, handler);\r\n if (emitResult && !emitResult.some(Boolean)) {\r\n //@ts-expect-error 依旧是传参问题,ts推断不出来\r\n handler(e);\r\n }\r\n }, options);\r\n }\r\n return context;\r\n },\r\n } as HostTree<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 const update = (newData: HTMLElementTagNameMap[E][P], oldData: HTMLElementTagNameMap[E][P]) => {\r\n if (Object.hasOwn(element, p)) {\r\n element[p] = newData;\r\n }\r\n if (element instanceof Element) {\r\n element.setAttribute(camelToHyphen(p), String(newData));\r\n }\r\n hooks.attributeUpdated.emit(p, newData, oldData);\r\n };\r\n if (matchFlag<HTMLElementTagNameMap[E][P], typeof WRAPPER>(data, WRAPPER)) {\r\n data.event.subcribe(update);\r\n update(data.get(), data.get());\r\n } else {\r\n update(data, data);\r\n }\r\n return context;\r\n };\r\n }\r\n },\r\n });\r\n Promise.resolve().then(() => hooks.initialized.emit(context as unknown as HostTree));\r\n return context;\r\n}","export class ValidationFailed extends Error { }\r\nexport class MissingError 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 { attachFlag, 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 normalizeWrap<T>(data: T | Wrapper<T>): Wrapper<T> {\r\n if (matchFlag<T, typeof WRAPPER>(data, WRAPPER)) {\r\n return data;\r\n } else {\r\n return wrap(data);\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> = attachFlag({\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 { ComponentPropertyStore, PropertyTransformer } from \"./component\";\r\nimport { AccessError, ConflictionError, MissingError, ValidationFailed } from \"@/exceptions\";\r\nimport { matchFlag, WRAPPER } from \"@/constants/flags\";\r\nimport { wrap, Wrapper } from \"./reactive\";\r\nimport { EmptyValue } from \"@/util\";\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 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\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 MissingError(`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}","\r\nimport { ComponentSlotStore, SourceTree } from \"./component\";\r\nimport { normalizeWrap, Wrapper } from \"./reactive\";\r\nimport { MissingError } from \"@/exceptions\";\r\n\r\nexport type SlotDescriptor<T = unknown, N extends string = string, R extends boolean = boolean> = {\r\n name: N;\r\n} & SlotOptions<T, R>;\r\nexport interface SlotOptions<T, R extends boolean> {\r\n template: T;\r\n required?: R;\r\n defaultValue?: SourceTree;\r\n}\r\nexport type SlotInput<T> = (data: Wrapper<T>) => SourceTree | Wrapper<SourceTree>;\r\nexport type SlotOutput<T> = (data: T | Wrapper<T>) => Wrapper<SourceTree>;\r\nexport type ComponentSlotInputDict<T extends ComponentSlotStore> = {\r\n [K in T[number]as K[\"name\"]]?: SlotInput<K[\"template\"]>;\r\n};\r\nexport type ComponentSlotOutputDict<T extends ComponentSlotStore> = {\r\n [K in T[number]as K[\"name\"]]-?: SlotOutput<K[\"template\"]>;\r\n}\r\n\r\nexport function extractInput<T>(render: SlotInput<T>): SlotOutput<T> {\r\n return (data: T | Wrapper<T>) => normalizeWrap(render(normalizeWrap(data)));\r\n}\r\nexport function renderSlots<T extends ComponentSlotStore>(rawInput?: ComponentSlotInputDict<T>, store?: T): ComponentSlotOutputDict<T> {\r\n if (!store) return {} as ComponentSlotOutputDict<T>;\r\n const input = rawInput as Record<string, SlotInput<T[number][\"template\"]>>;\r\n return Object.fromEntries(store.map(descriptor => {\r\n if (descriptor.required && (!input || !Object.hasOwn(input, descriptor.name))) {\r\n throw new MissingError(`Missing a required slot ${descriptor.name}.`);\r\n }\r\n if (!input) return [descriptor.name, () => null];\r\n return [\r\n descriptor.name,\r\n extractInput(input[descriptor.name])\r\n ];\r\n })) as ComponentSlotOutputDict<T>;\r\n}\r\nexport function defineSlot<N extends string, R extends boolean, T>(name: N, options: SlotOptions<T, R>) {\r\n return {\r\n name,\r\n ...options\r\n };\r\n}","import { EmptyValue } from \"@/util/types\";\r\nimport { HostTree, tree } from \"./tree\";\r\nimport { ComponentPropertyDescriptor, ComponentPropertyInputDict, ComponentPropertyOutputDict, hostdown, normalizePropertyDescriptor, validateStore } from \"./property\";\r\nimport { Wrapper } from \"./reactive\";\r\nimport { ComponentSlotInputDict, ComponentSlotOutputDict, renderSlots, SlotDescriptor } from \"./slot\";\r\nimport { BrokenRendererError } from \"@/exceptions\";\r\nimport { attachFlag, COMPONENT_INSTANCE, HOST_TREE, matchFlag } from \"@/constants/flags\";\r\nimport { EventDescriptor } from \"./event\";\r\nimport { StyleSet } from \"./style\";\r\n\r\nexport interface ComponentRenderEntry<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {\r\n (props?: ComponentPropertyInputDict<P>, slot?: ComponentSlotInputDict<S>): ComponentInstance<E>;\r\n}\r\nexport interface ComponentInternalRender<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {\r\n (\r\n options: ComponentPropertyOutputDict<P>,\r\n slot: ComponentSlotOutputDict<S>,\r\n emit: <D extends E[number], K extends D[\"name\"]>(\r\n key: K,\r\n data: D extends infer R extends EventDescriptor ? 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, S extends ComponentSlotStore> =\r\n ComponentRenderEntry<P, E, S> & ComponentOption<P, E, S>;\r\nexport interface PropertyTransformer<I, O> {\r\n (data: I): O;\r\n}\r\n\r\nexport type ComponentPropertyStore = Record<string, ComponentPropertyDescriptor>;\r\nexport type ComponentEventStore = EventDescriptor[];\r\nexport type ComponentSlotStore = SlotDescriptor[];\r\n\r\nexport interface ComponentOption<P extends ComponentPropertyStore, E extends ComponentEventStore, S extends ComponentSlotStore> {\r\n props?: P;\r\n events?: E;\r\n styles?: StyleSet[];\r\n slots?: S;\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 ? R[\"name\"] extends K ? R[\"template\"] : never : never) => void\r\n ): ComponentInstance<E>;\r\n $: HostTree;\r\n};\r\nexport type RawSourceTree = [\r\n HTMLElement,\r\n string,\r\n number,\r\n boolean,\r\n bigint,\r\n EmptyValue,\r\n ComponentInstance,\r\n][number];\r\nexport type SourceTree = RawSourceTree | HostTree;\r\n\r\nexport function render(nodeTree: SourceTree): HostTree {\r\n let result: HostTree;\r\n if (nodeTree instanceof Node) {\r\n result = tree(nodeTree);\r\n } else if (typeof nodeTree === \"string\" || typeof nodeTree === \"number\" || typeof nodeTree === \"boolean\" || typeof nodeTree === \"bigint\") {\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\nexport function $<T>(data: Wrapper<T>) {\r\n return data as unknown as Wrapper<SourceTree>;\r\n}\r\nexport function flagment<T extends string>(uuid: T) {\r\n return `nine_${uuid.replaceAll(\"-\", \"_\")}` as const;\r\n}\r\nexport function attachUUID(root: Node, uuid: string): Node {\r\n for (const node of [root, ...root.childNodes]) {\r\n if (node instanceof HTMLElement) {\r\n node.dataset[flagment(uuid)] = \"true\";\r\n }\r\n if (node !== root && node.childNodes.length > 0) {\r\n attachUUID(node, uuid);\r\n }\r\n }\r\n return root;\r\n}\r\nexport function createComponent<\r\n P extends ComponentPropertyStore,\r\n E extends EventDescriptor,\r\n S extends SlotDescriptor\r\n>(\r\n options: ComponentOption<P, E[], S[]>,\r\n internalRenderer: ComponentInternalRender<P, E[], S[]>\r\n): Component<P, E[], S[]> {\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 rawComponentUUID = crypto.randomUUID();\r\n const flagmentedUUID = flagment(rawComponentUUID);\r\n if (options.styles) {\r\n for (const styleSet of options.styles) {\r\n styleSet.apply(`[data-${flagmentedUUID}=\"true\"]`);\r\n }\r\n }\r\n const entryRenderer = (props?: ComponentPropertyInputDict<P>, slot?: ComponentSlotInputDict<S[]>) => {\r\n const nodeTree = internalRenderer(\r\n hostdown(props, propStore),\r\n renderSlots(slot, options.slots),\r\n (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 hostTree.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 hostTree = render(nodeTree);\r\n attachUUID(hostTree.element, rawComponentUUID);\r\n hostTree.hooks.treeUpdated.subcribe((newTrees) => newTrees.forEach(tree => attachUUID(tree.element, rawComponentUUID)));\r\n return attachFlag({\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(hostTree.element);\r\n }\r\n },\r\n on(key: string, handler: (data: unknown) => void) {\r\n hostTree.on(key, event => event instanceof CustomEvent ? handler(event.detail) : null);\r\n return this;\r\n },\r\n $: hostTree\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[], S[]>);\r\n}","export type EmptyValue = undefined | null | void | never;\r\nexport type Normalize<T extends Record<string, unknown>> = T extends Record<infer K, infer R> ? Record<K, Required<R>> : never;\r\nexport type Valueof<T> = T[keyof T];\r\nexport type KebabToCamel<S extends string> =\r\n S extends `${infer First}-${infer Rest}`\r\n ? `${First}${Capitalize<KebabToCamel<Rest>>}`\r\n : S;\r\nexport type ObjectToEntryUnion<T> = {\r\n [K in keyof T]: [K, T[K]];\r\n}[keyof T];\r\n\r\nexport function defineTemplate<T = void>(): T {\r\n return null as T;\r\n}","import { camelToHyphen } from \"@/util\";\r\n\r\nexport type StyleSet = {\r\n [K in keyof CSSStyleDeclaration]: (data: string) => StyleSet;\r\n} & {\r\n rules: Record<keyof CSSStyleDeclaration, string>;\r\n selector?: string;\r\n apply(selector?: string): StyleSet;\r\n ruleString(): string;\r\n selectorString(selector?: string): string;\r\n};\r\nexport function styleSet(selector?: string) {\r\n const rules = {} as Record<keyof CSSStyleDeclaration, string>;\r\n const context: StyleSet = new Proxy({\r\n rules,\r\n selector,\r\n apply(selector) {\r\n const style = document.createElement(\"style\");\r\n document.head.appendChild(style);\r\n style.textContent = `${this.selectorString(selector)}{${this.ruleString()}}`;\r\n },\r\n ruleString() {\r\n return Object.entries(rules).map(([key, value]) => `${camelToHyphen(String(key))}:${value};`).join(\"\");\r\n },\r\n selectorString(selector) {\r\n return ((this.selector || \"\") + (selector || \"\")) || \"*\";\r\n },\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 = unknown, N extends string = 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, defineTemplate } 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: defineTemplate<{}>(),\r\n bubbleable: true\r\n }),\r\n defineEvent(\"down\", {\r\n template: defineTemplate<number>(),\r\n bubbleable: true\r\n })\r\n ]\r\n}, (props, _slot, emit) => {\r\n const doubled = sync(() => props.value.get() * 2, [props.value]); //computed\r\n emit(\"down\", 0);\r\n emit(\"up\", {});\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 .append(\"点击加一\"),\r\n tree(\"button\")\r\n .on(\"click\", () => props.value.set(props.value.get() - 1))\r\n .append(\"点击减一\"),\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\").append(\"你点了一下\")\r\n ),\r\n [doubled]\r\n )), //列表渲染v-for\r\n when(\r\n () => props.value.get() > 10,\r\n () => tree(\"p\").append(\"count > 10 时显示\"),\r\n [props.value]\r\n ), //条件渲染v-if\r\n );\r\n});","import {\r\n $,\r\n createComponent,\r\n defineEvent,\r\n defineSlot,\r\n defineTemplate,\r\n rawProperty,\r\n styleSet,\r\n sync,\r\n tree,\r\n when,\r\n wrap\r\n} from \"@\";\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: defineTemplate<number>() }),\r\n defineEvent(\"toggleState\", { template: defineTemplate<boolean>() })\r\n ],\r\n styles: [\r\n styleSet(\".item\")\r\n .backgroundColor(\"blue\")\r\n .color(\"white\"),\r\n styleSet(\".flexdown\")\r\n .display(\"flex\")\r\n .flexDirection(\"column\")\r\n ],\r\n slots: [\r\n defineSlot(\"title\", {\r\n template: defineTemplate<string>(),\r\n })\r\n ]\r\n}, (props, slot, emit) => {\r\n const showing = wrap(false);\r\n const text = sync(() =>\r\n props.items.get()[props.value.get()]\r\n , [props.items, props.value]);\r\n\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 .class(\"flexdown\")\r\n .ariaAtomic(\"false\")\r\n .append(\r\n tree(\"span\")\r\n .class(\"item\")\r\n .use(styleSet().backgroundColor(\"red\"))\r\n .append(\r\n tree(\"div\").append($(text)),\r\n slot.title(text)\r\n )\r\n .on(\"click\", () => showing.set(!showing.get())),\r\n when(showing, () =>\r\n tree(\"div\")\r\n .class(\"flexdown\")\r\n .append(\r\n $(sync(() =>\r\n props.items.get().map((label, index) =>\r\n tree(\"span\")\r\n .class(\"item\")\r\n .append(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 };","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\r\nif (window.__NINE_ENV__?.mode === \"development\") {\r\n console.warn(\"[Nine-9] Initialized in development mode.\");\r\n}","import { $, tree, wrap, examples } from \"@\";\r\n\r\nconst value = wrap(0);\r\nvalue.event.subcribe((e) => console.log(\"下游更新:\", e));\r\n\r\nexamples.Selector({ value }, {\r\n title: (text) => tree(\"span\").append(\"当前选项的label:\", $(text))\r\n})\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":["child","children","styleSet","value","data","tree","render","value","styleSet","tree","selector","value"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nine-9",
3
- "version": "1.8.1",
3
+ "version": "1.9.0",
4
4
  "description": "一个轻量、高性能、类型安全的 Vanilla DOM 响应式 UI 框架。",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",