bobe 0.0.9 → 0.0.10

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 CHANGED
@@ -1,5 +1,8 @@
1
1
  'use strict';
2
2
 
3
+ var aoye = require('aoye');
4
+ var bobeShared = require('bobe-shared');
5
+
3
6
  var TokenType = /* @__PURE__ */ ((TokenType2) => {
4
7
  TokenType2[TokenType2["NewLine"] = 1] = "NewLine";
5
8
  TokenType2[TokenType2["Indent"] = 2] = "Indent";
@@ -8,6 +11,7 @@ var TokenType = /* @__PURE__ */ ((TokenType2) => {
8
11
  TokenType2[TokenType2["Assign"] = 16] = "Assign";
9
12
  TokenType2[TokenType2["Pipe"] = 32] = "Pipe";
10
13
  TokenType2[TokenType2["Eof"] = 64] = "Eof";
14
+ TokenType2[TokenType2["InsertionExp"] = 128] = "InsertionExp";
11
15
  return TokenType2;
12
16
  })(TokenType || {});
13
17
  var LogicType = /* @__PURE__ */ ((LogicType2) => {
@@ -15,8 +19,16 @@ var LogicType = /* @__PURE__ */ ((LogicType2) => {
15
19
  LogicType2[LogicType2["ElseIf"] = 2] = "ElseIf";
16
20
  LogicType2[LogicType2["Else"] = 4] = "Else";
17
21
  LogicType2[LogicType2["For"] = 8] = "For";
22
+ LogicType2[LogicType2["Component"] = 16] = "Component";
23
+ LogicType2[LogicType2["Fragment"] = 32] = "Fragment";
24
+ LogicType2[LogicType2["Root"] = 64] = "Root";
18
25
  return LogicType2;
19
26
  })(LogicType || {});
27
+ var TerpEvt = /* @__PURE__ */ ((TerpEvt2) => {
28
+ TerpEvt2["AllAttrGot"] = "all-attr-got";
29
+ TerpEvt2["HandledComponentNode"] = "handled-component-node";
30
+ return TerpEvt2;
31
+ })(TerpEvt || {});
20
32
 
21
33
  var __defProp = Object.defineProperty;
22
34
  var __defProps = Object.defineProperties;
@@ -37,7 +49,8 @@ var __spreadValues = (a, b) => {
37
49
  return a;
38
50
  };
39
51
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
40
- class Interpreter {
52
+ const tap = new bobeShared.BaseEvent();
53
+ class Terp {
41
54
  constructor(tokenizer) {
42
55
  this.tokenizer = tokenizer;
43
56
  /** 模板字符串动态节点的占位符 */
@@ -49,27 +62,41 @@ class Interpreter {
49
62
  this.stack = [];
50
63
  this._hook = (props) => {
51
64
  const value = this.tokenizer.token.value;
52
- const isHook = typeof value === "string" && value.indexOf(this.HookId) === 0;
53
- if (this.hook && isHook) {
65
+ const isDynamicHook = this.tokenizer.token.type & TokenType.InsertionExp;
66
+ const isStaticHook = typeof value === "string" && value.indexOf(this.HookId) === 0;
67
+ const hookType = isDynamicHook ? "dynamic" : isStaticHook ? "static" : void 0;
68
+ if (this.hook && isStaticHook) {
54
69
  const hookI = Number(value.slice(this.HookId.length));
55
70
  const res = this.hook(__spreadProps(__spreadValues({}, props), {
56
71
  HookId: this.HookId,
57
72
  i: hookI
58
73
  }));
59
74
  this.hookI++;
60
- return [isHook, res];
75
+ return [hookType, res];
76
+ } else if (isDynamicHook) {
77
+ return [hookType, value];
61
78
  }
62
- return [isHook, value];
79
+ return [hookType, value];
63
80
  };
64
81
  }
82
+ // /** program 要挂载的父节点位置 */
83
+ // root: any;
84
+ // /** program 挂载的前置节点 */
85
+ // anchor: any;
65
86
  program() {
87
+ const root = {
88
+ __logicType: LogicType.Component,
89
+ store: this.data,
90
+ realList: [],
91
+ directList: []
92
+ };
66
93
  this.tokenizer.consume();
67
94
  let current;
68
95
  let prevSibling;
69
- const rootList = [];
96
+ this.stack = [{ node: root, prevSibling }];
70
97
  while (1) {
71
98
  if (this.tokenizer.isEof()) {
72
- rootList.push(current);
99
+ this.handleInsert(root, current, root.realList[root.realList.length - 1]);
73
100
  break;
74
101
  }
75
102
  const token = this.tokenizer.token;
@@ -84,11 +111,11 @@ class Interpreter {
84
111
  continue;
85
112
  }
86
113
  if (current) {
87
- if (this.stack.length) {
114
+ if (this.stack.length > 1) {
88
115
  const parent = this.stack[this.stack.length - 1].node;
89
- this.insert(parent, current, prevSibling);
116
+ this.handleInsert(parent, current, prevSibling);
90
117
  } else {
91
- rootList.push(current);
118
+ this.handleInsert(root, current, prevSibling);
92
119
  }
93
120
  }
94
121
  if (this.tokenizer.token.type & TokenType.Dedent) {
@@ -101,7 +128,29 @@ class Interpreter {
101
128
  current = this.declaration();
102
129
  }
103
130
  }
104
- return rootList;
131
+ return root;
132
+ }
133
+ /** 处理
134
+ * 是逻辑 是普通
135
+ * 父节点 将子节点们插入到 realList 调用 insert 方法挨个插入子节点
136
+ * 子节点 将其下 realList 插入到父节点 将本节点插入父节点
137
+ */
138
+ handleInsert(parent, child, prevSibling) {
139
+ let insertFn = this.insert.bind(this);
140
+ if (parent.__logicType) {
141
+ insertFn = (parent2, child2, prevSibling2) => {
142
+ parent2.realList.splice(parent2.realList.indexOf(prevSibling2) + 1, 0, child2);
143
+ };
144
+ }
145
+ if (child.__logicType) {
146
+ const realList = child.realList;
147
+ for (let i = realList.length; i--; ) {
148
+ const item = realList[i];
149
+ insertFn(parent, item, prevSibling);
150
+ }
151
+ } else {
152
+ insertFn(parent, child, prevSibling);
153
+ }
105
154
  }
106
155
  /**
107
156
  * @deprecated
@@ -182,21 +231,91 @@ class Interpreter {
182
231
  * <declaration> ::= <tagName=token> <headerLine> <extensionLines>
183
232
  * */
184
233
  declaration() {
185
- const [isHook, value] = this._hook({});
234
+ const [hookType, value] = this._hook({});
186
235
  let _node;
187
- if (isHook) {
188
- const { tree, data } = value();
189
- _node = tree;
190
- } else if (value === "if") {
236
+ if (value === "if") {
191
237
  return this.ifDeclaration();
238
+ } else if (hookType) {
239
+ if (hookType === "static") {
240
+ if (typeof value === "function" && value.prototype instanceof aoye.Store) {
241
+ _node = this.componentDeclaration(value);
242
+ } else if (typeof value === "function") {
243
+ _node = this.fragmentDeclaration(value);
244
+ } else {
245
+ throw new SyntaxError(`declaration \u4E0D\u652F\u6301 ${value} \u7C7B\u578B\u7684\u9759\u6001\u63D2\u503C`);
246
+ }
247
+ } else {
248
+ Boolean(this.data[aoye.Keys.Raw][value]);
249
+ new Function("data", `let v;with(data){v=(${value})};return v`);
250
+ _node = this.createNode(value);
251
+ }
192
252
  } else {
193
253
  _node = this.createNode(value);
194
254
  }
195
255
  this.tokenizer.consume();
196
256
  this.headerLine(_node);
197
257
  this.extensionLines(_node);
258
+ if (_node.__logicType === LogicType.Component) {
259
+ tap.once(TerpEvt.HandledComponentNode, (node) => _node = node);
260
+ tap.emit(TerpEvt.AllAttrGot);
261
+ }
198
262
  return _node;
199
263
  }
264
+ // TODO: 指定挂载位置
265
+ fragmentDeclaration(renderFragment) {
266
+ const fragmentNode = {
267
+ __logicType: LogicType.Fragment,
268
+ directList: [],
269
+ realList: []
270
+ };
271
+ renderFragment.call(this.data, this.opt, { data: this.data, root: "", anchor: "" });
272
+ return fragmentNode;
273
+ }
274
+ /**
275
+ * key 元素,组件的 key
276
+ * value
277
+ * 1. 静态类型值
278
+ * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理
279
+ *
280
+ * mapKey 映射, 对应子组件的属性
281
+ * */
282
+ onePropParsed(node, key, value, valueIsMapKey, hookI) {
283
+ if (typeof value === "function") {
284
+ aoye.effect(() => {
285
+ const res = value();
286
+ this.setProp(node, key, res, hookI);
287
+ });
288
+ } else if (valueIsMapKey) {
289
+ aoye.effect(() => {
290
+ const res = this.data[value];
291
+ this.setProp(node, key, res, hookI);
292
+ });
293
+ } else {
294
+ this.setProp(node, key, value, hookI);
295
+ }
296
+ }
297
+ componentDeclaration(Component) {
298
+ const child = Component.new();
299
+ const prevOnePropParsed = this.onePropParsed;
300
+ this.onePropParsed = (node, key, value, valueIsMapKey, hookI) => {
301
+ if (valueIsMapKey) {
302
+ aoye.shareSignal(this.data, value, child, key);
303
+ } else if (typeof value === "function") {
304
+ const meta = child[aoye.Keys.Meta];
305
+ const cells = meta.cells;
306
+ const computed = aoye.$(value);
307
+ cells.set(key, computed);
308
+ } else {
309
+ child[aoye.Keys.Raw][key] = value;
310
+ }
311
+ };
312
+ tap.once(TerpEvt.AllAttrGot, () => {
313
+ this.onePropParsed = prevOnePropParsed;
314
+ const root = child["ui"](this.opt, { data: child });
315
+ tap.emit(TerpEvt.HandledComponentNode, root);
316
+ });
317
+ return { __logicType: LogicType.Component };
318
+ }
200
319
  ifDeclaration() {
201
320
  this.tokenizer.consume();
202
321
  const [isHook, value] = this._hook({});
@@ -210,7 +329,7 @@ class Interpreter {
210
329
  watcher: null,
211
330
  anchor: null
212
331
  };
213
- ifNode.watcher = this.effect(
332
+ ifNode.watcher = aoye.effect(
214
333
  ({ val }) => {
215
334
  if (val) {
216
335
  this.tokenizer.consume();
@@ -255,44 +374,32 @@ class Interpreter {
255
374
  * <attributeList> ::= <attribute> <attributeList>
256
375
  * | ε
257
376
  *
258
- * <attribute> ::= <key> <=> <value or dataKey> <=> <value>
259
- *
377
+ * <attribute> ::= <key> = <value>
378
+ * 1. 普通节点 执行 setProps 🪝
379
+ * 2. 组件节点 收集映射关系,或通过 effect 直接设值
260
380
  */
261
381
  attributeList(_node) {
262
- let values = [];
263
- let prevToken = void 0;
264
- while (1) {
265
- if ((prevToken == null ? void 0 : prevToken.type) === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {
266
- const [v1, v2, v3] = values;
267
- const key = v1;
268
- let dataKey, defaultVal;
269
- if (v3 !== void 0) {
270
- defaultVal = v3;
271
- dataKey = v2;
272
- } else if (v2 !== void 0) {
273
- if (typeof v2 === "string" && v2[0] === "$" && v2[1] !== "{") {
274
- dataKey = v2.slice(1);
275
- } else {
276
- defaultVal = v2;
277
- }
382
+ let key, eq;
383
+ while (!(this.tokenizer.token.type & TokenType.NewLine)) {
384
+ if (key == null) {
385
+ key = this.tokenizer.token.value;
386
+ } else if (eq == null) {
387
+ eq = "=";
388
+ } else {
389
+ const [hookType, value] = this._hook({});
390
+ if (hookType === "dynamic") {
391
+ const valueIsMapKey = Reflect.has(this.data[aoye.Keys.Raw], value);
392
+ const fn = valueIsMapKey ? value : new Function("data", `let v;with(data){v=${value}};return v;`).bind(void 0, this.data);
393
+ this.onePropParsed(_node, key, fn, valueIsMapKey, this.hookI);
394
+ } else if (hookType === "static") {
395
+ this.onePropParsed(_node, key, value, false, this.hookI);
278
396
  } else {
279
- dataKey = key;
280
- }
281
- let val = defaultVal;
282
- if (dataKey) {
283
- val = this.setDataProp(this.data, dataKey, defaultVal);
397
+ this.onePropParsed(_node, key, value, false, this.hookI);
284
398
  }
285
- this.setProp(_node, key, val, this.hookI - 1);
286
- const [isHook, value] = this._hook({});
287
- values = [value];
288
- } else if (this.tokenizer.token.type !== TokenType.Assign) {
289
- const [isHook, value] = this._hook({});
290
- values.push(value);
291
- }
292
- if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {
293
- break;
399
+ key = null;
400
+ eq = null;
294
401
  }
295
- prevToken = this.tokenizer.consume();
402
+ this.tokenizer.consume();
296
403
  }
297
404
  }
298
405
  /** 子节点块:
@@ -310,15 +417,7 @@ class Interpreter {
310
417
  }
311
418
  config(opt) {
312
419
  Object.assign(this, opt);
313
- }
314
- createData(data) {
315
- return data;
316
- }
317
- setDataProp(data, key, value) {
318
- return data[key] = value;
319
- }
320
- setChildren(node, children) {
321
- node.children = children;
420
+ this.opt = opt;
322
421
  }
323
422
  createNode(name) {
324
423
  return {
@@ -326,59 +425,31 @@ class Interpreter {
326
425
  props: {}
327
426
  };
328
427
  }
329
- createRoot() {
330
- return this.createNode("root");
331
- }
332
428
  insert(parent, node, prevSibling, prevItem) {
333
429
  return this.defaultInsert(parent, node, prevSibling, prevItem);
334
430
  }
335
431
  defaultInsert(parent, node, prevSibling, prevItem) {
336
- if (!parent.child) {
337
- return parent.child = parent.lastChild = {
338
- value: node,
339
- next: null
340
- };
341
- }
342
- const nextItem = prevItem.next;
343
- const item = {
344
- value: node,
345
- next: nextItem
346
- };
347
- prevItem.next = item;
348
- if (!nextItem) {
349
- parent.lastChild = item;
432
+ if (prevSibling) {
433
+ const children = parent.children;
434
+ const insertI = children.findIndex((item) => item === prevSibling);
435
+ children.splice(insertI + 1, 0, node);
436
+ } else {
437
+ parent.children = [node];
350
438
  }
351
- return item;
352
439
  }
353
440
  remove(parent, node, prevSibling, prevItem) {
354
441
  return this.defaultRemove(parent, node, prevSibling, prevItem);
355
442
  }
356
443
  // TODO: 默认改成 prevItem
357
444
  defaultRemove(parent, node, prevSibling, prevItem) {
358
- const currItem = prevItem.next;
359
- const nextItem = currItem.next;
360
- if (prevItem) {
361
- if (nextItem) {
362
- prevItem.next = nextItem;
363
- } else {
364
- prevItem.next = null;
365
- parent.lastChild = prevItem;
366
- }
367
- } else {
368
- if (nextItem) {
369
- parent.child = nextItem;
370
- } else {
371
- parent.child = null;
372
- parent.lastChild = null;
373
- }
445
+ if (parent.children) {
446
+ parent.children.splice(parent.children.indexOf(node), 1);
374
447
  }
375
- currItem.next = null;
376
448
  }
377
449
  setProp(node, key, value, hookI) {
378
450
  node.props[key] = value;
379
451
  }
380
452
  init(fragments) {
381
- this.data = this.createData(this.data);
382
453
  if (typeof fragments === "string") {
383
454
  this.tokenizer.setCode(fragments);
384
455
  } else {
@@ -392,5 +463,5 @@ class Interpreter {
392
463
  }
393
464
  }
394
465
 
395
- exports.Interpreter = Interpreter;
466
+ exports.Terp = Terp;
396
467
  //# sourceMappingURL=bobe.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bobe.cjs.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import type { Tokenizer } from './tokenizer';\n\nexport enum TokenType {\n NewLine = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Indent = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Dedent = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n Identifier = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Assign = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Pipe = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Eof = 0b0000_0000_0000_0000_0000_0000_0100_0000\n}\n\nexport enum LogicType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n ElseIf = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Else = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n For = 0b0000_0000_0000_0000_0000_0000_0000_1000\n}\n\nexport type BaseType = string | number | boolean | undefined | null;\n\nexport type Token = {\n type: TokenType;\n typeName: string;\n value: BaseType;\n};\n\nexport type HookProps = {\n /** 通过哪个 HookId 进入的 */\n HookId: string;\n /** 第几个 hook */\n i: number;\n /** 父节点 */\n parentNode?: any;\n};\nexport type Hook = (props: HookProps) => any;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = {\n __logicType: LogicType;\n condition: () => any;\n directList: any[];\n realList: any[];\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void };\n};\n","import { Tokenizer } from './tokenizer';\nimport { $, effect } from 'aoye';\nimport { Hook, HookProps, IfNode, LogicType, StackItem, TokenType } from './type';\n\nexport class Interpreter {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n stack: StackItem[] = [];\n constructor(private tokenizer: Tokenizer) {}\n\n program() {\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n const rootList: any[] = [];\n while (1) {\n if (this.tokenizer.isEof()) {\n rootList.push(current);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n const INDENT = this.tokenizer.consume();\n this.stack.push({\n prevSibling,\n node: current\n });\n // 第 0 个节点没有前置节点\n prevSibling = null;\n current = this.declaration();\n continue;\n }\n // 下一个可能是 同级节点 或 Dedent\n\n // 将当前节点插入父节点\n if (current) {\n if (this.stack.length) {\n const parent = this.stack[this.stack.length - 1].node;\n this.insert(parent, current, prevSibling);\n } else {\n rootList.push(current);\n }\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n const DEDENT = this.tokenizer.consume();\n const { node: parent, prevSibling: prevParent } = this.stack.pop();\n prevSibling = prevParent;\n current = parent;\n }\n // 下一个是 同级节点\n else {\n prevSibling = current;\n current = this.declaration();\n }\n }\n return rootList;\n }\n\n /**\n * @deprecated\n * 节点列表:\n * 可以是一个节点,也可以跟随更多节点\n * <nodeList> ::= <node> <nodeList> <EOF|Dedent>\n * |\n */\n nodeList(parent: any) {\n let _node: any;\n let prevSibling: any;\n let prevItem: any;\n let anchor: any;\n while (1) {\n // 对于 Program EOF 表示 list 遍历完成\n if (this.tokenizer.isEof()) {\n return;\n }\n\n // 对于 childList Dedent 表示 childList 遍历完成\n if (this.tokenizer.token.type & TokenType.Dedent) {\n this.tokenizer.consume();\n return;\n }\n _node = this.node();\n\n // 父节点是 if 采用 if.children.push 的方式采集\n // 父节点不是 if 采用 insert 进行采集\n const insert = parent.__logicType ? this.defaultInsert : this.insert.bind(this);\n const remove = parent.__logicType ? this.defaultRemove : this.remove.bind(this);\n\n // 子节点不是 if,直接插入单个子节点\n if (!_node.__logicType) {\n const realPrev = this.getPrevRealSibling(prevSibling);\n const currItem = insert(parent, _node, realPrev, prevItem);\n prevItem = currItem;\n prevSibling = _node;\n continue;\n }\n\n if (prevSibling) {\n _node.anchor = prevSibling;\n }\n // 没有 prevSibling 且父是 logic\n else if (parent.__logicType) {\n _node.anchor = parent;\n }\n // 父节点是普通节点,确实前面没有东西,anchor => null\n else {\n }\n // 子节点是 if,将 child 插入到\n if (_node.child && _node.condition()) {\n let item = _node.child;\n while (item != null) {\n const { value: child } = item;\n const realPrev = this.getPrevRealSibling(prevSibling);\n const currItem = insert(parent, child, realPrev, prevItem);\n item = item.next;\n prevItem = currItem;\n prevSibling = child;\n }\n }\n }\n }\n /** 考虑到同级 逻辑模块 */\n getPrevRealSibling(prevSibling: any) {\n // 正常节点则直接返回\n if (!prevSibling || !prevSibling.__logicType) {\n return prevSibling;\n }\n let point = prevSibling;\n while (point != null) {\n if (point.lastChild) {\n return point.lastChild.value;\n }\n point = point.anchor;\n }\n }\n\n /**\n * 单个节点:\n * 由声明部分和(可选的)子节点块组成\n * <node> ::= <declaration> <childrenBlockOpt>\n * */\n node() {\n const _declaration: any = this.declaration();\n // 条件为假时执行 skip 逻辑\n if (_declaration.__logicType & LogicType.If && !_declaration.condition()) {\n return _declaration;\n }\n this.childrenBlockOpt(_declaration);\n return _declaration;\n }\n\n /**\n * 声明部分:\n * 包含首行定义和(可选的)多行属性扩展\n * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration() {\n const [isHook, value] = this._hook({});\n let _node: any;\n if (isHook) {\n const { tree, data } = value();\n _node = tree;\n } else if (value === 'if') {\n return this.ifDeclaration();\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n return _node;\n }\n\n ifDeclaration() {\n const ifIdentifier = this.tokenizer.consume();\n const [isHook, value] = this._hook({});\n const ifNode: IfNode = {\n __logicType: LogicType.If,\n condition: value,\n directList: [],\n realList: [],\n snapshot: this.tokenizer.snapshot(),\n isFirstRender: true,\n watcher: null,\n anchor: null\n };\n ifNode.watcher = this.effect(\n ({ val }) => {\n if (val) {\n const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n } else {\n const skipStr = this.tokenizer.skip();\n }\n },\n [value]\n );\n return ifNode;\n }\n\n /**\n * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>\n * | ε\n */\n extensionLines(_node: any) {\n while (1) {\n // 终止条件,下一行不是 pipe\n if (!(this.tokenizer.token.type & TokenType.Pipe)) {\n return;\n }\n // 开始解析 attributeList\n const PIPE = this.tokenizer.consume();\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if (!(this.tokenizer.token.type & TokenType.NewLine)) {\n return;\n }\n // 换行\n const NEWLINE = this.tokenizer.consume();\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n const NEWLINE = this.tokenizer.consume();\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> <=> <value or dataKey> <=> <value>\n *\n */\n attributeList(_node: any) {\n let values: any[] = [];\n let prevToken = undefined;\n while (1) {\n // 前者是 id ,后者不是 =,values 可以组成属性赋值\n if (prevToken?.type === TokenType.Identifier && this.tokenizer.token.type !== TokenType.Assign) {\n const [v1, v2, v3] = values;\n const key: any = v1;\n let dataKey, defaultVal;\n if (v3 !== undefined) {\n defaultVal = v3;\n dataKey = v2;\n }\n // v2 有值,要区分其是 dataKey,还是默认值\n else if (v2 !== undefined) {\n // 区分 p=$abc 和 p=${haha} (编译时态)\n if (typeof v2 === 'string' && v2[0] === '$' && v2[1] !== '{') {\n dataKey = v2.slice(1);\n } else {\n defaultVal = v2;\n }\n }\n // v2 没值\n else {\n dataKey = key;\n }\n let val = defaultVal;\n if (dataKey) {\n val = this.setDataProp(this.data, dataKey, defaultVal);\n }\n this.setProp(_node, key, val, this.hookI - 1);\n const [isHook, value] = this._hook({});\n values = [value];\n }\n // 先存储\n else if (this.tokenizer.token.type !== TokenType.Assign) {\n const [isHook, value] = this._hook({});\n values.push(value);\n }\n\n // 已经不是 attr 相关的字符了\n if (!(this.tokenizer.token.type & (TokenType.Identifier | TokenType.Assign))) {\n break;\n }\n prevToken = this.tokenizer.consume();\n }\n }\n\n /** 子节点块:\n * 必须被缩进包裹\n * <childrenBlockOpt> ::= INDENT <nodeList>\n * | ε /* 空(表示叶子节点,没有孩子)\n * */\n childrenBlockOpt(parent: any) {\n // 无 children\n if (!(this.tokenizer.token.type & TokenType.Indent)) {\n return [];\n }\n const INDENT = this.tokenizer.consume();\n const list = this.nodeList(parent);\n return list;\n }\n\n config(\n opt: Partial<\n Pick<\n Interpreter,\n | 'createRoot'\n | 'createNode'\n | 'setProp'\n | 'setDataProp'\n | 'setChildren'\n | 'hook'\n | 'HookId'\n | 'effect'\n | 'insert'\n >\n >\n ) {\n Object.assign(this, opt);\n }\n\n createData(data: Record<any, any>) {\n return data;\n }\n setDataProp(data: Record<any, any>, key: any, value: any) {\n return (data[key] = value);\n }\n\n setChildren(node: any, children: any[]) {\n node.children = children;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n createRoot() {\n return this.createNode('root');\n }\n\n insert(parent: any, node: any, prevSibling: any, prevItem?: any) {\n return this.defaultInsert(parent, node, prevSibling, prevItem);\n }\n defaultInsert(parent: any, node: any, prevSibling: any, prevItem: any) {\n if (!parent.child) {\n return (parent.child = parent.lastChild =\n {\n value: node,\n next: null\n });\n }\n const nextItem = prevItem.next;\n const item = {\n value: node,\n next: nextItem\n };\n prevItem.next = item;\n if (!nextItem) {\n parent.lastChild = item;\n }\n return item;\n }\n\n remove(parent: any, node: any, prevSibling: any, prevItem: any) {\n return this.defaultRemove(parent, node, prevSibling, prevItem);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(parent: any, node: any, prevSibling: any, prevItem: any) {\n const currItem = prevItem.next;\n const nextItem = currItem.next;\n if (prevItem) {\n if (nextItem) {\n prevItem.next = nextItem;\n } else {\n prevItem.next = null;\n parent.lastChild = prevItem;\n }\n } else {\n if (nextItem) {\n parent.child = nextItem;\n } else {\n parent.child = null;\n parent.lastChild = null;\n }\n }\n currItem.next = null;\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n effect: typeof effect;\n signal: typeof $;\n\n init(fragments: string | string[]) {\n this.data = this.createData(this.data);\n if (typeof fragments === 'string') {\n this.tokenizer.setCode(fragments);\n } else {\n let code = '';\n for (let i = 0; i < fragments.length - 1; i++) {\n const fragment = fragments[i];\n code += fragment + `${this.HookId}${i}`;\n }\n this.tokenizer.setCode(code + fragments[fragments.length - 1]);\n }\n }\n hook: Hook;\n _hook = (props: Partial<HookProps>): [boolean, any] => {\n const value = this.tokenizer.token.value;\n\n const isHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n if (this.hook && isHook) {\n const hookI = Number(value.slice(this.HookId.length));\n const res = this.hook({\n ...props,\n HookId: this.HookId,\n i: hookI\n });\n this.hookI++;\n return [isHook, res];\n }\n return [isHook, value];\n };\n}\n\n// const tokenizer = new Tokenizer();\n// const cmp = new Interpreter(tokenizer);\n\n// // 初始化\n// cmp.config({\n// insert(parent, node) {\n// if (parent.children) {\n// parent.children.push(node);\n// } else {\n// parent.children = [node];\n// }\n// return undefined;\n// },\n// setDataProp(data, key, value) {\n// return (data[key] = value);\n// },\n// setProp(node: any, key: string, value: any, hookI?: number) {\n// node.props[key] = value;\n// }\n// });\n// cmp.init(`\n// node1 k1=1\n// node1_1 k2=2 k3=3\n// node1_1_1 k6=6\n// node2\n// | p1=1\n// | p2=2 p3=3\n// node2_1\n// | p4=4 p5=5 p6=6\n// node2_2\n// | p7=7\n// node3 v1=1 v2=2 v3=3\n// node3_1 v4=4 v5=5 v6=6\n// `);\n// const res = cmp.experimentalProgram();\n// console.log(JSON.stringify(res, undefined, 2));\n"],"names":["TokenType","LogicType"],"mappings":"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"}
1
+ {"version":3,"file":"bobe.cjs.js","sources":["../src/type.ts","../src/index.ts"],"sourcesContent":["import { Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Terp } from './index';\n\nexport enum TokenType {\n NewLine = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Indent = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Dedent = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n Identifier = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Assign = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Pipe = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Eof = 0b0000_0000_0000_0000_0000_0000_0100_0000,\n InsertionExp = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\n\nexport enum LogicType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n ElseIf = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n Else = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n For = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n Component = 0b0000_0000_0000_0000_0000_0000_0001_0000,\n Fragment = 0b0000_0000_0000_0000_0000_0000_0010_0000,\n Root = 0b0000_0000_0000_0000_0000_0000_0100_0000\n}\n\nexport enum TerpEvt {\n AllAttrGot = 'all-attr-got',\n HandledComponentNode = 'handled-component-node'\n}\n\nexport type BaseType = string | number | boolean | undefined | null;\n\nexport const InsComputed = Symbol('insertion-computed-map-key');\n\nexport type Token = {\n type: TokenType;\n typeName: string;\n value: BaseType;\n};\n\nexport type HookProps = {\n /** 通过哪个 HookId 进入的 */\n HookId: string;\n /** 第几个 hook */\n i: number;\n /** 父节点 */\n parentNode?: any;\n};\n\nexport type TerpConf = Partial<\n Pick<Terp, 'data' | 'createNode' | 'setProp' | 'hook' | 'HookId' | 'insert'>\n>;\nexport type CustomRenderConf = Omit<TerpConf, 'data'>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = (this: Store, options: CustomRenderConf, valOpt: TerpConf) => ComponentNode;\n\nexport type StackItem = {\n /** 表示当前节点子节点已处理完毕 */\n prevSibling: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: () => any;\n anchor: any;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n watcher: { stop: () => void };\n};\n\nexport type LogicNode = {\n __logicType: LogicType;\n directList?: any[];\n realList: any[];\n};\n\nexport type FragmentNode = LogicNode & {};\nexport type ComponentNode = LogicNode & {\n store: Store;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};","import { Tokenizer } from './tokenizer';\nimport { $, effect, Keys, shareSignal, Signal, Store } from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CustomRenderConf,\n FragmentNode,\n Hook,\n HookProps,\n HookType,\n IfNode,\n LogicNode,\n LogicType,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nconst tap = new BaseEvent();\n\nexport class Terp {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n stack: StackItem[] = [];\n constructor(private tokenizer: Tokenizer) {}\n // /** program 要挂载的父节点位置 */\n // root: any;\n // /** program 挂载的前置节点 */\n // anchor: any;\n program() {\n const root: ComponentNode = {\n __logicType: LogicType.Component,\n store: this.data as any,\n realList: [],\n directList: []\n };\n this.tokenizer.consume();\n let current: any;\n let prevSibling: any;\n this.stack = [{ node: root, prevSibling }];\n while (1) {\n if (this.tokenizer.isEof()) {\n this.handleInsert(root, current, root.realList[root.realList.length - 1]);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n const INDENT = this.tokenizer.consume();\n this.stack.push({\n prevSibling,\n node: current\n });\n // 第 0 个节点没有前置节点\n prevSibling = null;\n current = this.declaration();\n continue;\n }\n // token 不是 Indent ,就是 同级节点 或 Dedent\n // 将之前产生的 current 添加到父节点\n if (current) {\n if (this.stack.length > 1) {\n const parent = this.stack[this.stack.length - 1].node;\n this.handleInsert(parent, current, prevSibling);\n } else {\n this.handleInsert(root, current, prevSibling);\n }\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n const DEDENT = this.tokenizer.consume();\n const { node: parent, prevSibling: prevParent } = this.stack.pop();\n prevSibling = prevParent;\n current = parent;\n }\n // 下一个是 同级节点\n else {\n prevSibling = current;\n current = this.declaration();\n }\n }\n return root;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点们插入到 realList 调用 insert 方法挨个插入子节点\n * 子节点 将其下 realList 插入到父节点 将本节点插入父节点\n */\n handleInsert(parent: any, child: any, prevSibling: any) {\n let insertFn = this.insert.bind(this);\n if (parent.__logicType) {\n insertFn = (parent: any, child: any, prevSibling: any) => {\n parent.realList.splice(parent.realList.indexOf(prevSibling) + 1, 0, child);\n };\n }\n if (child.__logicType) {\n const realList = child.realList as any[];\n for (let i = realList.length; i--; ) {\n const item = realList[i];\n insertFn(parent, item, prevSibling);\n }\n } else {\n insertFn(parent, child, prevSibling);\n }\n }\n\n /**\n * @deprecated\n * 节点列表:\n * 可以是一个节点,也可以跟随更多节点\n * <nodeList> ::= <node> <nodeList> <EOF|Dedent>\n * |\n */\n nodeList(parent: any) {\n let _node: any;\n let prevSibling: any;\n let prevItem: any;\n let anchor: any;\n while (1) {\n // 对于 Program EOF 表示 list 遍历完成\n if (this.tokenizer.isEof()) {\n return;\n }\n\n // 对于 childList Dedent 表示 childList 遍历完成\n if (this.tokenizer.token.type & TokenType.Dedent) {\n this.tokenizer.consume();\n return;\n }\n _node = this.node();\n\n // 父节点是 if 采用 if.children.push 的方式采集\n // 父节点不是 if 采用 insert 进行采集\n const insert = parent.__logicType ? this.defaultInsert : this.insert.bind(this);\n const remove = parent.__logicType ? this.defaultRemove : this.remove.bind(this);\n\n // 子节点不是 if,直接插入单个子节点\n if (!_node.__logicType) {\n const realPrev = this.getPrevRealSibling(prevSibling);\n const currItem = insert(parent, _node, realPrev, prevItem);\n prevItem = currItem;\n prevSibling = _node;\n continue;\n }\n\n if (prevSibling) {\n _node.anchor = prevSibling;\n }\n // 没有 prevSibling 且父是 logic\n else if (parent.__logicType) {\n _node.anchor = parent;\n }\n // 父节点是普通节点,确实前面没有东西,anchor => null\n else {\n }\n // 子节点是 if,将 child 插入到\n if (_node.child && _node.condition()) {\n let item = _node.child;\n while (item != null) {\n const { value: child } = item;\n const realPrev = this.getPrevRealSibling(prevSibling);\n const currItem = insert(parent, child, realPrev, prevItem);\n item = item.next;\n prevItem = currItem;\n prevSibling = child;\n }\n }\n }\n }\n /** 考虑到同级 逻辑模块 */\n getPrevRealSibling(prevSibling: any) {\n // 正常节点则直接返回\n if (!prevSibling || !prevSibling.__logicType) {\n return prevSibling;\n }\n let point = prevSibling;\n while (point != null) {\n if (point.lastChild) {\n return point.lastChild.value;\n }\n point = point.anchor;\n }\n }\n\n /**\n * 单个节点:\n * 由声明部分和(可选的)子节点块组成\n * <node> ::= <declaration> <childrenBlockOpt>\n * */\n node() {\n const _declaration: any = this.declaration();\n // 条件为假时执行 skip 逻辑\n if (_declaration.__logicType & LogicType.If && !_declaration.condition()) {\n return _declaration;\n }\n this.childrenBlockOpt(_declaration);\n return _declaration;\n }\n\n /**\n * 声明部分:\n * 包含首行定义和(可选的)多行属性扩展\n * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration() {\n const [hookType, value] = this._hook({});\n let _node: any;\n\n if (value === 'if') {\n return this.ifDeclaration();\n } else if (hookType) {\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class\n if (typeof value === 'function' && value.prototype instanceof Store) {\n _node = this.componentDeclaration(value);\n }\n // 传组件片段\n else if (typeof value === 'function') {\n _node = this.fragmentDeclaration(value);\n }\n // 其余类型不允许静态插值\n else {\n throw new SyntaxError(`declaration 不支持 ${value} 类型的静态插值`);\n }\n }\n // 动态插值\n // 一定是 js 表达式\n // 1. 返回基础值,创建文本节点 createNode('text', String(value))\n // 2. 返回 组件,创建组件节点\n // 3. 返回 片段\n // TODO: 后续考虑动态组件\n else {\n const isKeyInsertion = Boolean(this.data[Keys.Raw][value]);\n\n const fn = new Function('data', `let v;with(data){v=(${value})};return v`);\n\n _node = this.createNode(value);\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.consume();\n this.headerLine(_node);\n this.extensionLines(_node);\n if (_node.__logicType === LogicType.Component) {\n tap.once(TerpEvt.HandledComponentNode, node => (_node = node));\n tap.emit(TerpEvt.AllAttrGot);\n }\n return _node;\n }\n\n // TODO: 指定挂载位置\n fragmentDeclaration(renderFragment: BobeUI) {\n const fragmentNode: FragmentNode = {\n __logicType: LogicType.Fragment,\n directList: [],\n realList: []\n };\n renderFragment.call(this.data, this.opt, { data: this.data, root: '', anchor: '' });\n return fragmentNode;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(node: any, key: string, value: any, valueIsMapKey: boolean, hookI?: number) {\n if (typeof value === 'function') {\n effect(() => {\n const res = value();\n this.setProp(node, key, res, hookI);\n });\n } else if (valueIsMapKey) {\n effect(() => {\n const res = this.data[value];\n this.setProp(node, key, res, hookI);\n });\n }\n // 静态数据\n else {\n this.setProp(node, key, value, hookI);\n }\n }\n\n componentDeclaration(Component: typeof Store) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n const child = Component.new();\n const prevOnePropParsed = this.onePropParsed;\n this.onePropParsed = (node, key, value, valueIsMapKey, hookI) => {\n // key 映射\n if (valueIsMapKey) {\n shareSignal(this.data, value, child, key);\n }\n // 动态值内置 computed 处理\n else if (typeof value === 'function') {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n const computed = $(value);\n cells.set(key, computed);\n }\n // 静态值\n else {\n child[Keys.Raw][key] = value;\n }\n };\n\n tap.once(TerpEvt.AllAttrGot, () => {\n this.onePropParsed = prevOnePropParsed;\n const root = (child['ui'] as BobeUI)(this.opt, { data: child });\n tap.emit(TerpEvt.HandledComponentNode, root);\n });\n return { __logicType: LogicType.Component };\n }\n\n ifDeclaration() {\n const ifIdentifier = this.tokenizer.consume();\n const [isHook, value] = this._hook({});\n const ifNode: IfNode = {\n __logicType: LogicType.If,\n condition: value,\n directList: [],\n realList: [],\n snapshot: this.tokenizer.snapshot(),\n isFirstRender: true,\n watcher: null,\n anchor: null\n };\n ifNode.watcher = effect(\n ({ val }) => {\n if (val) {\n const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n } else {\n const skipStr = this.tokenizer.skip();\n }\n },\n [value]\n );\n return ifNode;\n }\n\n /**\n * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>\n * | ε\n */\n extensionLines(_node: any) {\n while (1) {\n // 终止条件,下一行不是 pipe\n if (!(this.tokenizer.token.type & TokenType.Pipe)) {\n return;\n }\n // 开始解析 attributeList\n const PIPE = this.tokenizer.consume();\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if (!(this.tokenizer.token.type & TokenType.NewLine)) {\n return;\n }\n // 换行\n const NEWLINE = this.tokenizer.consume();\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n const NEWLINE = this.tokenizer.consume();\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或通过 effect 直接设值\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n while (!(this.tokenizer.token.type & TokenType.NewLine)) {\n // 取 key\n if (key == null) {\n key = this.tokenizer.token.value as any;\n }\n // 取 =\n else if (eq == null) {\n eq = '=';\n }\n // 取 value\n else {\n const [hookType, value] = this._hook({});\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n const fn = valueIsMapKey\n ? value\n : new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n this.onePropParsed(_node, key, fn, valueIsMapKey, this.hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(_node, key, value, false, this.hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.consume();\n }\n }\n\n /** 子节点块:\n * 必须被缩进包裹\n * <childrenBlockOpt> ::= INDENT <nodeList>\n * | ε /* 空(表示叶子节点,没有孩子)\n * */\n childrenBlockOpt(parent: any) {\n // 无 children\n if (!(this.tokenizer.token.type & TokenType.Indent)) {\n return [];\n }\n const INDENT = this.tokenizer.consume();\n const list = this.nodeList(parent);\n return list;\n }\n\n opt: TerpConf;\n config(opt: TerpConf) {\n Object.assign(this, opt);\n this.opt = opt;\n }\n\n createNode(name: string) {\n return {\n name,\n props: {}\n };\n }\n\n insert(parent: any, node: any, prevSibling: any, prevItem?: any) {\n return this.defaultInsert(parent, node, prevSibling, prevItem);\n }\n defaultInsert(parent: any, node: any, prevSibling: any, prevItem: any) {\n if (prevSibling) {\n const children: any[] = parent.children;\n const insertI = children.findIndex(item => item === prevSibling);\n children.splice(insertI + 1, 0, node);\n } else {\n parent.children = [node];\n }\n }\n\n remove(parent: any, node: any, prevSibling: any, prevItem: any) {\n return this.defaultRemove(parent, node, prevSibling, prevItem);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(parent: any, node: any, prevSibling: any, prevItem: any) {\n if (parent.children) {\n parent.children.splice(parent.children.indexOf(node), 1);\n }\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n\n init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.tokenizer.setCode(fragments);\n } else {\n let code = '';\n for (let i = 0; i < fragments.length - 1; i++) {\n const fragment = fragments[i];\n code += fragment + `${this.HookId}${i}`;\n }\n this.tokenizer.setCode(code + fragments[fragments.length - 1]);\n }\n }\n hook: Hook;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any] => {\n const value = this.tokenizer.token.value;\n const isDynamicHook = this.tokenizer.token.type & TokenType.InsertionExp;\n const isStaticHook = typeof value === 'string' && value.indexOf(this.HookId) === 0;\n const hookType: HookType = isDynamicHook ? 'dynamic' : isStaticHook ? 'static' : undefined;\n // 静态插值 `${xxx}`\n if (this.hook && isStaticHook) {\n const hookI = Number(value.slice(this.HookId.length));\n const res = this.hook({\n ...props,\n HookId: this.HookId,\n i: hookI\n });\n this.hookI++;\n return [hookType, res];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n}\n"],"names":["TokenType","LogicType","TerpEvt","BaseEvent","parent","child","prevSibling","Store","Keys","effect","shareSignal","$"],"mappings":"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"}