container.ts 2.6 KB

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