@cap-js/process 0.1.0 → 0.2.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.
- package/README.md +135 -10
- package/dist/lib/api/process-api-client.js.map +1 -1
- package/dist/lib/build/constants.js +9 -1
- package/dist/lib/build/constants.js.map +1 -1
- package/dist/lib/build/plugin.js +67 -71
- package/dist/lib/build/plugin.js.map +1 -1
- package/dist/lib/build/validation-utils.js +2 -2
- package/dist/lib/build/validation-utils.js.map +1 -1
- package/dist/lib/build/validations.js +44 -34
- package/dist/lib/build/validations.js.map +1 -1
- package/dist/lib/constants.js +24 -32
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/handlers/annotationCache.js +30 -20
- package/dist/lib/handlers/annotationCache.js.map +1 -1
- package/dist/lib/handlers/annotationHandlers.js +13 -17
- package/dist/lib/handlers/annotationHandlers.js.map +1 -1
- package/dist/lib/handlers/index.js +2 -7
- package/dist/lib/handlers/index.js.map +1 -1
- package/dist/lib/handlers/onDeleteUtils.js +5 -48
- package/dist/lib/handlers/onDeleteUtils.js.map +1 -1
- package/dist/lib/handlers/processActionHandler.js +42 -32
- package/dist/lib/handlers/processActionHandler.js.map +1 -1
- package/dist/lib/handlers/processCancel.js +3 -16
- package/dist/lib/handlers/processCancel.js.map +1 -1
- package/dist/lib/handlers/processResume.js +3 -16
- package/dist/lib/handlers/processResume.js.map +1 -1
- package/dist/lib/handlers/processStart.js +136 -75
- package/dist/lib/handlers/processStart.js.map +1 -1
- package/dist/lib/handlers/processSuspend.js +3 -16
- package/dist/lib/handlers/processSuspend.js.map +1 -1
- package/dist/lib/handlers/utils.js +3 -0
- package/dist/lib/handlers/utils.js.map +1 -1
- package/dist/lib/processImport/csnBuilder.js +196 -0
- package/dist/lib/processImport/csnBuilder.js.map +1 -0
- package/dist/lib/processImport/index.js +178 -0
- package/dist/lib/processImport/index.js.map +1 -0
- package/dist/lib/processImport/rawWorkflowConverter.js +148 -0
- package/dist/lib/processImport/rawWorkflowConverter.js.map +1 -0
- package/dist/lib/processImport/schemaMapper.js +200 -0
- package/dist/lib/processImport/schemaMapper.js.map +1 -0
- package/dist/lib/processImport/utils.js +33 -0
- package/dist/lib/processImport/utils.js.map +1 -0
- package/dist/lib/processImportRegistration.js +5 -1
- package/dist/lib/processImportRegistration.js.map +1 -1
- package/dist/lib/shared/annotations-helper.js +98 -0
- package/dist/lib/shared/annotations-helper.js.map +1 -0
- package/dist/lib/shared/businessKey-helper.js +1 -0
- package/dist/lib/shared/businessKey-helper.js.map +1 -1
- package/package.json +5 -3
- package/dist/lib/processImport.js +0 -450
- package/dist/lib/processImport.js.map +0 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.buildCsnModel = buildCsnModel;
|
|
40
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
41
|
+
const csn = __importStar(require("../types/csn-extensions"));
|
|
42
|
+
const constants_1 = require("../constants");
|
|
43
|
+
const schemaMapper_1 = require("./schemaMapper");
|
|
44
|
+
const utils_1 = require("./utils");
|
|
45
|
+
const LOG = cds_1.default.log(constants_1.PROCESS_LOGGER_PREFIX);
|
|
46
|
+
function buildCsnModel(process, dataTypeCache) {
|
|
47
|
+
const serviceName = `${process.projectId}.${(0, utils_1.capitalize)(process.identifier)}Service`;
|
|
48
|
+
LOG.debug(`Service name: ${serviceName}`);
|
|
49
|
+
const definitions = {};
|
|
50
|
+
definitions[serviceName] = createServiceDefinition(serviceName, process);
|
|
51
|
+
for (const dataType of dataTypeCache.values()) {
|
|
52
|
+
addDataTypeDefinition(dataType, serviceName, definitions, dataTypeCache);
|
|
53
|
+
}
|
|
54
|
+
addProcessTypes(process, serviceName, definitions, dataTypeCache);
|
|
55
|
+
const normalizedInputSchema = (0, schemaMapper_1.ensureObjectSchema)(process.header?.inputs);
|
|
56
|
+
const inputProperties = normalizedInputSchema.properties ?? {};
|
|
57
|
+
const hasInputProperties = Object.keys(inputProperties).length > 0;
|
|
58
|
+
const hasRequiredInputs = hasInputProperties && (normalizedInputSchema.required?.length ?? 0) > 0;
|
|
59
|
+
addProcessActions(serviceName, definitions, hasInputProperties, hasRequiredInputs);
|
|
60
|
+
return {
|
|
61
|
+
$version: '2.0',
|
|
62
|
+
definitions,
|
|
63
|
+
meta: { creator: '@cap-js/process' },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function createServiceDefinition(serviceName, process) {
|
|
67
|
+
return {
|
|
68
|
+
kind: 'service',
|
|
69
|
+
name: serviceName,
|
|
70
|
+
doc: 'DO NOT EDIT. THIS IS A GENERATED SERVICE THAT WILL BE OVERRIDDEN ON NEXT IMPORT.',
|
|
71
|
+
'@protocol': 'none',
|
|
72
|
+
'@bpm.process': `${process.projectId}.${process.identifier}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function addDataTypeDefinition(dataType, serviceName, definitions, dataTypeCache) {
|
|
76
|
+
const typeName = (0, utils_1.fqn)(serviceName, (0, utils_1.sanitizeName)(dataType.name));
|
|
77
|
+
if (definitions[typeName])
|
|
78
|
+
return;
|
|
79
|
+
if (!dataType.header || dataType.header.type !== 'object') {
|
|
80
|
+
LOG.warn(`Data type ${dataType.name} has no valid schema, creating empty type`);
|
|
81
|
+
definitions[typeName] = { kind: 'type', name: typeName, elements: {} };
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
definitions[typeName] = (0, schemaMapper_1.buildTypeFromSchema)(typeName, dataType.header, serviceName, definitions, dataTypeCache);
|
|
85
|
+
LOG.debug(`Generated type: ${typeName}`);
|
|
86
|
+
}
|
|
87
|
+
function addProcessTypes(process, serviceName, definitions, dataTypeCache) {
|
|
88
|
+
const inputsName = (0, utils_1.fqn)(serviceName, 'ProcessInputs');
|
|
89
|
+
const outputsName = (0, utils_1.fqn)(serviceName, 'ProcessOutputs');
|
|
90
|
+
const attributeName = (0, utils_1.fqn)(serviceName, 'ProcessAttribute');
|
|
91
|
+
const attributesName = (0, utils_1.fqn)(serviceName, 'ProcessAttributes');
|
|
92
|
+
const instanceName = (0, utils_1.fqn)(serviceName, 'ProcessInstance');
|
|
93
|
+
const instancesName = (0, utils_1.fqn)(serviceName, 'ProcessInstances');
|
|
94
|
+
definitions[inputsName] = (0, schemaMapper_1.buildTypeFromSchema)(inputsName, (0, schemaMapper_1.ensureObjectSchema)(process.header?.inputs), serviceName, definitions, dataTypeCache);
|
|
95
|
+
definitions[outputsName] = (0, schemaMapper_1.buildTypeFromSchema)(outputsName, (0, schemaMapper_1.ensureObjectSchema)(process.header?.outputs), serviceName, definitions, dataTypeCache);
|
|
96
|
+
definitions[attributeName] = {
|
|
97
|
+
kind: 'type',
|
|
98
|
+
name: attributeName,
|
|
99
|
+
elements: {
|
|
100
|
+
id: { type: csn.CdsBuiltinType.String, notNull: true },
|
|
101
|
+
label: { type: csn.CdsBuiltinType.String, notNull: true },
|
|
102
|
+
value: { type: csn.CdsBuiltinType.String },
|
|
103
|
+
type: { type: csn.CdsBuiltinType.String, notNull: true },
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
definitions[attributesName] = {
|
|
107
|
+
kind: 'type',
|
|
108
|
+
name: attributesName,
|
|
109
|
+
items: {
|
|
110
|
+
type: attributeName,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
definitions[instanceName] = {
|
|
114
|
+
kind: 'type',
|
|
115
|
+
name: instanceName,
|
|
116
|
+
elements: {
|
|
117
|
+
definitionId: { type: csn.CdsBuiltinType.String },
|
|
118
|
+
definitionVersion: { type: csn.CdsBuiltinType.String },
|
|
119
|
+
id: { type: csn.CdsBuiltinType.String },
|
|
120
|
+
status: { type: csn.CdsBuiltinType.String },
|
|
121
|
+
startedAt: { type: csn.CdsBuiltinType.String },
|
|
122
|
+
startedBy: { type: csn.CdsBuiltinType.String },
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
definitions[instancesName] = {
|
|
126
|
+
kind: 'type',
|
|
127
|
+
name: instancesName,
|
|
128
|
+
items: { type: instanceName },
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function addProcessActions(serviceName, definitions, hasInputProperties, hasRequiredInputs) {
|
|
132
|
+
const inputsType = (0, utils_1.fqn)(serviceName, 'ProcessInputs');
|
|
133
|
+
const outputsType = (0, utils_1.fqn)(serviceName, 'ProcessOutputs');
|
|
134
|
+
const attributesType = (0, utils_1.fqn)(serviceName, 'ProcessAttributes');
|
|
135
|
+
const instancesType = (0, utils_1.fqn)(serviceName, 'ProcessInstances');
|
|
136
|
+
// Start action — three tiers:
|
|
137
|
+
// 1. No input properties: start() with no params
|
|
138
|
+
// 2. All inputs optional: start(inputs: ProcessInputs) — inputs param is optional
|
|
139
|
+
// 3. Some/all inputs required: start(inputs: ProcessInputs not null) — inputs param is required
|
|
140
|
+
if (!hasInputProperties) {
|
|
141
|
+
definitions[(0, utils_1.fqn)(serviceName, 'start')] = {
|
|
142
|
+
kind: 'action',
|
|
143
|
+
name: (0, utils_1.fqn)(serviceName, 'start'),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
definitions[(0, utils_1.fqn)(serviceName, 'start')] = {
|
|
148
|
+
kind: 'action',
|
|
149
|
+
name: (0, utils_1.fqn)(serviceName, 'start'),
|
|
150
|
+
params: {
|
|
151
|
+
inputs: {
|
|
152
|
+
type: inputsType,
|
|
153
|
+
notNull: hasRequiredInputs ? true : undefined,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// Query functions
|
|
159
|
+
definitions[(0, utils_1.fqn)(serviceName, 'getAttributes')] = {
|
|
160
|
+
kind: 'function',
|
|
161
|
+
name: (0, utils_1.fqn)(serviceName, 'getAttributes'),
|
|
162
|
+
params: {
|
|
163
|
+
processInstanceId: { type: csn.CdsBuiltinType.String, notNull: true },
|
|
164
|
+
},
|
|
165
|
+
returns: { type: attributesType },
|
|
166
|
+
};
|
|
167
|
+
definitions[(0, utils_1.fqn)(serviceName, 'getOutputs')] = {
|
|
168
|
+
kind: 'function',
|
|
169
|
+
name: (0, utils_1.fqn)(serviceName, 'getOutputs'),
|
|
170
|
+
params: {
|
|
171
|
+
processInstanceId: { type: csn.CdsBuiltinType.String, notNull: true },
|
|
172
|
+
},
|
|
173
|
+
returns: { type: outputsType },
|
|
174
|
+
};
|
|
175
|
+
definitions[(0, utils_1.fqn)(serviceName, 'getInstancesByBusinessKey')] = {
|
|
176
|
+
kind: 'function',
|
|
177
|
+
name: (0, utils_1.fqn)(serviceName, 'getInstancesByBusinessKey'),
|
|
178
|
+
params: {
|
|
179
|
+
businessKey: { type: csn.CdsBuiltinType.String, notNull: true },
|
|
180
|
+
status: { items: { type: csn.CdsBuiltinType.String } },
|
|
181
|
+
},
|
|
182
|
+
returns: { type: instancesType },
|
|
183
|
+
};
|
|
184
|
+
// Lifecycle actions
|
|
185
|
+
for (const action of ['suspend', 'resume', 'cancel']) {
|
|
186
|
+
definitions[(0, utils_1.fqn)(serviceName, action)] = {
|
|
187
|
+
kind: 'action',
|
|
188
|
+
name: (0, utils_1.fqn)(serviceName, action),
|
|
189
|
+
params: {
|
|
190
|
+
businessKey: { type: csn.CdsBuiltinType.String, notNull: true },
|
|
191
|
+
cascade: { type: csn.CdsBuiltinType.Boolean },
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=csnBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csnBuilder.js","sourceRoot":"","sources":["../../../lib/processImport/csnBuilder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,sCA2BC;AApCD,mDAA2B;AAC3B,6DAA+C;AAE/C,4CAAqD;AACrD,iDAAyE;AACzE,mCAAwD;AAExD,MAAM,GAAG,GAAG,aAAG,CAAC,GAAG,CAAC,iCAAqB,CAAC,CAAC;AAE3C,SAAgB,aAAa,CAC3B,OAAsB,EACtB,aAAoC;IAEpC,MAAM,WAAW,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,IAAA,kBAAU,EAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;IACpF,GAAG,CAAC,KAAK,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAE1C,MAAM,WAAW,GAAsC,EAAE,CAAC;IAE1D,WAAW,CAAC,WAAW,CAAC,GAAG,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzE,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3E,CAAC;IAED,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAElE,MAAM,qBAAqB,GAAG,IAAA,iCAAkB,EAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,IAAI,EAAE,CAAC;IAC/D,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACnE,MAAM,iBAAiB,GAAG,kBAAkB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAClG,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IAEnF,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,WAAW;QACX,IAAI,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAmB,EAAE,OAAsB;IAC1E,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,kFAAkF;QACvF,WAAW,EAAE,MAAM;QACnB,cAAc,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAkB,EAClB,WAAmB,EACnB,WAA8C,EAC9C,aAAoC;IAEpC,MAAM,QAAQ,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,IAAA,oBAAY,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/D,IAAI,WAAW,CAAC,QAAQ,CAAC;QAAE,OAAO;IAElC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,2CAA2C,CAAC,CAAC;QAChF,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACvE,OAAO;IACT,CAAC;IAED,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAA,kCAAmB,EACzC,QAAQ,EACR,QAAQ,CAAC,MAAM,EACf,WAAW,EACX,WAAW,EACX,aAAa,CACd,CAAC;IACF,GAAG,CAAC,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,eAAe,CACtB,OAAsB,EACtB,WAAmB,EACnB,WAA8C,EAC9C,aAAoC;IAEpC,MAAM,UAAU,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC3D,MAAM,cAAc,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAE3D,WAAW,CAAC,UAAU,CAAC,GAAG,IAAA,kCAAmB,EAC3C,UAAU,EACV,IAAA,iCAAkB,EAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,WAAW,EACX,WAAW,EACX,aAAa,CACd,CAAC;IACF,WAAW,CAAC,WAAW,CAAC,GAAG,IAAA,kCAAmB,EAC5C,WAAW,EACX,IAAA,iCAAkB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3C,WAAW,EACX,WAAW,EACX,aAAa,CACd,CAAC;IAEF,WAAW,CAAC,aAAa,CAAC,GAAG;QAC3B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE;YACR,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YACtD,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YACzD,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;YAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;SACzD;KACF,CAAC;IAEF,WAAW,CAAC,cAAc,CAAC,GAAG;QAC5B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE;YACL,IAAI,EAAE,aAAa;SACpB;KACF,CAAC;IAEF,WAAW,CAAC,YAAY,CAAC,GAAG;QAC1B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;YACjD,iBAAiB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;YACtD,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;YACvC,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;YAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;YAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE;SAC/C;KACF,CAAC;IAEF,WAAW,CAAC,aAAa,CAAC,GAAG;QAC3B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,WAAmB,EACnB,WAA8C,EAC9C,kBAA2B,EAC3B,iBAA0B;IAE1B,MAAM,UAAU,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,IAAA,WAAG,EAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAE3D,8BAA8B;IAC9B,yDAAyD;IACzD,iGAAiG;IACjG,mGAAmG;IACnG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,WAAW,CAAC,IAAA,WAAG,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,GAAG;YACvC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAA,WAAG,EAAC,WAAW,EAAE,OAAO,CAAC;SAChC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,IAAA,WAAG,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,GAAG;YACvC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAA,WAAG,EAAC,WAAW,EAAE,OAAO,CAAC;YAC/B,MAAM,EAAE;gBACN,MAAM,EAAE;oBACN,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;iBAC9C;aACF;SACF,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,WAAW,CAAC,IAAA,WAAG,EAAC,WAAW,EAAE,eAAe,CAAC,CAAC,GAAG;QAC/C,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,IAAA,WAAG,EAAC,WAAW,EAAE,eAAe,CAAC;QACvC,MAAM,EAAE;YACN,iBAAiB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;SACtE;QACD,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;KAClC,CAAC;IAEF,WAAW,CAAC,IAAA,WAAG,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC,GAAG;QAC5C,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,IAAA,WAAG,EAAC,WAAW,EAAE,YAAY,CAAC;QACpC,MAAM,EAAE;YACN,iBAAiB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;SACtE;QACD,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;KAC/B,CAAC;IAEF,WAAW,CAAC,IAAA,WAAG,EAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC,GAAG;QAC3D,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,IAAA,WAAG,EAAC,WAAW,EAAE,2BAA2B,CAAC;QACnD,MAAM,EAAE;YACN,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAC/D,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE;SACvD;QACD,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;KACjC,CAAC;IAEF,oBAAoB;IACpB,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QACrD,WAAW,CAAC,IAAA,WAAG,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC,GAAG;YACtC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAA,WAAG,EAAC,WAAW,EAAE,MAAM,CAAC;YAC9B,MAAM,EAAE;gBACN,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC/D,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE;aAC9C;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.importProcess = importProcess;
|
|
40
|
+
const path = __importStar(require("node:path"));
|
|
41
|
+
const fs = __importStar(require("node:fs"));
|
|
42
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
43
|
+
const auth_1 = require("../auth");
|
|
44
|
+
const api_1 = require("../api");
|
|
45
|
+
const constants_1 = require("../constants");
|
|
46
|
+
const csnBuilder_1 = require("./csnBuilder");
|
|
47
|
+
const rawWorkflowConverter_1 = require("./rawWorkflowConverter");
|
|
48
|
+
const utils_1 = require("./utils");
|
|
49
|
+
const LOG = cds_1.default.log(constants_1.PROCESS_LOGGER_PREFIX);
|
|
50
|
+
/**
|
|
51
|
+
* Module-level cache for data types, populated during loadProcessHeader / fetchAndSaveProcessDefinition
|
|
52
|
+
* and consumed by buildCsnModel -> resolveTypeReference. Reset at the start of each importProcess call.
|
|
53
|
+
* Call order: importProcess resets -> loadProcessHeader populates -> buildCsnModel reads.
|
|
54
|
+
*/
|
|
55
|
+
let dataTypeCache = new Map();
|
|
56
|
+
async function importProcess(jsonFile, options = {}) {
|
|
57
|
+
dataTypeCache = new Map();
|
|
58
|
+
if (options.name) {
|
|
59
|
+
const { filePath, processHeader } = await fetchAndSaveProcessDefinition(options.name);
|
|
60
|
+
options.file = filePath;
|
|
61
|
+
return (0, csnBuilder_1.buildCsnModel)(processHeader, dataTypeCache);
|
|
62
|
+
}
|
|
63
|
+
const { processHeader, targetFilePath } = await loadProcessHeader(jsonFile, options.saveProcessHeader ?? false);
|
|
64
|
+
if (targetFilePath) {
|
|
65
|
+
options.file = targetFilePath;
|
|
66
|
+
}
|
|
67
|
+
return (0, csnBuilder_1.buildCsnModel)(processHeader, dataTypeCache);
|
|
68
|
+
}
|
|
69
|
+
async function fetchAndSaveProcessDefinition(processName) {
|
|
70
|
+
const [projectId, processId] = (0, utils_1.splitAtLastDot)(processName);
|
|
71
|
+
const apiClient = await createApiClient();
|
|
72
|
+
LOG.debug('Retrieving process header...');
|
|
73
|
+
const processHeader = await apiClient.fetchProcessHeader(projectId, processId);
|
|
74
|
+
processHeader.projectId = projectId;
|
|
75
|
+
if (processHeader.dependencies?.length) {
|
|
76
|
+
LOG.debug(`Fetching ${processHeader.dependencies.length} dependent data types...`);
|
|
77
|
+
processHeader.dataTypes = await apiClient.fetchAllDataTypes(projectId, processHeader.dependencies);
|
|
78
|
+
processHeader.dataTypes.forEach((dt) => dataTypeCache.set(dt.uid, dt));
|
|
79
|
+
}
|
|
80
|
+
const outputPath = path.join(cds_1.default.root, 'srv', 'workflows', `${processName}.json`);
|
|
81
|
+
await fs.promises.mkdir(path.dirname(outputPath), { recursive: true });
|
|
82
|
+
await fs.promises.writeFile(outputPath, JSON.stringify(processHeader, null, 2), 'utf8');
|
|
83
|
+
return { filePath: outputPath, processHeader };
|
|
84
|
+
}
|
|
85
|
+
async function createApiClient() {
|
|
86
|
+
let credentials = (0, auth_1.getServiceCredentials)(constants_1.PROCESS_SERVICE);
|
|
87
|
+
let resolveError;
|
|
88
|
+
if (!credentials) {
|
|
89
|
+
// Try to resolve cloud bindings automatically (same as cds bind --exec does)
|
|
90
|
+
// REVISIT: once merged in core
|
|
91
|
+
try {
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
93
|
+
const cdsDk = cds_1.default;
|
|
94
|
+
const resolve = cdsDk._localOrGlobal ?? cdsDk._local ?? require;
|
|
95
|
+
const { env: bindingEnv } = resolve('@sap/cds-dk/lib/bind/shared');
|
|
96
|
+
process.env.CDS_ENV ??= 'hybrid';
|
|
97
|
+
cdsDk.env = cds_1.default.env.for('cds');
|
|
98
|
+
// Check if there are configured bindings before attempting resolution
|
|
99
|
+
const hasBindings = Object.values(cds_1.default.env.requires || {}).some(
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
101
|
+
(s) => s?.binding && !s.binding.resolved);
|
|
102
|
+
const resolved = await bindingEnv();
|
|
103
|
+
if (resolved) {
|
|
104
|
+
Object.assign(process.env, resolved);
|
|
105
|
+
cdsDk.env = cds_1.default.env.for('cds');
|
|
106
|
+
}
|
|
107
|
+
else if (hasBindings) {
|
|
108
|
+
// Bindings exist but resolution returned nothing - resolve directly to get the actual error
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
+
const processBinding = Object.entries(cds_1.default.env.requires || {}).find(
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
112
|
+
([, s]) => s?.binding && !s.binding.resolved);
|
|
113
|
+
if (processBinding) {
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
|
+
const [name, service] = processBinding;
|
|
116
|
+
try {
|
|
117
|
+
const bindType = service.binding.type || 'cf';
|
|
118
|
+
const cfResolver = resolve(`@sap/cds-dk/lib/bind/${bindType}`);
|
|
119
|
+
await cfResolver.resolve(name, service.binding);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
resolveError = e;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (!resolveError) {
|
|
126
|
+
resolveError = new Error('Cloud binding resolution returned no credentials.');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
credentials = (0, auth_1.getServiceCredentials)(constants_1.PROCESS_SERVICE);
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
resolveError = e;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (!credentials) {
|
|
136
|
+
const baseMsg = 'No ProcessService credentials found.';
|
|
137
|
+
const hint = resolveError
|
|
138
|
+
? `${resolveError instanceof Error ? resolveError.message : resolveError}`
|
|
139
|
+
: 'Ensure you have bound a process service instance (e.g., via cds bind ProcessService -2 <instance>).';
|
|
140
|
+
throw new Error(`${baseMsg} ${hint}`);
|
|
141
|
+
}
|
|
142
|
+
const apiUrl = credentials.endpoints?.api;
|
|
143
|
+
if (!apiUrl) {
|
|
144
|
+
throw new Error('No API URL found in ProcessService credentials.');
|
|
145
|
+
}
|
|
146
|
+
LOG.debug('Creating API client...');
|
|
147
|
+
const tokenProvider = (0, auth_1.createXsuaaTokenProvider)(credentials);
|
|
148
|
+
const cachingTokenProvider = new auth_1.CachingTokenProvider(tokenProvider);
|
|
149
|
+
return (0, api_1.createProcessApiClient)(apiUrl, () => cachingTokenProvider.getToken());
|
|
150
|
+
}
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Load process header from file
|
|
153
|
+
// ============================================================================
|
|
154
|
+
async function loadProcessHeader(filePath, saveProcessHeader = false) {
|
|
155
|
+
const content = fs.readFileSync(path.resolve(filePath), 'utf-8');
|
|
156
|
+
const parsed = JSON.parse(content);
|
|
157
|
+
let header;
|
|
158
|
+
let targetFilePath;
|
|
159
|
+
if ((0, rawWorkflowConverter_1.isRawWorkflowJson)(parsed)) {
|
|
160
|
+
LOG.debug('Detected raw SBPA workflow JSON format, converting to ProcessHeader...');
|
|
161
|
+
header = (0, rawWorkflowConverter_1.convertWorkflowToProcessHeader)(parsed);
|
|
162
|
+
LOG.debug('Converted ProcessHeader:', JSON.stringify(header, null, 2));
|
|
163
|
+
// Always compute the target file path (for options.file)
|
|
164
|
+
targetFilePath = path.join(cds_1.default.root, 'srv', 'workflows', `${header.projectId}.${header.identifier}.json`);
|
|
165
|
+
// Only save if requested (CLI import)
|
|
166
|
+
if (saveProcessHeader) {
|
|
167
|
+
await fs.promises.mkdir(path.dirname(targetFilePath), { recursive: true });
|
|
168
|
+
await fs.promises.writeFile(targetFilePath, JSON.stringify(header, null, 2), 'utf8');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
header = parsed;
|
|
173
|
+
targetFilePath = undefined;
|
|
174
|
+
}
|
|
175
|
+
header.dataTypes?.forEach((dt) => dataTypeCache.set(dt.uid, dt));
|
|
176
|
+
return { processHeader: header, targetFilePath };
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/processImport/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isRawWorkflowJson = isRawWorkflowJson;
|
|
7
|
+
exports.convertWorkflowToProcessHeader = convertWorkflowToProcessHeader;
|
|
8
|
+
const cds_1 = __importDefault(require("@sap/cds"));
|
|
9
|
+
const constants_1 = require("../constants");
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
const LOG = cds_1.default.log(constants_1.PROCESS_LOGGER_PREFIX);
|
|
12
|
+
const CLASS_DEFINITION = 'com.sap.bpm.wfs.Model';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Public API
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Detect whether a parsed JSON object is a raw SBPA workflow JSON file
|
|
18
|
+
* (has "contents" with a "com.sap.bpm.wfs.Model" entry).
|
|
19
|
+
*/
|
|
20
|
+
function isRawWorkflowJson(parsed) {
|
|
21
|
+
const obj = parsed;
|
|
22
|
+
if (!obj?.contents || typeof obj.contents !== 'object')
|
|
23
|
+
return false;
|
|
24
|
+
for (const key in obj.contents) {
|
|
25
|
+
if (obj.contents[key]?.classDefinition === CLASS_DEFINITION)
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Convert a raw SBPA workflow JSON file into the unified ProcessHeader format
|
|
32
|
+
* that the CSN builder expects.
|
|
33
|
+
*/
|
|
34
|
+
function convertWorkflowToProcessHeader(workflow) {
|
|
35
|
+
const contents = workflow.contents;
|
|
36
|
+
// Find the Model entry
|
|
37
|
+
let modelEntry;
|
|
38
|
+
for (const key in contents) {
|
|
39
|
+
if (contents[key]?.classDefinition === CLASS_DEFINITION) {
|
|
40
|
+
modelEntry = contents[key];
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!modelEntry) {
|
|
45
|
+
throw new Error('Raw workflow JSON does not contain a CLASSDEFINITION entry.');
|
|
46
|
+
}
|
|
47
|
+
const { projectId, processIdentifier: identifier, artifactId, name, schemas: schemasUid, } = modelEntry;
|
|
48
|
+
// Find the Schemas entry
|
|
49
|
+
const schemasEntry = contents[schemasUid];
|
|
50
|
+
if (!schemasEntry?.schemas) {
|
|
51
|
+
throw new Error('Raw workflow JSON does not contain a valid Schemas entry.');
|
|
52
|
+
}
|
|
53
|
+
// Separate process schema from data type schemas
|
|
54
|
+
const processSchemaRef = `$.${artifactId}`;
|
|
55
|
+
let processSchemaContent = null;
|
|
56
|
+
const dataTypes = [];
|
|
57
|
+
for (const schemaKey in schemasEntry.schemas) {
|
|
58
|
+
const schema = schemasEntry.schemas[schemaKey];
|
|
59
|
+
if (schema.schemaRef === processSchemaRef) {
|
|
60
|
+
processSchemaContent = schema.content;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
const uid = schema.schemaRef.startsWith('$.')
|
|
64
|
+
? schema.schemaRef.substring(2)
|
|
65
|
+
: schema.schemaRef;
|
|
66
|
+
const dtName = schema.content?.title ?? uid;
|
|
67
|
+
dataTypes.push({
|
|
68
|
+
uid,
|
|
69
|
+
name: dtName,
|
|
70
|
+
identifier: dtName,
|
|
71
|
+
type: 'datatype',
|
|
72
|
+
header: schema.content,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!processSchemaContent) {
|
|
77
|
+
throw new Error(`Raw workflow JSON does not contain a schema entry with schemaRef "${processSchemaRef}".`);
|
|
78
|
+
}
|
|
79
|
+
// Extract inputs (definitions.out) and outputs (definitions.in) from the process schema
|
|
80
|
+
const inputs = processSchemaContent.definitions?.out ?? utils_1.EMPTY_OBJECT_SCHEMA;
|
|
81
|
+
const outputs = processSchemaContent.definitions?.in ?? utils_1.EMPTY_OBJECT_SCHEMA;
|
|
82
|
+
// Reconstruct $ref patterns in inputs/outputs for complex type properties.
|
|
83
|
+
// In the raw format, complex types are inlined. We replace them with
|
|
84
|
+
// $ref: "$.{uid}" references so buildCsnModel can resolve them via dataTypeCache.
|
|
85
|
+
for (const dt of dataTypes) {
|
|
86
|
+
restoreRefs(inputs, dt);
|
|
87
|
+
restoreRefs(outputs, dt);
|
|
88
|
+
}
|
|
89
|
+
LOG.debug('Converted raw workflow JSON to ProcessHeader format.');
|
|
90
|
+
return {
|
|
91
|
+
uid: artifactId,
|
|
92
|
+
name,
|
|
93
|
+
identifier,
|
|
94
|
+
type: 'bpi.process',
|
|
95
|
+
projectId,
|
|
96
|
+
header: { inputs, outputs, processAttributes: utils_1.EMPTY_OBJECT_SCHEMA },
|
|
97
|
+
dependencies: dataTypes.length > 0
|
|
98
|
+
? dataTypes.map((dt) => ({ artifactUid: dt.uid, type: 'both' }))
|
|
99
|
+
: undefined,
|
|
100
|
+
dataTypes: dataTypes.length > 0 ? dataTypes : undefined,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ============================================================================
|
|
104
|
+
// Internal helpers
|
|
105
|
+
// ============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Walk properties of a schema and replace inlined complex types with
|
|
108
|
+
* $ref references when they match a known data type (by refName or title).
|
|
109
|
+
*/
|
|
110
|
+
function restoreRefs(schema, dataType) {
|
|
111
|
+
if (!schema?.properties)
|
|
112
|
+
return;
|
|
113
|
+
const ref = { $ref: `$.${dataType.uid}`, refName: dataType.name };
|
|
114
|
+
for (const propName in schema.properties) {
|
|
115
|
+
const prop = schema.properties[propName];
|
|
116
|
+
if (!prop)
|
|
117
|
+
continue;
|
|
118
|
+
// Check arrays first because the array itself may also carry a refName
|
|
119
|
+
if (prop.type === 'array' && prop.items && matchesDataType(prop.items, dataType)) {
|
|
120
|
+
schema.properties[propName] = {
|
|
121
|
+
type: 'array',
|
|
122
|
+
items: ref,
|
|
123
|
+
title: prop.title,
|
|
124
|
+
description: prop.description,
|
|
125
|
+
refName: prop.refName,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
else if (matchesDataType(prop, dataType)) {
|
|
129
|
+
schema.properties[propName] = {
|
|
130
|
+
...ref,
|
|
131
|
+
title: prop.title,
|
|
132
|
+
description: prop.description,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if a schema property matches a data type by comparing refName or title.
|
|
139
|
+
*/
|
|
140
|
+
function matchesDataType(prop, dataType) {
|
|
141
|
+
if (prop.refName && prop.refName === dataType.name)
|
|
142
|
+
return true;
|
|
143
|
+
// For inlined objects, the title on the data type content matches the data type name
|
|
144
|
+
if (prop.type === 'object' && prop.title === dataType.header?.title)
|
|
145
|
+
return true;
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=rawWorkflowConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawWorkflowConverter.js","sourceRoot":"","sources":["../../../lib/processImport/rawWorkflowConverter.ts"],"names":[],"mappings":"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"}
|