bobe 0.0.31 → 0.0.33

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
@@ -1,78 +1,6 @@
1
+ import { Queue } from 'bobe-shared';
1
2
  import { Store, Scope, Signal, Computed, Effect, SignalNode } from 'aoye';
2
3
  export * from 'aoye';
3
- import { Queue } from 'bobe-shared';
4
-
5
- declare class Tokenizer {
6
- private hook;
7
- useDedentAsEof: boolean;
8
- /** 缩进大小 默认 2 */
9
- TabSize: number;
10
- /** 缩进字符 */
11
- Tab: string;
12
- /** Eof 标识符的值 */
13
- static EofId: string;
14
- static DedentId: string;
15
- /** 当前 token */
16
- token: Token;
17
- /** 回车后需要判断缩进 */
18
- needIndent: boolean;
19
- /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */
20
- isFirstToken: boolean;
21
- /** 代码 */
22
- code: string;
23
- /** 记录历史缩进的长度,相对于行首 */
24
- dentStack: number[];
25
- /** 当前字符 index */
26
- i: number;
27
- handledTokens: Token[];
28
- /**
29
- * 有些标识符能产生多个 token
30
- * 例如 dedent
31
- * parent1
32
- * child
33
- * subChild
34
- * parent2 <- 产生两个 dedent
35
- */
36
- waitingTokens: Queue<Token>;
37
- constructor(hook: Hook, useDedentAsEof: boolean);
38
- consume(): Token;
39
- resume(_snapshot: ReturnType<Tokenizer['snapshot']>): void;
40
- snapshot(keys?: (keyof Tokenizer)[]): Partial<Tokenizer>;
41
- skip(): string;
42
- setCode(code: string): void;
43
- tokenize(): void;
44
- isEof(): boolean;
45
- private setToken;
46
- nextToken(): Token;
47
- condExp(): Token;
48
- /**
49
- * 解析到 for 时使用这个方法获取 for 后方的子表达式
50
- * 表达式通过 “;” 分割
51
- * // 最多可有三个表达式
52
- * for arr ; item index; item.key
53
- * @returns {boolean} 是否含有 key
54
- */
55
- jsExp(): Token;
56
- peekChar(): string;
57
- private assignment;
58
- private pipe;
59
- private dynamic;
60
- private brace;
61
- private newLine;
62
- private getDentValue;
63
- private dent;
64
- private shorterThanBaseDentEof;
65
- private identifier;
66
- private str;
67
- private number;
68
- private eof;
69
- /** 模板字符串动态节点的占位符 */
70
- HookId: string;
71
- /** 模板字符串动态节点索引 */
72
- hookI: number;
73
- _hook: (props: Partial<HookProps>) => [HookType | undefined, any, hookI?: any];
74
- init(fragments: string | string[]): void;
75
- }
76
4
 
77
5
  declare class Interpreter {
78
6
  private tokenizer;
@@ -80,8 +8,8 @@ declare class Interpreter {
80
8
  constructor(tokenizer: Tokenizer);
81
9
  isLogicNode(node: any): number;
82
10
  ctx: ProgramCtx;
83
- rootComponent: ComponentNode | null;
84
- program(root: any, componentNode?: ComponentNode, before?: any, ctxProvider?: any): ComponentNode;
11
+ rootComponent: ComponentNode$1 | null;
12
+ program(root: any, componentNode?: ComponentNode$1, before?: any, ctxProvider?: any): ComponentNode$1;
85
13
  insertAfterAnchor(name?: string): {
86
14
  name: string;
87
15
  nextSibling: any;
@@ -119,7 +47,7 @@ declare class Interpreter {
119
47
  * */
120
48
  onePropParsed(data: Store, node: any, key: string, value: any, valueIsMapKey: boolean, isFn: boolean, hookI?: number): void;
121
49
  oneRealPropParsed: Interpreter['onePropParsed'];
122
- componentOrFragmentDeclaration(ComponentOrRender: BobeUI | typeof Store, ctx: ProgramCtx): ComponentNode;
50
+ componentOrFragmentDeclaration(ComponentOrRender: BobeUI | typeof Store, ctx: ProgramCtx): ComponentNode$1;
123
51
  getFn(data: any, expression: string | number): any;
124
52
  condDeclaration(ctx: ProgramCtx): IfNode;
125
53
  removeLogicNode(node: LogicNode): void;
@@ -203,7 +131,9 @@ declare enum TokenType {
203
131
  Pipe = 32,
204
132
  Eof = 64,
205
133
  InsertionExp = 128,
206
- Semicolon = 256
134
+ Semicolon = 256,
135
+ /** 仅编译时可解析 */
136
+ StaticInsExp = 512
207
137
  }
208
138
  declare enum FakeType {
209
139
  If = 1,
@@ -216,10 +146,21 @@ declare enum FakeType {
216
146
  }
217
147
  type NodeSortBit = number;
218
148
  type BaseType = string | number | boolean | undefined | null;
149
+ interface SourceLocation {
150
+ start: Position;
151
+ end: Position;
152
+ source: string;
153
+ }
154
+ interface Position {
155
+ line: number;
156
+ column: number;
157
+ offset: number;
158
+ }
219
159
  type Token = {
220
160
  type: TokenType;
221
161
  typeName: string;
222
162
  value: BaseType;
163
+ loc: SourceLocation;
223
164
  };
224
165
  type HookProps = {
225
166
  /** 通过哪个 HookId 进入的 */
@@ -263,7 +204,7 @@ type ForNode = Omit<LogicNode, 'data'> & {
263
204
  arrSignal: Signal<any[]> | Computed<any[]>;
264
205
  effect: Effect;
265
206
  i: number;
266
- owner: ComponentNode | FragmentNode;
207
+ owner: ComponentNode$1 | FragmentNode$1;
267
208
  prevSibling: any;
268
209
  vars: string[];
269
210
  };
@@ -279,16 +220,239 @@ type IfNode = LogicNode & {
279
220
  snapshot: ReturnType<Tokenizer['snapshot']>;
280
221
  effect: Effect;
281
222
  preCond: IfNode | null;
282
- owner: ComponentNode | FragmentNode;
223
+ owner: ComponentNode$1 | FragmentNode$1;
224
+ };
225
+ type FragmentNode$1 = LogicNode & {
226
+ tokenizer: Tokenizer;
283
227
  };
284
- type FragmentNode = LogicNode & {
228
+ type ComponentNode$1 = LogicNode & {
285
229
  tokenizer: Tokenizer;
286
230
  };
287
- type ComponentNode = LogicNode & {
231
+
232
+ declare class Tokenizer {
233
+ private hook;
234
+ useDedentAsEof: boolean;
235
+ /** 缩进大小 默认 2 */
236
+ TabSize: number;
237
+ /** 缩进字符 */
238
+ Tab: string;
239
+ /** Eof 标识符的值 */
240
+ static EofId: string;
241
+ static DedentId: string;
242
+ /** 当前 token */
243
+ token: Token;
244
+ /** 回车后需要判断缩进 */
245
+ needIndent: boolean;
246
+ /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */
247
+ isFirstToken: boolean;
248
+ /** 代码 */
249
+ code: string;
250
+ /** 记录历史缩进的长度,相对于行首 */
251
+ dentStack: number[];
252
+ /** 当前字符 index */
253
+ i: number;
254
+ line: number;
255
+ column: number;
256
+ preCol: number;
257
+ preI: number;
258
+ needLoc: boolean;
259
+ handledTokens: Token[];
260
+ /**
261
+ * 有些标识符能产生多个 token
262
+ * 例如 dedent
263
+ * parent1
264
+ * child
265
+ * subChild
266
+ * parent2 <- 产生两个 dedent
267
+ */
268
+ waitingTokens: Queue<Token>;
269
+ /** 当前文件路径 */
270
+ source: string;
271
+ constructor(hook: Hook, useDedentAsEof: boolean);
272
+ private next;
273
+ getCurrentPos(): Position;
274
+ resume(_snapshot: ReturnType<Tokenizer['snapshot']>): void;
275
+ snapshot(keys?: (keyof Tokenizer)[]): Partial<Tokenizer>;
276
+ skip(): string;
277
+ setCode(code: string): void;
278
+ tokenize(): void;
279
+ isEof(): boolean;
280
+ private setToken;
281
+ nextToken(): Token;
282
+ condExp(): Token;
283
+ /**
284
+ * 解析到 for 时使用这个方法获取 for 后方的子表达式
285
+ * 表达式通过 “;” 分割
286
+ * // 最多可有三个表达式
287
+ * for arr ; item index; item.key
288
+ * @returns {boolean} 是否含有 key
289
+ */
290
+ jsExp(): Token;
291
+ peekChar(): string;
292
+ private assignment;
293
+ private pipe;
294
+ private staticIns;
295
+ private brace;
296
+ private newLine;
297
+ private getDentValue;
298
+ private dent;
299
+ private shorterThanBaseDentEof;
300
+ private identifier;
301
+ private str;
302
+ private number;
303
+ private eof;
304
+ /** 模板字符串动态节点的占位符 */
305
+ HookId: string;
306
+ /** 模板字符串动态节点索引 */
307
+ hookI: number;
308
+ _hook: (props: Partial<HookProps>) => [HookType | undefined, any, hookI?: any];
309
+ init(fragments: string | string[]): void;
310
+ }
311
+
312
+ declare enum NodeType {
313
+ Element = "Element",// 真实DOM节点
314
+ Text = "Text",// 文本节点
315
+ Interpolation = "Interpolation",// 插值节点
316
+ Property = "Property",// 属性节点
317
+ PropertyKey = "PropertyKey",// 属性节点
318
+ StaticValue = "StaticValue",// 静态值
319
+ DynamicValue = "DynamicValue",// 动态值(JS表达式)
320
+ Program = "Program",// 程序根节点
321
+ If = "If",
322
+ Else = "Else",
323
+ Fail = "Fail",
324
+ For = "For",
325
+ Component = "Component",
326
+ Fragment = "Fragment"
327
+ }
328
+ type ASTNodeType = NodeType;
329
+ interface BaseNode {
330
+ type: ASTNodeType;
331
+ loc?: SourceLocation;
332
+ }
333
+ interface Program extends BaseNode {
334
+ type: NodeType.Program;
335
+ body: TemplateNode[];
336
+ }
337
+ type TemplateNode = ElementNode | TextNode | InterpolationNode | ConditionalNode | LoopNode | ComponentNode | FragmentNode;
338
+ interface ElementNode extends BaseNode {
339
+ type: NodeType.Element;
340
+ tagName: string;
341
+ props: Property[];
342
+ children: TemplateNode[];
343
+ }
344
+ interface TextNode extends BaseNode {
345
+ type: NodeType.Text;
346
+ value: string;
347
+ }
348
+ interface InterpolationNode extends BaseNode {
349
+ type: NodeType.Interpolation;
350
+ expression: string;
351
+ }
352
+ interface Property extends BaseNode {
353
+ type: NodeType.Property;
354
+ key: PropertyKeyNode;
355
+ value?: PropertyValue;
356
+ }
357
+ type PropertyValue = StaticValue | DynamicValue;
358
+ interface StaticValue extends BaseNode {
359
+ type: NodeType.StaticValue;
360
+ value: string | number | boolean;
361
+ }
362
+ interface PropertyKeyNode extends BaseNode {
363
+ type: NodeType.PropertyKey;
364
+ key: string;
365
+ }
366
+ interface DynamicValue extends BaseNode {
367
+ type: NodeType.DynamicValue;
368
+ value: string;
369
+ }
370
+ interface ConditionalNode extends BaseNode {
371
+ type: NodeType.If | NodeType.Else | NodeType.Fail;
372
+ condition: string;
373
+ consequent: TemplateNode[];
374
+ children?: TemplateNode[];
375
+ }
376
+ interface LoopNode extends BaseNode {
377
+ type: NodeType.For;
378
+ collection: string;
379
+ item: string;
380
+ index?: string;
381
+ key?: string;
382
+ children: TemplateNode[];
383
+ }
384
+ interface ComponentNode extends BaseNode {
385
+ type: NodeType.Component;
386
+ componentName: string;
387
+ props: Property[];
388
+ children?: TemplateNode[];
389
+ }
390
+ interface FragmentNode extends BaseNode {
391
+ type: NodeType.Fragment;
392
+ nodes: TemplateNode[];
393
+ }
394
+
395
+ declare class Compiler {
288
396
  tokenizer: Tokenizer;
397
+ hooks: ParseHooks;
398
+ constructor(tokenizer: Tokenizer, hooks?: ParseHooks);
399
+ /**
400
+ * 编译程序入口,生成AST
401
+ */
402
+ parseProgram(): Program;
403
+ handleChildren(): TemplateNode[];
404
+ /**
405
+ * 解析模板节点
406
+ */
407
+ private templateNode;
408
+ /**
409
+ * 解析元素节点
410
+ */
411
+ parseComponentNode(node?: ComponentNode): ComponentNode;
412
+ /**
413
+ * 解析元素节点
414
+ */
415
+ parseElementNode(node?: ElementNode): ElementNode;
416
+ /**
417
+ * 解析条件节点(if/else/fail)
418
+ */
419
+ parseConditionalNode(node?: ConditionalNode): ConditionalNode;
420
+ /**
421
+ * 解析循环节点(for)
422
+ */
423
+ parseLoopNode(node?: LoopNode): LoopNode;
424
+ /**
425
+ * 解析首行和扩展行的属性
426
+ */
427
+ private headerLineAndExtensions;
428
+ /**
429
+ * 解析属性列表
430
+ */
431
+ private attributeList;
432
+ parseProperty(node?: Property): Property;
433
+ /**
434
+ * 根据值类型创建属性 key 节点
435
+ */
436
+ parsePropertyKey(node?: PropertyKeyNode): PropertyKeyNode;
437
+ /**
438
+ * 根据值类型创建属性值节点
439
+ */
440
+ parsePropertyValue(node?: PropertyValue): PropertyValue;
441
+ }
442
+ type PickParseProps<T> = {
443
+ [K in keyof T as K extends `parse${string}` ? K : never]: T[K];
289
444
  };
445
+ type ParseProps = PickParseProps<Compiler>;
446
+ type ParseHooks = Partial<{
447
+ [K in keyof ParseProps]: {
448
+ enter?: (this: Compiler, ...args: Parameters<ParseProps[K]>) => void;
449
+ leave?: (this: Compiler, ...args: Parameters<ParseProps[K]>) => void;
450
+ propsAdded?: (this: Compiler, ...args: Parameters<ParseProps[K]>) => void;
451
+ };
452
+ }>;
290
453
 
291
454
  declare function bobe(fragments: TemplateStringsArray, ...values: any[]): BobeUI;
292
- declare function customRender(option: CustomRenderConf): <T>(Ctor: typeof Store, root: any) => (ComponentNode | Store)[];
455
+ declare function customRender(option: CustomRenderConf): <T>(Ctor: typeof Store, root: any) => (ComponentNode$1 | Store)[];
293
456
 
294
- export { bobe, customRender };
457
+ export { Compiler, NodeType, Tokenizer, bobe, customRender };
458
+ export type { ASTNodeType, BaseNode, ComponentNode, ConditionalNode, DynamicValue, ElementNode, FragmentNode, InterpolationNode, LoopNode, Program, Property, PropertyKeyNode, PropertyValue, StaticValue, TemplateNode, TextNode };