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/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
- defaultInsert(parent: any, node: any, prev: any): void;
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 = Partial<Pick<Interpreter, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib' | 'beforeIndent' | 'leaveNode' | 'leaveLogicNode' | 'beforeLogicIndent'>> & {
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, prev) {
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
- return function render(Ctor, root) {
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;