bobe 0.0.70 → 0.0.71
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/bobe.cjs +63 -10
- package/dist/bobe.cjs.map +1 -1
- package/dist/bobe.compiler.cjs +63 -10
- package/dist/bobe.compiler.cjs.map +1 -1
- package/dist/bobe.compiler.esm.js +62 -11
- package/dist/bobe.compiler.esm.js.map +1 -1
- package/dist/bobe.esm.js +62 -11
- package/dist/bobe.esm.js.map +1 -1
- package/dist/index.d.ts +28 -8
- package/dist/index.umd.js +63 -10
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ declare class Interpreter {
|
|
|
18
18
|
constructor(tokenizer: Tokenizer);
|
|
19
19
|
ctx: ProgramCtx;
|
|
20
20
|
rootComponent: ComponentNode$1 | null;
|
|
21
|
+
root: any;
|
|
21
22
|
program(root: any, componentNode?: ComponentNode$1, before?: any, ctxProvider?: any): ComponentNode$1;
|
|
22
23
|
insertAnchor(node: any, name?: string, isBefore?: boolean): any;
|
|
23
24
|
/** 处理
|
|
@@ -103,9 +104,7 @@ declare class Interpreter {
|
|
|
103
104
|
firstChild(node: any): any;
|
|
104
105
|
createAnchor(name: string, isBefore?: boolean): any;
|
|
105
106
|
insertAfter(parent: any, node: any, prev: any): void;
|
|
106
|
-
|
|
107
|
-
remove(node: any, parent?: any, prev?: any): void;
|
|
108
|
-
defaultRemove(node: any, parent: any, prevSibling: any): void;
|
|
107
|
+
remove(node: any, parent?: any, prevSibling?: any): void;
|
|
109
108
|
setProp(node: any, key: string, value: any, hookI?: number): any | (() => void);
|
|
110
109
|
beforeIndent?: (node: any) => boolean | void;
|
|
111
110
|
leaveNode?: (node: any, isDedent: boolean) => void;
|
|
@@ -145,6 +144,23 @@ declare class MultiTypeStack<T> {
|
|
|
145
144
|
peek(): T | undefined;
|
|
146
145
|
}
|
|
147
146
|
|
|
147
|
+
declare function bobe<T extends Record<any, any> = any>(fragments: TemplateStringsArray, ...values: any[]): UI<T>;
|
|
148
|
+
declare function customRender(option: CustomRenderConf): RenderWithMw;
|
|
149
|
+
declare class MwCtx<T> {
|
|
150
|
+
terp: Interpreter;
|
|
151
|
+
ctx: Record<any, any>;
|
|
152
|
+
handlers: T[];
|
|
153
|
+
constructor(terp: Interpreter, handlers: T[], base: T);
|
|
154
|
+
i: number;
|
|
155
|
+
get next(): T | null;
|
|
156
|
+
get hasNext(): T;
|
|
157
|
+
}
|
|
158
|
+
declare class Mw extends Map<string, any[]> {
|
|
159
|
+
use(mw: MwHook): void;
|
|
160
|
+
wrapHooks(terp: Interpreter): void;
|
|
161
|
+
wrapHook(terp: Interpreter, key: string, base: Function): any;
|
|
162
|
+
}
|
|
163
|
+
|
|
148
164
|
declare enum TokenType {
|
|
149
165
|
NewLine = 1,
|
|
150
166
|
Indent = 2,
|
|
@@ -202,13 +218,16 @@ type HookProps = {
|
|
|
202
218
|
/** 父节点 */
|
|
203
219
|
parentNode?: any;
|
|
204
220
|
};
|
|
205
|
-
type TerpConf =
|
|
221
|
+
type TerpConf = Pick<Interpreter, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib' | 'beforeIndent' | 'leaveNode' | 'leaveLogicNode' | 'beforeLogicIndent'> & {
|
|
206
222
|
noopEffect?: boolean;
|
|
207
223
|
};
|
|
208
224
|
type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib' | 'beforeIndent' | 'leaveNode' | 'leaveLogicNode' | 'beforeLogicIndent' | 'noopEffect'> & {
|
|
209
225
|
/** program() 之后、flushMicroEffectManual() 之前调用 */
|
|
210
226
|
onBeforeFlush?: () => void;
|
|
211
227
|
};
|
|
228
|
+
type MwHook = {
|
|
229
|
+
[K in keyof CustomRenderConf]?: CustomRenderConf[K] extends (...args: infer P) => infer R ? (this: MwCtx<any>, ...args: P) => R : CustomRenderConf[K];
|
|
230
|
+
};
|
|
212
231
|
type Hook = (props: HookProps) => any;
|
|
213
232
|
type HookType = 'dynamic' | 'static';
|
|
214
233
|
declare enum ParseErrorCode {
|
|
@@ -335,6 +354,10 @@ type ComponentNode$1 = LogicNode & {
|
|
|
335
354
|
resumeSnapshot?: ReturnType<Tokenizer['snapshot']>;
|
|
336
355
|
};
|
|
337
356
|
type Dep = (() => any) | string;
|
|
357
|
+
type RenderWithMw = {
|
|
358
|
+
use: Mw['use'];
|
|
359
|
+
<T extends typeof Store>(Ctor: T, root: any): [ComponentNode$1, InstanceType<T>];
|
|
360
|
+
};
|
|
338
361
|
|
|
339
362
|
declare class Tokenizer {
|
|
340
363
|
private hook;
|
|
@@ -596,9 +619,6 @@ type ParseHooks = Partial<{
|
|
|
596
619
|
};
|
|
597
620
|
}>;
|
|
598
621
|
|
|
599
|
-
declare function bobe<T extends Record<any, any> = any>(fragments: TemplateStringsArray, ...values: any[]): UI<T>;
|
|
600
|
-
declare function customRender(option: CustomRenderConf): <T extends typeof Store>(Ctor: T, root: any) => readonly [ComponentNode$1, InstanceType<T>];
|
|
601
|
-
|
|
602
622
|
type IContext = {
|
|
603
623
|
<T = any>(name: string): T;
|
|
604
624
|
<T = any>(): T;
|
|
@@ -607,5 +627,5 @@ declare const context: IContext;
|
|
|
607
627
|
|
|
608
628
|
declare const effect: (callback: (...args: ValueDiff[]) => void, depOrOpt?: Dep[] | Dep | CustomEffectOpt, opt?: CustomEffectOpt) => aoye.Effect;
|
|
609
629
|
|
|
610
|
-
export { Compiler, FakeType, NodeType, ParseErrorCode, ParseSyntaxError, Tokenizer, bobe, context, customRender, effect };
|
|
630
|
+
export { Compiler, FakeType, Mw, MwCtx, NodeType, ParseErrorCode, ParseSyntaxError, Tokenizer, bobe, context, customRender, effect };
|
|
611
631
|
export type { ASTNodeType, BaseNode, CommentNode, ComponentNode, ConditionalNode, DynamicValue, ElementNode, FragmentNode, IContext, InterpolationNode, LogicNode, LoopNode, ParseError, Program, Property, PropertyKeyNode, PropertyValue, SourceLocation, StaticValue, TemplateNode, TextNode, UI };
|
package/dist/index.umd.js
CHANGED
|
@@ -1474,6 +1474,7 @@
|
|
|
1474
1474
|
rootComponent = null;
|
|
1475
1475
|
program(root, componentNode, before, ctxProvider) {
|
|
1476
1476
|
this.rootComponent = componentNode;
|
|
1477
|
+
this.root = root;
|
|
1477
1478
|
this.tokenizer.nextToken();
|
|
1478
1479
|
const stack = new MultiTypeStack();
|
|
1479
1480
|
setCtxStack(stack);
|
|
@@ -2677,9 +2678,6 @@
|
|
|
2677
2678
|
};
|
|
2678
2679
|
}
|
|
2679
2680
|
insertAfter(parent, node, prev) {
|
|
2680
|
-
return this.defaultInsert(parent, node, prev);
|
|
2681
|
-
}
|
|
2682
|
-
defaultInsert(parent, node, prev) {
|
|
2683
2681
|
if (prev) {
|
|
2684
2682
|
const next = prev.nextSibling;
|
|
2685
2683
|
prev.nextSibling = node;
|
|
@@ -2690,10 +2688,7 @@
|
|
|
2690
2688
|
node.nextSibling = next;
|
|
2691
2689
|
}
|
|
2692
2690
|
}
|
|
2693
|
-
remove(node, parent,
|
|
2694
|
-
return this.defaultRemove(node, parent, prev);
|
|
2695
|
-
}
|
|
2696
|
-
defaultRemove(node, parent, prevSibling) {
|
|
2691
|
+
remove(node, parent, prevSibling) {
|
|
2697
2692
|
const next = node.nextSibling;
|
|
2698
2693
|
if (prevSibling) {
|
|
2699
2694
|
prevSibling.nextSibling = next;
|
|
@@ -2748,11 +2743,13 @@
|
|
|
2748
2743
|
return ui;
|
|
2749
2744
|
}
|
|
2750
2745
|
function customRender(option) {
|
|
2751
|
-
|
|
2746
|
+
const mw = new Mw();
|
|
2747
|
+
function render(Ctor, root) {
|
|
2752
2748
|
const store = Ctor.new();
|
|
2753
2749
|
const tokenizer = store.ui(false);
|
|
2754
2750
|
const terp = new Interpreter(tokenizer);
|
|
2755
2751
|
terp.config(option);
|
|
2752
|
+
mw.wrapHooks(terp);
|
|
2756
2753
|
const componentNode = {
|
|
2757
2754
|
__logicType: FakeType.Component,
|
|
2758
2755
|
realParent: root,
|
|
@@ -2760,10 +2757,64 @@
|
|
|
2760
2757
|
tokenizer
|
|
2761
2758
|
};
|
|
2762
2759
|
terp.program(root, componentNode);
|
|
2763
|
-
option.onBeforeFlush
|
|
2760
|
+
const onBeforeFlush = mw.wrapHook(terp, 'onBeforeFlush', option.onBeforeFlush);
|
|
2761
|
+
onBeforeFlush?.();
|
|
2764
2762
|
aoye.flushMicroEffectManual();
|
|
2765
2763
|
return [componentNode, store];
|
|
2766
|
-
}
|
|
2764
|
+
}
|
|
2765
|
+
render.use = mw.use.bind(mw);
|
|
2766
|
+
return render;
|
|
2767
|
+
}
|
|
2768
|
+
class MwCtx {
|
|
2769
|
+
ctx = {};
|
|
2770
|
+
constructor(terp, handlers = [], base) {
|
|
2771
|
+
this.terp = terp;
|
|
2772
|
+
this.handlers = [...handlers, base];
|
|
2773
|
+
}
|
|
2774
|
+
i = 0;
|
|
2775
|
+
get next() {
|
|
2776
|
+
if (this.i < this.handlers.length) {
|
|
2777
|
+
const handler = this.handlers[this.i];
|
|
2778
|
+
this.i++;
|
|
2779
|
+
return handler;
|
|
2780
|
+
}
|
|
2781
|
+
return null;
|
|
2782
|
+
}
|
|
2783
|
+
get hasNext() {
|
|
2784
|
+
return this.i < this.handlers.length && this.handlers[this.i];
|
|
2785
|
+
}
|
|
2786
|
+
}
|
|
2787
|
+
class Mw extends Map {
|
|
2788
|
+
use(mw) {
|
|
2789
|
+
for (const key in mw) {
|
|
2790
|
+
const list = this.get(key);
|
|
2791
|
+
if (list) {
|
|
2792
|
+
list.push(mw[key]);
|
|
2793
|
+
} else {
|
|
2794
|
+
this.set(key, [mw[key]]);
|
|
2795
|
+
}
|
|
2796
|
+
}
|
|
2797
|
+
}
|
|
2798
|
+
wrapHooks(terp) {
|
|
2799
|
+
this.forEach((list, key) => {
|
|
2800
|
+
let base = terp[key];
|
|
2801
|
+
base = base?.bind(terp);
|
|
2802
|
+
function wrapped(...args) {
|
|
2803
|
+
const ctx = new MwCtx(terp, list, base);
|
|
2804
|
+
return ctx.next.apply(ctx, args);
|
|
2805
|
+
}
|
|
2806
|
+
terp[key] = wrapped;
|
|
2807
|
+
});
|
|
2808
|
+
}
|
|
2809
|
+
wrapHook(terp, key, base) {
|
|
2810
|
+
const list = this.get(key);
|
|
2811
|
+
if (!list) return base?.bind(terp);
|
|
2812
|
+
function wrapped(...args) {
|
|
2813
|
+
const ctx = new MwCtx(terp, list, base?.bind(terp));
|
|
2814
|
+
return ctx.next.apply(ctx, args);
|
|
2815
|
+
}
|
|
2816
|
+
return wrapped;
|
|
2817
|
+
}
|
|
2767
2818
|
}
|
|
2768
2819
|
|
|
2769
2820
|
const context = name => {
|
|
@@ -2814,6 +2865,8 @@
|
|
|
2814
2865
|
});
|
|
2815
2866
|
exports.Compiler = Compiler;
|
|
2816
2867
|
exports.FakeType = FakeType;
|
|
2868
|
+
exports.Mw = Mw;
|
|
2869
|
+
exports.MwCtx = MwCtx;
|
|
2817
2870
|
exports.NodeType = NodeType;
|
|
2818
2871
|
exports.ParseSyntaxError = ParseSyntaxError;
|
|
2819
2872
|
exports.Tokenizer = Tokenizer;
|