@flowgram.ai/variable-layout 0.1.0-alpha.2 → 0.1.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +387 -110
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +313 -37
- package/dist/index.d.ts +313 -37
- package/dist/index.js +395 -116
- package/dist/index.js.map +1 -1
- package/package.json +10 -12
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/flow-node-variable-data.ts","../../src/types.ts","../../src/free-layout-scope-chain.ts","../../src/variable-layout-config.ts","../../src/fixed-layout-scope-chain.ts"],"sourcesContent":["import { VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n get private() {\n return this._private;\n }\n\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n // 1. Notify the covering scopes of private to update dependencies\n this._private.coverScopes.forEach((_scope) => {\n _scope.refreshDeps();\n });\n // 2. Notify the dependent scopes of private to update their covers\n this._private.depScopes.forEach((_scope) => {\n _scope.refreshCovers();\n });\n // 3. The private scope itself needs to refresh its dependencies\n this._private.available.refresh();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport enum FlowNodeScopeTypeEnum {\n public = 'public',\n private = 'private',\n}\n\nexport interface FlowNodeScopeMeta {\n node?: FlowNodeEntity;\n type?: FlowNodeScopeTypeEnum;\n}\n\nexport interface ScopeVirtualNode {\n id: string;\n flowNodeType: 'virtualNode';\n}\n\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n// 节点内部的作用域\nexport type FlowNodeScope = Scope<FlowNodeScopeMeta>;\n","import { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity, FlowDocument, FlowVirtualTree } from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\n\nimport { VariableLayoutConfig } from './variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from './types';\nimport { FlowNodeVariableData } from './flow-node-variable-data';\n\n/**\n * 自由布局作用域链实现\n */\nexport class FreeLayoutScopeChain extends ScopeChain {\n @inject(EntityManager) entityManager: EntityManager;\n\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @optional()\n @inject(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig;\n\n get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // 线条发生变化时,会触发作用域链的更新\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // 树变化时候刷新作用域\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n // 获取同一层级所有输入节点\n protected getAllInputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n _node => _node.parent === curr.parent,\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n _node => _node.parent === curr.parent,\n );\n }\n\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const scopes: FlowNodeScope[] = [];\n\n // 1. 找到依赖的节点\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n\n // 2. 获取所有依赖节点的 public 作用域\n scopes.push(\n ...allInputNodes.map(_node => _node.getData(FlowNodeVariableData).public).filter(Boolean),\n );\n\n // 父节点的 private 也可以访问\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n scopes.push(currVarData.private);\n }\n\n curr = this.getParent(curr);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n return this.transformDeps(uniqScopes, { scope });\n }\n\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n }\n\n // 2. 获取所有覆盖节点的 public、private 作用域\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. 如果当前 scope 是 private,则当前节点的 public 也可覆盖\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformCovers(uniqScopes, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n getChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getFreeChildren) {\n return this.configs.getFreeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // 子画布本身不存在 children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n return this.tree.getChildren(node);\n }\n\n getParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n if (this.configs?.getFreeParent) {\n return this.configs.getFreeParent(node);\n }\n const initParent = node.document.originTree.getParent(node);\n\n if (!initParent) {\n return initParent;\n }\n\n const nodeMeta = initParent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(initParent);\n if (subCanvas?.isCanvas) {\n return subCanvas.parentNode;\n }\n\n return initParent;\n }\n\n sortAll(): Scope[] {\n // 暂未实现\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity, FlowDocument } from '@flowgram.ai/document';\n\nimport { type FlowNodeScope, type ScopeChainNode } from './types';\n\ninterface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport interface VariableLayoutConfig {\n /**\n * 开始节点的节点 Id\n */\n startNodeId?: string;\n /**\n * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * 用于自由画布场景,部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需要可配置化\n */\n getFreeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getFreeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * 对依赖作用域进行微调\n */\n transformDeps?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n}\n\nexport const VariableLayoutConfig = Symbol('VariableLayoutConfig');\n","import { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableLayoutConfig } from './variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from './types';\nimport { FlowNodeVariableData } from './flow-node-variable-data';\n\n/**\n * 基于 FlowVirtualTree 的 ScopeOrder 实现\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // 增加 { id: string } 使得可以灵活添加自定义虚拟节点\n tree: FlowVirtualTree<ScopeChainNode> | undefined;\n\n constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig,\n ) {\n super();\n\n // 绑定 flowDocument 里面的树\n this.bindTree(flowDocument.originTree);\n\n // originTree 发生变化时,触发依赖关系的变化\n this.toDispose.push(\n // REFRACTOR: onTreeChange 触发时机精细化\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n );\n }\n\n // 绑定树\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n // 获取依赖作用域\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 包含子节点,且不是私有作用域\n\n if (curr === node) {\n // public 可以依赖 private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // 有子元素的节点,则将子元素纳入依赖作用域\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n }),\n );\n }\n\n // 节点的 public 都可以被访问\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // 上个节点处理\n if (pre) {\n curr = pre;\n continue;\n }\n\n // 父节点处理\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // 父节点的 private 和 public 都能被子节点访问\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // 当前 parent 有 pre 节点,则停止向上查找\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformDeps(deps, { scope });\n }\n\n // 获取覆盖作用域\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformCovers([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n }),\n );\n return this.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 有子元素的节点,则将子元素纳入覆盖作用域\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n }),\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // 下个节点处理\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // 私有作用域不能被后续节点访问\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformCovers(covers, { scope });\n }\n\n // 当前 parent 有 next 节点,则停止向上查找\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformCovers(covers, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n // 排序所有作用域\n sortAll(): Scope[] {\n const { startNodeId } = this.configs || {};\n\n const startNode = startNodeId ? this.flowDocument?.getNode(startNodeId) : undefined;\n if (!startNode) {\n return [];\n }\n const startVariableData = startNode.getData(FlowNodeVariableData);\n\n return [startVariableData.public, ...this.getCovers(startVariableData.public)];\n }\n\n // 获取变量 Data 数据\n private getVariableData(node: ScopeChainNode): FlowNodeVariableData | undefined {\n if (node.flowNodeType === 'virtualNode') {\n return;\n }\n // TODO 包含 $ 的节点不注册 variableData\n if (node.id.startsWith('$')) {\n return;\n }\n\n return (node as FlowNodeEntity).getData(FlowNodeVariableData);\n }\n\n // privateScope:子节点不可以被后续节点访问\n private isNodeChildrenPrivate(node?: ScopeChainNode): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n // 兜底:有子节点(节点 id 没有 $ 开头)的全部为私有作用域\n return !isSystemNode && this.hasChildren(node);\n }\n\n private hasChildren(node?: ScopeChainNode): boolean {\n return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);\n }\n\n // 子节点按照顺序进行排序(含自身)\n private getAllSortedChildScope(\n node: ScopeChainNode,\n {\n ignoreNodeChildrenPrivate,\n addNodePrivateScope,\n }: { ignoreNodeChildrenPrivate?: boolean; addNodePrivateScope?: boolean } = {},\n ): FlowNodeScope[] {\n const scopes: FlowNodeScope[] = [];\n\n const variableData = this.getVariableData(node);\n\n if (variableData) {\n scopes.push(variableData.public);\n }\n\n // 私有作用域,子节点的变量不对外输出\n //(父节点如果存在 public 变量则对外输出)\n if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {\n return scopes;\n }\n\n if (addNodePrivateScope && variableData?.private) {\n scopes.push(variableData.private);\n }\n\n const children = this.tree?.getChildren(node) || [];\n scopes.push(\n ...children\n .map(child =>\n this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope }),\n )\n .flat(),\n );\n\n return scopes;\n }\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}
|
|
1
|
+
{"version":3,"sources":["../../src/flow-node-variable-data.ts","../../src/types.ts","../../src/chains/free-layout-scope-chain.ts","../../src/variable-chain-config.ts","../../src/services/scope-chain-transform-service.ts","../../src/scopes/global-scope.ts","../../src/chains/fixed-layout-scope-chain.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { BaseVariableField, VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\n/**\n * Manages variable data for a flow node, including public and private scopes.\n */\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n /**\n * The private scope of the node.\n */\n get private() {\n return this._private;\n }\n\n /**\n * The public scope of the node.\n */\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n /**\n * An array containing all scopes (public and private) of the node.\n */\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n /**\n * Initializes and returns the private scope for the node.\n * If the private scope already exists, it returns the existing one.\n * @returns The private scope of the node.\n */\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n\n this.variableEngine.chain.refreshAllChange();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n\n /**\n * Find a variable field by key path in the public scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n return this.public.available.getByKeyPath(keyPath);\n }\n\n /**\n * Find a variable field by key path in the private scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPathInPrivate(keyPath: string[]): BaseVariableField | undefined {\n return this.private?.available.getByKeyPath(keyPath);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\n/**\n * Enum for flow node scope types.\n */\nexport enum FlowNodeScopeTypeEnum {\n /**\n * Public scope.\n */\n public = 'public',\n /**\n * Private scope.\n */\n private = 'private',\n}\n\n/**\n * Metadata for a flow node scope.\n */\nexport interface FlowNodeScopeMeta {\n /**\n * The flow node entity associated with the scope.\n */\n node?: FlowNodeEntity;\n /**\n * The type of the scope.\n */\n type?: FlowNodeScopeTypeEnum;\n}\n\n/**\n * Represents a virtual node in the scope chain.\n */\nexport interface ScopeVirtualNode {\n /**\n * The ID of the virtual node.\n */\n id: string;\n /**\n * The type of the flow node.\n */\n flowNodeType: 'virtualNode';\n}\n\n/**\n * Represents a node in the scope chain, which can be either a flow node entity or a virtual node.\n */\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n/**\n * Represents a scope associated with a flow node.\n */\nexport interface FlowNodeScope extends Scope<FlowNodeScopeMeta> {}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport {\n FlowNodeEntity,\n FlowDocument,\n FlowVirtualTree,\n FlowNodeBaseType,\n} from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * Scope chain implementation for free layout.\n */\nexport class FreeLayoutScopeChain extends ScopeChain {\n @inject(EntityManager) entityManager: EntityManager;\n\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n /**\n * The virtual tree of the flow document.\n */\n get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // When the line changes, the scope chain will be updated\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // Refresh the scope when the tree changes\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n /**\n * Gets all input layer nodes for a given node in the same layer, sorted by distance.\n * @param node The node to get input layer nodes for.\n * @returns An array of input layer nodes.\n */\n protected getAllInputLayerNodes(node: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(node);\n\n const result = new Set<FlowNodeEntity>();\n\n // add by bfs\n const queue: FlowNodeEntity[] = [node];\n\n while (queue.length) {\n const curr = queue.shift()!;\n\n (curr.lines?.inputNodes || []).forEach((inputNode) => {\n if (this.getNodeParent(inputNode) === currParent) {\n if (result.has(inputNode)) {\n return;\n }\n queue.push(inputNode);\n result.add(inputNode);\n }\n });\n }\n\n return Array.from(result).reverse();\n }\n\n /**\n * Gets all output layer nodes for a given node in the same layer.\n * @param curr The node to get output layer nodes for.\n * @returns An array of output layer nodes.\n */\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.lines?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n /**\n * Gets the dependency scopes for a given scope.\n * @param scope The scope to get dependencies for.\n * @returns An array of dependency scopes.\n */\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n // 1. find dep nodes\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n // 2. private scope of parent node can be access\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n deps.unshift(currVarData.private);\n }\n\n // 3. all public scopes of inputNodes\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n deps.unshift(\n ...allInputNodes\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n // 4. all public children of inputNodes\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat()\n .filter(Boolean)\n );\n\n curr = this.getNodeParent(curr);\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n const uniqDeps = Array.from(new Set(deps));\n return this.transformService.transformDeps(uniqDeps, { scope });\n }\n\n /**\n * Gets the covering scopes for a given scope.\n * @param scope The scope to get covering scopes for.\n * @returns An array of covering scopes.\n */\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS to find all covered nodes\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private can only cover its child nodes\n queue.push(...this.getNodeChildren(node));\n } else {\n // Otherwise, cover all nodes of its output lines\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n\n // get all parents\n let parent = this.getNodeParent(node);\n\n while (parent) {\n // if childNodes of parent is private to next nodes, break\n if (this.isNodeChildrenPrivate(parent)) {\n break;\n }\n\n queue.push(...this.getAllOutputLayerNodes(parent));\n\n parent = this.getNodeParent(parent);\n }\n }\n\n // 2. Get the public and private scopes of all covered nodes\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getNodeChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. If the current scope is private, the public scope of the current node can also be covered\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformService.transformCovers(uniqScopes, { scope });\n }\n\n /**\n * Gets the children of a node.\n * @param node The node to get children for.\n * @returns An array of child nodes.\n */\n getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getNodeChildren) {\n return this.configs.getNodeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // The sub-canvas itself does not have children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // In some scenarios, the parent-child relationship is expressed through connections, so it needs to be configured at the upper level\n return this.tree.getChildren(node);\n }\n\n /**\n * Get All children of nodes\n * @param node\n * @returns\n */\n getAllPublicChildScopes(node: FlowNodeEntity): Scope[] {\n if (this.isNodeChildrenPrivate(node)) {\n return [];\n }\n\n return this.getNodeChildren(node)\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat();\n }\n\n /**\n * Gets the parent of a node.\n * @param node The node to get the parent for.\n * @returns The parent node or `undefined` if not found.\n */\n getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // In some scenarios, the parent-child relationship is expressed through connections, so it needs to be configured at the upper level\n if (this.configs?.getNodeParent) {\n return this.configs.getNodeParent(node);\n }\n let parent = node.document.originTree.getParent(node);\n\n // If currentParent is Group, get the parent of parent\n while (parent?.flowNodeType === FlowNodeBaseType.GROUP) {\n parent = parent.parent;\n }\n\n if (!parent) {\n return parent;\n }\n\n const nodeMeta = parent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(parent);\n if (subCanvas?.isCanvas) {\n // Get real parent node by subCanvas Configuration\n return subCanvas.parentNode;\n }\n\n return parent;\n }\n\n /**\n * Checks if the children of a node are private and cannot be accessed by subsequent nodes.\n * @param node The node to check.\n * @returns `true` if the children are private, `false` otherwise.\n */\n protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n\n // Except system node and group node, everything else is private\n return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;\n }\n\n /**\n * Sorts all scopes in the scope chain.\n * @returns An empty array, as this method is not implemented.\n */\n sortAll(): Scope[] {\n // Not implemented yet\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { type ScopeChainNode } from './types';\nimport { IScopeTransformer } from './services/scope-chain-transform-service';\n\n/**\n * Configuration for the variable chain.\n */\nexport interface VariableChainConfig {\n /**\n * The output variables of a node's children cannot be accessed by subsequent nodes.\n *\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * For fixed layout scenarios: there are a large number of useless nodes between parent and child (such as inlineBlocks, etc., which need to be configured to be skipped)\n * For free canvas scenarios: in some scenarios, the parent-child relationship between nodes is expressed through connections or other interactive forms, which needs to be configurable\n */\n getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * Fine-tune the dependency scope.\n */\n transformDeps?: IScopeTransformer;\n\n /**\n * Fine-tune the cover scope.\n */\n transformCovers?: IScopeTransformer;\n}\n\nexport const VariableChainConfig = Symbol('VariableChainConfig');\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, optional } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { lazyInject } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope } from '../types';\n\n/**\n * Context for scope transformers.\n */\nexport interface TransformerContext {\n /**\n * The current scope\n */\n scope: FlowNodeScope;\n /**\n * The flow document.\n */\n document: FlowDocument;\n /**\n * The variable engine.\n */\n variableEngine: VariableEngine;\n}\n\n/**\n * A function that transforms an array of scopes.\n * @param scopes The array of scopes to transform.\n * @param ctx The transformer context.\n * @returns The transformed array of scopes.\n */\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\n\n/**\n * A service for transforming scope chains.\n */\n@injectable()\nexport class ScopeChainTransformService {\n protected transformerMap: Map<\n string,\n { transformDeps: IScopeTransformer; transformCovers: IScopeTransformer }\n > = new Map();\n\n @lazyInject(FlowDocument) document: FlowDocument;\n\n @lazyInject(VariableEngine) variableEngine: VariableEngine;\n\n constructor(\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n if (this.configs?.transformDeps || this.configs?.transformCovers) {\n this.transformerMap.set('VARIABLE_LAYOUT_CONFIG', {\n transformDeps: this.configs.transformDeps || passthrough,\n transformCovers: this.configs.transformCovers || passthrough,\n });\n }\n }\n\n /**\n * check if transformer registered\n * @param transformerId used to identify transformer, prevent duplicated\n * @returns\n */\n hasTransformer(transformerId: string) {\n return this.transformerMap.has(transformerId);\n }\n\n /**\n * register new transform function\n * @param transformerId used to identify transformer, prevent duplicated transformer\n * @param transformer The transformer to register.\n */\n registerTransformer(\n transformerId: string,\n transformer: {\n transformDeps: IScopeTransformer;\n transformCovers: IScopeTransformer;\n }\n ) {\n this.transformerMap.set(transformerId, transformer);\n }\n\n /**\n * Transforms the dependency scopes.\n * @param scopes The array of scopes to transform.\n * @param param1 The context for the transformation.\n * @returns The transformed array of scopes.\n */\n transformDeps(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformDeps) {\n return scopes;\n }\n\n scopes = transformer.transformDeps(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n\n /**\n * Transforms the cover scopes.\n * @param scopes The array of scopes to transform.\n * @param param1 The context for the transformation.\n * @returns The transformed array of scopes.\n */\n transformCovers(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformCovers) {\n return scopes;\n }\n\n scopes = transformer.transformCovers(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, interfaces } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\n\n/**\n * Global Scope stores all variables that are not scoped to any node.\n *\n * - Variables in Global Scope can be accessed by any node.\n * - Any other scope's variables can not be accessed by Global Scope.\n */\n@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\n\n /**\n * Check if the scope is Global Scope.\n * @param scope\n * @returns\n */\n static is(scope: Scope) {\n return scope.id === GlobalScope.ID;\n }\n}\n\nexport const bindGlobalScope = (bind: interfaces.Bind) => {\n bind(GlobalScope).toDynamicValue((ctx) => {\n const variableEngine = ctx.container.get(VariableEngine);\n let scope = variableEngine.getScopeById(GlobalScope.ID) as GlobalScope;\n\n if (!scope) {\n scope = variableEngine.createScope(\n GlobalScope.ID,\n {},\n { ScopeConstructor: GlobalScope }\n ) as GlobalScope;\n variableEngine.chain.refreshAllChange();\n }\n\n return scope;\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * Scope chain implementation based on `FlowVirtualTree`.\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // By adding { id: string }, custom virtual nodes can be flexibly added\n tree: FlowVirtualTree<ScopeChainNode> | undefined;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n super();\n\n // Bind the tree in flowDocument\n this.bindTree(flowDocument.originTree);\n\n // When originTree changes, trigger changes in dependencies\n this.toDispose.push(\n // REFRACTOR: onTreeChange trigger timing needs to be refined\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n /**\n * Binds the scope chain to a `FlowVirtualTree`.\n * @param tree The `FlowVirtualTree` to bind to.\n */\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n /**\n * Gets the dependency scopes for a given scope.\n * @param scope The scope to get dependencies for.\n * @returns An array of dependency scopes.\n */\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // Contains child nodes and is not a private scope\n\n if (curr === node) {\n // public can depend on private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // For nodes with child elements, include the child elements in the dependency scope\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // The public of the node can be accessed\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // Process the previous node\n if (pre) {\n curr = pre;\n continue;\n }\n\n // Process the parent node\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // Both private and public of the parent node can be accessed by child nodes\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // If the current parent has a pre node, stop searching upwards\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // If there is no next and no parent, end the loop directly\n curr = undefined;\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n return this.transformService.transformDeps(deps, { scope });\n }\n\n /**\n * Gets the covering scopes for a given scope.\n * @param scope The scope to get covering scopes for.\n * @returns An array of covering scopes.\n */\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // If it is a private scope, only child nodes can access it\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n }).filter((_scope) => _scope !== scope)\n );\n return this.transformService.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // For nodes with child elements, include the child elements in the covering scope\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // Process the next node\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // Private scopes cannot be accessed by subsequent nodes\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformService.transformCovers(covers, { scope });\n }\n\n // If the current parent has a next node, stop searching upwards\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformService.transformCovers(covers, { scope });\n }\n\n /**\n * Sorts all scopes in the scope chain.\n * @returns A sorted array of all scopes.\n */\n sortAll(): Scope[] {\n const startNode = this.flowDocument.getAllNodes().find((_node) => _node.isStart);\n if (!startNode) {\n return [];\n }\n\n const startVariableData = startNode.getData(FlowNodeVariableData);\n const startPublicScope = startVariableData.public;\n const deps = this.getDeps(startPublicScope);\n\n const covers = this.getCovers(startPublicScope).filter(\n (_scope) => !deps.includes(_scope) && _scope !== startPublicScope\n );\n\n return [...deps, startPublicScope, ...covers];\n }\n\n /**\n * Gets the `FlowNodeVariableData` for a given `ScopeChainNode`.\n * @param node The `ScopeChainNode` to get data for.\n * @returns The `FlowNodeVariableData` or `undefined` if not found.\n */\n private getVariableData(node: ScopeChainNode): FlowNodeVariableData | undefined {\n if (node.flowNodeType === 'virtualNode') {\n return;\n }\n // TODO Nodes containing $ do not register variableData\n if (node.id.startsWith('$')) {\n return;\n }\n\n return (node as FlowNodeEntity).getData(FlowNodeVariableData);\n }\n\n /**\n * Checks if the children of a node are private.\n * @param node The node to check.\n * @returns `true` if the children are private, `false` otherwise.\n */\n private isNodeChildrenPrivate(node?: ScopeChainNode): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n // Fallback: all nodes with children (node id does not start with $) are private scopes\n return !isSystemNode && this.hasChildren(node);\n }\n\n /**\n * Checks if a node has children.\n * @param node The node to check.\n * @returns `true` if the node has children, `false` otherwise.\n */\n private hasChildren(node?: ScopeChainNode): boolean {\n return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);\n }\n\n /**\n * Gets all sorted child scopes of a node.\n * @param node The node to get child scopes for.\n * @param options Options for getting child scopes.\n * @returns An array of sorted child scopes.\n */\n private getAllSortedChildScope(\n node: ScopeChainNode,\n {\n ignoreNodeChildrenPrivate,\n addNodePrivateScope,\n }: { ignoreNodeChildrenPrivate?: boolean; addNodePrivateScope?: boolean } = {}\n ): FlowNodeScope[] {\n const scopes: FlowNodeScope[] = [];\n\n const variableData = this.getVariableData(node);\n\n if (variableData) {\n scopes.push(variableData.public);\n }\n\n // For private scopes, the variables of child nodes are not exposed externally\n // (If the parent node has public variables, they are exposed externally)\n if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {\n return scopes;\n }\n\n if (addNodePrivateScope && variableData?.private) {\n scopes.push(variableData.private);\n }\n\n const children = this.tree?.getChildren(node) || [];\n scopes.push(\n ...children\n .map((child) =>\n this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope })\n )\n .flat()\n );\n\n return scopes;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FlowNodeVariableData } from './flow-node-variable-data';\n\n/**\n * Use `node.scope` instead.\n * @deprecated\n * @param node The flow node entity.\n * @returns The public scope of the node.\n */\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\n\n/**\n * Use `node.privateScope` instead.\n * @deprecated\n * @param node The flow node entity.\n * @returns The private scope of the node.\n */\nexport function getNodePrivateScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).initPrivate();\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","FlowDocument","scopes","injectable","Scope","VariableEngine","Scope","injectable","VariableEngine","scopes","inject","FlowDocument","optional","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,25 +1,73 @@
|
|
|
1
|
-
import { Scope, VariableEngine, ASTNodeJSON, ASTNode, ScopeChain } from '@flowgram.ai/variable-core';
|
|
1
|
+
import { Scope, VariableEngine, ASTNodeJSON, ASTNode, BaseVariableField, ScopeChain } from '@flowgram.ai/variable-core';
|
|
2
2
|
import { FlowNodeEntity, FlowDocument, FlowVirtualTree } from '@flowgram.ai/document';
|
|
3
3
|
import { EntityData, EntityManager } from '@flowgram.ai/core';
|
|
4
|
+
import { interfaces } from 'inversify';
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
8
|
+
* SPDX-License-Identifier: MIT
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Enum for flow node scope types.
|
|
13
|
+
*/
|
|
5
14
|
declare enum FlowNodeScopeTypeEnum {
|
|
15
|
+
/**
|
|
16
|
+
* Public scope.
|
|
17
|
+
*/
|
|
6
18
|
public = "public",
|
|
19
|
+
/**
|
|
20
|
+
* Private scope.
|
|
21
|
+
*/
|
|
7
22
|
private = "private"
|
|
8
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Metadata for a flow node scope.
|
|
26
|
+
*/
|
|
9
27
|
interface FlowNodeScopeMeta {
|
|
28
|
+
/**
|
|
29
|
+
* The flow node entity associated with the scope.
|
|
30
|
+
*/
|
|
10
31
|
node?: FlowNodeEntity;
|
|
32
|
+
/**
|
|
33
|
+
* The type of the scope.
|
|
34
|
+
*/
|
|
11
35
|
type?: FlowNodeScopeTypeEnum;
|
|
12
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Represents a virtual node in the scope chain.
|
|
39
|
+
*/
|
|
13
40
|
interface ScopeVirtualNode {
|
|
41
|
+
/**
|
|
42
|
+
* The ID of the virtual node.
|
|
43
|
+
*/
|
|
14
44
|
id: string;
|
|
45
|
+
/**
|
|
46
|
+
* The type of the flow node.
|
|
47
|
+
*/
|
|
15
48
|
flowNodeType: 'virtualNode';
|
|
16
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Represents a node in the scope chain, which can be either a flow node entity or a virtual node.
|
|
52
|
+
*/
|
|
17
53
|
type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;
|
|
18
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Represents a scope associated with a flow node.
|
|
56
|
+
*/
|
|
57
|
+
interface FlowNodeScope extends Scope<FlowNodeScopeMeta> {
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
62
|
+
* SPDX-License-Identifier: MIT
|
|
63
|
+
*/
|
|
19
64
|
|
|
20
65
|
interface Options {
|
|
21
66
|
variableEngine: VariableEngine;
|
|
22
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Manages variable data for a flow node, including public and private scopes.
|
|
70
|
+
*/
|
|
23
71
|
declare class FlowNodeVariableData extends EntityData {
|
|
24
72
|
readonly opts: Options;
|
|
25
73
|
static type: string;
|
|
@@ -30,7 +78,13 @@ declare class FlowNodeVariableData extends EntityData {
|
|
|
30
78
|
*/
|
|
31
79
|
protected _private?: FlowNodeScope;
|
|
32
80
|
protected _public: FlowNodeScope;
|
|
81
|
+
/**
|
|
82
|
+
* The private scope of the node.
|
|
83
|
+
*/
|
|
33
84
|
get private(): FlowNodeScope | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* The public scope of the node.
|
|
87
|
+
*/
|
|
34
88
|
get public(): FlowNodeScope;
|
|
35
89
|
/**
|
|
36
90
|
* Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.
|
|
@@ -53,7 +107,7 @@ declare class FlowNodeVariableData extends EntityData {
|
|
|
53
107
|
* @param key - The key of the variable to retrieve. Defaults to 'outputs'.
|
|
54
108
|
* @returns The value of the variable, or undefined if not found.
|
|
55
109
|
*/
|
|
56
|
-
getVar(key?: string): ASTNode<any
|
|
110
|
+
getVar(key?: string): ASTNode<any> | undefined;
|
|
57
111
|
/**
|
|
58
112
|
* Clears a variable from the public AST (Abstract Syntax Tree) by key.
|
|
59
113
|
*
|
|
@@ -82,7 +136,7 @@ declare class FlowNodeVariableData extends EntityData {
|
|
|
82
136
|
* @param key - The key of the variable to retrieve. Defaults to 'outputs'.
|
|
83
137
|
* @returns The value of the variable, or undefined if not found.
|
|
84
138
|
*/
|
|
85
|
-
getPrivateVar(key?: string): ASTNode<any
|
|
139
|
+
getPrivateVar(key?: string): ASTNode<any> | undefined;
|
|
86
140
|
/**
|
|
87
141
|
* Clears a variable from the private AST (Abstract Syntax Tree) by key.
|
|
88
142
|
*
|
|
@@ -90,90 +144,312 @@ declare class FlowNodeVariableData extends EntityData {
|
|
|
90
144
|
* @returns The updated AST node.
|
|
91
145
|
*/
|
|
92
146
|
clearPrivateVar(key?: string): void | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* An array containing all scopes (public and private) of the node.
|
|
149
|
+
*/
|
|
93
150
|
get allScopes(): FlowNodeScope[];
|
|
94
151
|
getDefaultData(): {};
|
|
95
152
|
constructor(entity: FlowNodeEntity, opts: Options);
|
|
153
|
+
/**
|
|
154
|
+
* Initializes and returns the private scope for the node.
|
|
155
|
+
* If the private scope already exists, it returns the existing one.
|
|
156
|
+
* @returns The private scope of the node.
|
|
157
|
+
*/
|
|
96
158
|
initPrivate(): FlowNodeScope;
|
|
159
|
+
/**
|
|
160
|
+
* Find a variable field by key path in the public scope by scope chain.
|
|
161
|
+
* @param keyPath - The key path of the variable field.
|
|
162
|
+
* @returns The variable field, or undefined if not found.
|
|
163
|
+
*/
|
|
164
|
+
getByKeyPath(keyPath: string[]): BaseVariableField | undefined;
|
|
165
|
+
/**
|
|
166
|
+
* Find a variable field by key path in the private scope by scope chain.
|
|
167
|
+
* @param keyPath - The key path of the variable field.
|
|
168
|
+
* @returns The variable field, or undefined if not found.
|
|
169
|
+
*/
|
|
170
|
+
getByKeyPathInPrivate(keyPath: string[]): BaseVariableField | undefined;
|
|
97
171
|
}
|
|
98
172
|
|
|
173
|
+
/**
|
|
174
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
175
|
+
* SPDX-License-Identifier: MIT
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Context for scope transformers.
|
|
180
|
+
*/
|
|
99
181
|
interface TransformerContext {
|
|
182
|
+
/**
|
|
183
|
+
* The current scope
|
|
184
|
+
*/
|
|
100
185
|
scope: FlowNodeScope;
|
|
186
|
+
/**
|
|
187
|
+
* The flow document.
|
|
188
|
+
*/
|
|
101
189
|
document: FlowDocument;
|
|
190
|
+
/**
|
|
191
|
+
* The variable engine.
|
|
192
|
+
*/
|
|
102
193
|
variableEngine: VariableEngine;
|
|
103
194
|
}
|
|
104
|
-
|
|
195
|
+
/**
|
|
196
|
+
* A function that transforms an array of scopes.
|
|
197
|
+
* @param scopes The array of scopes to transform.
|
|
198
|
+
* @param ctx The transformer context.
|
|
199
|
+
* @returns The transformed array of scopes.
|
|
200
|
+
*/
|
|
201
|
+
type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];
|
|
202
|
+
/**
|
|
203
|
+
* A service for transforming scope chains.
|
|
204
|
+
*/
|
|
205
|
+
declare class ScopeChainTransformService {
|
|
206
|
+
protected configs?: VariableChainConfig | undefined;
|
|
207
|
+
protected transformerMap: Map<string, {
|
|
208
|
+
transformDeps: IScopeTransformer;
|
|
209
|
+
transformCovers: IScopeTransformer;
|
|
210
|
+
}>;
|
|
211
|
+
document: FlowDocument;
|
|
212
|
+
variableEngine: VariableEngine;
|
|
213
|
+
constructor(configs?: VariableChainConfig | undefined);
|
|
214
|
+
/**
|
|
215
|
+
* check if transformer registered
|
|
216
|
+
* @param transformerId used to identify transformer, prevent duplicated
|
|
217
|
+
* @returns
|
|
218
|
+
*/
|
|
219
|
+
hasTransformer(transformerId: string): boolean;
|
|
220
|
+
/**
|
|
221
|
+
* register new transform function
|
|
222
|
+
* @param transformerId used to identify transformer, prevent duplicated transformer
|
|
223
|
+
* @param transformer The transformer to register.
|
|
224
|
+
*/
|
|
225
|
+
registerTransformer(transformerId: string, transformer: {
|
|
226
|
+
transformDeps: IScopeTransformer;
|
|
227
|
+
transformCovers: IScopeTransformer;
|
|
228
|
+
}): void;
|
|
229
|
+
/**
|
|
230
|
+
* Transforms the dependency scopes.
|
|
231
|
+
* @param scopes The array of scopes to transform.
|
|
232
|
+
* @param param1 The context for the transformation.
|
|
233
|
+
* @returns The transformed array of scopes.
|
|
234
|
+
*/
|
|
235
|
+
transformDeps(scopes: Scope[], { scope }: {
|
|
236
|
+
scope: Scope;
|
|
237
|
+
}): Scope[];
|
|
105
238
|
/**
|
|
106
|
-
*
|
|
239
|
+
* Transforms the cover scopes.
|
|
240
|
+
* @param scopes The array of scopes to transform.
|
|
241
|
+
* @param param1 The context for the transformation.
|
|
242
|
+
* @returns The transformed array of scopes.
|
|
107
243
|
*/
|
|
108
|
-
|
|
244
|
+
transformCovers(scopes: Scope[], { scope }: {
|
|
245
|
+
scope: Scope;
|
|
246
|
+
}): Scope[];
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
251
|
+
* SPDX-License-Identifier: MIT
|
|
252
|
+
*/
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Configuration for the variable chain.
|
|
256
|
+
*/
|
|
257
|
+
interface VariableChainConfig {
|
|
109
258
|
/**
|
|
110
|
-
*
|
|
259
|
+
* The output variables of a node's children cannot be accessed by subsequent nodes.
|
|
260
|
+
*
|
|
111
261
|
* @param node
|
|
112
262
|
* @returns
|
|
113
263
|
*/
|
|
114
264
|
isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;
|
|
115
265
|
/**
|
|
116
|
-
*
|
|
266
|
+
* For fixed layout scenarios: there are a large number of useless nodes between parent and child (such as inlineBlocks, etc., which need to be configured to be skipped)
|
|
267
|
+
* For free canvas scenarios: in some scenarios, the parent-child relationship between nodes is expressed through connections or other interactive forms, which needs to be configurable
|
|
117
268
|
*/
|
|
118
|
-
|
|
119
|
-
|
|
269
|
+
getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];
|
|
270
|
+
getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;
|
|
120
271
|
/**
|
|
121
|
-
*
|
|
272
|
+
* Fine-tune the dependency scope.
|
|
122
273
|
*/
|
|
123
|
-
transformDeps?:
|
|
274
|
+
transformDeps?: IScopeTransformer;
|
|
124
275
|
/**
|
|
125
|
-
*
|
|
276
|
+
* Fine-tune the cover scope.
|
|
126
277
|
*/
|
|
127
|
-
transformCovers?:
|
|
278
|
+
transformCovers?: IScopeTransformer;
|
|
128
279
|
}
|
|
129
|
-
declare const
|
|
280
|
+
declare const VariableChainConfig: unique symbol;
|
|
130
281
|
|
|
131
282
|
/**
|
|
132
|
-
*
|
|
283
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
284
|
+
* SPDX-License-Identifier: MIT
|
|
285
|
+
*/
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Scope chain implementation for free layout.
|
|
133
289
|
*/
|
|
134
290
|
declare class FreeLayoutScopeChain extends ScopeChain {
|
|
135
291
|
entityManager: EntityManager;
|
|
136
292
|
protected flowDocument: FlowDocument;
|
|
137
|
-
protected configs?:
|
|
293
|
+
protected configs?: VariableChainConfig;
|
|
294
|
+
protected transformService: ScopeChainTransformService;
|
|
295
|
+
/**
|
|
296
|
+
* The virtual tree of the flow document.
|
|
297
|
+
*/
|
|
138
298
|
get tree(): FlowVirtualTree<FlowNodeEntity>;
|
|
139
299
|
onInit(): void;
|
|
140
|
-
|
|
300
|
+
/**
|
|
301
|
+
* Gets all input layer nodes for a given node in the same layer, sorted by distance.
|
|
302
|
+
* @param node The node to get input layer nodes for.
|
|
303
|
+
* @returns An array of input layer nodes.
|
|
304
|
+
*/
|
|
305
|
+
protected getAllInputLayerNodes(node: FlowNodeEntity): FlowNodeEntity[];
|
|
306
|
+
/**
|
|
307
|
+
* Gets all output layer nodes for a given node in the same layer.
|
|
308
|
+
* @param curr The node to get output layer nodes for.
|
|
309
|
+
* @returns An array of output layer nodes.
|
|
310
|
+
*/
|
|
141
311
|
protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[];
|
|
312
|
+
/**
|
|
313
|
+
* Gets the dependency scopes for a given scope.
|
|
314
|
+
* @param scope The scope to get dependencies for.
|
|
315
|
+
* @returns An array of dependency scopes.
|
|
316
|
+
*/
|
|
142
317
|
getDeps(scope: FlowNodeScope): FlowNodeScope[];
|
|
318
|
+
/**
|
|
319
|
+
* Gets the covering scopes for a given scope.
|
|
320
|
+
* @param scope The scope to get covering scopes for.
|
|
321
|
+
* @returns An array of covering scopes.
|
|
322
|
+
*/
|
|
143
323
|
getCovers(scope: FlowNodeScope): FlowNodeScope[];
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
324
|
+
/**
|
|
325
|
+
* Gets the children of a node.
|
|
326
|
+
* @param node The node to get children for.
|
|
327
|
+
* @returns An array of child nodes.
|
|
328
|
+
*/
|
|
329
|
+
getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[];
|
|
330
|
+
/**
|
|
331
|
+
* Get All children of nodes
|
|
332
|
+
* @param node
|
|
333
|
+
* @returns
|
|
334
|
+
*/
|
|
335
|
+
getAllPublicChildScopes(node: FlowNodeEntity): Scope[];
|
|
336
|
+
/**
|
|
337
|
+
* Gets the parent of a node.
|
|
338
|
+
* @param node The node to get the parent for.
|
|
339
|
+
* @returns The parent node or `undefined` if not found.
|
|
340
|
+
*/
|
|
341
|
+
getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined;
|
|
342
|
+
/**
|
|
343
|
+
* Checks if the children of a node are private and cannot be accessed by subsequent nodes.
|
|
344
|
+
* @param node The node to check.
|
|
345
|
+
* @returns `true` if the children are private, `false` otherwise.
|
|
346
|
+
*/
|
|
347
|
+
protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean;
|
|
348
|
+
/**
|
|
349
|
+
* Sorts all scopes in the scope chain.
|
|
350
|
+
* @returns An empty array, as this method is not implemented.
|
|
351
|
+
*/
|
|
152
352
|
sortAll(): Scope[];
|
|
153
353
|
}
|
|
154
354
|
|
|
155
355
|
/**
|
|
156
|
-
*
|
|
356
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
357
|
+
* SPDX-License-Identifier: MIT
|
|
358
|
+
*/
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Scope chain implementation based on `FlowVirtualTree`.
|
|
157
362
|
*/
|
|
158
363
|
declare class FixedLayoutScopeChain extends ScopeChain {
|
|
159
364
|
protected flowDocument: FlowDocument;
|
|
160
|
-
protected configs?:
|
|
365
|
+
protected configs?: VariableChainConfig | undefined;
|
|
161
366
|
tree: FlowVirtualTree<ScopeChainNode> | undefined;
|
|
162
|
-
|
|
367
|
+
protected transformService: ScopeChainTransformService;
|
|
368
|
+
constructor(flowDocument: FlowDocument, configs?: VariableChainConfig | undefined);
|
|
369
|
+
/**
|
|
370
|
+
* Binds the scope chain to a `FlowVirtualTree`.
|
|
371
|
+
* @param tree The `FlowVirtualTree` to bind to.
|
|
372
|
+
*/
|
|
163
373
|
bindTree(tree: FlowVirtualTree<ScopeChainNode>): void;
|
|
374
|
+
/**
|
|
375
|
+
* Gets the dependency scopes for a given scope.
|
|
376
|
+
* @param scope The scope to get dependencies for.
|
|
377
|
+
* @returns An array of dependency scopes.
|
|
378
|
+
*/
|
|
164
379
|
getDeps(scope: FlowNodeScope): FlowNodeScope[];
|
|
380
|
+
/**
|
|
381
|
+
* Gets the covering scopes for a given scope.
|
|
382
|
+
* @param scope The scope to get covering scopes for.
|
|
383
|
+
* @returns An array of covering scopes.
|
|
384
|
+
*/
|
|
165
385
|
getCovers(scope: FlowNodeScope): FlowNodeScope[];
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
scope: Scope;
|
|
171
|
-
}): Scope[];
|
|
386
|
+
/**
|
|
387
|
+
* Sorts all scopes in the scope chain.
|
|
388
|
+
* @returns A sorted array of all scopes.
|
|
389
|
+
*/
|
|
172
390
|
sortAll(): Scope[];
|
|
391
|
+
/**
|
|
392
|
+
* Gets the `FlowNodeVariableData` for a given `ScopeChainNode`.
|
|
393
|
+
* @param node The `ScopeChainNode` to get data for.
|
|
394
|
+
* @returns The `FlowNodeVariableData` or `undefined` if not found.
|
|
395
|
+
*/
|
|
173
396
|
private getVariableData;
|
|
397
|
+
/**
|
|
398
|
+
* Checks if the children of a node are private.
|
|
399
|
+
* @param node The node to check.
|
|
400
|
+
* @returns `true` if the children are private, `false` otherwise.
|
|
401
|
+
*/
|
|
174
402
|
private isNodeChildrenPrivate;
|
|
403
|
+
/**
|
|
404
|
+
* Checks if a node has children.
|
|
405
|
+
* @param node The node to check.
|
|
406
|
+
* @returns `true` if the node has children, `false` otherwise.
|
|
407
|
+
*/
|
|
175
408
|
private hasChildren;
|
|
409
|
+
/**
|
|
410
|
+
* Gets all sorted child scopes of a node.
|
|
411
|
+
* @param node The node to get child scopes for.
|
|
412
|
+
* @param options Options for getting child scopes.
|
|
413
|
+
* @returns An array of sorted child scopes.
|
|
414
|
+
*/
|
|
176
415
|
private getAllSortedChildScope;
|
|
177
416
|
}
|
|
178
417
|
|
|
179
|
-
|
|
418
|
+
/**
|
|
419
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
420
|
+
* SPDX-License-Identifier: MIT
|
|
421
|
+
*/
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Global Scope stores all variables that are not scoped to any node.
|
|
425
|
+
*
|
|
426
|
+
* - Variables in Global Scope can be accessed by any node.
|
|
427
|
+
* - Any other scope's variables can not be accessed by Global Scope.
|
|
428
|
+
*/
|
|
429
|
+
declare class GlobalScope extends Scope {
|
|
430
|
+
static readonly ID: unique symbol;
|
|
431
|
+
/**
|
|
432
|
+
* Check if the scope is Global Scope.
|
|
433
|
+
* @param scope
|
|
434
|
+
* @returns
|
|
435
|
+
*/
|
|
436
|
+
static is(scope: Scope): boolean;
|
|
437
|
+
}
|
|
438
|
+
declare const bindGlobalScope: (bind: interfaces.Bind) => void;
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Use `node.scope` instead.
|
|
442
|
+
* @deprecated
|
|
443
|
+
* @param node The flow node entity.
|
|
444
|
+
* @returns The public scope of the node.
|
|
445
|
+
*/
|
|
446
|
+
declare function getNodeScope(node: FlowNodeEntity): FlowNodeScope;
|
|
447
|
+
/**
|
|
448
|
+
* Use `node.privateScope` instead.
|
|
449
|
+
* @deprecated
|
|
450
|
+
* @param node The flow node entity.
|
|
451
|
+
* @returns The private scope of the node.
|
|
452
|
+
*/
|
|
453
|
+
declare function getNodePrivateScope(node: FlowNodeEntity): FlowNodeScope;
|
|
454
|
+
|
|
455
|
+
export { FixedLayoutScopeChain, type FlowNodeScope, type FlowNodeScopeMeta, FlowNodeScopeTypeEnum as FlowNodeScopeType, FlowNodeVariableData, FreeLayoutScopeChain, GlobalScope, ScopeChainTransformService, VariableChainConfig, bindGlobalScope, getNodePrivateScope, getNodeScope };
|