@flowgram.ai/variable-layout 0.5.4 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +116 -14
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +189 -9
- package/dist/index.d.ts +189 -9
- package/dist/index.js +116 -14
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/dist/esm/index.js
CHANGED
|
@@ -33,9 +33,15 @@ var FlowNodeVariableData = class extends EntityData {
|
|
|
33
33
|
});
|
|
34
34
|
this.toDispose.push(this._public);
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* The private scope of the node.
|
|
38
|
+
*/
|
|
36
39
|
get private() {
|
|
37
40
|
return this._private;
|
|
38
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* The public scope of the node.
|
|
44
|
+
*/
|
|
39
45
|
get public() {
|
|
40
46
|
return this._public;
|
|
41
47
|
}
|
|
@@ -93,6 +99,9 @@ var FlowNodeVariableData = class extends EntityData {
|
|
|
93
99
|
clearPrivateVar(key = "outputs") {
|
|
94
100
|
return this.private?.ast.remove(key);
|
|
95
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* An array containing all scopes (public and private) of the node.
|
|
104
|
+
*/
|
|
96
105
|
get allScopes() {
|
|
97
106
|
const res = [];
|
|
98
107
|
if (this._public) {
|
|
@@ -106,6 +115,11 @@ var FlowNodeVariableData = class extends EntityData {
|
|
|
106
115
|
getDefaultData() {
|
|
107
116
|
return {};
|
|
108
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Initializes and returns the private scope for the node.
|
|
120
|
+
* If the private scope already exists, it returns the existing one.
|
|
121
|
+
* @returns The private scope of the node.
|
|
122
|
+
*/
|
|
109
123
|
initPrivate() {
|
|
110
124
|
if (!this._private) {
|
|
111
125
|
this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {
|
|
@@ -177,11 +191,17 @@ var ScopeChainTransformService = class {
|
|
|
177
191
|
/**
|
|
178
192
|
* register new transform function
|
|
179
193
|
* @param transformerId used to identify transformer, prevent duplicated transformer
|
|
180
|
-
* @param transformer
|
|
194
|
+
* @param transformer The transformer to register.
|
|
181
195
|
*/
|
|
182
196
|
registerTransformer(transformerId, transformer) {
|
|
183
197
|
this.transformerMap.set(transformerId, transformer);
|
|
184
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Transforms the dependency scopes.
|
|
201
|
+
* @param scopes The array of scopes to transform.
|
|
202
|
+
* @param param1 The context for the transformation.
|
|
203
|
+
* @returns The transformed array of scopes.
|
|
204
|
+
*/
|
|
185
205
|
transformDeps(scopes, { scope }) {
|
|
186
206
|
return Array.from(this.transformerMap.values()).reduce((scopes2, transformer) => {
|
|
187
207
|
if (!transformer.transformDeps) {
|
|
@@ -195,6 +215,12 @@ var ScopeChainTransformService = class {
|
|
|
195
215
|
return scopes2;
|
|
196
216
|
}, scopes);
|
|
197
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* Transforms the cover scopes.
|
|
220
|
+
* @param scopes The array of scopes to transform.
|
|
221
|
+
* @param param1 The context for the transformation.
|
|
222
|
+
* @returns The transformed array of scopes.
|
|
223
|
+
*/
|
|
198
224
|
transformCovers(scopes, { scope }) {
|
|
199
225
|
return Array.from(this.transformerMap.values()).reduce((scopes2, transformer) => {
|
|
200
226
|
if (!transformer.transformCovers) {
|
|
@@ -225,6 +251,11 @@ ScopeChainTransformService = __decorateClass([
|
|
|
225
251
|
import { injectable as injectable2 } from "inversify";
|
|
226
252
|
import { Scope as Scope2, VariableEngine as VariableEngine2 } from "@flowgram.ai/variable-core";
|
|
227
253
|
var GlobalScope = class extends Scope2 {
|
|
254
|
+
/**
|
|
255
|
+
* Check if the scope is Global Scope.
|
|
256
|
+
* @param scope
|
|
257
|
+
* @returns
|
|
258
|
+
*/
|
|
228
259
|
static is(scope) {
|
|
229
260
|
return scope.id === GlobalScope.ID;
|
|
230
261
|
}
|
|
@@ -251,24 +282,31 @@ var bindGlobalScope = (bind) => {
|
|
|
251
282
|
|
|
252
283
|
// src/chains/free-layout-scope-chain.ts
|
|
253
284
|
var FreeLayoutScopeChain = class extends ScopeChain {
|
|
285
|
+
/**
|
|
286
|
+
* The virtual tree of the flow document.
|
|
287
|
+
*/
|
|
254
288
|
get tree() {
|
|
255
289
|
return this.flowDocument.originTree;
|
|
256
290
|
}
|
|
257
291
|
onInit() {
|
|
258
292
|
this.toDispose.pushAll([
|
|
259
|
-
//
|
|
293
|
+
// When the line changes, the scope chain will be updated
|
|
260
294
|
this.entityManager.onEntityDataChange(({ entityDataType }) => {
|
|
261
295
|
if (entityDataType === WorkflowNodeLinesData.type) {
|
|
262
296
|
this.refreshAllChange();
|
|
263
297
|
}
|
|
264
298
|
}),
|
|
265
|
-
//
|
|
299
|
+
// Refresh the scope when the tree changes
|
|
266
300
|
this.tree.onTreeChange(() => {
|
|
267
301
|
this.refreshAllChange();
|
|
268
302
|
})
|
|
269
303
|
]);
|
|
270
304
|
}
|
|
271
|
-
|
|
305
|
+
/**
|
|
306
|
+
* Gets all input layer nodes for a given node in the same layer, sorted by distance.
|
|
307
|
+
* @param node The node to get input layer nodes for.
|
|
308
|
+
* @returns An array of input layer nodes.
|
|
309
|
+
*/
|
|
272
310
|
getAllInputLayerNodes(node) {
|
|
273
311
|
const currParent = this.getNodeParent(node);
|
|
274
312
|
const result = /* @__PURE__ */ new Set();
|
|
@@ -287,13 +325,22 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
287
325
|
}
|
|
288
326
|
return Array.from(result).reverse();
|
|
289
327
|
}
|
|
290
|
-
|
|
328
|
+
/**
|
|
329
|
+
* Gets all output layer nodes for a given node in the same layer.
|
|
330
|
+
* @param curr The node to get output layer nodes for.
|
|
331
|
+
* @returns An array of output layer nodes.
|
|
332
|
+
*/
|
|
291
333
|
getAllOutputLayerNodes(curr) {
|
|
292
334
|
const currParent = this.getNodeParent(curr);
|
|
293
335
|
return (curr.lines?.allOutputNodes || []).filter(
|
|
294
336
|
(_node) => this.getNodeParent(_node) === currParent
|
|
295
337
|
);
|
|
296
338
|
}
|
|
339
|
+
/**
|
|
340
|
+
* Gets the dependency scopes for a given scope.
|
|
341
|
+
* @param scope The scope to get dependencies for.
|
|
342
|
+
* @returns An array of dependency scopes.
|
|
343
|
+
*/
|
|
297
344
|
getDeps(scope) {
|
|
298
345
|
const { node } = scope.meta || {};
|
|
299
346
|
if (!node) {
|
|
@@ -323,6 +370,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
323
370
|
const uniqDeps = Array.from(new Set(deps));
|
|
324
371
|
return this.transformService.transformDeps(uniqDeps, { scope });
|
|
325
372
|
}
|
|
373
|
+
/**
|
|
374
|
+
* Gets the covering scopes for a given scope.
|
|
375
|
+
* @param scope The scope to get covering scopes for.
|
|
376
|
+
* @returns An array of covering scopes.
|
|
377
|
+
*/
|
|
326
378
|
getCovers(scope) {
|
|
327
379
|
if (GlobalScope.is(scope)) {
|
|
328
380
|
const scopes2 = this.variableEngine.getAllScopes({ sort: true }).filter((_scope) => !GlobalScope.is(_scope));
|
|
@@ -364,6 +416,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
364
416
|
const uniqScopes = Array.from(new Set(scopes));
|
|
365
417
|
return this.transformService.transformCovers(uniqScopes, { scope });
|
|
366
418
|
}
|
|
419
|
+
/**
|
|
420
|
+
* Gets the children of a node.
|
|
421
|
+
* @param node The node to get children for.
|
|
422
|
+
* @returns An array of child nodes.
|
|
423
|
+
*/
|
|
367
424
|
getNodeChildren(node) {
|
|
368
425
|
if (this.configs?.getNodeChildren) {
|
|
369
426
|
return this.configs.getNodeChildren?.(node);
|
|
@@ -393,6 +450,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
393
450
|
...this.getAllPublicChildScopes(_node)
|
|
394
451
|
]).flat();
|
|
395
452
|
}
|
|
453
|
+
/**
|
|
454
|
+
* Gets the parent of a node.
|
|
455
|
+
* @param node The node to get the parent for.
|
|
456
|
+
* @returns The parent node or `undefined` if not found.
|
|
457
|
+
*/
|
|
396
458
|
getNodeParent(node) {
|
|
397
459
|
if (this.configs?.getNodeParent) {
|
|
398
460
|
return this.configs.getNodeParent(node);
|
|
@@ -411,7 +473,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
411
473
|
}
|
|
412
474
|
return parent;
|
|
413
475
|
}
|
|
414
|
-
|
|
476
|
+
/**
|
|
477
|
+
* Checks if the children of a node are private and cannot be accessed by subsequent nodes.
|
|
478
|
+
* @param node The node to check.
|
|
479
|
+
* @returns `true` if the children are private, `false` otherwise.
|
|
480
|
+
*/
|
|
415
481
|
isNodeChildrenPrivate(node) {
|
|
416
482
|
if (this.configs?.isNodeChildrenPrivate) {
|
|
417
483
|
return node ? this.configs?.isNodeChildrenPrivate(node) : false;
|
|
@@ -419,6 +485,10 @@ var FreeLayoutScopeChain = class extends ScopeChain {
|
|
|
419
485
|
const isSystemNode = node?.id.startsWith("$");
|
|
420
486
|
return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;
|
|
421
487
|
}
|
|
488
|
+
/**
|
|
489
|
+
* Sorts all scopes in the scope chain.
|
|
490
|
+
* @returns An empty array, as this method is not implemented.
|
|
491
|
+
*/
|
|
422
492
|
sortAll() {
|
|
423
493
|
console.warn("FreeLayoutScopeChain.sortAll is not implemented");
|
|
424
494
|
return [];
|
|
@@ -452,17 +522,24 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
452
522
|
this.configs = configs;
|
|
453
523
|
this.bindTree(flowDocument.originTree);
|
|
454
524
|
this.toDispose.push(
|
|
455
|
-
// REFRACTOR: onTreeChange
|
|
525
|
+
// REFRACTOR: onTreeChange trigger timing needs to be refined
|
|
456
526
|
flowDocument.originTree.onTreeChange(() => {
|
|
457
527
|
this.refreshAllChange();
|
|
458
528
|
})
|
|
459
529
|
);
|
|
460
530
|
}
|
|
461
|
-
|
|
531
|
+
/**
|
|
532
|
+
* Binds the scope chain to a `FlowVirtualTree`.
|
|
533
|
+
* @param tree The `FlowVirtualTree` to bind to.
|
|
534
|
+
*/
|
|
462
535
|
bindTree(tree) {
|
|
463
536
|
this.tree = tree;
|
|
464
537
|
}
|
|
465
|
-
|
|
538
|
+
/**
|
|
539
|
+
* Gets the dependency scopes for a given scope.
|
|
540
|
+
* @param scope The scope to get dependencies for.
|
|
541
|
+
* @returns An array of dependency scopes.
|
|
542
|
+
*/
|
|
466
543
|
getDeps(scope) {
|
|
467
544
|
if (!this.tree) {
|
|
468
545
|
return this.transformService.transformDeps([], { scope });
|
|
@@ -519,7 +596,11 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
519
596
|
}
|
|
520
597
|
return this.transformService.transformDeps(deps, { scope });
|
|
521
598
|
}
|
|
522
|
-
|
|
599
|
+
/**
|
|
600
|
+
* Gets the covering scopes for a given scope.
|
|
601
|
+
* @param scope The scope to get covering scopes for.
|
|
602
|
+
* @returns An array of covering scopes.
|
|
603
|
+
*/
|
|
523
604
|
getCovers(scope) {
|
|
524
605
|
if (!this.tree) {
|
|
525
606
|
return this.transformService.transformCovers([], { scope });
|
|
@@ -583,7 +664,10 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
583
664
|
}
|
|
584
665
|
return this.transformService.transformCovers(covers, { scope });
|
|
585
666
|
}
|
|
586
|
-
|
|
667
|
+
/**
|
|
668
|
+
* Sorts all scopes in the scope chain.
|
|
669
|
+
* @returns A sorted array of all scopes.
|
|
670
|
+
*/
|
|
587
671
|
sortAll() {
|
|
588
672
|
const startNode = this.flowDocument.getAllNodes().find((_node) => _node.isStart);
|
|
589
673
|
if (!startNode) {
|
|
@@ -597,7 +681,11 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
597
681
|
);
|
|
598
682
|
return [...deps, startPublicScope, ...covers];
|
|
599
683
|
}
|
|
600
|
-
|
|
684
|
+
/**
|
|
685
|
+
* Gets the `FlowNodeVariableData` for a given `ScopeChainNode`.
|
|
686
|
+
* @param node The `ScopeChainNode` to get data for.
|
|
687
|
+
* @returns The `FlowNodeVariableData` or `undefined` if not found.
|
|
688
|
+
*/
|
|
601
689
|
getVariableData(node) {
|
|
602
690
|
if (node.flowNodeType === "virtualNode") {
|
|
603
691
|
return;
|
|
@@ -607,7 +695,11 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
607
695
|
}
|
|
608
696
|
return node.getData(FlowNodeVariableData);
|
|
609
697
|
}
|
|
610
|
-
|
|
698
|
+
/**
|
|
699
|
+
* Checks if the children of a node are private.
|
|
700
|
+
* @param node The node to check.
|
|
701
|
+
* @returns `true` if the children are private, `false` otherwise.
|
|
702
|
+
*/
|
|
611
703
|
isNodeChildrenPrivate(node) {
|
|
612
704
|
if (this.configs?.isNodeChildrenPrivate) {
|
|
613
705
|
return node ? this.configs?.isNodeChildrenPrivate(node) : false;
|
|
@@ -615,10 +707,20 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
|
|
|
615
707
|
const isSystemNode = node?.id.startsWith("$");
|
|
616
708
|
return !isSystemNode && this.hasChildren(node);
|
|
617
709
|
}
|
|
710
|
+
/**
|
|
711
|
+
* Checks if a node has children.
|
|
712
|
+
* @param node The node to check.
|
|
713
|
+
* @returns `true` if the node has children, `false` otherwise.
|
|
714
|
+
*/
|
|
618
715
|
hasChildren(node) {
|
|
619
716
|
return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);
|
|
620
717
|
}
|
|
621
|
-
|
|
718
|
+
/**
|
|
719
|
+
* Gets all sorted child scopes of a node.
|
|
720
|
+
* @param node The node to get child scopes for.
|
|
721
|
+
* @param options Options for getting child scopes.
|
|
722
|
+
* @returns An array of sorted child scopes.
|
|
723
|
+
*/
|
|
622
724
|
getAllSortedChildScope(node, {
|
|
623
725
|
ignoreNodeChildrenPrivate,
|
|
624
726
|
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-chain-config.ts","../../src/services/scope-chain-transform-service.ts","../../src/scopes/global-scope.ts","../../src/chains/fixed-layout-scope-chain.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { BaseVariableField, VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n get private() {\n return this._private;\n }\n\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n\n this.variableEngine.chain.refreshAllChange();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n\n /**\n * Find a variable field by key path in the public scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n return this.public.available.getByKeyPath(keyPath);\n }\n\n /**\n * Find a variable field by key path in the private scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPathInPrivate(keyPath: string[]): BaseVariableField | undefined {\n return this.private?.available.getByKeyPath(keyPath);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport enum FlowNodeScopeTypeEnum {\n public = 'public',\n private = 'private',\n}\n\nexport interface FlowNodeScopeMeta {\n node?: FlowNodeEntity;\n type?: FlowNodeScopeTypeEnum;\n}\n\nexport interface ScopeVirtualNode {\n id: string;\n flowNodeType: 'virtualNode';\n}\n\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n// 节点内部的作用域\nexport interface FlowNodeScope extends Scope<FlowNodeScopeMeta> {}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport {\n FlowNodeEntity,\n FlowDocument,\n FlowVirtualTree,\n FlowNodeBaseType,\n} from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * 自由布局作用域链实现\n */\nexport class FreeLayoutScopeChain extends ScopeChain {\n @inject(EntityManager) entityManager: EntityManager;\n\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // 线条发生变化时,会触发作用域链的更新\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // 树变化时候刷新作用域\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n // 获取同一层级所有输入节点, 按照由近到远的顺序\n protected getAllInputLayerNodes(node: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(node);\n\n const result = new Set<FlowNodeEntity>();\n\n // add by bfs\n const queue: FlowNodeEntity[] = [node];\n\n while (queue.length) {\n const curr = queue.shift()!;\n\n (curr.lines?.inputNodes || []).forEach((inputNode) => {\n if (this.getNodeParent(inputNode) === currParent) {\n if (result.has(inputNode)) {\n return;\n }\n queue.push(inputNode);\n result.add(inputNode);\n }\n });\n }\n\n return Array.from(result).reverse();\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.lines?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n // 1. find dep nodes\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n // 2. private scope of parent node can be access\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n deps.unshift(currVarData.private);\n }\n\n // 3. all public scopes of inputNodes\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n deps.unshift(\n ...allInputNodes\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n // 4. all public children of inputNodes\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat()\n .filter(Boolean)\n );\n\n curr = this.getNodeParent(curr);\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n const uniqDeps = Array.from(new Set(deps));\n return this.transformService.transformDeps(uniqDeps, { scope });\n }\n\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getNodeChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n\n // get all parents\n let parent = this.getNodeParent(node);\n\n while (parent) {\n // if childNodes of parent is private to next nodes, break\n if (this.isNodeChildrenPrivate(parent)) {\n break;\n }\n\n queue.push(...this.getAllOutputLayerNodes(parent));\n\n parent = this.getNodeParent(parent);\n }\n }\n\n // 2. 获取所有覆盖节点的 public、private 作用域\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getNodeChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. 如果当前 scope 是 private,则当前节点的 public 也可覆盖\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformService.transformCovers(uniqScopes, { scope });\n }\n\n getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getNodeChildren) {\n return this.configs.getNodeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // 子画布本身不存在 children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n return this.tree.getChildren(node);\n }\n\n /**\n * Get All children of nodes\n * @param node\n * @returns\n */\n getAllPublicChildScopes(node: FlowNodeEntity): Scope[] {\n if (this.isNodeChildrenPrivate(node)) {\n return [];\n }\n\n return this.getNodeChildren(node)\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat();\n }\n\n getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n if (this.configs?.getNodeParent) {\n return this.configs.getNodeParent(node);\n }\n let parent = node.document.originTree.getParent(node);\n\n // If currentParent is Group, get the parent of parent\n while (parent?.flowNodeType === FlowNodeBaseType.GROUP) {\n parent = parent.parent;\n }\n\n if (!parent) {\n return parent;\n }\n\n const nodeMeta = parent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(parent);\n if (subCanvas?.isCanvas) {\n // Get real parent node by subCanvas Configuration\n return subCanvas.parentNode;\n }\n\n return parent;\n }\n\n // Child nodes can not be accessed\n protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n\n // Except system node and group node, everything else is private\n return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;\n }\n\n sortAll(): Scope[] {\n // 暂未实现\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { type ScopeChainNode } from './types';\nimport { IScopeTransformer } from './services/scope-chain-transform-service';\n\nexport interface VariableChainConfig {\n /**\n * The output variables of a node's children cannot be accessed by subsequent nodes.\n *\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * For fixed layout scenarios: there are a large number of useless nodes between parent and child (such as inlineBlocks, etc., which need to be configured to be skipped)\n * For free canvas scenarios: in some scenarios, the parent-child relationship between nodes is expressed through connections or other interactive forms, which needs to be configurable\n */\n getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * Fine-tune the dependency scope\n */\n transformDeps?: IScopeTransformer;\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: IScopeTransformer;\n}\n\nexport const VariableChainConfig = Symbol('VariableChainConfig');\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, optional } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { lazyInject } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope } from '../types';\n\nexport interface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\n\n@injectable()\nexport class ScopeChainTransformService {\n protected transformerMap: Map<\n string,\n { transformDeps: IScopeTransformer; transformCovers: IScopeTransformer }\n > = new Map();\n\n @lazyInject(FlowDocument) document: FlowDocument;\n\n @lazyInject(VariableEngine) variableEngine: VariableEngine;\n\n constructor(\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n if (this.configs?.transformDeps || this.configs?.transformCovers) {\n this.transformerMap.set('VARIABLE_LAYOUT_CONFIG', {\n transformDeps: this.configs.transformDeps || passthrough,\n transformCovers: this.configs.transformCovers || passthrough,\n });\n }\n }\n\n /**\n * check if transformer registered\n * @param transformerId used to identify transformer, prevent duplicated\n * @returns\n */\n hasTransformer(transformerId: string) {\n return this.transformerMap.has(transformerId);\n }\n\n /**\n * register new transform function\n * @param transformerId used to identify transformer, prevent duplicated transformer\n * @param transformer\n */\n registerTransformer(\n transformerId: string,\n transformer: {\n transformDeps: IScopeTransformer;\n transformCovers: IScopeTransformer;\n }\n ) {\n this.transformerMap.set(transformerId, transformer);\n }\n\n transformDeps(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformDeps) {\n return scopes;\n }\n\n scopes = transformer.transformDeps(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n\n transformCovers(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformCovers) {\n return scopes;\n }\n\n scopes = transformer.transformCovers(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, interfaces } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\n\n@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\n\n static is(scope: Scope) {\n return scope.id === GlobalScope.ID;\n }\n}\n\nexport const bindGlobalScope = (bind: interfaces.Bind) => {\n bind(GlobalScope).toDynamicValue((ctx) => {\n const variableEngine = ctx.container.get(VariableEngine);\n let scope = variableEngine.getScopeById(GlobalScope.ID) as GlobalScope;\n\n if (!scope) {\n scope = variableEngine.createScope(\n GlobalScope.ID,\n {},\n { ScopeConstructor: GlobalScope }\n ) as GlobalScope;\n variableEngine.chain.refreshAllChange();\n }\n\n return scope;\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * 基于 FlowVirtualTree 的 ScopeOrder 实现\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // 增加 { id: string } 使得可以灵活添加自定义虚拟节点\n tree: FlowVirtualTree<ScopeChainNode> | undefined;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n super();\n\n // 绑定 flowDocument 里面的树\n this.bindTree(flowDocument.originTree);\n\n // originTree 发生变化时,触发依赖关系的变化\n this.toDispose.push(\n // REFRACTOR: onTreeChange 触发时机精细化\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n // 绑定树\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n // 获取依赖作用域\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 包含子节点,且不是私有作用域\n\n if (curr === node) {\n // public 可以依赖 private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // 有子元素的节点,则将子元素纳入依赖作用域\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // 节点的 public 都可以被访问\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // 上个节点处理\n if (pre) {\n curr = pre;\n continue;\n }\n\n // 父节点处理\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // 父节点的 private 和 public 都能被子节点访问\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // 当前 parent 有 pre 节点,则停止向上查找\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n return this.transformService.transformDeps(deps, { scope });\n }\n\n // 获取覆盖作用域\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n }).filter((_scope) => _scope !== scope)\n );\n return this.transformService.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 有子元素的节点,则将子元素纳入覆盖作用域\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // 下个节点处理\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // 私有作用域不能被后续节点访问\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformService.transformCovers(covers, { scope });\n }\n\n // 当前 parent 有 next 节点,则停止向上查找\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformService.transformCovers(covers, { scope });\n }\n\n // 排序所有作用域\n sortAll(): Scope[] {\n const startNode = this.flowDocument.getAllNodes().find((_node) => _node.isStart);\n if (!startNode) {\n return [];\n }\n\n const startVariableData = startNode.getData(FlowNodeVariableData);\n const startPublicScope = startVariableData.public;\n const deps = this.getDeps(startPublicScope);\n\n const covers = this.getCovers(startPublicScope).filter(\n (_scope) => !deps.includes(_scope) && _scope !== startPublicScope\n );\n\n return [...deps, startPublicScope, ...covers];\n }\n\n // 获取变量 Data 数据\n private getVariableData(node: ScopeChainNode): FlowNodeVariableData | undefined {\n if (node.flowNodeType === 'virtualNode') {\n return;\n }\n // TODO 包含 $ 的节点不注册 variableData\n if (node.id.startsWith('$')) {\n return;\n }\n\n return (node as FlowNodeEntity).getData(FlowNodeVariableData);\n }\n\n // 子节点不可以被后续节点访问\n private isNodeChildrenPrivate(node?: ScopeChainNode): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n // 兜底:有子节点(节点 id 没有 $ 开头)的全部为私有作用域\n return !isSystemNode && this.hasChildren(node);\n }\n\n private hasChildren(node?: ScopeChainNode): boolean {\n return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);\n }\n\n // 子节点按照顺序进行排序(含自身)\n private getAllSortedChildScope(\n node: ScopeChainNode,\n {\n ignoreNodeChildrenPrivate,\n addNodePrivateScope,\n }: { ignoreNodeChildrenPrivate?: boolean; addNodePrivateScope?: boolean } = {}\n ): FlowNodeScope[] {\n const scopes: FlowNodeScope[] = [];\n\n const variableData = this.getVariableData(node);\n\n if (variableData) {\n scopes.push(variableData.public);\n }\n\n // 私有作用域,子节点的变量不对外输出\n //(父节点如果存在 public 变量则对外输出)\n if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {\n return scopes;\n }\n\n if (addNodePrivateScope && variableData?.private) {\n scopes.push(variableData.private);\n }\n\n const children = this.tree?.getChildren(node) || [];\n scopes.push(\n ...children\n .map((child) =>\n this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope })\n )\n .flat()\n );\n\n return scopes;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FlowNodeVariableData } from './flow-node-variable-data';\n\n/**\n * Use `node.scope` instead\n * @deprecated\n * @param node\n */\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\n\n/**\n * Use `node.privateScope` instead\n * @deprecated\n * @param node\n */\nexport function getNodePrivateScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).initPrivate();\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","FlowDocument","scopes","injectable","Scope","VariableEngine","Scope","injectable","VariableEngine","scopes","inject","FlowDocument","optional","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}
|
|
1
|
+
{"version":3,"sources":["../../src/flow-node-variable-data.ts","../../src/types.ts","../../src/chains/free-layout-scope-chain.ts","../../src/variable-chain-config.ts","../../src/services/scope-chain-transform-service.ts","../../src/scopes/global-scope.ts","../../src/chains/fixed-layout-scope-chain.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { BaseVariableField, VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\n/**\n * Manages variable data for a flow node, including public and private scopes.\n */\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n /**\n * The private scope of the node.\n */\n get private() {\n return this._private;\n }\n\n /**\n * The public scope of the node.\n */\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n /**\n * An array containing all scopes (public and private) of the node.\n */\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n /**\n * Initializes and returns the private scope for the node.\n * If the private scope already exists, it returns the existing one.\n * @returns The private scope of the node.\n */\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n\n this.variableEngine.chain.refreshAllChange();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n\n /**\n * Find a variable field by key path in the public scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n return this.public.available.getByKeyPath(keyPath);\n }\n\n /**\n * Find a variable field by key path in the private scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPathInPrivate(keyPath: string[]): BaseVariableField | undefined {\n return this.private?.available.getByKeyPath(keyPath);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\n/**\n * Enum for flow node scope types.\n */\nexport enum FlowNodeScopeTypeEnum {\n /**\n * Public scope.\n */\n public = 'public',\n /**\n * Private scope.\n */\n private = 'private',\n}\n\n/**\n * Metadata for a flow node scope.\n */\nexport interface FlowNodeScopeMeta {\n /**\n * The flow node entity associated with the scope.\n */\n node?: FlowNodeEntity;\n /**\n * The type of the scope.\n */\n type?: FlowNodeScopeTypeEnum;\n}\n\n/**\n * Represents a virtual node in the scope chain.\n */\nexport interface ScopeVirtualNode {\n /**\n * The ID of the virtual node.\n */\n id: string;\n /**\n * The type of the flow node.\n */\n flowNodeType: 'virtualNode';\n}\n\n/**\n * Represents a node in the scope chain, which can be either a flow node entity or a virtual node.\n */\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n/**\n * Represents a scope associated with a flow node.\n */\nexport interface FlowNodeScope extends Scope<FlowNodeScopeMeta> {}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport {\n FlowNodeEntity,\n FlowDocument,\n FlowVirtualTree,\n FlowNodeBaseType,\n} from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * Scope chain implementation for free layout.\n */\nexport class FreeLayoutScopeChain extends ScopeChain {\n @inject(EntityManager) entityManager: EntityManager;\n\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n /**\n * The virtual tree of the flow document.\n */\n get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // When the line changes, the scope chain will be updated\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // Refresh the scope when the tree changes\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n /**\n * Gets all input layer nodes for a given node in the same layer, sorted by distance.\n * @param node The node to get input layer nodes for.\n * @returns An array of input layer nodes.\n */\n protected getAllInputLayerNodes(node: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(node);\n\n const result = new Set<FlowNodeEntity>();\n\n // add by bfs\n const queue: FlowNodeEntity[] = [node];\n\n while (queue.length) {\n const curr = queue.shift()!;\n\n (curr.lines?.inputNodes || []).forEach((inputNode) => {\n if (this.getNodeParent(inputNode) === currParent) {\n if (result.has(inputNode)) {\n return;\n }\n queue.push(inputNode);\n result.add(inputNode);\n }\n });\n }\n\n return Array.from(result).reverse();\n }\n\n /**\n * Gets all output layer nodes for a given node in the same layer.\n * @param curr The node to get output layer nodes for.\n * @returns An array of output layer nodes.\n */\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.lines?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n /**\n * Gets the dependency scopes for a given scope.\n * @param scope The scope to get dependencies for.\n * @returns An array of dependency scopes.\n */\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n // 1. find dep nodes\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n // 2. private scope of parent node can be access\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n deps.unshift(currVarData.private);\n }\n\n // 3. all public scopes of inputNodes\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n deps.unshift(\n ...allInputNodes\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n // 4. all public children of inputNodes\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat()\n .filter(Boolean)\n );\n\n curr = this.getNodeParent(curr);\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n const uniqDeps = Array.from(new Set(deps));\n return this.transformService.transformDeps(uniqDeps, { scope });\n }\n\n /**\n * Gets the covering scopes for a given scope.\n * @param scope The scope to get covering scopes for.\n * @returns An array of covering scopes.\n */\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS to find all covered nodes\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private can only cover its child nodes\n queue.push(...this.getNodeChildren(node));\n } else {\n // Otherwise, cover all nodes of its output lines\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n\n // get all parents\n let parent = this.getNodeParent(node);\n\n while (parent) {\n // if childNodes of parent is private to next nodes, break\n if (this.isNodeChildrenPrivate(parent)) {\n break;\n }\n\n queue.push(...this.getAllOutputLayerNodes(parent));\n\n parent = this.getNodeParent(parent);\n }\n }\n\n // 2. Get the public and private scopes of all covered nodes\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getNodeChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. If the current scope is private, the public scope of the current node can also be covered\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformService.transformCovers(uniqScopes, { scope });\n }\n\n /**\n * Gets the children of a node.\n * @param node The node to get children for.\n * @returns An array of child nodes.\n */\n getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getNodeChildren) {\n return this.configs.getNodeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // The sub-canvas itself does not have children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // In some scenarios, the parent-child relationship is expressed through connections, so it needs to be configured at the upper level\n return this.tree.getChildren(node);\n }\n\n /**\n * Get All children of nodes\n * @param node\n * @returns\n */\n getAllPublicChildScopes(node: FlowNodeEntity): Scope[] {\n if (this.isNodeChildrenPrivate(node)) {\n return [];\n }\n\n return this.getNodeChildren(node)\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat();\n }\n\n /**\n * Gets the parent of a node.\n * @param node The node to get the parent for.\n * @returns The parent node or `undefined` if not found.\n */\n getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // In some scenarios, the parent-child relationship is expressed through connections, so it needs to be configured at the upper level\n if (this.configs?.getNodeParent) {\n return this.configs.getNodeParent(node);\n }\n let parent = node.document.originTree.getParent(node);\n\n // If currentParent is Group, get the parent of parent\n while (parent?.flowNodeType === FlowNodeBaseType.GROUP) {\n parent = parent.parent;\n }\n\n if (!parent) {\n return parent;\n }\n\n const nodeMeta = parent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(parent);\n if (subCanvas?.isCanvas) {\n // Get real parent node by subCanvas Configuration\n return subCanvas.parentNode;\n }\n\n return parent;\n }\n\n /**\n * Checks if the children of a node are private and cannot be accessed by subsequent nodes.\n * @param node The node to check.\n * @returns `true` if the children are private, `false` otherwise.\n */\n protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n\n // Except system node and group node, everything else is private\n return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;\n }\n\n /**\n * Sorts all scopes in the scope chain.\n * @returns An empty array, as this method is not implemented.\n */\n sortAll(): Scope[] {\n // Not implemented yet\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { type ScopeChainNode } from './types';\nimport { IScopeTransformer } from './services/scope-chain-transform-service';\n\n/**\n * Configuration for the variable chain.\n */\nexport interface VariableChainConfig {\n /**\n * The output variables of a node's children cannot be accessed by subsequent nodes.\n *\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * For fixed layout scenarios: there are a large number of useless nodes between parent and child (such as inlineBlocks, etc., which need to be configured to be skipped)\n * For free canvas scenarios: in some scenarios, the parent-child relationship between nodes is expressed through connections or other interactive forms, which needs to be configurable\n */\n getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * Fine-tune the dependency scope.\n */\n transformDeps?: IScopeTransformer;\n\n /**\n * Fine-tune the cover scope.\n */\n transformCovers?: IScopeTransformer;\n}\n\nexport const VariableChainConfig = Symbol('VariableChainConfig');\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, optional } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { lazyInject } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope } from '../types';\n\n/**\n * Context for scope transformers.\n */\nexport interface TransformerContext {\n /**\n * The current scope\n */\n scope: FlowNodeScope;\n /**\n * The flow document.\n */\n document: FlowDocument;\n /**\n * The variable engine.\n */\n variableEngine: VariableEngine;\n}\n\n/**\n * A function that transforms an array of scopes.\n * @param scopes The array of scopes to transform.\n * @param ctx The transformer context.\n * @returns The transformed array of scopes.\n */\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\n\n/**\n * A service for transforming scope chains.\n */\n@injectable()\nexport class ScopeChainTransformService {\n protected transformerMap: Map<\n string,\n { transformDeps: IScopeTransformer; transformCovers: IScopeTransformer }\n > = new Map();\n\n @lazyInject(FlowDocument) document: FlowDocument;\n\n @lazyInject(VariableEngine) variableEngine: VariableEngine;\n\n constructor(\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n if (this.configs?.transformDeps || this.configs?.transformCovers) {\n this.transformerMap.set('VARIABLE_LAYOUT_CONFIG', {\n transformDeps: this.configs.transformDeps || passthrough,\n transformCovers: this.configs.transformCovers || passthrough,\n });\n }\n }\n\n /**\n * check if transformer registered\n * @param transformerId used to identify transformer, prevent duplicated\n * @returns\n */\n hasTransformer(transformerId: string) {\n return this.transformerMap.has(transformerId);\n }\n\n /**\n * register new transform function\n * @param transformerId used to identify transformer, prevent duplicated transformer\n * @param transformer The transformer to register.\n */\n registerTransformer(\n transformerId: string,\n transformer: {\n transformDeps: IScopeTransformer;\n transformCovers: IScopeTransformer;\n }\n ) {\n this.transformerMap.set(transformerId, transformer);\n }\n\n /**\n * Transforms the dependency scopes.\n * @param scopes The array of scopes to transform.\n * @param param1 The context for the transformation.\n * @returns The transformed array of scopes.\n */\n transformDeps(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformDeps) {\n return scopes;\n }\n\n scopes = transformer.transformDeps(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n\n /**\n * Transforms the cover scopes.\n * @param scopes The array of scopes to transform.\n * @param param1 The context for the transformation.\n * @returns The transformed array of scopes.\n */\n transformCovers(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformCovers) {\n return scopes;\n }\n\n scopes = transformer.transformCovers(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, interfaces } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\n\n/**\n * Global Scope stores all variables that are not scoped to any node.\n *\n * - Variables in Global Scope can be accessed by any node.\n * - Any other scope's variables can not be accessed by Global Scope.\n */\n@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\n\n /**\n * Check if the scope is Global Scope.\n * @param scope\n * @returns\n */\n static is(scope: Scope) {\n return scope.id === GlobalScope.ID;\n }\n}\n\nexport const bindGlobalScope = (bind: interfaces.Bind) => {\n bind(GlobalScope).toDynamicValue((ctx) => {\n const variableEngine = ctx.container.get(VariableEngine);\n let scope = variableEngine.getScopeById(GlobalScope.ID) as GlobalScope;\n\n if (!scope) {\n scope = variableEngine.createScope(\n GlobalScope.ID,\n {},\n { ScopeConstructor: GlobalScope }\n ) as GlobalScope;\n variableEngine.chain.refreshAllChange();\n }\n\n return scope;\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * Scope chain implementation based on `FlowVirtualTree`.\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // By adding { id: string }, custom virtual nodes can be flexibly added\n tree: FlowVirtualTree<ScopeChainNode> | undefined;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n super();\n\n // Bind the tree in flowDocument\n this.bindTree(flowDocument.originTree);\n\n // When originTree changes, trigger changes in dependencies\n this.toDispose.push(\n // REFRACTOR: onTreeChange trigger timing needs to be refined\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n /**\n * Binds the scope chain to a `FlowVirtualTree`.\n * @param tree The `FlowVirtualTree` to bind to.\n */\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n /**\n * Gets the dependency scopes for a given scope.\n * @param scope The scope to get dependencies for.\n * @returns An array of dependency scopes.\n */\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // Contains child nodes and is not a private scope\n\n if (curr === node) {\n // public can depend on private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // For nodes with child elements, include the child elements in the dependency scope\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // The public of the node can be accessed\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // Process the previous node\n if (pre) {\n curr = pre;\n continue;\n }\n\n // Process the parent node\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // Both private and public of the parent node can be accessed by child nodes\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // If the current parent has a pre node, stop searching upwards\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // If there is no next and no parent, end the loop directly\n curr = undefined;\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n return this.transformService.transformDeps(deps, { scope });\n }\n\n /**\n * Gets the covering scopes for a given scope.\n * @param scope The scope to get covering scopes for.\n * @returns An array of covering scopes.\n */\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // If it is a private scope, only child nodes can access it\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n }).filter((_scope) => _scope !== scope)\n );\n return this.transformService.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // For nodes with child elements, include the child elements in the covering scope\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // Process the next node\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // Private scopes cannot be accessed by subsequent nodes\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformService.transformCovers(covers, { scope });\n }\n\n // If the current parent has a next node, stop searching upwards\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformService.transformCovers(covers, { scope });\n }\n\n /**\n * Sorts all scopes in the scope chain.\n * @returns A sorted array of all scopes.\n */\n sortAll(): Scope[] {\n const startNode = this.flowDocument.getAllNodes().find((_node) => _node.isStart);\n if (!startNode) {\n return [];\n }\n\n const startVariableData = startNode.getData(FlowNodeVariableData);\n const startPublicScope = startVariableData.public;\n const deps = this.getDeps(startPublicScope);\n\n const covers = this.getCovers(startPublicScope).filter(\n (_scope) => !deps.includes(_scope) && _scope !== startPublicScope\n );\n\n return [...deps, startPublicScope, ...covers];\n }\n\n /**\n * Gets the `FlowNodeVariableData` for a given `ScopeChainNode`.\n * @param node The `ScopeChainNode` to get data for.\n * @returns The `FlowNodeVariableData` or `undefined` if not found.\n */\n private getVariableData(node: ScopeChainNode): FlowNodeVariableData | undefined {\n if (node.flowNodeType === 'virtualNode') {\n return;\n }\n // TODO Nodes containing $ do not register variableData\n if (node.id.startsWith('$')) {\n return;\n }\n\n return (node as FlowNodeEntity).getData(FlowNodeVariableData);\n }\n\n /**\n * Checks if the children of a node are private.\n * @param node The node to check.\n * @returns `true` if the children are private, `false` otherwise.\n */\n private isNodeChildrenPrivate(node?: ScopeChainNode): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n // Fallback: all nodes with children (node id does not start with $) are private scopes\n return !isSystemNode && this.hasChildren(node);\n }\n\n /**\n * Checks if a node has children.\n * @param node The node to check.\n * @returns `true` if the node has children, `false` otherwise.\n */\n private hasChildren(node?: ScopeChainNode): boolean {\n return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);\n }\n\n /**\n * Gets all sorted child scopes of a node.\n * @param node The node to get child scopes for.\n * @param options Options for getting child scopes.\n * @returns An array of sorted child scopes.\n */\n private getAllSortedChildScope(\n node: ScopeChainNode,\n {\n ignoreNodeChildrenPrivate,\n addNodePrivateScope,\n }: { ignoreNodeChildrenPrivate?: boolean; addNodePrivateScope?: boolean } = {}\n ): FlowNodeScope[] {\n const scopes: FlowNodeScope[] = [];\n\n const variableData = this.getVariableData(node);\n\n if (variableData) {\n scopes.push(variableData.public);\n }\n\n // For private scopes, the variables of child nodes are not exposed externally\n // (If the parent node has public variables, they are exposed externally)\n if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {\n return scopes;\n }\n\n if (addNodePrivateScope && variableData?.private) {\n scopes.push(variableData.private);\n }\n\n const children = this.tree?.getChildren(node) || [];\n scopes.push(\n ...children\n .map((child) =>\n this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope })\n )\n .flat()\n );\n\n return scopes;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FlowNodeVariableData } from './flow-node-variable-data';\n\n/**\n * Use `node.scope` instead.\n * @deprecated\n * @param node The flow node entity.\n * @returns The public scope of the node.\n */\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\n\n/**\n * Use `node.privateScope` instead.\n * @deprecated\n * @param node The flow node entity.\n * @returns The private scope of the node.\n */\nexport function getNodePrivateScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).initPrivate();\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","FlowDocument","scopes","injectable","Scope","VariableEngine","Scope","injectable","VariableEngine","scopes","inject","FlowDocument","optional","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}
|