create-variable-plugin.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {
  2. FlowNodeVariableData,
  3. FreeLayoutScopeChain,
  4. FixedLayoutScopeChain,
  5. VariableLayoutConfig,
  6. bindGlobalScope,
  7. } from '@flowgram.ai/variable-layout';
  8. import {
  9. VariableContainerModule,
  10. ASTNodeRegistry,
  11. ASTRegisters,
  12. VariableEngine,
  13. ScopeChain,
  14. } from '@flowgram.ai/variable-core';
  15. import { FlowDocument } from '@flowgram.ai/document';
  16. import { PluginContext, definePluginCreator } from '@flowgram.ai/core';
  17. import { EntityManager } from '@flowgram.ai/core';
  18. /**
  19. * @deprecated 请使用 @injectToAst(XXXService) declare xxxService: XXXService 实现外部依赖注入
  20. */
  21. type Injector = (ctx: PluginContext) => Record<string, any>;
  22. export interface VariablePluginOptions {
  23. enable?: boolean;
  24. // 业务扩展 AST 节点
  25. extendASTNodes?: (ASTNodeRegistry | [ASTNodeRegistry] | [ASTNodeRegistry, Injector])[];
  26. // 布局方式
  27. layout?: 'fixed' | 'free';
  28. // 布局配置
  29. layoutConfig?: VariableLayoutConfig;
  30. }
  31. export const createVariablePlugin = definePluginCreator<VariablePluginOptions>({
  32. onBind({ bind }, opts) {
  33. const { layout, layoutConfig } = opts;
  34. if (layout === 'free') {
  35. bind(ScopeChain).to(FreeLayoutScopeChain).inSingletonScope();
  36. }
  37. if (layout === 'fixed') {
  38. bind(ScopeChain).to(FixedLayoutScopeChain).inSingletonScope();
  39. }
  40. if (layoutConfig) {
  41. bind(VariableLayoutConfig).toConstantValue(layoutConfig || {});
  42. }
  43. bindGlobalScope(bind);
  44. },
  45. onInit(ctx, opts) {
  46. const { extendASTNodes } = opts || {};
  47. const variableEngine = ctx.get<VariableEngine>(VariableEngine);
  48. const astRegisters = ctx.get<ASTRegisters>(ASTRegisters);
  49. const entityManager = ctx.get<EntityManager>(EntityManager);
  50. const document = ctx.get<FlowDocument>(FlowDocument);
  51. /**
  52. * 注册扩展 AST 节点
  53. */
  54. (extendASTNodes || []).forEach((info) => {
  55. if (Array.isArray(info)) {
  56. const [extendASTNode, injector] = info;
  57. astRegisters.registerAST(extendASTNode, injector ? () => injector(ctx) : undefined);
  58. return;
  59. }
  60. astRegisters.registerAST(info);
  61. });
  62. /**
  63. * 扩展 FlowNodeVariableData
  64. */
  65. entityManager.registerEntityData(FlowNodeVariableData, () => ({ variableEngine } as any));
  66. document.registerNodeDatas(FlowNodeVariableData);
  67. },
  68. containerModules: [VariableContainerModule],
  69. });