@flowgram.ai/variable-layout 0.2.20 → 0.2.22

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 CHANGED
@@ -152,8 +152,8 @@ import {
152
152
  } from "@flowgram.ai/document";
153
153
  import { EntityManager } from "@flowgram.ai/core";
154
154
 
155
- // src/variable-layout-config.ts
156
- var VariableLayoutConfig = Symbol("VariableLayoutConfig");
155
+ // src/variable-chain-config.ts
156
+ var VariableChainConfig = Symbol("VariableChainConfig");
157
157
 
158
158
  // src/services/scope-chain-transform-service.ts
159
159
  import { inject, injectable, optional } from "inversify";
@@ -224,7 +224,7 @@ __decorateClass([
224
224
  ScopeChainTransformService = __decorateClass([
225
225
  injectable(),
226
226
  __decorateParam(0, optional()),
227
- __decorateParam(0, inject(VariableLayoutConfig))
227
+ __decorateParam(0, inject(VariableChainConfig))
228
228
  ], ScopeChainTransformService);
229
229
 
230
230
  // src/scopes/global-scope.ts
@@ -300,6 +300,7 @@ var FreeLayoutScopeChain = class extends ScopeChain {
300
300
  deps.push(
301
301
  ...allInputNodes.map((_node) => _node.getData(FlowNodeVariableData).public).filter(Boolean)
302
302
  );
303
+ deps.push(...allInputNodes.map((_node) => this.getAllPublicChildScopes(_node)).flat());
303
304
  const currVarData = curr.getData(FlowNodeVariableData);
304
305
  if (currVarData?.private && scope !== currVarData.private) {
305
306
  deps.push(currVarData.private);
@@ -328,6 +329,14 @@ var FreeLayoutScopeChain = class extends ScopeChain {
328
329
  queue.push(...this.getNodeChildren(node));
329
330
  } else {
330
331
  queue.push(...this.getAllOutputLayerNodes(node) || []);
332
+ let parent = this.getNodeParent(node);
333
+ while (parent) {
334
+ if (this.isNodeChildrenPrivate(parent)) {
335
+ break;
336
+ }
337
+ queue.push(...this.getAllOutputLayerNodes(parent));
338
+ parent = this.getNodeParent(parent);
339
+ }
331
340
  }
332
341
  const scopes = [];
333
342
  while (queue.length) {
@@ -361,6 +370,20 @@ var FreeLayoutScopeChain = class extends ScopeChain {
361
370
  }
362
371
  return this.tree.getChildren(node);
363
372
  }
373
+ /**
374
+ * Get All children of nodes
375
+ * @param node
376
+ * @returns
377
+ */
378
+ getAllPublicChildScopes(node) {
379
+ if (this.isNodeChildrenPrivate(node)) {
380
+ return [];
381
+ }
382
+ return this.getNodeChildren(node).map((_node) => [
383
+ _node.getData(FlowNodeVariableData).public,
384
+ ...this.getAllPublicChildScopes(_node)
385
+ ]).flat();
386
+ }
364
387
  getNodeParent(node) {
365
388
  if (this.configs?.getNodeParent) {
366
389
  return this.configs.getNodeParent(node);
@@ -379,6 +402,14 @@ var FreeLayoutScopeChain = class extends ScopeChain {
379
402
  }
380
403
  return parent;
381
404
  }
405
+ // Child nodes can not be accessed
406
+ isNodeChildrenPrivate(node) {
407
+ if (this.configs?.isNodeChildrenPrivate) {
408
+ return node ? this.configs?.isNodeChildrenPrivate(node) : false;
409
+ }
410
+ const isSystemNode = node?.id.startsWith("$");
411
+ return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;
412
+ }
382
413
  sortAll() {
383
414
  console.warn("FreeLayoutScopeChain.sortAll is not implemented");
384
415
  return [];
@@ -392,7 +423,7 @@ __decorateClass([
392
423
  ], FreeLayoutScopeChain.prototype, "flowDocument", 2);
393
424
  __decorateClass([
394
425
  optional2(),
395
- inject2(VariableLayoutConfig)
426
+ inject2(VariableChainConfig)
396
427
  ], FreeLayoutScopeChain.prototype, "configs", 2);
397
428
  __decorateClass([
398
429
  inject2(ScopeChainTransformService)
@@ -567,7 +598,7 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
567
598
  }
568
599
  return node.getData(FlowNodeVariableData);
569
600
  }
570
- // privateScope:子节点不可以被后续节点访问
601
+ // 子节点不可以被后续节点访问
571
602
  isNodeChildrenPrivate(node) {
572
603
  if (this.configs?.isNodeChildrenPrivate) {
573
604
  return node ? this.configs?.isNodeChildrenPrivate(node) : false;
@@ -609,7 +640,7 @@ __decorateClass([
609
640
  FixedLayoutScopeChain = __decorateClass([
610
641
  __decorateParam(0, inject3(FlowDocument3)),
611
642
  __decorateParam(1, optional3()),
612
- __decorateParam(1, inject3(VariableLayoutConfig))
643
+ __decorateParam(1, inject3(VariableChainConfig))
613
644
  ], FixedLayoutScopeChain);
614
645
 
615
646
  // src/utils.ts
@@ -626,7 +657,7 @@ export {
626
657
  FreeLayoutScopeChain,
627
658
  GlobalScope,
628
659
  ScopeChainTransformService,
629
- VariableLayoutConfig,
660
+ VariableChainConfig,
630
661
  bindGlobalScope,
631
662
  getNodePrivateScope,
632
663
  getNodeScope
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/flow-node-variable-data.ts","../../src/types.ts","../../src/chains/free-layout-scope-chain.ts","../../src/variable-layout-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\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 /**\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\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 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 { VariableLayoutConfig } from '../variable-layout-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 * 自由布局作用域链实现\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 @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\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 const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\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. 找到依赖的节点\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n\n // 2. 获取所有依赖节点的 public 作用域\n deps.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 deps.push(currVarData.private);\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 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 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getNodeChildren(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.getNodeChildren(_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.transformService.transformCovers(uniqScopes, { scope });\n }\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 // 子画布本身不存在 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 getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\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 sortAll(): Scope[] {\n // 暂未实现\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\nexport interface VariableLayoutConfig {\n /**\n * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * 用于固定布局场景时:父子中间存在大量无用节点(如 inlineBlocks 等,需要配置化略过)\n * 用于自由画布场景时:部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需可配置化\n */\n getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * 对依赖作用域进行微调\n */\n transformDeps?: IScopeTransformer;\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: IScopeTransformer;\n}\n\nexport const VariableLayoutConfig = Symbol('VariableLayoutConfig');\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 { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope } from '../types';\n\nexport interface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\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(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig\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\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 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 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@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\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 { VariableLayoutConfig } from '../variable-layout-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 * 基于 FlowVirtualTree 的 ScopeOrder 实现\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // 增加 { id: string } 使得可以灵活添加自定义虚拟节点\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(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.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 // 包含子节点,且不是私有作用域\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 // 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 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 // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\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 // 有子元素的节点,则将子元素纳入覆盖作用域\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.transformService.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.transformService.transformCovers(covers, { scope });\n }\n\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 // 获取变量 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","/**\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\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\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"]}
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\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 /**\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\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 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 * 自由布局作用域链实现\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 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 const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\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 const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n\n // 2. all public scopes of inputNodes\n deps.push(\n ...allInputNodes.map((_node) => _node.getData(FlowNodeVariableData).public).filter(Boolean)\n );\n\n // 3. all public children of inputNodes\n deps.push(...allInputNodes.map((_node) => this.getAllPublicChildScopes(_node)).flat());\n\n // 4. private scope of parent node can be access\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n deps.push(currVarData.private);\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 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 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getNodeChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\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. 获取所有覆盖节点的 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.getNodeChildren(_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.transformService.transformCovers(uniqScopes, { scope });\n }\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 // 子画布本身不存在 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 /**\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 getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\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 // Child nodes can not be accessed\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 sortAll(): Scope[] {\n // 暂未实现\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\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 * 对依赖作用域进行微调\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\nexport interface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\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\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 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 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@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\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 * 基于 FlowVirtualTree 的 ScopeOrder 实现\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // 增加 { id: string } 使得可以灵活添加自定义虚拟节点\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 // 绑定 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.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 // 包含子节点,且不是私有作用域\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 // 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 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 // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\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 // 有子元素的节点,则将子元素纳入覆盖作用域\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.transformService.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.transformService.transformCovers(covers, { scope });\n }\n\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 // 获取变量 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 // 子节点不可以被后续节点访问\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","/**\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\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\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
@@ -132,14 +132,14 @@ interface TransformerContext {
132
132
  }
133
133
  type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];
134
134
  declare class ScopeChainTransformService {
135
- protected configs?: VariableLayoutConfig | undefined;
135
+ protected configs?: VariableChainConfig | undefined;
136
136
  protected transformerMap: Map<string, {
137
137
  transformDeps: IScopeTransformer;
138
138
  transformCovers: IScopeTransformer;
139
139
  }>;
140
140
  document: FlowDocument;
141
141
  variableEngine: VariableEngine;
142
- constructor(configs?: VariableLayoutConfig | undefined);
142
+ constructor(configs?: VariableChainConfig | undefined);
143
143
  /**
144
144
  * check if transformer registered
145
145
  * @param transformerId used to identify transformer, prevent duplicated
@@ -168,21 +168,22 @@ declare class ScopeChainTransformService {
168
168
  * SPDX-License-Identifier: MIT
169
169
  */
170
170
 
171
- interface VariableLayoutConfig {
171
+ interface VariableChainConfig {
172
172
  /**
173
- * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景
173
+ * The output variables of a node's children cannot be accessed by subsequent nodes.
174
+ *
174
175
  * @param node
175
176
  * @returns
176
177
  */
177
178
  isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;
178
179
  /**
179
- * 用于固定布局场景时:父子中间存在大量无用节点(如 inlineBlocks 等,需要配置化略过)
180
- * 用于自由画布场景时:部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需可配置化
180
+ * 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)
181
+ * 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
181
182
  */
182
183
  getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];
183
184
  getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;
184
185
  /**
185
- * 对依赖作用域进行微调
186
+ * Fine-tune the dependency scope
186
187
  */
187
188
  transformDeps?: IScopeTransformer;
188
189
  /**
@@ -190,7 +191,7 @@ interface VariableLayoutConfig {
190
191
  */
191
192
  transformCovers?: IScopeTransformer;
192
193
  }
193
- declare const VariableLayoutConfig: unique symbol;
194
+ declare const VariableChainConfig: unique symbol;
194
195
 
195
196
  /**
196
197
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
@@ -203,7 +204,7 @@ declare const VariableLayoutConfig: unique symbol;
203
204
  declare class FreeLayoutScopeChain extends ScopeChain {
204
205
  entityManager: EntityManager;
205
206
  protected flowDocument: FlowDocument;
206
- protected configs?: VariableLayoutConfig;
207
+ protected configs?: VariableChainConfig;
207
208
  protected transformService: ScopeChainTransformService;
208
209
  get tree(): FlowVirtualTree<FlowNodeEntity>;
209
210
  onInit(): void;
@@ -212,7 +213,14 @@ declare class FreeLayoutScopeChain extends ScopeChain {
212
213
  getDeps(scope: FlowNodeScope): FlowNodeScope[];
213
214
  getCovers(scope: FlowNodeScope): FlowNodeScope[];
214
215
  getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[];
216
+ /**
217
+ * Get All children of nodes
218
+ * @param node
219
+ * @returns
220
+ */
221
+ getAllPublicChildScopes(node: FlowNodeEntity): Scope[];
215
222
  getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined;
223
+ protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean;
216
224
  sortAll(): Scope[];
217
225
  }
218
226
 
@@ -226,10 +234,10 @@ declare class FreeLayoutScopeChain extends ScopeChain {
226
234
  */
227
235
  declare class FixedLayoutScopeChain extends ScopeChain {
228
236
  protected flowDocument: FlowDocument;
229
- protected configs?: VariableLayoutConfig | undefined;
237
+ protected configs?: VariableChainConfig | undefined;
230
238
  tree: FlowVirtualTree<ScopeChainNode> | undefined;
231
239
  protected transformService: ScopeChainTransformService;
232
- constructor(flowDocument: FlowDocument, configs?: VariableLayoutConfig | undefined);
240
+ constructor(flowDocument: FlowDocument, configs?: VariableChainConfig | undefined);
233
241
  bindTree(tree: FlowVirtualTree<ScopeChainNode>): void;
234
242
  getDeps(scope: FlowNodeScope): FlowNodeScope[];
235
243
  getCovers(scope: FlowNodeScope): FlowNodeScope[];
@@ -254,4 +262,4 @@ declare const bindGlobalScope: (bind: interfaces.Bind) => void;
254
262
  declare function getNodeScope(node: FlowNodeEntity): FlowNodeScope;
255
263
  declare function getNodePrivateScope(node: FlowNodeEntity): FlowNodeScope;
256
264
 
257
- export { FixedLayoutScopeChain, type FlowNodeScope, type FlowNodeScopeMeta, FlowNodeScopeTypeEnum as FlowNodeScopeType, FlowNodeVariableData, FreeLayoutScopeChain, GlobalScope, ScopeChainTransformService, VariableLayoutConfig, bindGlobalScope, getNodePrivateScope, getNodeScope };
265
+ export { FixedLayoutScopeChain, type FlowNodeScope, type FlowNodeScopeMeta, FlowNodeScopeTypeEnum as FlowNodeScopeType, FlowNodeVariableData, FreeLayoutScopeChain, GlobalScope, ScopeChainTransformService, VariableChainConfig, bindGlobalScope, getNodePrivateScope, getNodeScope };
package/dist/index.d.ts CHANGED
@@ -132,14 +132,14 @@ interface TransformerContext {
132
132
  }
133
133
  type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];
134
134
  declare class ScopeChainTransformService {
135
- protected configs?: VariableLayoutConfig | undefined;
135
+ protected configs?: VariableChainConfig | undefined;
136
136
  protected transformerMap: Map<string, {
137
137
  transformDeps: IScopeTransformer;
138
138
  transformCovers: IScopeTransformer;
139
139
  }>;
140
140
  document: FlowDocument;
141
141
  variableEngine: VariableEngine;
142
- constructor(configs?: VariableLayoutConfig | undefined);
142
+ constructor(configs?: VariableChainConfig | undefined);
143
143
  /**
144
144
  * check if transformer registered
145
145
  * @param transformerId used to identify transformer, prevent duplicated
@@ -168,21 +168,22 @@ declare class ScopeChainTransformService {
168
168
  * SPDX-License-Identifier: MIT
169
169
  */
170
170
 
171
- interface VariableLayoutConfig {
171
+ interface VariableChainConfig {
172
172
  /**
173
- * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景
173
+ * The output variables of a node's children cannot be accessed by subsequent nodes.
174
+ *
174
175
  * @param node
175
176
  * @returns
176
177
  */
177
178
  isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;
178
179
  /**
179
- * 用于固定布局场景时:父子中间存在大量无用节点(如 inlineBlocks 等,需要配置化略过)
180
- * 用于自由画布场景时:部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需可配置化
180
+ * 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)
181
+ * 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
181
182
  */
182
183
  getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];
183
184
  getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;
184
185
  /**
185
- * 对依赖作用域进行微调
186
+ * Fine-tune the dependency scope
186
187
  */
187
188
  transformDeps?: IScopeTransformer;
188
189
  /**
@@ -190,7 +191,7 @@ interface VariableLayoutConfig {
190
191
  */
191
192
  transformCovers?: IScopeTransformer;
192
193
  }
193
- declare const VariableLayoutConfig: unique symbol;
194
+ declare const VariableChainConfig: unique symbol;
194
195
 
195
196
  /**
196
197
  * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
@@ -203,7 +204,7 @@ declare const VariableLayoutConfig: unique symbol;
203
204
  declare class FreeLayoutScopeChain extends ScopeChain {
204
205
  entityManager: EntityManager;
205
206
  protected flowDocument: FlowDocument;
206
- protected configs?: VariableLayoutConfig;
207
+ protected configs?: VariableChainConfig;
207
208
  protected transformService: ScopeChainTransformService;
208
209
  get tree(): FlowVirtualTree<FlowNodeEntity>;
209
210
  onInit(): void;
@@ -212,7 +213,14 @@ declare class FreeLayoutScopeChain extends ScopeChain {
212
213
  getDeps(scope: FlowNodeScope): FlowNodeScope[];
213
214
  getCovers(scope: FlowNodeScope): FlowNodeScope[];
214
215
  getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[];
216
+ /**
217
+ * Get All children of nodes
218
+ * @param node
219
+ * @returns
220
+ */
221
+ getAllPublicChildScopes(node: FlowNodeEntity): Scope[];
215
222
  getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined;
223
+ protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean;
216
224
  sortAll(): Scope[];
217
225
  }
218
226
 
@@ -226,10 +234,10 @@ declare class FreeLayoutScopeChain extends ScopeChain {
226
234
  */
227
235
  declare class FixedLayoutScopeChain extends ScopeChain {
228
236
  protected flowDocument: FlowDocument;
229
- protected configs?: VariableLayoutConfig | undefined;
237
+ protected configs?: VariableChainConfig | undefined;
230
238
  tree: FlowVirtualTree<ScopeChainNode> | undefined;
231
239
  protected transformService: ScopeChainTransformService;
232
- constructor(flowDocument: FlowDocument, configs?: VariableLayoutConfig | undefined);
240
+ constructor(flowDocument: FlowDocument, configs?: VariableChainConfig | undefined);
233
241
  bindTree(tree: FlowVirtualTree<ScopeChainNode>): void;
234
242
  getDeps(scope: FlowNodeScope): FlowNodeScope[];
235
243
  getCovers(scope: FlowNodeScope): FlowNodeScope[];
@@ -254,4 +262,4 @@ declare const bindGlobalScope: (bind: interfaces.Bind) => void;
254
262
  declare function getNodeScope(node: FlowNodeEntity): FlowNodeScope;
255
263
  declare function getNodePrivateScope(node: FlowNodeEntity): FlowNodeScope;
256
264
 
257
- export { FixedLayoutScopeChain, type FlowNodeScope, type FlowNodeScopeMeta, FlowNodeScopeTypeEnum as FlowNodeScopeType, FlowNodeVariableData, FreeLayoutScopeChain, GlobalScope, ScopeChainTransformService, VariableLayoutConfig, bindGlobalScope, getNodePrivateScope, getNodeScope };
265
+ export { FixedLayoutScopeChain, type FlowNodeScope, type FlowNodeScopeMeta, FlowNodeScopeTypeEnum as FlowNodeScopeType, FlowNodeVariableData, FreeLayoutScopeChain, GlobalScope, ScopeChainTransformService, VariableChainConfig, bindGlobalScope, getNodePrivateScope, getNodeScope };
package/dist/index.js CHANGED
@@ -35,7 +35,7 @@ __export(src_exports, {
35
35
  FreeLayoutScopeChain: () => FreeLayoutScopeChain,
36
36
  GlobalScope: () => GlobalScope,
37
37
  ScopeChainTransformService: () => ScopeChainTransformService,
38
- VariableLayoutConfig: () => VariableLayoutConfig,
38
+ VariableChainConfig: () => VariableChainConfig,
39
39
  bindGlobalScope: () => bindGlobalScope,
40
40
  getNodePrivateScope: () => getNodePrivateScope,
41
41
  getNodeScope: () => getNodeScope
@@ -181,8 +181,8 @@ var import_free_layout_core = require("@flowgram.ai/free-layout-core");
181
181
  var import_document2 = require("@flowgram.ai/document");
182
182
  var import_core3 = require("@flowgram.ai/core");
183
183
 
184
- // src/variable-layout-config.ts
185
- var VariableLayoutConfig = Symbol("VariableLayoutConfig");
184
+ // src/variable-chain-config.ts
185
+ var VariableChainConfig = Symbol("VariableChainConfig");
186
186
 
187
187
  // src/services/scope-chain-transform-service.ts
188
188
  var import_inversify = require("inversify");
@@ -253,7 +253,7 @@ __decorateClass([
253
253
  ScopeChainTransformService = __decorateClass([
254
254
  (0, import_inversify.injectable)(),
255
255
  __decorateParam(0, (0, import_inversify.optional)()),
256
- __decorateParam(0, (0, import_inversify.inject)(VariableLayoutConfig))
256
+ __decorateParam(0, (0, import_inversify.inject)(VariableChainConfig))
257
257
  ], ScopeChainTransformService);
258
258
 
259
259
  // src/scopes/global-scope.ts
@@ -329,6 +329,7 @@ var FreeLayoutScopeChain = class extends import_variable_core3.ScopeChain {
329
329
  deps.push(
330
330
  ...allInputNodes.map((_node) => _node.getData(FlowNodeVariableData).public).filter(Boolean)
331
331
  );
332
+ deps.push(...allInputNodes.map((_node) => this.getAllPublicChildScopes(_node)).flat());
332
333
  const currVarData = curr.getData(FlowNodeVariableData);
333
334
  if (currVarData?.private && scope !== currVarData.private) {
334
335
  deps.push(currVarData.private);
@@ -357,6 +358,14 @@ var FreeLayoutScopeChain = class extends import_variable_core3.ScopeChain {
357
358
  queue.push(...this.getNodeChildren(node));
358
359
  } else {
359
360
  queue.push(...this.getAllOutputLayerNodes(node) || []);
361
+ let parent = this.getNodeParent(node);
362
+ while (parent) {
363
+ if (this.isNodeChildrenPrivate(parent)) {
364
+ break;
365
+ }
366
+ queue.push(...this.getAllOutputLayerNodes(parent));
367
+ parent = this.getNodeParent(parent);
368
+ }
360
369
  }
361
370
  const scopes = [];
362
371
  while (queue.length) {
@@ -390,6 +399,20 @@ var FreeLayoutScopeChain = class extends import_variable_core3.ScopeChain {
390
399
  }
391
400
  return this.tree.getChildren(node);
392
401
  }
402
+ /**
403
+ * Get All children of nodes
404
+ * @param node
405
+ * @returns
406
+ */
407
+ getAllPublicChildScopes(node) {
408
+ if (this.isNodeChildrenPrivate(node)) {
409
+ return [];
410
+ }
411
+ return this.getNodeChildren(node).map((_node) => [
412
+ _node.getData(FlowNodeVariableData).public,
413
+ ...this.getAllPublicChildScopes(_node)
414
+ ]).flat();
415
+ }
393
416
  getNodeParent(node) {
394
417
  if (this.configs?.getNodeParent) {
395
418
  return this.configs.getNodeParent(node);
@@ -408,6 +431,14 @@ var FreeLayoutScopeChain = class extends import_variable_core3.ScopeChain {
408
431
  }
409
432
  return parent;
410
433
  }
434
+ // Child nodes can not be accessed
435
+ isNodeChildrenPrivate(node) {
436
+ if (this.configs?.isNodeChildrenPrivate) {
437
+ return node ? this.configs?.isNodeChildrenPrivate(node) : false;
438
+ }
439
+ const isSystemNode = node?.id.startsWith("$");
440
+ return !isSystemNode && node?.flowNodeType !== import_document2.FlowNodeBaseType.GROUP;
441
+ }
411
442
  sortAll() {
412
443
  console.warn("FreeLayoutScopeChain.sortAll is not implemented");
413
444
  return [];
@@ -421,7 +452,7 @@ __decorateClass([
421
452
  ], FreeLayoutScopeChain.prototype, "flowDocument", 2);
422
453
  __decorateClass([
423
454
  (0, import_inversify3.optional)(),
424
- (0, import_inversify3.inject)(VariableLayoutConfig)
455
+ (0, import_inversify3.inject)(VariableChainConfig)
425
456
  ], FreeLayoutScopeChain.prototype, "configs", 2);
426
457
  __decorateClass([
427
458
  (0, import_inversify3.inject)(ScopeChainTransformService)
@@ -596,7 +627,7 @@ var FixedLayoutScopeChain = class extends import_variable_core4.ScopeChain {
596
627
  }
597
628
  return node.getData(FlowNodeVariableData);
598
629
  }
599
- // privateScope:子节点不可以被后续节点访问
630
+ // 子节点不可以被后续节点访问
600
631
  isNodeChildrenPrivate(node) {
601
632
  if (this.configs?.isNodeChildrenPrivate) {
602
633
  return node ? this.configs?.isNodeChildrenPrivate(node) : false;
@@ -638,7 +669,7 @@ __decorateClass([
638
669
  FixedLayoutScopeChain = __decorateClass([
639
670
  __decorateParam(0, (0, import_inversify4.inject)(import_document3.FlowDocument)),
640
671
  __decorateParam(1, (0, import_inversify4.optional)()),
641
- __decorateParam(1, (0, import_inversify4.inject)(VariableLayoutConfig))
672
+ __decorateParam(1, (0, import_inversify4.inject)(VariableChainConfig))
642
673
  ], FixedLayoutScopeChain);
643
674
 
644
675
  // src/utils.ts
@@ -656,7 +687,7 @@ function getNodePrivateScope(node) {
656
687
  FreeLayoutScopeChain,
657
688
  GlobalScope,
658
689
  ScopeChainTransformService,
659
- VariableLayoutConfig,
690
+ VariableChainConfig,
660
691
  bindGlobalScope,
661
692
  getNodePrivateScope,
662
693
  getNodeScope
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/flow-node-variable-data.ts","../src/types.ts","../src/chains/free-layout-scope-chain.ts","../src/variable-layout-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\nexport { FlowNodeVariableData } from './flow-node-variable-data';\nexport { FreeLayoutScopeChain } from './chains/free-layout-scope-chain';\nexport { VariableLayoutConfig } from './variable-layout-config';\nexport { FixedLayoutScopeChain } from './chains/fixed-layout-scope-chain';\nexport {\n type FlowNodeScopeMeta,\n type FlowNodeScope,\n FlowNodeScopeTypeEnum as FlowNodeScopeType,\n} from './types';\nexport { GlobalScope, bindGlobalScope } from './scopes/global-scope';\nexport { ScopeChainTransformService } from './services/scope-chain-transform-service';\nexport { getNodeScope, getNodePrivateScope } from './utils';\n","/**\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\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 /**\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\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 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 { VariableLayoutConfig } from '../variable-layout-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 * 自由布局作用域链实现\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 @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\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 const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\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. 找到依赖的节点\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n\n // 2. 获取所有依赖节点的 public 作用域\n deps.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 deps.push(currVarData.private);\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 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 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getNodeChildren(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.getNodeChildren(_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.transformService.transformCovers(uniqScopes, { scope });\n }\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 // 子画布本身不存在 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 getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\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 sortAll(): Scope[] {\n // 暂未实现\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\nexport interface VariableLayoutConfig {\n /**\n * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * 用于固定布局场景时:父子中间存在大量无用节点(如 inlineBlocks 等,需要配置化略过)\n * 用于自由画布场景时:部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需可配置化\n */\n getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * 对依赖作用域进行微调\n */\n transformDeps?: IScopeTransformer;\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: IScopeTransformer;\n}\n\nexport const VariableLayoutConfig = Symbol('VariableLayoutConfig');\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 { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope } from '../types';\n\nexport interface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\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(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig\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\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 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 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@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\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 { VariableLayoutConfig } from '../variable-layout-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 * 基于 FlowVirtualTree 的 ScopeOrder 实现\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // 增加 { id: string } 使得可以灵活添加自定义虚拟节点\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(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.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 // 包含子节点,且不是私有作用域\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 // 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 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 // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\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 // 有子元素的节点,则将子元素纳入覆盖作用域\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.transformService.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.transformService.transformCovers(covers, { scope });\n }\n\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 // 获取变量 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","/**\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\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\n\nexport function getNodePrivateScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).initPrivate();\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","import_inversify","import_variable_core","import_document","import_core","import_core","scopes","import_inversify","import_variable_core","scopes","import_inversify","import_variable_core","import_document"]}
1
+ {"version":3,"sources":["../src/index.ts","../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\nexport { FlowNodeVariableData } from './flow-node-variable-data';\nexport { FreeLayoutScopeChain } from './chains/free-layout-scope-chain';\nexport { VariableChainConfig } from './variable-chain-config';\nexport { FixedLayoutScopeChain } from './chains/fixed-layout-scope-chain';\nexport {\n type FlowNodeScopeMeta,\n type FlowNodeScope,\n FlowNodeScopeTypeEnum as FlowNodeScopeType,\n} from './types';\nexport { GlobalScope, bindGlobalScope } from './scopes/global-scope';\nexport { ScopeChainTransformService } from './services/scope-chain-transform-service';\nexport { getNodeScope, getNodePrivateScope } from './utils';\n","/**\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\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 /**\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\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 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 * 自由布局作用域链实现\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 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 const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\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 const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n\n // 2. all public scopes of inputNodes\n deps.push(\n ...allInputNodes.map((_node) => _node.getData(FlowNodeVariableData).public).filter(Boolean)\n );\n\n // 3. all public children of inputNodes\n deps.push(...allInputNodes.map((_node) => this.getAllPublicChildScopes(_node)).flat());\n\n // 4. private scope of parent node can be access\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n deps.push(currVarData.private);\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 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 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getNodeChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\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. 获取所有覆盖节点的 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.getNodeChildren(_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.transformService.transformCovers(uniqScopes, { scope });\n }\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 // 子画布本身不存在 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 /**\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 getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\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 // Child nodes can not be accessed\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 sortAll(): Scope[] {\n // 暂未实现\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\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 * 对依赖作用域进行微调\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\nexport interface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\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\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 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 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@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\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 * 基于 FlowVirtualTree 的 ScopeOrder 实现\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // 增加 { id: string } 使得可以灵活添加自定义虚拟节点\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 // 绑定 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.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 // 包含子节点,且不是私有作用域\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 // 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 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 // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\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 // 有子元素的节点,则将子元素纳入覆盖作用域\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.transformService.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.transformService.transformCovers(covers, { scope });\n }\n\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 // 获取变量 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 // 子节点不可以被后续节点访问\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","/**\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\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\n\nexport function getNodePrivateScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).initPrivate();\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","import_inversify","import_variable_core","import_document","import_core","import_core","scopes","import_inversify","import_variable_core","scopes","import_inversify","import_variable_core","import_document"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowgram.ai/variable-layout",
3
- "version": "0.2.20",
3
+ "version": "0.2.22",
4
4
  "homepage": "https://flowgram.ai/",
5
5
  "repository": "https://github.com/bytedance/flowgram.ai",
6
6
  "license": "MIT",
@@ -19,11 +19,11 @@
19
19
  "inversify": "^6.0.1",
20
20
  "reflect-metadata": "~0.2.2",
21
21
  "styled-components": "^5",
22
- "@flowgram.ai/core": "0.2.20",
23
- "@flowgram.ai/document": "0.2.20",
24
- "@flowgram.ai/free-layout-core": "0.2.20",
25
- "@flowgram.ai/utils": "0.2.20",
26
- "@flowgram.ai/variable-core": "0.2.20"
22
+ "@flowgram.ai/core": "0.2.22",
23
+ "@flowgram.ai/document": "0.2.22",
24
+ "@flowgram.ai/free-layout-core": "0.2.22",
25
+ "@flowgram.ai/variable-core": "0.2.22",
26
+ "@flowgram.ai/utils": "0.2.22"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@vitest/coverage-v8": "^0.32.0",
@@ -31,8 +31,8 @@
31
31
  "tsup": "^8.0.1",
32
32
  "typescript": "^5.0.4",
33
33
  "vitest": "^0.34.6",
34
- "@flowgram.ai/eslint-config": "0.2.20",
35
- "@flowgram.ai/ts-config": "0.2.20"
34
+ "@flowgram.ai/ts-config": "0.2.22",
35
+ "@flowgram.ai/eslint-config": "0.2.22"
36
36
  },
37
37
  "publishConfig": {
38
38
  "access": "public",