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 +64 -40
- package/dist/index.js +79 -32
- package/dist/index.js.map +1 -1
- package/dist/test.js +100 -58
- package/dist/test.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
74
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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(
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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:
|
|
610
|
-
defineEvent("toggleState", { template:
|
|
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(
|
|
626
|
-
|
|
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
|
-
|
|
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":"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","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
|
|
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
|
|
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
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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(
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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:
|
|
549
|
-
defineEvent("toggleState", { template:
|
|
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(
|
|
565
|
-
|
|
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
|
-
|
|
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"]}
|