@speclynx/apidom-core 1.12.2 → 2.0.1

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.
Files changed (92) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/NOTICE +16 -7
  3. package/README.md +102 -330
  4. package/dist/apidom-core.browser.js +7529 -11588
  5. package/dist/apidom-core.browser.min.js +1 -1
  6. package/package.json +7 -12
  7. package/src/identity/index.cjs +8 -6
  8. package/src/identity/index.mjs +6 -4
  9. package/src/index.cjs +13 -79
  10. package/src/index.mjs +3 -13
  11. package/src/merge/deepmerge.cjs +22 -20
  12. package/src/merge/deepmerge.mjs +9 -7
  13. package/src/merge/merge-right.cjs +2 -2
  14. package/src/merge/merge-right.mjs +1 -1
  15. package/src/namespace.cjs +4 -36
  16. package/src/namespace.mjs +2 -30
  17. package/src/refractor/plugins/dispatcher/index.cjs +5 -12
  18. package/src/refractor/plugins/dispatcher/index.mjs +5 -12
  19. package/src/refractor/plugins/element-identity.cjs +2 -2
  20. package/src/refractor/plugins/element-identity.mjs +2 -2
  21. package/src/refractor/plugins/semantic-element-identity.cjs +5 -10
  22. package/src/refractor/plugins/semantic-element-identity.mjs +5 -9
  23. package/src/refractor/toolbox.cjs +22 -5
  24. package/src/refractor/toolbox.mjs +25 -6
  25. package/src/specification.cjs +51 -0
  26. package/src/specification.mjs +47 -0
  27. package/src/transcluder/Transcluder.cjs +8 -8
  28. package/src/transcluder/Transcluder.mjs +1 -1
  29. package/src/transformers/from.mjs +2 -2
  30. package/src/transformers/serializers/json.cjs +2 -2
  31. package/src/transformers/serializers/json.mjs +1 -1
  32. package/src/transformers/serializers/value.cjs +50 -0
  33. package/src/transformers/serializers/value.mjs +47 -0
  34. package/src/transformers/serializers/yaml-1-2.cjs +22 -18
  35. package/src/transformers/serializers/yaml-1-2.mjs +22 -18
  36. package/src/transformers/sexprs.cjs +20 -23
  37. package/src/transformers/sexprs.mjs +20 -22
  38. package/src/transformers/to-string.mjs +2 -2
  39. package/types/apidom-core.d.ts +67 -519
  40. package/src/clone/errors/CloneError.cjs +0 -22
  41. package/src/clone/errors/CloneError.mjs +0 -19
  42. package/src/clone/errors/DeepCloneError.cjs +0 -11
  43. package/src/clone/errors/DeepCloneError.mjs +0 -6
  44. package/src/clone/errors/ShallowCloneError.cjs +0 -11
  45. package/src/clone/errors/ShallowCloneError.mjs +0 -6
  46. package/src/clone/index.cjs +0 -155
  47. package/src/clone/index.mjs +0 -146
  48. package/src/elements/Annotation.cjs +0 -23
  49. package/src/elements/Annotation.mjs +0 -20
  50. package/src/elements/Comment.cjs +0 -15
  51. package/src/elements/Comment.mjs +0 -12
  52. package/src/elements/ParseResult.cjs +0 -53
  53. package/src/elements/ParseResult.mjs +0 -50
  54. package/src/elements/SourceMap.cjs +0 -39
  55. package/src/elements/SourceMap.mjs +0 -36
  56. package/src/predicates/helpers.cjs +0 -85
  57. package/src/predicates/helpers.mjs +0 -77
  58. package/src/predicates/index.cjs +0 -208
  59. package/src/predicates/index.mjs +0 -198
  60. package/src/refractor/index.cjs +0 -46
  61. package/src/refractor/index.mjs +0 -40
  62. package/src/refractor/registration.cjs +0 -34
  63. package/src/refractor/registration.mjs +0 -19
  64. package/src/transformers/serializers/value/ast/ephemeral-array.cjs +0 -21
  65. package/src/transformers/serializers/value/ast/ephemeral-array.mjs +0 -17
  66. package/src/transformers/serializers/value/ast/ephemeral-object.cjs +0 -20
  67. package/src/transformers/serializers/value/ast/ephemeral-object.mjs +0 -16
  68. package/src/transformers/serializers/value/index.cjs +0 -85
  69. package/src/transformers/serializers/value/index.mjs +0 -80
  70. package/src/transformers/serializers/value/visitor.cjs +0 -52
  71. package/src/transformers/serializers/value/visitor.mjs +0 -47
  72. package/src/traversal/filter.cjs +0 -18
  73. package/src/traversal/filter.mjs +0 -14
  74. package/src/traversal/find.cjs +0 -19
  75. package/src/traversal/find.mjs +0 -15
  76. package/src/traversal/findAtOffset.cjs +0 -65
  77. package/src/traversal/findAtOffset.mjs +0 -60
  78. package/src/traversal/index.cjs +0 -19
  79. package/src/traversal/index.mjs +0 -7
  80. package/src/traversal/parents.cjs +0 -38
  81. package/src/traversal/parents.mjs +0 -34
  82. package/src/traversal/reject.cjs +0 -15
  83. package/src/traversal/reject.mjs +0 -10
  84. package/src/traversal/some.cjs +0 -15
  85. package/src/traversal/some.mjs +0 -10
  86. package/src/traversal/traverse.cjs +0 -60
  87. package/src/traversal/traverse.mjs +0 -53
  88. package/src/traversal/visitor.cjs +0 -123
  89. package/src/traversal/visitor.mjs +0 -115
  90. package/src/util.cjs +0 -28
  91. package/src/util.mjs +0 -24
  92. package/types/minim.d.ts +0 -236
@@ -1,21 +1,40 @@
1
- import * as basePredicates from "../predicates/index.mjs";
2
- import defaultNamespaceInstance from "../namespace.mjs";
1
+ import { isElement, isStringElement, isNumberElement, isNullElement, isBooleanElement, isArrayElement, isObjectElement, isMemberElement, isPrimitiveElement, isLinkElement, isRefElement, isAnnotationElement, isCommentElement, isParseResultElement, isSourceMapElement, hasElementSourceMap, includesSymbols, includesClasses } from '@speclynx/apidom-datamodel';
2
+ import defaultNamespace from "../namespace.mjs";
3
3
  /**
4
4
  * @public
5
5
  */
6
+ const predicates = {
7
+ isElement,
8
+ isStringElement,
9
+ isNumberElement,
10
+ isNullElement,
11
+ isBooleanElement,
12
+ isArrayElement,
13
+ isObjectElement,
14
+ isMemberElement,
15
+ isPrimitiveElement,
16
+ isLinkElement,
17
+ isRefElement,
18
+ isAnnotationElement,
19
+ isCommentElement,
20
+ isParseResultElement,
21
+ isSourceMapElement,
22
+ hasElementSourceMap,
23
+ includesSymbols,
24
+ includesClasses
25
+ };
26
+
6
27
  /**
7
28
  * @public
8
29
  */
30
+
9
31
  /**
10
32
  * @public
11
33
  */
12
34
  const createToolbox = () => {
13
- const predicates = {
14
- ...basePredicates
15
- };
16
35
  return {
17
36
  predicates,
18
- namespace: defaultNamespaceInstance
37
+ namespace: defaultNamespace
19
38
  };
20
39
  };
21
40
  export default createToolbox;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.resolveSpecification = void 0;
5
+ var _ramda = require("ramda");
6
+ var _ramdaAdjunct = require("ramda-adjunct");
7
+ /**
8
+ * Base type for resolved specification objects.
9
+ * Extend this in namespace packages to add specific type information.
10
+ * @public
11
+ */
12
+
13
+ const specCache = new WeakMap();
14
+
15
+ /**
16
+ * Resolves a specification object by:
17
+ * 1. Dereferencing all $ref pointers
18
+ * 2. Building elementMap from objects with `element` property
19
+ * 3. Caching results for efficiency
20
+ *
21
+ * @public
22
+ */
23
+ const resolveSpecification = specification => {
24
+ if (specCache.has(specification)) {
25
+ return specCache.get(specification);
26
+ }
27
+ const elementMap = {};
28
+ const traverse = (obj, root, currentPath) => {
29
+ // Collect element mapping
30
+ if (typeof obj.element === 'string') {
31
+ elementMap[obj.element] = obj.$visitor ? [...currentPath, '$visitor'] : currentPath;
32
+ }
33
+ return (0, _ramda.mapObjIndexed)((val, key) => {
34
+ const newPath = [...currentPath, key];
35
+ if ((0, _ramdaAdjunct.isPlainObject)(val) && (0, _ramda.has)('$ref', val) && (0, _ramda.propSatisfies)(_ramdaAdjunct.isString, '$ref', val)) {
36
+ const $ref = (0, _ramda.path)(['$ref'], val);
37
+ const pointer = (0, _ramdaAdjunct.trimCharsStart)('#/', $ref);
38
+ return (0, _ramda.path)(pointer.split('/'), root);
39
+ }
40
+ if ((0, _ramdaAdjunct.isPlainObject)(val)) {
41
+ return traverse(val, root, newPath);
42
+ }
43
+ return val;
44
+ }, obj);
45
+ };
46
+ const resolved = traverse(specification, specification, []);
47
+ resolved.elementMap = elementMap;
48
+ specCache.set(specification, resolved);
49
+ return resolved;
50
+ };
51
+ exports.resolveSpecification = resolveSpecification;
@@ -0,0 +1,47 @@
1
+ import { mapObjIndexed, path, has, propSatisfies } from 'ramda';
2
+ import { isPlainObject, trimCharsStart, isString } from 'ramda-adjunct';
3
+
4
+ /**
5
+ * Base type for resolved specification objects.
6
+ * Extend this in namespace packages to add specific type information.
7
+ * @public
8
+ */
9
+
10
+ const specCache = new WeakMap();
11
+
12
+ /**
13
+ * Resolves a specification object by:
14
+ * 1. Dereferencing all $ref pointers
15
+ * 2. Building elementMap from objects with `element` property
16
+ * 3. Caching results for efficiency
17
+ *
18
+ * @public
19
+ */
20
+ export const resolveSpecification = specification => {
21
+ if (specCache.has(specification)) {
22
+ return specCache.get(specification);
23
+ }
24
+ const elementMap = {};
25
+ const traverse = (obj, root, currentPath) => {
26
+ // Collect element mapping
27
+ if (typeof obj.element === 'string') {
28
+ elementMap[obj.element] = obj.$visitor ? [...currentPath, '$visitor'] : currentPath;
29
+ }
30
+ return mapObjIndexed((val, key) => {
31
+ const newPath = [...currentPath, key];
32
+ if (isPlainObject(val) && has('$ref', val) && propSatisfies(isString, '$ref', val)) {
33
+ const $ref = path(['$ref'], val);
34
+ const pointer = trimCharsStart('#/', $ref);
35
+ return path(pointer.split('/'), root);
36
+ }
37
+ if (isPlainObject(val)) {
38
+ return traverse(val, root, newPath);
39
+ }
40
+ return val;
41
+ }, obj);
42
+ };
43
+ const resolved = traverse(specification, specification, []);
44
+ resolved.elementMap = elementMap;
45
+ specCache.set(specification, resolved);
46
+ return resolved;
47
+ };
@@ -2,10 +2,10 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.default = void 0;
5
+ var _apidomDatamodel = require("@speclynx/apidom-datamodel");
5
6
  var _ramdaAdjunct = require("ramda-adjunct");
6
- var _index = require("../predicates/index.cjs");
7
7
  const computeEdges = (element, edges = new WeakMap()) => {
8
- if ((0, _index.isMemberElement)(element)) {
8
+ if ((0, _apidomDatamodel.isMemberElement)(element)) {
9
9
  // @ts-ignore
10
10
  edges.set(element.key, element);
11
11
  // @ts-ignore
@@ -24,7 +24,7 @@ const computeEdges = (element, edges = new WeakMap()) => {
24
24
  };
25
25
  const transcludeChildOfMemberElement = (search, replace, edges) => {
26
26
  const memberElement = edges.get(search);
27
- if (!(0, _index.isMemberElement)(memberElement)) {
27
+ if (!(0, _apidomDatamodel.isMemberElement)(memberElement)) {
28
28
  return;
29
29
  }
30
30
  if (memberElement.key === search) {
@@ -40,7 +40,7 @@ const transcludeChildOfMemberElement = (search, replace, edges) => {
40
40
  };
41
41
  const transcludeChildOfObjectElement = (search, replace, edges) => {
42
42
  const objectElement = edges.get(search);
43
- if (!(0, _index.isObjectElement)(objectElement)) {
43
+ if (!(0, _apidomDatamodel.isObjectElement)(objectElement)) {
44
44
  return;
45
45
  }
46
46
  objectElement.content = objectElement.map((value, key, member) => {
@@ -54,7 +54,7 @@ const transcludeChildOfObjectElement = (search, replace, edges) => {
54
54
  };
55
55
  const transcludeChildOfArrayElement = (search, replace, edges) => {
56
56
  const arrayElement = edges.get(search);
57
- if (!(0, _index.isArrayElement)(arrayElement)) {
57
+ if (!(0, _apidomDatamodel.isArrayElement)(arrayElement)) {
58
58
  return;
59
59
  }
60
60
  arrayElement.content = arrayElement.map(element => {
@@ -97,12 +97,12 @@ class Transcluder {
97
97
  * isArrayElement returns true for ObjectElements.
98
98
  * (classical problems with polymorphism)
99
99
  */
100
- if ((0, _index.isObjectElement)(parent)) {
100
+ if ((0, _apidomDatamodel.isObjectElement)(parent)) {
101
101
  // @ts-ignore
102
102
  transcludeChildOfObjectElement(search, replace, this.edges);
103
- } else if ((0, _index.isArrayElement)(parent)) {
103
+ } else if ((0, _apidomDatamodel.isArrayElement)(parent)) {
104
104
  transcludeChildOfArrayElement(search, replace, this.edges);
105
- } else if ((0, _index.isMemberElement)(parent)) {
105
+ } else if ((0, _apidomDatamodel.isMemberElement)(parent)) {
106
106
  transcludeChildOfMemberElement(search, replace, this.edges);
107
107
  }
108
108
  return this.element;
@@ -1,5 +1,5 @@
1
+ import { isObjectElement, isArrayElement, isMemberElement } from '@speclynx/apidom-datamodel';
1
2
  import { isUndefined } from 'ramda-adjunct';
2
- import { isObjectElement, isArrayElement, isMemberElement } from "../predicates/index.mjs";
3
3
  const computeEdges = (element, edges = new WeakMap()) => {
4
4
  if (isMemberElement(element)) {
5
5
  // @ts-ignore
@@ -1,6 +1,6 @@
1
1
  import { has } from 'ramda';
2
2
  import { isPlainObject, isString } from 'ramda-adjunct';
3
- import defaultNamespaceInstance from "../namespace.mjs";
3
+ import defaultNamespace from "../namespace.mjs";
4
4
  /**
5
5
  * Transforms data to an Element from a particular namespace.
6
6
  *
@@ -11,7 +11,7 @@ import defaultNamespaceInstance from "../namespace.mjs";
11
11
  * - https://github.com/swagger-api/swagger-ui/issues/9466#issuecomment-1881053410
12
12
  * @public
13
13
  */
14
- const fromFn = (data, namespace = defaultNamespaceInstance) => {
14
+ const fromFn = (data, namespace = defaultNamespace) => {
15
15
  if (isString(data)) {
16
16
  // JSON serialized refract
17
17
  try {
@@ -3,9 +3,9 @@
3
3
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
4
  exports.__esModule = true;
5
5
  exports.default = void 0;
6
- var _index = _interopRequireDefault(require("./value/index.cjs"));
6
+ var _value = _interopRequireDefault(require("./value.cjs"));
7
7
  /**
8
8
  * @public
9
9
  */
10
- const serializer = (element, replacer, space) => JSON.stringify((0, _index.default)(element), replacer, space);
10
+ const serializer = (element, replacer, space) => JSON.stringify((0, _value.default)(element), replacer, space);
11
11
  var _default = exports.default = serializer;
@@ -1,4 +1,4 @@
1
- import serializeValue from "./value/index.mjs";
1
+ import serializeValue from "./value.mjs";
2
2
  /**
3
3
  * @public
4
4
  */
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.default = void 0;
5
+ var _apidomDatamodel = require("@speclynx/apidom-datamodel");
6
+ /**
7
+ * Transforms the ApiDOM into JavaScript POJO.
8
+ * This POJO would be the result of interpreting the ApiDOM
9
+ * into JavaScript structure.
10
+ * @public
11
+ */
12
+ const serializer = element => {
13
+ if (!(0, _apidomDatamodel.isElement)(element)) return element;
14
+
15
+ // Shortcut optimization for primitive element types
16
+ if ((0, _apidomDatamodel.isStringElement)(element) || (0, _apidomDatamodel.isNumberElement)(element) || (0, _apidomDatamodel.isBooleanElement)(element) || (0, _apidomDatamodel.isNullElement)(element)) {
17
+ return element.toValue();
18
+ }
19
+
20
+ // WeakMap for cycle handling - stores references to already-visited elements
21
+ const references = new WeakMap();
22
+ const serialize = node => {
23
+ if (!(0, _apidomDatamodel.isElement)(node)) return node;
24
+ if ((0, _apidomDatamodel.isObjectElement)(node)) {
25
+ if (references.has(node)) return references.get(node);
26
+ const obj = {};
27
+ references.set(node, obj);
28
+ node.forEach((value, key) => {
29
+ const k = serialize(key);
30
+ const v = serialize(value);
31
+ if (typeof k === 'string') obj[k] = v;
32
+ });
33
+ return obj;
34
+ }
35
+ if ((0, _apidomDatamodel.isArrayElement)(node)) {
36
+ if (references.has(node)) return references.get(node);
37
+ const arr = [];
38
+ references.set(node, arr);
39
+ node.forEach(item => arr.push(serialize(item)));
40
+ return arr;
41
+ }
42
+ if ((0, _apidomDatamodel.isRefElement)(node)) return String(node.toValue());
43
+ if ((0, _apidomDatamodel.isLinkElement)(node)) {
44
+ return (0, _apidomDatamodel.isStringElement)(node.href) ? node.href.toValue() : '';
45
+ }
46
+ return node.toValue();
47
+ };
48
+ return serialize(element);
49
+ };
50
+ var _default = exports.default = serializer;
@@ -0,0 +1,47 @@
1
+ import { isElement, isObjectElement, isArrayElement, isRefElement, isLinkElement, isStringElement, isBooleanElement, isNumberElement, isNullElement } from '@speclynx/apidom-datamodel';
2
+
3
+ /**
4
+ * Transforms the ApiDOM into JavaScript POJO.
5
+ * This POJO would be the result of interpreting the ApiDOM
6
+ * into JavaScript structure.
7
+ * @public
8
+ */
9
+ const serializer = element => {
10
+ if (!isElement(element)) return element;
11
+
12
+ // Shortcut optimization for primitive element types
13
+ if (isStringElement(element) || isNumberElement(element) || isBooleanElement(element) || isNullElement(element)) {
14
+ return element.toValue();
15
+ }
16
+
17
+ // WeakMap for cycle handling - stores references to already-visited elements
18
+ const references = new WeakMap();
19
+ const serialize = node => {
20
+ if (!isElement(node)) return node;
21
+ if (isObjectElement(node)) {
22
+ if (references.has(node)) return references.get(node);
23
+ const obj = {};
24
+ references.set(node, obj);
25
+ node.forEach((value, key) => {
26
+ const k = serialize(key);
27
+ const v = serialize(value);
28
+ if (typeof k === 'string') obj[k] = v;
29
+ });
30
+ return obj;
31
+ }
32
+ if (isArrayElement(node)) {
33
+ if (references.has(node)) return references.get(node);
34
+ const arr = [];
35
+ references.set(node, arr);
36
+ node.forEach(item => arr.push(serialize(item)));
37
+ return arr;
38
+ }
39
+ if (isRefElement(node)) return String(node.toValue());
40
+ if (isLinkElement(node)) {
41
+ return isStringElement(node.href) ? node.href.toValue() : '';
42
+ }
43
+ return node.toValue();
44
+ };
45
+ return serialize(element);
46
+ };
47
+ export default serializer;
@@ -3,8 +3,8 @@
3
3
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
4
  exports.__esModule = true;
5
5
  exports.default = void 0;
6
- var _visitor = require("../../traversal/visitor.cjs");
7
- var _index = _interopRequireDefault(require("./value/index.cjs"));
6
+ var _apidomTraverse = require("@speclynx/apidom-traverse");
7
+ var _value = _interopRequireDefault(require("./value.cjs"));
8
8
  class YamlVisitor {
9
9
  static indentChar = ' ';
10
10
  result;
@@ -16,42 +16,46 @@ class YamlVisitor {
16
16
  this.result = directive ? '%YAML 1.2\n---\n' : '';
17
17
  this.indent = indent;
18
18
  }
19
- NumberElement(element) {
20
- this.result += (0, _index.default)(element);
19
+ NumberElement(path) {
20
+ this.result += (0, _value.default)(path.node);
21
21
  }
22
- BooleanElement(element) {
23
- const value = (0, _index.default)(element);
22
+ BooleanElement(path) {
23
+ const value = (0, _value.default)(path.node);
24
24
  this.result += value ? 'true' : 'false';
25
25
  }
26
- StringElement(element) {
26
+ StringElement(path) {
27
27
  // for simplicity and avoiding ambiguity we always wrap strings in quotes
28
- this.result += JSON.stringify((0, _index.default)(element));
28
+ this.result += JSON.stringify((0, _value.default)(path.node));
29
29
  }
30
30
  NullElement() {
31
31
  this.result += 'null';
32
32
  }
33
- ArrayElement(element) {
33
+ ArrayElement(path) {
34
+ const element = path.node;
34
35
  if (element.length === 0) {
35
36
  this.result += '[]';
36
- return false;
37
+ path.skip();
38
+ return;
37
39
  }
38
40
  element.forEach(item => {
39
41
  const visitor = new YamlVisitor({
40
42
  indent: this.indent + 1
41
43
  });
42
44
  const indent = YamlVisitor.indentChar.repeat(this.indent);
43
- (0, _visitor.visit)(item, visitor);
45
+ (0, _apidomTraverse.traverse)(item, visitor);
44
46
  const {
45
47
  result
46
48
  } = visitor;
47
49
  this.result += result.startsWith('\n') ? `\n${indent}-${result}` : `\n${indent}- ${result}`;
48
50
  });
49
- return false;
51
+ path.skip();
50
52
  }
51
- ObjectElement(element) {
53
+ ObjectElement(path) {
54
+ const element = path.node;
52
55
  if (element.length === 0) {
53
56
  this.result += '{}';
54
- return false;
57
+ path.skip();
58
+ return;
55
59
  }
56
60
  element.forEach((value, key) => {
57
61
  const keyVisitor = new YamlVisitor({
@@ -61,8 +65,8 @@ class YamlVisitor {
61
65
  indent: this.indent + 1
62
66
  });
63
67
  const indent = YamlVisitor.indentChar.repeat(this.indent);
64
- (0, _visitor.visit)(key, keyVisitor);
65
- (0, _visitor.visit)(value, valueVisitor);
68
+ (0, _apidomTraverse.traverse)(key, keyVisitor);
69
+ (0, _apidomTraverse.traverse)(value, valueVisitor);
66
70
  const {
67
71
  result: keyResult
68
72
  } = keyVisitor;
@@ -71,7 +75,7 @@ class YamlVisitor {
71
75
  } = valueVisitor;
72
76
  this.result += valueResult.startsWith('\n') ? `\n${indent}${keyResult}:${valueResult}` : `\n${indent}${keyResult}: ${valueResult}`;
73
77
  });
74
- return false;
78
+ path.skip();
75
79
  }
76
80
  }
77
81
 
@@ -84,7 +88,7 @@ const serializer = (element, {
84
88
  const visitor = new YamlVisitor({
85
89
  directive
86
90
  });
87
- (0, _visitor.visit)(element, visitor);
91
+ (0, _apidomTraverse.traverse)(element, visitor);
88
92
  return visitor.result;
89
93
  };
90
94
  var _default = exports.default = serializer;
@@ -1,5 +1,5 @@
1
- import { visit } from "../../traversal/visitor.mjs";
2
- import serializeValue from "./value/index.mjs";
1
+ import { traverse } from '@speclynx/apidom-traverse';
2
+ import serializeValue from "./value.mjs";
3
3
  class YamlVisitor {
4
4
  static indentChar = ' ';
5
5
  result;
@@ -11,42 +11,46 @@ class YamlVisitor {
11
11
  this.result = directive ? '%YAML 1.2\n---\n' : '';
12
12
  this.indent = indent;
13
13
  }
14
- NumberElement(element) {
15
- this.result += serializeValue(element);
14
+ NumberElement(path) {
15
+ this.result += serializeValue(path.node);
16
16
  }
17
- BooleanElement(element) {
18
- const value = serializeValue(element);
17
+ BooleanElement(path) {
18
+ const value = serializeValue(path.node);
19
19
  this.result += value ? 'true' : 'false';
20
20
  }
21
- StringElement(element) {
21
+ StringElement(path) {
22
22
  // for simplicity and avoiding ambiguity we always wrap strings in quotes
23
- this.result += JSON.stringify(serializeValue(element));
23
+ this.result += JSON.stringify(serializeValue(path.node));
24
24
  }
25
25
  NullElement() {
26
26
  this.result += 'null';
27
27
  }
28
- ArrayElement(element) {
28
+ ArrayElement(path) {
29
+ const element = path.node;
29
30
  if (element.length === 0) {
30
31
  this.result += '[]';
31
- return false;
32
+ path.skip();
33
+ return;
32
34
  }
33
35
  element.forEach(item => {
34
36
  const visitor = new YamlVisitor({
35
37
  indent: this.indent + 1
36
38
  });
37
39
  const indent = YamlVisitor.indentChar.repeat(this.indent);
38
- visit(item, visitor);
40
+ traverse(item, visitor);
39
41
  const {
40
42
  result
41
43
  } = visitor;
42
44
  this.result += result.startsWith('\n') ? `\n${indent}-${result}` : `\n${indent}- ${result}`;
43
45
  });
44
- return false;
46
+ path.skip();
45
47
  }
46
- ObjectElement(element) {
48
+ ObjectElement(path) {
49
+ const element = path.node;
47
50
  if (element.length === 0) {
48
51
  this.result += '{}';
49
- return false;
52
+ path.skip();
53
+ return;
50
54
  }
51
55
  element.forEach((value, key) => {
52
56
  const keyVisitor = new YamlVisitor({
@@ -56,8 +60,8 @@ class YamlVisitor {
56
60
  indent: this.indent + 1
57
61
  });
58
62
  const indent = YamlVisitor.indentChar.repeat(this.indent);
59
- visit(key, keyVisitor);
60
- visit(value, valueVisitor);
63
+ traverse(key, keyVisitor);
64
+ traverse(value, valueVisitor);
61
65
  const {
62
66
  result: keyResult
63
67
  } = keyVisitor;
@@ -66,7 +70,7 @@ class YamlVisitor {
66
70
  } = valueVisitor;
67
71
  this.result += valueResult.startsWith('\n') ? `\n${indent}${keyResult}:${valueResult}` : `\n${indent}${keyResult}: ${valueResult}`;
68
72
  });
69
- return false;
73
+ path.skip();
70
74
  }
71
75
  }
72
76
 
@@ -79,7 +83,7 @@ const serializer = (element, {
79
83
  const visitor = new YamlVisitor({
80
84
  directive
81
85
  });
82
- visit(element, visitor);
86
+ traverse(element, visitor);
83
87
  return visitor.result;
84
88
  };
85
89
  export default serializer;
@@ -2,33 +2,30 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.default = void 0;
5
- var _visitor = require("../traversal/visitor.cjs");
6
- class SymbolicExpressionsVisitor {
7
- result = '';
8
- nestingLevel = 0;
9
- enter(element) {
10
- const {
11
- element: elementName
12
- } = element;
13
- const capitalizedElementName = elementName.charAt(0).toUpperCase() + elementName.slice(1);
14
- const indent = ' '.repeat(this.nestingLevel);
15
- this.result += this.nestingLevel > 0 ? '\n' : '';
16
- this.result += `${indent}(${capitalizedElementName}Element`;
17
- this.nestingLevel += 1;
18
- }
19
- leave() {
20
- this.nestingLevel -= 1;
21
- this.result += ')';
22
- }
23
- }
24
-
5
+ var _apidomTraverse = require("@speclynx/apidom-traverse");
25
6
  /**
26
7
  * Transforms ApiDOM into S-expressions (Symbolic Expressions).
27
8
  * @public
28
9
  */
29
10
  const sexprs = element => {
30
- const visitor = new SymbolicExpressionsVisitor();
31
- (0, _visitor.visit)(element, visitor);
32
- return visitor.result;
11
+ let result = '';
12
+ let nestingLevel = 0;
13
+ (0, _apidomTraverse.traverse)(element, {
14
+ enter(path) {
15
+ const {
16
+ element: elementName
17
+ } = path.node;
18
+ const capitalizedElementName = elementName.charAt(0).toUpperCase() + elementName.slice(1);
19
+ const indent = ' '.repeat(nestingLevel);
20
+ result += nestingLevel > 0 ? '\n' : '';
21
+ result += `${indent}(${capitalizedElementName}Element`;
22
+ nestingLevel += 1;
23
+ },
24
+ leave() {
25
+ nestingLevel -= 1;
26
+ result += ')';
27
+ }
28
+ });
29
+ return result;
33
30
  };
34
31
  var _default = exports.default = sexprs;
@@ -1,30 +1,28 @@
1
- import { visit } from "../traversal/visitor.mjs";
2
- class SymbolicExpressionsVisitor {
3
- result = '';
4
- nestingLevel = 0;
5
- enter(element) {
6
- const {
7
- element: elementName
8
- } = element;
9
- const capitalizedElementName = elementName.charAt(0).toUpperCase() + elementName.slice(1);
10
- const indent = ' '.repeat(this.nestingLevel);
11
- this.result += this.nestingLevel > 0 ? '\n' : '';
12
- this.result += `${indent}(${capitalizedElementName}Element`;
13
- this.nestingLevel += 1;
14
- }
15
- leave() {
16
- this.nestingLevel -= 1;
17
- this.result += ')';
18
- }
19
- }
1
+ import { traverse } from '@speclynx/apidom-traverse';
20
2
 
21
3
  /**
22
4
  * Transforms ApiDOM into S-expressions (Symbolic Expressions).
23
5
  * @public
24
6
  */
25
7
  const sexprs = element => {
26
- const visitor = new SymbolicExpressionsVisitor();
27
- visit(element, visitor);
28
- return visitor.result;
8
+ let result = '';
9
+ let nestingLevel = 0;
10
+ traverse(element, {
11
+ enter(path) {
12
+ const {
13
+ element: elementName
14
+ } = path.node;
15
+ const capitalizedElementName = elementName.charAt(0).toUpperCase() + elementName.slice(1);
16
+ const indent = ' '.repeat(nestingLevel);
17
+ result += nestingLevel > 0 ? '\n' : '';
18
+ result += `${indent}(${capitalizedElementName}Element`;
19
+ nestingLevel += 1;
20
+ },
21
+ leave() {
22
+ nestingLevel -= 1;
23
+ result += ')';
24
+ }
25
+ });
26
+ return result;
29
27
  };
30
28
  export default sexprs;
@@ -1,10 +1,10 @@
1
- import defaultNamespaceInstance from "../namespace.mjs";
1
+ import defaultNamespace from "../namespace.mjs";
2
2
  import dehydrate from "./dehydrate.mjs";
3
3
  /**
4
4
  * Create a refracted string representation of an Element.
5
5
  * @public
6
6
  */
7
- const toString = (element, namespace = defaultNamespaceInstance) => {
7
+ const toString = (element, namespace = defaultNamespace) => {
8
8
  const refractStructure = dehydrate(element, namespace);
9
9
  return JSON.stringify(refractStructure);
10
10
  };