@flowgram.ai/variable-layout 0.1.0-alpha.8 → 0.1.0-alpha.9
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 +22 -34
- package/dist/esm/index.js.map +1 -1
- package/dist/index.js +22 -34
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
package/dist/esm/index.js
CHANGED
|
@@ -82,8 +82,7 @@ var FlowNodeVariableData = class extends EntityData {
|
|
|
82
82
|
* @returns The value of the variable, or undefined if not found.
|
|
83
83
|
*/
|
|
84
84
|
getPrivateVar(key = "outputs") {
|
|
85
|
-
|
|
86
|
-
return (_a = this.private) == null ? void 0 : _a.ast.get(key);
|
|
85
|
+
return this.private?.ast.get(key);
|
|
87
86
|
}
|
|
88
87
|
/**
|
|
89
88
|
* Clears a variable from the private AST (Abstract Syntax Tree) by key.
|
|
@@ -92,8 +91,7 @@ var FlowNodeVariableData = class extends EntityData {
|
|
|
92
91
|
* @returns The updated AST node.
|
|
93
92
|
*/
|
|
94
93
|
clearPrivateVar(key = "outputs") {
|
|
95
|
-
|
|
96
|
-
return (_a = this.private) == null ? void 0 : _a.ast.remove(key);
|
|
94
|
+
return this.private?.ast.remove(key);
|
|
97
95
|
}
|
|
98
96
|
get allScopes() {
|
|
99
97
|
const res = [];
|
|
@@ -214,15 +212,13 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
214
212
|
}
|
|
215
213
|
// 获取同一层级所有输入节点
|
|
216
214
|
getAllInputLayerNodes(curr) {
|
|
217
|
-
|
|
218
|
-
return (((_a = curr.getData(WorkflowNodeLinesData)) == null ? void 0 : _a.allInputNodes) || []).filter(
|
|
215
|
+
return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(
|
|
219
216
|
(_node) => _node.parent === curr.parent
|
|
220
217
|
);
|
|
221
218
|
}
|
|
222
219
|
// 获取同一层级所有输出节点
|
|
223
220
|
getAllOutputLayerNodes(curr) {
|
|
224
|
-
|
|
225
|
-
return (((_a = curr.getData(WorkflowNodeLinesData)) == null ? void 0 : _a.allOutputNodes) || []).filter(
|
|
221
|
+
return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(
|
|
226
222
|
(_node) => _node.parent === curr.parent
|
|
227
223
|
);
|
|
228
224
|
}
|
|
@@ -239,7 +235,7 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
239
235
|
...allInputNodes.map((_node) => _node.getData(FlowNodeVariableData).public).filter(Boolean)
|
|
240
236
|
);
|
|
241
237
|
const currVarData = curr.getData(FlowNodeVariableData);
|
|
242
|
-
if (
|
|
238
|
+
if (currVarData?.private && scope !== currVarData.private) {
|
|
243
239
|
deps.push(currVarData.private);
|
|
244
240
|
}
|
|
245
241
|
curr = this.getParent(curr);
|
|
@@ -272,7 +268,7 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
272
268
|
const variableData = _node.getData(FlowNodeVariableData);
|
|
273
269
|
scopes.push(...variableData.allScopes);
|
|
274
270
|
const children = _node && this.getChildren(_node);
|
|
275
|
-
if (children
|
|
271
|
+
if (children?.length) {
|
|
276
272
|
queue.push(...children);
|
|
277
273
|
}
|
|
278
274
|
}
|
|
@@ -284,28 +280,25 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
284
280
|
return this.transformCovers(uniqScopes, { scope });
|
|
285
281
|
}
|
|
286
282
|
transformCovers(covers, { scope }) {
|
|
287
|
-
|
|
288
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformCovers) ? this.configs.transformCovers(covers, {
|
|
283
|
+
return this.configs?.transformCovers ? this.configs.transformCovers(covers, {
|
|
289
284
|
scope,
|
|
290
285
|
document: this.flowDocument,
|
|
291
286
|
variableEngine: this.variableEngine
|
|
292
287
|
}) : covers;
|
|
293
288
|
}
|
|
294
289
|
transformDeps(deps, { scope }) {
|
|
295
|
-
|
|
296
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformDeps) ? this.configs.transformDeps(deps, {
|
|
290
|
+
return this.configs?.transformDeps ? this.configs.transformDeps(deps, {
|
|
297
291
|
scope,
|
|
298
292
|
document: this.flowDocument,
|
|
299
293
|
variableEngine: this.variableEngine
|
|
300
294
|
}) : deps;
|
|
301
295
|
}
|
|
302
296
|
getChildren(node) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
return (_c = (_b = this.configs).getFreeChildren) == null ? void 0 : _c.call(_b, node);
|
|
297
|
+
if (this.configs?.getFreeChildren) {
|
|
298
|
+
return this.configs.getFreeChildren?.(node);
|
|
306
299
|
}
|
|
307
300
|
const nodeMeta = node.getNodeMeta();
|
|
308
|
-
const subCanvas =
|
|
301
|
+
const subCanvas = nodeMeta.subCanvas?.(node);
|
|
309
302
|
if (subCanvas) {
|
|
310
303
|
if (subCanvas.isCanvas) {
|
|
311
304
|
return [];
|
|
@@ -316,8 +309,7 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
316
309
|
return this.tree.getChildren(node);
|
|
317
310
|
}
|
|
318
311
|
getParent(node) {
|
|
319
|
-
|
|
320
|
-
if ((_a = this.configs) == null ? void 0 : _a.getFreeParent) {
|
|
312
|
+
if (this.configs?.getFreeParent) {
|
|
321
313
|
return this.configs.getFreeParent(node);
|
|
322
314
|
}
|
|
323
315
|
const initParent = node.document.originTree.getParent(node);
|
|
@@ -325,8 +317,8 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
325
317
|
return initParent;
|
|
326
318
|
}
|
|
327
319
|
const nodeMeta = initParent.getNodeMeta();
|
|
328
|
-
const subCanvas =
|
|
329
|
-
if (subCanvas
|
|
320
|
+
const subCanvas = nodeMeta.subCanvas?.(initParent);
|
|
321
|
+
if (subCanvas?.isCanvas) {
|
|
330
322
|
return subCanvas.parentNode;
|
|
331
323
|
}
|
|
332
324
|
return initParent;
|
|
@@ -386,7 +378,7 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
386
378
|
const { parent, pre } = this.tree.getInfo(curr);
|
|
387
379
|
const currData = this.getVariableData(curr);
|
|
388
380
|
if (curr === node) {
|
|
389
|
-
if (scope.meta.type === "public" /* public */ &&
|
|
381
|
+
if (scope.meta.type === "public" /* public */ && currData?.private) {
|
|
390
382
|
deps.unshift(currData.private);
|
|
391
383
|
}
|
|
392
384
|
} else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {
|
|
@@ -492,16 +484,14 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
492
484
|
return this.transformCovers(covers, { scope });
|
|
493
485
|
}
|
|
494
486
|
transformCovers(covers, { scope }) {
|
|
495
|
-
|
|
496
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformCovers) ? this.configs.transformCovers(covers, {
|
|
487
|
+
return this.configs?.transformCovers ? this.configs.transformCovers(covers, {
|
|
497
488
|
scope,
|
|
498
489
|
document: this.flowDocument,
|
|
499
490
|
variableEngine: this.variableEngine
|
|
500
491
|
}) : covers;
|
|
501
492
|
}
|
|
502
493
|
transformDeps(deps, { scope }) {
|
|
503
|
-
|
|
504
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformDeps) ? this.configs.transformDeps(deps, {
|
|
494
|
+
return this.configs?.transformDeps ? this.configs.transformDeps(deps, {
|
|
505
495
|
scope,
|
|
506
496
|
document: this.flowDocument,
|
|
507
497
|
variableEngine: this.variableEngine
|
|
@@ -533,11 +523,10 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
533
523
|
}
|
|
534
524
|
// privateScope:子节点不可以被后续节点访问
|
|
535
525
|
isNodeChildrenPrivate(node) {
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
return node ? (_b = this.configs) == null ? void 0 : _b.isNodeChildrenPrivate(node) : false;
|
|
526
|
+
if (this.configs?.isNodeChildrenPrivate) {
|
|
527
|
+
return node ? this.configs?.isNodeChildrenPrivate(node) : false;
|
|
539
528
|
}
|
|
540
|
-
const isSystemNode = node
|
|
529
|
+
const isSystemNode = node?.id.startsWith("$");
|
|
541
530
|
return !isSystemNode && this.hasChildren(node);
|
|
542
531
|
}
|
|
543
532
|
hasChildren(node) {
|
|
@@ -548,7 +537,6 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
548
537
|
ignoreNodeChildrenPrivate,
|
|
549
538
|
addNodePrivateScope
|
|
550
539
|
} = {}) {
|
|
551
|
-
var _a;
|
|
552
540
|
const scopes = [];
|
|
553
541
|
const variableData = this.getVariableData(node);
|
|
554
542
|
if (variableData) {
|
|
@@ -557,10 +545,10 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
557
545
|
if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {
|
|
558
546
|
return scopes;
|
|
559
547
|
}
|
|
560
|
-
if (addNodePrivateScope &&
|
|
548
|
+
if (addNodePrivateScope && variableData?.private) {
|
|
561
549
|
scopes.push(variableData.private);
|
|
562
550
|
}
|
|
563
|
-
const children =
|
|
551
|
+
const children = this.tree?.getChildren(node) || [];
|
|
564
552
|
scopes.push(
|
|
565
553
|
...children.map(
|
|
566
554
|
(child) => this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope })
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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/scopes/global-scope.ts","../../src/chains/fixed-layout-scope-chain.ts"],"sourcesContent":["import { VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n get private() {\n return this._private;\n }\n\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n // 1. Notify the covering scopes of private to update dependencies\n this._private.coverScopes.forEach((_scope) => {\n _scope.refreshDeps();\n });\n // 2. Notify the dependent scopes of private to update their covers\n this._private.depScopes.forEach((_scope) => {\n _scope.refreshCovers();\n });\n // 3. The private scope itself needs to refresh its dependencies\n this._private.available.refresh();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport enum FlowNodeScopeTypeEnum {\n public = 'public',\n private = 'private',\n}\n\nexport interface FlowNodeScopeMeta {\n node?: FlowNodeEntity;\n type?: FlowNodeScopeTypeEnum;\n}\n\nexport interface ScopeVirtualNode {\n id: string;\n flowNodeType: 'virtualNode';\n}\n\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n// 节点内部的作用域\nexport type FlowNodeScope = Scope<FlowNodeScopeMeta>;\n","import { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeEntity, FlowDocument, FlowVirtualTree } from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\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 get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // 线条发生变化时,会触发作用域链的更新\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // 树变化时候刷新作用域\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n // 获取同一层级所有输入节点\n protected getAllInputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const 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.getParent(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.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 return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n }\n\n // 2. 获取所有覆盖节点的 public、private 作用域\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. 如果当前 scope 是 private,则当前节点的 public 也可覆盖\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformCovers(uniqScopes, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n getChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getFreeChildren) {\n return this.configs.getFreeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // 子画布本身不存在 children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n return this.tree.getChildren(node);\n }\n\n getParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n if (this.configs?.getFreeParent) {\n return this.configs.getFreeParent(node);\n }\n const initParent = node.document.originTree.getParent(node);\n\n if (!initParent) {\n return initParent;\n }\n\n const nodeMeta = initParent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(initParent);\n if (subCanvas?.isCanvas) {\n return subCanvas.parentNode;\n }\n\n return initParent;\n }\n\n sortAll(): Scope[] {\n // 暂未实现\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity, FlowDocument } from '@flowgram.ai/document';\n\nimport { type FlowNodeScope, type ScopeChainNode } from './types';\n\ninterface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport interface VariableLayoutConfig {\n /**\n * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * 用于自由画布场景,部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需要可配置化\n */\n getFreeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getFreeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * 对依赖作用域进行微调\n */\n transformDeps?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n}\n\nexport const VariableLayoutConfig = Symbol('VariableLayoutConfig');\n","import { injectable, interfaces } from 'inversify';\nimport { ASTNode, ASTNodeJSON, 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): scope is GlobalScope {\n return scope.id === GlobalScope.ID;\n }\n\n /**\n * Sets a variable in the Global Scope 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 Global Scope with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.ast.get(key);\n }\n\n /**\n * Clears a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.ast.remove(key);\n }\n}\n\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","import { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { 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 constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig\n ) {\n super();\n\n // 绑定 flowDocument 里面的树\n this.bindTree(flowDocument.originTree);\n\n // originTree 发生变化时,触发依赖关系的变化\n this.toDispose.push(\n // REFRACTOR: onTreeChange 触发时机精细化\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n // 绑定树\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n // 获取依赖作用域\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 包含子节点,且不是私有作用域\n\n if (curr === node) {\n // public 可以依赖 private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // 有子元素的节点,则将子元素纳入依赖作用域\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // 节点的 public 都可以被访问\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // 上个节点处理\n if (pre) {\n curr = pre;\n continue;\n }\n\n // 父节点处理\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // 父节点的 private 和 public 都能被子节点访问\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // 当前 parent 有 pre 节点,则停止向上查找\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n // 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.transformDeps(deps, { scope });\n }\n\n // 获取覆盖作用域\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\n );\n return this.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 有子元素的节点,则将子元素纳入覆盖作用域\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // 下个节点处理\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // 私有作用域不能被后续节点访问\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformCovers(covers, { scope });\n }\n\n // 当前 parent 有 next 节点,则停止向上查找\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformCovers(covers, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n // 排序所有作用域\n sortAll(): Scope[] {\n const 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"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}
|
|
1
|
+
{"version":3,"sources":["../../src/flow-node-variable-data.ts","../../src/types.ts","../../src/chains/free-layout-scope-chain.ts","../../src/variable-layout-config.ts","../../src/scopes/global-scope.ts","../../src/chains/fixed-layout-scope-chain.ts"],"sourcesContent":["import { VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n get private() {\n return this._private;\n }\n\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n // 1. Notify the covering scopes of private to update dependencies\n this._private.coverScopes.forEach((_scope) => {\n _scope.refreshDeps();\n });\n // 2. Notify the dependent scopes of private to update their covers\n this._private.depScopes.forEach((_scope) => {\n _scope.refreshCovers();\n });\n // 3. The private scope itself needs to refresh its dependencies\n this._private.available.refresh();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport enum FlowNodeScopeTypeEnum {\n public = 'public',\n private = 'private',\n}\n\nexport interface FlowNodeScopeMeta {\n node?: FlowNodeEntity;\n type?: FlowNodeScopeTypeEnum;\n}\n\nexport interface ScopeVirtualNode {\n id: string;\n flowNodeType: 'virtualNode';\n}\n\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n// 节点内部的作用域\nexport type FlowNodeScope = Scope<FlowNodeScopeMeta>;\n","import { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeEntity, FlowDocument, FlowVirtualTree } from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\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 get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // 线条发生变化时,会触发作用域链的更新\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // 树变化时候刷新作用域\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n // 获取同一层级所有输入节点\n protected getAllInputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const 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.getParent(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.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 return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n }\n\n // 2. 获取所有覆盖节点的 public、private 作用域\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. 如果当前 scope 是 private,则当前节点的 public 也可覆盖\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformCovers(uniqScopes, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n getChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getFreeChildren) {\n return this.configs.getFreeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // 子画布本身不存在 children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n return this.tree.getChildren(node);\n }\n\n getParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n if (this.configs?.getFreeParent) {\n return this.configs.getFreeParent(node);\n }\n const initParent = node.document.originTree.getParent(node);\n\n if (!initParent) {\n return initParent;\n }\n\n const nodeMeta = initParent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(initParent);\n if (subCanvas?.isCanvas) {\n return subCanvas.parentNode;\n }\n\n return initParent;\n }\n\n sortAll(): Scope[] {\n // 暂未实现\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity, FlowDocument } from '@flowgram.ai/document';\n\nimport { type FlowNodeScope, type ScopeChainNode } from './types';\n\ninterface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport interface VariableLayoutConfig {\n /**\n * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * 用于自由画布场景,部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需要可配置化\n */\n getFreeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getFreeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * 对依赖作用域进行微调\n */\n transformDeps?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n}\n\nexport const VariableLayoutConfig = Symbol('VariableLayoutConfig');\n","import { injectable, interfaces } from 'inversify';\nimport { ASTNode, ASTNodeJSON, 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): scope is GlobalScope {\n return scope.id === GlobalScope.ID;\n }\n\n /**\n * Sets a variable in the Global Scope 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 Global Scope with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.ast.get(key);\n }\n\n /**\n * Clears a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.ast.remove(key);\n }\n}\n\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","import { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { 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 constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig\n ) {\n super();\n\n // 绑定 flowDocument 里面的树\n this.bindTree(flowDocument.originTree);\n\n // originTree 发生变化时,触发依赖关系的变化\n this.toDispose.push(\n // REFRACTOR: onTreeChange 触发时机精细化\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n // 绑定树\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n // 获取依赖作用域\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 包含子节点,且不是私有作用域\n\n if (curr === node) {\n // public 可以依赖 private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // 有子元素的节点,则将子元素纳入依赖作用域\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // 节点的 public 都可以被访问\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // 上个节点处理\n if (pre) {\n curr = pre;\n continue;\n }\n\n // 父节点处理\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // 父节点的 private 和 public 都能被子节点访问\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // 当前 parent 有 pre 节点,则停止向上查找\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n // 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.transformDeps(deps, { scope });\n }\n\n // 获取覆盖作用域\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\n );\n return this.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 有子元素的节点,则将子元素纳入覆盖作用域\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // 下个节点处理\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // 私有作用域不能被后续节点访问\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformCovers(covers, { scope });\n }\n\n // 当前 parent 有 next 节点,则停止向上查找\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformCovers(covers, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n // 排序所有作用域\n sortAll(): Scope[] {\n const 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"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}
|
package/dist/index.js
CHANGED
|
@@ -111,8 +111,7 @@ var FlowNodeVariableData = class extends import_core.EntityData {
|
|
|
111
111
|
* @returns The value of the variable, or undefined if not found.
|
|
112
112
|
*/
|
|
113
113
|
getPrivateVar(key = "outputs") {
|
|
114
|
-
|
|
115
|
-
return (_a = this.private) == null ? void 0 : _a.ast.get(key);
|
|
114
|
+
return this.private?.ast.get(key);
|
|
116
115
|
}
|
|
117
116
|
/**
|
|
118
117
|
* Clears a variable from the private AST (Abstract Syntax Tree) by key.
|
|
@@ -121,8 +120,7 @@ var FlowNodeVariableData = class extends import_core.EntityData {
|
|
|
121
120
|
* @returns The updated AST node.
|
|
122
121
|
*/
|
|
123
122
|
clearPrivateVar(key = "outputs") {
|
|
124
|
-
|
|
125
|
-
return (_a = this.private) == null ? void 0 : _a.ast.remove(key);
|
|
123
|
+
return this.private?.ast.remove(key);
|
|
126
124
|
}
|
|
127
125
|
get allScopes() {
|
|
128
126
|
const res = [];
|
|
@@ -243,15 +241,13 @@ var FreeLayoutScopeChain = class extends import_variable_core2.ScopeChain {
|
|
|
243
241
|
}
|
|
244
242
|
// 获取同一层级所有输入节点
|
|
245
243
|
getAllInputLayerNodes(curr) {
|
|
246
|
-
|
|
247
|
-
return (((_a = curr.getData(import_free_layout_core.WorkflowNodeLinesData)) == null ? void 0 : _a.allInputNodes) || []).filter(
|
|
244
|
+
return (curr.getData(import_free_layout_core.WorkflowNodeLinesData)?.allInputNodes || []).filter(
|
|
248
245
|
(_node) => _node.parent === curr.parent
|
|
249
246
|
);
|
|
250
247
|
}
|
|
251
248
|
// 获取同一层级所有输出节点
|
|
252
249
|
getAllOutputLayerNodes(curr) {
|
|
253
|
-
|
|
254
|
-
return (((_a = curr.getData(import_free_layout_core.WorkflowNodeLinesData)) == null ? void 0 : _a.allOutputNodes) || []).filter(
|
|
250
|
+
return (curr.getData(import_free_layout_core.WorkflowNodeLinesData)?.allOutputNodes || []).filter(
|
|
255
251
|
(_node) => _node.parent === curr.parent
|
|
256
252
|
);
|
|
257
253
|
}
|
|
@@ -268,7 +264,7 @@ var FreeLayoutScopeChain = class extends import_variable_core2.ScopeChain {
|
|
|
268
264
|
...allInputNodes.map((_node) => _node.getData(FlowNodeVariableData).public).filter(Boolean)
|
|
269
265
|
);
|
|
270
266
|
const currVarData = curr.getData(FlowNodeVariableData);
|
|
271
|
-
if (
|
|
267
|
+
if (currVarData?.private && scope !== currVarData.private) {
|
|
272
268
|
deps.push(currVarData.private);
|
|
273
269
|
}
|
|
274
270
|
curr = this.getParent(curr);
|
|
@@ -301,7 +297,7 @@ var FreeLayoutScopeChain = class extends import_variable_core2.ScopeChain {
|
|
|
301
297
|
const variableData = _node.getData(FlowNodeVariableData);
|
|
302
298
|
scopes.push(...variableData.allScopes);
|
|
303
299
|
const children = _node && this.getChildren(_node);
|
|
304
|
-
if (children
|
|
300
|
+
if (children?.length) {
|
|
305
301
|
queue.push(...children);
|
|
306
302
|
}
|
|
307
303
|
}
|
|
@@ -313,28 +309,25 @@ var FreeLayoutScopeChain = class extends import_variable_core2.ScopeChain {
|
|
|
313
309
|
return this.transformCovers(uniqScopes, { scope });
|
|
314
310
|
}
|
|
315
311
|
transformCovers(covers, { scope }) {
|
|
316
|
-
|
|
317
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformCovers) ? this.configs.transformCovers(covers, {
|
|
312
|
+
return this.configs?.transformCovers ? this.configs.transformCovers(covers, {
|
|
318
313
|
scope,
|
|
319
314
|
document: this.flowDocument,
|
|
320
315
|
variableEngine: this.variableEngine
|
|
321
316
|
}) : covers;
|
|
322
317
|
}
|
|
323
318
|
transformDeps(deps, { scope }) {
|
|
324
|
-
|
|
325
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformDeps) ? this.configs.transformDeps(deps, {
|
|
319
|
+
return this.configs?.transformDeps ? this.configs.transformDeps(deps, {
|
|
326
320
|
scope,
|
|
327
321
|
document: this.flowDocument,
|
|
328
322
|
variableEngine: this.variableEngine
|
|
329
323
|
}) : deps;
|
|
330
324
|
}
|
|
331
325
|
getChildren(node) {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
return (_c = (_b = this.configs).getFreeChildren) == null ? void 0 : _c.call(_b, node);
|
|
326
|
+
if (this.configs?.getFreeChildren) {
|
|
327
|
+
return this.configs.getFreeChildren?.(node);
|
|
335
328
|
}
|
|
336
329
|
const nodeMeta = node.getNodeMeta();
|
|
337
|
-
const subCanvas =
|
|
330
|
+
const subCanvas = nodeMeta.subCanvas?.(node);
|
|
338
331
|
if (subCanvas) {
|
|
339
332
|
if (subCanvas.isCanvas) {
|
|
340
333
|
return [];
|
|
@@ -345,8 +338,7 @@ var FreeLayoutScopeChain = class extends import_variable_core2.ScopeChain {
|
|
|
345
338
|
return this.tree.getChildren(node);
|
|
346
339
|
}
|
|
347
340
|
getParent(node) {
|
|
348
|
-
|
|
349
|
-
if ((_a = this.configs) == null ? void 0 : _a.getFreeParent) {
|
|
341
|
+
if (this.configs?.getFreeParent) {
|
|
350
342
|
return this.configs.getFreeParent(node);
|
|
351
343
|
}
|
|
352
344
|
const initParent = node.document.originTree.getParent(node);
|
|
@@ -354,8 +346,8 @@ var FreeLayoutScopeChain = class extends import_variable_core2.ScopeChain {
|
|
|
354
346
|
return initParent;
|
|
355
347
|
}
|
|
356
348
|
const nodeMeta = initParent.getNodeMeta();
|
|
357
|
-
const subCanvas =
|
|
358
|
-
if (subCanvas
|
|
349
|
+
const subCanvas = nodeMeta.subCanvas?.(initParent);
|
|
350
|
+
if (subCanvas?.isCanvas) {
|
|
359
351
|
return subCanvas.parentNode;
|
|
360
352
|
}
|
|
361
353
|
return initParent;
|
|
@@ -415,7 +407,7 @@ var FixedLayoutScopeChain = class extends import_variable_core3.ScopeChain {
|
|
|
415
407
|
const { parent, pre } = this.tree.getInfo(curr);
|
|
416
408
|
const currData = this.getVariableData(curr);
|
|
417
409
|
if (curr === node) {
|
|
418
|
-
if (scope.meta.type === "public" /* public */ &&
|
|
410
|
+
if (scope.meta.type === "public" /* public */ && currData?.private) {
|
|
419
411
|
deps.unshift(currData.private);
|
|
420
412
|
}
|
|
421
413
|
} else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {
|
|
@@ -521,16 +513,14 @@ var FixedLayoutScopeChain = class extends import_variable_core3.ScopeChain {
|
|
|
521
513
|
return this.transformCovers(covers, { scope });
|
|
522
514
|
}
|
|
523
515
|
transformCovers(covers, { scope }) {
|
|
524
|
-
|
|
525
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformCovers) ? this.configs.transformCovers(covers, {
|
|
516
|
+
return this.configs?.transformCovers ? this.configs.transformCovers(covers, {
|
|
526
517
|
scope,
|
|
527
518
|
document: this.flowDocument,
|
|
528
519
|
variableEngine: this.variableEngine
|
|
529
520
|
}) : covers;
|
|
530
521
|
}
|
|
531
522
|
transformDeps(deps, { scope }) {
|
|
532
|
-
|
|
533
|
-
return ((_a = this.configs) == null ? void 0 : _a.transformDeps) ? this.configs.transformDeps(deps, {
|
|
523
|
+
return this.configs?.transformDeps ? this.configs.transformDeps(deps, {
|
|
534
524
|
scope,
|
|
535
525
|
document: this.flowDocument,
|
|
536
526
|
variableEngine: this.variableEngine
|
|
@@ -562,11 +552,10 @@ var FixedLayoutScopeChain = class extends import_variable_core3.ScopeChain {
|
|
|
562
552
|
}
|
|
563
553
|
// privateScope:子节点不可以被后续节点访问
|
|
564
554
|
isNodeChildrenPrivate(node) {
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
return node ? (_b = this.configs) == null ? void 0 : _b.isNodeChildrenPrivate(node) : false;
|
|
555
|
+
if (this.configs?.isNodeChildrenPrivate) {
|
|
556
|
+
return node ? this.configs?.isNodeChildrenPrivate(node) : false;
|
|
568
557
|
}
|
|
569
|
-
const isSystemNode = node
|
|
558
|
+
const isSystemNode = node?.id.startsWith("$");
|
|
570
559
|
return !isSystemNode && this.hasChildren(node);
|
|
571
560
|
}
|
|
572
561
|
hasChildren(node) {
|
|
@@ -577,7 +566,6 @@ var FixedLayoutScopeChain = class extends import_variable_core3.ScopeChain {
|
|
|
577
566
|
ignoreNodeChildrenPrivate,
|
|
578
567
|
addNodePrivateScope
|
|
579
568
|
} = {}) {
|
|
580
|
-
var _a;
|
|
581
569
|
const scopes = [];
|
|
582
570
|
const variableData = this.getVariableData(node);
|
|
583
571
|
if (variableData) {
|
|
@@ -586,10 +574,10 @@ var FixedLayoutScopeChain = class extends import_variable_core3.ScopeChain {
|
|
|
586
574
|
if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {
|
|
587
575
|
return scopes;
|
|
588
576
|
}
|
|
589
|
-
if (addNodePrivateScope &&
|
|
577
|
+
if (addNodePrivateScope && variableData?.private) {
|
|
590
578
|
scopes.push(variableData.private);
|
|
591
579
|
}
|
|
592
|
-
const children =
|
|
580
|
+
const children = this.tree?.getChildren(node) || [];
|
|
593
581
|
scopes.push(
|
|
594
582
|
...children.map(
|
|
595
583
|
(child) => this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope })
|
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/scopes/global-scope.ts","../src/chains/fixed-layout-scope-chain.ts"],"sourcesContent":["export { 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';\n","import { VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n get private() {\n return this._private;\n }\n\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n // 1. Notify the covering scopes of private to update dependencies\n this._private.coverScopes.forEach((_scope) => {\n _scope.refreshDeps();\n });\n // 2. Notify the dependent scopes of private to update their covers\n this._private.depScopes.forEach((_scope) => {\n _scope.refreshCovers();\n });\n // 3. The private scope itself needs to refresh its dependencies\n this._private.available.refresh();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport enum FlowNodeScopeTypeEnum {\n public = 'public',\n private = 'private',\n}\n\nexport interface FlowNodeScopeMeta {\n node?: FlowNodeEntity;\n type?: FlowNodeScopeTypeEnum;\n}\n\nexport interface ScopeVirtualNode {\n id: string;\n flowNodeType: 'virtualNode';\n}\n\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n// 节点内部的作用域\nexport type FlowNodeScope = Scope<FlowNodeScopeMeta>;\n","import { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeEntity, FlowDocument, FlowVirtualTree } from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\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 get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // 线条发生变化时,会触发作用域链的更新\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // 树变化时候刷新作用域\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n // 获取同一层级所有输入节点\n protected getAllInputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const 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.getParent(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.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 return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n }\n\n // 2. 获取所有覆盖节点的 public、private 作用域\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. 如果当前 scope 是 private,则当前节点的 public 也可覆盖\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformCovers(uniqScopes, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n getChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getFreeChildren) {\n return this.configs.getFreeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // 子画布本身不存在 children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n return this.tree.getChildren(node);\n }\n\n getParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n if (this.configs?.getFreeParent) {\n return this.configs.getFreeParent(node);\n }\n const initParent = node.document.originTree.getParent(node);\n\n if (!initParent) {\n return initParent;\n }\n\n const nodeMeta = initParent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(initParent);\n if (subCanvas?.isCanvas) {\n return subCanvas.parentNode;\n }\n\n return initParent;\n }\n\n sortAll(): Scope[] {\n // 暂未实现\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity, FlowDocument } from '@flowgram.ai/document';\n\nimport { type FlowNodeScope, type ScopeChainNode } from './types';\n\ninterface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport interface VariableLayoutConfig {\n /**\n * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * 用于自由画布场景,部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需要可配置化\n */\n getFreeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getFreeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * 对依赖作用域进行微调\n */\n transformDeps?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n}\n\nexport const VariableLayoutConfig = Symbol('VariableLayoutConfig');\n","import { injectable, interfaces } from 'inversify';\nimport { ASTNode, ASTNodeJSON, 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): scope is GlobalScope {\n return scope.id === GlobalScope.ID;\n }\n\n /**\n * Sets a variable in the Global Scope 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 Global Scope with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.ast.get(key);\n }\n\n /**\n * Clears a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.ast.remove(key);\n }\n}\n\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","import { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { 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 constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig\n ) {\n super();\n\n // 绑定 flowDocument 里面的树\n this.bindTree(flowDocument.originTree);\n\n // originTree 发生变化时,触发依赖关系的变化\n this.toDispose.push(\n // REFRACTOR: onTreeChange 触发时机精细化\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n // 绑定树\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n // 获取依赖作用域\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 包含子节点,且不是私有作用域\n\n if (curr === node) {\n // public 可以依赖 private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // 有子元素的节点,则将子元素纳入依赖作用域\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // 节点的 public 都可以被访问\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // 上个节点处理\n if (pre) {\n curr = pre;\n continue;\n }\n\n // 父节点处理\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // 父节点的 private 和 public 都能被子节点访问\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // 当前 parent 有 pre 节点,则停止向上查找\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n // 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.transformDeps(deps, { scope });\n }\n\n // 获取覆盖作用域\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\n );\n return this.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 有子元素的节点,则将子元素纳入覆盖作用域\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // 下个节点处理\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // 私有作用域不能被后续节点访问\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformCovers(covers, { scope });\n }\n\n // 当前 parent 有 next 节点,则停止向上查找\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformCovers(covers, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n // 排序所有作用域\n sortAll(): Scope[] {\n const 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"],"mappings":"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","names":["FlowNodeScopeTypeEnum","import_inversify","import_variable_core","import_core","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-layout-config.ts","../src/scopes/global-scope.ts","../src/chains/fixed-layout-scope-chain.ts"],"sourcesContent":["export { 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';\n","import { VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n get private() {\n return this._private;\n }\n\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n // 1. Notify the covering scopes of private to update dependencies\n this._private.coverScopes.forEach((_scope) => {\n _scope.refreshDeps();\n });\n // 2. Notify the dependent scopes of private to update their covers\n this._private.depScopes.forEach((_scope) => {\n _scope.refreshCovers();\n });\n // 3. The private scope itself needs to refresh its dependencies\n this._private.available.refresh();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport enum FlowNodeScopeTypeEnum {\n public = 'public',\n private = 'private',\n}\n\nexport interface FlowNodeScopeMeta {\n node?: FlowNodeEntity;\n type?: FlowNodeScopeTypeEnum;\n}\n\nexport interface ScopeVirtualNode {\n id: string;\n flowNodeType: 'virtualNode';\n}\n\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n// 节点内部的作用域\nexport type FlowNodeScope = Scope<FlowNodeScopeMeta>;\n","import { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport { FlowNodeEntity, FlowDocument, FlowVirtualTree } from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\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 get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // 线条发生变化时,会触发作用域链的更新\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // 树变化时候刷新作用域\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n // 获取同一层级所有输入节点\n protected getAllInputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allInputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n return (curr.getData(WorkflowNodeLinesData)?.allOutputNodes || []).filter(\n (_node) => _node.parent === curr.parent\n );\n }\n\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const 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.getParent(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.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 return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n }\n\n // 2. 获取所有覆盖节点的 public、private 作用域\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. 如果当前 scope 是 private,则当前节点的 public 也可覆盖\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformCovers(uniqScopes, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n getChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getFreeChildren) {\n return this.configs.getFreeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // 子画布本身不存在 children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n return this.tree.getChildren(node);\n }\n\n getParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n if (this.configs?.getFreeParent) {\n return this.configs.getFreeParent(node);\n }\n const initParent = node.document.originTree.getParent(node);\n\n if (!initParent) {\n return initParent;\n }\n\n const nodeMeta = initParent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(initParent);\n if (subCanvas?.isCanvas) {\n return subCanvas.parentNode;\n }\n\n return initParent;\n }\n\n sortAll(): Scope[] {\n // 暂未实现\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","import { Scope } from '@flowgram.ai/variable-core';\nimport { VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity, FlowDocument } from '@flowgram.ai/document';\n\nimport { type FlowNodeScope, type ScopeChainNode } from './types';\n\ninterface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport interface VariableLayoutConfig {\n /**\n * 节点的子节点输出变量,不能被后续节点所访问,用于固定布局场景\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * 用于自由画布场景,部分场景通过连线或者其他交互形式来表达节点之间的父子关系,需要可配置化\n */\n getFreeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getFreeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * 对依赖作用域进行微调\n */\n transformDeps?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: (scopes: Scope[], ctx: TransformerContext) => Scope[];\n}\n\nexport const VariableLayoutConfig = Symbol('VariableLayoutConfig');\n","import { injectable, interfaces } from 'inversify';\nimport { ASTNode, ASTNodeJSON, 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): scope is GlobalScope {\n return scope.id === GlobalScope.ID;\n }\n\n /**\n * Sets a variable in the Global Scope 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 Global Scope with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.ast.get(key);\n }\n\n /**\n * Clears a variable from the Global Scope by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.ast.remove(key);\n }\n}\n\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","import { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableLayoutConfig } from '../variable-layout-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { 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 constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableLayoutConfig)\n protected configs?: VariableLayoutConfig\n ) {\n super();\n\n // 绑定 flowDocument 里面的树\n this.bindTree(flowDocument.originTree);\n\n // originTree 发生变化时,触发依赖关系的变化\n this.toDispose.push(\n // REFRACTOR: onTreeChange 触发时机精细化\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n // 绑定树\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n // 获取依赖作用域\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 包含子节点,且不是私有作用域\n\n if (curr === node) {\n // public 可以依赖 private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // 有子元素的节点,则将子元素纳入依赖作用域\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // 节点的 public 都可以被访问\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // 上个节点处理\n if (pre) {\n curr = pre;\n continue;\n }\n\n // 父节点处理\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // 父节点的 private 和 public 都能被子节点访问\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // 当前 parent 有 pre 节点,则停止向上查找\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n // 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.transformDeps(deps, { scope });\n }\n\n // 获取覆盖作用域\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n return this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n })\n );\n return this.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 有子元素的节点,则将子元素纳入覆盖作用域\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // 下个节点处理\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // 私有作用域不能被后续节点访问\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformCovers(covers, { scope });\n }\n\n // 当前 parent 有 next 节点,则停止向上查找\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformCovers(covers, { scope });\n }\n\n protected transformCovers(covers: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformCovers\n ? this.configs.transformCovers(covers, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : covers;\n }\n\n protected transformDeps(deps: Scope[], { scope }: { scope: Scope }): Scope[] {\n return this.configs?.transformDeps\n ? this.configs.transformDeps(deps, {\n scope,\n document: this.flowDocument,\n variableEngine: this.variableEngine,\n })\n : deps;\n }\n\n // 排序所有作用域\n sortAll(): Scope[] {\n const 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"],"mappings":"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","names":["FlowNodeScopeTypeEnum","import_inversify","import_variable_core","import_core","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.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.9",
|
|
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/
|
|
23
|
-
"@flowgram.ai/
|
|
24
|
-
"@flowgram.ai/
|
|
25
|
-
"@flowgram.ai/utils": "0.1.0-alpha.
|
|
26
|
-
"@flowgram.ai/
|
|
22
|
+
"@flowgram.ai/document": "0.1.0-alpha.9",
|
|
23
|
+
"@flowgram.ai/variable-core": "0.1.0-alpha.9",
|
|
24
|
+
"@flowgram.ai/core": "0.1.0-alpha.9",
|
|
25
|
+
"@flowgram.ai/utils": "0.1.0-alpha.9",
|
|
26
|
+
"@flowgram.ai/free-layout-core": "0.1.0-alpha.9"
|
|
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/
|
|
35
|
-
"@flowgram.ai/
|
|
34
|
+
"@flowgram.ai/eslint-config": "0.1.0-alpha.9",
|
|
35
|
+
"@flowgram.ai/ts-config": "0.1.0-alpha.9"
|
|
36
36
|
},
|
|
37
37
|
"publishConfig": {
|
|
38
38
|
"access": "public",
|