@flowgram.ai/variable-core 0.2.0 → 0.2.2

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/factory.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/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":["export { 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","import { 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","import { 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","import { Subscription } from 'rxjs';\nimport { Disposable } from '@flowgram.ai/utils';\n\nexport function subsToDisposable(subscription: Subscription): Disposable {\n return Disposable.create(() => subscription.unsubscribe());\n}\n","type 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","import { 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 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 * 监听任意变量变化\n * @param observer 监听器,变量变化时会吐出值\n * @returns\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * 列表或者任意变量变化\n * @param observer\n */\n onAnyChange(observer: () => void) {\n const disposables = new DisposableCollection();\n disposables.pushAll([this.onDataChange(observer), this.onAnyVariableChange(observer)]);\n return disposables;\n }\n\n public onDataChange = this.onDataChangeEmitter.event;\n\n protected _version: number = 0;\n\n fireChange() {\n this._version++;\n this.onDataChangeEmitter.fire();\n this.parentTable?.fireChange();\n }\n\n get version(): number {\n return this._version;\n }\n\n constructor(\n public parentTable?: IVariableTable // 父变量表,会包含所有子表的变量\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 this.variables$.next(this.variables);\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 this.variables$.next(this.variables);\n }\n\n dispose(): void {\n this.variableKeys.forEach((_key) =>\n (this.parentTable as VariableTable)?.removeVariableFromTable(_key)\n );\n this.onDataChangeEmitter.dispose();\n }\n}\n","import { 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","import { 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","import { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { type VariableEngine } from '../variable-engine';\nimport { createMemo } from '../utils/memo';\nimport { ASTKind, 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","import { 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","import { omit } from 'lodash';\nimport { injectable } from 'inversify';\n\nimport { POST_CONSTRUCT_AST_SYMBOL } from './utils/inversify';\nimport { ASTKindType, ASTNodeJSON, CreateASTParams } 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@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(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 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","import { 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","import { 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","import { 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","export 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","import {\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 { type Scope } from '../scope';\nimport { updateChildNodeHelper } from './utils/helpers';\nimport {\n type ASTNodeJSON,\n type ObserverOrNext,\n type ASTKindType,\n type CreateASTParams,\n type Identifier,\n SubscribeConfig,\n GlobalEventActionType,\n DisposeASTAction,\n NewASTAction,\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 private _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 this.dispatchGlobalEvent<NewASTAction>({ type: 'NewAST' });\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","import { get } from 'lodash';\n\nimport { ASTKind, ASTNodeJSON } from './types';\nimport { MapJSON } from './type/map';\nimport { VarJSONSchema } from './type/json-schema';\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 = () => ({ kind: ASTKind.String });\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 * Converts a JSON schema to an Abstract Syntax Tree (AST) representation.\n * This function recursively processes the JSON schema and creates corresponding AST nodes.\n *\n * For more information on JSON Schema, refer to the official documentation:\n * https://json-schema.org/\n *\n *\n * @param jsonSchema - The JSON schema to convert.\n * @returns An AST node representing the JSON schema, or undefined if the schema type is not recognized.\n */\n export function createTypeASTFromSchema(\n jsonSchema: VarJSONSchema.ISchema\n ): ASTNodeJSON | undefined {\n const { type, extra } = jsonSchema || {};\n const { weak = false } = extra || {};\n\n if (!type) {\n return undefined;\n }\n\n switch (type) {\n case 'object':\n if (weak) {\n return { kind: ASTKind.Object, weak: true };\n }\n return ASTFactory.createObject({\n properties: Object.entries(jsonSchema.properties || {})\n /**\n * Sorts the properties of a JSON schema based on the 'extra.index' field.\n * If the 'extra.index' field is not present, the property will be treated as having an index of 0.\n */\n .sort((a, b) => (get(a?.[1], 'extra.index') || 0) - (get(b?.[1], 'extra.index') || 0))\n .map(([key, _property]) => ({\n key,\n type: createTypeASTFromSchema(_property),\n meta: { description: _property.description },\n })),\n });\n case 'array':\n if (weak) {\n return { kind: ASTKind.Array, weak: true };\n }\n return ASTFactory.createArray({\n items: createTypeASTFromSchema(jsonSchema.items!),\n });\n case 'map':\n if (weak) {\n return { kind: ASTKind.Map, weak: true };\n }\n return ASTFactory.createMap({\n valueType: createTypeASTFromSchema(jsonSchema.additionalProperties!),\n });\n case 'string':\n return ASTFactory.createString();\n case 'number':\n return ASTFactory.createNumber();\n case 'boolean':\n return ASTFactory.createBoolean();\n case 'integer':\n return ASTFactory.createInteger();\n\n default:\n // If the type is not recognized, return CustomType\n return ASTFactory.createCustomType({ typeName: type });\n }\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","import { parseTypeJsonOrKind } from '../utils/helpers';\nimport { VarJSONSchema } from './json-schema';\nimport { ASTKind, ASTNodeJSON, ASTNodeJSONOrKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseVariableField } from '../declaration';\nimport { ASTNode } from '../ast-node';\nimport { UnionJSON } from './union';\nimport { ASTFactory } from '../factory';\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 * Get Standard JSON Schema for current base type\n * @returns\n */\n toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: this.kind.toLowerCase() as VarJSONSchema.BasicType,\n };\n }\n\n /**\n * Check if the type is equal with json schema\n */\n isEqualWithJSONSchema(schema: VarJSONSchema.ISchema | VarJSONSchema.ISchema[]): boolean {\n if (Array.isArray(schema)) {\n return this.isTypeEqual(\n ASTFactory.createUnion({\n types: schema\n .map((_schema) => ASTFactory.createTypeASTFromSchema(_schema)!)\n .filter(Boolean),\n })\n );\n }\n\n return this.isTypeEqual(ASTFactory.createTypeASTFromSchema(schema));\n }\n}\n","import { 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","import { VarJSONSchema } from './json-schema';\nimport { ASTKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseType } from './base-type';\n\nexport class StringType extends BaseType {\n public flags: ASTNodeFlags = ASTNodeFlags.BasicType;\n\n static kind: string = ASTKind.String;\n\n fromJSON(): void {\n // noop\n }\n\n toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: 'string',\n };\n }\n}\n","import { VarJSONSchema } from './json-schema';\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 toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: 'integer',\n };\n }\n}\n","import { VarJSONSchema } from './json-schema';\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 toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: 'boolean',\n };\n }\n}\n","import { VarJSONSchema } from './json-schema';\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 toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: 'number',\n };\n }\n}\n","import { parseTypeJsonOrKind } from '../utils/helpers';\nimport { VarJSONSchema } from './json-schema';\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 toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: 'map',\n additionalProperties: this.valueType?.toJSONSchema(),\n };\n }\n}\n","import { xor } from 'lodash';\n\nimport { parseTypeJsonOrKind } from '../utils/helpers';\nimport { VarJSONSchema } from './json-schema';\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 toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: 'object',\n properties: this.properties.reduce((acc, _property) => {\n acc[_property.key] = _property.type?.toJSONSchema();\n return acc;\n }, {} as Record<string, VarJSONSchema.ISchema>),\n };\n }\n}\n","import { parseTypeJsonOrKind } from '../utils/helpers';\nimport { VarJSONSchema } from './json-schema';\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 toJSONSchema(): VarJSONSchema.ISchema {\n return {\n type: this._typeName,\n };\n }\n}\n","import {\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","import { 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","import { 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","import { 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","import { 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","import { intersection } from 'lodash';\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","import { 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 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.toDispose.push(\n this.subscribe(this.refreshReturnType, {\n selector: (curr) => curr.wrapFor?.returnType,\n })\n );\n }\n}\n","import { 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 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 /**\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","import { 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","import { 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","import { 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","import { 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","import { 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","import { 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","import { 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 onDataChange() {\n return this.variableTable.onDataChange.bind(this.variableTable);\n }\n\n get onAnyVariableChange() {\n return this.variableTable.onAnyVariableChange.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","import {\n Observable,\n Subject,\n distinctUntilChanged,\n map,\n merge,\n share,\n skip,\n switchMap,\n} from 'rxjs';\nimport { flatten } from 'lodash';\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 { Property, 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 refresh$: Subject<void> = new Subject();\n\n protected _variables: VariableDeclaration[] = [];\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 * 监听任意变量变化\n * @param observer 监听器,变量变化时会吐出值\n * @returns\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * 监听变量列表变化\n * @param observer\n * @returns\n */\n onVariableListChange(observer: (variables: VariableDeclaration[]) => void) {\n return subsToDisposable(this.variables$.subscribe(observer));\n }\n\n protected onDataChangeEmitter = new Emitter<VariableDeclaration[]>();\n\n /**\n * 监听变量列表变化 + 任意子变量变化\n */\n public onDataChange = this.onDataChangeEmitter.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 }),\n this.onAnyVariableChange(() => {\n this.onDataChangeEmitter.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[] = []): VariableDeclaration | Property | undefined {\n // 检查变量是否在可访问范围内\n if (!this.variableKeys.includes(keyPath[0])) {\n return;\n }\n return this.globalVariableTable.getByKeyPath(keyPath);\n }\n}\n","import { 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","import { difference } from 'lodash';\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","import { 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","import { 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","import { 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.onAnyChange(() => {\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","import_inversify","ASTMatch","ASTNodeFlags","import_rxjs","import_utils","ASTFactory","import_lodash","import_rxjs","import_fast_equals","import_fast_equals","import_fast_equals","import_lodash","import_fast_equals","import_fast_equals","map","ASTNode","import_rxjs","import_lodash","import_fast_equals","import_utils","import_rxjs","import_lodash","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/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":["export { 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","import { 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","import { 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","import { Subscription } from 'rxjs';\nimport { Disposable } from '@flowgram.ai/utils';\n\nexport function subsToDisposable(subscription: Subscription): Disposable {\n return Disposable.create(() => subscription.unsubscribe());\n}\n","type 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","import { 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 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 * 监听任意变量变化\n * @param observer 监听器,变量变化时会吐出值\n * @returns\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * 列表或者任意变量变化\n * @param observer\n */\n onAnyChange(observer: () => void) {\n const disposables = new DisposableCollection();\n disposables.pushAll([this.onDataChange(observer), this.onAnyVariableChange(observer)]);\n return disposables;\n }\n\n public onDataChange = this.onDataChangeEmitter.event;\n\n protected _version: number = 0;\n\n fireChange() {\n this._version++;\n this.onDataChangeEmitter.fire();\n this.parentTable?.fireChange();\n }\n\n get version(): number {\n return this._version;\n }\n\n constructor(\n public parentTable?: IVariableTable // 父变量表,会包含所有子表的变量\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 this.variables$.next(this.variables);\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 this.variables$.next(this.variables);\n }\n\n dispose(): void {\n this.variableKeys.forEach((_key) =>\n (this.parentTable as VariableTable)?.removeVariableFromTable(_key)\n );\n this.onDataChangeEmitter.dispose();\n }\n}\n","import { 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","import { 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","import { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { type VariableEngine } from '../variable-engine';\nimport { createMemo } from '../utils/memo';\nimport { ASTKind, 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","import { 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","import { omit } from 'lodash';\nimport { injectable } from 'inversify';\n\nimport { POST_CONSTRUCT_AST_SYMBOL } from './utils/inversify';\nimport { ASTKindType, ASTNodeJSON, CreateASTParams } 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 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","import { 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","import { 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","import { 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","export 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","import {\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 { type Scope } from '../scope';\nimport { updateChildNodeHelper } from './utils/helpers';\nimport {\n type ASTNodeJSON,\n type ObserverOrNext,\n type ASTKindType,\n type CreateASTParams,\n type Identifier,\n SubscribeConfig,\n GlobalEventActionType,\n DisposeASTAction,\n NewASTAction,\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 private _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 this.dispatchGlobalEvent<NewASTAction>({ type: 'NewAST' });\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","import { 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","import { 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","import { ASTKind } from '../types';\nimport { ASTNodeFlags } from '../flags';\nimport { BaseType } from './base-type';\n\nexport class StringType extends BaseType {\n public flags: ASTNodeFlags = ASTNodeFlags.BasicType;\n\n static kind: string = ASTKind.String;\n\n fromJSON(): void {\n // noop\n }\n}\n","import { 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","import { 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","import { 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","import { 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","import { xor } from 'lodash';\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","import { 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","import {\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","import { 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","import { 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","import { 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","import { 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","import { intersection } from 'lodash';\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","import { 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 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.toDispose.push(\n this.subscribe(this.refreshReturnType, {\n selector: (curr) => curr.wrapFor?.returnType,\n })\n );\n }\n}\n","import { 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 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 /**\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","import { 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","import { 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","import { 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","import { 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","import { 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","import { 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","import { ASTKind, ASTNodeJSON } from './types';\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 = () => ({ kind: ASTKind.String });\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","import { 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 onDataChange() {\n return this.variableTable.onDataChange.bind(this.variableTable);\n }\n\n get onAnyVariableChange() {\n return this.variableTable.onAnyVariableChange.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","import {\n Observable,\n Subject,\n distinctUntilChanged,\n map,\n merge,\n share,\n skip,\n switchMap,\n} from 'rxjs';\nimport { flatten } from 'lodash';\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 { Property, 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 refresh$: Subject<void> = new Subject();\n\n protected _variables: VariableDeclaration[] = [];\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 * 监听任意变量变化\n * @param observer 监听器,变量变化时会吐出值\n * @returns\n */\n onAnyVariableChange(observer: (changedVariable: VariableDeclaration) => void) {\n return subsToDisposable(this.anyVariableChange$.subscribe(observer));\n }\n\n /**\n * 监听变量列表变化\n * @param observer\n * @returns\n */\n onVariableListChange(observer: (variables: VariableDeclaration[]) => void) {\n return subsToDisposable(this.variables$.subscribe(observer));\n }\n\n protected onDataChangeEmitter = new Emitter<VariableDeclaration[]>();\n\n /**\n * 监听变量列表变化 + 任意子变量变化\n */\n public onDataChange = this.onDataChangeEmitter.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 }),\n this.onAnyVariableChange(() => {\n this.onDataChangeEmitter.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[] = []): VariableDeclaration | Property | undefined {\n // 检查变量是否在可访问范围内\n if (!this.variableKeys.includes(keyPath[0])) {\n return;\n }\n return this.globalVariableTable.getByKeyPath(keyPath);\n }\n}\n","import { 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","import { difference } from 'lodash';\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","import { 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","import { 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","import { 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.onAnyChange(() => {\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","import_inversify","ASTMatch","ASTNodeFlags","import_rxjs","import_utils","import_rxjs","import_fast_equals","import_fast_equals","import_fast_equals","import_lodash","import_fast_equals","import_fast_equals","map","ASTNode","ASTFactory","import_rxjs","import_lodash","import_fast_equals","import_utils","import_rxjs","import_lodash","import_inversify","import_utils","import_react","import_react","import_core","disposable"]}