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/bobe.cjs.js +1765 -1335
- package/dist/bobe.cjs.js.map +1 -1
- package/dist/bobe.compiler.cjs.js +2049 -0
- package/dist/bobe.compiler.cjs.js.map +1 -0
- package/dist/bobe.compiler.esm.js +2038 -0
- package/dist/bobe.compiler.esm.js.map +1 -0
- package/dist/bobe.esm.js +1763 -1336
- package/dist/bobe.esm.js.map +1 -1
- package/dist/index.d.ts +247 -83
- package/dist/index.umd.js +1768 -1338
- package/dist/index.umd.js.map +1 -1
- package/package.json +19 -6
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
|
|
228
|
+
type ComponentNode$1 = LogicNode & {
|
|
285
229
|
tokenizer: Tokenizer;
|
|
286
230
|
};
|
|
287
|
-
|
|
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 };
|