@veridid/workflow-parser 0.3.2 → 0.4.0

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 (38) hide show
  1. package/package.json +17 -32
  2. package/src/implementations/action.default.js +114 -0
  3. package/src/implementations/action.default.ts +74 -0
  4. package/src/implementations/display.default.js +132 -0
  5. package/src/implementations/display.default.ts +98 -0
  6. package/src/implementations/workflow.default.js +146 -0
  7. package/src/implementations/workflow.default.ts +64 -0
  8. package/src/index.js +6 -0
  9. package/src/index.ts +6 -0
  10. package/src/interfaces/actionextension.js +2 -0
  11. package/src/interfaces/actionextension.ts +7 -0
  12. package/src/interfaces/actioninterface.js +2 -0
  13. package/src/interfaces/actioninterface.ts +11 -0
  14. package/src/interfaces/displayextension.js +2 -0
  15. package/src/interfaces/displayextension.ts +7 -0
  16. package/src/interfaces/displayinterface.js +2 -0
  17. package/src/interfaces/displayinterface.ts +13 -0
  18. package/src/interfaces/workflowinterface.js +2 -0
  19. package/src/interfaces/workflowinterface.ts +24 -0
  20. package/{dist/schema.sql → src/support/Schema.sql} +2 -2
  21. package/src/workflowparser.js +100 -0
  22. package/src/workflowparser.ts +70 -0
  23. package/test/action.extension.js +65 -0
  24. package/test/action.extension.ts +22 -0
  25. package/test/display.extension.js +60 -0
  26. package/test/display.extension.ts +16 -0
  27. package/test/docker-compose.yml +33 -0
  28. package/test/pg_hba.conf +14 -0
  29. package/test/postgresql.conf +42 -0
  30. package/test/tables.sql +17 -0
  31. package/test/test.js +233 -0
  32. package/test/test.ts +159 -0
  33. package/test/testworkflows.json +223 -0
  34. package/tsconfig.json +15 -0
  35. package/dist/db.js +0 -40
  36. package/dist/dbCrud.js +0 -210
  37. package/dist/index.js +0 -22
  38. package/dist/parser.js +0 -125
package/dist/dbCrud.js DELETED
@@ -1,210 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.ensureClient = void 0;
16
- exports.workflowExists = workflowExists;
17
- exports.setWorkflows = setWorkflows;
18
- exports.getWorkflows = getWorkflows;
19
- exports.getWorkflowByID = getWorkflowByID;
20
- exports.updateWorkflowByID = updateWorkflowByID;
21
- exports.deleteWorkflowByID = deleteWorkflowByID;
22
- exports.deleteWorkflows = deleteWorkflows;
23
- exports.setWorkflowInstance = setWorkflowInstance;
24
- exports.getWorkflowInstances = getWorkflowInstances;
25
- exports.getWorkflowInstanceByID = getWorkflowInstanceByID;
26
- exports.getWorkflowInstance = getWorkflowInstance;
27
- exports.updateWorkflowInstanceByID = updateWorkflowInstanceByID;
28
- exports.deleteWorkflowInstanceByID = deleteWorkflowInstanceByID;
29
- exports.deleteWorkflowInstances = deleteWorkflowInstances;
30
- exports.initDb = initDb;
31
- exports.loadWorkflowsFromFile = loadWorkflowsFromFile;
32
- exports.loadWorkflowsFromJson = loadWorkflowsFromJson;
33
- const db_1 = __importDefault(require("./db"));
34
- const fs_1 = require("fs");
35
- const path_1 = require("path");
36
- let client;
37
- const ensureClient = () => __awaiter(void 0, void 0, void 0, function* () {
38
- if (!client) {
39
- client = yield db_1.default;
40
- }
41
- });
42
- exports.ensureClient = ensureClient;
43
- function workflowExists(workflowID) {
44
- return __awaiter(this, void 0, void 0, function* () {
45
- yield (0, exports.ensureClient)();
46
- const res = yield client.query('SELECT 1 FROM workflows WHERE "workflowID" = $1', [workflowID]);
47
- return res.rowCount > 0;
48
- });
49
- }
50
- function setWorkflows(workflows) {
51
- return __awaiter(this, void 0, void 0, function* () {
52
- yield (0, exports.ensureClient)();
53
- const query = 'INSERT INTO workflows ("workflowID", name, "formatVersion", "initialState", render, states) VALUES ($1, $2, $3, $4, $5, $6)';
54
- for (const workflow of workflows) {
55
- const exists = yield workflowExists(workflow.workflowID);
56
- if (exists) {
57
- console.log(`Workflow ${workflow.workflowID} already exists. Skipping insertion.`);
58
- continue;
59
- }
60
- console.log("Inserting workflow:", workflow);
61
- yield client.query(query, [
62
- workflow.workflowID,
63
- workflow.name,
64
- workflow.formatVersion,
65
- workflow.initialState,
66
- JSON.stringify(workflow.render),
67
- JSON.stringify(workflow.states)
68
- ]);
69
- }
70
- });
71
- }
72
- function getWorkflows() {
73
- return __awaiter(this, void 0, void 0, function* () {
74
- yield (0, exports.ensureClient)();
75
- const res = yield client.query('SELECT * FROM workflows');
76
- return res.rows;
77
- });
78
- }
79
- function getWorkflowByID(workflowID) {
80
- return __awaiter(this, void 0, void 0, function* () {
81
- yield (0, exports.ensureClient)();
82
- const res = yield client.query('SELECT * FROM workflows WHERE "workflowID" = $1', [workflowID]);
83
- return res.rows[0];
84
- });
85
- }
86
- function updateWorkflowByID(workflowID, workflow) {
87
- return __awaiter(this, void 0, void 0, function* () {
88
- yield (0, exports.ensureClient)();
89
- const query = 'UPDATE workflows SET name = $1, "formatVersion" = $2, "initialState" = $3, render = $4, states = $5 WHERE "workflowID" = $6';
90
- yield client.query(query, [workflow.name, workflow.formatVersion, workflow.initialState, workflow.render, workflow.states, workflowID]);
91
- });
92
- }
93
- function deleteWorkflowByID(workflowID) {
94
- return __awaiter(this, void 0, void 0, function* () {
95
- yield (0, exports.ensureClient)();
96
- yield client.query('DELETE FROM workflows WHERE "workflowID" = $1', [workflowID]);
97
- });
98
- }
99
- function deleteWorkflows() {
100
- return __awaiter(this, void 0, void 0, function* () {
101
- yield (0, exports.ensureClient)();
102
- yield client.query('DELETE FROM workflows');
103
- });
104
- }
105
- function setWorkflowInstance(instance) {
106
- return __awaiter(this, void 0, void 0, function* () {
107
- yield (0, exports.ensureClient)();
108
- const query = 'INSERT INTO instances ("instanceID", "workflowID", "connectionID", "currentState", "stateData") VALUES ($1, $2, $3, $4, $5)';
109
- yield client.query(query, [instance.instanceID, instance.workflowID, instance.connectionID, instance.currentState, instance.stateData]);
110
- });
111
- }
112
- function getWorkflowInstances() {
113
- return __awaiter(this, void 0, void 0, function* () {
114
- yield (0, exports.ensureClient)();
115
- const res = yield client.query('SELECT * FROM instances');
116
- return res.rows;
117
- });
118
- }
119
- function getWorkflowInstanceByID(instanceID) {
120
- return __awaiter(this, void 0, void 0, function* () {
121
- yield (0, exports.ensureClient)();
122
- const res = yield client.query('SELECT * FROM instances WHERE "instanceID" = $1', [instanceID]);
123
- return res.rows[0];
124
- });
125
- }
126
- function getWorkflowInstance(connectionID, workflowID) {
127
- return __awaiter(this, void 0, void 0, function* () {
128
- yield (0, exports.ensureClient)();
129
- const res = yield client.query('SELECT * FROM instances WHERE "connectionID" = $1 AND "workflowID" = $2', [connectionID, workflowID]);
130
- return res.rows.length > 0 ? res.rows[0] : null;
131
- });
132
- }
133
- function updateWorkflowInstanceByID(instanceID, instance) {
134
- return __awaiter(this, void 0, void 0, function* () {
135
- yield (0, exports.ensureClient)();
136
- const query = 'UPDATE instances SET "workflowID" = $1, "connectionID" = $2, "currentState" = $3, "stateData" = $4 WHERE "instanceID" = $5';
137
- yield client.query(query, [instance.workflowID, instance.connectionID, instance.currentState, instance.stateData, instanceID]);
138
- });
139
- }
140
- function deleteWorkflowInstanceByID(instanceID) {
141
- return __awaiter(this, void 0, void 0, function* () {
142
- yield (0, exports.ensureClient)();
143
- yield client.query('DELETE FROM instances WHERE "instanceID" = $1', [instanceID]);
144
- });
145
- }
146
- function deleteWorkflowInstances() {
147
- return __awaiter(this, void 0, void 0, function* () {
148
- yield (0, exports.ensureClient)();
149
- yield client.query('DELETE FROM instances');
150
- });
151
- }
152
- function initDb() {
153
- return __awaiter(this, void 0, void 0, function* () {
154
- yield (0, exports.ensureClient)();
155
- try {
156
- const schema = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, 'schema.sql')).toString();
157
- yield client.query(schema);
158
- console.log('Database initialized');
159
- }
160
- catch (error) {
161
- if (error.code === '42P07') {
162
- console.log('Database already initialized');
163
- }
164
- else {
165
- console.error('Error initializing database', error);
166
- }
167
- }
168
- });
169
- }
170
- function loadWorkflowsFromFile(filePath) {
171
- return __awaiter(this, void 0, void 0, function* () {
172
- yield (0, exports.ensureClient)();
173
- try {
174
- const workflowsData = (0, fs_1.readFileSync)(filePath, 'utf-8');
175
- const workflows = JSON.parse(workflowsData);
176
- let insertedCount = 0;
177
- let skippedCount = 0;
178
- for (const workflow of workflows) {
179
- const exists = yield workflowExists(workflow.workflowID);
180
- if (exists) {
181
- console.log(`Workflow ${workflow.workflowID} already exists. Skipping insertion.`);
182
- skippedCount++;
183
- }
184
- else {
185
- console.log(`Inserting workflow: ${JSON.stringify(workflow)}`);
186
- yield client.query('INSERT INTO workflows ("workflowID", name, "formatVersion", "initialState", render, states) VALUES ($1, $2, $3, $4, $5, $6)', [
187
- workflow.workflowID,
188
- workflow.name,
189
- workflow.formatVersion,
190
- workflow.initialState,
191
- JSON.stringify(workflow.render),
192
- JSON.stringify(workflow.states)
193
- ]);
194
- insertedCount++;
195
- }
196
- }
197
- console.log(`Workflows loaded successfully. Inserted: ${insertedCount}, Skipped: ${skippedCount}`);
198
- }
199
- catch (error) {
200
- console.error('Error loading workflows from file:', error.message);
201
- }
202
- });
203
- }
204
- function loadWorkflowsFromJson(jsonContent) {
205
- return __awaiter(this, void 0, void 0, function* () {
206
- yield (0, exports.ensureClient)();
207
- const workflows = JSON.parse(jsonContent);
208
- yield setWorkflows(workflows);
209
- });
210
- }
package/dist/index.js DELETED
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parse = exports.initDb = exports.loadWorkflowsFromJson = exports.loadWorkflowsFromFile = exports.deleteWorkflowInstances = exports.deleteWorkflowInstanceByID = exports.updateWorkflowInstanceByID = exports.getWorkflowInstanceByID = exports.getWorkflowInstances = exports.setWorkflowInstance = exports.deleteWorkflows = exports.deleteWorkflowByID = exports.updateWorkflowByID = exports.getWorkflowByID = exports.setWorkflows = exports.getWorkflows = exports.workflowExists = void 0;
4
- var dbCrud_1 = require("./dbCrud");
5
- Object.defineProperty(exports, "workflowExists", { enumerable: true, get: function () { return dbCrud_1.workflowExists; } });
6
- Object.defineProperty(exports, "getWorkflows", { enumerable: true, get: function () { return dbCrud_1.getWorkflows; } });
7
- Object.defineProperty(exports, "setWorkflows", { enumerable: true, get: function () { return dbCrud_1.setWorkflows; } });
8
- Object.defineProperty(exports, "getWorkflowByID", { enumerable: true, get: function () { return dbCrud_1.getWorkflowByID; } });
9
- Object.defineProperty(exports, "updateWorkflowByID", { enumerable: true, get: function () { return dbCrud_1.updateWorkflowByID; } });
10
- Object.defineProperty(exports, "deleteWorkflowByID", { enumerable: true, get: function () { return dbCrud_1.deleteWorkflowByID; } });
11
- Object.defineProperty(exports, "deleteWorkflows", { enumerable: true, get: function () { return dbCrud_1.deleteWorkflows; } });
12
- Object.defineProperty(exports, "setWorkflowInstance", { enumerable: true, get: function () { return dbCrud_1.setWorkflowInstance; } });
13
- Object.defineProperty(exports, "getWorkflowInstances", { enumerable: true, get: function () { return dbCrud_1.getWorkflowInstances; } });
14
- Object.defineProperty(exports, "getWorkflowInstanceByID", { enumerable: true, get: function () { return dbCrud_1.getWorkflowInstanceByID; } });
15
- Object.defineProperty(exports, "updateWorkflowInstanceByID", { enumerable: true, get: function () { return dbCrud_1.updateWorkflowInstanceByID; } });
16
- Object.defineProperty(exports, "deleteWorkflowInstanceByID", { enumerable: true, get: function () { return dbCrud_1.deleteWorkflowInstanceByID; } });
17
- Object.defineProperty(exports, "deleteWorkflowInstances", { enumerable: true, get: function () { return dbCrud_1.deleteWorkflowInstances; } });
18
- Object.defineProperty(exports, "loadWorkflowsFromFile", { enumerable: true, get: function () { return dbCrud_1.loadWorkflowsFromFile; } });
19
- Object.defineProperty(exports, "loadWorkflowsFromJson", { enumerable: true, get: function () { return dbCrud_1.loadWorkflowsFromJson; } });
20
- Object.defineProperty(exports, "initDb", { enumerable: true, get: function () { return dbCrud_1.initDb; } });
21
- var parser_1 = require("./parser");
22
- Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parser_1.parse; } });
package/dist/parser.js DELETED
@@ -1,125 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.parse = parse;
13
- const uuid_1 = require("uuid");
14
- const dbCrud_1 = require("./dbCrud");
15
- function parse(connectionID, action) {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- yield (0, dbCrud_1.ensureClient)();
18
- const { workflowID, actionID, data } = action;
19
- const workflow = yield (0, dbCrud_1.getWorkflowByID)(workflowID);
20
- if (!workflow) {
21
- throw new Error('Workflow not found');
22
- }
23
- let instance = yield (0, dbCrud_1.getWorkflowInstance)(connectionID, workflowID);
24
- if (!instance) {
25
- instance = {
26
- instanceID: (0, uuid_1.v4)(),
27
- workflowID,
28
- connectionID,
29
- currentState: workflow.initialState,
30
- stateData: {},
31
- };
32
- yield (0, dbCrud_1.setWorkflowInstance)(instance);
33
- console.log(`New instance created: ${instance.instanceID}`);
34
- const initialState = workflow.states.find((state) => state.stateID === workflow.initialState);
35
- if (!initialState) {
36
- throw new Error('Initial state not found in workflow');
37
- }
38
- return {
39
- workflowID: workflow.workflowID,
40
- displayData: initialState.displayData,
41
- };
42
- }
43
- console.log("instance", instance);
44
- const currentState = workflow.states.find((state) => state.stateID === instance.currentState);
45
- if (!currentState) {
46
- console.error(`Current state not found: ${instance.currentState}`);
47
- throw new Error('Current state not found in workflow');
48
- }
49
- console.log(`Current state: ${currentState.stateID}`);
50
- if (actionID) {
51
- const transition = currentState.transitions.find((t) => t.actionID === actionID);
52
- console.log("transition", transition);
53
- if (!transition) {
54
- console.error(`Action not found in current state transitions: ${actionID}`);
55
- return {
56
- workflowID: workflow.workflowID,
57
- displayData: currentState.displayData,
58
- };
59
- }
60
- console.log(`Transition found: ${transition.actionID}`);
61
- if (transition.type === 'workflow') {
62
- const newWorkflowID = transition.value;
63
- const newWorkflow = yield (0, dbCrud_1.getWorkflowByID)(newWorkflowID);
64
- if (!newWorkflow) {
65
- console.log(`New workflow not found: ${newWorkflowID}`);
66
- return {
67
- workflowID: `${newWorkflowID}`,
68
- displayData: [
69
- { text: 'Note: Workflow NOT found', type: 'title' },
70
- {
71
- text: 'We are working on it. Please explore other options. Type :menu to view home menu',
72
- type: 'text'
73
- }
74
- ],
75
- };
76
- }
77
- let newInstance = yield (0, dbCrud_1.getWorkflowInstance)(connectionID, newWorkflowID);
78
- if (!newInstance) {
79
- newInstance = {
80
- instanceID: (0, uuid_1.v4)(),
81
- workflowID: newWorkflowID,
82
- connectionID,
83
- currentState: newWorkflow.initialState,
84
- stateData: {},
85
- };
86
- yield (0, dbCrud_1.setWorkflowInstance)(newInstance);
87
- console.log(`New instance created for workflow ${newWorkflowID}: ${newInstance.instanceID}`);
88
- }
89
- const currentState = newWorkflow.states.find((state) => state.stateID === newInstance.currentState);
90
- if (!currentState) {
91
- console.error(`Current state not found: ${instance.currentState}`);
92
- throw new Error('Current state not found in workflow');
93
- }
94
- console.log(`Current state: ${currentState.stateID}`);
95
- return {
96
- workflowID: newWorkflow.workflowID,
97
- displayData: currentState.displayData,
98
- };
99
- }
100
- else if (transition.type === 'state') {
101
- instance.currentState = transition.value;
102
- yield (0, dbCrud_1.updateWorkflowInstanceByID)(instance.instanceID, instance);
103
- console.log(`Instance state updated: ${instance.currentState}`);
104
- const nextState = workflow.states.find((state) => state.stateID === instance.currentState);
105
- if (!nextState) {
106
- console.error(`Next state not found: ${instance.currentState}`);
107
- throw new Error('Next state not found in workflow');
108
- }
109
- return {
110
- workflowID: workflow.workflowID,
111
- displayData: nextState.displayData,
112
- };
113
- }
114
- else {
115
- throw new Error(`Unknown transition type: ${transition.type}`);
116
- }
117
- }
118
- else {
119
- return {
120
- workflowID: workflow.workflowID,
121
- displayData: currentState.displayData,
122
- };
123
- }
124
- });
125
- }