bobe 0.0.19 → 0.0.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/type.ts","../src/typed.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Dispose, Signal, Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\nimport { MultiTypeStack } from './typed';\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 FakeType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Fail = 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 ForItem = 0b0000_0000_0000_0000_0000_0000_0100_0000\n}\n\nexport const CondBit = FakeType.If | FakeType.Fail | FakeType.Else;\nexport const LogicalBit = FakeType.If | FakeType.Fail | FakeType.Else | FakeType.For | FakeType.ForItem;\nexport const CtxProviderBit =\n FakeType.If |\n FakeType.Fail |\n FakeType.Else |\n FakeType.For |\n FakeType.ForItem |\n FakeType.Component |\n FakeType.Fragment;\n\nexport const TokenizerSwitcherBit = FakeType.Component | FakeType.Fragment;\nexport type NodeSortBit = number;\n/**\n * 按不同维度分类,分类不互斥\n */\nexport enum NodeSort {\n /** 逻辑类型 1.if 2.else 3.fail 4.for 5. for item */\n Logic = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n /** 真实节点 */\n Real = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n /** 组件 */\n Component = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n /** FakeType 所有枚举都能提供 ctx,否则重新渲染时获取不到上下文 */\n CtxProvider = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n /** 节点可导致 token 切换 1. component 2. fragment */\n TokenizerSwitcher = 0b0000_0000_0000_0000_0000_0000_0001_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');\nexport const IsAnchor = Symbol('is-anchor');\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<Interpreter, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'>\n>;\nexport type CustomRenderConf = Pick<\n TerpConf,\n 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'\n>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: MultiTypeStack<any>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = {\n /** 在哪个 Store 声明的 */\n boundStore: Store;\n (isSub: boolean): Tokenizer;\n};\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type LogicNode = {\n __logicType: FakeType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n lastInserted?: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: Signal;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n effect: Dispose;\n preCond: IfNode | null;\n owner: ComponentNode | FragmentNode;\n};\n\nexport type FragmentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type ComponentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};\n","import { NodeSort, NodeSortBit, StackItem } from './type';\n\n// 1. 定义类别枚举\ntype Type = 'A' | 'B' | 'C';\n\n// 2. 定义节点结构\ninterface StackNode<T> {\n value: T;\n types: NodeSortBit;\n // prevGlobal: StackNode<T> | null;\n // 核心:记录在该节点加入时,各个类别的上一个节点是谁\n prevByType: Partial<Record<number, StackNode<T>>>;\n}\n\nexport class MultiTypeStack<T> {\n // 记录全局栈顶\n // private top: StackNode<T> | null = null;\n\n // 记录每个类别的当前最新节点(各分类的“栈顶”)\n private typeTops: Partial<Record<number, StackNode<T>>> = {};\n\n length = 0;\n stack: StackNode<T>[] = [];\n /**\n * 入栈操作\n * @param value 数据\n * @param bits 该节点所属的类别数组\n */\n push(value: T, bits: NodeSortBit): void {\n const newNode: StackNode<T> = {\n value,\n types: bits,\n prevByType: {}\n };\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 按类型链接前置节点\n newNode.prevByType[bit] = this.typeTops[bit] || undefined;\n this.typeTops[bit] = newNode;\n }\n this.stack[this.length++] = newNode;\n }\n\n /**\n * 出栈操作\n */\n pop() {\n const poppedNode = this.stack[this.length - 1];\n this.stack[--this.length] = null;\n if (!poppedNode) return undefined;\n\n let { types: bits } = poppedNode;\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 弹出对应类别的“顶端”元素\n this.typeTops[bit] = poppedNode.prevByType[bit];\n }\n\n // 更新全局栈顶\n return [poppedNode.value, poppedNode.types] as const;\n }\n\n /**\n * 获取某个类别的当前“顶部”元素\n */\n peekByType(cat: number): T | undefined {\n return this.typeTops[cat]?.value;\n }\n\n peekType(): number | undefined {\n return this.stack.at(-1).types;\n }\n\n /**\n * 获取全局栈顶\n */\n peek(): T | undefined {\n return this.stack.at(-1).value;\n }\n\n // /**\n // * 1. 全局向前遍历 (不分类)\n // * 从栈顶开始,沿着全局链条向栈底遍历\n // */\n // forEach(callback: (value: T, types: number) => any): void {\n // let current = this.top;\n\n // while (current !== null) {\n // // 执行回调,如果返回 false 则立即停止\n // const shouldBreak = callback(current.value, current.types);\n // if (shouldBreak) break;\n\n // current = current.prevGlobal;\n // }\n // }\n\n // /**\n // * 2. 按类别向前遍历\n // * 仅遍历属于指定类别 cat 的节点\n // */\n // forEachByType(cat: number, callback: (value: T) => any): void {\n // // 从该类别的当前“顶端”节点开始\n // let current = this.typeTops[cat];\n\n // while (current) {\n // const shouldBreak = callback(current.value);\n // if (shouldBreak) break;\n\n // // 关键点:直接跳向该节点记录的“上一个同类节点”\n // // 这比遍历全局栈再筛选类别要快得多 (O(m) vs O(n))\n // current = current.prevByType[cat];\n // }\n // }\n}\n","import { Tokenizer } from './tokenizer';\nimport { $, deepSignal, effect, getPulling, Keys, runWithPulling, setPulling, shareSignal, Signal, Store } from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CondBit,\n FragmentNode,\n IfNode,\n IsAnchor,\n LogicalBit,\n LogicNode,\n FakeType,\n NodeSort,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType,\n TokenizerSwitcherBit\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nimport { MultiTypeStack } from './typed';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & LogicalBit;\n }\n\n ctx: ProgramCtx;\n rootComponent: ComponentNode | null = null;\n\n program(root: any, componentNode?: ComponentNode, before?: any) {\n // 首屏渲 app 组件需要创建对象\n this.rootComponent = componentNode;\n\n this.tokenizer.nextToken();\n const stack = new MultiTypeStack<StackItem>();\n stack.push({ node: root, prev: null }, NodeSort.Real);\n stack.push(\n { node: componentNode, prev: null },\n NodeSort.Component | NodeSort.CtxProvider | NodeSort.TokenizerSwitcher\n );\n\n const ctx = (this.ctx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n });\n\n const rootPulling = getPulling();\n while (1) {\n // 子 tokenizer 退出,代表子组件逻辑结束\n if (this.tokenizer.isEof()) {\n if (!ctx.prevSibling) ctx.prevSibling = before;\n this.handleInsert(root, ctx.current, ctx.prevSibling, componentNode);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n this.tokenizer.nextToken(); // INDENT\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n !ctx.current.__logicType\n ? NodeSort.Real\n : (ctx.current.__logicType & LogicalBit ? NodeSort.Logic : 0) |\n (ctx.current.__logicType & TokenizerSwitcherBit ? NodeSort.TokenizerSwitcher : 0) |\n (ctx.current.__logicType === FakeType.Component ? NodeSort.Component : 0) |\n NodeSort.CtxProvider\n );\n if (ctx.current.__logicType) {\n // 父节点是逻辑节点\n if (isLogicNode) {\n // 保证 if 子逻辑节点能被其 effect 管理\n setPulling(ctx.current.effect.ins);\n }\n }\n // 父节点是原生节点时才修改 ctx.prevSibling\n else {\n if (ctx.current) {\n ctx.realParent = ctx.current;\n }\n ctx.prevSibling = null;\n }\n ctx.current = this.declaration(ctx);\n continue;\n }\n // Token 不论指示找 下一个同级节点,还是 Dedent, 都将当前节点插入\n if (ctx.current) {\n // root 下第一个子节点应该插入在 before 之后\n if (stack.length === 2 && !ctx.prevSibling) {\n ctx.prevSibling = before;\n }\n this.handleInsert(ctx.realParent, ctx.current, ctx.prevSibling);\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n this.tokenizer.nextToken(); // DEDENT\n const [{ node: parent, prev }, sort] = stack.pop();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.peekByType(NodeSort.Real);\n ctx.realParent = prevSameType?.node || root;\n }\n // 弹出非原生节点\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (sort & NodeSort.Logic) {\n // 找最近的 if for\n const parentLogic = stack.peekByType(NodeSort.Logic)?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tokenizer\n if (sort & NodeSort.TokenizerSwitcher) {\n const switcher = stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n this.tokenizer = switcher.tokenizer;\n }\n }\n ctx.prevSibling = prev;\n ctx.current = parent;\n }\n // 下一个是 同级节点\n else {\n ctx.prevSibling = ctx.current || ctx.prevSibling;\n ctx.current = this.declaration(ctx);\n }\n }\n return componentNode;\n }\n\n switcherIsRootComponent() {\n const currentSwitcher = this.ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n return currentSwitcher === this.rootComponent;\n }\n\n insertAfterAnchor(ctx: ProgramCtx) {\n const { realParent, prevSibling, stack, before } = ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor();\n ctx.prevSibling = stack.length === 2 && !prevSibling ? before : prevSibling;\n this.handleInsert(realParent, afterAnchor, prevSibling);\n return afterAnchor;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点\n * 子节点 仅插入到父逻辑节点 将本节点插入父节点\n * 理论上父节点不能是一个 逻辑节点,遇到if 时 Terp 会重新执行 program 这种情况下,会指定 root 为真实 dom\n */\n handleInsert(parent: any, child: any, prev: any, parentComponent?: any) {\n // 父 是 逻辑节点\n if (parentComponent) {\n // parentComponent.directList.push(child);\n }\n // 子 普通节点\n if (!child.__logicType) {\n // 前置节点空 或 普通节点\n if (!prev || !prev.__logicType) {\n this.insertAfter(parent, child, prev);\n }\n // 前置节点是逻辑节点,必定有 after\n else {\n const before = prev.realAfter;\n this.insertAfter(parent, child, before);\n }\n }\n // 子 是 逻辑节点\n else {\n const childCmp: LogicNode = child;\n childCmp.realParent = parent;\n // 前置 -> 逻辑节点\n if (prev?.__logicType) {\n childCmp.realBefore = prev.realAfter;\n }\n // 前置 -> 普通节点\n else {\n childCmp.realBefore = prev;\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 * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration(ctx: ProgramCtx) {\n const [hookType, value] = this.tokenizer._hook({});\n let _node: any;\n if (value === 'if' || value === 'else' || value === 'fail') {\n return this.condDeclaration(ctx);\n } else if (hookType) {\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class 或 片段\n if (typeof value === 'function') {\n _node = this.componentOrFragmentDeclaration(value, ctx);\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 _node = this.componentOrFragmentDeclaration(value, ctx);\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.nextToken();\n this.headerLine(_node);\n this.extensionLines(_node);\n // 组件用完,切换回 真实node 的方法\n if (_node.__logicType & TokenizerSwitcherBit) {\n this.onePropParsed = this.oneRealPropParsed;\n this.tokenizer = _node.tokenizer;\n }\n return _node;\n }\n getData() {\n const { node } = this.ctx.stack.peekByType(NodeSort.CtxProvider);\n return node.data || node.owner.data;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(\n data: Store,\n node: any,\n key: string,\n value: any,\n valueIsMapKey: boolean,\n isFn: boolean,\n hookI?: number\n ) {\n if (isFn) {\n this.setProp(node, key, value, hookI);\n } else 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 = 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 oneRealPropParsed: Interpreter['onePropParsed'] = this.onePropParsed.bind(this);\n\n componentOrFragmentDeclaration(ComponentOrRender: BobeUI | typeof Store | string, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n let Component: typeof Store, render: BobeUI, child: any;\n const data = this.getData();\n // 如果是字符串,就去 父中取动态的 Component\n if (typeof ComponentOrRender === 'string') {\n ComponentOrRender = data[ComponentOrRender];\n }\n\n const isCC = (ComponentOrRender as any).prototype instanceof Store;\n if (isCC) {\n Component = ComponentOrRender as any;\n child = Component.new();\n } else {\n render = ComponentOrRender as BobeUI;\n const boundStore = render.boundStore;\n // 使用原型链来继承 store 的数据\n child = deepSignal({}, getPulling(), true);\n Object.setPrototypeOf(child, boundStore);\n }\n\n const node: ComponentNode = {\n __logicType: isCC ? FakeType.Component : FakeType.Fragment,\n realParent: ctx.realParent,\n data: child,\n tokenizer: render ? render(true) : (child['ui'] as BobeUI)(true)\n };\n this.onePropParsed = (data, _, key, value, valueIsMapKey, isFn, hookI) => {\n if (isFn) {\n child[Keys.Raw][key] = value;\n }\n // key 映射\n else if (valueIsMapKey) {\n shareSignal(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 child[Keys.Raw][key] = undefined;\n }\n // 静态值\n else {\n child[Keys.Raw][key] = value;\n }\n };\n node.realAfter = this.insertAfterAnchor(ctx);\n return node;\n }\n // TODO: 优化代码逻辑,拆分 if elseif else\n condDeclaration(ctx: ProgramCtx) {\n const { prevSibling } = ctx;\n const snapbackUp = this.tokenizer.snapshot();\n const keyWord = this.tokenizer.token;\n this.tokenizer.nextToken(); // keyWord\n const noSelfCond = this.tokenizer.token.type === TokenType.NewLine;\n\n const [hookType, value] = this.tokenizer._hook({});\n const isElse = keyWord.value === 'else';\n const isIf = keyWord.value === 'if';\n const preIsCond = prevSibling?.__logicType & CondBit;\n // 需要和前一个节点的 condition 合并计算\n const needCalcWithPrevIf = isElse && preIsCond;\n const data = this.getData();\n const owner = ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const ifNode: IfNode = {\n __logicType: isElse ? FakeType.Else : isIf ? FakeType.If : FakeType.Fail,\n snapshot: noSelfCond ? snapbackUp : this.tokenizer.snapshot(),\n condition: null,\n realParent: null,\n preCond: preIsCond ? prevSibling : null,\n isFirstRender: true,\n effect: null,\n owner\n };\n let signal: Signal;\n\n // 纯 else 节点,一定要前置节点的取反\n if (noSelfCond) {\n if (isElse) {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n // default\n else {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n } else {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n // 为键映射\n if (valueIsMapKey && !needCalcWithPrevIf) {\n // 确保 signal 已生成\n runWithPulling(() => data[value], null);\n // 拿到 signal\n const { cells } = data[Keys.Meta];\n signal = cells.get(value);\n }\n // 通过前置条件 和 computed 计算出\n else {\n const fn = new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, data);\n if (needCalcWithPrevIf) {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return fn();\n });\n } else {\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n }\n }\n\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(ctx);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n if (!noSelfCond) {\n this.tokenizer.nextToken(); // condition\n }\n this.tokenizer.nextToken(); // NEWLINE\n }\n // 更新渲染\n else {\n // 切换到对应 Switcher 的 tokenizer\n this.tokenizer = ifNode.owner.tokenizer;\n /**\n * condition 在首屏对应的是 当前 token, resume 时被设置为空\n * newLine 被用于判断起始缩进所消耗\n */\n this.tokenizer.resume(ifNode.snapshot);\n\n // TODO: 由于首屏渲染直接放行,导致 if 子节点首屏产生的 effect 不能被管理\n // 在 effect 中创建的子组件 sub effect 能被管理\n // 当 if = false 时,不需要执行销毁子 effect 操作\n // 因为当外部 effect 重新执行时,上次尝试的 sub effect 自动销毁\n // 前提是 sub effect 是嵌套执行的\n this.program(ifNode.realParent, ifNode.owner, ifNode.realBefore);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n if (noSelfCond) {\n // 让 '/n‘ 能被 skip 处理\n this.tokenizer.i = this.tokenizer.i - 1;\n // else 时消费了一个 \\n 导致 needDent 被置为 true\n this.tokenizer.needIndent = false;\n }\n this.tokenizer.skip(); // skipStr\n }\n // 更新渲染,删除所有节点\n else {\n const { realBefore, realAfter, realParent } = ifNode;\n let point = realBefore ? this.nextSib(realBefore) : this.firstChild(realParent);\n while (point !== realAfter) {\n const next = this.nextSib(point);\n this.remove(point, realParent, realBefore);\n point = next;\n }\n }\n }\n ifNode.isFirstRender = false;\n },\n [signal]\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) === 0) {\n return;\n }\n // 开始解析 attributeList\n this.tokenizer.nextToken(); // PIPE\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\n return;\n }\n // 换行\n this.tokenizer.nextToken(); // NEWLINE\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n this.tokenizer.nextToken(); // NEWLINE\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或 产生 computed\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n const data = this.getData();\n while ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\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, hookI] = this.tokenizer._hook({});\n const rawVal = data[Keys.Raw][value];\n const isFn = typeof rawVal === 'function';\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n const fn = isFn\n ? rawVal\n : valueIsMapKey\n ? value\n : new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, data);\n this.onePropParsed(data, _node, key, fn, valueIsMapKey, isFn, hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.nextToken();\n }\n }\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 nextSibling: null\n };\n }\n\n nextSib(node: any) {\n return node.nextSibling;\n }\n\n firstChild(node: any) {\n return node.firstChild;\n }\n\n _createAnchor() {\n const anchor = this.createAnchor();\n anchor[IsAnchor] = true;\n return anchor;\n }\n createAnchor() {\n return {\n name: 'anchor',\n nextSibling: null\n };\n }\n\n insertAfter(parent: any, node: any, prev: any) {\n return this.defaultInsert(parent, node, prev);\n }\n defaultInsert(parent: any, node: any, prev: any) {\n if (prev) {\n const next = prev.nextSibling;\n prev.nextSibling = node;\n node.nextSibling = next;\n } else {\n const next = parent.firstChild;\n parent.firstChild = node;\n node.nextSibling = next;\n }\n }\n\n remove(node: any, parent?: any, prev?: any) {\n return this.defaultRemove(node, parent, prev);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(node: any, parent: any, prevSibling: any) {\n const next = node.nextSibling;\n if (prevSibling) {\n prevSibling.nextSibling = next;\n }\n if (parent.firstChild === node) {\n parent.firstChild = next;\n }\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n}\n","import { isNum, matchIdStart, Queue } from 'bobe-shared';\nimport { BaseType, Hook, HookProps, HookType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** Eof 标识符的值 */\n static EofId = `__EOF__${Date.now()}`;\n static DedentId = `__DEDENT__${Date.now()}`;\n\n /** 当前 token */\n token!: Token;\n /** 回车后需要判断缩进 */\n needIndent = false;\n /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */\n isFirstToken = true;\n /** 代码 */\n code: string;\n /** 记录历史缩进的长度,相对于行首 */\n dentStack: number[] = [0];\n /** 当前字符 index */\n i = 0;\n // TODO: 生产环境不需要这个,导致不必要的内存占用\n handledTokens: Token[] = [];\n /**\n * 有些标识符能产生多个 token\n * 例如 dedent\n * parent1\n * child\n * subChild\n * parent2 <- 产生两个 dedent\n */\n waitingTokens = new Queue<Token>();\n\n constructor(\n private hook: Hook,\n public isSubToken: boolean\n ) {\n if (isSubToken) {\n this.setToken(TokenType.Indent, '');\n this.isFirstToken = true;\n // this.waitingTokens.push({\n // type: TokenType.Indent,\n // typeName: TokenType[TokenType.Indent],\n // value: ''\n // })\n }\n }\n consume() {\n const token = this.token;\n this.nextToken();\n return token;\n }\n // /** 恢复至某一个现场,进行 token 重算 */\n resume(_snapshot: ReturnType<Tokenizer['snapshot']>) {\n this.token = undefined;\n this.needIndent = false;\n this.isFirstToken = true;\n this.dentStack = [0];\n Object.assign(this, _snapshot);\n }\n snapshot() {\n return {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\n }\n\n skip() {\n const logicDentLen = this.dentStack[this.dentStack.length - 1];\n let needIndent = false;\n /** \\n 是为了弥补 if 节点 consume condition 后,已将 token 设置成回车 */\n let skipFragment = ``;\n this.token = undefined;\n while (1) {\n const char = this.code[this.i];\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.i++;\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.i++;\n continue;\n }\n\n needIndent = false;\n // 此时已经指到一个非 tab 的字符\n const { value, isEmptyLine } = this.getDentValue();\n const currLen = value.length;\n if (isEmptyLine) continue;\n if (currLen > logicDentLen) {\n skipFragment += value;\n }\n // 找到与条件节点同级或更短的缩进了,结束。\n else {\n // skipFragment += `\\n${Tokenizer.EofId}`;\n // 一直找到最小\n for (let i = this.dentStack.length - 1; i >= 0; i--) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n\n // 大于\n if (currLen > expLen) {\n throw SyntaxError(`缩进错误,缩进长度不匹配`);\n }\n\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n break;\n }\n\n this.dentStack.pop();\n\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n } else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n break;\n }\n }\n if (!this.token) {\n this.nextToken();\n }\n return skipFragment;\n }\n\n setCode(code: string) {\n // 保证开头结尾能正确计算\n this.code = '\\n' + code.trimEnd() + `\\n${Tokenizer.EofId}`;\n }\n\n tokenize() {\n do {\n this.nextToken();\n console.log('token:', TokenType[this.token?.type], JSON.stringify(this.token?.value || ''));\n } while (!this.isEof());\n }\n\n isEof() {\n // 刚开始时 token 不存在\n if (!this.token) return false;\n return this.token.type & TokenType.Identifier && this.token.value === Tokenizer.EofId;\n // return this.code[this.i] === undefined;\n }\n\n private setToken(type: TokenType, value: BaseType) {\n this.token = {\n type,\n typeName: TokenType[type],\n value\n };\n this.isFirstToken = false;\n }\n\n public nextToken(): Token {\n try {\n // 已遍历到文件结尾\n if (this.isEof()) {\n return this.token;\n }\n this.token = undefined as any;\n if (this.waitingTokens.len) {\n const item = this.waitingTokens.shift()!;\n this.setToken(item.type, item.value);\n return this.token;\n }\n outer: while (1) {\n if (this.needIndent) {\n this.dent();\n // 遍历到当前标识符非 空白为止\n } else {\n const char = this.code[this.i];\n switch (char) {\n case '\\t':\n case ' ':\n // skip, 缩进通过 \\n 匹配来激活 needIndent\n break;\n // 找后续所有 newLine\n case '\\n':\n this.newLine();\n // 回车后需要判断缩进\n this.needIndent = true;\n break;\n case '=':\n this.assignment();\n break;\n case '|':\n this.pipe();\n break;\n case \"'\":\n case '\"':\n this.str(char);\n break;\n case '{':\n this.brace();\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n if (typeof char === 'string' && matchIdStart(char)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.i++;\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n return this.token;\n } finally {\n this.handledTokens.push(this.token);\n }\n }\n\n private assignment() {\n this.setToken(TokenType.Assign, '=');\n }\n private pipe() {\n this.setToken(TokenType.Pipe, '|');\n }\n private dynamic(char: string) {\n let nextC = this.code[this.i + 1];\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.i++;\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n if (nextC === '{') {\n innerBrace++;\n }\n\n if (nextC === '}') {\n // 内部无左括号,说明完成匹配 TODO: 考虑js注释中的括号可能导致匹配错误\n if (!innerBrace) {\n break;\n }\n innerBrace--;\n }\n }\n this.setToken(TokenType.Identifier, value);\n return true;\n }\n\n private brace() {\n let inComment: string,\n inString: string,\n count = 0,\n value = '',\n backslashCount = 0; // 用于记录连续的反斜杠数量\n while (1) {\n const char = this.code[this.i];\n const nextChar = this.code[this.i + 1];\n\n // 1. 处理注释状态退出\n if (inComment === 'single' && char === '\\n') {\n inComment = null;\n } else if (inComment === 'multi' && char === '*' && nextChar === '/') {\n inComment = null;\n value += this.code[this.i];\n this.i++;\n }\n // 2. 如果不在注释中,处理字符串状态\n else if (inString) {\n // 退出字符串\n if (char === inString && backslashCount % 2 === 0) {\n inString = null;\n }\n backslashCount = char === '\\\\' ? backslashCount + 1 : 0;\n } else {\n // 3. 进入注释或字符串状态\n if (char === '/' && nextChar === '/') {\n inComment = 'single';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === \"'\" || char === '\"' || char === '`') {\n inString = char;\n }\n // 4. 只有在非字符串、非注释状态下才计数\n else if (char === '{') {\n count++;\n } else if (char === '}') {\n count--;\n }\n }\n\n if (count === 0 && inString == null && inComment == null) {\n this.setToken(TokenType.InsertionExp, value.slice(1));\n return;\n }\n value += this.code[this.i];\n this.i++;\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n }\n // Program 希望第一个 token 一定是 node 节点\n if (this.isFirstToken) {\n return;\n }\n this.setToken(TokenType.NewLine, value);\n }\n private getDentValue() {\n let value = '';\n let nextC;\n let isEmptyLine = false;\n // 构建缩进字符串\n while (1) {\n const nextChar = this.code[this.i];\n\n switch (nextChar) {\n case '\\t':\n nextC = this.Tab;\n break;\n case ' ':\n nextC = ' ';\n break;\n case '\\n':\n nextC = '\\n';\n break;\n default:\n nextC = '';\n break;\n }\n\n // \\n 空白 \\n 的情况,这行不算\n if (nextC === '\\n') {\n isEmptyLine = true;\n break;\n }\n if (!nextC) {\n break;\n }\n value += nextC;\n this.i++;\n }\n return {\n value,\n isEmptyLine\n };\n }\n private dent() {\n const { value, isEmptyLine } = this.getDentValue();\n if (isEmptyLine) {\n // 这种情况下需要 next ,即后续从 \\n 重新开始匹配\n this.needIndent = true;\n return;\n }\n // 比较长度,比上个 indent 长,缩进,比上个 indent 短,dedent\n this.needIndent = false;\n // 期望 firstToken 是 node,所以这里只要修改第一个节点的基础偏移值即可\n if (this.isFirstToken) {\n this.dentStack[0] = value.length;\n return;\n }\n let currLen = value.length;\n const indentHasLen = currLen > 0;\n const prevLen = this.dentStack[this.dentStack.length - 1];\n if (currLen > prevLen) {\n this.dentStack.push(currLen);\n this.setToken(TokenType.Indent, currLen);\n return indentHasLen;\n }\n if (currLen < prevLen) {\n // 一直找到最小\n for (let i = this.dentStack.length; i--; ) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n // 夹在两者说明缩进大小有问题\n if (currLen > expLen) {\n throw SyntaxError('缩进大小不统一');\n }\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n return;\n }\n this.dentStack.pop();\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n }\n // 多余的 dent 缓存在 waitingTokens\n else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n return indentHasLen;\n }\n // 同级则无视\n return indentHasLen;\n }\n\n private shorterThanBaseDentEof() {\n const yes = this.dentStack.length === 1;\n if (yes) {\n if (!this.token) {\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tkr\n if (this.isSubToken) {\n this.setToken(TokenType.Dedent, '');\n } else {\n this.setToken(TokenType.Identifier, Tokenizer.EofId);\n }\n } else {\n if (this.isSubToken) {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: ''\n });\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\n });\n }\n }\n }\n return yes;\n }\n\n private identifier(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (typeof nextC !== 'string' || !matchIdStart(nextC)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n if (value === Tokenizer.EofId && this.isSubToken) {\n this.setToken(TokenType.Dedent, '');\n return;\n }\n\n let realValue =\n value === 'null'\n ? null\n : value === 'undefined'\n ? undefined\n : value === 'false'\n ? false\n : value === 'true'\n ? true\n : value;\n this.setToken(TokenType.Identifier, realValue);\n }\n private str(char: string) {\n let value = '';\n let nextC;\n let continuousBackslashCount = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.i++;\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n value += nextC;\n }\n this.setToken(TokenType.Identifier, value);\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 模板字符串动态节点索引 */\n hookI = 0;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any, hookI?: any] => {\n const value = this.token.value;\n const isDynamicHook = this.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 // TODO: 去除 this.hookI, hookI 由本函数返回\n return [hookType, res, hookI];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n\n init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.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.setCode(code + fragments[fragments.length - 1]);\n }\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, ComponentNode, CustomRenderConf, FakeType } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(isSub: boolean) {\n const tokenizer = new Tokenizer(({ i }) => {\n return values[i];\n }, isSub);\n tokenizer.init(Array.from(fragments));\n return tokenizer;\n };\n ui.boundStore = Store.Current;\n return ui;\n}\n\n// render -> options\nexport function customRender(option: CustomRenderConf) {\n // 保存 options\n return function render<T>(Ctor: typeof Store, root: any) {\n const store = Ctor.new();\n const tokenizer: Tokenizer = store['ui'](false);\n const terp = new Interpreter(tokenizer);\n terp.config(option);\n\n const componentNode: ComponentNode = {\n __logicType: FakeType.Component,\n realParent: root,\n data: store,\n tokenizer\n };\n\n terp.program(root, componentNode);\n // ui => bobe`` 返回的函数\n return [componentNode, store];\n };\n}\n"],"names":["TokenType","FakeType","NodeSort","BaseEvent","getPulling","setPulling","effect","Store","deepSignal","data","Keys","shareSignal","$","runWithPulling","Queue","isNum","matchIdStart","ui"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/type.ts","../src/typed.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Dispose, Signal, Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\nimport { MultiTypeStack } from './typed';\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 Semicolon = 0b0000_0000_0000_0000_0000_0001_0000_0000\n}\n\nexport enum FakeType {\n If = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n Fail = 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 ForItem = 0b0000_0000_0000_0000_0000_0000_0100_0000\n}\n\nexport const CondBit = FakeType.If | FakeType.Fail | FakeType.Else;\nexport const LogicalBit = FakeType.If | FakeType.Fail | FakeType.Else | FakeType.For | FakeType.ForItem;\nexport const CtxProviderBit =\n FakeType.If |\n FakeType.Fail |\n FakeType.Else |\n FakeType.For |\n FakeType.ForItem |\n FakeType.Component |\n FakeType.Fragment;\n\nexport const TokenizerSwitcherBit = FakeType.Component | FakeType.Fragment;\nexport type NodeSortBit = number;\n/**\n * 按不同维度分类,分类不互斥\n */\nexport enum NodeSort {\n /** 逻辑类型 1.if 2.else 3.fail 4.for 5. for item */\n Logic = 0b0000_0000_0000_0000_0000_0000_0000_0001,\n /** 真实节点 */\n Real = 0b0000_0000_0000_0000_0000_0000_0000_0010,\n /** 组件 */\n Component = 0b0000_0000_0000_0000_0000_0000_0000_0100,\n /** FakeType 所有枚举都能提供 ctx,否则重新渲染时获取不到上下文 */\n CtxProvider = 0b0000_0000_0000_0000_0000_0000_0000_1000,\n /** 节点可导致 token 切换 1. component 2. fragment */\n TokenizerSwitcher = 0b0000_0000_0000_0000_0000_0000_0001_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');\nexport const IsAnchor = Symbol('is-anchor');\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<Interpreter, 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'>\n>;\nexport type CustomRenderConf = Pick<\n TerpConf,\n 'createNode' | 'setProp' | 'insertAfter' | 'remove' | 'createAnchor' | 'firstChild' | 'nextSib'\n>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: MultiTypeStack<any>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = {\n /** 在哪个 Store 声明的 */\n boundStore: Store;\n (isSub: boolean): Tokenizer;\n};\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type LogicNode = {\n __logicType: FakeType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n};\n\nexport type ForNode = LogicNode & {\n children: ForItemNode[];\n snapshot: ReturnType<Tokenizer['snapshot']>;\n itemExp: string | ((value: any) => any);\n indexName?: string;\n getKey?: (data: any) => any;\n arr: any[];\n effect: Dispose;\n i: number;\n owner: ComponentNode | FragmentNode;\n prevSibling: any;\n};\n\nexport type ForItemNode = LogicNode & {\n id: number;\n forNode: ForNode;\n data: any;\n effect: Dispose;\n key?: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: Signal;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n effect: Dispose;\n preCond: IfNode | null;\n owner: ComponentNode | FragmentNode;\n};\n\nexport type FragmentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type ComponentNode = LogicNode & {\n data: Store;\n tokenizer: Tokenizer;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};","import { NodeSort, NodeSortBit, StackItem } from './type';\n\n// 1. 定义类别枚举\ntype Type = 'A' | 'B' | 'C';\n\n// 2. 定义节点结构\ninterface StackNode<T> {\n value: T;\n types: NodeSortBit;\n // prevGlobal: StackNode<T> | null;\n // 核心:记录在该节点加入时,各个类别的上一个节点是谁\n prevByType: Partial<Record<number, StackNode<T>>>;\n}\n\nexport class MultiTypeStack<T> {\n // 记录全局栈顶\n // private top: StackNode<T> | null = null;\n\n // 记录每个类别的当前最新节点(各分类的“栈顶”)\n private typeTops: Partial<Record<number, StackNode<T>>> = {};\n\n length = 0;\n stack: StackNode<T>[] = [];\n /**\n * 入栈操作\n * @param value 数据\n * @param bits 该节点所属的类别数组\n */\n push(value: T, bits: NodeSortBit): void {\n const newNode: StackNode<T> = {\n value,\n types: bits,\n prevByType: {}\n };\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 按类型链接前置节点\n newNode.prevByType[bit] = this.typeTops[bit] || undefined;\n this.typeTops[bit] = newNode;\n }\n this.stack[this.length++] = newNode;\n }\n\n /**\n * 出栈操作\n */\n pop() {\n const poppedNode = this.stack[this.length - 1];\n this.stack[--this.length] = null;\n if (!poppedNode) return undefined;\n\n let { types: bits } = poppedNode;\n\n let bit: number;\n while (1) {\n // 从最低位取一个类别\n bit = bits & (~bits + 1);\n if (!bit) break;\n // 去掉最低位\n bits &= ~bit;\n // 弹出对应类别的“顶端”元素\n this.typeTops[bit] = poppedNode.prevByType[bit];\n }\n\n // 更新全局栈顶\n return [poppedNode.value, poppedNode.types] as const;\n }\n\n /**\n * 获取某个类别的当前“顶部”元素\n */\n peekByType(cat: number): T | undefined {\n return this.typeTops[cat]?.value;\n }\n\n peekType(): number | undefined {\n return this.stack.at(-1).types;\n }\n\n /**\n * 获取全局栈顶\n */\n peek(): T | undefined {\n return this.stack.at(-1).value;\n }\n\n // /**\n // * 1. 全局向前遍历 (不分类)\n // * 从栈顶开始,沿着全局链条向栈底遍历\n // */\n // forEach(callback: (value: T, types: number) => any): void {\n // let current = this.top;\n\n // while (current !== null) {\n // // 执行回调,如果返回 false 则立即停止\n // const shouldBreak = callback(current.value, current.types);\n // if (shouldBreak) break;\n\n // current = current.prevGlobal;\n // }\n // }\n\n // /**\n // * 2. 按类别向前遍历\n // * 仅遍历属于指定类别 cat 的节点\n // */\n // forEachByType(cat: number, callback: (value: T) => any): void {\n // // 从该类别的当前“顶端”节点开始\n // let current = this.typeTops[cat];\n\n // while (current) {\n // const shouldBreak = callback(current.value);\n // if (shouldBreak) break;\n\n // // 关键点:直接跳向该节点记录的“上一个同类节点”\n // // 这比遍历全局栈再筛选类别要快得多 (O(m) vs O(n))\n // current = current.prevByType[cat];\n // }\n // }\n}\n","import { Tokenizer } from './tokenizer';\nimport {\n $,\n deepSignal,\n effect,\n getPulling,\n Keys,\n runWithPulling,\n scope,\n setPulling,\n shareSignal,\n Signal,\n Store,\n toRaw\n} from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CondBit,\n FragmentNode,\n IfNode,\n IsAnchor,\n LogicalBit,\n LogicNode,\n FakeType,\n NodeSort,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType,\n TokenizerSwitcherBit,\n ForNode,\n ForItemNode,\n Token\n} from './type';\nimport { BaseEvent, jsVarRegexp } from 'bobe-shared';\nimport { MultiTypeStack } from './typed';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & LogicalBit;\n }\n\n ctx: ProgramCtx;\n rootComponent: ComponentNode | null = null;\n\n program(root: any, componentNode?: ComponentNode, before?: any, ctxProvider?: any) {\n // 首屏渲 app 组件需要创建对象\n this.rootComponent = componentNode;\n\n this.tokenizer.nextToken();\n const stack = new MultiTypeStack<StackItem>();\n stack.push({ node: root, prev: null }, NodeSort.Real);\n stack.push(\n { node: componentNode, prev: null },\n NodeSort.Component | NodeSort.CtxProvider | NodeSort.TokenizerSwitcher\n );\n if (ctxProvider) {\n stack.push(\n { node: ctxProvider, prev: null },\n (ctxProvider.__logicType & LogicalBit ? NodeSort.Logic : 0) | NodeSort.CtxProvider\n );\n }\n\n const ctx = (this.ctx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n });\n\n const rootPulling = getPulling();\n while (1) {\n // 子 tokenizer 退出,代表子组件逻辑结束\n if (this.tokenizer.isEof()) {\n if (!ctx.prevSibling) ctx.prevSibling = before;\n this.handleInsert(root, ctx.current, ctx.prevSibling, componentNode);\n break;\n }\n\n const token = this.tokenizer.token;\n // 下沉,创建 child0\n if (token.type & TokenType.Indent) {\n this.tokenizer.nextToken(); // token = ID\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n !ctx.current.__logicType\n ? NodeSort.Real\n : (ctx.current.__logicType & LogicalBit ? NodeSort.Logic : 0) |\n (ctx.current.__logicType & TokenizerSwitcherBit ? NodeSort.TokenizerSwitcher : 0) |\n (ctx.current.__logicType === FakeType.Component ? NodeSort.Component : 0) |\n NodeSort.CtxProvider\n );\n if (ctx.current.__logicType) {\n // 父节点是逻辑节点\n if (isLogicNode) {\n // 保证 if 子逻辑节点能被其 effect 管理\n setPulling(ctx.current.effect.ins);\n }\n }\n // 父节点是原生节点时才修改 ctx.prevSibling\n else {\n if (ctx.current) {\n ctx.realParent = ctx.current;\n }\n ctx.prevSibling = null;\n }\n ctx.current = this.declaration(ctx);\n continue;\n }\n // Token 不论指示找 下一个同级节点,还是 Dedent, 都将当前节点插入\n if (ctx.current) {\n // root 下第一个子节点应该插入在 before 之后\n if (stack.length === 2 && !ctx.prevSibling) {\n ctx.prevSibling = before;\n }\n this.handleInsert(ctx.realParent, ctx.current, ctx.prevSibling);\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n this.tokenizer.nextToken(); // token = ID | DEDENT\n const [{ node: parent, prev }, sort] = stack.pop();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.peekByType(NodeSort.Real);\n ctx.realParent = prevSameType?.node || root;\n }\n // 弹出非原生节点\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (sort & NodeSort.Logic) {\n // 找最近的 if for\n const parentLogic = stack.peekByType(NodeSort.Logic)?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tokenizer\n if (sort & NodeSort.TokenizerSwitcher) {\n const switcher = stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n this.tokenizer = switcher.tokenizer;\n }\n\n // 弹出 forItem\n if (parent.__logicType === FakeType.ForItem) {\n const { forNode } = parent as ForItemNode;\n const { i, arr, snapshot } = forNode;\n if (i + 1 < arr.length) {\n // 恢复后 token null, 下一个是 \\n, Indent\n this.tokenizer.resume(snapshot);\n this.tokenizer.nextToken(); // token = \\n\n this.tokenizer.nextToken(); // token = Indent\n ctx.prevSibling = parent;\n ctx.current = forNode.children[++forNode.i];\n continue;\n }\n // 正常弹出 current = for node\n ctx.prevSibling = forNode.prevSibling;\n ctx.current = forNode;\n continue;\n }\n }\n ctx.prevSibling = prev;\n ctx.current = parent;\n }\n // 下一个是 同级节点\n else {\n ctx.prevSibling = ctx.current || ctx.prevSibling;\n ctx.current = this.declaration(ctx);\n }\n }\n return componentNode;\n }\n\n insertAfterAnchor(name = 'anchor') {\n const { realParent, prevSibling, stack, before } = this.ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor(name);\n this.ctx.prevSibling = stack.length === 2 && !prevSibling ? before : prevSibling;\n this.handleInsert(realParent, afterAnchor, prevSibling);\n return afterAnchor;\n }\n\n /** 处理\n * 是逻辑 是普通\n * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点\n * 子节点 仅插入到父逻辑节点 将本节点插入父节点\n * 理论上父节点不能是一个 逻辑节点,遇到if 时 Terp 会重新执行 program 这种情况下,会指定 root 为真实 dom\n */\n handleInsert(parent: any, child: any, prev: any, parentComponent?: any) {\n // 父 是 逻辑节点\n if (parentComponent) {\n // parentComponent.directList.push(child);\n }\n // 子 普通节点\n if (!child.__logicType) {\n // 前置节点空 或 普通节点\n if (!prev || !prev.__logicType) {\n this.insertAfter(parent, child, prev);\n }\n // 前置节点是逻辑节点,必定有 after\n else {\n const before = prev.realAfter;\n this.insertAfter(parent, child, before);\n }\n }\n // 子 是 逻辑节点\n else {\n const childCmp: LogicNode = child;\n childCmp.realParent = parent;\n // 前置 -> 逻辑节点\n if (prev?.__logicType) {\n // forItem 应该使用 forNode 的 after\n childCmp.realBefore = prev.forNode ? prev.forNode.realAfter : prev.realAfter;\n }\n // 前置 -> 普通节点\n else {\n childCmp.realBefore = prev;\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 * <declaration> ::= <tagName=token> <headerLine> <extensionLines>\n * */\n declaration(ctx: ProgramCtx) {\n const [hookType, value] = this.tokenizer._hook({});\n let _node: any;\n if (value === 'if' || value === 'else' || value === 'fail') {\n return this.condDeclaration(ctx);\n } else if (value === 'for') {\n return this.forDeclaration();\n } else if (hookType) {\n const data = this.getData();\n // 静态 1. Component,2. bobe 返回的 render 方法\n if (hookType === 'static') {\n // 传组件 class 或 片段\n if (typeof value === 'function') {\n _node = this.componentOrFragmentDeclaration(value, ctx);\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 valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n const val = data[Keys.Raw][value];\n if (typeof val === 'function') {\n _node = this.componentOrFragmentDeclaration(val, ctx);\n }\n // 字符\n else {\n const str = valueIsMapKey ? value : this.getFn(data, value);\n _node = this.createNode('text');\n this.onePropParsed(data, _node, 'text', str, valueIsMapKey, false);\n }\n }\n } else {\n _node = this.createNode(value);\n }\n this.tokenizer.nextToken(); // 跳过 node 本身,token -> id\n this.headerLine(_node);\n this.extensionLines(_node);\n // 组件用完,切换回 真实node 的方法\n if (_node.__logicType & TokenizerSwitcherBit) {\n this.onePropParsed = this.oneRealPropParsed;\n this.tokenizer = _node.tokenizer;\n }\n return _node;\n }\n\n forDeclaration() {\n const arrExp = this.tokenizer.nextToken().value as string;\n this.tokenizer.nextToken(); // 分号\n const itemToken = this.tokenizer.nextToken(); // item 表达式\n const isDestruct = itemToken.type === TokenType.InsertionExp;\n let itemExp: string | ((value: any) => any) = itemToken.value as string;\n if (isDestruct) {\n itemExp = '{' + itemExp + '}';\n const vars = itemExp.match(jsVarRegexp).join(',');\n itemExp = new Function('item', `let ${vars}; (${itemExp}=item); return {${vars}};`) as any;\n }\n let indexName: string, keyExp: string;\n while (this.tokenizer.code[this.tokenizer.i] !== '\\n') {\n const next = this.tokenizer.nextToken();\n if (next.type !== TokenType.Semicolon) {\n if (!indexName) {\n indexName = next.value as string;\n } else {\n keyExp = next.value as string;\n }\n }\n }\n const owner = this.ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const prevSibling = this.ctx.prevSibling;\n const forNode: ForNode = {\n __logicType: FakeType.For,\n snapshot: this.tokenizer.snapshot(['dentStack', 'isFirstToken']),\n realParent: this.ctx.realParent,\n prevSibling,\n realBefore: prevSibling?.realAfter || prevSibling,\n realAfter: null,\n arr: null,\n itemExp,\n indexName,\n getKey: null,\n children: [],\n effect: null,\n owner,\n i: 0\n };\n if (keyExp) {\n forNode.getKey = new Function('data', `let v;with(data){v=${keyExp}};return v;`) as any;\n }\n window['for1'] = forNode;\n\n const data = this.getData();\n\n const cells = data[Keys.Meta].cells;\n const hasArrExpKey = Reflect.has(data[Keys.Raw], arrExp);\n const arrSignal = hasArrExpKey\n ? // 有 key 直接拿\n (data[arrExp], cells.get(arrExp))\n : // 无key\n $(this.getFn(data, arrExp));\n\n // 由于此处 snapshot 多配置了2个属性,更新渲染时 应该忽略这个两个属性\n forNode.realAfter = this.insertAfterAnchor('for-after');\n\n // 去除 dentStack 和 isFirstToken\n const { dentStack, isFirstToken, ...snapshotForUpdate } = forNode.snapshot;\n\n // TODO: 更新逻辑\n let isFirstRender = true;\n // TODO: effect 重新执行时,内部的 effect 自动销毁,包括 dom setProps 无法生效了\n forNode.effect = effect(() => {\n let arr: any[] = (forNode.arr = arrSignal.v);\n // 订阅 iter\n arr[Keys.Iterator];\n // 使用原始数组避免 index 依赖\n arr = toRaw(arr);\n const children = forNode.children;\n // 首屏渲染\n if (isFirstRender) {\n const len = arr.length;\n for (let i = len; i--; ) {\n const nextItem = children[i + 1];\n const item = this.createForItem(forNode, i, data);\n const anchor = this.insertAfterAnchor('for-item-after');\n item.realAfter = anchor;\n if (nextItem) {\n nextItem.realBefore = anchor;\n }\n item.realParent = forNode.realParent;\n children[i] = item;\n }\n const firstInsert = children[0];\n // 有子项进行计算\n if (firstInsert) {\n firstInsert.realBefore = forNode.realBefore;\n this.tokenizer.nextToken(); // 是 NewLine\n this.tokenizer.nextToken(); // 是 Indent\n }\n // 没有子项,跳过\n else {\n this.tokenizer.skip();\n }\n }\n // 更新渲染\n else {\n const oldLen = children.length;\n const newLen = arr.length;\n const minLen = Math.min(oldLen, newLen);\n const newChildren: ForItemNode[] = [];\n if (!forNode.getKey) {\n // 删除\n if (newLen < oldLen) {\n for (let i = oldLen - 1; i >= newLen; i--) {\n const child = children[i];\n this.removeLogicNode(child);\n this.remove(child.realAfter);\n // 释放删除项 effect\n child.effect();\n }\n }\n // 新增\n if (oldLen < newLen) {\n const lastAfter = children.at(-1)?.realAfter || forNode.realBefore;\n for (let i = newLen - 1; i >= oldLen; i--) {\n const item = this.createForItem(forNode, i, data);\n newChildren[i] = item;\n const nextItem = newChildren[i + 1];\n const anchor = this.createAnchor('for-item-after');\n this.insertAfter(forNode.realParent, anchor, lastAfter);\n item.realAfter = anchor;\n if (nextItem) {\n nextItem.realBefore = anchor;\n }\n item.realParent = forNode.realParent;\n this.tokenizer = owner.tokenizer;\n /**\n * resume 后 token = null, 下个字符是 \\n\n */\n this.tokenizer.resume(snapshotForUpdate);\n // 解析到缩进小于 base 时自动 eof\n this.tokenizer.useDedentAsEof = false;\n runWithPulling(() => {\n this.program(forNode.realParent, forNode.owner, lastAfter, item);\n }, item.effect.ins);\n }\n const firstInsert = newChildren[oldLen];\n if (firstInsert) {\n firstInsert.realBefore = lastAfter;\n }\n }\n for (let i = minLen; i--; ) {\n const child = children[i];\n newChildren[i] = child;\n if (typeof itemExp === 'string') {\n child.data[itemExp] = arr[i];\n } else {\n Object.assign(child.data, itemExp(arr[i]));\n }\n }\n forNode.children = newChildren;\n }\n }\n isFirstRender = false;\n });\n return forNode.children[0] || forNode;\n }\n\n forItemId = 0;\n createForItem(forNode: ForNode, i: number, parentData: any) {\n let forItemNode: ForItemNode;\n /**\n * 考虑到 effect 是嵌套的,这种情况每次 forNodeEffect 更新会导致上次产生的内部 setPropsEffect 被自动释放\n * 这是响应式 effect 嵌套的默认特性\n * forNodeEffect(() => {\n * 这里通过 setPulling 模拟嵌套 effect\n * setPropsEffect(() => {\n * })\n * })\n * 因此我们需要让情况变成这样,内部的 effect 交由 forItemNode.effect 接管\n * 这个 scope 是全局的,即指定了参数 parentScope = null\n * 这样外部的 effect 不再自动释放 setPropsEffect\n * 这么的目的是我们能在 diff 过程中手动控制释放 forItemNode.effect\n * globalScope(() => {\n * setPropsEffect(() => {\n * })\n * })\n *\n * 1. runWithPulling 避免 scope 被 effect 收集\n * 2. scope 保证 signal 被 scope 管理\n */\n const effect = scope(() => {}, null);\n\n // 考虑到生成每项数据需要依赖原始数组,因此无法放在 scope 里\n const { arr, itemExp, indexName, getKey } = forNode;\n let data: Record<any, any>;\n if (typeof itemExp === 'string') {\n data = $<Record<any, any>>(\n indexName\n ? {\n [itemExp]: arr[i],\n [indexName]: i\n }\n : {\n [itemExp]: arr[i]\n }\n );\n } else {\n const rawData = itemExp(arr[i]);\n if (indexName) {\n rawData[indexName] = i;\n }\n data = $<Record<any, any>>(rawData);\n }\n\n Object.setPrototypeOf(data, parentData);\n\n forItemNode = {\n id: this.forItemId++,\n __logicType: FakeType.ForItem,\n realParent: null,\n realBefore: null,\n realAfter: null,\n forNode,\n key: getKey?.(data),\n effect: null,\n data\n };\n forItemNode.effect = effect;\n return forItemNode;\n }\n\n getData() {\n const { node } = this.ctx.stack.peekByType(NodeSort.CtxProvider);\n return node.data || node.owner.data;\n }\n\n /**\n * key 元素,组件的 key\n * value\n * 1. 静态类型值\n * 2. 插值计算 函数,可以考虑 使用 effect 或 computed 做处理\n *\n * mapKey 映射, 对应子组件的属性\n * */\n onePropParsed(\n data: Store,\n node: any,\n key: string,\n value: any,\n valueIsMapKey: boolean,\n isFn: boolean,\n hookI?: number\n ) {\n if (isFn) {\n this.setProp(node, key, value, hookI);\n } else 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 = 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 oneRealPropParsed: Interpreter['onePropParsed'] = this.onePropParsed.bind(this);\n\n componentOrFragmentDeclaration(ComponentOrRender: BobeUI | typeof Store, ctx: ProgramCtx) {\n // 先进行 attr 映射,或建立 signal 连接,才能开始 render\n // 必须等待 attr 解析完毕\n let Component: typeof Store, render: BobeUI, child: any;\n\n const isCC = (ComponentOrRender as any).prototype instanceof Store;\n if (isCC) {\n Component = ComponentOrRender as any;\n child = Component.new();\n } else {\n render = ComponentOrRender as BobeUI;\n const boundStore = render.boundStore;\n // 使用原型链来继承 store 的数据\n child = deepSignal({}, getPulling(), true);\n Object.setPrototypeOf(child, boundStore);\n }\n\n const node: ComponentNode = {\n __logicType: isCC ? FakeType.Component : FakeType.Fragment,\n realParent: ctx.realParent,\n realBefore: null,\n realAfter: null,\n data: child,\n tokenizer: render ? render(true) : (child['ui'] as BobeUI)(true)\n };\n this.onePropParsed = (data, _, key, value, valueIsMapKey, isFn, hookI) => {\n if (isFn) {\n child[Keys.Raw][key] = value;\n }\n // key 映射\n else if (valueIsMapKey) {\n shareSignal(data, value, child, key);\n }\n // 动态值内置 computed 处理\n else {\n const meta = child[Keys.Meta];\n const cells: Map<string, Signal> = meta.cells;\n if (typeof value === 'function') {\n const computed = $(value);\n cells.set(key, computed);\n child[Keys.Raw][key] = undefined;\n }\n // 静态数据\n else {\n cells.set(key, { v: value } as Signal);\n child[Keys.Raw][key] = value;\n }\n }\n };\n node.realAfter = this.insertAfterAnchor('component-after');\n return node;\n }\n getFn(data: any, expression: string | number) {\n return new Function('data', `let v;with(data){v=${expression}};return v;`).bind(undefined, data);\n }\n // TODO: 优化代码逻辑,拆分 if elseif else\n condDeclaration(ctx: ProgramCtx) {\n const { prevSibling } = ctx;\n const keyWord = this.tokenizer.token;\n const expToken = this.tokenizer.condExp(); // keyWord => exp\n const value = expToken.value as string | number;\n const isElse = keyWord.value === 'else';\n const isIf = keyWord.value === 'if';\n const preIsCond = prevSibling?.__logicType & CondBit;\n const data = this.getData();\n // @ts-ignore\n const noCond = value === true;\n const valueIsMapKey = !noCond && Reflect.has(data[Keys.Raw], value);\n const owner = ctx.stack.peekByType(NodeSort.TokenizerSwitcher)?.node;\n const ifNode: IfNode = {\n __logicType: isElse ? FakeType.Else : isIf ? FakeType.If : FakeType.Fail,\n // 此时 token 是 exp, 下次解析 从 \\n 开始\n snapshot: this.tokenizer.snapshot(),\n realParent: null,\n realBefore: null,\n realAfter: null,\n condition: null,\n preCond: preIsCond ? prevSibling : null,\n isFirstRender: true,\n effect: null,\n owner\n };\n let signal: Signal;\n\n switch (keyWord.value) {\n case 'if':\n if (valueIsMapKey) {\n // 确保 signal 已生成\n runWithPulling(() => data[value], null);\n // 拿到 signal\n const { cells } = data[Keys.Meta];\n signal = cells.get(value);\n } else {\n const fn = this.getFn(data, value);\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\n }\n break;\n case 'else':\n // 纯 else\n if (noCond) {\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return true;\n });\n }\n // else if xxx\n else {\n const fn = valueIsMapKey ? null : this.getFn(data, value);\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n // else 的条件判断应该停止在第一个访问到的 if 节点\n if (point.__logicType === FakeType.If) {\n break;\n }\n point = point.preCond;\n }\n return valueIsMapKey ? data[value] : fn();\n });\n }\n break;\n case 'fail':\n signal = $(() => {\n let point = ifNode.preCond;\n while (point) {\n if (point.condition.v) {\n return false;\n }\n point = point.preCond;\n }\n return true;\n });\n break;\n default:\n break;\n }\n\n ifNode.condition = signal;\n // 不论是否执行 if 都应该插入 anchor 节点用于后续\n ifNode.realAfter = this.insertAfterAnchor(`${keyWord.value}-after`);\n\n ifNode.effect = effect(\n ({ val }) => {\n // 如果值是 true 则直接放行让下面的节点自然执行插入\n if (val) {\n if (ifNode.isFirstRender) {\n this.tokenizer.nextToken(); // token = NEWLINE\n this.tokenizer.nextToken(); // token = ID\n }\n // 更新渲染\n else {\n // 切换到对应 Switcher 的 tokenizer\n this.tokenizer = ifNode.owner.tokenizer;\n /**\n * resume 后 token = null, 下个字符是 \\n\n */\n this.tokenizer.resume(ifNode.snapshot);\n this.tokenizer.useDedentAsEof = false;\n\n // 由于首屏渲染直接放行,导致 if 子节点首屏产生的 effect 不能被管理\n // 在 effect 中创建的子组件 sub effect 能被管理\n // 当 if = false 时,不需要执行销毁子 effect 操作\n // 因为当外部 effect 重新执行时,上次尝试的 sub effect 自动销毁\n // 前提是 sub effect 是嵌套执行的\n this.program(ifNode.realParent, ifNode.owner, ifNode.realBefore, ifNode);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n // 此时 token 是 condition, i => \\n\n this.tokenizer.skip(); // skipStr\n }\n // 更新渲染,删除所有节点\n else {\n this.removeLogicNode(ifNode);\n }\n }\n ifNode.isFirstRender = false;\n },\n [signal]\n );\n return ifNode;\n }\n\n removeLogicNode(node: LogicNode) {\n const { realBefore, realAfter, realParent } = node;\n let point = realBefore ? this.nextSib(realBefore) : this.firstChild(realParent);\n while (point !== realAfter) {\n const next = this.nextSib(point);\n this.remove(point, realParent, realBefore);\n point = next;\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) === 0) {\n return;\n }\n // 开始解析 attributeList\n this.tokenizer.nextToken(); // PIPE\n this.attributeList(_node);\n // 文件结束了,通常不会发生\n if ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\n return;\n }\n // 换行\n this.tokenizer.nextToken(); // NEWLINE\n }\n }\n\n /**\n * 首行:\n * 节点名称 + 属性列表 + 换行\n * <headerLine> ::= <attributeList> NEWLINE\n */\n headerLine(_node: any) {\n this.attributeList(_node);\n this.tokenizer.nextToken(); // NEWLINE\n }\n\n /**\n * 属性列表:\n * 可以是空的,或者包含多个属性\n * <attributeList> ::= <attribute> <attributeList>\n * | ε\n *\n * <attribute> ::= <key> = <value>\n * 1. 普通节点 执行 setProps 🪝\n * 2. 组件节点 收集映射关系,或 产生 computed\n */\n attributeList(_node: any) {\n let key: string, eq: any;\n const data = this.getData();\n while ((this.tokenizer.token.type & TokenType.NewLine) === 0) {\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, hookI] = this.tokenizer._hook({});\n const rawVal = data[Keys.Raw][value];\n const isFn = typeof rawVal === 'function';\n // 动态的要做成函数\n if (hookType === 'dynamic') {\n const valueIsMapKey = Reflect.has(data[Keys.Raw], value);\n const fn = isFn ? rawVal : valueIsMapKey ? value : this.getFn(data, value);\n this.onePropParsed(data, _node, key, fn, valueIsMapKey, isFn, hookI);\n }\n // 静态\n else if (hookType === 'static') {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n // 基础数据字面量\n else {\n this.onePropParsed(data, _node, key, value, false, isFn, hookI);\n }\n key = null;\n eq = null;\n }\n this.tokenizer.nextToken();\n }\n }\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 nextSibling: null\n };\n }\n\n nextSib(node: any) {\n return node.nextSibling;\n }\n\n firstChild(node: any) {\n return node.firstChild;\n }\n\n createAnchor(name: string) {\n return {\n name,\n nextSibling: null\n };\n }\n\n insertAfter(parent: any, node: any, prev: any) {\n return this.defaultInsert(parent, node, prev);\n }\n defaultInsert(parent: any, node: any, prev: any) {\n if (prev) {\n const next = prev.nextSibling;\n prev.nextSibling = node;\n node.nextSibling = next;\n } else {\n const next = parent.firstChild;\n parent.firstChild = node;\n node.nextSibling = next;\n }\n }\n\n remove(node: any, parent?: any, prev?: any) {\n return this.defaultRemove(node, parent, prev);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(node: any, parent: any, prevSibling: any) {\n const next = node.nextSibling;\n if (prevSibling) {\n prevSibling.nextSibling = next;\n }\n if (parent.firstChild === node) {\n parent.firstChild = next;\n }\n }\n\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n}\n","import { isNum, matchIdStart, matchIdStart2, Queue } from 'bobe-shared';\nimport { BaseType, Hook, HookProps, HookType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** Eof 标识符的值 */\n static EofId = `__EOF__${Date.now()}`;\n static DedentId = `__DEDENT__${Date.now()}`;\n\n /** 当前 token */\n token!: Token;\n /** 回车后需要判断缩进 */\n needIndent = false;\n /** 用于跳过第一个节点前的空白字符串,以及生成基础缩进 */\n isFirstToken = true;\n /** 代码 */\n code: string;\n /** 记录历史缩进的长度,相对于行首 */\n dentStack: number[] = [0];\n /** 当前字符 index */\n i = 0;\n // TODO: 生产环境不需要这个,导致不必要的内存占用\n handledTokens: Token[] = [];\n /**\n * 有些标识符能产生多个 token\n * 例如 dedent\n * parent1\n * child\n * subChild\n * parent2 <- 产生两个 dedent\n */\n waitingTokens = new Queue<Token>();\n\n constructor(\n private hook: Hook,\n public useDedentAsEof: boolean\n ) {\n if (useDedentAsEof) {\n this.setToken(TokenType.Indent, '');\n this.isFirstToken = true;\n // this.waitingTokens.push({\n // type: TokenType.Indent,\n // typeName: TokenType[TokenType.Indent],\n // value: ''\n // })\n }\n }\n consume() {\n const token = this.token;\n this.nextToken();\n return token;\n }\n // /** 恢复至某一个现场,进行 token 重算 */\n resume(_snapshot: ReturnType<Tokenizer['snapshot']>) {\n this.token = undefined;\n this.needIndent = false;\n this.isFirstToken = true;\n this.dentStack = [0];\n Object.assign(this, _snapshot);\n }\n snapshot(keys?: (keyof Tokenizer)[]): Partial<Tokenizer> {\n const snap = {\n i: this.i,\n waitingTokens: this.waitingTokens.clone()\n };\n if (keys) {\n for (const k of keys) {\n snap[k] = this[k];\n if (k === 'dentStack') {\n snap[k] = this[k].slice();\n }\n }\n }\n return snap;\n }\n\n skip() {\n const logicDentLen = this.dentStack[this.dentStack.length - 1];\n let needIndent = false;\n /** \\n 是为了弥补 if 节点 consume condition 后,已将 token 设置成回车 */\n let skipFragment = ``;\n this.token = undefined;\n while (1) {\n const char = this.code[this.i];\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.i++;\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.i++;\n continue;\n }\n\n needIndent = false;\n // 此时已经指到一个非 tab 的字符\n const { value, isEmptyLine } = this.getDentValue();\n const currLen = value.length;\n if (isEmptyLine) continue;\n if (currLen > logicDentLen) {\n skipFragment += value;\n }\n // 找到与条件节点同级或更短的缩进了,结束。\n else {\n // skipFragment += `\\n${Tokenizer.EofId}`;\n // 一直找到最小\n for (let i = this.dentStack.length - 1; i >= 0; i--) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n\n // 大于\n if (currLen > expLen) {\n throw SyntaxError(`缩进错误,缩进长度不匹配`);\n }\n\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n break;\n }\n\n this.dentStack.pop();\n\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n } else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n break;\n }\n }\n if (!this.token) {\n this.nextToken();\n }\n return skipFragment;\n }\n\n setCode(code: string) {\n // 保证开头结尾能正确计算\n this.code = '\\n' + code.trimEnd() + `\\n${Tokenizer.EofId}`;\n }\n\n tokenize() {\n do {\n this.nextToken();\n console.log('token:', TokenType[this.token?.type], JSON.stringify(this.token?.value || ''));\n } while (!this.isEof());\n }\n\n isEof() {\n // 刚开始时 token 不存在\n if (!this.token) return false;\n return this.token.type & TokenType.Identifier && this.token.value === Tokenizer.EofId;\n // return this.code[this.i] === undefined;\n }\n\n private setToken(type: TokenType, value: BaseType) {\n this.token = {\n type,\n typeName: TokenType[type],\n value\n };\n this.isFirstToken = false;\n }\n\n public nextToken(): Token {\n try {\n // 已遍历到文件结尾\n if (this.isEof()) {\n return this.token;\n }\n this.token = undefined as any;\n if (this.waitingTokens.len) {\n const item = this.waitingTokens.shift()!;\n this.setToken(item.type, item.value);\n return this.token;\n }\n outer: while (1) {\n if (this.needIndent) {\n this.dent();\n // 遍历到当前标识符非 空白为止\n } else {\n const char = this.code[this.i];\n switch (char) {\n case '\\t':\n case ' ':\n // skip, 缩进通过 \\n 匹配来激活 needIndent\n break;\n // 找后续所有 newLine\n case '\\n':\n this.newLine();\n // 回车后需要判断缩进\n this.needIndent = true;\n break;\n case '=':\n this.assignment();\n break;\n case '|':\n this.pipe();\n break;\n case \"'\":\n case '\"':\n this.str(char);\n break;\n case '{':\n const braceToken = this.brace();\n this.setToken(TokenType.InsertionExp, braceToken);\n break;\n case '$':\n const handled = this.dynamic(char);\n if (handled) break;\n case ';':\n this.setToken(TokenType.Semicolon, ';');\n break;\n default:\n if (isNum(char)) {\n this.number(char);\n break;\n }\n if (typeof char === 'string' && matchIdStart2(char, 0)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.i++;\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\n return this.token;\n } finally {\n this.handledTokens.push(this.token);\n }\n }\n\n condExp() {\n let value = '';\n this.token = null;\n while (1) {\n const char = this.code[this.i];\n if (char === '\\n') {\n break;\n }\n value += char;\n this.i++;\n }\n value = value.trim();\n this.setToken(TokenType.Identifier, value || true);\n return this.token;\n }\n\n /**\n * 解析到 for 时使用这个方法获取 for 后方的子表达式\n * 表达式通过 “;” 分割\n * // 最多可有三个表达式\n * for arr ; item index; item.key\n * @returns {boolean} 是否含有 key\n */\n public forLoopSubExp() {\n this.token = null;\n let value = '';\n let count = 0;\n while (1) {\n const char = this.code[this.i];\n const isSemicolon = char === ';';\n if (isSemicolon || char === '\\n') {\n value = value.trim();\n if (!this.token) {\n this.setToken(TokenType.Identifier, value);\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value\n });\n }\n value = '';\n count++;\n if (count > 3) {\n throw SyntaxError(`for 循环最多可包含三个表达式, 分别为 arr ; item index [; key]`);\n }\n // 匹配到回车退出\n if (!isSemicolon) return count === 3;\n } else {\n value += char;\n }\n this.i++;\n }\n }\n\n private assignment() {\n this.setToken(TokenType.Assign, '=');\n }\n private pipe() {\n this.setToken(TokenType.Pipe, '|');\n }\n private dynamic(char: string) {\n let nextC = this.code[this.i + 1];\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.i++;\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n if (nextC === '{') {\n innerBrace++;\n }\n\n if (nextC === '}') {\n // 内部无左括号,说明完成匹配 TODO: 考虑js注释中的括号可能导致匹配错误\n if (!innerBrace) {\n break;\n }\n innerBrace--;\n }\n }\n this.setToken(TokenType.Identifier, value);\n return true;\n }\n\n private brace() {\n let inComment: string,\n inString: string,\n count = 0,\n value = '',\n backslashCount = 0; // 用于记录连续的反斜杠数量\n while (1) {\n const char = this.code[this.i];\n const nextChar = this.code[this.i + 1];\n\n // 1. 处理注释状态退出\n if (inComment === 'single' && char === '\\n') {\n inComment = null;\n } else if (inComment === 'multi' && char === '*' && nextChar === '/') {\n inComment = null;\n value += this.code[this.i];\n this.i++;\n }\n // 2. 如果不在注释中,处理字符串状态\n else if (inString) {\n // 退出字符串\n if (char === inString && backslashCount % 2 === 0) {\n inString = null;\n }\n backslashCount = char === '\\\\' ? backslashCount + 1 : 0;\n } else {\n // 3. 进入注释或字符串状态\n if (char === '/' && nextChar === '/') {\n inComment = 'single';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.code[this.i]; // 跳过 / 号\n this.i++;\n } else if (char === \"'\" || char === '\"' || char === '`') {\n inString = char;\n }\n // 4. 只有在非字符串、非注释状态下才计数\n else if (char === '{') {\n count++;\n } else if (char === '}') {\n count--;\n }\n }\n\n if (count === 0 && inString == null && inComment == null) {\n return value.slice(1);\n }\n value += this.code[this.i];\n this.i++;\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.i++;\n }\n // Program 希望第一个 token 一定是 node 节点\n if (this.isFirstToken) {\n return;\n }\n this.setToken(TokenType.NewLine, value);\n }\n private getDentValue() {\n let value = '';\n let nextC;\n let isEmptyLine = false;\n // 构建缩进字符串\n while (1) {\n const nextChar = this.code[this.i];\n\n switch (nextChar) {\n case '\\t':\n nextC = this.Tab;\n break;\n case ' ':\n nextC = ' ';\n break;\n case '\\n':\n nextC = '\\n';\n break;\n default:\n nextC = '';\n break;\n }\n\n // \\n 空白 \\n 的情况,这行不算\n if (nextC === '\\n') {\n isEmptyLine = true;\n break;\n }\n if (!nextC) {\n break;\n }\n value += nextC;\n this.i++;\n }\n return {\n value,\n isEmptyLine\n };\n }\n private dent() {\n const { value, isEmptyLine } = this.getDentValue();\n if (isEmptyLine) {\n // 这种情况下需要 next ,即后续从 \\n 重新开始匹配\n this.needIndent = true;\n return;\n }\n // 比较长度,比上个 indent 长,缩进,比上个 indent 短,dedent\n this.needIndent = false;\n // 期望 firstToken 是 node,所以这里只要修改第一个节点的基础偏移值即可\n if (this.isFirstToken) {\n this.dentStack[0] = value.length;\n return;\n }\n let currLen = value.length;\n const indentHasLen = currLen > 0;\n const prevLen = this.dentStack[this.dentStack.length - 1];\n if (currLen > prevLen) {\n this.dentStack.push(currLen);\n this.setToken(TokenType.Indent, currLen);\n return indentHasLen;\n }\n if (currLen < prevLen) {\n // 一直找到最小\n for (let i = this.dentStack.length; i--; ) {\n const expLen = this.dentStack[i];\n // 等于\n if (currLen === expLen) break;\n // 夹在两者说明缩进大小有问题\n if (currLen > expLen) {\n throw SyntaxError('缩进大小不统一');\n }\n // 小于 expLen 检查是否是基础缩进\n if (this.shorterThanBaseDentEof()) {\n return;\n }\n this.dentStack.pop();\n if (!this.token) {\n this.setToken(TokenType.Dedent, String(expLen));\n }\n // 多余的 dent 缓存在 waitingTokens\n else {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: String(expLen)\n });\n }\n }\n return indentHasLen;\n }\n // 同级则无视\n return indentHasLen;\n }\n\n private shorterThanBaseDentEof() {\n const yes = this.dentStack.length === 1;\n if (yes) {\n if (!this.token) {\n // 子 tokenizer 使用 Dedent 推出 component 节点后,将 tokenizer 切换为 上一个 TokenSwitcher 的 tkr\n if (this.useDedentAsEof) {\n this.setToken(TokenType.Dedent, '');\n } else {\n this.setToken(TokenType.Identifier, Tokenizer.EofId);\n }\n } else {\n if (this.useDedentAsEof) {\n this.waitingTokens.push({\n type: TokenType.Dedent,\n typeName: TokenType[TokenType.Dedent],\n value: ''\n });\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\n });\n }\n }\n }\n return yes;\n }\n\n private identifier(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (typeof nextC !== 'string' || !matchIdStart2(nextC, 0)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n if (value === Tokenizer.EofId && this.useDedentAsEof) {\n this.setToken(TokenType.Dedent, '');\n return;\n }\n\n let realValue =\n value === 'null'\n ? null\n : value === 'undefined'\n ? undefined\n : value === 'false'\n ? false\n : value === 'true'\n ? true\n : value;\n this.setToken(TokenType.Identifier, realValue);\n }\n private str(char: string) {\n let value = '';\n let nextC;\n let continuousBackslashCount = 0;\n while (1) {\n nextC = this.code[this.i + 1];\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.i++;\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n value += nextC;\n }\n this.setToken(TokenType.Identifier, value);\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.code[this.i + 1];\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.i++;\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 模板字符串动态节点索引 */\n hookI = 0;\n _hook = (props: Partial<HookProps>): [HookType | undefined, any, hookI?: any] => {\n const value = this.token.value;\n const isDynamicHook = this.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 // TODO: 去除 this.hookI, hookI 由本函数返回\n return [hookType, res, hookI];\n }\n // 动态插值 `{xxx}`\n else if (isDynamicHook) {\n return [hookType, value];\n }\n // 普通值\n return [hookType, value];\n };\n\n init(fragments: string | string[]) {\n if (typeof fragments === 'string') {\n this.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.setCode(code + fragments[fragments.length - 1]);\n }\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, ComponentNode, CustomRenderConf, FakeType } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(isSub: boolean) {\n const tokenizer = new Tokenizer(({ i }) => {\n return values[i];\n }, isSub);\n tokenizer.init(Array.from(fragments));\n return tokenizer;\n };\n ui.boundStore = Store.Current;\n return ui;\n}\n\n// render -> options\nexport function customRender(option: CustomRenderConf) {\n // 保存 options\n return function render<T>(Ctor: typeof Store, root: any) {\n const store = Ctor.new();\n const tokenizer: Tokenizer = store['ui'](false);\n const terp = new Interpreter(tokenizer);\n terp.config(option);\n\n const componentNode: ComponentNode = {\n __logicType: FakeType.Component,\n realParent: root,\n data: store,\n tokenizer\n };\n\n terp.program(root, componentNode);\n // ui => bobe`` 返回的函数\n return [componentNode, store];\n };\n}\n"],"names":["TokenType","FakeType","NodeSort","BaseEvent","getPulling","setPulling","Keys","jsVarRegexp","$","effect","_a","toRaw","runWithPulling","scope","Store","deepSignal","shareSignal","Queue","isNum","matchIdStart2","ui"],"mappings":"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"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "bobe",
3
- "version": "0.0.19",
3
+ "version": "0.0.21",
4
4
  "main": "dist/bobe.cjs.js",
5
5
  "module": "dist/bobe.esm.js",
6
6
  "browser": "dist/bobe.umd.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "private": false,
9
9
  "dependencies": {
10
- "bobe-shared": "0.0.19",
11
- "aoye": "0.0.19"
10
+ "bobe-shared": "0.0.21",
11
+ "aoye": "0.0.21"
12
12
  },
13
13
  "devDependencies": {},
14
14
  "files": [