container.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import { Container } from 'inversify';
  6. import {
  7. ASTFactory,
  8. ScopeChain,
  9. VariableContainerModule,
  10. } from '@flowgram.ai/variable-core';
  11. import { createPlaygroundContainer } from '@flowgram.ai/core';
  12. import {
  13. FreeLayoutScopeChain,
  14. FixedLayoutScopeChain,
  15. FlowNodeVariableData,
  16. VariableChainConfig,
  17. GlobalScope,
  18. bindGlobalScope,
  19. ScopeChainTransformService,
  20. } from '../src';
  21. import { EntityManager } from '@flowgram.ai/core';
  22. import { VariableEngine } from '@flowgram.ai/variable-core';
  23. import {
  24. FlowDocument,
  25. FlowDocumentContainerModule,
  26. } from '@flowgram.ai/document';
  27. import { WorkflowDocumentContainerModule } from '@flowgram.ai/free-layout-core';
  28. export interface TestConfig extends VariableChainConfig {
  29. enableGlobalScope?: boolean;
  30. onInit?: (container: Container) => void;
  31. runExtraTest?: (container: Container) => void
  32. }
  33. export function getContainer(layout: 'free' | 'fixed', config?: TestConfig): Container {
  34. const { enableGlobalScope, onInit, runExtraTest, ...layoutConfig } = config || {};
  35. const container = createPlaygroundContainer() as Container;
  36. container.load(VariableContainerModule);
  37. container.load(FlowDocumentContainerModule);
  38. if (layout === 'free') {
  39. container.load(WorkflowDocumentContainerModule);
  40. // container.get(WorkflowLinesManager).registerContribution(WorkflowSimpleLineContribution);
  41. //container.get(WorkflowLinesManager).switchLineType(WorkflowSimpleLineContribution.type);
  42. }
  43. if (layoutConfig) {
  44. container.bind(VariableChainConfig).toConstantValue(layoutConfig);
  45. }
  46. if (layout === 'free') {
  47. container.bind(ScopeChain).to(FreeLayoutScopeChain).inSingletonScope();
  48. }
  49. if (layout === 'fixed') {
  50. container.bind(ScopeChain).to(FixedLayoutScopeChain).inSingletonScope();
  51. }
  52. container.bind(ScopeChainTransformService).toSelf().inSingletonScope();
  53. bindGlobalScope(container.bind.bind(container))
  54. const entityManager = container.get<EntityManager>(EntityManager);
  55. const variableEngine = container.get<VariableEngine>(VariableEngine);
  56. const document = container.get<FlowDocument>(FlowDocument);
  57. if (enableGlobalScope) {
  58. // when get global scope, it will auto create it if not exists
  59. container.get(GlobalScope).setVar(ASTFactory.createVariableDeclaration({
  60. key: 'GlobalScope',
  61. type: ASTFactory.createString(),
  62. }));
  63. }
  64. /**
  65. * 扩展 FlowNodeVariableData
  66. */
  67. entityManager.registerEntityData(
  68. FlowNodeVariableData,
  69. () => ({ variableEngine } as any),
  70. );
  71. document.registerNodeDatas(FlowNodeVariableData);
  72. onInit?.(container);
  73. return container;
  74. }