@nocobase/plugin-workflow 0.7.0-alpha.6 → 0.7.0-alpha.62

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.
Files changed (141) hide show
  1. package/lib/actions/index.d.ts +3 -1
  2. package/lib/actions/index.js +33 -26
  3. package/{esm/actions/flow_nodes.d.ts → lib/actions/nodes.d.ts} +1 -0
  4. package/lib/actions/nodes.js +321 -0
  5. package/lib/actions/workflows.d.ts +3 -0
  6. package/lib/actions/workflows.js +271 -0
  7. package/lib/calculators/index.js +143 -91
  8. package/lib/collections/executions.js +40 -38
  9. package/lib/collections/flow_nodes.js +60 -72
  10. package/lib/collections/jobs.js +45 -47
  11. package/lib/collections/workflows.js +70 -63
  12. package/lib/constants.js +22 -17
  13. package/lib/index.js +71 -22
  14. package/lib/instructions/calculation.js +34 -29
  15. package/lib/instructions/condition.js +94 -87
  16. package/lib/instructions/create.d.ts +1 -1
  17. package/lib/instructions/create.js +43 -25
  18. package/lib/instructions/destroy.js +42 -25
  19. package/lib/instructions/index.js +46 -25
  20. package/lib/instructions/parallel.js +99 -84
  21. package/lib/instructions/prompt.js +21 -13
  22. package/lib/instructions/query.js +46 -25
  23. package/lib/instructions/update.d.ts +2 -1
  24. package/lib/instructions/update.js +44 -25
  25. package/lib/models/Execution.d.ts +3 -2
  26. package/lib/models/Execution.js +400 -241
  27. package/lib/models/FlowNode.js +18 -5
  28. package/lib/models/Job.js +18 -5
  29. package/lib/models/Workflow.d.ts +4 -5
  30. package/lib/models/Workflow.js +94 -72
  31. package/lib/server.d.ts +7 -2
  32. package/lib/server.js +114 -65
  33. package/lib/triggers/collection.d.ts +16 -0
  34. package/lib/triggers/collection.js +162 -0
  35. package/lib/triggers/index.d.ts +3 -6
  36. package/lib/triggers/index.js +14 -11
  37. package/package.json +7 -12
  38. package/esm/actions/flow_nodes.js +0 -139
  39. package/esm/actions/flow_nodes.js.map +0 -1
  40. package/esm/actions/index.d.ts +0 -1
  41. package/esm/actions/index.js +0 -8
  42. package/esm/actions/index.js.map +0 -1
  43. package/esm/calculators/index.d.ts +0 -38
  44. package/esm/calculators/index.js +0 -128
  45. package/esm/calculators/index.js.map +0 -1
  46. package/esm/collections/executions.d.ts +0 -3
  47. package/esm/collections/executions.js +0 -38
  48. package/esm/collections/executions.js.map +0 -1
  49. package/esm/collections/flow_nodes.d.ts +0 -3
  50. package/esm/collections/flow_nodes.js +0 -72
  51. package/esm/collections/flow_nodes.js.map +0 -1
  52. package/esm/collections/jobs.d.ts +0 -3
  53. package/esm/collections/jobs.js +0 -47
  54. package/esm/collections/jobs.js.map +0 -1
  55. package/esm/collections/workflows.d.ts +0 -3
  56. package/esm/collections/workflows.js +0 -63
  57. package/esm/collections/workflows.js.map +0 -1
  58. package/esm/constants.d.ts +0 -17
  59. package/esm/constants.js +0 -18
  60. package/esm/constants.js.map +0 -1
  61. package/esm/index.d.ts +0 -5
  62. package/esm/index.js +0 -6
  63. package/esm/index.js.map +0 -1
  64. package/esm/instructions/calculation.d.ts +0 -8
  65. package/esm/instructions/calculation.js +0 -55
  66. package/esm/instructions/calculation.js.map +0 -1
  67. package/esm/instructions/condition.d.ts +0 -5
  68. package/esm/instructions/condition.js +0 -99
  69. package/esm/instructions/condition.js.map +0 -1
  70. package/esm/instructions/create.d.ts +0 -8
  71. package/esm/instructions/create.js +0 -25
  72. package/esm/instructions/create.js.map +0 -1
  73. package/esm/instructions/destroy.d.ts +0 -8
  74. package/esm/instructions/destroy.js +0 -25
  75. package/esm/instructions/destroy.js.map +0 -1
  76. package/esm/instructions/index.d.ts +0 -15
  77. package/esm/instructions/index.js +0 -20
  78. package/esm/instructions/index.js.map +0 -1
  79. package/esm/instructions/parallel.d.ts +0 -13
  80. package/esm/instructions/parallel.js +0 -88
  81. package/esm/instructions/parallel.js.map +0 -1
  82. package/esm/instructions/prompt.d.ts +0 -7
  83. package/esm/instructions/prompt.js +0 -13
  84. package/esm/instructions/prompt.js.map +0 -1
  85. package/esm/instructions/query.d.ts +0 -8
  86. package/esm/instructions/query.js +0 -25
  87. package/esm/instructions/query.js.map +0 -1
  88. package/esm/instructions/update.d.ts +0 -8
  89. package/esm/instructions/update.js +0 -25
  90. package/esm/instructions/update.js.map +0 -1
  91. package/esm/models/Execution.d.ts +0 -50
  92. package/esm/models/Execution.js +0 -250
  93. package/esm/models/Execution.js.map +0 -1
  94. package/esm/models/FlowNode.d.ts +0 -17
  95. package/esm/models/FlowNode.js +0 -4
  96. package/esm/models/FlowNode.js.map +0 -1
  97. package/esm/models/Job.d.ts +0 -15
  98. package/esm/models/Job.js +0 -4
  99. package/esm/models/Job.js.map +0 -1
  100. package/esm/models/Workflow.d.ts +0 -27
  101. package/esm/models/Workflow.js +0 -72
  102. package/esm/models/Workflow.js.map +0 -1
  103. package/esm/server.d.ts +0 -5
  104. package/esm/server.js +0 -62
  105. package/esm/server.js.map +0 -1
  106. package/esm/triggers/index.d.ts +0 -9
  107. package/esm/triggers/index.js +0 -6
  108. package/esm/triggers/index.js.map +0 -1
  109. package/esm/triggers/model.d.ts +0 -12
  110. package/esm/triggers/model.js +0 -47
  111. package/esm/triggers/model.js.map +0 -1
  112. package/lib/actions/flow_nodes.d.ts +0 -3
  113. package/lib/actions/flow_nodes.js +0 -163
  114. package/lib/actions/flow_nodes.js.map +0 -1
  115. package/lib/actions/index.js.map +0 -1
  116. package/lib/calculators/index.js.map +0 -1
  117. package/lib/collections/executions.js.map +0 -1
  118. package/lib/collections/flow_nodes.js.map +0 -1
  119. package/lib/collections/jobs.js.map +0 -1
  120. package/lib/collections/workflows.js.map +0 -1
  121. package/lib/constants.js.map +0 -1
  122. package/lib/index.js.map +0 -1
  123. package/lib/instructions/calculation.js.map +0 -1
  124. package/lib/instructions/condition.js.map +0 -1
  125. package/lib/instructions/create.js.map +0 -1
  126. package/lib/instructions/destroy.js.map +0 -1
  127. package/lib/instructions/index.js.map +0 -1
  128. package/lib/instructions/parallel.js.map +0 -1
  129. package/lib/instructions/prompt.js.map +0 -1
  130. package/lib/instructions/query.js.map +0 -1
  131. package/lib/instructions/update.js.map +0 -1
  132. package/lib/models/Execution.js.map +0 -1
  133. package/lib/models/FlowNode.js.map +0 -1
  134. package/lib/models/Job.js.map +0 -1
  135. package/lib/models/Workflow.js.map +0 -1
  136. package/lib/server.js.map +0 -1
  137. package/lib/triggers/index.js.map +0 -1
  138. package/lib/triggers/model.d.ts +0 -12
  139. package/lib/triggers/model.js +0 -49
  140. package/lib/triggers/model.js.map +0 -1
  141. package/tsconfig.build.json +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/instructions/query.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,eAAe;IACP,GAAG,CAAsB,KAAK,EAAE,SAAS;;YAC7C,MAAM,EACJ,UAAU,EACV,QAAQ,EACR,MAAM,GAAG,EAAE,EACZ,GAAG,IAAI,CAAC,MAAM,CAAC;YAEhB,MAAM,IAAI,GAA0B,IAAI,CAAC,WAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,kCAC/D,OAAO,KACV,WAAW,EAAE,SAAS,CAAC,WAAW,IAClC,CAAC;YAEH,OAAO;gBACL,MAAM;gBACN,MAAM,EAAE,UAAU,CAAC,QAAQ;aAC5B,CAAC;QACJ,CAAC;KAAA;CACF,CAAC","sourcesContent":["import { JOB_STATUS } from \"../constants\";\nimport FlowNodeModel from \"../models/FlowNode\";\n\nexport default {\n async run(this: FlowNodeModel, input, execution) {\n const {\n collection,\n multiple,\n params = {}\n } = this.config;\n\n const repo = (<typeof FlowNodeModel>this.constructor).database.getRepository(collection);\n const options = execution.getParsedValue(params);\n const result = await (multiple ? repo.find : repo.findOne).call(repo, {\n ...options,\n transaction: execution.transaction\n });\n\n return {\n result,\n status: JOB_STATUS.RESOLVED\n };\n }\n};\n"]}
@@ -1,8 +0,0 @@
1
- import FlowNodeModel from "../models/FlowNode";
2
- declare const _default: {
3
- run(this: FlowNodeModel, input: any, execution: any): Promise<{
4
- result: import("@nocobase/database").Model<any, any> | import("@nocobase/database").Model<any, any>[];
5
- status: number;
6
- }>;
7
- };
8
- export default _default;
@@ -1,25 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { JOB_STATUS } from "../constants";
11
- export default {
12
- run(input, execution) {
13
- return __awaiter(this, void 0, void 0, function* () {
14
- const { collection, multiple = false, params = {} } = this.config;
15
- const repo = this.constructor.database.getRepository(collection);
16
- const options = execution.getParsedValue(params);
17
- const result = yield repo.update(Object.assign(Object.assign({}, options), { transaction: execution.transaction }));
18
- return {
19
- result: multiple ? result : (result[0] || null),
20
- status: JOB_STATUS.RESOLVED
21
- };
22
- });
23
- }
24
- };
25
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/instructions/update.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,eAAe;IACP,GAAG,CAAsB,KAAK,EAAE,SAAS;;YAC7C,MAAM,EACJ,UAAU,EACV,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,EAAE,EACZ,GAAG,IAAI,CAAC,MAAM,CAAC;YAEhB,MAAM,IAAI,GAA0B,IAAI,CAAC,WAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,iCAC3B,OAAO,KACV,WAAW,EAAE,SAAS,CAAC,WAAW,IAClC,CAAC;YAEH,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC/C,MAAM,EAAE,UAAU,CAAC,QAAQ;aAC5B,CAAC;QACJ,CAAC;KAAA;CACF,CAAA","sourcesContent":["import { JOB_STATUS } from \"../constants\";\nimport FlowNodeModel from \"../models/FlowNode\";\n\nexport default {\n async run(this: FlowNodeModel, input, execution) {\n const {\n collection,\n multiple = false,\n params = {}\n } = this.config;\n\n const repo = (<typeof FlowNodeModel>this.constructor).database.getRepository(collection);\n const options = execution.getParsedValue(params);\n const result = await repo.update({\n ...options,\n transaction: execution.transaction\n });\n\n return {\n result: multiple ? result : (result[0] || null),\n status: JOB_STATUS.RESOLVED\n };\n }\n}\n"]}
@@ -1,50 +0,0 @@
1
- import { Database, Model } from '@nocobase/database';
2
- import { BelongsToGetAssociationMixin, HasManyGetAssociationsMixin, Transaction } from 'sequelize';
3
- import WorkflowModel from './Workflow';
4
- import FlowNodeModel from './FlowNode';
5
- import JobModel from './Job';
6
- export interface ExecutionOptions {
7
- transaction?: Transaction;
8
- }
9
- export default class ExecutionModel extends Model {
10
- static readonly database: Database;
11
- id: number;
12
- title: string;
13
- context: any;
14
- status: number;
15
- useTransaction: boolean;
16
- createdAt: Date;
17
- updatedAt: Date;
18
- workflow?: WorkflowModel;
19
- getWorkflow: BelongsToGetAssociationMixin<WorkflowModel>;
20
- jobs?: JobModel[];
21
- getJobs: HasManyGetAssociationsMixin<JobModel>;
22
- options: ExecutionOptions;
23
- transaction: Transaction;
24
- nodes: Array<FlowNodeModel>;
25
- nodesMap: Map<number, FlowNodeModel>;
26
- jobsMap: Map<number, JobModel>;
27
- jobsMapByNodeId: {
28
- [key: number]: any;
29
- };
30
- static StatusMap: {
31
- [x: number]: number;
32
- };
33
- makeNodes(nodes?: any[]): void;
34
- makeJobs(jobs: Array<JobModel>): void;
35
- getTransaction(): Transaction | Promise<Transaction>;
36
- prepare(options: any, commit?: boolean): Promise<void>;
37
- start(options: ExecutionOptions): Promise<void>;
38
- resume(job: JobModel, options: ExecutionOptions): Promise<void>;
39
- private commit;
40
- private exec;
41
- run(node: any, input?: any): any;
42
- end(node: any, job: any): any;
43
- recall(node: any, job: any): any;
44
- exit(job: JobModel | null): Promise<any>;
45
- saveJob(payload: any): Promise<JobModel>;
46
- findBranchStartNode(node: FlowNodeModel): FlowNodeModel | null;
47
- findBranchParentNode(node: FlowNodeModel): FlowNodeModel | null;
48
- findBranchParentJob(job: JobModel, node: FlowNodeModel): JobModel | null;
49
- getParsedValue(value: any, node?: any): any;
50
- }
@@ -1,250 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { Model } from '@nocobase/database';
11
- import parse from 'json-templates';
12
- import { EXECUTION_STATUS, JOB_STATUS } from '../constants';
13
- import instructions from '../instructions';
14
- import calculators from '../calculators';
15
- export default class ExecutionModel extends Model {
16
- constructor() {
17
- super(...arguments);
18
- this.nodes = [];
19
- this.nodesMap = new Map();
20
- this.jobsMap = new Map();
21
- this.jobsMapByNodeId = {};
22
- }
23
- // make dual linked nodes list then cache
24
- makeNodes(nodes = []) {
25
- this.nodes = nodes;
26
- nodes.forEach((node) => {
27
- this.nodesMap.set(node.id, node);
28
- });
29
- nodes.forEach((node) => {
30
- if (node.upstreamId) {
31
- node.upstream = this.nodesMap.get(node.upstreamId);
32
- }
33
- if (node.downstreamId) {
34
- node.downstream = this.nodesMap.get(node.downstreamId);
35
- }
36
- });
37
- }
38
- makeJobs(jobs) {
39
- jobs.forEach((job) => {
40
- this.jobsMap.set(job.id, job);
41
- // TODO: should consider cycle, and from previous job
42
- this.jobsMapByNodeId[job.nodeId] = job.result;
43
- });
44
- }
45
- getTransaction() {
46
- const { sequelize } = this.constructor.database;
47
- // @ts-ignore
48
- if (!this.useTransaction) {
49
- return undefined;
50
- }
51
- const { options } = this;
52
- // @ts-ignore
53
- return options.transaction && !options.transaction.finished
54
- ? options.transaction
55
- : sequelize.transaction();
56
- }
57
- prepare(options, commit = false) {
58
- return __awaiter(this, void 0, void 0, function* () {
59
- this.options = options || {};
60
- // @ts-ignore
61
- const transaction = yield this.getTransaction();
62
- this.transaction = transaction;
63
- if (!this.workflow) {
64
- this.workflow = yield this.getWorkflow({ transaction });
65
- }
66
- const nodes = yield this.workflow.getNodes({ transaction });
67
- this.makeNodes(nodes);
68
- const jobs = yield this.getJobs({
69
- order: [['id', 'ASC']],
70
- transaction,
71
- });
72
- this.makeJobs(jobs);
73
- if (commit) {
74
- yield this.commit();
75
- }
76
- });
77
- }
78
- start(options) {
79
- return __awaiter(this, void 0, void 0, function* () {
80
- if (this.status !== EXECUTION_STATUS.STARTED) {
81
- throw new Error(`execution was ended with status ${this.status}`);
82
- }
83
- yield this.prepare(options);
84
- if (this.nodes.length) {
85
- const head = this.nodes.find(item => !item.upstream);
86
- yield this.run(head, { result: this.context });
87
- }
88
- else {
89
- yield this.exit(null);
90
- }
91
- yield this.commit();
92
- });
93
- }
94
- resume(job, options) {
95
- return __awaiter(this, void 0, void 0, function* () {
96
- if (this.status !== EXECUTION_STATUS.STARTED) {
97
- throw new Error(`execution was ended with status ${this.status}`);
98
- }
99
- yield this.prepare(options);
100
- const node = this.nodesMap.get(job.nodeId);
101
- yield this.recall(node, job);
102
- yield this.commit();
103
- });
104
- }
105
- commit() {
106
- return __awaiter(this, void 0, void 0, function* () {
107
- // @ts-ignore
108
- if (this.transaction && (!this.options.transaction || this.options.transaction.finished)) {
109
- yield this.transaction.commit();
110
- }
111
- });
112
- }
113
- exec(instruction, node, prevJob) {
114
- return __awaiter(this, void 0, void 0, function* () {
115
- let job;
116
- try {
117
- // call instruction to get result and status
118
- job = yield instruction.call(node, prevJob, this);
119
- if (!job) {
120
- return null;
121
- }
122
- }
123
- catch (err) {
124
- // for uncaught error, set to rejected
125
- job = {
126
- result: err instanceof Error
127
- ? { message: err.message, stack: process.env.NODE_ENV === 'production' ? [] : err.stack }
128
- : err,
129
- status: JOB_STATUS.REJECTED,
130
- };
131
- // if previous job is from resuming
132
- if (prevJob && prevJob.nodeId === node.id) {
133
- prevJob.set(job);
134
- job = prevJob;
135
- }
136
- }
137
- let savedJob;
138
- // TODO(optimize): many checking of resuming or new could be improved
139
- // could be implemented separately in exec() / resume()
140
- if (job instanceof Model) {
141
- savedJob = (yield job.save({ transaction: this.transaction }));
142
- }
143
- else {
144
- const upstreamId = prevJob instanceof Model ? prevJob.get('id') : null;
145
- savedJob = yield this.saveJob(Object.assign({ nodeId: node.id, upstreamId }, job));
146
- }
147
- if (savedJob.status === JOB_STATUS.RESOLVED && node.downstream) {
148
- // run next node
149
- return this.run(node.downstream, savedJob);
150
- }
151
- // all nodes in scope have been executed
152
- return this.end(node, savedJob);
153
- });
154
- }
155
- run(node, input) {
156
- return __awaiter(this, void 0, void 0, function* () {
157
- const { run } = instructions.get(node.type);
158
- if (typeof run !== 'function') {
159
- return Promise.reject(new Error('`run` should be implemented for customized execution of the node'));
160
- }
161
- return this.exec(run, node, input);
162
- });
163
- }
164
- // parent node should take over the control
165
- end(node, job) {
166
- const parentNode = this.findBranchParentNode(node);
167
- // no parent, means on main flow
168
- if (parentNode) {
169
- return this.recall(parentNode, job);
170
- }
171
- // really done for all nodes
172
- // * should mark execution as done with last job status
173
- return this.exit(job);
174
- }
175
- recall(node, job) {
176
- return __awaiter(this, void 0, void 0, function* () {
177
- const { resume } = instructions.get(node.type);
178
- if (typeof resume !== 'function') {
179
- return Promise.reject(new Error('`resume` should be implemented because the node made branch'));
180
- }
181
- return this.exec(resume, node, job);
182
- });
183
- }
184
- exit(job) {
185
- return __awaiter(this, void 0, void 0, function* () {
186
- const status = job ? ExecutionModel.StatusMap[job.status] : EXECUTION_STATUS.RESOLVED;
187
- yield this.update({ status }, { transaction: this.transaction });
188
- return null;
189
- });
190
- }
191
- // TODO(optimize)
192
- saveJob(payload) {
193
- return __awaiter(this, void 0, void 0, function* () {
194
- const { database } = this.constructor;
195
- const { model } = database.getCollection('jobs');
196
- const [job] = (yield model.upsert(Object.assign(Object.assign({}, payload), { executionId: this.id }), { transaction: this.transaction }));
197
- this.jobsMap.set(job.id, job);
198
- this.jobsMapByNodeId[job.nodeId] = job.result;
199
- return job;
200
- });
201
- }
202
- // find the first node in current branch
203
- findBranchStartNode(node) {
204
- for (let n = node; n; n = n.upstream) {
205
- if (n.branchIndex !== null) {
206
- return n;
207
- }
208
- }
209
- return null;
210
- }
211
- // find the node start current branch
212
- findBranchParentNode(node) {
213
- for (let n = node; n; n = n.upstream) {
214
- if (n.branchIndex !== null) {
215
- return n.upstream;
216
- }
217
- }
218
- return null;
219
- }
220
- findBranchParentJob(job, node) {
221
- for (let j = job; j; j = this.jobsMap.get(j.upstreamId)) {
222
- if (j.nodeId === node.id) {
223
- return j;
224
- }
225
- }
226
- return null;
227
- }
228
- getParsedValue(value, node) {
229
- const injectedFns = {};
230
- const scope = {
231
- execution: this,
232
- node
233
- };
234
- for (let [name, fn] of calculators.getEntities()) {
235
- injectedFns[name] = fn.bind(scope);
236
- }
237
- return parse(value)({
238
- $context: this.context,
239
- $jobsMapByNodeId: this.jobsMapByNodeId,
240
- $fn: injectedFns
241
- });
242
- }
243
- }
244
- ExecutionModel.StatusMap = {
245
- [JOB_STATUS.PENDING]: EXECUTION_STATUS.STARTED,
246
- [JOB_STATUS.RESOLVED]: EXECUTION_STATUS.RESOLVED,
247
- [JOB_STATUS.REJECTED]: EXECUTION_STATUS.REJECTED,
248
- [JOB_STATUS.CANCELLED]: EXECUTION_STATUS.CANCELLED,
249
- };
250
- //# sourceMappingURL=Execution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Execution.js","sourceRoot":"","sources":["../../src/models/Execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { Database, Model } from '@nocobase/database';\nimport parse from 'json-templates';\nimport { BelongsToGetAssociationMixin, HasManyGetAssociationsMixin, Transaction } from 'sequelize';\nimport { EXECUTION_STATUS, JOB_STATUS } from '../constants';\nimport instructions from '../instructions';\nimport WorkflowModel from './Workflow';\nimport FlowNodeModel from './FlowNode';\nimport JobModel from './Job';\nimport calculators from '../calculators';\n\nexport interface ExecutionOptions {\n transaction?: Transaction;\n}\n\nexport default class ExecutionModel extends Model {\n declare static readonly database: Database;\n\n declare id: number;\n declare title: string;\n declare context: any;\n declare status: number;\n // NOTE: this duplicated column is for transaction in preparing cycle from workflow\n declare useTransaction: boolean;\n\n declare createdAt: Date;\n declare updatedAt: Date;\n\n declare workflow?: WorkflowModel;\n declare getWorkflow: BelongsToGetAssociationMixin<WorkflowModel>;\n\n declare jobs?: JobModel[];\n declare getJobs: HasManyGetAssociationsMixin<JobModel>;\n\n options: ExecutionOptions;\n transaction: Transaction;\n\n nodes: Array<FlowNodeModel> = [];\n nodesMap = new Map<number, FlowNodeModel>();\n jobsMap = new Map<number, JobModel>();\n jobsMapByNodeId: { [key: number]: any } = {};\n\n static StatusMap = {\n [JOB_STATUS.PENDING]: EXECUTION_STATUS.STARTED,\n [JOB_STATUS.RESOLVED]: EXECUTION_STATUS.RESOLVED,\n [JOB_STATUS.REJECTED]: EXECUTION_STATUS.REJECTED,\n [JOB_STATUS.CANCELLED]: EXECUTION_STATUS.CANCELLED,\n };\n\n // make dual linked nodes list then cache\n makeNodes(nodes = []) {\n this.nodes = nodes;\n\n nodes.forEach((node) => {\n this.nodesMap.set(node.id, node);\n });\n\n nodes.forEach((node) => {\n if (node.upstreamId) {\n node.upstream = this.nodesMap.get(node.upstreamId);\n }\n\n if (node.downstreamId) {\n node.downstream = this.nodesMap.get(node.downstreamId);\n }\n });\n }\n\n makeJobs(jobs: Array<JobModel>) {\n jobs.forEach((job) => {\n this.jobsMap.set(job.id, job);\n // TODO: should consider cycle, and from previous job\n this.jobsMapByNodeId[job.nodeId] = job.result;\n });\n }\n\n getTransaction() {\n const { sequelize } = (<typeof WorkflowModel>this.constructor).database;\n // @ts-ignore\n if (!this.useTransaction) {\n return undefined;\n }\n\n const { options } = this;\n\n // @ts-ignore\n return options.transaction && !options.transaction.finished\n ? options.transaction\n : sequelize.transaction();\n }\n\n async prepare(options, commit = false) {\n this.options = options || {};\n // @ts-ignore\n const transaction = await this.getTransaction()\n this.transaction = transaction;\n\n if (!this.workflow) {\n this.workflow = await this.getWorkflow({ transaction });\n }\n\n const nodes = await this.workflow.getNodes({ transaction });\n\n this.makeNodes(nodes);\n\n const jobs = await this.getJobs({\n order: [['id', 'ASC']],\n transaction,\n });\n\n this.makeJobs(jobs);\n\n if (commit) {\n await this.commit();\n }\n }\n\n public async start(options: ExecutionOptions) {\n if (this.status !== EXECUTION_STATUS.STARTED) {\n throw new Error(`execution was ended with status ${this.status}`);\n }\n await this.prepare(options);\n if (this.nodes.length) {\n const head = this.nodes.find(item => !item.upstream);\n await this.run(head, { result: this.context });\n } else {\n await this.exit(null);\n }\n await this.commit();\n }\n\n public async resume(job: JobModel, options: ExecutionOptions) {\n if (this.status !== EXECUTION_STATUS.STARTED) {\n throw new Error(`execution was ended with status ${this.status}`);\n }\n await this.prepare(options);\n const node = this.nodesMap.get(job.nodeId);\n await this.recall(node, job);\n await this.commit();\n }\n\n private async commit() {\n // @ts-ignore\n if (this.transaction && (!this.options.transaction || this.options.transaction.finished)) {\n await this.transaction.commit();\n }\n }\n\n private async exec(instruction: Function, node: FlowNodeModel, prevJob) {\n let job;\n try {\n // call instruction to get result and status\n job = await instruction.call(node, prevJob, this);\n if (!job) {\n return null;\n }\n } catch (err) {\n // for uncaught error, set to rejected\n job = {\n result: err instanceof Error\n ? { message: err.message, stack: process.env.NODE_ENV === 'production' ? [] : err.stack }\n : err,\n status: JOB_STATUS.REJECTED,\n };\n // if previous job is from resuming\n if (prevJob && prevJob.nodeId === node.id) {\n prevJob.set(job);\n job = prevJob;\n }\n }\n\n let savedJob;\n // TODO(optimize): many checking of resuming or new could be improved\n // could be implemented separately in exec() / resume()\n if (job instanceof Model) {\n savedJob = (await job.save({ transaction: this.transaction })) as unknown as JobModel;\n } else {\n const upstreamId = prevJob instanceof Model ? prevJob.get('id') : null;\n savedJob = await this.saveJob({\n nodeId: node.id,\n upstreamId,\n ...job,\n });\n }\n\n if (savedJob.status === JOB_STATUS.RESOLVED && node.downstream) {\n // run next node\n return this.run(node.downstream, savedJob);\n }\n\n // all nodes in scope have been executed\n return this.end(node, savedJob);\n }\n\n public async run(node, input?) {\n const { run } = instructions.get(node.type);\n if (typeof run !== 'function') {\n return Promise.reject(new Error('`run` should be implemented for customized execution of the node'));\n }\n\n return this.exec(run, node, input);\n }\n\n // parent node should take over the control\n public end(node, job) {\n const parentNode = this.findBranchParentNode(node);\n // no parent, means on main flow\n if (parentNode) {\n return this.recall(parentNode, job);\n }\n\n // really done for all nodes\n // * should mark execution as done with last job status\n return this.exit(job);\n }\n\n async recall(node, job) {\n const { resume } = instructions.get(node.type);\n if (typeof resume !== 'function') {\n return Promise.reject(new Error('`resume` should be implemented because the node made branch'));\n }\n\n return this.exec(resume, node, job);\n }\n\n async exit(job: JobModel | null) {\n const status = job ? ExecutionModel.StatusMap[job.status] : EXECUTION_STATUS.RESOLVED;\n await this.update({ status }, { transaction: this.transaction });\n return null;\n }\n\n // TODO(optimize)\n async saveJob(payload) {\n const { database } = <typeof WorkflowModel>this.constructor;\n const { model } = database.getCollection('jobs');\n const [job] = (await model.upsert(\n {\n ...payload,\n executionId: this.id,\n },\n { transaction: this.transaction },\n )) as unknown as [JobModel, boolean | null];\n this.jobsMap.set(job.id, job);\n this.jobsMapByNodeId[job.nodeId] = job.result;\n\n return job;\n }\n\n // find the first node in current branch\n findBranchStartNode(node: FlowNodeModel): FlowNodeModel | null {\n for (let n = node; n; n = n.upstream) {\n if (n.branchIndex !== null) {\n return n;\n }\n }\n return null;\n }\n\n // find the node start current branch\n findBranchParentNode(node: FlowNodeModel): FlowNodeModel | null {\n for (let n = node; n; n = n.upstream) {\n if (n.branchIndex !== null) {\n return n.upstream;\n }\n }\n return null;\n }\n\n findBranchParentJob(job: JobModel, node: FlowNodeModel): JobModel | null {\n for (let j = job; j; j = this.jobsMap.get(j.upstreamId)) {\n if (j.nodeId === node.id) {\n return j;\n }\n }\n return null;\n }\n\n public getParsedValue(value, node?) {\n const injectedFns = {};\n const scope = {\n execution: this,\n node\n };\n for (let [name, fn] of calculators.getEntities()) {\n injectedFns[name] = fn.bind(scope);\n }\n\n return parse(value)({\n $context: this.context,\n $jobsMapByNodeId: this.jobsMapByNodeId,\n $fn: injectedFns\n });\n }\n}\n"]}
@@ -1,17 +0,0 @@
1
- import { Database, Model } from '@nocobase/database';
2
- import { BelongsToGetAssociationMixin } from 'sequelize';
3
- import WorkflowModel from './Workflow';
4
- export default class FlowNodeModel extends Model {
5
- static readonly database: Database;
6
- id: number;
7
- title: string;
8
- branchIndex: null | number;
9
- type: string;
10
- config: any;
11
- createdAt: Date;
12
- updatedAt: Date;
13
- upstream: FlowNodeModel;
14
- downstream: FlowNodeModel;
15
- workflow?: WorkflowModel;
16
- getWorkflow: BelongsToGetAssociationMixin<WorkflowModel>;
17
- }
@@ -1,4 +0,0 @@
1
- import { Model } from '@nocobase/database';
2
- export default class FlowNodeModel extends Model {
3
- }
4
- //# sourceMappingURL=FlowNode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FlowNode.js","sourceRoot":"","sources":["../../src/models/FlowNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,KAAK;CAiB/C","sourcesContent":["import { Database, Model } from '@nocobase/database';\nimport { BelongsToGetAssociationMixin } from 'sequelize';\nimport WorkflowModel from './Workflow';\n\n\nexport default class FlowNodeModel extends Model {\n declare static readonly database: Database;\n\n declare id: number;\n declare title: string;\n declare branchIndex: null | number;\n declare type: string;\n declare config: any;\n\n declare createdAt: Date;\n declare updatedAt: Date;\n\n declare upstream: FlowNodeModel;\n declare downstream: FlowNodeModel;\n\n declare workflow?: WorkflowModel;\n declare getWorkflow: BelongsToGetAssociationMixin<WorkflowModel>;\n}\n"]}
@@ -1,15 +0,0 @@
1
- import { Model } from '@nocobase/database';
2
- import { BelongsToGetAssociationMixin } from 'sequelize';
3
- import FlowNodeModel from './FlowNode';
4
- export default class JobModel extends Model {
5
- id: number;
6
- status: number;
7
- result: any;
8
- createdAt: Date;
9
- updatedAt: Date;
10
- upstreamId: number;
11
- upstream: JobModel;
12
- nodeId: number;
13
- node?: FlowNodeModel;
14
- getNode: BelongsToGetAssociationMixin<FlowNodeModel>;
15
- }
package/esm/models/Job.js DELETED
@@ -1,4 +0,0 @@
1
- import { Model } from '@nocobase/database';
2
- export default class JobModel extends Model {
3
- }
4
- //# sourceMappingURL=Job.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Job.js","sourceRoot":"","sources":["../../src/models/Job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAI3C,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,KAAK;CAc1C","sourcesContent":["import { Model } from '@nocobase/database';\nimport { BelongsToGetAssociationMixin } from 'sequelize';\nimport FlowNodeModel from './FlowNode';\n\nexport default class JobModel extends Model {\n declare id: number;\n declare status: number;\n declare result: any;\n\n declare createdAt: Date;\n declare updatedAt: Date;\n\n declare upstreamId: number;\n declare upstream: JobModel;\n\n declare nodeId: number;\n declare node?: FlowNodeModel;\n declare getNode: BelongsToGetAssociationMixin<FlowNodeModel>;\n}"]}
@@ -1,27 +0,0 @@
1
- import { Database, Model } from '@nocobase/database';
2
- import { HasManyCreateAssociationMixin, HasManyGetAssociationsMixin } from 'sequelize';
3
- import ExecutionModel from './Execution';
4
- import FlowNodeModel from './FlowNode';
5
- export default class WorkflowModel extends Model {
6
- static database: Database;
7
- id: number;
8
- title: string;
9
- enabled: boolean;
10
- description?: string;
11
- type: string;
12
- config: any;
13
- useTransaction: boolean;
14
- createdAt: Date;
15
- updatedAt: Date;
16
- nodes: FlowNodeModel[];
17
- getNodes: HasManyGetAssociationsMixin<FlowNodeModel>;
18
- createNode: HasManyCreateAssociationMixin<FlowNodeModel>;
19
- executions: ExecutionModel[];
20
- getExecutions: HasManyGetAssociationsMixin<ExecutionModel>;
21
- createExecution: HasManyCreateAssociationMixin<ExecutionModel>;
22
- static mount(): Promise<void>;
23
- getHookId(): string;
24
- getTransaction(options: any): any;
25
- toggle(enable?: boolean): Promise<void>;
26
- trigger(context: Object, options: any): Promise<ExecutionModel>;
27
- }
@@ -1,72 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { Model } from '@nocobase/database';
11
- import triggers from '../triggers';
12
- import { EXECUTION_STATUS } from '../constants';
13
- export default class WorkflowModel extends Model {
14
- static mount() {
15
- return __awaiter(this, void 0, void 0, function* () {
16
- const collection = this.database.getCollection('workflows');
17
- const workflows = yield collection.repository.find({
18
- filter: { enabled: true },
19
- });
20
- workflows.forEach((workflow) => {
21
- workflow.toggle();
22
- });
23
- this.addHook('afterCreate', (model) => model.toggle());
24
- this.addHook('afterUpdate', (model) => model.toggle());
25
- this.addHook('afterDestroy', (model) => model.toggle(false));
26
- });
27
- }
28
- getHookId() {
29
- return `workflow-${this.get('id')}`;
30
- }
31
- getTransaction(options) {
32
- if (!this.useTransaction) {
33
- return undefined;
34
- }
35
- return options.transaction && !options.transaction.finished
36
- ? options.transaction
37
- : this.constructor.database.sequelize.transaction();
38
- }
39
- toggle(enable) {
40
- return __awaiter(this, void 0, void 0, function* () {
41
- const type = this.get('type');
42
- const { on, off } = triggers.get(type);
43
- if (typeof enable !== 'undefined' ? enable : this.get('enabled')) {
44
- on.call(this, this.trigger.bind(this));
45
- }
46
- else {
47
- off.call(this);
48
- }
49
- });
50
- }
51
- trigger(context, options) {
52
- return __awaiter(this, void 0, void 0, function* () {
53
- // `null` means not to trigger
54
- if (context === null) {
55
- return;
56
- }
57
- const transaction = yield this.getTransaction(options);
58
- const execution = yield this.createExecution({
59
- context,
60
- status: EXECUTION_STATUS.STARTED,
61
- useTransaction: this.useTransaction
62
- }, { transaction });
63
- execution.workflow = this;
64
- yield execution.start({ transaction });
65
- if (transaction && (!options.transaction || options.transaction.finished)) {
66
- yield transaction.commit();
67
- }
68
- return execution;
69
- });
70
- }
71
- }
72
- //# sourceMappingURL=Workflow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Workflow.js","sourceRoot":"","sources":["../../src/models/Workflow.ts"],"names":[],"mappings":"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","sourcesContent":["import { Database, Model } from '@nocobase/database';\nimport { HasManyCreateAssociationMixin, HasManyGetAssociationsMixin } from 'sequelize';\n\nimport triggers from '../triggers';\nimport { EXECUTION_STATUS } from '../constants';\nimport ExecutionModel from './Execution';\nimport FlowNodeModel from './FlowNode';\n\nexport default class WorkflowModel extends Model {\n declare static database: Database;\n\n declare id: number;\n declare title: string;\n declare enabled: boolean;\n declare description?: string;\n declare type: string;\n declare config: any;\n declare useTransaction: boolean;\n\n declare createdAt: Date;\n declare updatedAt: Date;\n\n declare nodes: FlowNodeModel[];\n declare getNodes: HasManyGetAssociationsMixin<FlowNodeModel>;\n declare createNode: HasManyCreateAssociationMixin<FlowNodeModel>;\n\n declare executions: ExecutionModel[];\n declare getExecutions: HasManyGetAssociationsMixin<ExecutionModel>;\n declare createExecution: HasManyCreateAssociationMixin<ExecutionModel>;\n\n static async mount() {\n const collection = this.database.getCollection('workflows');\n const workflows = await collection.repository.find({\n filter: { enabled: true },\n });\n\n workflows.forEach((workflow: WorkflowModel) => {\n workflow.toggle();\n });\n\n this.addHook('afterCreate', (model: WorkflowModel) => model.toggle());\n this.addHook('afterUpdate', (model: WorkflowModel) => model.toggle());\n this.addHook('afterDestroy', (model: WorkflowModel) => model.toggle(false));\n }\n\n getHookId() {\n return `workflow-${this.get('id')}`;\n }\n\n getTransaction(options) {\n if (!this.useTransaction) {\n return undefined;\n }\n\n return options.transaction && !options.transaction.finished\n ? options.transaction\n : (<typeof WorkflowModel>this.constructor).database.sequelize.transaction();\n }\n\n async toggle(enable?: boolean) {\n const type = this.get('type');\n const { on, off } = triggers.get(type);\n if (typeof enable !== 'undefined' ? enable : this.get('enabled')) {\n on.call(this, this.trigger.bind(this));\n } else {\n off.call(this);\n }\n }\n\n async trigger(context: Object, options) {\n // `null` means not to trigger\n if (context === null) {\n return;\n }\n\n const transaction = await this.getTransaction(options);\n\n const execution = await this.createExecution({\n context,\n status: EXECUTION_STATUS.STARTED,\n useTransaction: this.useTransaction\n }, { transaction });\n\n execution.workflow = this;\n\n await execution.start({ transaction });\n\n if (transaction && (!options.transaction || options.transaction.finished)) {\n await transaction.commit();\n }\n\n return execution;\n }\n}\n"]}
package/esm/server.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import { Plugin } from '@nocobase/server';
2
- export default class WorkflowPlugin extends Plugin {
3
- load(options?: {}): Promise<void>;
4
- getName(): string;
5
- }
package/esm/server.js DELETED
@@ -1,62 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import path from 'path';
11
- import { Plugin } from '@nocobase/server';
12
- import WorkflowModel from './models/Workflow';
13
- import ExecutionModel from './models/Execution';
14
- import actions from './actions';
15
- export default class WorkflowPlugin extends Plugin {
16
- load(options = {}) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- const { db } = this.app;
19
- db.registerModels({
20
- WorkflowModel,
21
- ExecutionModel,
22
- });
23
- yield db.import({
24
- directory: path.resolve(__dirname, 'collections'),
25
- });
26
- actions(this.app);
27
- // [Life Cycle]:
28
- // * load all workflows in db
29
- // * add all hooks for enabled workflows
30
- // * add hooks for create/update[enabled]/delete workflow to add/remove specific hooks
31
- this.app.on('beforeStart', () => __awaiter(this, void 0, void 0, function* () {
32
- const { model } = db.getCollection('workflows');
33
- yield model.mount();
34
- }));
35
- // [Life Cycle]: initialize all necessary seed data
36
- this.app.on('db.init', () => __awaiter(this, void 0, void 0, function* () { }));
37
- // const [Automation, AutomationJob] = database.getModels(['automations', 'automations_jobs']);
38
- // Automation.addHook('afterCreate', async (model: AutomationModel) => {
39
- // model.get('enabled') && await model.loadJobs();
40
- // });
41
- // Automation.addHook('afterUpdate', async (model: AutomationModel) => {
42
- // if (!model.changed('enabled' as any)) {
43
- // return;
44
- // }
45
- // model.get('enabled') ? await model.loadJobs() : await model.cancelJobs();
46
- // });
47
- // Automation.addHook('beforeDestroy', async (model: AutomationModel) => {
48
- // await model.cancelJobs();
49
- // });
50
- // AutomationJob.addHook('afterCreate', async (model: AutomationJobModel) => {
51
- // await model.bootstrap();
52
- // });
53
- // AutomationJob.addHook('beforeDestroy', async (model: AutomationJobModel) => {
54
- // await model.cancel();
55
- // });
56
- });
57
- }
58
- getName() {
59
- return this.getPackageName(__dirname);
60
- }
61
- }
62
- //# sourceMappingURL=server.js.map
package/esm/server.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,MAAM;IAC1C,IAAI,CAAC,OAAO,GAAG,EAAE;;YACrB,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;YAExB,EAAE,CAAC,cAAc,CAAC;gBAChB,aAAa;gBACb,cAAc;aACf,CAAC,CAAC;YAEH,MAAM,EAAE,CAAC,MAAM,CAAC;gBACd,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC;aAClD,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAElB,gBAAgB;YAChB,+BAA+B;YAC/B,0CAA0C;YAC1C,wFAAwF;YACxF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,GAAS,EAAE;gBACpC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;gBAChD,MAAO,KAA8B,CAAC,KAAK,EAAE,CAAC;YAChD,CAAC,CAAA,CAAC,CAAC;YAEH,mDAAmD;YACnD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAS,EAAE,gDAAE,CAAC,CAAA,CAAC,CAAC;YAEvC,+FAA+F;YAE/F,wEAAwE;YACxE,oDAAoD;YACpD,MAAM;YAEN,wEAAwE;YACxE,4CAA4C;YAC5C,cAAc;YACd,MAAM;YACN,8EAA8E;YAC9E,MAAM;YAEN,0EAA0E;YAC1E,8BAA8B;YAC9B,MAAM;YAEN,8EAA8E;YAC9E,6BAA6B;YAC7B,MAAM;YAEN,gFAAgF;YAChF,0BAA0B;YAC1B,MAAM;QACR,CAAC;KAAA;IAED,OAAO;QACL,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;CACF","sourcesContent":["import path from 'path';\n\nimport { Plugin } from '@nocobase/server';\n\nimport WorkflowModel from './models/Workflow';\nimport ExecutionModel from './models/Execution';\nimport actions from './actions';\n\nexport default class WorkflowPlugin extends Plugin {\n async load(options = {}) {\n const { db } = this.app;\n\n db.registerModels({\n WorkflowModel,\n ExecutionModel,\n });\n\n await db.import({\n directory: path.resolve(__dirname, 'collections'),\n });\n\n actions(this.app);\n\n // [Life Cycle]:\n // * load all workflows in db\n // * add all hooks for enabled workflows\n // * add hooks for create/update[enabled]/delete workflow to add/remove specific hooks\n this.app.on('beforeStart', async () => {\n const { model } = db.getCollection('workflows');\n await (model as typeof WorkflowModel).mount();\n });\n\n // [Life Cycle]: initialize all necessary seed data\n this.app.on('db.init', async () => {});\n\n // const [Automation, AutomationJob] = database.getModels(['automations', 'automations_jobs']);\n\n // Automation.addHook('afterCreate', async (model: AutomationModel) => {\n // model.get('enabled') && await model.loadJobs();\n // });\n\n // Automation.addHook('afterUpdate', async (model: AutomationModel) => {\n // if (!model.changed('enabled' as any)) {\n // return;\n // }\n // model.get('enabled') ? await model.loadJobs() : await model.cancelJobs();\n // });\n\n // Automation.addHook('beforeDestroy', async (model: AutomationModel) => {\n // await model.cancelJobs();\n // });\n\n // AutomationJob.addHook('afterCreate', async (model: AutomationJobModel) => {\n // await model.bootstrap();\n // });\n\n // AutomationJob.addHook('beforeDestroy', async (model: AutomationJobModel) => {\n // await model.cancel();\n // });\n }\n\n getName(): string {\n return this.getPackageName(__dirname);\n }\n}\n"]}
@@ -1,9 +0,0 @@
1
- import { Registry } from '@nocobase/utils';
2
- import WorkflowModel from '../models/Workflow';
3
- export interface Trigger {
4
- name: string;
5
- on(this: WorkflowModel, callback: Function): void;
6
- off(this: WorkflowModel): void;
7
- }
8
- export declare const triggers: Registry<Trigger>;
9
- export default triggers;