bobe 0.0.11 → 0.0.12

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":"bobe.esm.js","sources":["../src/type.ts","../src/terp.ts","../src/tokenizer.ts","../src/index.ts"],"sourcesContent":["import { Store } from 'aoye';\nimport type { Tokenizer } from './tokenizer';\nimport type { Interpreter } from './terp';\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<Interpreter, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter' | 'hook' | 'HookId' | 'data'>\n>;\nexport type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter'>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = { stack: StackItem[]; prevSibling: any };\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = (\n this: Store,\n options: CustomRenderConf,\n valOpt: TerpConf,\n root: any,\n after?: any\n) => ComponentNode;\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: 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 realParent: any;\n realBefore?: any;\n realAfter?: any;\n lastInserted?: any;\n};\n\nexport type FragmentNode = LogicNode & {};\nexport type ComponentNode = LogicNode & {\n store: Store;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};\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 ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n lastInserted;\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n // /** program 要挂载的父节点位置 */\n // root: any;\n // /** program 挂载的前置节点 */\n // anchor: any;\n\n program(root: any, before?: any) {\n const componentNode: ComponentNode = {\n __logicType: LogicType.Component,\n realParent: root,\n store: new Store()\n };\n this.tokenizer.consume();\n let prevSibling: any = null;\n let current: any;\n const stack: StackItem[] = [{ node: root, prev: prevSibling }];\n while (1) {\n if (this.tokenizer.isEof()) {\n this.handleInsert(root, current, prevSibling, componentNode);\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 stack.push({\n node: current,\n prev: prevSibling\n });\n current = this.declaration({ stack, prevSibling });\n prevSibling = null;\n continue;\n }\n // token 不是 Indent ,就是 同级节点 或 Dedent\n // 将之前产生的 current 添加到父节点\n if (current) {\n if (stack.length > 1) {\n const { node: parent } = stack[stack.length - 1];\n // 子节点是逻辑节点,其会通过自身 program 进行元素挂载\n this.handleInsert(parent, current, prevSibling);\n }\n // 处理 root 下的子节点\n else {\n if (!prevSibling) {\n prevSibling = before;\n }\n this.handleInsert(root, current, prevSibling, componentNode);\n }\n }\n // 下一个 token 是 Dedent\n if (this.tokenizer.token.type & TokenType.Dedent) {\n const DEDENT = this.tokenizer.consume();\n const { node: parent, prev } = stack.pop();\n prevSibling = prev;\n current = parent;\n }\n // 下一个是 同级节点\n else {\n prevSibling = current;\n current = this.declaration({ stack, prevSibling });\n }\n }\n componentNode.lastInserted = this.lastInserted;\n this.lastInserted = null;\n return componentNode;\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 // 前置节点是逻辑节点\n else {\n const before = prev.lastInserted;\n // const anchor = this.createAnchor();\n // // 逻辑 -> anchor -> child\n // this.insertAfter(parent, anchor, before);\n this.insertAfter(parent, child, before);\n prev.realAfter = child;\n }\n }\n // 子 是 逻辑节点\n else {\n const childCmp: LogicNode = child;\n childCmp.realParent = parent;\n // 前置节点空\n if (!prev) {\n const anchor = this.createAnchor();\n this.insertAfter(parent, anchor, prev);\n this.insertAfter(parent, child, anchor);\n childCmp.realBefore = anchor;\n }\n // 前置是逻辑节点\n else if (prev.__logicType) {\n const before = prev.lastInserted;\n const anchor = this.createAnchor();\n this.insertAfter(parent, anchor, before);\n this.insertAfter(parent, child, anchor);\n childCmp.realBefore = anchor;\n prev.realAfter = anchor;\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._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, ctx);\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 realParent: null\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, ctx: ProgramCtx) {\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 // 执行 program 时需要挂载到 parent\n const parent = ctx.stack[ctx.stack.length - 1].node;\n const prev = ctx.prevSibling;\n this.onePropParsed = prevOnePropParsed;\n const componentNode = (child['ui'] as BobeUI)(this.opt, { data: child }, parent, prev);\n tap.emit(TerpEvt.HandledComponentNode, componentNode);\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 realParent: null,\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 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 createAnchor() {\n return {\n name: 'anchor',\n nextSibling: null\n };\n }\n\n insertAfter(parent: any, node: any, prev: any) {\n this.lastInserted = node;\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 parent.firstChild = node;\n }\n }\n\n remove(parent: any, node: any, prevSibling: any) {\n return this.defaultRemove(parent, node, prevSibling);\n }\n // TODO: 默认改成 prevItem\n defaultRemove(parent: any, node: 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 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","import { isNum, Queue } from 'bobe-shared';\nimport { BaseType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** 匹配标识符 */\n IdExp = /[\\d\\w\\/]/;\n /** Eof 标识符的值 */\n static EofId = `__EOF__${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 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 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 dentLen = 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.char;\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.next();\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.next();\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 (value.length > dentLen) {\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 // 小于 expLen\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.char === undefined;\n }\n\n get char() {\n return this.code[this.i];\n }\n get prev() {\n return this.code[this.i - 1];\n }\n get after() {\n return this.code[this.i + 1];\n }\n\n private next() {\n const prev = this.code[this.i];\n this.i++;\n const curr = this.code[this.i];\n return [prev, curr] as [prev: string, curr: string];\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 private testId(value: string) {\n if (typeof value !== 'string') return false;\n return this.IdExp.test(value);\n }\n\n private nextToken() {\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 let { char } = this;\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\n if (this.testId(char)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.next();\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\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.after;\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.next();\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\n const nextChar = this.after;\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.next()[0]; // 跳过 * 号\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.next()[0]; // 跳过 / 号\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.next()[0]; // 跳过 / 号\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.next()[0];\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.after;\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\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.next();\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, String(currLen));\n return indentHasLen;\n }\n if (currLen < prevLen) {\n // 一直找到最小\n for (let i = this.dentStack.length - 2; i >= 0; i--) {\n const expLen = this.dentStack[i];\n const prevExpLen = this.dentStack[i + 1];\n // 夹在两者说明缩进大小有问题\n if (currLen > expLen && currLen < prevExpLen) {\n throw SyntaxError('缩进大小不统一');\n }\n // current <= expLen 反缩进\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 if (currLen === expLen) {\n break;\n }\n }\n return indentHasLen;\n }\n // 同级则无视\n return indentHasLen;\n }\n private identifier(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!this.testId(nextC)) {\n break;\n }\n value += nextC;\n this.next();\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.after;\n value += nextC;\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.next();\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n }\n this.setToken(TokenType.Identifier, JSON.parse(value.slice(0, -1) + '\"'));\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, CustomRenderConf } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(options, valueOpt, root, before) {\n const tokenizer = new Tokenizer();\n const cmp = new Interpreter(tokenizer);\n Object.assign(cmp, valueOpt);\n // 初始化\n cmp.config({\n ...options,\n hook({ i }) {\n return values[i];\n },\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n });\n cmp.init(Array.from(fragments));\n return cmp.program(root, before);\n };\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 // ui => bobe`` 返回的函数\n return [store['ui'](option, { data: store }, root), store];\n };\n}\n\n// const render = customRender({});\n// class App extends Store {\n// count = 10;\n// updateCount = () => {\n// this.count++;\n// };\n// ui = bobe`\n// node1 k1={count}\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// ${B} v=10\n// node3 foo='bar'\n// `;\n// }\n// class B extends Store {\n// readonly v = 1;\n// name = '😁';\n// updateName = () => {\n// this.name = '🤡';\n// };\n// ui = bobe`\n// bbb hello={v}\n// nb name={name}\n// `;\n// }\n\n// const root = {\n// name: 'root'\n// };\n// const [rootComponent, store] = render(App, root);\n// console.log(rootComponent);\n// console.log('------------------------------------------------------');\n\n// console.log(JSON.stringify(childToArray(root), null, 2));\n// store.updateCount();\n// console.log('------------------------------------------------------');\n\n// console.log(JSON.stringify(childToArray(root), null, 2));\n\nfunction childToArray(node) {\n const newNode: any = {};\n const children = [];\n let point = node.firstChild;\n\n while (point) {\n const item = childToArray(point);\n children.push(item);\n point = point.nextSibling;\n }\n\n for (const key in node) {\n if (key === 'firstChild' || key === 'lastChild' || key === 'nextSibling') {\n continue;\n }\n newNode[key] = node[key];\n }\n newNode.children = children;\n return newNode;\n}\n"],"names":["TokenType","LogicType","TerpEvt","__spreadProps","__spreadValues","ui"],"mappings":"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"}
1
+ {"version":3,"file":"bobe.esm.js","sources":["../src/type.ts","../src/typed-stack.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 type { TypedStack } from './typed-stack';\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 Real = 0b0000_0000_0000_0000_0000_0000_1000_0000\n}\n\nexport const Logical = LogicType.If | LogicType.ElseIf | LogicType.Else | LogicType.For;\n\nexport enum NodeType {\n Logic = Logical,\n Real = LogicType.Real,\n Component = LogicType.Component\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' | 'nextSib' | 'createAnchor' | 'insertAfter' | 'hook' | 'HookId' | 'data'>\n>;\nexport type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'createAnchor' | 'insertAfter'>;\n\nexport type Hook = (props: HookProps) => any;\n\nexport type HookType = 'dynamic' | 'static';\n\nexport type ProgramCtx = {\n stack: TypedStack<any, NodeType>;\n prevSibling: any;\n realParent: any;\n current: any;\n before: any;\n};\n\n/** 返回值是用户自定义的节点 */\nexport type BobeUI = (\n this: Store,\n options: CustomRenderConf,\n valOpt: TerpConf,\n root: any,\n after?: any\n) => ComponentNode;\n\nexport type StackItem = {\n /** 插入到 prev 后 */\n prev: any;\n /** 当前节点*/\n node: any;\n};\n\nexport type IfNode = LogicNode & {\n condition: Signal;\n isFirstRender: boolean;\n snapshot: ReturnType<Tokenizer['snapshot']>;\n effect: Dispose;\n};\n\nexport type LogicNode = {\n __logicType: LogicType;\n realParent: any;\n realBefore?: any;\n realAfter?: any;\n lastInserted?: any;\n};\n\nexport type FragmentNode = LogicNode & {};\nexport type ComponentNode = LogicNode & {\n store: Store;\n};\nexport type RootNode = LogicNode & {\n store: Store;\n};\n","/**\n * 节点包装单元的内部结构\n */\ninterface StackNode<T, K extends string|number> {\n data: T;\n type: K;\n prev: StackNode<T, K> | null; // 基础栈指向\n prevSameType: StackNode<T, K> | null; // 指向同类型的前一个包装单元\n}\n\nexport class TypedStack<T, K extends string|number> {\n private top: StackNode<T, K> | null = null;\n\n // 存储每种类型最近一次出现的包装单元引用\n // 使用 Record 来动态支持不同的类型标签\n private lastNodes: Partial<Record<K, StackNode<T, K> | null>> = {};\n length = 0;\n\n /**\n * @param rawNode 原始节点数据\n * @param type 节点类型\n */\n push(rawNode: T, type: K): void {\n const newNode: StackNode<T, K> = {\n data: rawNode,\n type: type,\n prev: this.top,\n prevSameType: this.lastNodes[type] ?? null\n };\n\n this.top = newNode;\n this.length++;\n this.lastNodes[type] = newNode;\n }\n\n /**\n * 出栈操作\n * @returns 原始节点数据或 null\n */\n pop(): T | null {\n if (!this.top) return null;\n\n const popped = this.top;\n\n // 弹栈时,恢复该类型的上一个记录点\n this.lastNodes[popped.type] = popped.prevSameType;\n this.top = popped.prev;\n this.length--;\n return popped.data;\n }\n\n /**\n * O(1) 获取栈顶节点的前一个同类型节点\n */\n getPrevSameType(): T | null {\n if (!this.top || !this.top.prevSameType) {\n return null;\n }\n return this.top.prevSameType.data;\n }\n\n findPrevSameType(cb: (node: T) => boolean): T | null {\n if (!this.top) {\n return null;\n }\n let point = this.top.prevSameType;\n while (point) {\n if (cb(point.data)) {\n return point.data;\n }\n point = point.prevSameType;\n }\n return null;\n }\n\n /**\n * 获取当前栈顶的类型\n */\n get peekType(): K | null {\n return this.top ? this.top.type : null;\n }\n /**\n * 获取栈顶元素\n */\n peek() {\n return this.top.data;\n }\n}\n","import { Tokenizer } from './tokenizer';\nimport { $, effect, getPulling, Keys, runWithPulling, setPulling, shareSignal, Signal, Store } from 'aoye';\nimport {\n BobeUI,\n ComponentNode,\n CustomRenderConf,\n FragmentNode,\n Hook,\n HookProps,\n HookType,\n IfNode,\n IsAnchor,\n Logical,\n LogicNode,\n LogicType,\n NodeType,\n ProgramCtx,\n StackItem,\n TerpConf,\n TerpEvt,\n TokenType\n} from './type';\nimport { BaseEvent } from 'bobe-shared';\nimport { TypedStack } from './typed-stack';\nconst tap = new BaseEvent();\n\nexport class Interpreter {\n /** 模板字符串动态节点的占位符 */\n HookId = '_h_o_o_k_';\n /** 用于渲染的数据 */\n data: Record<any, any> = {};\n /** 模板字符串动态节点索引 */\n hookI = 0;\n lastInserted;\n opt: TerpConf;\n constructor(private tokenizer: Tokenizer) {}\n isLogicNode(node: any) {\n return node && node.__logicType & Logical;\n }\n\n program(root: any, before?: any) {\n const componentNode: ComponentNode = {\n __logicType: LogicType.Component,\n realParent: root,\n store: new Store()\n };\n this.tokenizer.consume();\n const stack = new TypedStack<StackItem, NodeType>();\n stack.push({ node: root, prev: null }, NodeType.Real);\n\n const ctx: ProgramCtx = {\n realParent: root,\n prevSibling: before,\n current: null,\n stack,\n before\n };\n\n const rootPulling = getPulling();\n while (1) {\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 const INDENT = this.tokenizer.consume();\n const isLogicNode = this.isLogicNode(ctx.current);\n stack.push(\n {\n node: ctx.current,\n prev: ctx.prevSibling\n },\n ctx.current.__logicType ? (isLogicNode ? NodeType.Logic : NodeType.Component) : NodeType.Real\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 ctx.realParent = ctx.current;\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 === 1 && !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 const DEDENT = this.tokenizer.consume();\n const { node: parent, prev } = stack.peek();\n // 弹出原生节点,找最近的 ctx.realParent\n if (!parent.__logicType) {\n const prevSameType = stack.getPrevSameType();\n ctx.realParent = prevSameType?.node;\n }\n // 弹出逻辑节点,\n else {\n // 考虑 if, for 等获取最后一个插入节点\n if (this.isLogicNode(parent)) {\n // 找最近的 if for\n const parentLogic = stack.getPrevSameType()?.node;\n if (parentLogic) {\n setPulling(parentLogic.effect.ins);\n } else {\n setPulling(rootPulling);\n }\n }\n }\n stack.pop();\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(ctx: ProgramCtx) {\n const { realParent, prevSibling, stack, before } = ctx;\n // 先将 after 插入\n const afterAnchor = this.createAnchor();\n ctx.prevSibling = stack.length === 1 && !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._hook({});\n let _node: any;\n\n if (value === 'if') {\n return this.ifDeclaration(ctx);\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, ctx);\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 realParent: null\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, ctx: ProgramCtx) {\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 const afterAnchor = this.insertAfterAnchor(ctx);\n tap.once(TerpEvt.AllAttrGot, () => {\n // 执行 program 时需要挂载到 parent\n const parent = ctx.realParent;\n const prev = ctx.prevSibling;\n this.onePropParsed = prevOnePropParsed;\n const componentNode = (child['ui'] as BobeUI)(this.opt, { data: child }, parent, prev);\n componentNode.realAfter = afterAnchor;\n tap.emit(TerpEvt.HandledComponentNode, componentNode);\n });\n return { __logicType: LogicType.Component };\n }\n\n ifDeclaration(ctx: ProgramCtx) {\n const ifIdentifier = this.tokenizer.consume();\n const [hookType, value] = this._hook({});\n const ifNode: IfNode = {\n __logicType: LogicType.If,\n snapshot: this.tokenizer.snapshot(),\n condition: null,\n realParent: null,\n isFirstRender: true,\n effect: null\n };\n\n const valueIsMapKey = Reflect.has(this.data[Keys.Raw], value);\n let signal: Signal;\n if (valueIsMapKey) {\n // 确保 signal 已生成\n runWithPulling(() => this.data[value], null);\n // 拿到 signal\n const { cells } = this.data[Keys.Meta];\n signal = cells.get(value);\n } else {\n const fn = new Function('data', `let v;with(data){v=${value}};return v;`).bind(undefined, this.data);\n // 是 getter 使用 computed 计算出一个 signal\n signal = $(fn);\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 const condition = this.tokenizer.consume();\n const newLine = this.tokenizer.consume();\n }\n // 更新渲染\n else {\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.realBefore);\n }\n }\n // 删除逻辑块\n else {\n if (ifNode.isFirstRender) {\n const skipStr = this.tokenizer.skip();\n }\n // 更新渲染,删除所有节点\n else {\n const { realBefore, realAfter, realParent } = ifNode;\n let point = this.nextSib(realBefore);\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)) {\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 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 _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 parent.firstChild = node;\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 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","import { isNum, Queue } from 'bobe-shared';\nimport { BaseType, Token, TokenType } from './type';\n\nexport class Tokenizer {\n /** 缩进大小 默认 2 */\n TabSize = 2;\n /** 缩进字符 */\n Tab = Array.from({ length: this.TabSize }, () => ' ').join('');\n /** 匹配标识符 */\n IdExp = /[\\d\\w\\/]/;\n /** Eof 标识符的值 */\n static EofId = `__EOF__${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 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 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.char;\n\n if (char === '\\n') {\n needIndent = true;\n skipFragment += char;\n this.next();\n continue;\n }\n\n if (!needIndent) {\n skipFragment += char;\n this.next();\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.char === undefined;\n }\n\n get char() {\n return this.code[this.i];\n }\n get prev() {\n return this.code[this.i - 1];\n }\n get after() {\n return this.code[this.i + 1];\n }\n\n private next() {\n const prev = this.code[this.i];\n this.i++;\n const curr = this.code[this.i];\n return [prev, curr] as [prev: string, curr: string];\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 private testId(value: string) {\n if (typeof value !== 'string') return false;\n return this.IdExp.test(value);\n }\n\n private nextToken() {\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 let { char } = this;\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\n if (this.testId(char)) {\n this.identifier(char);\n }\n break;\n }\n // 指向下一个字符\n this.next();\n }\n\n // 找到 token 即可停止\n if (this.token) {\n break;\n }\n }\n return this.token;\n } catch (error) {\n console.error(error);\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.after;\n // 不是动态插值\n if (nextC !== '{') {\n return false;\n }\n this.next();\n let value = '${';\n let innerBrace = 0;\n while (1) {\n nextC = this.after;\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\n const nextChar = this.after;\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.next()[0]; // 跳过 * 号\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.next()[0]; // 跳过 / 号\n } else if (char === '/' && nextChar === '*') {\n inComment = 'multi';\n value += this.next()[0]; // 跳过 / 号\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.next()[0];\n }\n }\n\n private newLine() {\n let value = '\\n';\n let nextC;\n while (1) {\n nextC = this.after;\n if (nextC !== '\\n') {\n break;\n }\n value += nextC;\n // 下一个属于本标识符再前进\n this.next();\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.char;\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.next();\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, String(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 this.setToken(TokenType.Identifier, Tokenizer.EofId);\n } else {\n this.waitingTokens.push({\n type: TokenType.Identifier,\n typeName: TokenType[TokenType.Identifier],\n value: Tokenizer.EofId\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.after;\n if (!this.testId(nextC)) {\n break;\n }\n value += nextC;\n this.next();\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.after;\n value += nextC;\n const memoCount = continuousBackslashCount;\n if (nextC === '\\\\') {\n continuousBackslashCount++;\n } else {\n continuousBackslashCount = 0;\n }\n this.next();\n /**\n * 引号前 \\ 为双数时,全都是字符 \\\n * */\n if (nextC === char && memoCount % 2 === 0) {\n break;\n }\n }\n this.setToken(TokenType.Identifier, JSON.parse(value.slice(0, -1) + '\"'));\n }\n private number(char: string) {\n let value = char;\n let nextC;\n while (1) {\n nextC = this.after;\n if (!isNum(nextC)) {\n break;\n }\n value += nextC;\n this.next();\n }\n this.setToken(TokenType.Identifier, Number(value));\n }\n private eof() {\n this.setToken(TokenType.Eof, 'End Of File');\n }\n}\n","import { Interpreter } from './terp';\nimport { Store } from 'aoye';\nimport { Tokenizer } from './tokenizer';\nimport { BobeUI, CustomRenderConf } from './type';\nexport * from 'aoye';\nexport function bobe(fragments: TemplateStringsArray, ...values: any[]) {\n const ui: BobeUI = function ui(options, valueOpt, root, before) {\n const tokenizer = new Tokenizer();\n const cmp = new Interpreter(tokenizer);\n Object.assign(cmp, valueOpt);\n // 初始化\n cmp.config({\n ...options,\n hook({ i }) {\n return values[i];\n },\n setProp(node: any, key: string, value: any, hookI?: number) {\n node.props[key] = value;\n }\n });\n cmp.init(Array.from(fragments));\n return cmp.program(root, before);\n };\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 // ui => bobe`` 返回的函数\n return [store['ui'](option, { data: store }, root), store];\n };\n}\n\n"],"names":["TokenType","LogicType","NodeType","TerpEvt","__spreadProps","__spreadValues","ui"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Store } from 'aoye';
1
+ import { Store, Signal, Dispose } from 'aoye';
2
2
  export * from 'aoye';
3
3
  import { Queue } from 'bobe-shared';
4
4
 
@@ -58,6 +58,7 @@ declare class Tokenizer {
58
58
  private newLine;
59
59
  private getDentValue;
60
60
  private dent;
61
+ private shorterThanBaseDentEof;
61
62
  private identifier;
62
63
  private str;
63
64
  private number;
@@ -75,7 +76,12 @@ declare class Interpreter {
75
76
  lastInserted: any;
76
77
  opt: TerpConf;
77
78
  constructor(tokenizer: Tokenizer);
79
+ isLogicNode(node: any): number;
78
80
  program(root: any, before?: any): ComponentNode;
81
+ insertAfterAnchor(ctx: ProgramCtx): {
82
+ name: string;
83
+ nextSibling: any;
84
+ };
79
85
  /** 处理
80
86
  * 是逻辑 是普通
81
87
  * 父节点 将子节点加入 directList 调用 insert 方法挨个插入子节点
@@ -104,7 +110,7 @@ declare class Interpreter {
104
110
  componentDeclaration(Component: typeof Store, ctx: ProgramCtx): {
105
111
  __logicType: LogicType;
106
112
  };
107
- ifDeclaration(): IfNode;
113
+ ifDeclaration(ctx: ProgramCtx): IfNode;
108
114
  /**
109
115
  * <extensionLines> ::= PIPE <attributeList> NEWLINE <extensionLines>
110
116
  * | ε
@@ -134,20 +140,53 @@ declare class Interpreter {
134
140
  nextSibling: any;
135
141
  };
136
142
  nextSib(node: any): any;
143
+ _createAnchor(): {
144
+ name: string;
145
+ nextSibling: any;
146
+ };
137
147
  createAnchor(): {
138
148
  name: string;
139
149
  nextSibling: any;
140
150
  };
141
151
  insertAfter(parent: any, node: any, prev: any): void;
142
152
  defaultInsert(parent: any, node: any, prev: any): void;
143
- remove(parent: any, node: any, prevSibling: any): void;
144
- defaultRemove(parent: any, node: any, prevSibling: any): void;
153
+ remove(node: any, parent?: any, prev?: any): void;
154
+ defaultRemove(node: any, parent: any, prevSibling: any): void;
145
155
  setProp(node: any, key: string, value: any, hookI?: number): void;
146
156
  init(fragments: string | string[]): void;
147
157
  hook: Hook;
148
158
  _hook: (props: Partial<HookProps>) => [HookType | undefined, any];
149
159
  }
150
160
 
161
+ declare class TypedStack<T, K extends string | number> {
162
+ private top;
163
+ private lastNodes;
164
+ length: number;
165
+ /**
166
+ * @param rawNode 原始节点数据
167
+ * @param type 节点类型
168
+ */
169
+ push(rawNode: T, type: K): void;
170
+ /**
171
+ * 出栈操作
172
+ * @returns 原始节点数据或 null
173
+ */
174
+ pop(): T | null;
175
+ /**
176
+ * O(1) 获取栈顶节点的前一个同类型节点
177
+ */
178
+ getPrevSameType(): T | null;
179
+ findPrevSameType(cb: (node: T) => boolean): T | null;
180
+ /**
181
+ * 获取当前栈顶的类型
182
+ */
183
+ get peekType(): K | null;
184
+ /**
185
+ * 获取栈顶元素
186
+ */
187
+ peek(): T;
188
+ }
189
+
151
190
  declare enum TokenType {
152
191
  NewLine = 1,
153
192
  Indent = 2,
@@ -165,7 +204,13 @@ declare enum LogicType {
165
204
  For = 8,
166
205
  Component = 16,
167
206
  Fragment = 32,
168
- Root = 64
207
+ Root = 64,
208
+ Real = 128
209
+ }
210
+ declare enum NodeType {
211
+ Logic = 15,
212
+ Real = 128,
213
+ Component = 16
169
214
  }
170
215
  type BaseType = string | number | boolean | undefined | null;
171
216
  type Token = {
@@ -186,25 +231,19 @@ type CustomRenderConf = Pick<TerpConf, 'createNode' | 'setProp' | 'nextSib' | 'c
186
231
  type Hook = (props: HookProps) => any;
187
232
  type HookType = 'dynamic' | 'static';
188
233
  type ProgramCtx = {
189
- stack: StackItem[];
234
+ stack: TypedStack<any, NodeType>;
190
235
  prevSibling: any;
236
+ realParent: any;
237
+ current: any;
238
+ before: any;
191
239
  };
192
240
  /** 返回值是用户自定义的节点 */
193
241
  type BobeUI = (this: Store, options: CustomRenderConf, valOpt: TerpConf, root: any, after?: any) => ComponentNode;
194
- type StackItem = {
195
- /** 插入到 prev 后 */
196
- prev: any;
197
- /** 当前节点*/
198
- node: any;
199
- };
200
242
  type IfNode = LogicNode & {
201
- condition: () => any;
202
- anchor: any;
243
+ condition: Signal;
203
244
  isFirstRender: boolean;
204
245
  snapshot: ReturnType<Tokenizer['snapshot']>;
205
- watcher: {
206
- stop: () => void;
207
- };
246
+ effect: Dispose;
208
247
  };
209
248
  type LogicNode = {
210
249
  __logicType: LogicType;