@speclynx/apidom-overlay 4.4.0 → 4.5.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/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [4.5.0](https://github.com/speclynx/apidom/compare/v4.4.0...v4.5.0) (2026-04-12)
7
+
8
+ ### Features
9
+
10
+ - **overlay:** add support for POJO ([#233](https://github.com/speclynx/apidom/issues/233)) ([810b8e4](https://github.com/speclynx/apidom/commit/810b8e4b10787f9982e449915fbc0c4d58c65e1d))
11
+
6
12
  # [4.4.0](https://github.com/speclynx/apidom/compare/v4.3.1...v4.4.0) (2026-04-12)
7
13
 
8
14
  ### Features
package/README.md CHANGED
@@ -19,11 +19,11 @@ This package provides three levels of API for applying overlays:
19
19
 
20
20
  ### Applying from file/URL
21
21
 
22
- The default export parses an overlay document, resolves the target (from `targetURI` or the overlay's `extends` field),
22
+ `applyOverlay` parses an overlay document, resolves the target (from `targetURI` or the overlay's `extends` field),
23
23
  and applies all actions. The target is parsed with style preservation for round-trip fidelity.
24
24
 
25
25
  ```js
26
- import applyOverlay from '@speclynx/apidom-overlay';
26
+ import { applyOverlay } from '@speclynx/apidom-overlay';
27
27
  import { toYAML } from '@speclynx/apidom-core';
28
28
 
29
29
  // target from extends field
@@ -62,14 +62,12 @@ const target = refract({
62
62
  const result = applyOverlayApiDOM(overlay, target);
63
63
  ```
64
64
 
65
- ### Applying a single action
66
-
67
- `applyAction` applies a single overlay action. Useful for programmatic, step-by-step application.
65
+ `applyActionApiDOM` applies a single overlay action. Useful for programmatic, step-by-step application.
68
66
 
69
67
  ```js
70
68
  import { refract } from '@speclynx/apidom-datamodel';
71
69
  import { refractAction } from '@speclynx/apidom-ns-overlay-1';
72
- import { applyAction } from '@speclynx/apidom-overlay';
70
+ import { applyActionApiDOM } from '@speclynx/apidom-overlay';
73
71
 
74
72
  const action = refractAction({
75
73
  target: '$.info.title',
@@ -77,7 +75,38 @@ const action = refractAction({
77
75
  });
78
76
  const target = refract({ info: { title: 'Old Title', version: '1.0.0' } });
79
77
 
80
- const result = applyAction(action, target);
78
+ const result = applyActionApiDOM(action, target);
79
+ ```
80
+
81
+ ### Applying to plain JavaScript objects (POJO)
82
+
83
+ `applyOverlayPOJO` and `applyActionPOJO` accept and return plain JavaScript objects —
84
+ no need to manually refract or serialize.
85
+
86
+ ```js
87
+ import { applyOverlayPOJO, applyActionPOJO } from '@speclynx/apidom-overlay';
88
+
89
+ // full overlay
90
+ const result = applyOverlayPOJO(
91
+ {
92
+ overlay: '1.1.0',
93
+ info: { title: 'My overlay', version: '1.0.0' },
94
+ actions: [
95
+ { target: '$.info.title', update: 'Renamed API' },
96
+ ],
97
+ },
98
+ {
99
+ openapi: '3.1.0',
100
+ info: { title: 'Original', version: '1.0.0' },
101
+ },
102
+ );
103
+ // result is a plain object: { openapi: '3.1.0', info: { title: 'Renamed API', version: '1.0.0' } }
104
+
105
+ // single action
106
+ const updated = applyActionPOJO(
107
+ { target: '$.info.title', update: 'New Title' },
108
+ { info: { title: 'Old Title' } },
109
+ );
81
110
  ```
82
111
 
83
112
  ## Overlay spec semantics
@@ -99,7 +128,7 @@ The implementation follows [Overlay 1.1.0](https://spec.openapis.org/overlay/v1.
99
128
 
100
129
  ### ApplyOptions
101
130
 
102
- Passed to `applyAction`, `applyOverlayApiDOM`, and `applyOverlay`:
131
+ Passed to `applyActionApiDOM`, `applyOverlayApiDOM`, and `applyOverlay`:
103
132
 
104
133
  | Option | Type | Default | Description |
105
134
  |---|---|---|---|
@@ -136,10 +165,10 @@ All errors thrown by this package are instances of `OverlayError`, which extends
136
165
  Errors carry structured context for diagnostics:
137
166
 
138
167
  ```js
139
- import { applyAction, OverlayError } from '@speclynx/apidom-overlay';
168
+ import { applyActionApiDOM, OverlayError } from '@speclynx/apidom-overlay';
140
169
 
141
170
  try {
142
- applyAction(action, target);
171
+ applyActionApiDOM(action, target);
143
172
  } catch (error) {
144
173
  if (error instanceof OverlayError) {
145
174
  console.error(error.message);
@@ -11,99 +11,7 @@
11
11
  return /******/ (() => { // webpackBootstrap
12
12
  /******/ var __webpack_modules__ = ({
13
13
 
14
- /***/ 17621
15
- (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
16
-
17
- "use strict";
18
- __webpack_require__.r(__webpack_exports__);
19
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
20
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
21
- /* harmony export */ });
22
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(96911);
23
- /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26432);
24
- /* harmony import */ var _speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29807);
25
- /* harmony import */ var _apply_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3138);
26
- /* harmony import */ var _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18436);
27
-
28
-
29
-
30
-
31
-
32
-
33
- /**
34
- * @public
35
- */
36
-
37
- const defaultOptions = {
38
- parse: {
39
- parserOpts: {
40
- strict: false,
41
- style: true,
42
- 'overlay-json-1': {
43
- sourceMap: true,
44
- style: false,
45
- extends: true
46
- },
47
- 'overlay-yaml-1': {
48
- sourceMap: true,
49
- style: false,
50
- extends: true
51
- }
52
- }
53
- },
54
- resolve: {
55
- resolverOpts: {
56
- fileAllowList: ['*']
57
- }
58
- }
59
- };
60
-
61
- /**
62
- * Applies an overlay document from a file/URL to its target document.
63
- *
64
- * Parses the overlay, resolves the target from `targetURI` or the overlay's
65
- * `extends` field, parses the target with style preservation for round-trip fidelity,
66
- * and applies all overlay actions.
67
- *
68
- * @param overlayURI - URI to the overlay document (file path or URL)
69
- * @param targetURI - URI to the target document; if omitted, uses the overlay's `extends` field
70
- * @param options - apidom-reference options + overlay merge options
71
- * @returns ParseResultElement with the modified target document
72
- *
73
- * @public
74
- */
75
- const applyOverlay = async (overlayURI, targetURI, options = {
76
- immutable: false,
77
- strict: false
78
- }) => {
79
- const mergedOptions = (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.mergeOptions)(defaultOptions, options);
80
-
81
- // parse the overlay document along with document attached to `extends` field (if present)
82
- const overlayParseResult = await (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.parse)(overlayURI, mergedOptions);
83
- const overlayElement = overlayParseResult.api;
84
- if (!(0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_1__.isOverlay1Element)(overlayElement)) {
85
- throw new _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__["default"](`Failed to parse overlay document "${overlayURI}"`);
86
- }
87
- let targetParseResult;
88
- if (targetURI) {
89
- const targetOptions = (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.mergeOptions)(defaultOptions, options);
90
- targetParseResult = await (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.parse)(targetURI, targetOptions);
91
- } else {
92
- const extendsElement = overlayElement.get('extends');
93
- targetParseResult = extendsElement?.meta?.get('parseResult');
94
- }
95
- if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isParseResultElement)(targetParseResult)) {
96
- throw new _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__["default"]('No target specified: provide targetURI or set the "extends" field in the overlay document');
97
- }
98
-
99
- // apply overlay actions to the target (returns targetParseResult with result replaced)
100
- return (0,_apply_ts__WEBPACK_IMPORTED_MODULE_3__.applyOverlayApiDOM)(overlayParseResult, targetParseResult, options);
101
- };
102
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (applyOverlay);
103
-
104
- /***/ },
105
-
106
- /***/ 3138
14
+ /***/ 4433
107
15
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
108
16
 
109
17
  "use strict";
@@ -111,7 +19,7 @@ __webpack_require__.r(__webpack_exports__);
111
19
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
112
20
  /* harmony export */ applyAction: () => (/* binding */ applyAction),
113
21
  /* harmony export */ applyCopyAction: () => (/* binding */ applyCopyAction),
114
- /* harmony export */ applyOverlayApiDOM: () => (/* binding */ applyOverlayApiDOM),
22
+ /* harmony export */ applyOverlay: () => (/* binding */ applyOverlay),
115
23
  /* harmony export */ applyRemoveAction: () => (/* binding */ applyRemoveAction),
116
24
  /* harmony export */ applyUpdateAction: () => (/* binding */ applyUpdateAction)
117
25
  /* harmony export */ });
@@ -333,7 +241,7 @@ const applyAction = (actionElement, targetElement, options = defaultApplyOptions
333
241
  *
334
242
  * @public
335
243
  */
336
- const applyOverlayApiDOM = (overlayElement, targetElement, options = defaultApplyOptions) => {
244
+ const applyOverlay = (overlayElement, targetElement, options = defaultApplyOptions) => {
337
245
  const overlay = overlayElement instanceof _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"] ? overlayElement.api : overlayElement;
338
246
  if (!(0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_7__.isOverlay1Element)(overlay)) {
339
247
  throw new _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_8__["default"]('First argument must be an Overlay 1.x document');
@@ -362,6 +270,132 @@ const applyOverlayApiDOM = (overlayElement, targetElement, options = defaultAppl
362
270
 
363
271
  /***/ },
364
272
 
273
+ /***/ 56019
274
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
275
+
276
+ "use strict";
277
+ __webpack_require__.r(__webpack_exports__);
278
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
279
+ /* harmony export */ applyAction: () => (/* binding */ applyAction),
280
+ /* harmony export */ applyOverlay: () => (/* binding */ applyOverlay)
281
+ /* harmony export */ });
282
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10404);
283
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(44673);
284
+ /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(35957);
285
+ /* harmony import */ var _apidom_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4433);
286
+
287
+
288
+
289
+
290
+
291
+ /**
292
+ * Applies a single overlay action (POJO) to a target (POJO).
293
+ *
294
+ * @public
295
+ */
296
+ const applyAction = (action, target) => (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_apidom_ts__WEBPACK_IMPORTED_MODULE_3__.applyAction)((0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_2__.refractAction)(action), (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.refract)(target)));
297
+
298
+ /**
299
+ * Applies an entire overlay document (POJO) to a target (POJO).
300
+ *
301
+ * @public
302
+ */
303
+ const applyOverlay = (overlay, target) => (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_apidom_ts__WEBPACK_IMPORTED_MODULE_3__.applyOverlay)((0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_2__.refractOverlay1)(overlay), (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.refract)(target)));
304
+
305
+ /***/ },
306
+
307
+ /***/ 54687
308
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
309
+
310
+ "use strict";
311
+ __webpack_require__.r(__webpack_exports__);
312
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
313
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
314
+ /* harmony export */ });
315
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(96911);
316
+ /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26432);
317
+ /* harmony import */ var _speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29807);
318
+ /* harmony import */ var _apidom_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4433);
319
+ /* harmony import */ var _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18436);
320
+
321
+
322
+
323
+
324
+
325
+
326
+ /**
327
+ * @public
328
+ */
329
+
330
+ const defaultOptions = {
331
+ parse: {
332
+ parserOpts: {
333
+ strict: false,
334
+ style: true,
335
+ 'overlay-json-1': {
336
+ sourceMap: true,
337
+ style: false,
338
+ extends: true
339
+ },
340
+ 'overlay-yaml-1': {
341
+ sourceMap: true,
342
+ style: false,
343
+ extends: true
344
+ }
345
+ }
346
+ },
347
+ resolve: {
348
+ resolverOpts: {
349
+ fileAllowList: ['*']
350
+ }
351
+ }
352
+ };
353
+
354
+ /**
355
+ * Applies an overlay document from a file/URL to its target document.
356
+ *
357
+ * Parses the overlay, resolves the target from `targetURI` or the overlay's
358
+ * `extends` field, parses the target with style preservation for round-trip fidelity,
359
+ * and applies all overlay actions.
360
+ *
361
+ * @param overlayURI - URI to the overlay document (file path or URL)
362
+ * @param targetURI - URI to the target document; if omitted, uses the overlay's `extends` field
363
+ * @param options - apidom-reference options + overlay merge options
364
+ * @returns ParseResultElement with the modified target document
365
+ *
366
+ * @public
367
+ */
368
+ const applyOverlay = async (overlayURI, targetURI, options = {
369
+ immutable: false,
370
+ strict: false
371
+ }) => {
372
+ const mergedOptions = (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.mergeOptions)(defaultOptions, options);
373
+
374
+ // parse the overlay document along with document attached to `extends` field (if present)
375
+ const overlayParseResult = await (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.parse)(overlayURI, mergedOptions);
376
+ const overlayElement = overlayParseResult.api;
377
+ if (!(0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_1__.isOverlay1Element)(overlayElement)) {
378
+ throw new _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__["default"](`Failed to parse overlay document "${overlayURI}"`);
379
+ }
380
+ let targetParseResult;
381
+ if (targetURI) {
382
+ const targetOptions = (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.mergeOptions)(defaultOptions, options);
383
+ targetParseResult = await (0,_speclynx_apidom_reference__WEBPACK_IMPORTED_MODULE_2__.parse)(targetURI, targetOptions);
384
+ } else {
385
+ const extendsElement = overlayElement.get('extends');
386
+ targetParseResult = extendsElement?.meta?.get('parseResult');
387
+ }
388
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isParseResultElement)(targetParseResult)) {
389
+ throw new _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__["default"]('No target specified: provide targetURI or set the "extends" field in the overlay document');
390
+ }
391
+
392
+ // apply overlay actions to the target (returns targetParseResult with result replaced)
393
+ return (0,_apidom_ts__WEBPACK_IMPORTED_MODULE_3__.applyOverlay)(overlayParseResult, targetParseResult, options);
394
+ };
395
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (applyOverlay);
396
+
397
+ /***/ },
398
+
365
399
  /***/ 18436
366
400
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
367
401
 
@@ -100862,16 +100896,20 @@ var __webpack_exports__ = {};
100862
100896
  "use strict";
100863
100897
  __webpack_require__.r(__webpack_exports__);
100864
100898
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
100865
- /* harmony export */ OverlayError: () => (/* reexport safe */ _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_2__["default"]),
100866
- /* harmony export */ applyAction: () => (/* reexport safe */ _apply_ts__WEBPACK_IMPORTED_MODULE_0__.applyAction),
100867
- /* harmony export */ applyOverlayApiDOM: () => (/* reexport safe */ _apply_ts__WEBPACK_IMPORTED_MODULE_0__.applyOverlayApiDOM),
100868
- /* harmony export */ "default": () => (/* reexport safe */ _apply_uri_ts__WEBPACK_IMPORTED_MODULE_3__["default"]),
100869
- /* harmony export */ validateAction: () => (/* reexport safe */ _validate_ts__WEBPACK_IMPORTED_MODULE_1__.validateAction)
100899
+ /* harmony export */ OverlayError: () => (/* reexport safe */ _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__["default"]),
100900
+ /* harmony export */ applyActionApiDOM: () => (/* reexport safe */ _apply_apidom_ts__WEBPACK_IMPORTED_MODULE_0__.applyAction),
100901
+ /* harmony export */ applyActionPOJO: () => (/* reexport safe */ _apply_pojo_ts__WEBPACK_IMPORTED_MODULE_2__.applyAction),
100902
+ /* harmony export */ applyOverlay: () => (/* reexport safe */ _apply_uri_ts__WEBPACK_IMPORTED_MODULE_1__["default"]),
100903
+ /* harmony export */ applyOverlayApiDOM: () => (/* reexport safe */ _apply_apidom_ts__WEBPACK_IMPORTED_MODULE_0__.applyOverlay),
100904
+ /* harmony export */ applyOverlayPOJO: () => (/* reexport safe */ _apply_pojo_ts__WEBPACK_IMPORTED_MODULE_2__.applyOverlay),
100905
+ /* harmony export */ validateAction: () => (/* reexport safe */ _validate_ts__WEBPACK_IMPORTED_MODULE_3__.validateAction)
100870
100906
  /* harmony export */ });
100871
- /* harmony import */ var _apply_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3138);
100872
- /* harmony import */ var _validate_ts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(24338);
100873
- /* harmony import */ var _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18436);
100874
- /* harmony import */ var _apply_uri_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(17621);
100907
+ /* harmony import */ var _apply_apidom_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4433);
100908
+ /* harmony import */ var _apply_uri_ts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(54687);
100909
+ /* harmony import */ var _apply_pojo_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56019);
100910
+ /* harmony import */ var _validate_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24338);
100911
+ /* harmony import */ var _errors_OverlayError_ts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18436);
100912
+
100875
100913
 
100876
100914
 
100877
100915