@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 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 = path.join(cds.root, BUILD_DEFAULT_PATH);
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
- const ordId = `${appConfig.ordNamespace}:apiResource:${_getGroupNameWithNestedNamespace(serviceDefinition, appConfig)}:v1`;
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: "1.0.0",
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 serviceDefinition[DATA_PRODUCT_ANNOTATION] === DATA_PRODUCT_TYPE.primary;
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.9",
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.7.0",
29
- "prettier": "3.5.3"
28
+ "jest": "^30.0.0",
29
+ "prettier": "3.6.2"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@sap/cds": ">=8.9.4",