@swagger-api/apidom-core 0.82.2 → 0.84.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,18 @@
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
+ # [0.84.0](https://github.com/swagger-api/apidom/compare/v0.83.0...v0.84.0) (2023-11-24)
7
+
8
+ ### Features
9
+
10
+ - **ast:** see edits by the following merged visitors ([#3412](https://github.com/swagger-api/apidom/issues/3412)) ([6499557](https://github.com/swagger-api/apidom/commit/64995573f5df1f7f291c20833cf274173f6a7bac))
11
+
12
+ # [0.83.0](https://github.com/swagger-api/apidom/compare/v0.82.2...v0.83.0) (2023-11-07)
13
+
14
+ ### Features
15
+
16
+ - **core:** add support for formalized element identity management ([#3366](https://github.com/swagger-api/apidom/issues/3366)) ([65dcd0e](https://github.com/swagger-api/apidom/commit/65dcd0e8a96544773001560fe142a9768a2c3668))
17
+
6
18
  ## [0.82.2](https://github.com/swagger-api/apidom/compare/v0.82.1...v0.82.2) (2023-11-03)
7
19
 
8
20
  **Note:** Version bump only for package @swagger-api/apidom-core
package/README.md CHANGED
@@ -687,6 +687,25 @@ const numberElement = new NumberElement(1);
687
687
  dehyrate(numberElement); // => { element: 'number', content: 1 }
688
688
  ```
689
689
 
690
+ ### S-Expression
691
+
692
+ Transforms ApiDOM into [symbolic expression](https://en.wikipedia.org/wiki/S-expression).
693
+
694
+ ```js
695
+ import { sexprs, ObjectElement } from '@swagger-api/apidom-core';
696
+
697
+ const objectElement = new ObjectElement({ a: 1 });
698
+
699
+ sexprs(objectElement);
700
+ // =>
701
+ // (ObjectElement
702
+ // (MemberElement
703
+ // (StringElement)
704
+ // (NumberElement)))
705
+
706
+
707
+ ```
708
+
690
709
  ### toString
691
710
 
692
711
  Create a [refracted string](https://github.com/refractproject/refract-spec) representation of an Element.
@@ -7,7 +7,7 @@ class CloneError extends _apidomError.ApiDOMStructuredError {
7
7
  constructor(message, structuredOptions) {
8
8
  super(message, structuredOptions);
9
9
  if (typeof structuredOptions !== 'undefined') {
10
- this.value = structuredOptions.source;
10
+ this.value = structuredOptions.value;
11
11
  }
12
12
  }
13
13
  }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.default = void 0;
5
+ var _apidomError = require("@swagger-api/apidom-error");
6
+ class ElementIdentityError extends _apidomError.ApiDOMStructuredError {
7
+ constructor(message, structuredOptions) {
8
+ super(message, structuredOptions);
9
+ if (typeof structuredOptions !== 'undefined') {
10
+ this.value = structuredOptions.value;
11
+ }
12
+ }
13
+ }
14
+ var _default = exports.default = ElementIdentityError;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
+ exports.__esModule = true;
5
+ exports.defaultIdentityManager = exports.IdentityManager = void 0;
6
+ var _minim = require("minim");
7
+ var _stampit = _interopRequireDefault(require("stampit"));
8
+ var _shortUniqueId = _interopRequireDefault(require("short-unique-id"));
9
+ var _ElementIdentityError = _interopRequireDefault(require("./errors/ElementIdentityError.cjs"));
10
+ var _index = require("../predicates/index.cjs");
11
+ const IdentityManager = exports.IdentityManager = (0, _stampit.default)({
12
+ props: {
13
+ uuid: null,
14
+ length: null,
15
+ identityMap: null
16
+ },
17
+ init({
18
+ length = 6
19
+ } = {}) {
20
+ this.length = 6;
21
+ this.uuid = new _shortUniqueId.default({
22
+ length
23
+ });
24
+ this.identityMap = new WeakMap();
25
+ },
26
+ methods: {
27
+ identify(element) {
28
+ if (!(0, _index.isElement)(element)) {
29
+ throw new _ElementIdentityError.default('Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.', {
30
+ value: element
31
+ });
32
+ }
33
+
34
+ // use already assigned identity
35
+ if (element.meta.hasKey('id') && (0, _index.isStringElement)(element.meta.id) && !element.meta.id.equals('')) {
36
+ return element.id;
37
+ }
38
+
39
+ // assign identity in immutable way
40
+ if (this.identityMap.has(element)) {
41
+ return this.identityMap.get(element);
42
+ }
43
+
44
+ // return element identity
45
+ const id = new _minim.StringElement(this.generateId());
46
+ this.identityMap.set(element, id);
47
+ return id;
48
+ },
49
+ forget(element) {
50
+ if (this.identityMap.has(element)) {
51
+ this.identityMap.delete(element);
52
+ return true;
53
+ }
54
+ return false;
55
+ },
56
+ generateId() {
57
+ return this.uuid.randomUUID();
58
+ }
59
+ }
60
+ });
61
+ const defaultIdentityManager = exports.defaultIdentityManager = IdentityManager({
62
+ length: 6
63
+ });
package/cjs/index.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
4
4
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
5
5
  exports.__esModule = true;
6
- exports.visit = exports.traverse = exports.transclude = exports.toYAML = exports.toValue = exports.toString = exports.toJSON = exports.some = exports.sexprs = exports.reject = exports.refractorPluginSemanticElementIdentity = exports.refractorPluginElementIdentity = exports.refract = exports.parents = exports.namespace = exports.mergeAllVisitors = exports.keyMap = exports.isStringElement = exports.isSourceMapElement = exports.isRefElement = exports.isPrimitiveElement = exports.isParseResultElement = exports.isObjectElement = exports.isNumberElement = exports.isNullElement = exports.isMemberElement = exports.isLinkElement = exports.isElement = exports.isBooleanElement = exports.isArrayElement = exports.isAnnotationElement = exports.includesSymbols = exports.includesClasses = exports.hasElementSourceMap = exports.getNodeType = exports.from = exports.findAtOffset = exports.find = exports.filter = exports.dispatchRefractorPlugins = exports.dereference = exports.dehydrate = exports.deepmerge = exports.createPredicate = exports.createNamespace = exports.cloneShallow = exports.cloneNode = exports.cloneDeep = exports.Transcluder = exports.StringElement = exports.SourceMapElement = exports.ShallowCloneError = exports.RefElement = exports.ParseResultElement = exports.ObjectSlice = exports.ObjectElement = exports.NumberElement = exports.NullElement = exports.Namespace = exports.MemberElement = exports.MediaTypes = exports.LinkElement = exports.KeyValuePair = exports.Element = exports.DeepCloneError = exports.CommentElement = exports.CloneError = exports.BooleanElement = exports.BREAK = exports.ArraySlice = exports.ArrayElement = exports.AnnotationElement = void 0;
6
+ exports.visit = exports.traverse = exports.transclude = exports.toYAML = exports.toValue = exports.toString = exports.toJSON = exports.some = exports.sexprs = exports.reject = exports.refractorPluginSemanticElementIdentity = exports.refractorPluginElementIdentity = exports.refract = exports.parents = exports.namespace = exports.mergeAllVisitors = exports.keyMap = exports.isStringElement = exports.isSourceMapElement = exports.isRefElement = exports.isPrimitiveElement = exports.isParseResultElement = exports.isObjectElement = exports.isNumberElement = exports.isNullElement = exports.isMemberElement = exports.isLinkElement = exports.isElement = exports.isBooleanElement = exports.isArrayElement = exports.isAnnotationElement = exports.includesSymbols = exports.includesClasses = exports.hasElementSourceMap = exports.getNodeType = exports.from = exports.findAtOffset = exports.find = exports.filter = exports.dispatchRefractorPlugins = exports.dereference = exports.dehydrate = exports.defaultIdentityManager = exports.deepmerge = exports.createPredicate = exports.createNamespace = exports.cloneShallow = exports.cloneNode = exports.cloneDeep = exports.Transcluder = exports.StringElement = exports.SourceMapElement = exports.ShallowCloneError = exports.RefElement = exports.ParseResultElement = exports.ObjectSlice = exports.ObjectElement = exports.NumberElement = exports.NullElement = exports.Namespace = exports.MemberElement = exports.MediaTypes = exports.LinkElement = exports.KeyValuePair = exports.IdentityManager = exports.ElementIdentityError = exports.Element = exports.DeepCloneError = exports.CommentElement = exports.CloneError = exports.BooleanElement = exports.BREAK = exports.ArraySlice = exports.ArrayElement = exports.AnnotationElement = void 0;
7
7
  var _index = require("./refractor/plugins/utils/index.cjs");
8
8
  exports.dispatchRefractorPlugins = _index.dispatchPlugins;
9
9
  var _elementIdentity = _interopRequireDefault(require("./refractor/plugins/element-identity.cjs"));
@@ -85,10 +85,15 @@ var _DeepCloneError = _interopRequireDefault(require("./clone/errors/DeepCloneEr
85
85
  exports.DeepCloneError = _DeepCloneError.default;
86
86
  var _ShallowCloneError = _interopRequireDefault(require("./clone/errors/ShallowCloneError.cjs"));
87
87
  exports.ShallowCloneError = _ShallowCloneError.default;
88
+ var _index6 = require("./identity/index.cjs");
89
+ exports.defaultIdentityManager = _index6.defaultIdentityManager;
90
+ exports.IdentityManager = _index6.IdentityManager;
91
+ var _ElementIdentityError = _interopRequireDefault(require("./identity/errors/ElementIdentityError.cjs"));
92
+ exports.ElementIdentityError = _ElementIdentityError.default;
88
93
  var _from = _interopRequireDefault(require("./transformers/from.cjs"));
89
94
  exports.from = _from.default;
90
- var _index6 = _interopRequireDefault(require("./transformers/serializers/value/index.cjs"));
91
- exports.toValue = _index6.default;
95
+ var _index7 = _interopRequireDefault(require("./transformers/serializers/value/index.cjs"));
96
+ exports.toValue = _index7.default;
92
97
  var _json = _interopRequireDefault(require("./transformers/serializers/json.cjs"));
93
98
  exports.toJSON = _json.default;
94
99
  var _yaml = _interopRequireDefault(require("./transformers/serializers/yaml-1-2.cjs"));
@@ -1,10 +1,9 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
3
  exports.__esModule = true;
5
4
  exports.default = void 0;
6
- var _shortUniqueId = _interopRequireDefault(require("short-unique-id"));
7
5
  var _minim = require("minim");
6
+ var _index = require("../../identity/index.cjs");
8
7
  /**
9
8
  * Plugin for decorating every element in ApiDOM tree with UUID.
10
9
  */
@@ -12,21 +11,21 @@ var _minim = require("minim");
12
11
  const plugin = ({
13
12
  length = 6
14
13
  } = {}) => () => {
15
- let uuid;
14
+ let identityManager;
16
15
  return {
17
16
  pre() {
18
- uuid = new _shortUniqueId.default({
17
+ identityManager = (0, _index.IdentityManager)({
19
18
  length
20
19
  });
21
20
  },
22
21
  visitor: {
23
22
  enter(element) {
24
- // eslint-disable-next-line no-param-reassign
25
- element.id = new _minim.StringElement(uuid.randomUUID());
23
+ element.id = new _minim.StringElement(identityManager.generateId()); // eslint-disable-line no-param-reassign
26
24
  }
27
25
  },
26
+
28
27
  post() {
29
- uuid = null;
28
+ identityManager = null;
30
29
  }
31
30
  };
32
31
  };
@@ -1,10 +1,9 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
3
  exports.__esModule = true;
5
4
  exports.default = void 0;
6
- var _shortUniqueId = _interopRequireDefault(require("short-unique-id"));
7
5
  var _minim = require("minim");
6
+ var _index = require("../../identity/index.cjs");
8
7
  /**
9
8
  * Plugin for decorating every semantic element in ApiDOM tree with UUID.
10
9
  */
@@ -14,23 +13,23 @@ const plugin = ({
14
13
  } = {}) => ({
15
14
  predicates
16
15
  }) => {
17
- let uuid;
16
+ let identityManager;
18
17
  return {
19
18
  pre() {
20
- uuid = new _shortUniqueId.default({
19
+ identityManager = (0, _index.IdentityManager)({
21
20
  length
22
21
  });
23
22
  },
24
23
  visitor: {
25
24
  enter(element) {
26
25
  if (!predicates.isPrimitiveElement(element)) {
27
- // eslint-disable-next-line no-param-reassign
28
- element.id = new _minim.StringElement(uuid.randomUUID());
26
+ element.id = new _minim.StringElement(identityManager.generateId()); // eslint-disable-line no-param-reassign
29
27
  }
30
28
  }
31
29
  },
30
+
32
31
  post() {
33
- uuid = null;
32
+ identityManager = null;
34
33
  }
35
34
  };
36
35
  };
@@ -7,19 +7,29 @@ var _ramda = require("ramda");
7
7
  var _ramdaAdjunct = require("ramda-adjunct");
8
8
  var _toolbox = _interopRequireDefault(require("../../toolbox.cjs"));
9
9
  var _visitor = require("../../../traversal/visitor.cjs");
10
+ const defaultDispatchPluginsOptions = {
11
+ toolboxCreator: _toolbox.default,
12
+ visitorOptions: {
13
+ nodeTypeGetter: _visitor.getNodeType,
14
+ exposeEdits: true
15
+ }
16
+ };
17
+
10
18
  // eslint-disable-next-line import/prefer-default-export
11
19
  const dispatchPlugins = (element, plugins, options = {}) => {
12
20
  if (plugins.length === 0) return element;
13
- const toolboxCreator = (0, _ramda.propOr)(_toolbox.default, 'toolboxCreator', options);
14
- const visitorOptions = (0, _ramda.propOr)({}, 'visitorOptions', options);
15
- const nodeTypeGetter = (0, _ramda.propOr)(_visitor.getNodeType, 'nodeTypeGetter', visitorOptions);
21
+ const mergedOptions = (0, _ramda.mergeDeepRight)(defaultDispatchPluginsOptions, options);
22
+ const {
23
+ toolboxCreator,
24
+ visitorOptions
25
+ } = mergedOptions;
16
26
  const toolbox = toolboxCreator();
17
27
  const pluginsSpecs = plugins.map(plugin => plugin(toolbox));
18
- const pluginsVisitor = (0, _visitor.mergeAllVisitors)(pluginsSpecs.map((0, _ramda.propOr)({}, 'visitor')), {
19
- nodeTypeGetter
28
+ const mergedPluginsVisitor = (0, _visitor.mergeAllVisitors)(pluginsSpecs.map((0, _ramda.propOr)({}, 'visitor')), {
29
+ ...visitorOptions
20
30
  });
21
31
  pluginsSpecs.forEach((0, _ramdaAdjunct.invokeArgs)(['pre'], []));
22
- const newElement = (0, _visitor.visit)(element, pluginsVisitor, visitorOptions);
32
+ const newElement = (0, _visitor.visit)(element, mergedPluginsVisitor, visitorOptions);
23
33
  pluginsSpecs.forEach((0, _ramdaAdjunct.invokeArgs)(['post'], []));
24
34
  return newElement;
25
35
  };
@@ -20,9 +20,7 @@ const getNodeType = element => {
20
20
  *
21
21
  * There is a problem with naming visitor methods described here: https://github.com/babel/babel/discussions/12874
22
22
  */
23
- /* eslint-disable no-nested-ternary */
24
23
  return (0, _index.isObjectElement)(element) ? 'ObjectElement' : (0, _index.isArrayElement)(element) ? 'ArrayElement' : (0, _index.isMemberElement)(element) ? 'MemberElement' : (0, _index.isStringElement)(element) ? 'StringElement' : (0, _index.isBooleanElement)(element) ? 'BooleanElement' : (0, _index.isNumberElement)(element) ? 'NumberElement' : (0, _index.isNullElement)(element) ? 'NullElement' : (0, _index.isLinkElement)(element) ? 'LinkElement' : (0, _index.isRefElement)(element) ? 'RefElement' : undefined;
25
- /* eslint-enable */
26
24
  };
27
25
 
28
26
  // cloneNode :: a -> a