@nocobase/plugin-workflow 0.7.0-alpha.34 → 0.7.0-alpha.57

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 (132) hide show
  1. package/lib/actions/index.js +31 -32
  2. package/lib/actions/nodes.js +310 -182
  3. package/lib/actions/workflows.js +260 -157
  4. package/lib/calculators/index.js +142 -90
  5. package/lib/collections/executions.js +40 -43
  6. package/lib/collections/flow_nodes.js +60 -65
  7. package/lib/collections/jobs.js +45 -47
  8. package/lib/collections/workflows.js +78 -87
  9. package/lib/constants.js +22 -17
  10. package/lib/index.js +71 -22
  11. package/lib/instructions/calculation.js +34 -29
  12. package/lib/instructions/condition.js +94 -87
  13. package/lib/instructions/create.js +43 -26
  14. package/lib/instructions/destroy.js +42 -25
  15. package/lib/instructions/index.js +46 -25
  16. package/lib/instructions/parallel.js +99 -84
  17. package/lib/instructions/prompt.js +21 -13
  18. package/lib/instructions/query.js +47 -29
  19. package/lib/instructions/update.js +44 -25
  20. package/lib/models/Execution.js +401 -248
  21. package/lib/models/FlowNode.js +18 -5
  22. package/lib/models/Job.js +18 -5
  23. package/lib/models/Workflow.js +132 -88
  24. package/lib/server.js +93 -66
  25. package/lib/triggers/collection.js +113 -51
  26. package/lib/triggers/index.js +25 -11
  27. package/package.json +7 -12
  28. package/esm/actions/index.d.ts +0 -1
  29. package/esm/actions/index.js +0 -14
  30. package/esm/actions/index.js.map +0 -1
  31. package/esm/actions/nodes.d.ts +0 -4
  32. package/esm/actions/nodes.js +0 -187
  33. package/esm/actions/nodes.js.map +0 -1
  34. package/esm/actions/workflows.d.ts +0 -3
  35. package/esm/actions/workflows.js +0 -163
  36. package/esm/actions/workflows.js.map +0 -1
  37. package/esm/calculators/index.d.ts +0 -38
  38. package/esm/calculators/index.js +0 -128
  39. package/esm/calculators/index.js.map +0 -1
  40. package/esm/collections/executions.d.ts +0 -3
  41. package/esm/collections/executions.js +0 -43
  42. package/esm/collections/executions.js.map +0 -1
  43. package/esm/collections/flow_nodes.d.ts +0 -3
  44. package/esm/collections/flow_nodes.js +0 -65
  45. package/esm/collections/flow_nodes.js.map +0 -1
  46. package/esm/collections/jobs.d.ts +0 -3
  47. package/esm/collections/jobs.js +0 -47
  48. package/esm/collections/jobs.js.map +0 -1
  49. package/esm/collections/workflows.d.ts +0 -3
  50. package/esm/collections/workflows.js +0 -87
  51. package/esm/collections/workflows.js.map +0 -1
  52. package/esm/constants.d.ts +0 -17
  53. package/esm/constants.js +0 -18
  54. package/esm/constants.js.map +0 -1
  55. package/esm/index.d.ts +0 -5
  56. package/esm/index.js +0 -6
  57. package/esm/index.js.map +0 -1
  58. package/esm/instructions/calculation.d.ts +0 -8
  59. package/esm/instructions/calculation.js +0 -55
  60. package/esm/instructions/calculation.js.map +0 -1
  61. package/esm/instructions/condition.d.ts +0 -5
  62. package/esm/instructions/condition.js +0 -99
  63. package/esm/instructions/condition.js.map +0 -1
  64. package/esm/instructions/create.d.ts +0 -8
  65. package/esm/instructions/create.js +0 -26
  66. package/esm/instructions/create.js.map +0 -1
  67. package/esm/instructions/destroy.d.ts +0 -8
  68. package/esm/instructions/destroy.js +0 -25
  69. package/esm/instructions/destroy.js.map +0 -1
  70. package/esm/instructions/index.d.ts +0 -15
  71. package/esm/instructions/index.js +0 -20
  72. package/esm/instructions/index.js.map +0 -1
  73. package/esm/instructions/parallel.d.ts +0 -13
  74. package/esm/instructions/parallel.js +0 -88
  75. package/esm/instructions/parallel.js.map +0 -1
  76. package/esm/instructions/prompt.d.ts +0 -7
  77. package/esm/instructions/prompt.js +0 -13
  78. package/esm/instructions/prompt.js.map +0 -1
  79. package/esm/instructions/query.d.ts +0 -8
  80. package/esm/instructions/query.js +0 -29
  81. package/esm/instructions/query.js.map +0 -1
  82. package/esm/instructions/update.d.ts +0 -9
  83. package/esm/instructions/update.js +0 -25
  84. package/esm/instructions/update.js.map +0 -1
  85. package/esm/models/Execution.d.ts +0 -51
  86. package/esm/models/Execution.js +0 -256
  87. package/esm/models/Execution.js.map +0 -1
  88. package/esm/models/FlowNode.d.ts +0 -17
  89. package/esm/models/FlowNode.js +0 -4
  90. package/esm/models/FlowNode.js.map +0 -1
  91. package/esm/models/Job.d.ts +0 -15
  92. package/esm/models/Job.js +0 -4
  93. package/esm/models/Job.js.map +0 -1
  94. package/esm/models/Workflow.d.ts +0 -29
  95. package/esm/models/Workflow.js +0 -88
  96. package/esm/models/Workflow.js.map +0 -1
  97. package/esm/server.d.ts +0 -5
  98. package/esm/server.js +0 -62
  99. package/esm/server.js.map +0 -1
  100. package/esm/triggers/collection.d.ts +0 -12
  101. package/esm/triggers/collection.js +0 -61
  102. package/esm/triggers/collection.js.map +0 -1
  103. package/esm/triggers/index.d.ts +0 -9
  104. package/esm/triggers/index.js +0 -6
  105. package/esm/triggers/index.js.map +0 -1
  106. package/lib/actions/index.js.map +0 -1
  107. package/lib/actions/nodes.js.map +0 -1
  108. package/lib/actions/workflows.js.map +0 -1
  109. package/lib/calculators/index.js.map +0 -1
  110. package/lib/collections/executions.js.map +0 -1
  111. package/lib/collections/flow_nodes.js.map +0 -1
  112. package/lib/collections/jobs.js.map +0 -1
  113. package/lib/collections/workflows.js.map +0 -1
  114. package/lib/constants.js.map +0 -1
  115. package/lib/index.js.map +0 -1
  116. package/lib/instructions/calculation.js.map +0 -1
  117. package/lib/instructions/condition.js.map +0 -1
  118. package/lib/instructions/create.js.map +0 -1
  119. package/lib/instructions/destroy.js.map +0 -1
  120. package/lib/instructions/index.js.map +0 -1
  121. package/lib/instructions/parallel.js.map +0 -1
  122. package/lib/instructions/prompt.js.map +0 -1
  123. package/lib/instructions/query.js.map +0 -1
  124. package/lib/instructions/update.js.map +0 -1
  125. package/lib/models/Execution.js.map +0 -1
  126. package/lib/models/FlowNode.js.map +0 -1
  127. package/lib/models/Job.js.map +0 -1
  128. package/lib/models/Workflow.js.map +0 -1
  129. package/lib/server.js.map +0 -1
  130. package/lib/triggers/collection.js.map +0 -1
  131. package/lib/triggers/index.js.map +0 -1
  132. package/tsconfig.build.json +0 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/plugin-workflow",
3
- "version": "0.7.0-alpha.34",
3
+ "version": "0.7.0-alpha.57",
4
4
  "main": "lib/index.js",
5
5
  "license": "Apache-2.0",
6
6
  "licenses": [
@@ -9,20 +9,15 @@
9
9
  "url": "http://www.apache.org/licenses/LICENSE-2.0"
10
10
  }
11
11
  ],
12
- "scripts": {
13
- "build": "rimraf -rf lib esm dist && npm run build:cjs && npm run build:esm",
14
- "build:cjs": "tsc --project tsconfig.build.json",
15
- "build:esm": "tsc --project tsconfig.build.json --module es2015 --outDir esm"
16
- },
17
12
  "dependencies": {
18
- "@nocobase/actions": "0.7.0-alpha.34",
19
- "@nocobase/database": "0.7.0-alpha.34",
20
- "@nocobase/server": "0.7.0-alpha.34",
21
- "@nocobase/utils": "0.7.0-alpha.34",
13
+ "@nocobase/actions": "0.7.0-alpha.57",
14
+ "@nocobase/database": "0.7.0-alpha.57",
15
+ "@nocobase/server": "0.7.0-alpha.57",
16
+ "@nocobase/utils": "0.7.0-alpha.57",
22
17
  "json-templates": "^4.2.0"
23
18
  },
24
19
  "devDependencies": {
25
- "@nocobase/test": "0.7.0-alpha.34"
20
+ "@nocobase/test": "0.7.0-alpha.57"
26
21
  },
27
- "gitHead": "48b2b4bc7bbc39533e461d34d7f026a4ad1a9b5c"
22
+ "gitHead": "33f076e430645055d79254592971c50d9f131a6d"
28
23
  }
@@ -1 +0,0 @@
1
- export default function (app: any): void;
@@ -1,14 +0,0 @@
1
- import * as workflows from './workflows';
2
- import * as nodes from './nodes';
3
- function make(name, mod) {
4
- return Object.keys(mod).reduce((result, key) => (Object.assign(Object.assign({}, result), { [`${name}:${key}`]: mod[key] })), {});
5
- }
6
- export default function (app) {
7
- app.actions(Object.assign(Object.assign(Object.assign({}, make('workflows', workflows)), make('workflows.nodes', {
8
- create: nodes.create,
9
- destroy: nodes.destroy
10
- })), make('flow_nodes', {
11
- update: nodes.update
12
- })));
13
- }
14
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,SAAS,IAAI,CAAC,IAAI,EAAE,GAAG;IACrB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,iCAC3C,MAAM,KACT,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAC5B,EAAE,EAAE,CAAC,CAAA;AACT,CAAC;AAED,MAAM,CAAC,OAAO,WAAU,GAAG;IACzB,GAAG,CAAC,OAAO,+CACN,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,GAC5B,IAAI,CAAC,iBAAiB,EAAE;QACzB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,GACC,IAAI,CAAC,YAAY,EAAE;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,EACF,CAAC;AACL,CAAC","sourcesContent":["import * as workflows from './workflows';\nimport * as nodes from './nodes';\n\nfunction make(name, mod) {\n return Object.keys(mod).reduce((result, key) => ({\n ...result,\n [`${name}:${key}`]: mod[key]\n }), {})\n}\n\nexport default function(app) {\n app.actions({\n ...make('workflows', workflows),\n ...make('workflows.nodes', {\n create: nodes.create,\n destroy: nodes.destroy\n }),\n ...make('flow_nodes', {\n update: nodes.update\n })\n });\n}\n"]}
@@ -1,4 +0,0 @@
1
- import { Context } from '@nocobase/actions';
2
- export declare function create(context: Context, next: any): Promise<void>;
3
- export declare function destroy(context: Context, next: any): Promise<void>;
4
- export declare function update(context: Context, next: any): Promise<void>;
@@ -1,187 +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 { Op } from 'sequelize';
11
- import { utils } from '@nocobase/actions';
12
- export function create(context, next) {
13
- return __awaiter(this, void 0, void 0, function* () {
14
- const { db } = context;
15
- const repository = utils.getRepositoryFromParams(context);
16
- const { whitelist, blacklist, updateAssociationValues, values, associatedIndex: workflowId } = context.action.params;
17
- context.body = yield db.sequelize.transaction((transaction) => __awaiter(this, void 0, void 0, function* () {
18
- const workflow = yield repository.getSourceModel(transaction);
19
- if (workflow.executed) {
20
- context.throw(400, 'Node could not be created in executed workflow');
21
- }
22
- const instance = yield repository.create({
23
- values,
24
- whitelist,
25
- blacklist,
26
- updateAssociationValues,
27
- context,
28
- transaction
29
- });
30
- if (!instance.upstreamId) {
31
- const previousHead = yield repository.findOne({
32
- filter: {
33
- id: {
34
- $ne: instance.id
35
- },
36
- upstreamId: null
37
- },
38
- transaction
39
- });
40
- if (previousHead) {
41
- yield previousHead.setUpstream(instance, { transaction });
42
- yield instance.setDownstream(previousHead, { transaction });
43
- instance.set('downstream', previousHead);
44
- }
45
- return instance;
46
- }
47
- const upstream = yield instance.getUpstream({ transaction });
48
- if (instance.branchIndex == null) {
49
- const downstream = yield upstream.getDownstream({ transaction });
50
- if (downstream) {
51
- yield downstream.setUpstream(instance, { transaction });
52
- yield instance.setDownstream(downstream, { transaction });
53
- instance.set('downstream', downstream);
54
- }
55
- yield upstream.update({
56
- downstreamId: instance.id
57
- }, { transaction });
58
- upstream.set('downstream', instance);
59
- }
60
- else {
61
- const [downstream] = yield upstream.getBranches({
62
- where: {
63
- id: {
64
- [Op.ne]: instance.id
65
- },
66
- branchIndex: instance.branchIndex
67
- },
68
- transaction
69
- });
70
- if (downstream) {
71
- yield downstream.update({
72
- upstreamId: instance.id,
73
- branchIndex: null
74
- }, { transaction });
75
- yield instance.setDownstream(downstream, { transaction });
76
- instance.set('downstream', downstream);
77
- }
78
- }
79
- instance.set('upstream', upstream);
80
- }));
81
- yield next();
82
- });
83
- }
84
- function searchBranchNodes(nodes, from) {
85
- const branchHeads = nodes
86
- .filter((item) => item.upstreamId === from.id && item.branchIndex != null);
87
- return branchHeads.reduce((flatten, head) => flatten.concat(searchBranchDownstreams(nodes, head)), []);
88
- }
89
- function searchBranchDownstreams(nodes, from) {
90
- let result = [];
91
- for (let search = from; search; search = search.downstream) {
92
- result = [...result, search, ...searchBranchNodes(nodes, search)];
93
- }
94
- return result;
95
- }
96
- export function destroy(context, next) {
97
- return __awaiter(this, void 0, void 0, function* () {
98
- const { db } = context;
99
- const repository = utils.getRepositoryFromParams(context);
100
- const { filterByTk } = context.action.params;
101
- context.body = yield db.sequelize.transaction((transaction) => __awaiter(this, void 0, void 0, function* () {
102
- const workflow = yield repository.getSourceModel(transaction);
103
- if (workflow.executed) {
104
- context.throw(400, 'Nodes in executed workflow could not be deleted');
105
- }
106
- const fields = ['id', 'upstreamId', 'downstreamId', 'branchIndex'];
107
- const instance = yield repository.findOne({
108
- filterByTk,
109
- fields: [...fields, 'workflowId'],
110
- appends: ['upstream', 'downstream'],
111
- transaction
112
- });
113
- const { upstream, downstream } = instance.get();
114
- if (upstream && upstream.downstreamId === instance.id) {
115
- yield upstream.update({
116
- downstreamId: instance.downstreamId
117
- }, { transaction });
118
- }
119
- if (downstream) {
120
- yield downstream.update({
121
- upstreamId: instance.upstreamId,
122
- branchIndex: instance.branchIndex
123
- }, { transaction });
124
- }
125
- const nodes = yield repository.find({
126
- filter: {
127
- workflowId: instance.workflowId
128
- },
129
- fields,
130
- transaction
131
- });
132
- const nodesMap = new Map();
133
- // make map
134
- nodes.forEach(item => {
135
- nodesMap.set(item.id, item);
136
- });
137
- // overwrite
138
- nodesMap.set(instance.id, instance);
139
- // make linked list
140
- nodes.forEach(item => {
141
- if (item.upstreamId) {
142
- item.upstream = nodesMap.get(item.upstreamId);
143
- }
144
- if (item.downstreamId) {
145
- item.downstream = nodesMap.get(item.downstreamId);
146
- }
147
- });
148
- const branchNodes = searchBranchNodes(nodes, instance);
149
- yield repository.destroy({
150
- filterByTk: [instance.id, ...branchNodes.map(item => item.id)],
151
- transaction
152
- });
153
- return instance;
154
- }));
155
- yield next();
156
- });
157
- }
158
- export function update(context, next) {
159
- return __awaiter(this, void 0, void 0, function* () {
160
- const { db } = context;
161
- const repository = utils.getRepositoryFromParams(context);
162
- const { filterByTk, values, whitelist, blacklist, filter, updateAssociationValues } = context.action.params;
163
- context.body = yield db.sequelize.transaction((transaction) => __awaiter(this, void 0, void 0, function* () {
164
- // TODO(optimize): duplicated instance query
165
- const { workflow } = yield repository.findOne({
166
- filterByTk,
167
- appends: ['workflow.executed'],
168
- transaction
169
- });
170
- if (workflow.executed) {
171
- context.throw(400, 'Nodes in executed workflow could not be reconfigured');
172
- }
173
- return repository.update({
174
- filterByTk,
175
- values,
176
- whitelist,
177
- blacklist,
178
- filter,
179
- updateAssociationValues,
180
- context,
181
- transaction
182
- });
183
- }));
184
- yield next();
185
- });
186
- }
187
- //# sourceMappingURL=nodes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/actions/nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import { Op } from 'sequelize';\nimport { Context, utils } from '@nocobase/actions';\nimport { MultipleRelationRepository } from '@nocobase/database';\nimport WorkflowModel from '../models/Workflow';\n\nexport async function create(context: Context, next) {\n const { db } = context;\n const repository = utils.getRepositoryFromParams(context) as MultipleRelationRepository;\n const { whitelist, blacklist, updateAssociationValues, values, associatedIndex: workflowId } = context.action.params;\n\n context.body = await db.sequelize.transaction(async transaction => {\n const workflow = await repository.getSourceModel(transaction) as WorkflowModel;\n if (workflow.executed) {\n context.throw(400, 'Node could not be created in executed workflow');\n }\n\n const instance = await repository.create({\n values,\n whitelist,\n blacklist,\n updateAssociationValues,\n context,\n transaction\n });\n\n if (!instance.upstreamId) {\n const previousHead = await repository.findOne({\n filter: {\n id: {\n $ne: instance.id\n },\n upstreamId: null\n },\n transaction\n });\n if (previousHead) {\n await previousHead.setUpstream(instance, { transaction });\n await instance.setDownstream(previousHead, { transaction });\n instance.set('downstream', previousHead);\n }\n return instance;\n }\n\n const upstream = await instance.getUpstream({ transaction });\n\n if (instance.branchIndex == null) {\n const downstream = await upstream.getDownstream({ transaction });\n\n if (downstream) {\n await downstream.setUpstream(instance, { transaction });\n await instance.setDownstream(downstream, { transaction });\n instance.set('downstream', downstream);\n }\n\n await upstream.update({\n downstreamId: instance.id\n }, { transaction });\n\n upstream.set('downstream', instance);\n } else {\n const [downstream] = await upstream.getBranches({\n where: {\n id: {\n [Op.ne]: instance.id\n },\n branchIndex: instance.branchIndex\n },\n transaction\n });\n\n if (downstream) {\n await downstream.update({\n upstreamId: instance.id,\n branchIndex: null\n }, { transaction });\n await instance.setDownstream(downstream, { transaction });\n instance.set('downstream', downstream);\n }\n }\n\n instance.set('upstream', upstream);\n });\n\n await next();\n}\n\nfunction searchBranchNodes(nodes, from): any[] {\n const branchHeads = nodes\n .filter((item: any) => item.upstreamId === from.id && item.branchIndex != null);\n return branchHeads.reduce((flatten: any[], head) => flatten.concat(searchBranchDownstreams(nodes, head)), []) as any[];\n}\n\nfunction searchBranchDownstreams(nodes, from) {\n let result = [];\n for (let search = from; search; search = search.downstream) {\n result = [...result, search, ...searchBranchNodes(nodes, search)];\n }\n return result;\n}\n\nexport async function destroy(context: Context, next) {\n const { db } = context;\n const repository = utils.getRepositoryFromParams(context) as MultipleRelationRepository;\n const { filterByTk } = context.action.params;\n\n context.body = await db.sequelize.transaction(async transaction => {\n const workflow = await repository.getSourceModel(transaction) as WorkflowModel;\n if (workflow.executed) {\n context.throw(400, 'Nodes in executed workflow could not be deleted');\n }\n\n const fields = ['id', 'upstreamId', 'downstreamId', 'branchIndex'];\n const instance = await repository.findOne({\n filterByTk,\n fields: [...fields, 'workflowId'],\n appends: ['upstream', 'downstream'],\n transaction\n });\n const { upstream, downstream } = instance.get();\n\n if (upstream && upstream.downstreamId === instance.id) {\n await upstream.update({\n downstreamId: instance.downstreamId\n }, { transaction });\n }\n\n if (downstream) {\n await downstream.update({\n upstreamId: instance.upstreamId,\n branchIndex: instance.branchIndex\n }, { transaction });\n }\n\n const nodes = await repository.find({\n filter: {\n workflowId: instance.workflowId\n },\n fields,\n transaction\n });\n const nodesMap = new Map();\n // make map\n nodes.forEach(item => {\n nodesMap.set(item.id, item);\n });\n // overwrite\n nodesMap.set(instance.id, instance);\n // make linked list\n nodes.forEach(item => {\n if (item.upstreamId) {\n item.upstream = nodesMap.get(item.upstreamId);\n }\n if (item.downstreamId) {\n item.downstream = nodesMap.get(item.downstreamId);\n }\n });\n\n const branchNodes = searchBranchNodes(nodes, instance);\n\n await repository.destroy({\n filterByTk: [instance.id, ...branchNodes.map(item => item.id)],\n transaction\n });\n\n return instance;\n });\n\n await next();\n}\n\nexport async function update(context: Context, next) {\n const { db } = context;\n const repository = utils.getRepositoryFromParams(context);\n const { filterByTk, values, whitelist, blacklist, filter, updateAssociationValues } = context.action.params;\n context.body = await db.sequelize.transaction(async transaction => {\n // TODO(optimize): duplicated instance query\n const { workflow } = await repository.findOne({\n filterByTk,\n appends: ['workflow.executed'],\n transaction\n });\n if (workflow.executed) {\n context.throw(400, 'Nodes in executed workflow could not be reconfigured');\n }\n\n return repository.update({\n filterByTk,\n values,\n whitelist,\n blacklist,\n filter,\n updateAssociationValues,\n context,\n transaction\n });\n });\n\n await next();\n}\n"]}
@@ -1,3 +0,0 @@
1
- import { Context } from '@nocobase/actions';
2
- export declare function update(context: Context, next: any): Promise<void>;
3
- export declare function duplicate(context: Context, next: any): Promise<void>;
@@ -1,163 +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
- var __asyncValues = (this && this.__asyncValues) || function (o) {
11
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
12
- var m = o[Symbol.asyncIterator], i;
13
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
14
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
15
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
16
- };
17
- import { utils } from '@nocobase/actions';
18
- import { Op } from '@nocobase/database';
19
- export function update(context, next) {
20
- return __awaiter(this, void 0, void 0, function* () {
21
- const { db } = context;
22
- const repository = utils.getRepositoryFromParams(context);
23
- const { filterByTk, values, whitelist, blacklist, filter, updateAssociationValues } = context.action.params;
24
- context.body = yield db.sequelize.transaction((transaction) => __awaiter(this, void 0, void 0, function* () {
25
- const others = {};
26
- if (values.enabled) {
27
- values.current = true;
28
- others.enabled = false;
29
- }
30
- if (values.current) {
31
- others.current = false;
32
- yield repository.update({
33
- filter: {
34
- key: values.key,
35
- id: {
36
- [Op.ne]: filterByTk
37
- }
38
- },
39
- values: others,
40
- context,
41
- transaction
42
- });
43
- }
44
- const instance = yield repository.update({
45
- filterByTk,
46
- values,
47
- whitelist,
48
- blacklist,
49
- filter,
50
- updateAssociationValues,
51
- context,
52
- transaction
53
- });
54
- return instance;
55
- }));
56
- yield next();
57
- });
58
- }
59
- function typeOf(value) {
60
- if (Array.isArray(value)) {
61
- return 'array';
62
- }
63
- else if (value instanceof Date) {
64
- return 'date';
65
- }
66
- else if (value === null) {
67
- return 'null';
68
- }
69
- return typeof value;
70
- }
71
- function migrateConfig(config, oldToNew) {
72
- function migrate(value) {
73
- switch (typeOf(value)) {
74
- case 'object':
75
- return Object.keys(value).reduce((result, key) => (Object.assign(Object.assign({}, result), { [key]: migrate(value[key]) })), {});
76
- case 'array':
77
- return value.map(item => migrate(item));
78
- case 'string':
79
- return value
80
- .replace(/(\{\{\$jobsMapByNodeId\.)(\d+)/, (_, prefix, id) => `${prefix}${oldToNew.get(Number.parseInt(id, 10)).id}`);
81
- default:
82
- return value;
83
- }
84
- }
85
- return migrate(config);
86
- }
87
- export function duplicate(context, next) {
88
- return __awaiter(this, void 0, void 0, function* () {
89
- const { db } = context;
90
- const repository = utils.getRepositoryFromParams(context);
91
- const { filterByTk } = context.action.params;
92
- context.body = yield db.sequelize.transaction((transaction) => __awaiter(this, void 0, void 0, function* () {
93
- var e_1, _a, e_2, _b;
94
- var _c, _d;
95
- const origin = yield repository.findOne({
96
- filterByTk,
97
- appends: ['nodes'],
98
- context,
99
- transaction
100
- });
101
- const instance = yield repository.create({
102
- values: {
103
- key: origin.key,
104
- title: origin.title,
105
- description: origin.description,
106
- type: origin.type,
107
- config: origin.config
108
- },
109
- transaction
110
- });
111
- const originalNodesMap = new Map();
112
- origin.nodes.forEach((node) => {
113
- originalNodesMap.set(node.id, node);
114
- });
115
- const oldToNew = new Map();
116
- const newToOld = new Map();
117
- try {
118
- for (var _e = __asyncValues(origin.nodes), _f; _f = yield _e.next(), !_f.done;) {
119
- const node = _f.value;
120
- const newNode = yield instance.createNode({
121
- type: node.type,
122
- config: node.config,
123
- title: node.title,
124
- branchIndex: node.branchIndex
125
- }, { transaction });
126
- // NOTE: keep original node references for later replacement
127
- oldToNew.set(node.id, newNode);
128
- newToOld.set(newNode.id, node);
129
- }
130
- }
131
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
132
- finally {
133
- try {
134
- if (_f && !_f.done && (_a = _e.return)) yield _a.call(_e);
135
- }
136
- finally { if (e_1) throw e_1.error; }
137
- }
138
- try {
139
- for (var _g = __asyncValues(oldToNew.entries()), _h; _h = yield _g.next(), !_h.done;) {
140
- const [oldId, newNode] = _h.value;
141
- const oldNode = originalNodesMap.get(oldId);
142
- const newUpstream = oldNode.upstreamId ? oldToNew.get(oldNode.upstreamId) : null;
143
- const newDownstream = oldNode.downstreamId ? oldToNew.get(oldNode.downstreamId) : null;
144
- yield newNode.update({
145
- upstreamId: (_c = newUpstream === null || newUpstream === void 0 ? void 0 : newUpstream.id) !== null && _c !== void 0 ? _c : null,
146
- downstreamId: (_d = newDownstream === null || newDownstream === void 0 ? void 0 : newDownstream.id) !== null && _d !== void 0 ? _d : null,
147
- config: migrateConfig(oldNode.config, oldToNew)
148
- }, { transaction });
149
- }
150
- }
151
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
152
- finally {
153
- try {
154
- if (_h && !_h.done && (_b = _g.return)) yield _b.call(_g);
155
- }
156
- finally { if (e_2) throw e_2.error; }
157
- }
158
- return instance;
159
- }));
160
- yield next();
161
- });
162
- }
163
- //# sourceMappingURL=workflows.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/actions/workflows.ts"],"names":[],"mappings":"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","sourcesContent":["import parse from 'json-templates';\n\nimport { Context, utils } from '@nocobase/actions';\nimport { Op } from '@nocobase/database';\n\n\n\nexport async function update(context: Context, next) {\n const { db } = context;\n const repository = utils.getRepositoryFromParams(context);\n const { filterByTk, values, whitelist, blacklist, filter, updateAssociationValues } = context.action.params;\n\n context.body = await db.sequelize.transaction(async transaction => {\n const others: { enabled?: boolean, current?: boolean } = {};\n\n if (values.enabled) {\n values.current = true;\n others.enabled = false;\n }\n\n if (values.current) {\n others.current = false;\n await repository.update({\n filter: {\n key: values.key,\n id: {\n [Op.ne]: filterByTk\n }\n },\n values: others,\n context,\n transaction\n });\n }\n\n const instance = await repository.update({\n filterByTk,\n values,\n whitelist,\n blacklist,\n filter,\n updateAssociationValues,\n context,\n transaction\n });\n\n return instance;\n });\n\n await next();\n}\n\nfunction typeOf(value) {\n if (Array.isArray(value)) {\n return 'array';\n } else if (value instanceof Date) {\n return 'date';\n } else if (value === null) {\n return 'null';\n }\n\n return typeof value;\n}\n\nfunction migrateConfig(config, oldToNew) {\n function migrate(value) {\n switch (typeOf(value)) {\n case 'object':\n return Object.keys(value).reduce((result, key) => ({ ...result, [key]: migrate(value[key]) }), {});\n case 'array':\n return value.map(item => migrate(item));\n case 'string':\n return value\n .replace(\n /(\\{\\{\\$jobsMapByNodeId\\.)(\\d+)/,\n (_, prefix, id) => `${prefix}${oldToNew.get(Number.parseInt(id, 10)).id}`\n );\n default:\n return value;\n }\n }\n\n return migrate(config);\n}\n\nexport async function duplicate(context: Context, next) {\n const { db } = context;\n const repository = utils.getRepositoryFromParams(context);\n const { filterByTk } = context.action.params;\n\n context.body = await db.sequelize.transaction(async transaction => {\n const origin = await repository.findOne({\n filterByTk,\n appends: ['nodes'],\n context,\n transaction\n });\n\n const instance = await repository.create({\n values: {\n key: origin.key,\n title: origin.title,\n description: origin.description,\n type: origin.type,\n config: origin.config\n },\n transaction\n });\n\n const originalNodesMap = new Map();\n origin.nodes.forEach((node) => {\n originalNodesMap.set(node.id, node);\n });\n\n const oldToNew = new Map();\n const newToOld = new Map();\n for await (const node of origin.nodes) {\n const newNode = await instance.createNode({\n type: node.type,\n config: node.config,\n title: node.title,\n branchIndex: node.branchIndex\n }, { transaction });\n // NOTE: keep original node references for later replacement\n oldToNew.set(node.id, newNode);\n newToOld.set(newNode.id, node);\n }\n\n for await (const [oldId, newNode] of oldToNew.entries()) {\n const oldNode = originalNodesMap.get(oldId);\n const newUpstream = oldNode.upstreamId ? oldToNew.get(oldNode.upstreamId) : null;\n const newDownstream = oldNode.downstreamId ? oldToNew.get(oldNode.downstreamId) : null;\n\n await newNode.update({\n upstreamId: newUpstream?.id ?? null,\n downstreamId: newDownstream?.id ?? null,\n config: migrateConfig(oldNode.config, oldToNew)\n }, { transaction });\n }\n\n return instance;\n });\n\n await next();\n}\n"]}
@@ -1,38 +0,0 @@
1
- import { Registry } from "@nocobase/utils";
2
- import ExecutionModel from '../models/Execution';
3
- import JobModel from '../models/Job';
4
- export declare const calculators: Registry<Function>;
5
- export default calculators;
6
- export declare type OperandType = '$context' | '$input' | '$jobsMapByNodeId' | '$calculation';
7
- export declare type ObjectGetterOptions = {
8
- path?: string;
9
- };
10
- export declare type JobGetterOptions = ObjectGetterOptions & {
11
- nodeId: number;
12
- };
13
- export declare type CalculationOptions = {
14
- calculator: string;
15
- operands: Operand[];
16
- };
17
- export declare type ConstantOperand = {
18
- type?: 'constant';
19
- value: any;
20
- };
21
- export declare type ContextOperand = {
22
- type: '$context';
23
- options: ObjectGetterOptions;
24
- };
25
- export declare type InputOperand = {
26
- type: '$input';
27
- options: ObjectGetterOptions;
28
- };
29
- export declare type JobOperand = {
30
- type: '$jobsMapByNodeId';
31
- options: JobGetterOptions;
32
- };
33
- export declare type Calculation = {
34
- type: '$calculation';
35
- options: CalculationOptions;
36
- };
37
- export declare type Operand = ContextOperand | InputOperand | JobOperand | ConstantOperand | Calculation;
38
- export declare function calculate(operand: Operand, lastJob: JobModel, execution: ExecutionModel): any;
@@ -1,128 +0,0 @@
1
- import { get as getWithPath } from 'lodash';
2
- import { Registry } from "@nocobase/utils";
3
- export const calculators = new Registry();
4
- export default calculators;
5
- // @deprecated
6
- // HACK: if no path provided, return self
7
- // @see https://github.com/lodash/lodash/pull/1270
8
- // TODO(question): should add default value as lodash?
9
- function get(object, path) {
10
- return path == null || !path.length ? object : getWithPath(object, path);
11
- }
12
- // NOTE:
13
- // this method could only be used in executing nodes.
14
- // because type of 'job' need loaded jobs in runtime execution.
15
- // or the execution should be prepared first.
16
- export function calculate(operand, lastJob, execution) {
17
- switch (operand.type) {
18
- // @Deprecated
19
- // from execution context
20
- case '$context':
21
- return get(execution.context, operand.options.path);
22
- // @Deprecated
23
- // from last job (or input job)
24
- case '$input':
25
- return lastJob !== null && lastJob !== void 0 ? lastJob : get(lastJob.result, operand.options.path);
26
- // @Deprecated
27
- // from job in execution
28
- case '$jobsMapByNodeId':
29
- // assume jobs have been fetched from execution before
30
- const job = execution.jobsMapByNodeId[operand.options.nodeId];
31
- return job && get(job, operand.options.path);
32
- case '$calculation':
33
- const fn = calculators.get(operand.options.calculator);
34
- if (!fn) {
35
- throw new Error(`no calculator function registered for "${operand.options.calculator}"`);
36
- }
37
- return fn(...operand.options.operands.map(item => calculate(item, lastJob, execution)));
38
- // constant
39
- default:
40
- return operand.value;
41
- }
42
- }
43
- // built-in functions
44
- function equal(a, b) {
45
- return a === b;
46
- }
47
- function notEqual(a, b) {
48
- return a !== b;
49
- }
50
- function gt(a, b) {
51
- return a > b;
52
- }
53
- function gte(a, b) {
54
- return a >= b;
55
- }
56
- function lt(a, b) {
57
- return a < b;
58
- }
59
- function lte(a, b) {
60
- return a <= b;
61
- }
62
- calculators.register('equal', equal);
63
- calculators.register('notEqual', notEqual);
64
- calculators.register('gt', gt);
65
- calculators.register('gte', gte);
66
- calculators.register('lt', lt);
67
- calculators.register('lte', lte);
68
- calculators.register('===', equal);
69
- calculators.register('!==', notEqual);
70
- calculators.register('>', gt);
71
- calculators.register('>=', gte);
72
- calculators.register('<', lt);
73
- calculators.register('<=', lte);
74
- function add(...args) {
75
- return args.reduce((sum, a) => sum + a, 0);
76
- }
77
- function minus(a, b) {
78
- return a - b;
79
- }
80
- function multiple(...args) {
81
- return args.reduce((result, a) => result * a, 1);
82
- }
83
- function divide(a, b) {
84
- return a / b;
85
- }
86
- function mod(a, b) {
87
- return a % b;
88
- }
89
- calculators.register('add', add);
90
- calculators.register('minus', minus);
91
- calculators.register('multiple', multiple);
92
- calculators.register('divide', divide);
93
- calculators.register('mod', mod);
94
- calculators.register('+', add);
95
- calculators.register('-', minus);
96
- calculators.register('*', multiple);
97
- calculators.register('/', divide);
98
- calculators.register('%', mod);
99
- function includes(a, b) {
100
- return a.includes(b);
101
- }
102
- function notIncludes(a, b) {
103
- return !a.includes(b);
104
- }
105
- function startsWith(a, b) {
106
- return a.startsWith(b);
107
- }
108
- function notStartsWith(a, b) {
109
- return !a.startsWith(b);
110
- }
111
- function endsWith(a, b) {
112
- return a.endsWith(b);
113
- }
114
- function notEndsWith(a, b) {
115
- return !a.endsWith(b);
116
- }
117
- calculators.register('includes', includes);
118
- calculators.register('notIncludes', notIncludes);
119
- calculators.register('startsWith', startsWith);
120
- calculators.register('notStartsWith', notStartsWith);
121
- calculators.register('endsWith', endsWith);
122
- calculators.register('notEndsWith', notEndsWith);
123
- function before(a, b) {
124
- return a < b;
125
- }
126
- calculators.register('now', () => new Date());
127
- // TODO: add more common calculators
128
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/calculators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAK3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,QAAQ,EAAY,CAAC;AAEpD,eAAe,WAAW,CAAC;AA8C3B,cAAc;AACd,yCAAyC;AACzC,kDAAkD;AAClD,sDAAsD;AACtD,SAAS,GAAG,CAAC,MAAM,EAAE,IAA6B;IAChD,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,QAAQ;AACR,sDAAsD;AACtD,gEAAgE;AAChE,8CAA8C;AAC9C,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,OAAiB,EAAE,SAAyB;IACtF,QAAQ,OAAO,CAAC,IAAI,EAAE;QACpB,cAAc;QACd,yBAAyB;QACzB,KAAK,UAAU;YACb,OAAO,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEtD,cAAc;QACd,+BAA+B;QAC/B,KAAK,QAAQ;YACX,OAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE9D,cAAc;QACd,wBAAwB;QACxB,KAAK,kBAAkB;YACrB,sDAAsD;YACtD,MAAM,GAAG,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE/C,KAAK,cAAc;YACjB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,EAAE;gBACP,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;aAC1F;YACD,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;QAE1F,WAAW;QACX;YACE,OAAO,OAAO,CAAC,KAAK,CAAC;KACxB;AACH,CAAC;AAID,qBAAqB;AAErB,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,CAAC,EAAE,CAAC;IACpB,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC3C,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/B,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/B,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAEjC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACnC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACtC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9B,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAChC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9B,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAIhC,SAAS,GAAG,CAAC,GAAG,IAAI;IAClB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,GAAG,IAAI;IACvB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACrC,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC3C,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAEjC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC/B,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACjC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACpC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAClC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE/B,SAAS,QAAQ,CAAC,CAAC,EAAE,CAAC;IACpB,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC;IACvB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,CAAS,EAAE,CAAS;IACtC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC3C,WAAW,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AACjD,WAAW,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAC/C,WAAW,CAAC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AACrD,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC3C,WAAW,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAEjD,SAAS,MAAM,CAAC,CAAS,EAAE,CAAS;IAClC,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAE9C,oCAAoC","sourcesContent":["import { get as getWithPath } from 'lodash';\nimport { Registry } from \"@nocobase/utils\";\n\nimport ExecutionModel from '../models/Execution';\nimport JobModel from '../models/Job';\n\nexport const calculators = new Registry<Function>();\n\nexport default calculators;\n\n\nexport type OperandType = '$context' | '$input' | '$jobsMapByNodeId' | '$calculation';\n\nexport type ObjectGetterOptions = {\n path?: string\n};\n\nexport type JobGetterOptions = ObjectGetterOptions & {\n nodeId: number\n};\n\nexport type CalculationOptions = {\n calculator: string,\n operands: Operand[]\n};\n\nexport type ConstantOperand = {\n type?: 'constant';\n value: any\n};\n\nexport type ContextOperand = {\n type: '$context';\n options: ObjectGetterOptions;\n};\n\nexport type InputOperand = {\n type: '$input';\n options: ObjectGetterOptions;\n};\n\nexport type JobOperand = {\n type: '$jobsMapByNodeId';\n options: JobGetterOptions;\n};\n\nexport type Calculation = {\n type: '$calculation';\n options: CalculationOptions\n};\n\n// TODO(type): union type here is wrong\nexport type Operand = ContextOperand | InputOperand | JobOperand | ConstantOperand | Calculation;\n\n// @deprecated\n// HACK: if no path provided, return self\n// @see https://github.com/lodash/lodash/pull/1270\n// TODO(question): should add default value as lodash?\nfunction get(object, path?: string | Array<string>) {\n return path == null || !path.length ? object : getWithPath(object, path);\n}\n\n// NOTE:\n// this method could only be used in executing nodes.\n// because type of 'job' need loaded jobs in runtime execution.\n// or the execution should be prepared first.\nexport function calculate(operand: Operand, lastJob: JobModel, execution: ExecutionModel) {\n switch (operand.type) {\n // @Deprecated\n // from execution context\n case '$context':\n return get(execution.context, operand.options.path);\n\n // @Deprecated\n // from last job (or input job)\n case '$input':\n return lastJob ?? get(lastJob.result, operand.options.path);\n\n // @Deprecated\n // from job in execution\n case '$jobsMapByNodeId':\n // assume jobs have been fetched from execution before\n const job = execution.jobsMapByNodeId[operand.options.nodeId];\n return job && get(job, operand.options.path);\n\n case '$calculation':\n const fn = calculators.get(operand.options.calculator);\n if (!fn) {\n throw new Error(`no calculator function registered for \"${operand.options.calculator}\"`);\n }\n return fn(...operand.options.operands.map(item => calculate(item, lastJob, execution)));\n\n // constant\n default:\n return operand.value;\n }\n}\n\n\n\n// built-in functions\n\nfunction equal(a, b) {\n return a === b;\n}\n\nfunction notEqual(a, b) {\n return a !== b;\n}\n\nfunction gt(a, b) {\n return a > b;\n}\n\nfunction gte(a, b) {\n return a >= b;\n}\n\nfunction lt(a, b) {\n return a < b;\n}\n\nfunction lte(a, b) {\n return a <= b;\n}\n\ncalculators.register('equal', equal);\ncalculators.register('notEqual', notEqual);\ncalculators.register('gt', gt);\ncalculators.register('gte', gte);\ncalculators.register('lt', lt);\ncalculators.register('lte', lte);\n\ncalculators.register('===', equal);\ncalculators.register('!==', notEqual);\ncalculators.register('>', gt);\ncalculators.register('>=', gte);\ncalculators.register('<', lt);\ncalculators.register('<=', lte);\n\n\n\nfunction add(...args) {\n return args.reduce((sum, a) => sum + a, 0);\n}\n\nfunction minus(a, b) {\n return a - b;\n}\n\nfunction multiple(...args) {\n return args.reduce((result, a) => result * a, 1);\n}\n\nfunction divide(a, b) {\n return a / b;\n}\n\nfunction mod(a, b) {\n return a % b;\n}\n\ncalculators.register('add', add);\ncalculators.register('minus', minus);\ncalculators.register('multiple', multiple);\ncalculators.register('divide', divide);\ncalculators.register('mod', mod);\n\ncalculators.register('+', add);\ncalculators.register('-', minus);\ncalculators.register('*', multiple);\ncalculators.register('/', divide);\ncalculators.register('%', mod);\n\nfunction includes(a, b) {\n return a.includes(b);\n}\n\nfunction notIncludes(a, b) {\n return !a.includes(b);\n}\n\nfunction startsWith(a: string, b: string) {\n return a.startsWith(b);\n}\n\nfunction notStartsWith(a: string, b: string) {\n return !a.startsWith(b);\n}\n\nfunction endsWith(a: string, b: string) {\n return a.endsWith(b);\n}\n\nfunction notEndsWith(a: string, b: string) {\n return !a.endsWith(b);\n}\n\ncalculators.register('includes', includes);\ncalculators.register('notIncludes', notIncludes);\ncalculators.register('startsWith', startsWith);\ncalculators.register('notStartsWith', notStartsWith);\ncalculators.register('endsWith', endsWith);\ncalculators.register('notEndsWith', notEndsWith);\n\nfunction before(a: string, b: string) {\n return a < b;\n}\n\ncalculators.register('now', () => new Date());\n\n// TODO: add more common calculators\n"]}