@cap-js/ord 1.3.9 → 1.3.10
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/lib/build.js +3 -1
- package/lib/constants.js +3 -0
- package/lib/templates.js +65 -3
- package/package.json +3 -3
package/lib/build.js
CHANGED
|
@@ -10,7 +10,9 @@ module.exports = class OrdBuildPlugin extends cds_dk.build.Plugin {
|
|
|
10
10
|
static taskDefaults = { src: cds.env.folders.srv };
|
|
11
11
|
|
|
12
12
|
init() {
|
|
13
|
-
this.task.dest
|
|
13
|
+
if (this.task.dest === undefined) {
|
|
14
|
+
this.task.dest = path.join(cds.root, BUILD_DEFAULT_PATH);
|
|
15
|
+
}
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
async _writeResourcesFiles(resObj, model, promises) {
|
package/lib/constants.js
CHANGED
|
@@ -44,6 +44,8 @@ const CONTENT_MERGE_KEY = "ordId";
|
|
|
44
44
|
|
|
45
45
|
const DATA_PRODUCT_ANNOTATION = "@DataIntegration.dataProduct.type";
|
|
46
46
|
|
|
47
|
+
const DATA_PRODUCT_SIMPLE_ANNOTATION = "@data.product";
|
|
48
|
+
|
|
47
49
|
const DATA_PRODUCT_TYPE = Object.freeze({
|
|
48
50
|
primary: "primary",
|
|
49
51
|
});
|
|
@@ -106,6 +108,7 @@ module.exports = {
|
|
|
106
108
|
COMPILER_TYPES,
|
|
107
109
|
CONTENT_MERGE_KEY,
|
|
108
110
|
DATA_PRODUCT_ANNOTATION,
|
|
111
|
+
DATA_PRODUCT_SIMPLE_ANNOTATION,
|
|
109
112
|
DATA_PRODUCT_TYPE,
|
|
110
113
|
DESCRIPTION_PREFIX,
|
|
111
114
|
ENTITY_RELATIONSHIP_ANNOTATION,
|
package/lib/templates.js
CHANGED
|
@@ -5,6 +5,7 @@ const _ = require("lodash");
|
|
|
5
5
|
const {
|
|
6
6
|
AUTHENTICATION_TYPE,
|
|
7
7
|
DATA_PRODUCT_ANNOTATION,
|
|
8
|
+
DATA_PRODUCT_SIMPLE_ANNOTATION,
|
|
8
9
|
DATA_PRODUCT_TYPE,
|
|
9
10
|
DESCRIPTION_PREFIX,
|
|
10
11
|
ENTITY_RELATIONSHIP_ANNOTATION,
|
|
@@ -308,7 +309,34 @@ const createAPIResourceTemplate = (serviceName, serviceDefinition, appConfig, pa
|
|
|
308
309
|
|
|
309
310
|
const paths = _generatePaths(serviceName, serviceDefinition);
|
|
310
311
|
const apiResources = [];
|
|
311
|
-
|
|
312
|
+
|
|
313
|
+
// Handle version suffix extraction for primary data product services
|
|
314
|
+
let cleanServiceName,
|
|
315
|
+
version,
|
|
316
|
+
semanticVersion,
|
|
317
|
+
extracted = null;
|
|
318
|
+
if (isPrimaryDataProductService(serviceDefinition)) {
|
|
319
|
+
extracted = _extractVersionFromServiceName(serviceDefinition.name);
|
|
320
|
+
if (extracted) {
|
|
321
|
+
// Create a temporary service definition with the clean name for namespace processing
|
|
322
|
+
const cleanServiceDefinition = { ...serviceDefinition, name: extracted.cleanName };
|
|
323
|
+
cleanServiceName = _getGroupNameWithNestedNamespace(cleanServiceDefinition, appConfig);
|
|
324
|
+
version = extracted.version;
|
|
325
|
+
semanticVersion = extracted.semanticVersion;
|
|
326
|
+
} else {
|
|
327
|
+
// Invalid pattern - use current behavior
|
|
328
|
+
cleanServiceName = _getGroupNameWithNestedNamespace(serviceDefinition, appConfig);
|
|
329
|
+
version = "v1";
|
|
330
|
+
semanticVersion = "1.0.0";
|
|
331
|
+
}
|
|
332
|
+
} else {
|
|
333
|
+
// Non-data product - use current behavior
|
|
334
|
+
cleanServiceName = _getGroupNameWithNestedNamespace(serviceDefinition, appConfig);
|
|
335
|
+
version = "v1";
|
|
336
|
+
semanticVersion = "1.0.0";
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const ordId = `${appConfig.ordNamespace}:apiResource:${cleanServiceName}:${version}`;
|
|
312
340
|
|
|
313
341
|
paths.forEach((generatedPath) => {
|
|
314
342
|
let resourceDefinitions = [
|
|
@@ -330,7 +358,7 @@ const createAPIResourceTemplate = (serviceName, serviceDefinition, appConfig, pa
|
|
|
330
358
|
title: serviceDefinition["@title"] ?? serviceDefinition["@Common.Label"] ?? serviceName,
|
|
331
359
|
shortDescription: SHORT_DESCRIPTION_PREFIX + serviceName,
|
|
332
360
|
description: serviceDefinition["@Core.Description"] ?? DESCRIPTION_PREFIX + serviceName,
|
|
333
|
-
version:
|
|
361
|
+
version: semanticVersion,
|
|
334
362
|
lastUpdate: appConfig.lastUpdate,
|
|
335
363
|
visibility,
|
|
336
364
|
partOfPackage: packageId,
|
|
@@ -352,6 +380,10 @@ const createAPIResourceTemplate = (serviceName, serviceDefinition, appConfig, pa
|
|
|
352
380
|
obj.direction = "outbound";
|
|
353
381
|
obj.implementationStandard = "sap.dp:data-subscription-api:v1";
|
|
354
382
|
obj.entryPoints = [];
|
|
383
|
+
if (extracted) {
|
|
384
|
+
// Overwrite partOfGroups
|
|
385
|
+
obj.partOfGroups = [`${defaults.groupTypeId}:${appConfig.ordNamespace}:${cleanServiceName}`];
|
|
386
|
+
}
|
|
355
387
|
obj.resourceDefinitions = [
|
|
356
388
|
_getResourceDefinition(
|
|
357
389
|
"sap-csn-interop-effective-v1",
|
|
@@ -425,7 +457,10 @@ const createEventResourceTemplate = (serviceName, serviceDefinition, appConfig,
|
|
|
425
457
|
};
|
|
426
458
|
|
|
427
459
|
function isPrimaryDataProductService(serviceDefinition) {
|
|
428
|
-
return
|
|
460
|
+
return (
|
|
461
|
+
serviceDefinition[DATA_PRODUCT_ANNOTATION] === DATA_PRODUCT_TYPE.primary ||
|
|
462
|
+
!!serviceDefinition[DATA_PRODUCT_SIMPLE_ANNOTATION]
|
|
463
|
+
);
|
|
429
464
|
}
|
|
430
465
|
|
|
431
466
|
function _getEntityTypeMappings(definitionObj) {
|
|
@@ -496,6 +531,32 @@ function _flattenEntityGraph(currentEntity, processedEntities = []) {
|
|
|
496
531
|
return [currentEntity, ...assertionsTodo.flatMap((entity) => _flattenEntityGraph(entity, processedEntities))];
|
|
497
532
|
}
|
|
498
533
|
|
|
534
|
+
/**
|
|
535
|
+
* Extracts version suffix from service name for data product services.
|
|
536
|
+
* Only accepts pattern: .v<number> (e.g., .v0, .v1, .v2, .v10)
|
|
537
|
+
* Rejects patterns like: .v1.1, .v1.0, .version1, .beta
|
|
538
|
+
*
|
|
539
|
+
* @param {string} serviceName The full service name
|
|
540
|
+
* @returns {Object|null} Object with cleanName, version, and semanticVersion, or null if invalid pattern
|
|
541
|
+
*/
|
|
542
|
+
function _extractVersionFromServiceName(serviceName) {
|
|
543
|
+
// Only match pattern: .v<number> (where number is 1 or more digits)
|
|
544
|
+
const versionPattern = /\.v(\d+)$/;
|
|
545
|
+
const match = serviceName.match(versionPattern);
|
|
546
|
+
|
|
547
|
+
if (!match) {
|
|
548
|
+
return null; // No valid version suffix found
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
const versionNumber = parseInt(match[1], 10);
|
|
552
|
+
|
|
553
|
+
return {
|
|
554
|
+
cleanName: serviceName.replace(versionPattern, ""),
|
|
555
|
+
version: `v${versionNumber}`,
|
|
556
|
+
semanticVersion: `${versionNumber}.0.0`,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
|
|
499
560
|
function _getPackageID(namespace, packageIds, resourceType, visibility = RESOURCE_VISIBILITY.public) {
|
|
500
561
|
if (!packageIds) return;
|
|
501
562
|
|
|
@@ -544,4 +605,5 @@ module.exports = {
|
|
|
544
605
|
_getExposedEntityTypes,
|
|
545
606
|
_propagateORDVisibility,
|
|
546
607
|
_handleVisibility,
|
|
608
|
+
isPrimaryDataProductService,
|
|
547
609
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cap-js/ord",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.10",
|
|
4
4
|
"description": "CAP Plugin for generating ORD document.",
|
|
5
5
|
"repository": "cap-js/ord",
|
|
6
6
|
"author": "SAP SE (https://www.sap.com)",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"eslint": "^9.2.0",
|
|
28
|
-
"jest": "^
|
|
29
|
-
"prettier": "3.
|
|
28
|
+
"jest": "^30.0.0",
|
|
29
|
+
"prettier": "3.6.2"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"@sap/cds": ">=8.9.4",
|