@flowgram.ai/variable-core 0.5.4 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/variable-container-module.ts","../src/variable-engine.ts","../src/utils/toDisposable.tsx","../src/utils/memo.ts","../src/scope/variable-table.ts","../src/scope/scope-chain.ts","../src/providers.ts","../src/scope/scope.ts","../src/ast/types.ts","../src/ast/ast-registers.ts","../src/ast/utils/inversify.ts","../src/ast/match.ts","../src/ast/utils/helpers.ts","../src/ast/flags.ts","../src/ast/ast-node.ts","../src/ast/type/base-type.ts","../src/ast/type/array.ts","../src/ast/type/string.ts","../src/ast/type/integer.ts","../src/ast/type/boolean.ts","../src/ast/type/number.ts","../src/ast/type/map.ts","../src/ast/type/object.ts","../src/ast/type/custom-type.ts","../src/ast/expression/base-expression.ts","../src/ast/utils/variable-field.ts","../src/ast/expression/keypath-expression.ts","../src/ast/expression/enumerate-expression.ts","../src/ast/expression/keypath-expression-v2.ts","../src/ast/utils/expression.ts","../src/ast/expression/wrap-array-expression.ts","../src/ast/declaration/base-variable-field.ts","../src/ast/declaration/variable-declaration.ts","../src/ast/declaration/variable-declaration-list.ts","../src/ast/declaration/property.ts","../src/ast/common/data-node.ts","../src/ast/common/list-node.ts","../src/ast/common/map-node.ts","../src/ast/factory.ts","../src/scope/datas/scope-output-data.ts","../src/scope/datas/scope-available-data.ts","../src/scope/datas/scope-event-data.ts","../src/services/variable-field-key-rename-service.ts","../src/react/context.tsx","../src/react/hooks/useScopeAvailable.ts","../src/react/hooks/useAvailableVariables.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport { VariableContainerModule } from './variable-container-module';\nexport { VariableEngine } from './variable-engine';\nexport { VariableEngineProvider } from './providers';\n\nexport * from './react';\nexport * from './scope';\nexport * from './ast';\nexport * from './services';\nexport { type Observer } from 'rxjs';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { VariableEngine } from './variable-engine';\nimport { VariableFieldKeyRenameService } from './services';\nimport { ContainerProvider, VariableEngineProvider } from './providers';\nimport { ASTRegisters } from './ast';\n\nexport const VariableContainerModule = new ContainerModule(bind => {\n bind(VariableEngine).toSelf().inSingletonScope();\n bind(ASTRegisters).toSelf().inSingletonScope();\n\n bind(VariableFieldKeyRenameService).toSelf().inSingletonScope();\n\n // 提供 provider 注入 variableEngine,防止部分场景下的循环依赖\n bind(VariableEngineProvider).toDynamicValue(ctx => () => ctx.container.get(VariableEngine));\n\n // 提供 Container Provider 方便 AST 注入模块\n bind(ContainerProvider).toDynamicValue(ctx => () => ctx.container);\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Subject } from 'rxjs';\nimport { inject, injectable, interfaces, preDestroy } from 'inversify';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { subsToDisposable } from './utils/toDisposable';\nimport { createMemo } from './utils/memo';\nimport { VariableTable } from './scope/variable-table';\nimport { ScopeChangeAction } from './scope/types';\nimport { IScopeConstructor } from './scope/scope';\nimport { Scope, ScopeChain, type IVariableTable } from './scope';\nimport { ContainerProvider } from './providers';\nimport { ASTRegisters, type GlobalEventActionType } from './ast';\n\n@injectable()\nexport class VariableEngine implements Disposable {\n protected toDispose = new DisposableCollection();\n\n protected memo = createMemo();\n\n protected scopeMap = new Map<string | symbol, Scope>();\n\n globalEvent$: Subject<GlobalEventActionType> = new Subject<GlobalEventActionType>();\n\n protected onScopeChangeEmitter = new Emitter<ScopeChangeAction>();\n\n public globalVariableTable: IVariableTable = new VariableTable();\n\n public onScopeChange = this.onScopeChangeEmitter.event;\n\n // 获取 inversify container 容器\n @inject(ContainerProvider) private readonly containerProvider: ContainerProvider;\n\n get container(): interfaces.Container {\n return this.containerProvider();\n }\n\n constructor(\n @inject(ScopeChain) public readonly chain: ScopeChain, // 作用域依赖关系偏序集\n @inject(ASTRegisters) public readonly astRegisters: ASTRegisters // AST 节点注册管理器\n ) {\n this.toDispose.pushAll([\n chain,\n Disposable.create(() => {\n // 清空所有作用域\n this.getAllScopes().forEach((scope) => scope.dispose());\n this.globalVariableTable.dispose();\n }),\n ]);\n }\n\n @preDestroy()\n dispose(): void {\n this.toDispose.dispose();\n }\n\n // 根据 scopeId 找到作用域\n getScopeById(scopeId: string | symbol): Scope | undefined {\n return this.scopeMap.get(scopeId);\n }\n\n // 移除作用域\n removeScopeById(scopeId: string | symbol): void {\n this.getScopeById(scopeId)?.dispose();\n }\n\n /**\n * Get Scope, if Scope exists and type is same, will use it directly\n * @param id scope id\n * @param meta scope meta, defined by user\n * @param ScopeConstructor scope constructor, default is Scope. you can extends Scope to create your own scope\n * @returns\n */\n createScope(\n id: string | symbol,\n meta?: Record<string, any>,\n options: {\n ScopeConstructor?: IScopeConstructor;\n } = {}\n ): Scope {\n const { ScopeConstructor = Scope } = options;\n\n let scope = this.getScopeById(id);\n\n if (!scope) {\n scope = new ScopeConstructor({ variableEngine: this, meta, id });\n this.scopeMap.set(id, scope);\n this.onScopeChangeEmitter.fire({ type: 'add', scope: scope! });\n\n scope.toDispose.pushAll([\n scope.ast.subscribe(() => {\n this.onScopeChangeEmitter.fire({ type: 'update', scope: scope! });\n }),\n // 可用变量发生变化\n scope.available.onDataChange(() => {\n this.onScopeChangeEmitter.fire({ type: 'available', scope: scope! });\n }),\n ]);\n scope.onDispose(() => {\n this.scopeMap.delete(id);\n this.onScopeChangeEmitter.fire({ type: 'delete', scope: scope! });\n });\n }\n\n return scope;\n }\n\n // 获取系统中所有的作用域\n getAllScopes({\n sort,\n }: {\n // 是否排序\n sort?: boolean;\n } = {}): Scope[] {\n const allScopes = Array.from(this.scopeMap.values());\n\n // 是否进行排序\n if (sort) {\n const sortScopes = this.chain.sortAll();\n const remainScopes = new Set(allScopes);\n sortScopes.forEach((_scope) => remainScopes.delete(_scope));\n\n return [...sortScopes, ...Array.from(remainScopes)];\n }\n\n // 数据拷贝一份\n return [...allScopes];\n }\n\n fireGlobalEvent(event: GlobalEventActionType) {\n this.globalEvent$.next(event);\n }\n\n onGlobalEvent<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n type: ActionType['type'],\n observer: (action: ActionType) => void\n ): Disposable {\n return subsToDisposable(\n this.globalEvent$.subscribe((_action) => {\n if (_action.type === type) {\n observer(_action as ActionType);\n }\n })\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Subscription } from 'rxjs';\nimport { Disposable } from '@flowgram.ai/utils';\n\nexport function subsToDisposable(subscription: Subscription): Disposable {\n return Disposable.create(() => subscription.unsubscribe());\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\ntype KeyType = string | symbol;\n\n/**\n * 创建缓存管理器\n * @returns\n */\nexport const createMemo = (): {\n <T>(key: KeyType, fn: () => T): T;\n clear: (key?: KeyType) => void;\n} => {\n const _memoCache = new Map<KeyType, any>();\n\n const memo = <T>(key: KeyType, fn: () => T): T => {\n if (_memoCache.has(key)) {\n return _memoCache.get(key) as T;\n }\n const data = fn();\n _memoCache.set(key, data);\n return data as T;\n };\n\n const clear = (key?: KeyType) => {\n if (key) {\n _memoCache.delete(key);\n } else {\n _memoCache.clear();\n }\n };\n\n memo.clear = clear;\n\n return memo;\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Observable, Subject, merge, share, skip, switchMap } from 'rxjs';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { subsToDisposable } from '../utils/toDisposable';\nimport { BaseVariableField } from '../ast/declaration/base-variable-field';\nimport { VariableDeclaration } from '../ast';\nimport { IVariableTable } from './types';\n\nexport class VariableTable implements IVariableTable {\n protected table: Map<string, VariableDeclaration> = new Map();\n\n toDispose = new DisposableCollection();\n\n /**\n * @deprecated\n */\n protected onDataChangeEmitter = new Emitter<void>();\n\n protected variables$: Subject<VariableDeclaration[]> = new Subject<VariableDeclaration[]>();\n\n // 监听变量列表中的单个变量变化\n protected anyVariableChange$: Observable<VariableDeclaration> = this.variables$.pipe(\n switchMap((_variables) =>\n merge(\n ..._variables.map((_v) =>\n _v.value$.pipe<any>(\n // 跳过 BehaviorSubject 第一个\n skip(1)\n )\n )\n )\n ),\n share()\n );\n\n /**\n * listen to any variable update in list\n * @param observer\n * @returns\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * listen to variable list change\n * @param observer\n * @returns\n */\n onVariableListChange(observer: (variables: VariableDeclaration[]) => void) {\n return subsToDisposable(this.variables$.subscribe(observer));\n }\n\n /**\n * listen to variable list change + any variable update in list\n * @param observer\n */\n onListOrAnyVarChange(observer: () => void) {\n const disposables = new DisposableCollection();\n disposables.pushAll([this.onVariableListChange(observer), this.onAnyVariableChange(observer)]);\n return disposables;\n }\n\n /**\n * @deprecated use onListOrAnyVarChange instead\n */\n public onDataChange = this.onDataChangeEmitter.event;\n\n protected _version: number = 0;\n\n fireChange() {\n this.bumpVersion();\n this.onDataChangeEmitter.fire();\n this.variables$.next(this.variables);\n this.parentTable?.fireChange();\n }\n\n get version(): number {\n return this._version;\n }\n\n protected bumpVersion() {\n this._version = this._version + 1;\n if (this._version === Number.MAX_SAFE_INTEGER) {\n this._version = 0;\n }\n }\n\n constructor(\n public parentTable?: IVariableTable // 父变量表,会包含所有子表的变量\n ) {\n this.toDispose.pushAll([\n this.onDataChangeEmitter,\n // active share()\n this.onAnyVariableChange(() => {\n this.bumpVersion();\n }),\n ]);\n }\n\n get variables(): VariableDeclaration[] {\n return Array.from(this.table.values());\n }\n\n get variableKeys(): string[] {\n return Array.from(this.table.keys());\n }\n\n /**\n * 根据 keyPath 找到对应的变量,或 Property 节点\n * @param keyPath\n * @returns\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n const [variableKey, ...propertyKeys] = keyPath || [];\n\n if (!variableKey) {\n return;\n }\n\n const variable = this.getVariableByKey(variableKey);\n\n return propertyKeys.length ? variable?.getByKeyPath(propertyKeys) : variable;\n }\n\n /**\n * 根据 key 值找到相应的变量\n * @param key\n * @returns\n */\n getVariableByKey(key: string) {\n return this.table.get(key);\n }\n\n /**\n * 往 variableTable 添加输出变量\n * @param variable\n */\n addVariableToTable(variable: VariableDeclaration) {\n this.table.set(variable.key, variable);\n if (this.parentTable) {\n (this.parentTable as VariableTable).addVariableToTable(variable);\n }\n }\n\n /**\n * 从 variableTable 中移除变量\n * @param key\n */\n removeVariableFromTable(key: string) {\n this.table.delete(key);\n if (this.parentTable) {\n (this.parentTable as VariableTable).removeVariableFromTable(key);\n }\n }\n\n dispose(): void {\n this.variableKeys.forEach((_key) =>\n (this.parentTable as VariableTable)?.removeVariableFromTable(_key)\n );\n this.parentTable?.fireChange();\n this.variables$.complete();\n this.variables$.unsubscribe();\n this.toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { DisposableCollection, type Event } from '@flowgram.ai/utils';\n\nimport { VariableEngineProvider } from '../providers';\nimport { type Scope } from './scope';\n\n/**\n * 作用域依赖关系管理数据结构\n * - ScopeOrder 可能存在多种实现方式,因此采取抽象类的方式,具体的实现由子类实现\n */\n@injectable()\nexport abstract class ScopeChain {\n readonly toDispose: DisposableCollection = new DisposableCollection();\n\n @inject(VariableEngineProvider) variableEngineProvider: VariableEngineProvider;\n\n get variableEngine() {\n return this.variableEngineProvider();\n }\n\n constructor() {}\n\n /**\n * 所有作用域依赖关系刷新\n */\n refreshAllChange(): void {\n this.variableEngine.getAllScopes().forEach(_scope => {\n _scope.refreshCovers();\n _scope.refreshDeps();\n });\n }\n\n // 获取依赖作用域,子类实现\n abstract getDeps(scope: Scope): Scope[];\n\n // 获取覆盖作用域,子类实现\n abstract getCovers(scope: Scope): Scope[];\n\n // 获取所有作用域的排序\n abstract sortAll(): Scope[];\n\n dispose(): void {\n this.toDispose.dispose();\n }\n\n get disposed(): boolean {\n return this.toDispose.disposed;\n }\n\n get onDispose(): Event<void> {\n return this.toDispose.onDispose;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { interfaces } from 'inversify';\n\nimport { type VariableEngine } from './variable-engine';\n\n// 动态获取 variableEngine,防止出现引用 variableEngine 导致的循环依赖\nexport const VariableEngineProvider = Symbol('DynamicVariableEngine');\nexport type VariableEngineProvider = () => VariableEngine;\n\nexport const ContainerProvider = Symbol('ContainerProvider');\nexport type ContainerProvider = () => interfaces.Container;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { type VariableEngine } from '../variable-engine';\nimport { createMemo } from '../utils/memo';\nimport { ASTKind, type ASTNode, type ASTNodeJSON, MapNode } from '../ast';\nimport { ScopeAvailableData, ScopeEventData, ScopeOutputData } from './datas';\n\nexport interface IScopeConstructor {\n new (options: {\n id: string | symbol;\n variableEngine: VariableEngine;\n meta?: Record<string, any>;\n }): Scope;\n}\n\nexport class Scope<ScopeMeta extends Record<string, any> = Record<string, any>> {\n /**\n * Scope 唯一索引\n */\n readonly id: string | symbol;\n\n /**\n * Scope 依赖变量引擎\n */\n readonly variableEngine: VariableEngine;\n\n /**\n * 作用域的基本元信息,包括作用域所在节点及一些 flag 信息,上层业务可以额外扩展\n */\n readonly meta: ScopeMeta;\n\n /**\n * 作用域 AST 根节点\n * - Map<formItemKey, formItemValue>\n */\n readonly ast: MapNode;\n\n /**\n * 可用变量数据管理\n */\n readonly available: ScopeAvailableData;\n\n /**\n * 输出变量数据管理\n */\n readonly output: ScopeOutputData;\n\n /**\n * 作用域事件管理\n */\n readonly event: ScopeEventData;\n\n /**\n * 数据缓存\n */\n protected memo = createMemo();\n\n public toDispose: DisposableCollection = new DisposableCollection();\n\n constructor(options: { id: string | symbol; variableEngine: VariableEngine; meta?: ScopeMeta }) {\n this.id = options.id;\n this.meta = options.meta || ({} as any);\n this.variableEngine = options.variableEngine;\n\n this.event = new ScopeEventData(this);\n\n this.ast = this.variableEngine.astRegisters.createAST(\n {\n kind: ASTKind.MapNode,\n key: String(this.id),\n },\n {\n scope: this,\n }\n ) as MapNode;\n\n this.output = new ScopeOutputData(this);\n this.available = new ScopeAvailableData(this);\n }\n\n refreshCovers(): void {\n this.memo.clear('covers');\n }\n\n refreshDeps(): void {\n this.memo.clear('deps');\n this.available.refresh();\n }\n\n get depScopes(): Scope[] {\n return this.memo('deps', () =>\n this.variableEngine.chain\n .getDeps(this)\n .filter((_scope) => Boolean(_scope) && !_scope?.disposed)\n );\n }\n\n get coverScopes(): Scope[] {\n return this.memo('covers', () =>\n this.variableEngine.chain\n .getCovers(this)\n .filter((_scope) => Boolean(_scope) && !_scope?.disposed)\n );\n }\n\n dispose(): void {\n this.ast.dispose();\n this.toDispose.dispose();\n\n // 删除作用域时,触发上下游作用域依赖覆盖更新\n this.coverScopes.forEach((_scope) => _scope.refreshDeps());\n this.depScopes.forEach((_scope) => _scope.refreshCovers());\n }\n\n onDispose = this.toDispose.onDispose;\n\n get disposed(): boolean {\n return this.toDispose.disposed;\n }\n\n /**\n * Sets a variable in the Scope with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the Scope by key.\n *\n * @param key - The key of the variable to set.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the Scope by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.ast.get(key);\n }\n\n /**\n * Clears a variable from the Scope by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.ast.remove(key);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type Observer } from 'rxjs';\n\nimport { type Scope } from '../scope';\nimport { type ASTNode } from './ast-node';\n\nexport type ASTKindType = string;\nexport type Identifier = string;\n\nexport interface ASTNodeJSON {\n kind?: ASTKindType;\n key?: Identifier; // 没有传入时,节点会默认生成一个 key 值\n [key: string]: any;\n}\n\n/**\n * 核心 AST 节点类型\n */\nexport enum ASTKind {\n /**\n * 类型相关\n * - 内部默认实现一套基于 JSON 类型的类型 AST 节点\n */\n String = 'String', // 字符串\n Number = 'Number', // 数字\n Integer = 'Integer', // 整数\n Boolean = 'Boolean', // 布尔值\n Object = 'Object', // Object\n Array = 'Array', // Array\n Map = 'Map', // Map\n Union = 'Union', // 联合类型,常用于类型判断,一般不对业务透出\n Any = 'Any', // 任意类型,常用于业务判断\n CustomType = 'CustomType', // 自定义类型,用于业务自定义类型\n\n /**\n * 声明\n */\n Property = 'Property', // Object 下钻的字段定义\n VariableDeclaration = 'VariableDeclaration', // 变量声明\n VariableDeclarationList = 'VariableDeclarationList', // 变量声明\n\n /**\n * 表达式\n */\n KeyPathExpression = 'KeyPathExpression', // 通过路径系统访问变量上的字段\n EnumerateExpression = 'EnumerateExpression', // 对指定的数据进行遍历\n WrapArrayExpression = 'WrapArrayExpression', // Wrap with Array Type\n\n /**\n * 通用 AST 节点\n */\n ListNode = 'ListNode', // 通用 List<ASTNode> 存储节点\n DataNode = 'DataNode', // 通用的数据存储节点\n MapNode = 'MapNode', // 通用 Map<string, ASTNode> 存储节点\n}\n\nexport interface CreateASTParams {\n scope: Scope;\n key?: Identifier;\n parent?: ASTNode;\n}\n\nexport type ASTNodeJSONOrKind = string | ASTNodeJSON;\n\nexport type ObserverOrNext<T> = Partial<Observer<T>> | ((value: T) => void);\n\nexport interface SubscribeConfig<This, Data> {\n // 将一个 animationFrame 内的所有变更合并成一个\n debounceAnimation?: boolean;\n // 订阅时默认响应一次值\n triggerOnInit?: boolean;\n selector?: (curr: This) => Data;\n}\n\nexport type GetKindJSON<KindType extends string, JSON extends ASTNodeJSON> = {\n kind: KindType;\n key?: Identifier;\n} & JSON;\n\nexport type GetKindJSONOrKind<KindType extends string, JSON extends ASTNodeJSON> =\n | ({\n kind: KindType;\n key?: Identifier;\n } & JSON)\n | KindType;\n\nexport interface GlobalEventActionType<\n Type = string,\n Payload = any,\n AST extends ASTNode = ASTNode\n> {\n type: Type;\n payload?: Payload;\n ast?: AST;\n}\n\nexport type NewASTAction = GlobalEventActionType<'NewAST'>;\nexport type UpdateASTAction = GlobalEventActionType<'UpdateAST'>;\nexport type DisposeASTAction = GlobalEventActionType<'DisposeAST'>;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { omit } from 'lodash-es';\nimport { injectable } from 'inversify';\n\nimport { POST_CONSTRUCT_AST_SYMBOL } from './utils/inversify';\nimport { ASTKindType, ASTNodeJSON, CreateASTParams, NewASTAction } from './types';\nimport { ArrayType } from './type/array';\nimport {\n BooleanType,\n CustomType,\n IntegerType,\n MapType,\n NumberType,\n ObjectType,\n StringType,\n} from './type';\nimport {\n EnumerateExpression,\n // KeyPathExpression,\n KeyPathExpressionV2,\n WrapArrayExpression,\n} from './expression';\nimport { Property, VariableDeclaration, VariableDeclarationList } from './declaration';\nimport { DataNode, MapNode } from './common';\nimport { ASTNode, ASTNodeRegistry } from './ast-node';\n\ntype DataInjector = () => Record<string, any>;\n\n@injectable()\nexport class ASTRegisters {\n protected injectors: Map<ASTKindType, DataInjector> = new Map();\n\n protected astMap: Map<ASTKindType, ASTNodeRegistry> = new Map();\n\n /**\n * 核心 AST 节点注册\n */\n constructor() {\n this.registerAST(StringType);\n this.registerAST(NumberType);\n this.registerAST(BooleanType);\n this.registerAST(IntegerType);\n this.registerAST(ObjectType);\n this.registerAST(ArrayType);\n this.registerAST(MapType);\n this.registerAST(CustomType);\n this.registerAST(Property);\n this.registerAST(VariableDeclaration);\n this.registerAST(VariableDeclarationList);\n // this.registerAST(KeyPathExpression);\n this.registerAST(KeyPathExpressionV2);\n\n this.registerAST(EnumerateExpression);\n this.registerAST(WrapArrayExpression);\n this.registerAST(MapNode);\n this.registerAST(DataNode);\n }\n\n /**\n * 创建 AST 节点\n * @param param 创建参数\n * @returns\n */\n createAST<ReturnNode extends ASTNode = ASTNode>(\n json: ASTNodeJSON,\n { parent, scope }: CreateASTParams\n ): ReturnNode {\n const Registry = this.astMap.get(json.kind!);\n\n if (!Registry) {\n throw Error(`ASTKind: ${String(json.kind)} can not find its ASTNode Registry`);\n }\n\n const injector = this.injectors.get(json.kind!);\n\n const node = new Registry(\n {\n key: json.key,\n scope,\n parent,\n },\n injector?.() || {}\n ) as ReturnNode;\n\n // 初始化创建不触发 fireChange\n node.changeLocked = true;\n node.fromJSON(omit(json, ['key', 'kind']));\n node.changeLocked = false;\n\n node.dispatchGlobalEvent<NewASTAction>({ type: 'NewAST' });\n\n if (Reflect.hasMetadata(POST_CONSTRUCT_AST_SYMBOL, node)) {\n const postConstructKey = Reflect.getMetadata(POST_CONSTRUCT_AST_SYMBOL, node);\n (node[postConstructKey] as () => void)?.();\n }\n\n return node;\n }\n\n /**\n * 根据 AST 节点类型获取节点 Registry\n * @param kind\n * @returns\n */\n getASTRegistryByKind(kind: ASTKindType) {\n return this.astMap.get(kind);\n }\n\n /**\n * 注册 AST 节点\n * @param ASTNode\n * @param injector\n */\n registerAST(ASTNode: ASTNodeRegistry, injector?: DataInjector) {\n this.astMap.set(ASTNode.kind, ASTNode);\n if (injector) {\n this.injectors.set(ASTNode.kind, injector);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { interfaces } from 'inversify';\n\nimport { type ASTNode } from '../ast-node';\n\nexport const injectToAST = (serviceIdentifier: interfaces.ServiceIdentifier) =>\n function (target: any, propertyKey: string) {\n if (!serviceIdentifier) {\n throw new Error(\n `ServiceIdentifier ${serviceIdentifier} in @lazyInject is Empty, it might be caused by file circular dependency, please check it.`,\n );\n }\n\n const descriptor = {\n get() {\n const container = (this as ASTNode).scope.variableEngine.container;\n return container.get(serviceIdentifier);\n },\n set() {},\n configurable: true,\n enumerable: true,\n } as any;\n\n // Object.defineProperty(target, propertyKey, descriptor);\n\n return descriptor;\n };\n\nexport const POST_CONSTRUCT_AST_SYMBOL = Symbol('post_construct_ast');\n\nexport const postConstructAST = () => (target: any, propertyKey: string) => {\n // 只运行一次\n if (!Reflect.hasMetadata(POST_CONSTRUCT_AST_SYMBOL, target)) {\n Reflect.defineMetadata(POST_CONSTRUCT_AST_SYMBOL, propertyKey, target);\n } else {\n throw Error('Duplication Post Construct AST');\n }\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from './types';\nimport {\n type StringType,\n type NumberType,\n type BooleanType,\n type IntegerType,\n type ObjectType,\n type ArrayType,\n type MapType,\n type CustomType,\n} from './type';\nimport { type EnumerateExpression, type KeyPathExpression } from './expression';\nimport {\n type Property,\n type VariableDeclaration,\n type VariableDeclarationList,\n} from './declaration';\nimport { type ASTNode } from './ast-node';\n\nexport namespace ASTMatch {\n /**\n * 类型相关\n * @returns\n */\n export const isString = (node?: ASTNode): node is StringType => node?.kind === ASTKind.String;\n\n export const isNumber = (node?: ASTNode): node is NumberType => node?.kind === ASTKind.Number;\n\n export const isBoolean = (node?: ASTNode): node is BooleanType => node?.kind === ASTKind.Boolean;\n\n export const isInteger = (node?: ASTNode): node is IntegerType => node?.kind === ASTKind.Integer;\n\n export const isObject = (node?: ASTNode): node is ObjectType => node?.kind === ASTKind.Object;\n\n export const isArray = (node?: ASTNode): node is ArrayType => node?.kind === ASTKind.Array;\n\n export const isMap = (node?: ASTNode): node is MapType => node?.kind === ASTKind.Map;\n\n export const isCustomType = (node?: ASTNode): node is CustomType =>\n node?.kind === ASTKind.CustomType;\n\n /**\n * 声明相关\n */\n export const isVariableDeclaration = <VariableMeta = any>(\n node?: ASTNode\n ): node is VariableDeclaration<VariableMeta> => node?.kind === ASTKind.VariableDeclaration;\n\n export const isProperty = <VariableMeta = any>(node?: ASTNode): node is Property<VariableMeta> =>\n node?.kind === ASTKind.Property;\n\n export const isVariableDeclarationList = (node?: ASTNode): node is VariableDeclarationList =>\n node?.kind === ASTKind.VariableDeclarationList;\n\n /**\n * 表达式相关\n */\n export const isEnumerateExpression = (node?: ASTNode): node is EnumerateExpression =>\n node?.kind === ASTKind.EnumerateExpression;\n\n export const isKeyPathExpression = (node?: ASTNode): node is KeyPathExpression =>\n node?.kind === ASTKind.KeyPathExpression;\n\n /**\n * Check AST Match by ASTClass\n */\n export function is<TargetASTNode extends ASTNode>(\n node?: ASTNode,\n targetType?: { kind: string; new (...args: any[]): TargetASTNode }\n ): node is TargetASTNode {\n return node?.kind === targetType?.kind;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { ASTMatch } from '../match';\nimport { ASTNode } from '../ast-node';\n\nexport function updateChildNodeHelper(\n this: ASTNode,\n {\n getChildNode,\n updateChildNode,\n removeChildNode,\n nextJSON,\n }: {\n getChildNode: () => ASTNode | undefined;\n updateChildNode: (nextNode: ASTNode) => void;\n removeChildNode: () => void;\n nextJSON?: ASTNodeJSON;\n }\n): ASTNode | undefined {\n const currNode: ASTNode | undefined = getChildNode();\n\n const isNewKind = currNode?.kind !== nextJSON?.kind;\n // 如果 nextJSON 没有传入 key 值,则 key 值默认不变\n const isNewKey = nextJSON?.key && nextJSON?.key !== currNode?.key;\n\n if (isNewKind || isNewKey) {\n // 上一个节点需要销毁处理\n if (currNode) {\n currNode.dispose();\n removeChildNode();\n }\n\n if (nextJSON) {\n const newNode = this.createChildNode(nextJSON);\n updateChildNode(newNode);\n this.fireChange();\n return newNode;\n } else {\n // 直接删除子节点时,也触发更新\n this.fireChange();\n }\n } else if (nextJSON) {\n currNode?.fromJSON(nextJSON);\n }\n\n return currNode;\n}\n\nexport function parseTypeJsonOrKind(typeJSONOrKind?: ASTNodeJSONOrKind): ASTNodeJSON | undefined {\n return typeof typeJSONOrKind === 'string' ? { kind: typeJSONOrKind } : typeJSONOrKind;\n}\n\n// 获取所有的 children\nexport function getAllChildren(ast: ASTNode): ASTNode[] {\n return [...ast.children, ...ast.children.map((_child) => getAllChildren(_child)).flat()];\n}\n\n/**\n * isMatchAST is same as ASTMatch.is\n * @param node\n * @param targetType\n * @returns\n */\nexport function isMatchAST<TargetASTNode extends ASTNode>(\n node?: ASTNode,\n targetType?: { kind: string; new (...args: any[]): TargetASTNode }\n): node is TargetASTNode {\n return ASTMatch.is(node, targetType);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport enum ASTNodeFlags {\n None = 0,\n\n /**\n * 变量字段\n */\n VariableField = 1 << 0,\n\n /**\n * 表达式\n */\n Expression = 1 << 2,\n\n /**\n * 变量类型\n */\n BasicType = 1 << 3, // 基础类型\n DrilldownType = 1 << 4, // 可下钻的变量类型\n EnumerateType = 1 << 5, // 可遍历的变量类型\n UnionType = 1 << 6, // 复合类型,暂时不存在\n\n VariableType = BasicType | DrilldownType | EnumerateType | UnionType,\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n BehaviorSubject,\n animationFrameScheduler,\n debounceTime,\n distinctUntilChanged,\n map,\n skip,\n tap,\n} from 'rxjs';\nimport { nanoid } from 'nanoid';\nimport { shallowEqual } from 'fast-equals';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { subsToDisposable } from '../utils/toDisposable';\nimport { updateChildNodeHelper } from './utils/helpers';\nimport { type Scope } from '../scope';\nimport {\n type ASTNodeJSON,\n type ObserverOrNext,\n type ASTKindType,\n type CreateASTParams,\n type Identifier,\n SubscribeConfig,\n GlobalEventActionType,\n DisposeASTAction,\n UpdateASTAction,\n} from './types';\nimport { ASTNodeFlags } from './flags';\n\nexport interface ASTNodeRegistry<JSON extends ASTNodeJSON = any, InjectOpts = any> {\n kind: string;\n new (params: CreateASTParams, injectOpts: InjectOpts): ASTNode<JSON>;\n}\n\nexport abstract class ASTNode<JSON extends ASTNodeJSON = any, InjectOpts = any>\n implements Disposable\n{\n /**\n * @deprecated\n * 获取 ASTNode 注入的 opts\n *\n * 请使用 @injectToAst(XXXService) declare xxxService: XXXService 实现外部依赖注入\n */\n public readonly opts?: InjectOpts;\n\n /**\n * 节点的唯一标识符,节点不指定则默认由 nanoid 生成,不可更改\n * - 如需要生成新 key,则销毁当前节点并生成新的节点\n */\n public readonly key: Identifier;\n\n /**\n * 节点类型\n */\n static readonly kind: ASTKindType;\n\n /**\n * 节点 Flags,记录一些 Flag 信息\n */\n public readonly flags: number = ASTNodeFlags.None;\n\n /**\n * 节点所处的作用域\n */\n public readonly scope: Scope;\n\n /**\n * 父节点\n */\n public readonly parent: ASTNode | undefined;\n\n /**\n * 节点的版本号,每 fireChange 一次 version + 1\n */\n protected _version: number = 0;\n\n /**\n * 更新锁\n */\n public changeLocked = false;\n\n /**\n * Batch Update 相关参数\n */\n private _batch: {\n batching: boolean;\n hasChangesInBatch: boolean;\n } = {\n batching: false,\n hasChangesInBatch: false,\n };\n\n /**\n * AST 节点变化事件,基于 Rxjs 实现\n * - 使用了 BehaviorSubject, 在订阅时会自动触发一次事件,事件为当前值\n */\n public readonly value$: BehaviorSubject<ASTNode> = new BehaviorSubject<ASTNode>(this as ASTNode);\n\n /**\n * 子节点\n */\n protected _children = new Set<ASTNode>();\n\n /**\n * 删除节点处理事件列表\n */\n public readonly toDispose: DisposableCollection = new DisposableCollection(\n Disposable.create(() => {\n // 子元素删除时,父元素触发更新\n this.parent?.fireChange();\n this.children.forEach((child) => child.dispose());\n })\n );\n\n /**\n * 销毁时触发的回调\n */\n onDispose = this.toDispose.onDispose;\n\n /**\n * 构造函数\n * @param createParams 创建 ASTNode 的必要参数\n * @param injectOptions 依赖注入各种模块\n */\n constructor({ key, parent, scope }: CreateASTParams, opts?: InjectOpts) {\n this.scope = scope;\n this.parent = parent;\n this.opts = opts;\n\n // 初始化 key 值,如果有传入 key 按照传入的来,否则按照 nanoid 随机生成\n this.key = key || nanoid();\n\n // 后续调用 fromJSON 内的所有 fireChange 合并成一个\n this.fromJSON = this.withBatchUpdate(this.fromJSON.bind(this));\n }\n\n /**\n * AST 节点的类型\n */\n get kind(): string {\n if (!(this.constructor as any).kind) {\n throw new Error(`ASTNode Registry need a kind: ${this.constructor.name}`);\n }\n return (this.constructor as any).kind;\n }\n\n /**\n * 解析 AST JSON 数据\n * @param json AST JSON 数据\n */\n abstract fromJSON(json: JSON): void;\n\n /**\n * 获取当前节点所有子节点\n */\n get children(): ASTNode[] {\n return Array.from(this._children);\n }\n\n /**\n * 转化为 ASTNodeJSON\n * @returns\n */\n toJSON(): ASTNodeJSON {\n // 提示用户自己实现 ASTNode 的 toJSON,不要用兜底实现\n console.warn('[VariableEngine] Please Implement toJSON method for ' + this.kind);\n\n return {\n kind: this.kind,\n };\n }\n\n /**\n * 创建子节点\n * @param json 子节点的 AST JSON\n * @returns\n */\n protected createChildNode<ChildNode extends ASTNode = ASTNode>(json: ASTNodeJSON): ChildNode {\n const astRegisters = this.scope.variableEngine.astRegisters;\n\n const child = astRegisters.createAST(json, {\n parent: this,\n scope: this.scope,\n }) as ChildNode;\n\n // 加入 _children 集合\n this._children.add(child);\n child.toDispose.push(\n Disposable.create(() => {\n this._children.delete(child);\n })\n );\n\n return child;\n }\n\n /**\n * 更新子节点,快速实现子节点更新消费逻辑\n * @param keyInThis 当前对象上的指定 key\n */\n protected updateChildNodeByKey(keyInThis: keyof this, nextJSON?: ASTNodeJSON) {\n this.withBatchUpdate(updateChildNodeHelper).call(this, {\n getChildNode: () => this[keyInThis] as ASTNode,\n updateChildNode: (_node) => ((this as any)[keyInThis] = _node),\n removeChildNode: () => ((this as any)[keyInThis] = undefined),\n nextJSON,\n });\n }\n\n /**\n * 批处理更新,批处理函数内所有的 fireChange 都合并成一个\n * @param updater 批处理函数\n * @returns\n */\n protected withBatchUpdate<ParamTypes extends any[], ReturnType>(\n updater: (...args: ParamTypes) => ReturnType\n ) {\n return (...args: ParamTypes) => {\n // batchUpdate 里面套 batchUpdate 只能生效一次\n if (this._batch.batching) {\n return updater.call(this, ...args);\n }\n\n this._batch.hasChangesInBatch = false;\n\n this._batch.batching = true;\n const res = updater.call(this, ...args);\n this._batch.batching = false;\n\n if (this._batch.hasChangesInBatch) {\n this.fireChange();\n }\n this._batch.hasChangesInBatch = false;\n\n return res;\n };\n }\n\n /**\n * 触发当前节点更新\n */\n fireChange(): void {\n if (this.changeLocked || this.disposed) {\n return;\n }\n\n if (this._batch.batching) {\n this._batch.hasChangesInBatch = true;\n return;\n }\n\n this._version++;\n this.value$.next(this);\n this.dispatchGlobalEvent<UpdateASTAction>({ type: 'UpdateAST' });\n this.parent?.fireChange();\n }\n\n /**\n * 节点的版本值\n * - 通过 NodeA === NodeB && versionA === versionB 可以比较两者是否相等\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * 节点唯一 hash 值\n */\n get hash(): string {\n return `${this._version}${this.kind}${this.key}`;\n }\n\n /**\n * 监听 AST 节点的变化\n * @param observer 监听回调\n * @param selector 监听指定数据\n * @returns\n */\n subscribe<Data = this>(\n observer: ObserverOrNext<Data>,\n { selector, debounceAnimation, triggerOnInit }: SubscribeConfig<this, Data> = {}\n ): Disposable {\n return subsToDisposable(\n this.value$\n .pipe(\n map(() => (selector ? selector(this) : (this as any))),\n distinctUntilChanged(\n (a, b) => shallowEqual(a, b),\n (value) => {\n if (value instanceof ASTNode) {\n // 如果 value 是 ASTNode,则进行 hash 的比较\n return value.hash;\n }\n return value;\n }\n ),\n // 默认跳过 BehaviorSubject 第一次触发\n triggerOnInit ? tap(() => null) : skip(1),\n // 每个 animationFrame 内所有更新合并成一个\n debounceAnimation ? debounceTime(0, animationFrameScheduler) : tap(() => null)\n )\n .subscribe(observer)\n );\n }\n\n dispatchGlobalEvent<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n event: Omit<ActionType, 'ast'>\n ) {\n this.scope.event.dispatch({\n ...event,\n ast: this,\n });\n }\n\n /**\n * 销毁\n */\n dispose(): void {\n // 防止销毁多次\n if (this.toDispose.disposed) {\n return;\n }\n\n this.toDispose.dispose();\n this.dispatchGlobalEvent<DisposeASTAction>({ type: 'DisposeAST' });\n\n // complete 事件发出时,需要确保当前 ASTNode 为 disposed 状态\n this.value$.complete();\n this.value$.unsubscribe();\n }\n\n get disposed(): boolean {\n return this.toDispose.disposed;\n }\n\n /**\n * 节点扩展信息\n */\n [key: string]: unknown;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseVariableField } from '../declaration';\nimport { ASTNode } from '../ast-node';\nimport { UnionJSON } from './union';\n\nexport abstract class BaseType<JSON extends ASTNodeJSON = any, InjectOpts = any> extends ASTNode<\n JSON,\n InjectOpts\n> {\n public flags: number = ASTNodeFlags.BasicType;\n\n /**\n * 类型是否一致\n * @param targetTypeJSON\n */\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n\n // 如果是 Union 类型,有一个子类型保持相等即可\n if (targetTypeJSON?.kind === ASTKind.Union) {\n return ((targetTypeJSON as UnionJSON)?.types || [])?.some((_subType) =>\n this.isTypeEqual(_subType)\n );\n }\n\n return this.kind === targetTypeJSON?.kind;\n }\n\n /**\n * 可下钻类型需实现\n * @param keyPath\n */\n getByKeyPath(keyPath: string[] = []): BaseVariableField | undefined {\n throw new Error(`Get By Key Path is not implemented for Type: ${this.kind}`);\n }\n\n /**\n * Get AST JSON for current base type\n * @returns\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: this.kind,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseVariableField } from '../declaration';\nimport { BaseType } from './base-type';\n\nexport interface ArrayJSON {\n items?: ASTNodeJSONOrKind;\n}\n\nexport class ArrayType extends BaseType<ArrayJSON> {\n public flags: ASTNodeFlags = ASTNodeFlags.DrilldownType | ASTNodeFlags.EnumerateType;\n\n static kind: string = ASTKind.Array;\n\n items: BaseType;\n\n fromJSON({ items }: ArrayJSON): void {\n this.updateChildNodeByKey('items', parseTypeJsonOrKind(items));\n }\n\n // items 类型是否可下钻\n get canDrilldownItems(): boolean {\n return !!(this.items?.flags & ASTNodeFlags.DrilldownType);\n }\n\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n const [curr, ...rest] = keyPath || [];\n\n if (curr === '0' && this.canDrilldownItems) {\n // 数组第 0 项\n return this.items.getByKeyPath(rest);\n }\n\n return undefined;\n }\n\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n const isSuperEqual = super.isTypeEqual(targetTypeJSONOrKind);\n\n if (targetTypeJSON?.weak || targetTypeJSON?.kind === ASTKind.Union) {\n return isSuperEqual;\n }\n\n return (\n targetTypeJSON &&\n isSuperEqual &&\n // 弱比较,只需要比较 Kind 即可\n (targetTypeJSON?.weak || this.customStrongEqual(targetTypeJSON))\n );\n }\n\n /**\n * Array 强比较\n * @param targetTypeJSON\n * @returns\n */\n protected customStrongEqual(targetTypeJSON: ASTNodeJSON): boolean {\n if (!this.items) {\n return !(targetTypeJSON as ArrayJSON)?.items;\n }\n return this.items?.isTypeEqual((targetTypeJSON as ArrayJSON).items);\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.Array,\n items: this.items?.toJSON(),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseType } from './base-type';\n\nexport interface StringJSON {\n /**\n * https://json-schema.org/understanding-json-schema/reference/type#format\n */\n format?: string;\n}\n\nexport class StringType extends BaseType {\n public flags: ASTNodeFlags = ASTNodeFlags.BasicType;\n\n static kind: string = ASTKind.String;\n\n protected _format?: string;\n\n /**\n * https://json-schema.org/understanding-json-schema/reference/type#format\n */\n get format() {\n return this._format;\n }\n\n fromJSON(json?: StringJSON): void {\n if (json?.format !== this._format) {\n this._format = json?.format;\n this.fireChange();\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseType } from './base-type';\n\nexport class IntegerType extends BaseType {\n public flags: ASTNodeFlags = ASTNodeFlags.BasicType;\n\n static kind: string = ASTKind.Integer;\n\n fromJSON(): void {\n // noop\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { BaseType } from './base-type';\n\nexport class BooleanType extends BaseType {\n static kind: string = ASTKind.Boolean;\n\n fromJSON(): void {\n // noop\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { BaseType } from './base-type';\n\nexport class NumberType extends BaseType {\n static kind: string = ASTKind.Number;\n\n fromJSON(): void {\n // noop\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { BaseType } from './base-type';\n\nexport interface MapJSON {\n keyType?: ASTNodeJSONOrKind;\n valueType?: ASTNodeJSONOrKind;\n}\n\nexport class MapType extends BaseType<MapJSON> {\n // public flags: ASTNodeFlags = ASTNodeFlags.DrilldownType | ASTNodeFlags.EnumerateType;\n\n static kind: string = ASTKind.Map;\n\n keyType: BaseType;\n\n valueType: BaseType;\n\n fromJSON({ keyType = ASTKind.String, valueType }: MapJSON): void {\n // Key 默认为 String\n this.updateChildNodeByKey('keyType', parseTypeJsonOrKind(keyType));\n this.updateChildNodeByKey('valueType', parseTypeJsonOrKind(valueType));\n }\n\n // Value 类型是否可下钻,后续实现\n // get canDrilldownValue(): boolean {\n // return !!(this.valueType.flags & ASTNodeFlags.DrilldownType);\n // }\n\n // getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n // const [curr, ...rest] = keyPath || [];\n\n // if (curr === '*' && this.canDrilldownValue) {\n // return this.valueType.getByKeyPath(rest);\n // }\n\n // return undefined;\n // }\n\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n const isSuperEqual = super.isTypeEqual(targetTypeJSONOrKind);\n\n if (targetTypeJSON?.weak || targetTypeJSON?.kind === ASTKind.Union) {\n return isSuperEqual;\n }\n\n return (\n targetTypeJSON &&\n isSuperEqual &&\n // 弱比较,只需要比较 Kind 即可\n (targetTypeJSON?.weak || this.customStrongEqual(targetTypeJSON))\n );\n }\n\n /**\n * Map 强比较\n * @param targetTypeJSON\n * @returns\n */\n protected customStrongEqual(targetTypeJSON: ASTNodeJSON): boolean {\n const { keyType = ASTKind.String, valueType } = targetTypeJSON as MapJSON;\n\n const isValueTypeEqual =\n (!valueType && !this.valueType) || this.valueType?.isTypeEqual(valueType);\n\n return isValueTypeEqual && this.keyType?.isTypeEqual(keyType);\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.Map,\n keyType: this.keyType?.toJSON(),\n valueType: this.valueType?.toJSON(),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { xor } from 'lodash-es';\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTNodeJSON, ASTKind, ASTNodeJSONOrKind, type GlobalEventActionType } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { Property, type PropertyJSON } from '../declaration/property';\nimport { BaseType } from './base-type';\n\nexport interface ObjectJSON<VariableMeta = any> {\n /**\n * Object 的 properties 一定是 Property 类型,因此业务可以不用填 kind\n */\n properties?: PropertyJSON<VariableMeta>[];\n}\n\nexport type ObjectPropertiesChangeAction = GlobalEventActionType<\n 'ObjectPropertiesChange',\n {\n prev: Property[];\n next: Property[];\n },\n ObjectType\n>;\n\nexport class ObjectType extends BaseType<ObjectJSON> {\n public flags: ASTNodeFlags = ASTNodeFlags.DrilldownType;\n\n static kind: string = ASTKind.Object;\n\n propertyTable: Map<string, Property> = new Map();\n\n properties: Property[];\n\n fromJSON({ properties }: ObjectJSON): void {\n const removedKeys = new Set(this.propertyTable.keys());\n const prev = [...(this.properties || [])];\n\n // 遍历新的 properties\n this.properties = (properties || []).map((property: PropertyJSON) => {\n const existProperty = this.propertyTable.get(property.key);\n removedKeys.delete(property.key);\n\n if (existProperty) {\n existProperty.fromJSON(property as PropertyJSON);\n\n return existProperty;\n } else {\n const newProperty = this.createChildNode({\n ...property,\n kind: ASTKind.Property,\n }) as Property;\n\n this.fireChange();\n\n this.propertyTable.set(property.key, newProperty);\n // TODO 子节点主动销毁时,删除表格中的信息\n\n return newProperty;\n }\n });\n\n // 删除没有出现过的 property\n removedKeys.forEach((key) => {\n const property = this.propertyTable.get(key);\n property?.dispose();\n this.propertyTable.delete(key);\n this.fireChange();\n });\n\n this.dispatchGlobalEvent<ObjectPropertiesChangeAction>({\n type: 'ObjectPropertiesChange',\n payload: {\n prev,\n next: [...this.properties],\n },\n });\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.Object,\n properties: this.properties.map((_property) => _property.toJSON()),\n };\n }\n\n /**\n * 根据 KeyPath 找到对应的变量\n * @param keyPath 变量路径\n * @returns\n */\n getByKeyPath(keyPath: string[]): Property | undefined {\n const [curr, ...restKeyPath] = keyPath;\n\n const property = this.propertyTable.get(curr);\n\n // 找到头了\n if (!restKeyPath.length) {\n return property;\n }\n\n // 否则继续往下找\n if (property?.type && property?.type?.flags & ASTNodeFlags.DrilldownType) {\n return property.type.getByKeyPath(restKeyPath) as Property | undefined;\n }\n\n return undefined;\n }\n\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n const isSuperEqual = super.isTypeEqual(targetTypeJSONOrKind);\n\n if (targetTypeJSON?.weak || targetTypeJSON?.kind === ASTKind.Union) {\n return isSuperEqual;\n }\n\n return (\n targetTypeJSON &&\n isSuperEqual &&\n // 弱比较,只需要比较 Kind 即可\n (targetTypeJSON?.weak || this.customStrongEqual(targetTypeJSON))\n );\n }\n\n /**\n * Object 类型强比较\n * @param targetTypeJSON\n * @returns\n */\n protected customStrongEqual(targetTypeJSON: ASTNodeJSON): boolean {\n const targetProperties = (targetTypeJSON as ObjectJSON).properties || [];\n\n const sourcePropertyKeys = Array.from(this.propertyTable.keys());\n const targetPropertyKeys = targetProperties.map((_target) => _target.key);\n\n const isKeyStrongEqual = !xor(sourcePropertyKeys, targetPropertyKeys).length;\n\n return (\n isKeyStrongEqual &&\n targetProperties.every((targetProperty) => {\n const sourceProperty = this.propertyTable.get(targetProperty.key);\n\n return (\n sourceProperty &&\n sourceProperty.key === targetProperty.key &&\n sourceProperty.type?.isTypeEqual(targetProperty?.type)\n );\n })\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSONOrKind } from '../types';\nimport { type UnionJSON } from './union';\nimport { BaseType } from './base-type';\n\nexport interface CustomTypeJSON {\n typeName: string;\n}\n\nexport class CustomType extends BaseType<CustomTypeJSON> {\n static kind: string = ASTKind.CustomType;\n\n protected _typeName: string;\n\n get typeName(): string {\n return this._typeName;\n }\n\n fromJSON(json: CustomTypeJSON): void {\n if (this._typeName !== json.typeName) {\n this._typeName = json.typeName;\n this.fireChange();\n }\n }\n\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n\n // 如果是 Union 类型,有一个子类型保持相等即可\n if (targetTypeJSON?.kind === ASTKind.Union) {\n return ((targetTypeJSON as UnionJSON)?.types || [])?.some((_subType) =>\n this.isTypeEqual(_subType)\n );\n }\n\n return targetTypeJSON?.kind === this.kind && targetTypeJSON?.typeName === this.typeName;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n type Observable,\n distinctUntilChanged,\n map,\n switchMap,\n combineLatest,\n of,\n Subject,\n share,\n} from 'rxjs';\nimport { shallowEqual } from 'fast-equals';\n\nimport { getParentFields } from '../utils/variable-field';\nimport { ASTNodeJSON, type CreateASTParams } from '../types';\nimport { type BaseType } from '../type';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseVariableField } from '../declaration';\nimport { ASTNode } from '../ast-node';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { IVariableTable } from '../../scope/types';\n\ntype ExpressionRefs = (BaseVariableField | undefined)[];\n\nexport abstract class BaseExpression<\n JSON extends ASTNodeJSON = any,\n InjectOpts = any\n> extends ASTNode<JSON, InjectOpts> {\n public flags: ASTNodeFlags = ASTNodeFlags.Expression;\n\n /**\n * 获取全局变量表,方便表达式获取引用变量\n */\n get globalVariableTable(): IVariableTable {\n return this.scope.variableEngine.globalVariableTable;\n }\n\n /**\n * 父变量字段,通过由近而远的方式进行排序\n */\n get parentFields(): BaseVariableField[] {\n return getParentFields(this);\n }\n\n /**\n * 获取表达式引用的变量字段\n * - 通常是 变量 VariableDeclaration,或者 属性 Property 节点\n */\n abstract getRefFields(): ExpressionRefs;\n\n /**\n * 表达式返回的数据类型\n */\n abstract returnType: BaseType | undefined;\n\n /**\n * 引用变量\n */\n protected _refs: ExpressionRefs = [];\n\n get refs(): ExpressionRefs {\n return this._refs;\n }\n\n protected refreshRefs$: Subject<void> = new Subject();\n\n /**\n * 刷新变量引用\n */\n refreshRefs() {\n this.refreshRefs$.next();\n }\n\n /**\n * 监听引用变量变化\n * 监听 [a.b.c] -> [a.b]\n */\n refs$: Observable<ExpressionRefs> = this.refreshRefs$.pipe(\n map(() => this.getRefFields()),\n distinctUntilChanged<ExpressionRefs>(shallowEqual),\n switchMap((refs) =>\n !refs?.length\n ? of([])\n : combineLatest(\n refs.map((ref) =>\n ref\n ? (ref.value$ as unknown as Observable<BaseVariableField | undefined>)\n : of(undefined)\n )\n )\n ),\n share()\n );\n\n constructor(params: CreateASTParams, opts?: InjectOpts) {\n super(params, opts);\n\n this.toDispose.push(\n subsToDisposable(\n this.refs$.subscribe((_refs: ExpressionRefs) => {\n this._refs = _refs;\n this.fireChange();\n })\n )\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTNodeFlags } from '../flags';\nimport { BaseVariableField } from '../declaration';\nimport { ASTNode } from '../ast-node';\n\n/**\n * 父变量字段,通过由近而远的方式进行排序\n */\nexport function getParentFields(ast: ASTNode): BaseVariableField[] {\n let curr = ast.parent;\n const res: BaseVariableField[] = [];\n\n while (curr) {\n if (curr.flags & ASTNodeFlags.VariableField) {\n res.push(curr as BaseVariableField);\n }\n curr = curr.parent;\n }\n\n return res;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { ASTNodeJSON, ASTKind, CreateASTParams } from '../types';\nimport { BaseType } from '../type';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseVariableField } from '../declaration';\nimport { BaseExpression } from './base-expression';\n\nexport interface KeyPathExpressionJSON {\n keyPath: string[];\n}\n\nexport class KeyPathExpression<\n CustomPathJSON extends ASTNodeJSON = KeyPathExpressionJSON,\n> extends BaseExpression<CustomPathJSON> {\n static kind: string = ASTKind.KeyPathExpression;\n\n protected _keyPath: string[] = [];\n\n get keyPath(): string[] {\n return this._keyPath;\n }\n\n getRefFields(): BaseVariableField[] {\n const ref = this.scope.available.getByKeyPath(this._keyPath);\n return ref ? [ref] : [];\n }\n\n get returnType(): BaseType | undefined {\n const [refNode] = this._refs || [];\n\n // 获取引用变量的类型\n if (refNode && refNode.flags & ASTNodeFlags.VariableField) {\n return refNode.type;\n }\n\n return;\n }\n\n /**\n * 业务重改该方法可快速定制自己的 Path 表达式\n * - 只需要将业务的 Path 解析为变量系统的 KeyPath 即可\n * @param json 业务定义的 Path 表达式\n * @returns\n */\n protected parseToKeyPath(json: CustomPathJSON): string[] {\n // 默认 JSON 为 KeyPathExpressionJSON 格式\n return (json as unknown as KeyPathExpressionJSON).keyPath;\n }\n\n fromJSON(json: CustomPathJSON): void {\n const keyPath = this.parseToKeyPath(json);\n\n if (!shallowEqual(keyPath, this._keyPath)) {\n this._keyPath = keyPath;\n\n // keyPath 更新后,需刷新引用变量\n this.refreshRefs();\n }\n }\n\n constructor(params: CreateASTParams, opts: any) {\n super(params, opts);\n\n this.toDispose.pushAll([\n // 可以用变量列表变化时候 (有新增或者删除时)\n this.scope.available.onVariableListChange(() => {\n this.refreshRefs();\n }),\n // this._keyPath 指向的可引用变量发生变化时,刷新引用数据\n this.scope.available.onAnyVariableChange(_v => {\n if (_v.key === this._keyPath[0]) {\n this.refreshRefs();\n }\n }),\n ]);\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.KeyPathExpression,\n keyPath: this._keyPath,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ArrayType } from '../type/array';\nimport { BaseType } from '../type';\nimport { BaseExpression } from './base-expression';\n\nexport interface EnumerateExpressionJSON {\n enumerateFor: ASTNodeJSON; // 需要被遍历的表达式类型\n}\n\n/**\n * 遍历表达式,对列表进行遍历,获取遍历后的变量类型\n */\nexport class EnumerateExpression extends BaseExpression<EnumerateExpressionJSON> {\n static kind: string = ASTKind.EnumerateExpression;\n\n protected _enumerateFor: BaseExpression | undefined;\n\n get enumerateFor() {\n return this._enumerateFor;\n }\n\n get returnType(): BaseType | undefined {\n // 被遍历表达式的返回值\n const childReturnType = this.enumerateFor?.returnType;\n\n if (childReturnType?.kind === ASTKind.Array) {\n // 获取 Array 的 Item 类型\n return (childReturnType as ArrayType).items;\n }\n\n return undefined;\n }\n\n getRefFields(): [] {\n return [];\n }\n\n fromJSON({ enumerateFor: expression }: EnumerateExpressionJSON): void {\n this.updateChildNodeByKey('_enumerateFor', expression);\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.EnumerateExpression,\n enumerateFor: this.enumerateFor?.toJSON(),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { checkRefCycle } from '../utils/expression';\nimport { ASTNodeJSON, ASTKind, CreateASTParams } from '../types';\nimport { BaseType } from '../type';\nimport { type BaseVariableField } from '../declaration';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { BaseExpression } from './base-expression';\n\ninterface KeyPathExpressionJSON {\n keyPath: string[];\n}\n\n/**\n * 新版 KeyPathExpressionV2,相比旧版:\n * - returnType 拷贝新一份,避免引用问题\n * - 引入成环检测\n */\nexport class KeyPathExpressionV2<\n CustomPathJSON extends ASTNodeJSON = KeyPathExpressionJSON,\n> extends BaseExpression<CustomPathJSON> {\n static kind: string = ASTKind.KeyPathExpression;\n\n protected _keyPath: string[] = [];\n\n get keyPath(): string[] {\n return this._keyPath;\n }\n\n getRefFields(): BaseVariableField[] {\n const ref = this.scope.available.getByKeyPath(this._keyPath);\n\n // 刷新引用时,检测循环引用,如果存在循环引用则不引用该变量\n if (checkRefCycle(this, [ref])) {\n // 提示存在循环引用\n console.warn(\n '[CustomKeyPathExpression] checkRefCycle: Reference Cycle Existed',\n this.parentFields.map(_field => _field.key).reverse(),\n );\n return [];\n }\n\n return ref ? [ref] : [];\n }\n\n // 直接生成新的 returnType 节点而不是直接复用\n // 确保不同的 keyPath 不指向同一个 Field\n _returnType: BaseType;\n\n get returnType() {\n return this._returnType;\n }\n\n /**\n * 业务重改该方法可快速定制自己的 Path 表达式\n * - 只需要将业务的 Path 解析为变量系统的 KeyPath 即可\n * @param json 业务定义的 Path 表达式\n * @returns\n */\n protected parseToKeyPath(json: CustomPathJSON): string[] {\n // 默认 JSON 为 KeyPathExpressionJSON 格式\n return (json as unknown as KeyPathExpressionJSON).keyPath;\n }\n\n fromJSON(json: CustomPathJSON): void {\n const keyPath = this.parseToKeyPath(json);\n\n if (!shallowEqual(keyPath, this._keyPath)) {\n this._keyPath = keyPath;\n\n // keyPath 更新后,需刷新引用变量\n this.refreshRefs();\n }\n }\n\n getReturnTypeJSONByRef(_ref: BaseVariableField | undefined): ASTNodeJSON | undefined {\n return _ref?.type?.toJSON();\n }\n\n protected prevRefTypeHash: string | undefined;\n\n constructor(params: CreateASTParams, opts: any) {\n super(params, opts);\n\n this.toDispose.pushAll([\n // 可以用变量列表变化时候 (有新增或者删除时)\n this.scope.available.onVariableListChange(() => {\n this.refreshRefs();\n }),\n // this._keyPath 指向的可引用变量发生变化时,刷新引用数据\n this.scope.available.onAnyVariableChange(_v => {\n if (_v.key === this._keyPath[0]) {\n this.refreshRefs();\n }\n }),\n subsToDisposable(\n this.refs$.subscribe(_type => {\n const [ref] = this._refs;\n\n if (this.prevRefTypeHash !== ref?.type?.hash) {\n this.prevRefTypeHash = ref?.type?.hash;\n this.updateChildNodeByKey('_returnType', this.getReturnTypeJSONByRef(ref));\n }\n }),\n ),\n ]);\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.KeyPathExpression,\n keyPath: this._keyPath,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { intersection } from 'lodash-es';\n\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseExpression } from '../expression';\nimport { type BaseVariableField } from '../declaration';\nimport { type ASTNode } from '../ast-node';\nimport { getParentFields } from './variable-field';\nimport { getAllChildren } from './helpers';\n\n// 获取所有子 AST 引用的变量\nexport function getAllRefs(ast: ASTNode): BaseVariableField[] {\n return getAllChildren(ast)\n .filter((_child) => _child.flags & ASTNodeFlags.Expression)\n .map((_child) => (_child as BaseExpression).refs)\n .flat()\n .filter(Boolean) as BaseVariableField[];\n}\n\n/**\n * 检测是否成环\n * @param curr 当前表达式\n * @param refNode 引用的变量节点\n * @returns 是否成环\n */\nexport function checkRefCycle(\n curr: BaseExpression,\n refNodes: (BaseVariableField | undefined)[]\n): boolean {\n // 作用域没有成环,则不可能成环\n if (\n intersection(curr.scope.coverScopes, refNodes.map((_ref) => _ref?.scope).filter(Boolean))\n .length === 0\n ) {\n return false;\n }\n\n // BFS 遍历\n const visited = new Set<BaseVariableField>();\n const queue = [...refNodes];\n\n while (queue.length) {\n const currNode = queue.shift()!;\n visited.add(currNode);\n\n for (const ref of getAllRefs(currNode).filter((_ref) => !visited.has(_ref))) {\n queue.push(ref);\n }\n }\n\n // 引用的变量中,包含表达式的父变量,则成环\n return intersection(Array.from(visited), getParentFields(curr)).length > 0;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { postConstructAST } from '../utils/inversify';\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { BaseType } from '../type';\nimport { BaseExpression } from './base-expression';\n\nexport interface WrapArrayExpressionJSON {\n wrapFor: ASTNodeJSON; // 需要被遍历的表达式类型\n}\n\n/**\n * 遍历表达式,对列表进行遍历,获取遍历后的变量类型\n */\nexport class WrapArrayExpression extends BaseExpression<WrapArrayExpressionJSON> {\n static kind: string = ASTKind.WrapArrayExpression;\n\n protected _wrapFor: BaseExpression | undefined;\n\n protected _returnType: BaseType | undefined;\n\n get wrapFor() {\n return this._wrapFor;\n }\n\n get returnType(): BaseType | undefined {\n return this._returnType;\n }\n\n refreshReturnType() {\n // 被遍历表达式的返回值\n const childReturnTypeJSON = this.wrapFor?.returnType?.toJSON();\n\n this.updateChildNodeByKey('_returnType', {\n kind: ASTKind.Array,\n items: childReturnTypeJSON,\n });\n }\n\n getRefFields(): [] {\n return [];\n }\n\n fromJSON({ wrapFor: expression }: WrapArrayExpressionJSON): void {\n this.updateChildNodeByKey('_wrapFor', expression);\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.WrapArrayExpression,\n wrapFor: this.wrapFor?.toJSON(),\n };\n }\n\n @postConstructAST()\n protected init() {\n this.refreshReturnType = this.refreshReturnType.bind(this);\n\n this.toDispose.push(\n this.subscribe(this.refreshReturnType, {\n selector: (curr) => curr.wrapFor?.returnType,\n triggerOnInit: true,\n })\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { getParentFields } from '../utils/variable-field';\nimport { ASTNodeJSON, ASTNodeJSONOrKind, Identifier } from '../types';\nimport { type BaseType } from '../type';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseExpression } from '../expression';\nimport { ASTNode } from '../ast-node';\n\n/**\n * 声明类 AST 节点\n */\nexport type BaseVariableFieldJSON<VariableMeta = any> = {\n key?: Identifier;\n type?: ASTNodeJSONOrKind;\n initializer?: ASTNodeJSON; // 变量初始化表达式\n meta?: VariableMeta;\n};\n\nexport abstract class BaseVariableField<VariableMeta = any> extends ASTNode<\n BaseVariableFieldJSON<VariableMeta>\n> {\n public flags: ASTNodeFlags = ASTNodeFlags.VariableField;\n\n protected _type?: BaseType;\n\n protected _meta: VariableMeta = {} as any;\n\n protected _initializer?: BaseExpression;\n\n /**\n * 父变量字段,通过由近而远的方式进行排序\n */\n get parentFields(): BaseVariableField[] {\n return getParentFields(this);\n }\n\n get keyPath(): string[] {\n return [...this.parentFields.reverse().map((_field) => _field.key), this.key];\n }\n\n get meta(): VariableMeta {\n return this._meta;\n }\n\n get type(): BaseType {\n return (this._initializer?.returnType || this._type)!;\n }\n\n get initializer(): BaseExpression | undefined {\n return this._initializer;\n }\n\n get hash(): string {\n return `[${this._version}]${this.keyPath.join('.')}`;\n }\n\n /**\n * 解析 VariableDeclarationJSON 从而生成变量声明节点\n */\n fromJSON({ type, initializer, meta }: BaseVariableFieldJSON<VariableMeta>): void {\n // 类型变化\n this.updateType(type);\n\n // 表达式更新\n this.updateInitializer(initializer);\n\n // Extra 更新\n this.updateMeta(meta!);\n }\n\n updateType(type: BaseVariableFieldJSON['type']) {\n const nextTypeJson = typeof type === 'string' ? { kind: type } : type;\n this.updateChildNodeByKey('_type', nextTypeJson);\n }\n\n updateInitializer(nextInitializer?: BaseVariableFieldJSON['initializer']) {\n this.updateChildNodeByKey('_initializer', nextInitializer);\n }\n\n updateMeta(nextMeta: VariableMeta) {\n if (!shallowEqual(nextMeta, this._meta)) {\n this._meta = nextMeta;\n this.fireChange();\n }\n }\n\n /**\n * 根据 keyPath 去找下钻的变量字段\n * @param keyPath\n * @returns\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n if (this.type?.flags & ASTNodeFlags.DrilldownType) {\n return this.type.getByKeyPath(keyPath) as BaseVariableField | undefined;\n }\n\n return undefined;\n }\n\n /**\n * 监听类型变化\n * @param observer\n * @returns\n */\n onTypeChange(observer: (type: ASTNode | undefined) => void) {\n return this.subscribe(observer, { selector: (curr) => curr.type });\n }\n\n /**\n * 转换为 JSON\n * @returns\n */\n toJSON(): BaseVariableFieldJSON<VariableMeta> & { kind: string } {\n return {\n kind: this.kind,\n key: this.key,\n type: this.type?.toJSON(),\n initializer: this.initializer?.toJSON(),\n meta: this._meta,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, GlobalEventActionType, type CreateASTParams } from '../types';\nimport { ASTNode } from '../ast-node';\nimport { BaseVariableField, BaseVariableFieldJSON } from './base-variable-field';\n\n/**\n * 声明类 AST 节点\n */\nexport type VariableDeclarationJSON<VariableMeta = any> = BaseVariableFieldJSON<VariableMeta> & {\n order?: number; // 变量排序\n};\n\nexport type ReSortVariableDeclarationsAction = GlobalEventActionType<'ReSortVariableDeclarations'>;\n\nexport class VariableDeclaration<VariableMeta = any> extends BaseVariableField<VariableMeta> {\n static kind: string = ASTKind.VariableDeclaration;\n\n protected _order: number = 0;\n\n get order(): number {\n return this._order;\n }\n\n constructor(params: CreateASTParams) {\n super(params);\n }\n\n /**\n * 解析 VariableDeclarationJSON 从而生成变量声明节点\n */\n fromJSON({ order, ...rest }: VariableDeclarationJSON<VariableMeta>): void {\n // 更新排序\n this.updateOrder(order);\n\n // 更新其他信息\n super.fromJSON(rest as BaseVariableFieldJSON<VariableMeta>);\n }\n\n updateOrder(order: number = 0): void {\n if (order !== this._order) {\n this._order = order;\n this.dispatchGlobalEvent<ReSortVariableDeclarationsAction>({\n type: 'ReSortVariableDeclarations',\n });\n this.fireChange();\n }\n }\n\n // 监听类型变化\n onTypeChange(observer: (type: ASTNode | undefined) => void) {\n return this.subscribe(observer, { selector: (curr) => curr.type });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { GlobalEventActionType } from '../types';\nimport { ASTNode } from '../ast-node';\nimport { type VariableDeclarationJSON, VariableDeclaration } from './variable-declaration';\n\nexport interface VariableDeclarationListJSON<VariableMeta = any> {\n /**\n * declarations 一定是 VariableDeclaration 类型,因此业务可以不用填 kind\n */\n declarations?: VariableDeclarationJSON<VariableMeta>[];\n startOrder?: number; // 变量起始的排序序号\n}\n\nexport type VariableDeclarationListChangeAction = GlobalEventActionType<\n 'VariableListChange',\n {\n prev: VariableDeclaration[];\n next: VariableDeclaration[];\n },\n VariableDeclarationList\n>;\n\nexport class VariableDeclarationList extends ASTNode<VariableDeclarationListJSON> {\n static kind: string = ASTKind.VariableDeclarationList;\n\n declarationTable: Map<string, VariableDeclaration> = new Map();\n\n declarations: VariableDeclaration[];\n\n fromJSON({ declarations, startOrder }: VariableDeclarationListJSON): void {\n const removedKeys = new Set(this.declarationTable.keys());\n const prev = [...(this.declarations || [])];\n\n // 遍历新的 properties\n this.declarations = (declarations || []).map(\n (declaration: VariableDeclarationJSON, idx: number) => {\n const order = (startOrder || 0) + idx;\n\n // 如果没有设置 key,则复用上次的 key\n const declarationKey = declaration.key || this.declarations?.[idx]?.key;\n const existDeclaration = this.declarationTable.get(declarationKey);\n if (declarationKey) {\n removedKeys.delete(declarationKey);\n }\n\n if (existDeclaration) {\n existDeclaration.fromJSON({ order, ...declaration });\n\n return existDeclaration;\n } else {\n const newDeclaration = this.createChildNode({\n order,\n ...declaration,\n kind: ASTKind.VariableDeclaration,\n }) as VariableDeclaration;\n this.fireChange();\n\n this.declarationTable.set(newDeclaration.key, newDeclaration);\n\n return newDeclaration;\n }\n },\n );\n\n // 删除没有出现过的变量\n removedKeys.forEach(key => {\n const declaration = this.declarationTable.get(key);\n declaration?.dispose();\n this.declarationTable.delete(key);\n });\n\n this.dispatchGlobalEvent<VariableDeclarationListChangeAction>({\n type: 'VariableListChange',\n payload: {\n prev,\n next: [...this.declarations],\n },\n });\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.VariableDeclarationList,\n properties: this.declarations.map(_declaration => _declaration.toJSON()),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { BaseVariableField, BaseVariableFieldJSON } from './base-variable-field';\n\nexport type PropertyJSON<VariableMeta = any> = BaseVariableFieldJSON<VariableMeta> & {\n // Key 为必填项\n key: string;\n};\n\nexport class Property<VariableMeta = any> extends BaseVariableField<VariableMeta> {\n static kind: string = ASTKind.Property;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ASTNode } from '../ast-node';\n\n/**\n * 通用数据 AST 节点,无子节点\n */\nexport class DataNode<Data = any> extends ASTNode {\n static kind: string = ASTKind.DataNode;\n\n protected _data: Data;\n\n get data(): Data {\n return this._data;\n }\n\n fromJSON(json: Data): void {\n const { kind, ...restData } = json as ASTNodeJSON;\n\n if (!shallowEqual(restData, this._data)) {\n this._data = restData as unknown as Data;\n this.fireChange();\n }\n }\n\n toJSON() {\n return {\n kind: ASTKind.DataNode,\n ...this._data,\n };\n }\n\n partialUpdate(nextData: Data) {\n if (!shallowEqual(nextData, this._data)) {\n this._data = {\n ...this._data,\n ...nextData,\n };\n this.fireChange();\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ASTNode } from '../ast-node';\n\nexport interface ListNodeJSON {\n list: ASTNodeJSON[];\n}\n\nexport class ListNode extends ASTNode<ListNodeJSON> {\n static kind: string = ASTKind.ListNode;\n\n protected _list: ASTNode[];\n\n get list(): ASTNode[] {\n return this._list;\n }\n\n fromJSON({ list }: ListNodeJSON): void {\n // 超出长度的 children 需要被销毁\n this._list.slice(list.length).forEach(_item => {\n _item.dispose();\n this.fireChange();\n });\n\n // 剩余 children 的处理\n this._list = list.map((_item, idx) => {\n const prevItem = this._list[idx];\n\n if (prevItem.kind !== _item.kind) {\n prevItem.dispose();\n this.fireChange();\n return this.createChildNode(_item);\n }\n\n prevItem.fromJSON(_item);\n return prevItem;\n });\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.ListNode,\n list: this._list.map(item => item.toJSON()),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { updateChildNodeHelper } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ASTNode } from '../ast-node';\n\nexport interface MapNodeJSON {\n map: [string, ASTNodeJSON][];\n}\n\nexport class MapNode extends ASTNode<MapNodeJSON> {\n static kind: string = ASTKind.MapNode;\n\n protected map: Map<string, ASTNode> = new Map<string, ASTNode>();\n\n fromJSON({ map }: MapNodeJSON): void {\n const removedKeys = new Set(this.map.keys());\n\n for (const [key, item] of map || []) {\n removedKeys.delete(key);\n this.set(key, item);\n }\n\n for (const removeKey of Array.from(removedKeys)) {\n this.remove(removeKey);\n }\n }\n\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.MapNode,\n map: Array.from(this.map.entries()),\n };\n }\n\n /**\n * 往 Map 中设置 ASTNode\n * @param key ASTNode 的索引,\n * @param json\n */\n set<Node extends ASTNode = ASTNode>(key: string, nextJSON: ASTNodeJSON): Node {\n return this.withBatchUpdate(updateChildNodeHelper).call(this, {\n getChildNode: () => this.get(key),\n removeChildNode: () => this.map.delete(key),\n updateChildNode: nextNode => this.map.set(key, nextNode),\n nextJSON,\n }) as Node;\n }\n\n /**\n * 移除指定 ASTNode\n * @param key\n */\n remove(key: string) {\n this.get(key)?.dispose();\n this.map.delete(key);\n this.fireChange();\n }\n\n /**\n * 获取 ASTNode\n * @param key\n * @returns\n */\n get(key: string): ASTNode | undefined {\n return this.map.get(key);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from './types';\nimport { StringJSON } from './type/string';\nimport { MapJSON } from './type/map';\nimport { ArrayJSON } from './type/array';\nimport { CustomTypeJSON, ObjectJSON, UnionJSON } from './type';\nimport {\n EnumerateExpressionJSON,\n KeyPathExpressionJSON,\n WrapArrayExpressionJSON,\n} from './expression';\nimport { PropertyJSON, VariableDeclarationJSON, VariableDeclarationListJSON } from './declaration';\nimport { ASTNode } from './ast-node';\n\nexport namespace ASTFactory {\n /**\n * 类型相关\n * @returns\n */\n export const createString = (json?: StringJSON) => ({\n kind: ASTKind.String,\n ...(json || {}),\n });\n export const createNumber = () => ({ kind: ASTKind.Number });\n export const createBoolean = () => ({ kind: ASTKind.Boolean });\n export const createInteger = () => ({ kind: ASTKind.Integer });\n export const createObject = (json: ObjectJSON) => ({\n kind: ASTKind.Object,\n ...json,\n });\n export const createArray = (json: ArrayJSON) => ({\n kind: ASTKind.Array,\n ...json,\n });\n export const createMap = (json: MapJSON) => ({\n kind: ASTKind.Map,\n ...json,\n });\n export const createUnion = (json: UnionJSON) => ({\n kind: ASTKind.Union,\n ...json,\n });\n export const createCustomType = (json: CustomTypeJSON) => ({\n kind: ASTKind.CustomType,\n ...json,\n });\n\n /**\n * 声明相关\n */\n export const createVariableDeclaration = <VariableMeta = any>(\n json: VariableDeclarationJSON<VariableMeta>\n ) => ({\n kind: ASTKind.VariableDeclaration,\n ...json,\n });\n export const createProperty = <VariableMeta = any>(json: PropertyJSON<VariableMeta>) => ({\n kind: ASTKind.Property,\n ...json,\n });\n export const createVariableDeclarationList = (json: VariableDeclarationListJSON) => ({\n kind: ASTKind.VariableDeclarationList,\n ...json,\n });\n\n /**\n * 表达式相关\n */\n export const createEnumerateExpression = (json: EnumerateExpressionJSON) => ({\n kind: ASTKind.EnumerateExpression,\n ...json,\n });\n export const createKeyPathExpression = (json: KeyPathExpressionJSON) => ({\n kind: ASTKind.KeyPathExpression,\n ...json,\n });\n export const createWrapArrayExpression = (json: WrapArrayExpressionJSON) => ({\n kind: ASTKind.WrapArrayExpression,\n ...json,\n });\n\n /**\n * 通过 AST Class 创建\n */\n export const create = <JSON extends ASTNodeJSON>(\n targetType: { kind: string; new (...args: any[]): ASTNode<JSON> },\n json: JSON\n ) => ({ kind: targetType.kind, ...json });\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { VariableTable } from '../variable-table';\nimport { IVariableTable } from '../types';\nimport { type Scope } from '../scope';\nimport { type VariableEngine } from '../../variable-engine';\nimport { createMemo } from '../../utils/memo';\nimport { NewASTAction } from '../../ast/types';\nimport { DisposeASTAction } from '../../ast/types';\nimport { ReSortVariableDeclarationsAction } from '../../ast/declaration/variable-declaration';\nimport { ASTKind, type VariableDeclaration } from '../../ast';\n\n/**\n * 作用域输出\n */\nexport class ScopeOutputData {\n protected variableTable: IVariableTable;\n\n protected memo = createMemo();\n\n get variableEngine(): VariableEngine {\n return this.scope.variableEngine;\n }\n\n get globalVariableTable(): IVariableTable {\n return this.scope.variableEngine.globalVariableTable;\n }\n\n get version() {\n return this.variableTable.version;\n }\n\n /**\n * @deprecated use onListOrAnyVarChange instead\n */\n get onDataChange() {\n return this.variableTable.onDataChange.bind(this.variableTable);\n }\n\n /**\n * listen to variable list change\n */\n get onVariableListChange() {\n return this.variableTable.onVariableListChange.bind(this.variableTable);\n }\n\n /**\n * listen to any variable update in list\n */\n get onAnyVariableChange() {\n return this.variableTable.onAnyVariableChange.bind(this.variableTable);\n }\n\n /**\n * listen to variable list change + any variable update in list\n */\n get onListOrAnyVarChange() {\n return this.variableTable.onListOrAnyVarChange.bind(this.variableTable);\n }\n\n protected _hasChanges = false;\n\n constructor(public readonly scope: Scope) {\n // setup scope variable table based on globalVariableTable\n this.variableTable = new VariableTable(scope.variableEngine.globalVariableTable);\n\n this.scope.toDispose.pushAll([\n // When root AST node is updated, check if there are any changes during this AST change\n this.scope.ast.subscribe(() => {\n if (this._hasChanges) {\n this.memo.clear();\n this.notifyCoversChange();\n this.variableTable.fireChange();\n this._hasChanges = false;\n }\n }),\n this.scope.event.on<DisposeASTAction>('DisposeAST', (_action) => {\n if (_action.ast?.kind === ASTKind.VariableDeclaration) {\n this.removeVariableFromTable(_action.ast.key);\n }\n }),\n this.scope.event.on<NewASTAction>('NewAST', (_action) => {\n if (_action.ast?.kind === ASTKind.VariableDeclaration) {\n this.addVariableToTable(_action.ast as VariableDeclaration);\n }\n }),\n this.scope.event.on<ReSortVariableDeclarationsAction>('ReSortVariableDeclarations', () => {\n this._hasChanges = true;\n }),\n this.variableTable,\n ]);\n }\n\n /**\n * Scope Output Variable Declarations\n */\n get variables(): VariableDeclaration[] {\n return this.memo('variables', () =>\n this.variableTable.variables.sort((a, b) => a.order - b.order)\n );\n }\n\n /**\n * Output Variable Keys\n */\n get variableKeys(): string[] {\n return this.memo('variableKeys', () => this.variableTable.variableKeys);\n }\n\n addVariableToTable(variable: VariableDeclaration) {\n if (variable.scope !== this.scope) {\n throw Error('VariableDeclaration must be a ast node in scope');\n }\n\n (this.variableTable as VariableTable).addVariableToTable(variable);\n this._hasChanges = true;\n }\n\n removeVariableFromTable(key: string) {\n (this.variableTable as VariableTable).removeVariableFromTable(key);\n this._hasChanges = true;\n }\n\n getVariableByKey(key: string) {\n return this.variableTable.getVariableByKey(key);\n }\n\n /**\n *\n */\n notifyCoversChange(): void {\n this.scope.coverScopes.forEach((scope) => scope.available.refresh());\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n share,\n skip,\n startWith,\n switchMap,\n tap,\n} from 'rxjs';\nimport { flatten } from 'lodash-es';\nimport { shallowEqual } from 'fast-equals';\nimport { Disposable } from '@flowgram.ai/utils';\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { IVariableTable } from '../types';\nimport { type Scope } from '../scope';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { createMemo } from '../../utils/memo';\nimport { SubscribeConfig } from '../../ast/types';\nimport { ASTNode, BaseVariableField, VariableDeclaration } from '../../ast';\n/**\n * 作用域可用变量\n */\nexport class ScopeAvailableData {\n protected memo = createMemo();\n\n get globalVariableTable(): IVariableTable {\n return this.scope.variableEngine.globalVariableTable;\n }\n\n protected _version: number = 0;\n\n protected refresh$: Subject<void> = new Subject();\n\n protected _variables: VariableDeclaration[] = [];\n\n get version() {\n return this._version;\n }\n\n protected bumpVersion() {\n this._version = this._version + 1;\n if (this._version === Number.MAX_SAFE_INTEGER) {\n this._version = 0;\n }\n }\n\n // 刷新可访问变量列表\n refresh(): void {\n // 销毁的作用域不用触发 refresh\n if (this.scope.disposed) {\n return;\n }\n this.refresh$.next();\n }\n\n /**\n * 监听\n */\n protected variables$: Observable<VariableDeclaration[]> = this.refresh$.pipe(\n // 输出变量是否 version 发生变化\n map(() => flatten(this.depScopes.map((scope) => scope.output.variables || []))),\n // 变量列表浅比较\n distinctUntilChanged<VariableDeclaration[]>(shallowEqual),\n share()\n );\n\n // 监听变量列表中的单个变量变化\n protected anyVariableChange$: Observable<VariableDeclaration> = this.variables$.pipe(\n switchMap((_variables) =>\n merge(\n ..._variables.map((_v) =>\n _v.value$.pipe<any>(\n // 跳过 BehaviorSubject 第一个\n skip(1)\n )\n )\n )\n ),\n share()\n );\n\n /**\n * listen to any variable update in list\n * @param observer\n * @returns\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * listen to variable list change\n * @param observer\n * @returns\n */\n onVariableListChange(observer: (variables: VariableDeclaration[]) => void) {\n return subsToDisposable(this.variables$.subscribe(observer));\n }\n\n /**\n * @deprecated\n */\n protected onDataChangeEmitter = new Emitter<VariableDeclaration[]>();\n\n protected onListOrAnyVarChangeEmitter = new Emitter<VariableDeclaration[]>();\n\n /**\n * @deprecated use available.onListOrAnyVarChange instead\n */\n public onDataChange = this.onDataChangeEmitter.event;\n\n /**\n * listen to variable list change + any variable drilldown change\n */\n public onListOrAnyVarChange = this.onListOrAnyVarChangeEmitter.event;\n\n constructor(public readonly scope: Scope) {\n this.scope.toDispose.pushAll([\n this.onVariableListChange((_variables) => {\n this._variables = _variables;\n this.memo.clear();\n this.onDataChangeEmitter.fire(this._variables);\n this.bumpVersion();\n this.onListOrAnyVarChangeEmitter.fire(this._variables);\n }),\n this.onAnyVariableChange(() => {\n this.onDataChangeEmitter.fire(this._variables);\n this.bumpVersion();\n this.onListOrAnyVarChangeEmitter.fire(this._variables);\n }),\n Disposable.create(() => {\n this.refresh$.complete();\n this.refresh$.unsubscribe();\n }),\n ]);\n }\n\n /**\n * 获取可消费变量\n */\n get variables(): VariableDeclaration[] {\n return this._variables;\n }\n\n /**\n * 获取可访问的变量 keys\n */\n get variableKeys(): string[] {\n return this.memo('availableKeys', () => this._variables.map((_v) => _v.key));\n }\n\n /**\n * 返回依赖的作用域\n */\n get depScopes(): Scope[] {\n return this.scope.depScopes;\n }\n\n /**\n * 通过 keyPath 找到可用变量\n * @param keyPath\n * @returns\n */\n getByKeyPath(keyPath: string[] = []): BaseVariableField | undefined {\n // 检查变量是否在可访问范围内\n if (!this.variableKeys.includes(keyPath[0])) {\n return;\n }\n return this.globalVariableTable.getByKeyPath(keyPath);\n }\n\n /**\n * Track Variable Change (Includes type update and children update) By KeyPath\n * @returns\n */\n trackByKeyPath<Data = BaseVariableField | undefined>(\n keyPath: string[] = [],\n cb: (variable?: Data) => void,\n opts?: SubscribeConfig<BaseVariableField | undefined, Data>\n ): Disposable {\n const { triggerOnInit = true, debounceAnimation, selector } = opts || {};\n\n return subsToDisposable(\n merge(this.anyVariableChange$, this.variables$)\n .pipe(\n triggerOnInit ? startWith() : tap(() => null),\n map(() => {\n const v = this.getByKeyPath(keyPath);\n return selector ? selector(v) : (v as any);\n }),\n distinctUntilChanged(\n (a, b) => shallowEqual(a, b),\n (value) => {\n if (value instanceof ASTNode) {\n // 如果 value 是 ASTNode,则进行 hash 的比较\n return value.hash;\n }\n return value;\n }\n ),\n // 每个 animationFrame 内所有更新合并成一个\n debounceAnimation ? debounceTime(0, animationFrameScheduler) : tap(() => null)\n )\n .subscribe(cb)\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Subject, filter } from 'rxjs';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { type Scope } from '../scope';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { type GlobalEventActionType } from '../../ast';\n\ntype Observer<ActionType extends GlobalEventActionType = GlobalEventActionType> = (\n action: ActionType\n) => void;\n\nexport class ScopeEventData {\n event$: Subject<GlobalEventActionType> = new Subject<GlobalEventActionType>();\n\n dispatch<ActionType extends GlobalEventActionType = GlobalEventActionType>(action: ActionType) {\n if (this.scope.disposed) {\n return;\n }\n this.event$.next(action);\n }\n\n subscribe<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n observer: Observer<ActionType>\n ): Disposable {\n return subsToDisposable(this.event$.subscribe(observer as Observer));\n }\n\n on<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n type: ActionType['type'],\n observer: Observer<ActionType>\n ): Disposable {\n return subsToDisposable(\n this.event$.pipe(filter((_action) => _action.type === type)).subscribe(observer as Observer)\n );\n }\n\n constructor(public readonly scope: Scope) {\n scope.toDispose.pushAll([\n this.subscribe((_action) => {\n scope.variableEngine.fireGlobalEvent(_action);\n }),\n ]);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { difference } from 'lodash-es';\nimport { inject, injectable, postConstruct, preDestroy } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { VariableEngine } from '../variable-engine';\nimport {\n ASTNode,\n BaseVariableField,\n ObjectPropertiesChangeAction,\n VariableDeclarationListChangeAction,\n} from '../ast';\n\ninterface RenameInfo {\n before: BaseVariableField;\n after: BaseVariableField;\n}\n\n@injectable()\nexport class VariableFieldKeyRenameService {\n @inject(VariableEngine) variableEngine: VariableEngine;\n\n toDispose = new DisposableCollection();\n\n renameEmitter = new Emitter<RenameInfo>();\n\n // 没有被 rename 的字段通过 disposeInList 透出,让业务区分变量是 rename 删除的,还是真正从列表中删除的\n disposeInListEmitter = new Emitter<BaseVariableField>();\n\n onRename = this.renameEmitter.event;\n\n onDisposeInList = this.disposeInListEmitter.event;\n\n handleFieldListChange(ast?: ASTNode, prev?: BaseVariableField[], next?: BaseVariableField[]) {\n // 1. 检查是否触发 ReName\n if (!ast || !prev?.length || !next?.length) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n\n // 2. 改动前后长度需要一致\n if (prev.length !== next.length) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n\n let renameNodeInfo: RenameInfo | null = null;\n let existFieldChanged = false;\n\n for (const [index, prevField] of prev.entries()) {\n const nextField = next[index];\n\n if (prevField.key !== nextField.key) {\n // 一次只能存在一行信息 ReName\n if (existFieldChanged) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n existFieldChanged = true;\n\n if (prevField.type?.kind === nextField.type?.kind) {\n renameNodeInfo = { before: prevField, after: nextField };\n }\n }\n }\n\n if (!renameNodeInfo) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n\n this.renameEmitter.fire(renameNodeInfo);\n }\n\n notifyFieldsDispose(prev?: BaseVariableField[], next?: BaseVariableField[]) {\n const removedFields = difference(prev || [], next || []);\n removedFields.forEach((_field) => this.disposeInListEmitter.fire(_field));\n }\n\n @postConstruct()\n init() {\n this.toDispose.pushAll([\n this.variableEngine.onGlobalEvent<VariableDeclarationListChangeAction>(\n 'VariableListChange',\n (_action) => {\n this.handleFieldListChange(_action.ast, _action.payload?.prev, _action.payload?.next);\n }\n ),\n this.variableEngine.onGlobalEvent<ObjectPropertiesChangeAction>(\n 'ObjectPropertiesChange',\n (_action) => {\n this.handleFieldListChange(_action.ast, _action.payload?.prev, _action.payload?.next);\n }\n ),\n ]);\n }\n\n @preDestroy()\n dispose() {\n this.toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { createContext, useContext } from 'react';\n\nimport { Scope } from '../scope';\n\ninterface ScopeContextProps {\n scope: Scope;\n}\n\nconst ScopeContext = createContext<ScopeContextProps>(null!);\n\nexport const ScopeProvider = ScopeContext.Provider;\nexport const useScopeContext = (): ScopeContextProps | null => useContext(ScopeContext);\nexport const useCurrentScope = () => useContext(ScopeContext)?.scope;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/core';\n\nimport { useCurrentScope } from '../context';\nimport { ScopeAvailableData } from '../../scope/datas';\n\n/**\n * 获取作用域的可访问变量\n */\nexport function useScopeAvailable(): ScopeAvailableData {\n const scope = useCurrentScope();\n const refresh = useRefresh();\n\n useEffect(() => {\n const disposable = scope.available.onDataChange(() => {\n refresh();\n });\n\n return () => disposable.dispose();\n }, []);\n\n return scope.available;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\nimport { useRefresh, useService } from '@flowgram.ai/core';\n\nimport { useCurrentScope } from '../context';\nimport { VariableEngine } from '../../variable-engine';\nimport { VariableDeclaration } from '../../ast';\n\n/**\n * 获取作用域的可访问变量\n */\nexport function useAvailableVariables(): VariableDeclaration[] {\n const scope = useCurrentScope();\n const variableEngine: VariableEngine = useService(VariableEngine);\n\n const refresh = useRefresh();\n\n useEffect(() => {\n // 没有作用域时,监听全局变量表\n if (!scope) {\n const disposable = variableEngine.globalVariableTable.onListOrAnyVarChange(() => {\n refresh();\n });\n\n return () => disposable.dispose();\n }\n\n const disposable = scope.available.onDataChange(() => {\n refresh();\n });\n\n return () => disposable.dispose();\n }, []);\n\n // 没有作用域时,使用全局变量表\n return scope ? scope.available.variables : variableEngine.globalVariableTable.variables;\n}\n"],"mappings":"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","names":["import_inversify","import_rxjs","import_inversify","import_utils","import_utils","import_utils","import_utils","ASTKind","import_lodash_es","import_inversify","ASTMatch","ASTNodeFlags","import_rxjs","import_utils","import_rxjs","import_fast_equals","import_fast_equals","import_fast_equals","import_lodash_es","import_fast_equals","import_fast_equals","map","ASTNode","ASTFactory","import_rxjs","import_lodash_es","import_fast_equals","import_utils","import_rxjs","import_lodash_es","import_inversify","import_utils","import_react","import_react","import_core","disposable"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/variable-container-module.ts","../src/variable-engine.ts","../src/utils/toDisposable.tsx","../src/utils/memo.ts","../src/scope/variable-table.ts","../src/scope/scope-chain.ts","../src/providers.ts","../src/scope/scope.ts","../src/ast/types.ts","../src/ast/ast-registers.ts","../src/ast/utils/inversify.ts","../src/ast/flags.ts","../src/ast/match.ts","../src/ast/utils/helpers.ts","../src/ast/ast-node.ts","../src/ast/type/base-type.ts","../src/ast/type/array.ts","../src/ast/type/string.ts","../src/ast/type/integer.ts","../src/ast/type/boolean.ts","../src/ast/type/number.ts","../src/ast/type/map.ts","../src/ast/type/object.ts","../src/ast/type/custom-type.ts","../src/ast/expression/base-expression.ts","../src/ast/utils/variable-field.ts","../src/ast/expression/enumerate-expression.ts","../src/ast/expression/keypath-expression.ts","../src/ast/utils/expression.ts","../src/ast/expression/legacy-keypath-expression.ts","../src/ast/expression/wrap-array-expression.ts","../src/ast/declaration/base-variable-field.ts","../src/ast/declaration/variable-declaration.ts","../src/ast/declaration/variable-declaration-list.ts","../src/ast/declaration/property.ts","../src/ast/common/data-node.ts","../src/ast/common/list-node.ts","../src/ast/common/map-node.ts","../src/ast/factory.ts","../src/scope/datas/scope-output-data.ts","../src/scope/datas/scope-available-data.ts","../src/scope/datas/scope-event-data.ts","../src/services/variable-field-key-rename-service.ts","../src/react/context.tsx","../src/react/hooks/use-scope-available.ts","../src/react/hooks/use-available-variables.ts","../src/react/hooks/use-output-variables.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport { VariableContainerModule } from './variable-container-module';\nexport { VariableEngine } from './variable-engine';\nexport { VariableEngineProvider } from './providers';\n\nexport * from './react';\nexport * from './scope';\nexport * from './ast';\nexport * from './services';\nexport { type Observer } from 'rxjs';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { VariableEngine } from './variable-engine';\nimport { VariableFieldKeyRenameService } from './services';\nimport { ContainerProvider, VariableEngineProvider } from './providers';\nimport { ASTRegisters } from './ast';\n\n/**\n * An InversifyJS container module that binds all the necessary services for the variable engine.\n * This module sets up the dependency injection for the core components of the variable engine.\n */\nexport const VariableContainerModule = new ContainerModule((bind) => {\n bind(VariableEngine).toSelf().inSingletonScope();\n bind(ASTRegisters).toSelf().inSingletonScope();\n\n bind(VariableFieldKeyRenameService).toSelf().inSingletonScope();\n\n // Provide a dynamic provider for VariableEngine to prevent circular dependencies.\n bind(VariableEngineProvider).toDynamicValue((ctx) => () => ctx.container.get(VariableEngine));\n\n // Provide a ContainerProvider to allow AST nodes and other components to access the container.\n bind(ContainerProvider).toDynamicValue((ctx) => () => ctx.container);\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Subject } from 'rxjs';\nimport { inject, injectable, interfaces, preDestroy } from 'inversify';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { subsToDisposable } from './utils/toDisposable';\nimport { createMemo } from './utils/memo';\nimport { VariableTable } from './scope/variable-table';\nimport { ScopeChangeAction } from './scope/types';\nimport { IScopeConstructor } from './scope/scope';\nimport { Scope, ScopeChain, type IVariableTable } from './scope';\nimport { ContainerProvider } from './providers';\nimport { ASTRegisters, type GlobalEventActionType } from './ast';\n\n/**\n * The core of the variable engine system.\n * It manages scopes, variables, and events within the system.\n */\n@injectable()\nexport class VariableEngine implements Disposable {\n protected toDispose = new DisposableCollection();\n\n protected memo = createMemo();\n\n protected scopeMap = new Map<string | symbol, Scope>();\n\n /**\n * A rxjs subject that emits global events occurring within the variable engine.\n */\n globalEvent$: Subject<GlobalEventActionType> = new Subject<GlobalEventActionType>();\n\n protected onScopeChangeEmitter = new Emitter<ScopeChangeAction>();\n\n /**\n * A table containing all global variables.\n */\n public globalVariableTable: IVariableTable = new VariableTable();\n\n /**\n * An event that fires whenever a scope is added, updated, or deleted.\n */\n public onScopeChange = this.onScopeChangeEmitter.event;\n\n @inject(ContainerProvider) private readonly containerProvider: ContainerProvider;\n\n /**\n * The Inversify container instance.\n */\n get container(): interfaces.Container {\n return this.containerProvider();\n }\n\n constructor(\n /**\n * The scope chain, which manages the dependency relationships between scopes.\n */\n @inject(ScopeChain)\n public readonly chain: ScopeChain,\n /**\n * The registry for all AST node types.\n */\n @inject(ASTRegisters)\n public readonly astRegisters: ASTRegisters\n ) {\n this.toDispose.pushAll([\n chain,\n Disposable.create(() => {\n // Dispose all scopes\n this.getAllScopes().forEach((scope) => scope.dispose());\n this.globalVariableTable.dispose();\n }),\n ]);\n }\n\n /**\n * Disposes of all resources used by the variable engine.\n */\n @preDestroy()\n dispose(): void {\n this.toDispose.dispose();\n }\n\n /**\n * Retrieves a scope by its unique identifier.\n * @param scopeId The ID of the scope to retrieve.\n * @returns The scope if found, otherwise undefined.\n */\n getScopeById(scopeId: string | symbol): Scope | undefined {\n return this.scopeMap.get(scopeId);\n }\n\n /**\n * Removes a scope by its unique identifier and disposes of it.\n * @param scopeId The ID of the scope to remove.\n */\n removeScopeById(scopeId: string | symbol): void {\n this.getScopeById(scopeId)?.dispose();\n }\n\n /**\n * Creates a new scope or retrieves an existing one if the ID and type match.\n * @param id The unique identifier for the scope.\n * @param meta Optional metadata for the scope, defined by the user.\n * @param options Options for creating the scope.\n * @param options.ScopeConstructor The constructor to use for creating the scope. Defaults to `Scope`.\n * @returns The created or existing scope.\n */\n createScope(\n id: string | symbol,\n meta?: Record<string, any>,\n options: {\n ScopeConstructor?: IScopeConstructor;\n } = {}\n ): Scope {\n const { ScopeConstructor = Scope } = options;\n\n let scope = this.getScopeById(id);\n\n if (!scope) {\n scope = new ScopeConstructor({ variableEngine: this, meta, id });\n this.scopeMap.set(id, scope);\n this.onScopeChangeEmitter.fire({ type: 'add', scope: scope! });\n\n scope.toDispose.pushAll([\n scope.ast.subscribe(() => {\n this.onScopeChangeEmitter.fire({ type: 'update', scope: scope! });\n }),\n // Fires when available variables change\n scope.available.onDataChange(() => {\n this.onScopeChangeEmitter.fire({ type: 'available', scope: scope! });\n }),\n ]);\n scope.onDispose(() => {\n this.scopeMap.delete(id);\n this.onScopeChangeEmitter.fire({ type: 'delete', scope: scope! });\n });\n }\n\n return scope;\n }\n\n /**\n * Retrieves all scopes currently managed by the engine.\n * @param options Options for retrieving the scopes.\n * @param options.sort Whether to sort the scopes based on their dependency chain.\n * @returns An array of all scopes.\n */\n getAllScopes({\n sort,\n }: {\n sort?: boolean;\n } = {}): Scope[] {\n const allScopes = Array.from(this.scopeMap.values());\n\n if (sort) {\n const sortScopes = this.chain.sortAll();\n const remainScopes = new Set(allScopes);\n sortScopes.forEach((_scope) => remainScopes.delete(_scope));\n\n return [...sortScopes, ...Array.from(remainScopes)];\n }\n\n return [...allScopes];\n }\n\n /**\n * Fires a global event to be broadcast to all listeners.\n * @param event The global event to fire.\n */\n fireGlobalEvent(event: GlobalEventActionType) {\n this.globalEvent$.next(event);\n }\n\n /**\n * Subscribes to a specific type of global event.\n * @param type The type of the event to listen for.\n * @param observer A function to be called when the event is observed.\n * @returns A disposable object to unsubscribe from the event.\n */\n onGlobalEvent<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n type: ActionType['type'],\n observer: (action: ActionType) => void\n ): Disposable {\n return subsToDisposable(\n this.globalEvent$.subscribe((_action) => {\n if (_action.type === type) {\n observer(_action as ActionType);\n }\n })\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Subscription } from 'rxjs';\nimport { Disposable } from '@flowgram.ai/utils';\n\n/**\n * Convert rxjs subscription to disposable\n * @param subscription - The rxjs subscription\n * @returns The disposable\n */\nexport function subsToDisposable(subscription: Subscription): Disposable {\n return Disposable.create(() => subscription.unsubscribe());\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\ntype KeyType = string | symbol;\n\n/**\n * Create memo manager\n * @returns\n */\nexport const createMemo = (): {\n <T>(key: KeyType, fn: () => T): T;\n clear: (key?: KeyType) => void;\n} => {\n const _memoCache = new Map<KeyType, any>();\n\n const memo = <T>(key: KeyType, fn: () => T): T => {\n if (_memoCache.has(key)) {\n return _memoCache.get(key) as T;\n }\n const data = fn();\n _memoCache.set(key, data);\n return data as T;\n };\n\n const clear = (key?: KeyType) => {\n if (key) {\n _memoCache.delete(key);\n } else {\n _memoCache.clear();\n }\n };\n\n memo.clear = clear;\n\n return memo;\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Observable, Subject, merge, share, skip, switchMap } from 'rxjs';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { subsToDisposable } from '../utils/toDisposable';\nimport { BaseVariableField } from '../ast/declaration/base-variable-field';\nimport { VariableDeclaration } from '../ast';\nimport { IVariableTable } from './types';\n\n/**\n * A class that stores and manages variables in a table-like structure.\n * It provides methods for adding, removing, and retrieving variables, as well as\n * observables for listening to changes in the variable list and individual variables.\n */\nexport class VariableTable implements IVariableTable {\n protected table: Map<string, VariableDeclaration> = new Map();\n\n toDispose = new DisposableCollection();\n\n /**\n * @deprecated\n */\n protected onDataChangeEmitter = new Emitter<void>();\n\n protected variables$: Subject<VariableDeclaration[]> = new Subject<VariableDeclaration[]>();\n\n /**\n * An observable that listens for value changes on any variable within the table.\n */\n protected anyVariableChange$: Observable<VariableDeclaration> = this.variables$.pipe(\n switchMap((_variables) =>\n merge(\n ..._variables.map((_v) =>\n _v.value$.pipe<any>(\n // Skip the initial value of the BehaviorSubject\n skip(1)\n )\n )\n )\n ),\n share()\n );\n\n /**\n * Subscribes to updates on any variable in the list.\n * @param observer A function to be called when any variable's value changes.\n * @returns A disposable object to unsubscribe from the updates.\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * Subscribes to changes in the variable list (additions or removals).\n * @param observer A function to be called when the list of variables changes.\n * @returns A disposable object to unsubscribe from the updates.\n */\n onVariableListChange(observer: (variables: VariableDeclaration[]) => void) {\n return subsToDisposable(this.variables$.subscribe(observer));\n }\n\n /**\n * Subscribes to both variable list changes and updates to any variable in the list.\n * @param observer A function to be called when either the list or a variable in it changes.\n * @returns A disposable collection to unsubscribe from both events.\n */\n onListOrAnyVarChange(observer: () => void) {\n const disposables = new DisposableCollection();\n disposables.pushAll([this.onVariableListChange(observer), this.onAnyVariableChange(observer)]);\n return disposables;\n }\n\n /**\n * @deprecated Use onListOrAnyVarChange instead.\n */\n public onDataChange = this.onDataChangeEmitter.event;\n\n protected _version: number = 0;\n\n /**\n * Fires change events to notify listeners that the data has been updated.\n */\n fireChange() {\n this.bumpVersion();\n this.onDataChangeEmitter.fire();\n this.variables$.next(this.variables);\n this.parentTable?.fireChange();\n }\n\n /**\n * The current version of the variable table, incremented on each change.\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * Increments the version number, resetting to 0 if it reaches MAX_SAFE_INTEGER.\n */\n protected bumpVersion() {\n this._version = this._version + 1;\n if (this._version === Number.MAX_SAFE_INTEGER) {\n this._version = 0;\n }\n }\n\n constructor(\n /**\n * An optional parent table. If provided, this table will contain all variables\n * from the current table.\n */\n public parentTable?: IVariableTable\n ) {\n this.toDispose.pushAll([\n this.onDataChangeEmitter,\n // Activate the share() operator\n this.onAnyVariableChange(() => {\n this.bumpVersion();\n }),\n ]);\n }\n\n /**\n * An array of all variables in the table.\n */\n get variables(): VariableDeclaration[] {\n return Array.from(this.table.values());\n }\n\n /**\n * An array of all variable keys in the table.\n */\n get variableKeys(): string[] {\n return Array.from(this.table.keys());\n }\n\n /**\n * Retrieves a variable or a nested property field by its key path.\n * @param keyPath An array of keys representing the path to the desired field.\n * @returns The found variable or property field, or undefined if not found.\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n const [variableKey, ...propertyKeys] = keyPath || [];\n\n if (!variableKey) {\n return;\n }\n\n const variable = this.getVariableByKey(variableKey);\n\n return propertyKeys.length ? variable?.getByKeyPath(propertyKeys) : variable;\n }\n\n /**\n * Retrieves a variable by its key.\n * @param key The key of the variable to retrieve.\n * @returns The variable declaration if found, otherwise undefined.\n */\n getVariableByKey(key: string) {\n return this.table.get(key);\n }\n\n /**\n * Adds a variable to the table.\n * If a parent table exists, the variable is also added to the parent.\n * @param variable The variable declaration to add.\n */\n addVariableToTable(variable: VariableDeclaration) {\n this.table.set(variable.key, variable);\n if (this.parentTable) {\n (this.parentTable as VariableTable).addVariableToTable(variable);\n }\n }\n\n /**\n * Removes a variable from the table.\n * If a parent table exists, the variable is also removed from the parent.\n * @param key The key of the variable to remove.\n */\n removeVariableFromTable(key: string) {\n this.table.delete(key);\n if (this.parentTable) {\n (this.parentTable as VariableTable).removeVariableFromTable(key);\n }\n }\n\n /**\n * Disposes of all resources used by the variable table.\n */\n dispose(): void {\n this.variableKeys.forEach((_key) =>\n (this.parentTable as VariableTable)?.removeVariableFromTable(_key)\n );\n this.parentTable?.fireChange();\n this.variables$.complete();\n this.variables$.unsubscribe();\n this.toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { DisposableCollection, type Event } from '@flowgram.ai/utils';\n\nimport { VariableEngineProvider } from '../providers';\nimport { type Scope } from './scope';\n\n/**\n * Manages the dependency relationships between scopes.\n * This is an abstract class, and specific implementations determine how the scope order is managed.\n */\n@injectable()\nexport abstract class ScopeChain {\n readonly toDispose: DisposableCollection = new DisposableCollection();\n\n @inject(VariableEngineProvider) variableEngineProvider: VariableEngineProvider;\n\n get variableEngine() {\n return this.variableEngineProvider();\n }\n\n constructor() {}\n\n /**\n * Refreshes the dependency and coverage relationships for all scopes.\n */\n refreshAllChange(): void {\n this.variableEngine.getAllScopes().forEach((_scope) => {\n _scope.refreshCovers();\n _scope.refreshDeps();\n });\n }\n\n /**\n * Gets the dependency scopes for a given scope.\n * @param scope The scope to get dependencies for.\n * @returns An array of dependency scopes.\n */\n abstract getDeps(scope: Scope): Scope[];\n\n /**\n * Gets the covering scopes for a given scope.\n * @param scope The scope to get covers for.\n * @returns An array of covering scopes.\n */\n abstract getCovers(scope: Scope): Scope[];\n\n /**\n * Sorts all scopes based on their dependency relationships.\n * @returns A sorted array of all scopes.\n */\n abstract sortAll(): Scope[];\n\n dispose(): void {\n this.toDispose.dispose();\n }\n\n get disposed(): boolean {\n return this.toDispose.disposed;\n }\n\n get onDispose(): Event<void> {\n return this.toDispose.onDispose;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { interfaces } from 'inversify';\n\nimport { type VariableEngine } from './variable-engine';\n\n/**\n * A provider for dynamically obtaining the `VariableEngine` instance.\n * This is used to prevent circular dependencies when injecting `VariableEngine`.\n */\nexport const VariableEngineProvider = Symbol('DynamicVariableEngine');\nexport type VariableEngineProvider = () => VariableEngine;\n\n/**\n * A provider for obtaining the Inversify container instance.\n * This allows other parts of the application, like AST nodes, to access the container for dependency injection.\n */\nexport const ContainerProvider = Symbol('ContainerProvider');\nexport type ContainerProvider = () => interfaces.Container;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { type VariableEngine } from '../variable-engine';\nimport { createMemo } from '../utils/memo';\nimport { ASTKind, type ASTNode, type ASTNodeJSON, MapNode } from '../ast';\nimport { ScopeAvailableData, ScopeEventData, ScopeOutputData } from './datas';\n\n/**\n * Interface for the Scope constructor.\n */\nexport interface IScopeConstructor {\n new (options: {\n id: string | symbol;\n variableEngine: VariableEngine;\n meta?: Record<string, any>;\n }): Scope;\n}\n\n/**\n * Represents a variable scope, which manages its own set of variables and their lifecycle.\n * - `scope.output` represents the variables declared within this scope.\n * - `scope.available` represents all variables accessible from this scope, including those from parent scopes.\n */\nexport class Scope<ScopeMeta extends Record<string, any> = Record<string, any>> {\n /**\n * A unique identifier for the scope.\n */\n readonly id: string | symbol;\n\n /**\n * The variable engine instance this scope belongs to.\n */\n readonly variableEngine: VariableEngine;\n\n /**\n * Metadata associated with the scope, which can be extended by higher-level business logic.\n */\n readonly meta: ScopeMeta;\n\n /**\n * The root AST node for this scope, which is a MapNode.\n * It stores various data related to the scope, such as `outputs`.\n */\n readonly ast: MapNode;\n\n /**\n * Manages the available variables for this scope.\n */\n readonly available: ScopeAvailableData;\n\n /**\n * Manages the output variables for this scope.\n */\n readonly output: ScopeOutputData;\n\n /**\n * Manages event dispatching and handling for this scope.\n */\n readonly event: ScopeEventData;\n\n /**\n * A memoization utility for caching computed values.\n */\n protected memo = createMemo();\n\n public toDispose: DisposableCollection = new DisposableCollection();\n\n constructor(options: { id: string | symbol; variableEngine: VariableEngine; meta?: ScopeMeta }) {\n this.id = options.id;\n this.meta = options.meta || ({} as any);\n this.variableEngine = options.variableEngine;\n\n this.event = new ScopeEventData(this);\n\n this.ast = this.variableEngine.astRegisters.createAST(\n {\n kind: ASTKind.MapNode,\n key: String(this.id),\n },\n {\n scope: this,\n }\n ) as MapNode;\n\n this.output = new ScopeOutputData(this);\n this.available = new ScopeAvailableData(this);\n }\n\n /**\n * Refreshes the covering scopes.\n */\n refreshCovers(): void {\n this.memo.clear('covers');\n }\n\n /**\n * Refreshes the dependency scopes and the available variables.\n */\n refreshDeps(): void {\n this.memo.clear('deps');\n this.available.refresh();\n }\n\n /**\n * Gets the scopes that this scope depends on.\n */\n get depScopes(): Scope[] {\n return this.memo('deps', () =>\n this.variableEngine.chain\n .getDeps(this)\n .filter((_scope) => Boolean(_scope) && !_scope?.disposed)\n );\n }\n\n /**\n * Gets the scopes that are covered by this scope.\n */\n get coverScopes(): Scope[] {\n return this.memo('covers', () =>\n this.variableEngine.chain\n .getCovers(this)\n .filter((_scope) => Boolean(_scope) && !_scope?.disposed)\n );\n }\n\n /**\n * Disposes of the scope and its resources.\n * This will also trigger updates in dependent and covering scopes.\n */\n dispose(): void {\n this.ast.dispose();\n this.toDispose.dispose();\n\n // When a scope is disposed, update its dependent and covering scopes.\n this.coverScopes.forEach((_scope) => _scope.refreshDeps());\n this.depScopes.forEach((_scope) => _scope.refreshCovers());\n }\n\n onDispose = this.toDispose.onDispose;\n\n get disposed(): boolean {\n return this.toDispose.disposed;\n }\n\n /**\n * Sets a variable in the scope with the default key 'outputs'.\n *\n * @param json The JSON representation of the AST node to set.\n * @returns The created or updated AST node.\n */\n public setVar<Node extends ASTNode = ASTNode>(json: ASTNodeJSON): Node;\n\n /**\n * Sets a variable in the scope with a specified key.\n *\n * @param key The key of the variable to set.\n * @param json The JSON representation of the AST node to set.\n * @returns The created or updated AST node.\n */\n public setVar<Node extends ASTNode = ASTNode>(key: string, json: ASTNodeJSON): Node;\n\n public setVar<Node extends ASTNode = ASTNode>(\n arg1: string | ASTNodeJSON,\n arg2?: ASTNodeJSON\n ): Node {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the scope by its key.\n *\n * @param key The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The AST node for the variable, or `undefined` if not found.\n */\n public getVar<Node extends ASTNode = ASTNode>(key: string = 'outputs') {\n return this.ast.get<Node>(key);\n }\n\n /**\n * Clears a variable from the scope by its key.\n *\n * @param key The key of the variable to clear. Defaults to 'outputs'.\n */\n public clearVar(key: string = 'outputs') {\n return this.ast.remove(key);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type Observer } from 'rxjs';\n\nimport { type Scope } from '../scope';\nimport { type ASTNode } from './ast-node';\n\nexport type ASTKindType = string;\nexport type Identifier = string;\n\n/**\n * ASTNodeJSON is the JSON representation of an ASTNode.\n */\nexport interface ASTNodeJSON {\n /**\n * Kind is the type of the AST node.\n */\n kind?: ASTKindType;\n\n /**\n * Key is the unique identifier of the node.\n * If not provided, the node will generate a default key value.\n */\n key?: Identifier;\n [key: string]: any;\n}\n\n/**\n * Core AST node types.\n */\nexport enum ASTKind {\n /**\n * # Type-related.\n * - A set of type AST nodes based on JSON types is implemented internally by default.\n */\n\n /**\n * String type.\n */\n String = 'String',\n /**\n * Number type.\n */\n Number = 'Number',\n /**\n * Integer type.\n */\n Integer = 'Integer',\n /**\n * Boolean type.\n */\n Boolean = 'Boolean',\n /**\n * Object type.\n */\n Object = 'Object',\n /**\n * Array type.\n */\n Array = 'Array',\n /**\n * Map type.\n */\n Map = 'Map',\n /**\n * Union type.\n * Commonly used for type checking, generally not exposed to the business.\n */\n Union = 'Union',\n /**\n * Any type.\n * Commonly used for business logic.\n */\n Any = 'Any',\n /**\n * Custom type.\n * For business-defined types.\n */\n CustomType = 'CustomType',\n\n /**\n * # Declaration-related.\n */\n\n /**\n * Field definition for Object drill-down.\n */\n Property = 'Property',\n /**\n * Variable declaration.\n */\n VariableDeclaration = 'VariableDeclaration',\n /**\n * Variable declaration list.\n */\n VariableDeclarationList = 'VariableDeclarationList',\n\n /**\n * # Expression-related.\n */\n\n /**\n * Access fields on variables through the path system.\n */\n KeyPathExpression = 'KeyPathExpression',\n /**\n * Iterate over specified data.\n */\n EnumerateExpression = 'EnumerateExpression',\n /**\n * Wrap with Array Type.\n */\n WrapArrayExpression = 'WrapArrayExpression',\n\n /**\n * # General-purpose AST nodes.\n */\n\n /**\n * General-purpose List<ASTNode> storage node.\n */\n ListNode = 'ListNode',\n /**\n * General-purpose data storage node.\n */\n DataNode = 'DataNode',\n /**\n * General-purpose Map<string, ASTNode> storage node.\n */\n MapNode = 'MapNode',\n}\n\nexport interface CreateASTParams {\n scope: Scope;\n key?: Identifier;\n parent?: ASTNode;\n}\n\nexport type ASTNodeJSONOrKind = string | ASTNodeJSON;\n\nexport type ObserverOrNext<T> = Partial<Observer<T>> | ((value: T) => void);\n\nexport interface SubscribeConfig<This, Data> {\n // Merge all changes within one animationFrame into a single one.\n debounceAnimation?: boolean;\n // Respond with a value by default upon subscription.\n triggerOnInit?: boolean;\n selector?: (curr: This) => Data;\n}\n\n/**\n * TypeUtils to get the JSON representation of an AST node with a specific kind.\n */\nexport type GetKindJSON<KindType extends string, JSON extends ASTNodeJSON> = {\n kind: KindType;\n key?: Identifier;\n} & JSON;\n\n/**\n * TypeUtils to get the JSON representation of an AST node with a specific kind or just the kind string.\n */\nexport type GetKindJSONOrKind<KindType extends string, JSON extends ASTNodeJSON> =\n | ({\n kind: KindType;\n key?: Identifier;\n } & JSON)\n | KindType;\n\n/**\n * Global event action type.\n * - Global event might be dispatched from `ASTNode` or `Scope`.\n */\nexport interface GlobalEventActionType<\n Type = string,\n Payload = any,\n AST extends ASTNode = ASTNode\n> {\n type: Type;\n payload?: Payload;\n ast?: AST;\n}\n\nexport type NewASTAction = GlobalEventActionType<'NewAST'>;\nexport type UpdateASTAction = GlobalEventActionType<'UpdateAST'>;\nexport type DisposeASTAction = GlobalEventActionType<'DisposeAST'>;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { omit } from 'lodash-es';\nimport { injectable } from 'inversify';\n\nimport { POST_CONSTRUCT_AST_SYMBOL } from './utils/inversify';\nimport { ASTKindType, ASTNodeJSON, CreateASTParams, NewASTAction } from './types';\nimport { ArrayType } from './type/array';\nimport {\n BooleanType,\n CustomType,\n IntegerType,\n MapType,\n NumberType,\n ObjectType,\n StringType,\n} from './type';\nimport { EnumerateExpression, KeyPathExpression, WrapArrayExpression } from './expression';\nimport { Property, VariableDeclaration, VariableDeclarationList } from './declaration';\nimport { DataNode, MapNode } from './common';\nimport { ASTNode, ASTNodeRegistry } from './ast-node';\n\ntype DataInjector = () => Record<string, any>;\n\n/**\n * Register the AST node to the engine.\n */\n@injectable()\nexport class ASTRegisters {\n protected injectors: Map<ASTKindType, DataInjector> = new Map();\n\n protected astMap: Map<ASTKindType, ASTNodeRegistry> = new Map();\n\n /**\n * Core AST node registration.\n */\n constructor() {\n this.registerAST(StringType);\n this.registerAST(NumberType);\n this.registerAST(BooleanType);\n this.registerAST(IntegerType);\n this.registerAST(ObjectType);\n this.registerAST(ArrayType);\n this.registerAST(MapType);\n this.registerAST(CustomType);\n this.registerAST(Property);\n this.registerAST(VariableDeclaration);\n this.registerAST(VariableDeclarationList);\n this.registerAST(KeyPathExpression);\n\n this.registerAST(EnumerateExpression);\n this.registerAST(WrapArrayExpression);\n this.registerAST(MapNode);\n this.registerAST(DataNode);\n }\n\n /**\n * Creates an AST node.\n * @param param Creation parameters.\n * @returns\n */\n createAST<ReturnNode extends ASTNode = ASTNode>(\n json: ASTNodeJSON,\n { parent, scope }: CreateASTParams\n ): ReturnNode {\n const Registry = this.astMap.get(json.kind!);\n\n if (!Registry) {\n throw Error(`ASTKind: ${String(json.kind)} can not find its ASTNode Registry`);\n }\n\n const injector = this.injectors.get(json.kind!);\n\n const node = new Registry(\n {\n key: json.key,\n scope,\n parent,\n },\n injector?.() || {}\n ) as ReturnNode;\n\n // Do not trigger fireChange during initial creation.\n node.changeLocked = true;\n node.fromJSON(omit(json, ['key', 'kind']));\n node.changeLocked = false;\n\n node.dispatchGlobalEvent<NewASTAction>({ type: 'NewAST' });\n\n if (Reflect.hasMetadata(POST_CONSTRUCT_AST_SYMBOL, node)) {\n const postConstructKey = Reflect.getMetadata(POST_CONSTRUCT_AST_SYMBOL, node);\n (node[postConstructKey] as () => void)?.();\n }\n\n return node;\n }\n\n /**\n * Gets the node Registry by AST node type.\n * @param kind\n * @returns\n */\n getASTRegistryByKind(kind: ASTKindType) {\n return this.astMap.get(kind);\n }\n\n /**\n * Registers an AST node.\n * @param ASTNode\n * @param injector\n */\n registerAST(ASTNode: ASTNodeRegistry, injector?: DataInjector) {\n this.astMap.set(ASTNode.kind, ASTNode);\n if (injector) {\n this.injectors.set(ASTNode.kind, injector);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { interfaces } from 'inversify';\n\nimport { type ASTNode } from '../ast-node';\n\nexport const injectToAST = (serviceIdentifier: interfaces.ServiceIdentifier) =>\n function (target: any, propertyKey: string) {\n if (!serviceIdentifier) {\n throw new Error(\n `ServiceIdentifier ${serviceIdentifier} in @lazyInject is Empty, it might be caused by file circular dependency, please check it.`\n );\n }\n\n const descriptor = {\n get() {\n const container = (this as ASTNode).scope.variableEngine.container;\n return container.get(serviceIdentifier);\n },\n set() {},\n configurable: true,\n enumerable: true,\n } as any;\n\n // Object.defineProperty(target, propertyKey, descriptor);\n\n return descriptor;\n };\n\nexport const POST_CONSTRUCT_AST_SYMBOL = Symbol('post_construct_ast');\n\nexport const postConstructAST = () => (target: any, propertyKey: string) => {\n // Only run once.\n if (!Reflect.hasMetadata(POST_CONSTRUCT_AST_SYMBOL, target)) {\n Reflect.defineMetadata(POST_CONSTRUCT_AST_SYMBOL, propertyKey, target);\n } else {\n throw Error('Duplication Post Construct AST');\n }\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * ASTNode flags. Stored in the `flags` property of the `ASTNode`.\n */\nexport enum ASTNodeFlags {\n /**\n * None.\n */\n None = 0,\n\n /**\n * Variable Field.\n */\n VariableField = 1 << 0,\n\n /**\n * Expression.\n */\n Expression = 1 << 2,\n\n /**\n * # Variable Type Flags\n */\n\n /**\n * Basic type.\n */\n BasicType = 1 << 3,\n /**\n * Drillable variable type.\n */\n DrilldownType = 1 << 4,\n /**\n * Enumerable variable type.\n */\n EnumerateType = 1 << 5,\n /**\n * Composite type, currently not in use.\n */\n UnionType = 1 << 6,\n\n /**\n * Variable type.\n */\n VariableType = BasicType | DrilldownType | EnumerateType | UnionType,\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from './types';\nimport {\n type StringType,\n type NumberType,\n type BooleanType,\n type IntegerType,\n type ObjectType,\n type ArrayType,\n type MapType,\n type CustomType,\n} from './type';\nimport { ASTNodeFlags } from './flags';\nimport {\n type WrapArrayExpression,\n type EnumerateExpression,\n type KeyPathExpression,\n} from './expression';\nimport {\n type BaseVariableField,\n type Property,\n type VariableDeclaration,\n type VariableDeclarationList,\n} from './declaration';\nimport { type ASTNode } from './ast-node';\n\n/**\n * Variable-core ASTNode matchers.\n *\n * - Typescript code inside if statement will be type guarded.\n */\nexport namespace ASTMatch {\n /**\n * # Type-related matchers.\n */\n\n /**\n * Check if the node is a `StringType`.\n */\n export const isString = (node?: ASTNode): node is StringType => node?.kind === ASTKind.String;\n\n /**\n * Check if the node is a `NumberType`.\n */\n export const isNumber = (node?: ASTNode): node is NumberType => node?.kind === ASTKind.Number;\n\n /**\n * Check if the node is a `BooleanType`.\n */\n export const isBoolean = (node?: ASTNode): node is BooleanType => node?.kind === ASTKind.Boolean;\n\n /**\n * Check if the node is a `IntegerType`.\n */\n export const isInteger = (node?: ASTNode): node is IntegerType => node?.kind === ASTKind.Integer;\n\n /**\n * Check if the node is a `ObjectType`.\n */\n export const isObject = (node?: ASTNode): node is ObjectType => node?.kind === ASTKind.Object;\n\n /**\n * Check if the node is a `ArrayType`.\n */\n export const isArray = (node?: ASTNode): node is ArrayType => node?.kind === ASTKind.Array;\n\n /**\n * Check if the node is a `MapType`.\n */\n export const isMap = (node?: ASTNode): node is MapType => node?.kind === ASTKind.Map;\n\n /**\n * Check if the node is a `CustomType`.\n */\n export const isCustomType = (node?: ASTNode): node is CustomType =>\n node?.kind === ASTKind.CustomType;\n\n /**\n * # Declaration-related matchers.\n */\n\n /**\n * Check if the node is a `VariableDeclaration`.\n */\n export const isVariableDeclaration = <VariableMeta = any>(\n node?: ASTNode\n ): node is VariableDeclaration<VariableMeta> => node?.kind === ASTKind.VariableDeclaration;\n\n /**\n * Check if the node is a `Property`.\n */\n export const isProperty = <VariableMeta = any>(node?: ASTNode): node is Property<VariableMeta> =>\n node?.kind === ASTKind.Property;\n\n /**\n * Check if the node is a `BaseVariableField`.\n */\n export const isBaseVariableField = (node?: ASTNode): node is BaseVariableField =>\n !!(node?.flags || 0 & ASTNodeFlags.VariableField);\n\n /**\n * Check if the node is a `VariableDeclarationList`.\n */\n export const isVariableDeclarationList = (node?: ASTNode): node is VariableDeclarationList =>\n node?.kind === ASTKind.VariableDeclarationList;\n\n /**\n * # Expression-related matchers.\n */\n\n /**\n * Check if the node is a `EnumerateExpression`.\n */\n export const isEnumerateExpression = (node?: ASTNode): node is EnumerateExpression =>\n node?.kind === ASTKind.EnumerateExpression;\n\n /**\n * Check if the node is a `WrapArrayExpression`.\n */\n export const isWrapArrayExpression = (node?: ASTNode): node is WrapArrayExpression =>\n node?.kind === ASTKind.WrapArrayExpression;\n\n /**\n * Check if the node is a `KeyPathExpression`.\n */\n export const isKeyPathExpression = (node?: ASTNode): node is KeyPathExpression =>\n node?.kind === ASTKind.KeyPathExpression;\n\n /**\n * Check ASTNode Match by ASTClass\n *\n * @param node ASTNode to be checked.\n * @param targetType Target ASTNode class.\n * @returns Whether the node is of the target type.\n */\n export function is<TargetASTNode extends ASTNode>(\n node?: ASTNode,\n targetType?: { kind: string; new (...args: any[]): TargetASTNode }\n ): node is TargetASTNode {\n return node?.kind === targetType?.kind;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { ASTMatch } from '../match';\nimport { ASTNode } from '../ast-node';\n\nexport function updateChildNodeHelper(\n this: ASTNode,\n {\n getChildNode,\n updateChildNode,\n removeChildNode,\n nextJSON,\n }: {\n getChildNode: () => ASTNode | undefined;\n updateChildNode: (nextNode: ASTNode) => void;\n removeChildNode: () => void;\n nextJSON?: ASTNodeJSON;\n }\n): ASTNode | undefined {\n const currNode: ASTNode | undefined = getChildNode();\n\n const isNewKind = currNode?.kind !== nextJSON?.kind;\n // If `nextJSON` does not pass a key value, the key value remains unchanged by default.\n const isNewKey = nextJSON?.key && nextJSON?.key !== currNode?.key;\n\n if (isNewKind || isNewKey) {\n // The previous node needs to be destroyed.\n if (currNode) {\n currNode.dispose();\n removeChildNode();\n }\n\n if (nextJSON) {\n const newNode = this.createChildNode(nextJSON);\n updateChildNode(newNode);\n this.fireChange();\n return newNode;\n } else {\n // Also trigger an update when deleting a child node directly.\n this.fireChange();\n }\n } else if (nextJSON) {\n currNode?.fromJSON(nextJSON);\n }\n\n return currNode;\n}\n\nexport function parseTypeJsonOrKind(typeJSONOrKind?: ASTNodeJSONOrKind): ASTNodeJSON | undefined {\n return typeof typeJSONOrKind === 'string' ? { kind: typeJSONOrKind } : typeJSONOrKind;\n}\n\n// Get all children.\nexport function getAllChildren(ast: ASTNode): ASTNode[] {\n return [...ast.children, ...ast.children.map((_child) => getAllChildren(_child)).flat()];\n}\n\n/**\n * isMatchAST is same as ASTMatch.is\n * @param node\n * @param targetType\n * @returns\n */\nexport function isMatchAST<TargetASTNode extends ASTNode>(\n node?: ASTNode,\n targetType?: { kind: string; new (...args: any[]): TargetASTNode }\n): node is TargetASTNode {\n return ASTMatch.is(node, targetType);\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n BehaviorSubject,\n animationFrameScheduler,\n debounceTime,\n distinctUntilChanged,\n map,\n skip,\n tap,\n} from 'rxjs';\nimport { nanoid } from 'nanoid';\nimport { shallowEqual } from 'fast-equals';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { subsToDisposable } from '../utils/toDisposable';\nimport { updateChildNodeHelper } from './utils/helpers';\nimport { type Scope } from '../scope';\nimport {\n type ASTNodeJSON,\n type ObserverOrNext,\n type ASTKindType,\n type CreateASTParams,\n type Identifier,\n SubscribeConfig,\n GlobalEventActionType,\n DisposeASTAction,\n UpdateASTAction,\n} from './types';\nimport { ASTNodeFlags } from './flags';\n\nexport interface ASTNodeRegistry<JSON extends ASTNodeJSON = any, InjectOpts = any> {\n kind: string;\n new (params: CreateASTParams, injectOpts: InjectOpts): ASTNode<JSON>;\n}\n\n/**\n * An `ASTNode` represents a fundamental unit of variable information within the system's Abstract Syntax Tree.\n * It can model various constructs, for example:\n * - **Declarations**: `const a = 1`\n * - **Expressions**: `a.b.c`\n * - **Types**: `number`, `string`, `boolean`\n *\n * Here is some characteristic of ASTNode:\n * - **Tree-like Structure**: ASTNodes can be nested to form a tree, representing complex variable structures.\n * - **Extendable**: New features can be added by extending the base ASTNode class.\n * - **Reactive**: Changes in an ASTNode's value trigger events, enabling reactive programming patterns.\n * - **Serializable**: ASTNodes can be converted to and from a JSON format (ASTNodeJSON) for storage or transmission.\n */\nexport abstract class ASTNode<JSON extends ASTNodeJSON = any, InjectOpts = any>\n implements Disposable\n{\n /**\n * @deprecated\n * Get the injected options for the ASTNode.\n *\n * Please use `@injectToAst(XXXService) declare xxxService: XXXService` to achieve external dependency injection.\n */\n public readonly opts?: InjectOpts;\n\n /**\n * The unique identifier of the ASTNode, which is **immutable**.\n * - Immutable: Once assigned, the key cannot be changed.\n * - Automatically generated if not specified, and cannot be changed as well.\n * - If a new key needs to be generated, the current ASTNode should be destroyed and a new ASTNode should be generated.\n */\n public readonly key: Identifier;\n\n /**\n * The kind of the ASTNode.\n */\n static readonly kind: ASTKindType;\n\n /**\n * Node flags, used to record some flag information.\n */\n public readonly flags: number = ASTNodeFlags.None;\n\n /**\n * The scope in which the ASTNode is located.\n */\n public readonly scope: Scope;\n\n /**\n * The parent ASTNode.\n */\n public readonly parent: ASTNode | undefined;\n\n /**\n * The version number of the ASTNode, which increments by 1 each time `fireChange` is called.\n */\n protected _version: number = 0;\n\n /**\n * Update lock.\n * - When set to `true`, `fireChange` will not trigger any events.\n * - This is useful when multiple updates are needed, and you want to avoid multiple triggers.\n */\n public changeLocked = false;\n\n /**\n * Parameters related to batch updates.\n */\n private _batch: {\n batching: boolean;\n hasChangesInBatch: boolean;\n } = {\n batching: false,\n hasChangesInBatch: false,\n };\n\n /**\n * AST node change Observable events, implemented based on RxJS.\n * - Emits the current ASTNode value upon subscription.\n * - Emits a new value whenever `fireChange` is called.\n */\n public readonly value$: BehaviorSubject<ASTNode> = new BehaviorSubject<ASTNode>(this as ASTNode);\n\n /**\n * Child ASTNodes.\n */\n protected _children = new Set<ASTNode>();\n\n /**\n * List of disposal handlers for the ASTNode.\n */\n public readonly toDispose: DisposableCollection = new DisposableCollection(\n Disposable.create(() => {\n // When a child element is deleted, the parent element triggers an update.\n this.parent?.fireChange();\n this.children.forEach((child) => child.dispose());\n })\n );\n\n /**\n * Callback triggered upon disposal.\n */\n onDispose = this.toDispose.onDispose;\n\n /**\n * Constructor.\n * @param createParams Necessary parameters for creating an ASTNode.\n * @param injectOptions Dependency injection for various modules.\n */\n constructor({ key, parent, scope }: CreateASTParams, opts?: InjectOpts) {\n this.scope = scope;\n this.parent = parent;\n this.opts = opts;\n\n // Initialize the key value. If a key is passed in, use it; otherwise, generate a random one using nanoid.\n this.key = key || nanoid();\n\n // All `fireChange` calls within the subsequent `fromJSON` will be merged into one.\n this.fromJSON = this.withBatchUpdate(this.fromJSON.bind(this));\n }\n\n /**\n * The type of the ASTNode.\n */\n get kind(): string {\n if (!(this.constructor as any).kind) {\n throw new Error(`ASTNode Registry need a kind: ${this.constructor.name}`);\n }\n return (this.constructor as any).kind;\n }\n\n /**\n * Parses AST JSON data.\n * @param json AST JSON data.\n */\n abstract fromJSON(json: JSON): void;\n\n /**\n * Gets all child ASTNodes of the current ASTNode.\n */\n get children(): ASTNode[] {\n return Array.from(this._children);\n }\n\n /**\n * Serializes the current ASTNode to ASTNodeJSON.\n * @returns\n */\n toJSON(): ASTNodeJSON {\n // Prompt the user to implement the toJSON method for the ASTNode themselves, instead of using the fallback implementation.\n console.warn('[VariableEngine] Please Implement toJSON method for ' + this.kind);\n\n return {\n kind: this.kind,\n };\n }\n\n /**\n * Creates a child ASTNode.\n * @param json The AST JSON of the child ASTNode.\n * @returns\n */\n protected createChildNode<ChildNode extends ASTNode = ASTNode>(json: ASTNodeJSON): ChildNode {\n const astRegisters = this.scope.variableEngine.astRegisters;\n\n const child = astRegisters.createAST(json, {\n parent: this,\n scope: this.scope,\n }) as ChildNode;\n\n // Add to the _children set.\n this._children.add(child);\n child.toDispose.push(\n Disposable.create(() => {\n this._children.delete(child);\n })\n );\n\n return child;\n }\n\n /**\n * Updates a child ASTNode, quickly implementing the consumption logic for child ASTNode updates.\n * @param keyInThis The specified key on the current object.\n */\n protected updateChildNodeByKey(keyInThis: keyof this, nextJSON?: ASTNodeJSON) {\n this.withBatchUpdate(updateChildNodeHelper).call(this, {\n getChildNode: () => this[keyInThis] as ASTNode,\n updateChildNode: (_node) => ((this as any)[keyInThis] = _node),\n removeChildNode: () => ((this as any)[keyInThis] = undefined),\n nextJSON,\n });\n }\n\n /**\n * Batch updates the ASTNode, merging all `fireChange` calls within the batch function into one.\n * @param updater The batch function.\n * @returns\n */\n protected withBatchUpdate<ParamTypes extends any[], ReturnType>(\n updater: (...args: ParamTypes) => ReturnType\n ) {\n return (...args: ParamTypes) => {\n // Nested batchUpdate can only take effect once.\n if (this._batch.batching) {\n return updater.call(this, ...args);\n }\n\n this._batch.hasChangesInBatch = false;\n\n this._batch.batching = true;\n const res = updater.call(this, ...args);\n this._batch.batching = false;\n\n if (this._batch.hasChangesInBatch) {\n this.fireChange();\n }\n this._batch.hasChangesInBatch = false;\n\n return res;\n };\n }\n\n /**\n * Triggers an update for the current node.\n */\n fireChange(): void {\n if (this.changeLocked || this.disposed) {\n return;\n }\n\n if (this._batch.batching) {\n this._batch.hasChangesInBatch = true;\n return;\n }\n\n this._version++;\n this.value$.next(this);\n this.dispatchGlobalEvent<UpdateASTAction>({ type: 'UpdateAST' });\n this.parent?.fireChange();\n }\n\n /**\n * The version value of the ASTNode.\n * - You can used to check whether ASTNode are updated.\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * The unique hash value of the ASTNode.\n * - It will update when the ASTNode is updated.\n * - You can used to check two ASTNode are equal.\n */\n get hash(): string {\n return `${this._version}${this.kind}${this.key}`;\n }\n\n /**\n * Listens for changes to the ASTNode.\n * @param observer The listener callback.\n * @param selector Listens for specified data.\n * @returns\n */\n subscribe<Data = this>(\n observer: ObserverOrNext<Data>,\n { selector, debounceAnimation, triggerOnInit }: SubscribeConfig<this, Data> = {}\n ): Disposable {\n return subsToDisposable(\n this.value$\n .pipe(\n map(() => (selector ? selector(this) : (this as any))),\n distinctUntilChanged(\n (a, b) => shallowEqual(a, b),\n (value) => {\n if (value instanceof ASTNode) {\n // If the value is an ASTNode, compare its hash.\n return value.hash;\n }\n return value;\n }\n ),\n // By default, skip the first trigger of BehaviorSubject.\n triggerOnInit ? tap(() => null) : skip(1),\n // All updates within each animationFrame are merged into one.\n debounceAnimation ? debounceTime(0, animationFrameScheduler) : tap(() => null)\n )\n .subscribe(observer)\n );\n }\n\n /**\n * Dispatches a global event for the current ASTNode.\n * @param event The global event.\n */\n dispatchGlobalEvent<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n event: Omit<ActionType, 'ast'>\n ) {\n this.scope.event.dispatch({\n ...event,\n ast: this,\n });\n }\n\n /**\n * Disposes the ASTNode.\n */\n dispose(): void {\n // Prevent multiple disposals.\n if (this.toDispose.disposed) {\n return;\n }\n\n this.toDispose.dispose();\n this.dispatchGlobalEvent<DisposeASTAction>({ type: 'DisposeAST' });\n\n // When the complete event is emitted, ensure that the current ASTNode is in a disposed state.\n this.value$.complete();\n this.value$.unsubscribe();\n }\n\n get disposed(): boolean {\n return this.toDispose.disposed;\n }\n\n /**\n * Extended information of the ASTNode.\n */\n [key: string]: unknown;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseVariableField } from '../declaration';\nimport { ASTNode } from '../ast-node';\nimport { UnionJSON } from './union';\n\n/**\n * Base class for all types.\n *\n * All other types should extend this class.\n */\nexport abstract class BaseType<JSON extends ASTNodeJSON = any, InjectOpts = any> extends ASTNode<\n JSON,\n InjectOpts\n> {\n public flags: number = ASTNodeFlags.BasicType;\n\n /**\n * Check if the current type is equal to the target type.\n * @param targetTypeJSONOrKind The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n\n // If it is a Union type, it is sufficient for one of the subtypes to be equal.\n if (targetTypeJSON?.kind === ASTKind.Union) {\n return ((targetTypeJSON as UnionJSON)?.types || [])?.some((_subType) =>\n this.isTypeEqual(_subType)\n );\n }\n\n return this.kind === targetTypeJSON?.kind;\n }\n\n /**\n * Get a variable field by key path.\n *\n * This method should be implemented by drillable types.\n * @param keyPath The key path to search for.\n * @returns The variable field if found, otherwise `undefined`.\n */\n getByKeyPath(keyPath: string[] = []): BaseVariableField | undefined {\n throw new Error(`Get By Key Path is not implemented for Type: ${this.kind}`);\n }\n\n /**\n * Serialize the node to a JSON object.\n * @returns The JSON representation of the node.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: this.kind,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseVariableField } from '../declaration';\nimport { BaseType } from './base-type';\n\n/**\n * ASTNodeJSON representation of `ArrayType`\n */\nexport interface ArrayJSON {\n /**\n * The type of the items in the array.\n */\n items?: ASTNodeJSONOrKind;\n}\n\n/**\n * Represents an array type.\n */\nexport class ArrayType extends BaseType<ArrayJSON> {\n public flags: ASTNodeFlags = ASTNodeFlags.DrilldownType | ASTNodeFlags.EnumerateType;\n\n static kind: string = ASTKind.Array;\n\n /**\n * The type of the items in the array.\n */\n items: BaseType;\n\n /**\n * Deserializes the `ArrayJSON` to the `ArrayType`.\n * @param json The `ArrayJSON` to deserialize.\n */\n fromJSON({ items }: ArrayJSON): void {\n this.updateChildNodeByKey('items', parseTypeJsonOrKind(items));\n }\n\n /**\n * Whether the items type can be drilled down.\n */\n get canDrilldownItems(): boolean {\n return !!(this.items?.flags & ASTNodeFlags.DrilldownType);\n }\n\n /**\n * Get a variable field by key path.\n * @param keyPath The key path to search for.\n * @returns The variable field if found, otherwise `undefined`.\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n const [curr, ...rest] = keyPath || [];\n\n if (curr === '0' && this.canDrilldownItems) {\n // The first item of the array.\n return this.items.getByKeyPath(rest);\n }\n\n return undefined;\n }\n\n /**\n * Check if the current type is equal to the target type.\n * @param targetTypeJSONOrKind The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n const isSuperEqual = super.isTypeEqual(targetTypeJSONOrKind);\n\n if (targetTypeJSON?.weak || targetTypeJSON?.kind === ASTKind.Union) {\n return isSuperEqual;\n }\n\n return (\n targetTypeJSON &&\n isSuperEqual &&\n // Weak comparison, only need to compare the Kind.\n (targetTypeJSON?.weak || this.customStrongEqual(targetTypeJSON))\n );\n }\n\n /**\n * Array strong comparison.\n * @param targetTypeJSON The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n protected customStrongEqual(targetTypeJSON: ASTNodeJSON): boolean {\n if (!this.items) {\n return !(targetTypeJSON as ArrayJSON)?.items;\n }\n return this.items?.isTypeEqual((targetTypeJSON as ArrayJSON).items);\n }\n\n /**\n * Serialize the `ArrayType` to `ArrayJSON`\n * @returns The JSON representation of `ArrayType`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.Array,\n items: this.items?.toJSON(),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseType } from './base-type';\n\n/**\n * ASTNodeJSON representation of the `StringType`.\n */\nexport interface StringJSON {\n /**\n * see https://json-schema.org/understanding-json-schema/reference/type#format\n */\n format?: string;\n}\n\nexport class StringType extends BaseType {\n public flags: ASTNodeFlags = ASTNodeFlags.BasicType;\n\n static kind: string = ASTKind.String;\n\n protected _format?: string;\n\n /**\n * see https://json-schema.org/understanding-json-schema/reference/string#format\n */\n get format() {\n return this._format;\n }\n\n /**\n * Deserialize the `StringJSON` to the `StringType`.\n *\n * @param json StringJSON representation of the `StringType`.\n */\n fromJSON(json?: StringJSON): void {\n if (json?.format !== this._format) {\n this._format = json?.format;\n this.fireChange();\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseType } from './base-type';\n\n/**\n * Represents an integer type.\n */\nexport class IntegerType extends BaseType {\n public flags: ASTNodeFlags = ASTNodeFlags.BasicType;\n\n static kind: string = ASTKind.Integer;\n\n /**\n * Deserializes the `IntegerJSON` to the `IntegerType`.\n * @param json The `IntegerJSON` to deserialize.\n */\n fromJSON(): void {\n // noop\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { BaseType } from './base-type';\n\n/**\n * Represents a boolean type.\n */\nexport class BooleanType extends BaseType {\n static kind: string = ASTKind.Boolean;\n\n /**\n * Deserializes the `BooleanJSON` to the `BooleanType`.\n * @param json The `BooleanJSON` to deserialize.\n */\n fromJSON(): void {\n // noop\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { BaseType } from './base-type';\n\n/**\n * Represents a number type.\n */\nexport class NumberType extends BaseType {\n static kind: string = ASTKind.Number;\n\n /**\n * Deserializes the `NumberJSON` to the `NumberType`.\n * @param json The `NumberJSON` to deserialize.\n */\n fromJSON(): void {\n // noop\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { BaseType } from './base-type';\n\n/**\n * ASTNodeJSON representation of `MapType`\n */\nexport interface MapJSON {\n /**\n * The type of the keys in the map.\n */\n keyType?: ASTNodeJSONOrKind;\n /**\n * The type of the values in the map.\n */\n valueType?: ASTNodeJSONOrKind;\n}\n\n/**\n * Represents a map type.\n */\nexport class MapType extends BaseType<MapJSON> {\n static kind: string = ASTKind.Map;\n\n /**\n * The type of the keys in the map.\n */\n keyType: BaseType;\n\n /**\n * The type of the values in the map.\n */\n valueType: BaseType;\n\n /**\n * Deserializes the `MapJSON` to the `MapType`.\n * @param json The `MapJSON` to deserialize.\n */\n fromJSON({ keyType = ASTKind.String, valueType }: MapJSON): void {\n // Key defaults to String.\n this.updateChildNodeByKey('keyType', parseTypeJsonOrKind(keyType));\n this.updateChildNodeByKey('valueType', parseTypeJsonOrKind(valueType));\n }\n\n /**\n * Check if the current type is equal to the target type.\n * @param targetTypeJSONOrKind The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n const isSuperEqual = super.isTypeEqual(targetTypeJSONOrKind);\n\n if (targetTypeJSON?.weak || targetTypeJSON?.kind === ASTKind.Union) {\n return isSuperEqual;\n }\n\n return (\n targetTypeJSON &&\n isSuperEqual &&\n // Weak comparison, only need to compare the Kind.\n (targetTypeJSON?.weak || this.customStrongEqual(targetTypeJSON))\n );\n }\n\n /**\n * Map strong comparison.\n * @param targetTypeJSON The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n protected customStrongEqual(targetTypeJSON: ASTNodeJSON): boolean {\n const { keyType = ASTKind.String, valueType } = targetTypeJSON as MapJSON;\n\n const isValueTypeEqual =\n (!valueType && !this.valueType) || this.valueType?.isTypeEqual(valueType);\n\n return isValueTypeEqual && this.keyType?.isTypeEqual(keyType);\n }\n\n /**\n * Serialize the node to a JSON object.\n * @returns The JSON representation of the node.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.Map,\n keyType: this.keyType?.toJSON(),\n valueType: this.valueType?.toJSON(),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { xor } from 'lodash-es';\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTNodeJSON, ASTKind, ASTNodeJSONOrKind, type GlobalEventActionType } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { Property, type PropertyJSON } from '../declaration/property';\nimport { BaseType } from './base-type';\n\n/**\n * ASTNodeJSON representation of `ObjectType`\n */\nexport interface ObjectJSON<VariableMeta = any> {\n /**\n * The properties of the object.\n *\n * The `properties` of an Object must be of type `Property`, so the business can omit the `kind` field.\n */\n properties?: PropertyJSON<VariableMeta>[];\n}\n\n/**\n * Action type for object properties change.\n */\nexport type ObjectPropertiesChangeAction = GlobalEventActionType<\n 'ObjectPropertiesChange',\n {\n prev: Property[];\n next: Property[];\n },\n ObjectType\n>;\n\n/**\n * Represents an object type.\n */\nexport class ObjectType extends BaseType<ObjectJSON> {\n public flags: ASTNodeFlags = ASTNodeFlags.DrilldownType;\n\n static kind: string = ASTKind.Object;\n\n /**\n * A map of property keys to `Property` instances.\n */\n propertyTable: Map<string, Property> = new Map();\n\n /**\n * An array of `Property` instances.\n */\n properties: Property[];\n\n /**\n * Deserializes the `ObjectJSON` to the `ObjectType`.\n * @param json The `ObjectJSON` to deserialize.\n */\n fromJSON({ properties }: ObjectJSON): void {\n const removedKeys = new Set(this.propertyTable.keys());\n const prev = [...(this.properties || [])];\n\n // Iterate over the new properties.\n this.properties = (properties || []).map((property: PropertyJSON) => {\n const existProperty = this.propertyTable.get(property.key);\n removedKeys.delete(property.key);\n\n if (existProperty) {\n existProperty.fromJSON(property as PropertyJSON);\n\n return existProperty;\n } else {\n const newProperty = this.createChildNode({\n ...property,\n kind: ASTKind.Property,\n }) as Property;\n\n this.fireChange();\n\n this.propertyTable.set(property.key, newProperty);\n // TODO: When a child node is actively destroyed, delete the information in the table.\n\n return newProperty;\n }\n });\n\n // Delete properties that no longer exist.\n removedKeys.forEach((key) => {\n const property = this.propertyTable.get(key);\n property?.dispose();\n this.propertyTable.delete(key);\n this.fireChange();\n });\n\n this.dispatchGlobalEvent<ObjectPropertiesChangeAction>({\n type: 'ObjectPropertiesChange',\n payload: {\n prev,\n next: [...this.properties],\n },\n });\n }\n\n /**\n * Serialize the `ObjectType` to `ObjectJSON`.\n * @returns The JSON representation of `ObjectType`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.Object,\n properties: this.properties.map((_property) => _property.toJSON()),\n };\n }\n\n /**\n * Get a variable field by key path.\n * @param keyPath The key path to search for.\n * @returns The variable field if found, otherwise `undefined`.\n */\n getByKeyPath(keyPath: string[]): Property | undefined {\n const [curr, ...restKeyPath] = keyPath;\n\n const property = this.propertyTable.get(curr);\n\n // Found the end of the path.\n if (!restKeyPath.length) {\n return property;\n }\n\n // Otherwise, continue searching downwards.\n if (property?.type && property?.type?.flags & ASTNodeFlags.DrilldownType) {\n return property.type.getByKeyPath(restKeyPath) as Property | undefined;\n }\n\n return undefined;\n }\n\n /**\n * Check if the current type is equal to the target type.\n * @param targetTypeJSONOrKind The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n const isSuperEqual = super.isTypeEqual(targetTypeJSONOrKind);\n\n if (targetTypeJSON?.weak || targetTypeJSON?.kind === ASTKind.Union) {\n return isSuperEqual;\n }\n\n return (\n targetTypeJSON &&\n isSuperEqual &&\n // Weak comparison, only need to compare the Kind.\n (targetTypeJSON?.weak || this.customStrongEqual(targetTypeJSON))\n );\n }\n\n /**\n * Object type strong comparison.\n * @param targetTypeJSON The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n protected customStrongEqual(targetTypeJSON: ASTNodeJSON): boolean {\n const targetProperties = (targetTypeJSON as ObjectJSON).properties || [];\n\n const sourcePropertyKeys = Array.from(this.propertyTable.keys());\n const targetPropertyKeys = targetProperties.map((_target) => _target.key);\n\n const isKeyStrongEqual = !xor(sourcePropertyKeys, targetPropertyKeys).length;\n\n return (\n isKeyStrongEqual &&\n targetProperties.every((targetProperty) => {\n const sourceProperty = this.propertyTable.get(targetProperty.key);\n\n return (\n sourceProperty &&\n sourceProperty.key === targetProperty.key &&\n sourceProperty.type?.isTypeEqual(targetProperty?.type)\n );\n })\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSONOrKind } from '../types';\nimport { type UnionJSON } from './union';\nimport { BaseType } from './base-type';\n\n/**\n * ASTNodeJSON representation of `CustomType`\n */\nexport interface CustomTypeJSON {\n /**\n * The name of the custom type.\n */\n typeName: string;\n}\n\n/**\n * Represents a custom type.\n */\nexport class CustomType extends BaseType<CustomTypeJSON> {\n static kind: string = ASTKind.CustomType;\n\n protected _typeName: string;\n\n /**\n * The name of the custom type.\n */\n get typeName(): string {\n return this._typeName;\n }\n\n /**\n * Deserializes the `CustomTypeJSON` to the `CustomType`.\n * @param json The `CustomTypeJSON` to deserialize.\n */\n fromJSON(json: CustomTypeJSON): void {\n if (this._typeName !== json.typeName) {\n this._typeName = json.typeName;\n this.fireChange();\n }\n }\n\n /**\n * Check if the current type is equal to the target type.\n * @param targetTypeJSONOrKind The type to compare with.\n * @returns `true` if the types are equal, `false` otherwise.\n */\n public isTypeEqual(targetTypeJSONOrKind?: ASTNodeJSONOrKind): boolean {\n const targetTypeJSON = parseTypeJsonOrKind(targetTypeJSONOrKind);\n\n // If it is a Union type, it is sufficient for one of the subtypes to be equal.\n if (targetTypeJSON?.kind === ASTKind.Union) {\n return ((targetTypeJSON as UnionJSON)?.types || [])?.some((_subType) =>\n this.isTypeEqual(_subType)\n );\n }\n\n return targetTypeJSON?.kind === this.kind && targetTypeJSON?.typeName === this.typeName;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n type Observable,\n distinctUntilChanged,\n map,\n switchMap,\n combineLatest,\n of,\n Subject,\n share,\n} from 'rxjs';\nimport { shallowEqual } from 'fast-equals';\n\nimport { getParentFields } from '../utils/variable-field';\nimport { ASTNodeJSON, type CreateASTParams } from '../types';\nimport { type BaseType } from '../type';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseVariableField } from '../declaration';\nimport { ASTNode } from '../ast-node';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { IVariableTable } from '../../scope/types';\n\ntype ExpressionRefs = (BaseVariableField | undefined)[];\n\n/**\n * Base class for all expressions.\n *\n * All other expressions should extend this class.\n */\nexport abstract class BaseExpression<\n JSON extends ASTNodeJSON = any,\n InjectOpts = any\n> extends ASTNode<JSON, InjectOpts> {\n public flags: ASTNodeFlags = ASTNodeFlags.Expression;\n\n /**\n * Get the global variable table, which is used to access referenced variables.\n */\n get globalVariableTable(): IVariableTable {\n return this.scope.variableEngine.globalVariableTable;\n }\n\n /**\n * Parent variable fields, sorted from closest to farthest.\n */\n get parentFields(): BaseVariableField[] {\n return getParentFields(this);\n }\n\n /**\n * Get the variable fields referenced by the expression.\n *\n * This method should be implemented by subclasses.\n * @returns An array of referenced variable fields.\n */\n abstract getRefFields(): ExpressionRefs;\n\n /**\n * The return type of the expression.\n */\n abstract returnType: BaseType | undefined;\n\n /**\n * The variable fields referenced by the expression.\n */\n protected _refs: ExpressionRefs = [];\n\n /**\n * The variable fields referenced by the expression.\n */\n get refs(): ExpressionRefs {\n return this._refs;\n }\n\n protected refreshRefs$: Subject<void> = new Subject();\n\n /**\n * Refresh the variable references.\n */\n refreshRefs() {\n this.refreshRefs$.next();\n }\n\n /**\n * An observable that emits the referenced variable fields when they change.\n */\n refs$: Observable<ExpressionRefs> = this.refreshRefs$.pipe(\n map(() => this.getRefFields()),\n distinctUntilChanged<ExpressionRefs>(shallowEqual),\n switchMap((refs) =>\n !refs?.length\n ? of([])\n : combineLatest(\n refs.map((ref) =>\n ref\n ? (ref.value$ as unknown as Observable<BaseVariableField | undefined>)\n : of(undefined)\n )\n )\n ),\n share()\n );\n\n constructor(params: CreateASTParams, opts?: InjectOpts) {\n super(params, opts);\n\n this.toDispose.push(\n subsToDisposable(\n this.refs$.subscribe((_refs: ExpressionRefs) => {\n this._refs = _refs;\n this.fireChange();\n })\n )\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTNodeFlags } from '../flags';\nimport { BaseVariableField } from '../declaration';\nimport { ASTNode } from '../ast-node';\n\n/**\n * Parent variable fields, sorted from nearest to farthest.\n */\nexport function getParentFields(ast: ASTNode): BaseVariableField[] {\n let curr = ast.parent;\n const res: BaseVariableField[] = [];\n\n while (curr) {\n if (curr.flags & ASTNodeFlags.VariableField) {\n res.push(curr as BaseVariableField);\n }\n curr = curr.parent;\n }\n\n return res;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ArrayType } from '../type/array';\nimport { BaseType } from '../type';\nimport { BaseExpression } from './base-expression';\n\n/**\n * ASTNodeJSON representation of `EnumerateExpression`\n */\nexport interface EnumerateExpressionJSON {\n /**\n * The expression to be enumerated.\n */\n enumerateFor: ASTNodeJSON;\n}\n\n/**\n * Represents an enumeration expression, which iterates over a list and returns the type of the enumerated variable.\n */\nexport class EnumerateExpression extends BaseExpression<EnumerateExpressionJSON> {\n static kind: string = ASTKind.EnumerateExpression;\n\n protected _enumerateFor: BaseExpression | undefined;\n\n /**\n * The expression to be enumerated.\n */\n get enumerateFor() {\n return this._enumerateFor;\n }\n\n /**\n * The return type of the expression.\n */\n get returnType(): BaseType | undefined {\n // The return value of the enumerated expression.\n const childReturnType = this.enumerateFor?.returnType;\n\n if (childReturnType?.kind === ASTKind.Array) {\n // Get the item type of the array.\n return (childReturnType as ArrayType).items;\n }\n\n return undefined;\n }\n\n /**\n * Get the variable fields referenced by the expression.\n * @returns An empty array, as this expression does not reference any variables.\n */\n getRefFields(): [] {\n return [];\n }\n\n /**\n * Deserializes the `EnumerateExpressionJSON` to the `EnumerateExpression`.\n * @param json The `EnumerateExpressionJSON` to deserialize.\n */\n fromJSON({ enumerateFor: expression }: EnumerateExpressionJSON): void {\n this.updateChildNodeByKey('_enumerateFor', expression);\n }\n\n /**\n * Serialize the `EnumerateExpression` to `EnumerateExpressionJSON`.\n * @returns The JSON representation of `EnumerateExpression`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.EnumerateExpression,\n enumerateFor: this.enumerateFor?.toJSON(),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { checkRefCycle } from '../utils/expression';\nimport { ASTNodeJSON, ASTKind, CreateASTParams } from '../types';\nimport { BaseType } from '../type';\nimport { type BaseVariableField } from '../declaration';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { BaseExpression } from './base-expression';\n\n/**\n * ASTNodeJSON representation of `KeyPathExpression`\n */\nexport interface KeyPathExpressionJSON {\n /**\n * The key path of the variable.\n */\n keyPath: string[];\n}\n\n/**\n * Represents a key path expression, which is used to reference a variable by its key path.\n *\n * This is the V2 of `KeyPathExpression`, with the following improvements:\n * - `returnType` is copied to a new instance to avoid reference issues.\n * - Circular reference detection is introduced.\n */\nexport class KeyPathExpression<\n CustomPathJSON extends ASTNodeJSON = KeyPathExpressionJSON\n> extends BaseExpression<CustomPathJSON> {\n static kind: string = ASTKind.KeyPathExpression;\n\n protected _keyPath: string[] = [];\n\n /**\n * The key path of the variable.\n */\n get keyPath(): string[] {\n return this._keyPath;\n }\n\n /**\n * Get the variable fields referenced by the expression.\n * @returns An array of referenced variable fields.\n */\n getRefFields(): BaseVariableField[] {\n const ref = this.scope.available.getByKeyPath(this._keyPath);\n\n // When refreshing references, check for circular references. If a circular reference exists, do not reference the variable.\n if (checkRefCycle(this, [ref])) {\n // Prompt that a circular reference exists.\n console.warn(\n '[CustomKeyPathExpression] checkRefCycle: Reference Cycle Existed',\n this.parentFields.map((_field) => _field.key).reverse()\n );\n return [];\n }\n\n return ref ? [ref] : [];\n }\n\n /**\n * The return type of the expression.\n *\n * A new `returnType` node is generated directly, instead of reusing the existing one, to ensure that different key paths do not point to the same field.\n */\n _returnType: BaseType;\n\n /**\n * The return type of the expression.\n */\n get returnType() {\n return this._returnType;\n }\n\n /**\n * Parse the business-defined path expression into a key path.\n *\n * Businesses can quickly customize their own path expressions by modifying this method.\n * @param json The path expression defined by the business.\n * @returns The key path.\n */\n protected parseToKeyPath(json: CustomPathJSON): string[] {\n // The default JSON is in KeyPathExpressionJSON format.\n return (json as unknown as KeyPathExpressionJSON).keyPath;\n }\n\n /**\n * Deserializes the `KeyPathExpressionJSON` to the `KeyPathExpression`.\n * @param json The `KeyPathExpressionJSON` to deserialize.\n */\n fromJSON(json: CustomPathJSON): void {\n const keyPath = this.parseToKeyPath(json);\n\n if (!shallowEqual(keyPath, this._keyPath)) {\n this._keyPath = keyPath;\n\n // After the keyPath is updated, the referenced variables need to be refreshed.\n this.refreshRefs();\n }\n }\n\n /**\n * Get the return type JSON by reference.\n * @param _ref The referenced variable field.\n * @returns The JSON representation of the return type.\n */\n getReturnTypeJSONByRef(_ref: BaseVariableField | undefined): ASTNodeJSON | undefined {\n return _ref?.type?.toJSON();\n }\n\n protected prevRefTypeHash: string | undefined;\n\n constructor(params: CreateASTParams, opts: any) {\n super(params, opts);\n\n this.toDispose.pushAll([\n // Can be used when the variable list changes (when there are additions or deletions).\n this.scope.available.onVariableListChange(() => {\n this.refreshRefs();\n }),\n // When the referable variable pointed to by this._keyPath changes, refresh the reference data.\n this.scope.available.onAnyVariableChange((_v) => {\n if (_v.key === this._keyPath[0]) {\n this.refreshRefs();\n }\n }),\n subsToDisposable(\n this.refs$.subscribe((_type) => {\n const [ref] = this._refs;\n\n if (this.prevRefTypeHash !== ref?.type?.hash) {\n this.prevRefTypeHash = ref?.type?.hash;\n this.updateChildNodeByKey('_returnType', this.getReturnTypeJSONByRef(ref));\n }\n })\n ),\n ]);\n }\n\n /**\n * Serialize the `KeyPathExpression` to `KeyPathExpressionJSON`.\n * @returns The JSON representation of `KeyPathExpression`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.KeyPathExpression,\n keyPath: this._keyPath,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { intersection } from 'lodash-es';\n\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseExpression } from '../expression';\nimport { type BaseVariableField } from '../declaration';\nimport { type ASTNode } from '../ast-node';\nimport { getParentFields } from './variable-field';\nimport { getAllChildren } from './helpers';\n\n/**\n * Get all variables referenced by child ASTs.\n * @param ast The ASTNode to traverse.\n * @returns All variables referenced by child ASTs.\n */\nexport function getAllRefs(ast: ASTNode): BaseVariableField[] {\n return getAllChildren(ast)\n .filter((_child) => _child.flags & ASTNodeFlags.Expression)\n .map((_child) => (_child as BaseExpression).refs)\n .flat()\n .filter(Boolean) as BaseVariableField[];\n}\n\n/**\n * Checks for circular references.\n * @param curr The current expression.\n * @param refNode The referenced variable node.\n * @returns Whether a circular reference exists.\n */\nexport function checkRefCycle(\n curr: BaseExpression,\n refNodes: (BaseVariableField | undefined)[]\n): boolean {\n // If there are no circular references in the scope, then it is impossible to have a circular reference.\n if (\n intersection(curr.scope.coverScopes, refNodes.map((_ref) => _ref?.scope).filter(Boolean))\n .length === 0\n ) {\n return false;\n }\n\n // BFS traversal.\n const visited = new Set<BaseVariableField>();\n const queue = [...refNodes];\n\n while (queue.length) {\n const currNode = queue.shift()!;\n visited.add(currNode);\n\n for (const ref of getAllRefs(currNode).filter((_ref) => !visited.has(_ref))) {\n queue.push(ref);\n }\n }\n\n // If the referenced variables include the parent variable of the expression, then there is a circular reference.\n return intersection(Array.from(visited), getParentFields(curr)).length > 0;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { ASTNodeJSON, ASTKind, CreateASTParams } from '../types';\nimport { BaseType } from '../type';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseVariableField } from '../declaration';\nimport { BaseExpression } from './base-expression';\n\n/**\n * ASTNodeJSON representation of `KeyPathExpression`\n */\nexport interface KeyPathExpressionJSON {\n /**\n * The key path of the variable.\n */\n keyPath: string[];\n}\n\n/**\n * @deprecated Use `KeyPathExpression` instead.\n * Represents a key path expression, which is used to reference a variable by its key path.\n */\nexport class LegacyKeyPathExpression<\n CustomPathJSON extends ASTNodeJSON = KeyPathExpressionJSON\n> extends BaseExpression<CustomPathJSON> {\n static kind: string = ASTKind.KeyPathExpression;\n\n protected _keyPath: string[] = [];\n\n /**\n * The key path of the variable.\n */\n get keyPath(): string[] {\n return this._keyPath;\n }\n\n /**\n * Get the variable fields referenced by the expression.\n * @returns An array of referenced variable fields.\n */\n getRefFields(): BaseVariableField[] {\n const ref = this.scope.available.getByKeyPath(this._keyPath);\n return ref ? [ref] : [];\n }\n\n /**\n * The return type of the expression.\n */\n get returnType(): BaseType | undefined {\n const [refNode] = this._refs || [];\n\n // Get the type of the referenced variable.\n if (refNode && refNode.flags & ASTNodeFlags.VariableField) {\n return refNode.type;\n }\n\n return;\n }\n\n /**\n * Parse the business-defined path expression into a key path.\n *\n * Businesses can quickly customize their own path expressions by modifying this method.\n * @param json The path expression defined by the business.\n * @returns The key path.\n */\n protected parseToKeyPath(json: CustomPathJSON): string[] {\n // The default JSON is in KeyPathExpressionJSON format.\n return (json as unknown as KeyPathExpressionJSON).keyPath;\n }\n\n /**\n * Deserializes the `KeyPathExpressionJSON` to the `KeyPathExpression`.\n * @param json The `KeyPathExpressionJSON` to deserialize.\n */\n fromJSON(json: CustomPathJSON): void {\n const keyPath = this.parseToKeyPath(json);\n\n if (!shallowEqual(keyPath, this._keyPath)) {\n this._keyPath = keyPath;\n\n // After the keyPath is updated, the referenced variables need to be refreshed.\n this.refreshRefs();\n }\n }\n\n constructor(params: CreateASTParams, opts: any) {\n super(params, opts);\n\n this.toDispose.pushAll([\n // Can be used when the variable list changes (when there are additions or deletions).\n this.scope.available.onVariableListChange(() => {\n this.refreshRefs();\n }),\n // When the referable variable pointed to by this._keyPath changes, refresh the reference data.\n this.scope.available.onAnyVariableChange((_v) => {\n if (_v.key === this._keyPath[0]) {\n this.refreshRefs();\n }\n }),\n ]);\n }\n\n /**\n * Serialize the `KeyPathExpression` to `KeyPathExpressionJSON`.\n * @returns The JSON representation of `KeyPathExpression`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.KeyPathExpression,\n keyPath: this._keyPath,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { postConstructAST } from '../utils/inversify';\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { BaseType } from '../type';\nimport { BaseExpression } from './base-expression';\n\n/**\n * ASTNodeJSON representation of `WrapArrayExpression`\n */\nexport interface WrapArrayExpressionJSON {\n /**\n * The expression to be wrapped.\n */\n wrapFor: ASTNodeJSON;\n}\n\n/**\n * Represents a wrap expression, which wraps an expression with an array.\n */\nexport class WrapArrayExpression extends BaseExpression<WrapArrayExpressionJSON> {\n static kind: string = ASTKind.WrapArrayExpression;\n\n protected _wrapFor: BaseExpression | undefined;\n\n protected _returnType: BaseType | undefined;\n\n /**\n * The expression to be wrapped.\n */\n get wrapFor() {\n return this._wrapFor;\n }\n\n /**\n * The return type of the expression.\n */\n get returnType(): BaseType | undefined {\n return this._returnType;\n }\n\n /**\n * Refresh the return type of the expression.\n */\n refreshReturnType() {\n // The return value of the wrapped expression.\n const childReturnTypeJSON = this.wrapFor?.returnType?.toJSON();\n\n this.updateChildNodeByKey('_returnType', {\n kind: ASTKind.Array,\n items: childReturnTypeJSON,\n });\n }\n\n /**\n * Get the variable fields referenced by the expression.\n * @returns An empty array, as this expression does not reference any variables.\n */\n getRefFields(): [] {\n return [];\n }\n\n /**\n * Deserializes the `WrapArrayExpressionJSON` to the `WrapArrayExpression`.\n * @param json The `WrapArrayExpressionJSON` to deserialize.\n */\n fromJSON({ wrapFor: expression }: WrapArrayExpressionJSON): void {\n this.updateChildNodeByKey('_wrapFor', expression);\n }\n\n /**\n * Serialize the `WrapArrayExpression` to `WrapArrayExpressionJSON`.\n * @returns The JSON representation of `WrapArrayExpression`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.WrapArrayExpression,\n wrapFor: this.wrapFor?.toJSON(),\n };\n }\n\n @postConstructAST()\n protected init() {\n this.refreshReturnType = this.refreshReturnType.bind(this);\n\n this.toDispose.push(\n this.subscribe(this.refreshReturnType, {\n selector: (curr) => curr.wrapFor?.returnType,\n triggerOnInit: true,\n })\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { getParentFields } from '../utils/variable-field';\nimport { ASTNodeJSON, ASTNodeJSONOrKind, Identifier } from '../types';\nimport { type BaseType } from '../type';\nimport { ASTNodeFlags } from '../flags';\nimport { type BaseExpression } from '../expression';\nimport { ASTNode } from '../ast-node';\n\n/**\n * ASTNodeJSON representation of `BaseVariableField`\n */\nexport type BaseVariableFieldJSON<VariableMeta = any> = {\n /**\n * key of the variable field\n * - For `VariableDeclaration`, the key should be global unique.\n * - For `Property`, the key is the property name.\n */\n key?: Identifier;\n /**\n * type of the variable field, similar to js code:\n * `const v: string`\n */\n type?: ASTNodeJSONOrKind;\n /**\n * initializer of the variable field, similar to js code:\n * `const v = 'hello'`\n *\n * with initializer, the type of field will be inferred from the initializer.\n */\n initializer?: ASTNodeJSON;\n /**\n * meta data of the variable field, you cans store information like `title`, `icon`, etc.\n */\n meta?: VariableMeta;\n};\n\n/**\n * Variable Field abstract class, which is the base class for `VariableDeclaration` and `Property`\n *\n * - `VariableDeclaration` is used to declare a variable in a block scope.\n * - `Property` is used to declare a property in an object.\n */\nexport abstract class BaseVariableField<VariableMeta = any> extends ASTNode<\n BaseVariableFieldJSON<VariableMeta>\n> {\n public flags: ASTNodeFlags = ASTNodeFlags.VariableField;\n\n protected _type?: BaseType;\n\n protected _meta: VariableMeta = {} as any;\n\n protected _initializer?: BaseExpression;\n\n /**\n * Parent variable fields, sorted from closest to farthest\n */\n get parentFields(): BaseVariableField[] {\n return getParentFields(this);\n }\n\n /**\n * KeyPath of the variable field, sorted from farthest to closest\n */\n get keyPath(): string[] {\n return [...this.parentFields.reverse().map((_field) => _field.key), this.key];\n }\n\n /**\n * Metadata of the variable field, you cans store information like `title`, `icon`, etc.\n */\n get meta(): VariableMeta {\n return this._meta;\n }\n\n /**\n * Type of the variable field, similar to js code:\n * `const v: string`\n */\n get type(): BaseType {\n return (this._initializer?.returnType || this._type)!;\n }\n\n /**\n * Initializer of the variable field, similar to js code:\n * `const v = 'hello'`\n *\n * with initializer, the type of field will be inferred from the initializer.\n */\n get initializer(): BaseExpression | undefined {\n return this._initializer;\n }\n\n /**\n * The global unique hash of the field, and will be changed when the field is updated.\n */\n get hash(): string {\n return `[${this._version}]${this.keyPath.join('.')}`;\n }\n\n /**\n * Deserialize the `BaseVariableFieldJSON` to the `BaseVariableField`.\n * @param json ASTJSON representation of `BaseVariableField`\n */\n fromJSON({ type, initializer, meta }: BaseVariableFieldJSON<VariableMeta>): void {\n // 类型变化\n this.updateType(type);\n\n // 表达式更新\n this.updateInitializer(initializer);\n\n // Extra 更新\n this.updateMeta(meta!);\n }\n\n /**\n * Update the type of the variable field\n * @param type type ASTJSON representation of Type\n */\n updateType(type: BaseVariableFieldJSON['type']) {\n const nextTypeJson = typeof type === 'string' ? { kind: type } : type;\n this.updateChildNodeByKey('_type', nextTypeJson);\n }\n\n /**\n * Update the initializer of the variable field\n * @param nextInitializer initializer ASTJSON representation of Expression\n */\n updateInitializer(nextInitializer?: BaseVariableFieldJSON['initializer']) {\n this.updateChildNodeByKey('_initializer', nextInitializer);\n }\n\n /**\n * Update the meta data of the variable field\n * @param nextMeta meta data of the variable field\n */\n updateMeta(nextMeta: VariableMeta) {\n if (!shallowEqual(nextMeta, this._meta)) {\n this._meta = nextMeta;\n this.fireChange();\n }\n }\n\n /**\n * Get the variable field by keyPath, similar to js code:\n * `v.a.b`\n * @param keyPath\n * @returns\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n if (this.type?.flags & ASTNodeFlags.DrilldownType) {\n return this.type.getByKeyPath(keyPath) as BaseVariableField | undefined;\n }\n\n return undefined;\n }\n\n /**\n * Subscribe to type change of the variable field\n * @param observer\n * @returns\n */\n onTypeChange(observer: (type: ASTNode | undefined) => void) {\n return this.subscribe(observer, { selector: (curr) => curr.type });\n }\n\n /**\n * Serialize the variable field to JSON\n * @returns ASTNodeJSON representation of `BaseVariableField`\n */\n toJSON(): BaseVariableFieldJSON<VariableMeta> & { kind: string } {\n return {\n kind: this.kind,\n key: this.key,\n type: this.type?.toJSON(),\n initializer: this.initializer?.toJSON(),\n meta: this._meta,\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, GlobalEventActionType, type CreateASTParams } from '../types';\nimport { BaseVariableField, BaseVariableFieldJSON } from './base-variable-field';\n\n/**\n * ASTNodeJSON representation of the `VariableDeclaration`.\n */\nexport type VariableDeclarationJSON<VariableMeta = any> = BaseVariableFieldJSON<VariableMeta> & {\n /**\n * Variable sorting order, which is used to sort variables in `scope.outputs.variables`\n */\n order?: number;\n};\n\n/**\n * Action type for re-sorting variable declarations.\n */\nexport type ReSortVariableDeclarationsAction = GlobalEventActionType<'ReSortVariableDeclarations'>;\n\n/**\n * `VariableDeclaration` is a variable field that represents a variable declaration.\n */\nexport class VariableDeclaration<VariableMeta = any> extends BaseVariableField<VariableMeta> {\n static kind: string = ASTKind.VariableDeclaration;\n\n protected _order: number = 0;\n\n /**\n * Variable sorting order, which is used to sort variables in `scope.outputs.variables`\n */\n get order(): number {\n return this._order;\n }\n\n constructor(params: CreateASTParams) {\n super(params);\n }\n\n /**\n * Deserialize the `VariableDeclarationJSON` to the `VariableDeclaration`.\n */\n fromJSON({ order, ...rest }: VariableDeclarationJSON<VariableMeta>): void {\n // Update order.\n this.updateOrder(order);\n\n // Update other information.\n super.fromJSON(rest as BaseVariableFieldJSON<VariableMeta>);\n }\n\n /**\n * Update the sorting order of the variable declaration.\n * @param order Variable sorting order. Default is 0.\n */\n updateOrder(order: number = 0): void {\n if (order !== this._order) {\n this._order = order;\n this.dispatchGlobalEvent<ReSortVariableDeclarationsAction>({\n type: 'ReSortVariableDeclarations',\n });\n this.fireChange();\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { GlobalEventActionType } from '../types';\nimport { ASTNode } from '../ast-node';\nimport { type VariableDeclarationJSON, VariableDeclaration } from './variable-declaration';\n\nexport interface VariableDeclarationListJSON<VariableMeta = any> {\n /**\n * `declarations` must be of type `VariableDeclaration`, so the business can omit the `kind` field.\n */\n declarations?: VariableDeclarationJSON<VariableMeta>[];\n /**\n * The starting order number for variables.\n */\n startOrder?: number;\n}\n\nexport type VariableDeclarationListChangeAction = GlobalEventActionType<\n 'VariableListChange',\n {\n prev: VariableDeclaration[];\n next: VariableDeclaration[];\n },\n VariableDeclarationList\n>;\n\nexport class VariableDeclarationList extends ASTNode<VariableDeclarationListJSON> {\n static kind: string = ASTKind.VariableDeclarationList;\n\n /**\n * Map of variable declarations, keyed by variable name.\n */\n declarationTable: Map<string, VariableDeclaration> = new Map();\n\n /**\n * Variable declarations, sorted by `order`.\n */\n declarations: VariableDeclaration[];\n\n /**\n * Deserialize the `VariableDeclarationListJSON` to the `VariableDeclarationList`.\n * - VariableDeclarationListChangeAction will be dispatched after deserialization.\n *\n * @param declarations Variable declarations.\n * @param startOrder The starting order number for variables. Default is 0.\n */\n fromJSON({ declarations, startOrder }: VariableDeclarationListJSON): void {\n const removedKeys = new Set(this.declarationTable.keys());\n const prev = [...(this.declarations || [])];\n\n // Iterate over the new properties.\n this.declarations = (declarations || []).map(\n (declaration: VariableDeclarationJSON, idx: number) => {\n const order = (startOrder || 0) + idx;\n\n // If the key is not set, reuse the previous key.\n const declarationKey = declaration.key || this.declarations?.[idx]?.key;\n const existDeclaration = this.declarationTable.get(declarationKey);\n if (declarationKey) {\n removedKeys.delete(declarationKey);\n }\n\n if (existDeclaration) {\n existDeclaration.fromJSON({ order, ...declaration });\n\n return existDeclaration;\n } else {\n const newDeclaration = this.createChildNode({\n order,\n ...declaration,\n kind: ASTKind.VariableDeclaration,\n }) as VariableDeclaration;\n this.fireChange();\n\n this.declarationTable.set(newDeclaration.key, newDeclaration);\n\n return newDeclaration;\n }\n }\n );\n\n // Delete variables that no longer exist.\n removedKeys.forEach((key) => {\n const declaration = this.declarationTable.get(key);\n declaration?.dispose();\n this.declarationTable.delete(key);\n });\n\n this.dispatchGlobalEvent<VariableDeclarationListChangeAction>({\n type: 'VariableListChange',\n payload: {\n prev,\n next: [...this.declarations],\n },\n });\n }\n\n /**\n * Serialize the `VariableDeclarationList` to the `VariableDeclarationListJSON`.\n * @returns ASTJSON representation of `VariableDeclarationList`\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.VariableDeclarationList,\n declarations: this.declarations.map((_declaration) => _declaration.toJSON()),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind } from '../types';\nimport { BaseVariableField, BaseVariableFieldJSON } from './base-variable-field';\n\n/**\n * ASTNodeJSON representation of the `Property`.\n */\nexport type PropertyJSON<VariableMeta = any> = BaseVariableFieldJSON<VariableMeta> & {\n // Key is a required field.\n key: string;\n};\n\n/**\n * `Property` is a variable field that represents a property of a `ObjectType`.\n */\nexport class Property<VariableMeta = any> extends BaseVariableField<VariableMeta> {\n static kind: string = ASTKind.Property;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { shallowEqual } from 'fast-equals';\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ASTNode } from '../ast-node';\n\n/**\n * Represents a general data node with no child nodes.\n */\nexport class DataNode<Data = any> extends ASTNode {\n static kind: string = ASTKind.DataNode;\n\n protected _data: Data;\n\n /**\n * The data of the node.\n */\n get data(): Data {\n return this._data;\n }\n\n /**\n * Deserializes the `DataNodeJSON` to the `DataNode`.\n * @param json The `DataNodeJSON` to deserialize.\n */\n fromJSON(json: Data): void {\n const { kind, ...restData } = json as ASTNodeJSON;\n\n if (!shallowEqual(restData, this._data)) {\n this._data = restData as unknown as Data;\n this.fireChange();\n }\n }\n\n /**\n * Serialize the `DataNode` to `DataNodeJSON`.\n * @returns The JSON representation of `DataNode`.\n */\n toJSON() {\n return {\n kind: ASTKind.DataNode,\n ...this._data,\n };\n }\n\n /**\n * Partially update the data of the node.\n * @param nextData The data to be updated.\n */\n partialUpdate(nextData: Data) {\n if (!shallowEqual(nextData, this._data)) {\n this._data = {\n ...this._data,\n ...nextData,\n };\n this.fireChange();\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ASTNode } from '../ast-node';\n\n/**\n * ASTNodeJSON representation of `ListNode`\n */\nexport interface ListNodeJSON {\n /**\n * The list of nodes.\n */\n list: ASTNodeJSON[];\n}\n\n/**\n * Represents a list of nodes.\n */\nexport class ListNode extends ASTNode<ListNodeJSON> {\n static kind: string = ASTKind.ListNode;\n\n protected _list: ASTNode[];\n\n /**\n * The list of nodes.\n */\n get list(): ASTNode[] {\n return this._list;\n }\n\n /**\n * Deserializes the `ListNodeJSON` to the `ListNode`.\n * @param json The `ListNodeJSON` to deserialize.\n */\n fromJSON({ list }: ListNodeJSON): void {\n // Children that exceed the length need to be destroyed.\n this._list.slice(list.length).forEach((_item) => {\n _item.dispose();\n this.fireChange();\n });\n\n // Processing of remaining children.\n this._list = list.map((_item, idx) => {\n const prevItem = this._list[idx];\n\n if (prevItem.kind !== _item.kind) {\n prevItem.dispose();\n this.fireChange();\n return this.createChildNode(_item);\n }\n\n prevItem.fromJSON(_item);\n return prevItem;\n });\n }\n\n /**\n * Serialize the `ListNode` to `ListNodeJSON`.\n * @returns The JSON representation of `ListNode`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.ListNode,\n list: this._list.map((item) => item.toJSON()),\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { updateChildNodeHelper } from '../utils/helpers';\nimport { ASTKind, ASTNodeJSON } from '../types';\nimport { ASTNode } from '../ast-node';\n\n/**\n * ASTNodeJSON representation of `MapNode`\n */\nexport interface MapNodeJSON {\n /**\n * The map of nodes.\n */\n map: [string, ASTNodeJSON][];\n}\n\n/**\n * Represents a map of nodes.\n */\nexport class MapNode extends ASTNode<MapNodeJSON> {\n static kind: string = ASTKind.MapNode;\n\n protected map: Map<string, ASTNode> = new Map<string, ASTNode>();\n\n /**\n * Deserializes the `MapNodeJSON` to the `MapNode`.\n * @param json The `MapNodeJSON` to deserialize.\n */\n fromJSON({ map }: MapNodeJSON): void {\n const removedKeys = new Set(this.map.keys());\n\n for (const [key, item] of map || []) {\n removedKeys.delete(key);\n this.set(key, item);\n }\n\n for (const removeKey of Array.from(removedKeys)) {\n this.remove(removeKey);\n }\n }\n\n /**\n * Serialize the `MapNode` to `MapNodeJSON`.\n * @returns The JSON representation of `MapNode`.\n */\n toJSON(): ASTNodeJSON {\n return {\n kind: ASTKind.MapNode,\n map: Array.from(this.map.entries()),\n };\n }\n\n /**\n * Set a node in the map.\n * @param key The key of the node.\n * @param nextJSON The JSON representation of the node.\n * @returns The node instance.\n */\n set<Node extends ASTNode = ASTNode>(key: string, nextJSON: ASTNodeJSON): Node {\n return this.withBatchUpdate(updateChildNodeHelper).call(this, {\n getChildNode: () => this.get(key),\n removeChildNode: () => this.map.delete(key),\n updateChildNode: (nextNode) => this.map.set(key, nextNode),\n nextJSON,\n }) as Node;\n }\n\n /**\n * Remove a node from the map.\n * @param key The key of the node.\n */\n remove(key: string) {\n this.get(key)?.dispose();\n this.map.delete(key);\n this.fireChange();\n }\n\n /**\n * Get a node from the map.\n * @param key The key of the node.\n * @returns The node instance if found, otherwise `undefined`.\n */\n get<Node extends ASTNode = ASTNode>(key: string): Node | undefined {\n return this.map.get(key) as Node | undefined;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ASTKind, ASTNodeJSON } from './types';\nimport { StringJSON } from './type/string';\nimport { MapJSON } from './type/map';\nimport { ArrayJSON } from './type/array';\nimport { CustomTypeJSON, ObjectJSON, UnionJSON } from './type';\nimport {\n EnumerateExpressionJSON,\n KeyPathExpressionJSON,\n WrapArrayExpressionJSON,\n} from './expression';\nimport { PropertyJSON, VariableDeclarationJSON, VariableDeclarationListJSON } from './declaration';\nimport { ASTNode } from './ast-node';\n\n/**\n * Variable-core ASTNode factories.\n */\nexport namespace ASTFactory {\n /**\n * Type-related factories.\n */\n\n /**\n * Creates a `String` type node.\n */\n export const createString = (json?: StringJSON) => ({\n kind: ASTKind.String,\n ...(json || {}),\n });\n\n /**\n * Creates a `Number` type node.\n */\n export const createNumber = () => ({ kind: ASTKind.Number });\n\n /**\n * Creates a `Boolean` type node.\n */\n export const createBoolean = () => ({ kind: ASTKind.Boolean });\n\n /**\n * Creates an `Integer` type node.\n */\n export const createInteger = () => ({ kind: ASTKind.Integer });\n\n /**\n * Creates an `Object` type node.\n */\n export const createObject = (json: ObjectJSON) => ({\n kind: ASTKind.Object,\n ...json,\n });\n\n /**\n * Creates an `Array` type node.\n */\n export const createArray = (json: ArrayJSON) => ({\n kind: ASTKind.Array,\n ...json,\n });\n\n /**\n * Creates a `Map` type node.\n */\n export const createMap = (json: MapJSON) => ({\n kind: ASTKind.Map,\n ...json,\n });\n\n /**\n * Creates a `Union` type node.\n */\n export const createUnion = (json: UnionJSON) => ({\n kind: ASTKind.Union,\n ...json,\n });\n\n /**\n * Creates a `CustomType` node.\n */\n export const createCustomType = (json: CustomTypeJSON) => ({\n kind: ASTKind.CustomType,\n ...json,\n });\n\n /**\n * Declaration-related factories.\n */\n\n /**\n * Creates a `VariableDeclaration` node.\n */\n export const createVariableDeclaration = <VariableMeta = any>(\n json: VariableDeclarationJSON<VariableMeta>\n ) => ({\n kind: ASTKind.VariableDeclaration,\n ...json,\n });\n\n /**\n * Creates a `Property` node.\n */\n export const createProperty = <VariableMeta = any>(json: PropertyJSON<VariableMeta>) => ({\n kind: ASTKind.Property,\n ...json,\n });\n\n /**\n * Creates a `VariableDeclarationList` node.\n */\n export const createVariableDeclarationList = (json: VariableDeclarationListJSON) => ({\n kind: ASTKind.VariableDeclarationList,\n ...json,\n });\n\n /**\n * Expression-related factories.\n */\n\n /**\n * Creates an `EnumerateExpression` node.\n */\n export const createEnumerateExpression = (json: EnumerateExpressionJSON) => ({\n kind: ASTKind.EnumerateExpression,\n ...json,\n });\n\n /**\n * Creates a `KeyPathExpression` node.\n */\n export const createKeyPathExpression = (json: KeyPathExpressionJSON) => ({\n kind: ASTKind.KeyPathExpression,\n ...json,\n });\n\n /**\n * Creates a `WrapArrayExpression` node.\n */\n export const createWrapArrayExpression = (json: WrapArrayExpressionJSON) => ({\n kind: ASTKind.WrapArrayExpression,\n ...json,\n });\n\n /**\n * Create by AST Class.\n */\n\n /**\n * Creates Type-Safe ASTNodeJSON object based on the provided AST class.\n *\n * @param targetType Target ASTNode class.\n * @param json The JSON data for the node.\n * @returns The ASTNode JSON object.\n */\n export const create = <JSON extends ASTNodeJSON>(\n targetType: { kind: string; new (...args: any[]): ASTNode<JSON> },\n json: JSON\n ) => ({ kind: targetType.kind, ...json });\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { VariableTable } from '../variable-table';\nimport { IVariableTable } from '../types';\nimport { type Scope } from '../scope';\nimport { type VariableEngine } from '../../variable-engine';\nimport { createMemo } from '../../utils/memo';\nimport { NewASTAction } from '../../ast/types';\nimport { DisposeASTAction } from '../../ast/types';\nimport { ReSortVariableDeclarationsAction } from '../../ast/declaration/variable-declaration';\nimport { ASTKind, type VariableDeclaration } from '../../ast';\n\n/**\n * Manages the output variables of a scope.\n */\nexport class ScopeOutputData {\n protected variableTable: IVariableTable;\n\n protected memo = createMemo();\n\n /**\n * The variable engine instance.\n */\n get variableEngine(): VariableEngine {\n return this.scope.variableEngine;\n }\n\n /**\n * The global variable table from the variable engine.\n */\n get globalVariableTable(): IVariableTable {\n return this.scope.variableEngine.globalVariableTable;\n }\n\n /**\n * The current version of the output data, which increments on each change.\n */\n get version() {\n return this.variableTable.version;\n }\n\n /**\n * @deprecated use onListOrAnyVarChange instead\n */\n get onDataChange() {\n return this.variableTable.onDataChange.bind(this.variableTable);\n }\n\n /**\n * An event that fires when the list of output variables changes.\n */\n get onVariableListChange() {\n return this.variableTable.onVariableListChange.bind(this.variableTable);\n }\n\n /**\n * An event that fires when any output variable's value changes.\n */\n get onAnyVariableChange() {\n return this.variableTable.onAnyVariableChange.bind(this.variableTable);\n }\n\n /**\n * An event that fires when the output variable list changes or any variable's value is updated.\n */\n get onListOrAnyVarChange() {\n return this.variableTable.onListOrAnyVarChange.bind(this.variableTable);\n }\n\n protected _hasChanges = false;\n\n constructor(public readonly scope: Scope) {\n // Setup scope variable table based on globalVariableTable\n this.variableTable = new VariableTable(scope.variableEngine.globalVariableTable);\n\n this.scope.toDispose.pushAll([\n // When the root AST node is updated, check if there are any changes.\n this.scope.ast.subscribe(() => {\n if (this._hasChanges) {\n this.memo.clear();\n this.notifyCoversChange();\n this.variableTable.fireChange();\n this._hasChanges = false;\n }\n }),\n this.scope.event.on<DisposeASTAction>('DisposeAST', (_action) => {\n if (_action.ast?.kind === ASTKind.VariableDeclaration) {\n this.removeVariableFromTable(_action.ast.key);\n }\n }),\n this.scope.event.on<NewASTAction>('NewAST', (_action) => {\n if (_action.ast?.kind === ASTKind.VariableDeclaration) {\n this.addVariableToTable(_action.ast as VariableDeclaration);\n }\n }),\n this.scope.event.on<ReSortVariableDeclarationsAction>('ReSortVariableDeclarations', () => {\n this._hasChanges = true;\n }),\n this.variableTable,\n ]);\n }\n\n /**\n * The output variable declarations of the scope, sorted by order.\n */\n get variables(): VariableDeclaration[] {\n return this.memo('variables', () =>\n this.variableTable.variables.sort((a, b) => a.order - b.order)\n );\n }\n\n /**\n * The keys of the output variables.\n */\n get variableKeys(): string[] {\n return this.memo('variableKeys', () => this.variableTable.variableKeys);\n }\n\n protected addVariableToTable(variable: VariableDeclaration) {\n if (variable.scope !== this.scope) {\n throw Error('VariableDeclaration must be a ast node in scope');\n }\n\n (this.variableTable as VariableTable).addVariableToTable(variable);\n this._hasChanges = true;\n }\n\n protected removeVariableFromTable(key: string) {\n (this.variableTable as VariableTable).removeVariableFromTable(key);\n this._hasChanges = true;\n }\n\n /**\n * Retrieves a variable declaration by its key.\n * @param key The key of the variable.\n * @returns The `VariableDeclaration` or `undefined` if not found.\n */\n getVariableByKey(key: string) {\n return this.variableTable.getVariableByKey(key);\n }\n\n /**\n * Notifies the covering scopes that the available variables have changed.\n */\n notifyCoversChange(): void {\n this.scope.coverScopes.forEach((scope) => scope.available.refresh());\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n share,\n skip,\n startWith,\n switchMap,\n tap,\n} from 'rxjs';\nimport { flatten } from 'lodash-es';\nimport { shallowEqual } from 'fast-equals';\nimport { Disposable } from '@flowgram.ai/utils';\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { IVariableTable } from '../types';\nimport { type Scope } from '../scope';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { createMemo } from '../../utils/memo';\nimport { SubscribeConfig } from '../../ast/types';\nimport { ASTNode, BaseVariableField, VariableDeclaration } from '../../ast';\n\n/**\n * Manages the available variables within a scope.\n */\nexport class ScopeAvailableData {\n protected memo = createMemo();\n\n /**\n * The global variable table from the variable engine.\n */\n get globalVariableTable(): IVariableTable {\n return this.scope.variableEngine.globalVariableTable;\n }\n\n protected _version: number = 0;\n\n protected refresh$: Subject<void> = new Subject();\n\n protected _variables: VariableDeclaration[] = [];\n\n /**\n * The current version of the available data, which increments on each change.\n */\n get version() {\n return this._version;\n }\n\n protected bumpVersion() {\n this._version = this._version + 1;\n if (this._version === Number.MAX_SAFE_INTEGER) {\n this._version = 0;\n }\n }\n\n /**\n * Refreshes the list of available variables.\n * This should be called when the dependencies of the scope change.\n */\n refresh(): void {\n // Do not trigger refresh for a disposed scope.\n if (this.scope.disposed) {\n return;\n }\n this.refresh$.next();\n }\n\n /**\n * An observable that emits when the list of available variables changes.\n */\n protected variables$: Observable<VariableDeclaration[]> = this.refresh$.pipe(\n // Map to the flattened list of variables from all dependency scopes.\n map(() => flatten(this.depScopes.map((scope) => scope.output.variables || []))),\n // Use shallow equality to check if the variable list has changed.\n distinctUntilChanged<VariableDeclaration[]>(shallowEqual),\n share()\n );\n\n /**\n * An observable that emits when any variable in the available list changes its value.\n */\n protected anyVariableChange$: Observable<VariableDeclaration> = this.variables$.pipe(\n switchMap((_variables) =>\n merge(\n ..._variables.map((_v) =>\n _v.value$.pipe<any>(\n // Skip the initial value of the BehaviorSubject.\n skip(1)\n )\n )\n )\n ),\n share()\n );\n\n /**\n * Subscribes to changes in any variable's value in the available list.\n * @param observer A function to be called with the changed variable.\n * @returns A disposable to unsubscribe from the changes.\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * Subscribes to changes in the list of available variables.\n * @param observer A function to be called with the new list of variables.\n * @returns A disposable to unsubscribe from the changes.\n */\n onVariableListChange(observer: (variables: VariableDeclaration[]) => void) {\n return subsToDisposable(this.variables$.subscribe(observer));\n }\n\n /**\n * @deprecated\n */\n protected onDataChangeEmitter = new Emitter<VariableDeclaration[]>();\n\n protected onListOrAnyVarChangeEmitter = new Emitter<VariableDeclaration[]>();\n\n /**\n * @deprecated use available.onListOrAnyVarChange instead\n */\n public onDataChange = this.onDataChangeEmitter.event;\n\n /**\n * An event that fires when the variable list changes or any variable's value is updated.\n */\n public onListOrAnyVarChange = this.onListOrAnyVarChangeEmitter.event;\n\n constructor(public readonly scope: Scope) {\n this.scope.toDispose.pushAll([\n this.onVariableListChange((_variables) => {\n this._variables = _variables;\n this.memo.clear();\n this.onDataChangeEmitter.fire(this._variables);\n this.bumpVersion();\n this.onListOrAnyVarChangeEmitter.fire(this._variables);\n }),\n this.onAnyVariableChange(() => {\n this.onDataChangeEmitter.fire(this._variables);\n this.bumpVersion();\n this.onListOrAnyVarChangeEmitter.fire(this._variables);\n }),\n Disposable.create(() => {\n this.refresh$.complete();\n this.refresh$.unsubscribe();\n }),\n ]);\n }\n\n /**\n * Gets the list of available variables.\n */\n get variables(): VariableDeclaration[] {\n return this._variables;\n }\n\n /**\n * Gets the keys of the available variables.\n */\n get variableKeys(): string[] {\n return this.memo('availableKeys', () => this._variables.map((_v) => _v.key));\n }\n\n /**\n * Gets the dependency scopes.\n */\n get depScopes(): Scope[] {\n return this.scope.depScopes;\n }\n\n /**\n * Retrieves a variable field by its key path from the available variables.\n * @param keyPath The key path to the variable field.\n * @returns The found `BaseVariableField` or `undefined`.\n */\n getByKeyPath(keyPath: string[] = []): BaseVariableField | undefined {\n // Check if the variable is accessible in the current scope.\n if (!this.variableKeys.includes(keyPath[0])) {\n return;\n }\n return this.globalVariableTable.getByKeyPath(keyPath);\n }\n\n /**\n * Tracks changes to a variable field by its key path.\n * This includes changes to its type, value, or any nested properties.\n * @param keyPath The key path to the variable field to track.\n * @param cb The callback to execute when the variable changes.\n * @param opts Configuration options for the subscription.\n * @returns A disposable to unsubscribe from the tracking.\n */\n trackByKeyPath<Data = BaseVariableField | undefined>(\n keyPath: string[] = [],\n cb: (variable?: Data) => void,\n opts?: SubscribeConfig<BaseVariableField | undefined, Data>\n ): Disposable {\n const { triggerOnInit = true, debounceAnimation, selector } = opts || {};\n\n return subsToDisposable(\n merge(this.anyVariableChange$, this.variables$)\n .pipe(\n triggerOnInit ? startWith() : tap(() => null),\n map(() => {\n const v = this.getByKeyPath(keyPath);\n return selector ? selector(v) : (v as any);\n }),\n distinctUntilChanged(\n (a, b) => shallowEqual(a, b),\n (value) => {\n if (value instanceof ASTNode) {\n // If the value is an ASTNode, compare its hash for changes.\n return value.hash;\n }\n return value;\n }\n ),\n // Debounce updates to a single emission per animation frame.\n debounceAnimation ? debounceTime(0, animationFrameScheduler) : tap(() => null)\n )\n .subscribe(cb)\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Subject, filter } from 'rxjs';\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { type Scope } from '../scope';\nimport { subsToDisposable } from '../../utils/toDisposable';\nimport { type GlobalEventActionType } from '../../ast';\n\ntype Observer<ActionType extends GlobalEventActionType = GlobalEventActionType> = (\n action: ActionType\n) => void;\n\n/**\n * Manages global events within a scope.\n */\nexport class ScopeEventData {\n event$: Subject<GlobalEventActionType> = new Subject<GlobalEventActionType>();\n\n /**\n * Dispatches a global event.\n * @param action The event action to dispatch.\n */\n dispatch<ActionType extends GlobalEventActionType = GlobalEventActionType>(action: ActionType) {\n if (this.scope.disposed) {\n return;\n }\n this.event$.next(action);\n }\n\n /**\n * Subscribes to all global events.\n * @param observer The observer function to call with the event action.\n * @returns A disposable to unsubscribe from the events.\n */\n subscribe<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n observer: Observer<ActionType>\n ): Disposable {\n return subsToDisposable(this.event$.subscribe(observer as Observer));\n }\n\n /**\n * Subscribes to a specific type of global event.\n * @param type The type of the event to subscribe to.\n * @param observer The observer function to call with the event action.\n * @returns A disposable to unsubscribe from the event.\n */\n on<ActionType extends GlobalEventActionType = GlobalEventActionType>(\n type: ActionType['type'],\n observer: Observer<ActionType>\n ): Disposable {\n return subsToDisposable(\n this.event$.pipe(filter((_action) => _action.type === type)).subscribe(observer as Observer)\n );\n }\n\n constructor(public readonly scope: Scope) {\n scope.toDispose.pushAll([\n this.subscribe((_action) => {\n scope.variableEngine.fireGlobalEvent(_action);\n }),\n ]);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { difference } from 'lodash-es';\nimport { inject, injectable, postConstruct, preDestroy } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { VariableEngine } from '../variable-engine';\nimport {\n ASTNode,\n BaseVariableField,\n ObjectPropertiesChangeAction,\n VariableDeclarationListChangeAction,\n} from '../ast';\n\ninterface RenameInfo {\n before: BaseVariableField;\n after: BaseVariableField;\n}\n\n/**\n * This service is responsible for detecting when a variable field's key is renamed.\n * It listens for changes in variable declaration lists and object properties, and\n * determines if a change constitutes a rename operation.\n */\n@injectable()\nexport class VariableFieldKeyRenameService {\n @inject(VariableEngine) variableEngine: VariableEngine;\n\n toDispose = new DisposableCollection();\n\n renameEmitter = new Emitter<RenameInfo>();\n\n /**\n * Emits events for fields that are disposed of during a list change, but not renamed.\n * This helps distinguish between a field that was truly removed and one that was renamed.\n */\n disposeInListEmitter = new Emitter<BaseVariableField>();\n\n /**\n * An event that fires when a variable field key is successfully renamed.\n */\n onRename = this.renameEmitter.event;\n\n /**\n * An event that fires when a field is removed from a list (and not part of a rename).\n */\n onDisposeInList = this.disposeInListEmitter.event;\n\n /**\n * Handles changes in a list of fields to detect rename operations.\n * @param ast The AST node where the change occurred.\n * @param prev The list of fields before the change.\n * @param next The list of fields after the change.\n */\n handleFieldListChange(ast?: ASTNode, prev?: BaseVariableField[], next?: BaseVariableField[]) {\n // 1. Check if a rename is possible.\n if (!ast || !prev?.length || !next?.length) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n\n // 2. The lengths of the lists must be the same for a rename.\n if (prev.length !== next.length) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n\n let renameNodeInfo: RenameInfo | null = null;\n let existFieldChanged = false;\n\n for (const [index, prevField] of prev.entries()) {\n const nextField = next[index];\n\n if (prevField.key !== nextField.key) {\n // Only one rename is allowed at a time.\n if (existFieldChanged) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n existFieldChanged = true;\n\n if (prevField.type?.kind === nextField.type?.kind) {\n renameNodeInfo = { before: prevField, after: nextField };\n }\n }\n }\n\n if (!renameNodeInfo) {\n this.notifyFieldsDispose(prev, next);\n return;\n }\n\n this.renameEmitter.fire(renameNodeInfo);\n }\n\n /**\n * Notifies listeners about fields that were removed from a list.\n * @param prev The list of fields before the change.\n * @param next The list of fields after the change.\n */\n notifyFieldsDispose(prev?: BaseVariableField[], next?: BaseVariableField[]) {\n const removedFields = difference(prev || [], next || []);\n removedFields.forEach((_field) => this.disposeInListEmitter.fire(_field));\n }\n\n @postConstruct()\n init() {\n this.toDispose.pushAll([\n this.variableEngine.onGlobalEvent<VariableDeclarationListChangeAction>(\n 'VariableListChange',\n (_action) => {\n this.handleFieldListChange(_action.ast, _action.payload?.prev, _action.payload?.next);\n }\n ),\n this.variableEngine.onGlobalEvent<ObjectPropertiesChangeAction>(\n 'ObjectPropertiesChange',\n (_action) => {\n this.handleFieldListChange(_action.ast, _action.payload?.prev, _action.payload?.next);\n }\n ),\n ]);\n }\n\n @preDestroy()\n dispose() {\n this.toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable react/prop-types */\n\nimport React, { createContext, useContext } from 'react';\n\nimport { Scope } from '../scope';\n\ninterface ScopeContextProps {\n scope: Scope;\n}\n\nconst ScopeContext = createContext<ScopeContextProps>(null!);\n\n/**\n * ScopeProvider provides the scope to its children via context.\n */\nexport const ScopeProvider = (\n props: React.PropsWithChildren<{\n /**\n * scope used in the context\n */\n scope?: Scope;\n /**\n * @deprecated use scope prop instead, this is kept for backward compatibility\n */\n value?: ScopeContextProps;\n }>\n) => {\n const { scope, value, children } = props;\n\n const scopeToUse = scope || value?.scope;\n\n if (!scopeToUse) {\n throw new Error('[ScopeProvider] scope is required');\n }\n\n return <ScopeContext.Provider value={{ scope: scopeToUse }}>{children}</ScopeContext.Provider>;\n};\n\n/**\n * useCurrentScope returns the scope provided by ScopeProvider.\n * @returns\n */\nexport const useCurrentScope = (params?: {\n /**\n * whether to throw error when no scope in ScopeProvider is found\n */\n strict?: boolean;\n}): Scope => {\n const { strict = false } = params || {};\n\n const context = useContext(ScopeContext);\n\n if (!context) {\n if (strict) {\n throw new Error('useCurrentScope must be used within a <ScopeProvider scope={scope}>');\n }\n console.warn('useCurrentScope should be used within a <ScopeProvider scope={scope}>');\n }\n\n return context?.scope;\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/core';\n\nimport { useCurrentScope } from '../context';\nimport { ScopeAvailableData } from '../../scope/datas';\n\n/**\n * Get the available variables in the current scope.\n * 获取作用域的可访问变量\n *\n * @returns the available variables in the current scope\n */\nexport function useScopeAvailable(params?: { autoRefresh?: boolean }): ScopeAvailableData {\n const { autoRefresh = true } = params || {};\n\n const scope = useCurrentScope();\n const refresh = useRefresh();\n\n useEffect(() => {\n if (!autoRefresh) {\n return () => null;\n }\n\n const disposable = scope.available.onListOrAnyVarChange(() => {\n refresh();\n });\n\n return () => disposable.dispose();\n }, [autoRefresh]);\n\n return scope.available;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\nimport { useRefresh, useService } from '@flowgram.ai/core';\n\nimport { useCurrentScope } from '../context';\nimport { VariableEngine } from '../../variable-engine';\nimport { VariableDeclaration } from '../../ast';\n\n/**\n * Get available variable list in the current scope.\n *\n * - If no scope, return global variable list.\n * - The hook is reactive to variable list or any variables change.\n */\nexport function useAvailableVariables(): VariableDeclaration[] {\n const scope = useCurrentScope();\n const variableEngine: VariableEngine = useService(VariableEngine);\n\n const refresh = useRefresh();\n\n useEffect(() => {\n // 没有作用域时,监听全局变量表\n if (!scope) {\n const disposable = variableEngine.globalVariableTable.onListOrAnyVarChange(() => {\n refresh();\n });\n\n return () => disposable.dispose();\n }\n\n const disposable = scope.available.onDataChange(() => {\n refresh();\n });\n\n return () => disposable.dispose();\n }, []);\n\n // 没有作用域时,使用全局变量表\n return scope ? scope.available.variables : variableEngine.globalVariableTable.variables;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\nimport { useRefresh } from '@flowgram.ai/core';\n\nimport { useCurrentScope } from '../context';\nimport { VariableDeclaration } from '../../ast';\n\n/**\n * Get output variable list in the current scope.\n *\n * - The hook is reactive to variable list or any variables change.\n */\nexport function useOutputVariables(): VariableDeclaration[] {\n const scope = useCurrentScope();\n\n const refresh = useRefresh();\n\n useEffect(() => {\n if (!scope) {\n throw new Error(\n '[useOutputVariables]: No scope found, useOutputVariables must be used in <ScopeProvider>'\n );\n }\n\n const disposable = scope.output.onListOrAnyVarChange(() => {\n refresh();\n });\n\n return () => disposable.dispose();\n }, []);\n\n return scope.output.variables;\n}\n"],"mappings":"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","names":["import_inversify","import_rxjs","import_inversify","import_utils","import_utils","import_utils","import_utils","ASTKind","import_lodash_es","import_inversify","ASTNodeFlags","ASTMatch","import_rxjs","import_utils","import_rxjs","import_fast_equals","import_fast_equals","import_lodash_es","import_fast_equals","import_fast_equals","import_fast_equals","map","ASTNode","ASTFactory","import_rxjs","import_lodash_es","import_fast_equals","import_utils","import_rxjs","import_lodash_es","import_inversify","import_utils","React","import_react","import_react","import_core","disposable","import_react","import_core"]}