@swagger-api/apidom-core 0.76.1 → 0.77.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.
Files changed (97) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +53 -5
  3. package/cjs/clone/errors/CloneError.cjs +7 -0
  4. package/cjs/clone/errors/DeepCloneError.cjs +8 -0
  5. package/cjs/clone/errors/ShallowCloneError.cjs +8 -0
  6. package/cjs/clone/index.cjs +105 -0
  7. package/cjs/deepmerge.cjs +9 -7
  8. package/cjs/elements/Annotation.cjs +1 -2
  9. package/cjs/elements/Comment.cjs +1 -2
  10. package/cjs/elements/ParseResult.cjs +1 -2
  11. package/cjs/elements/SourceMap.cjs +1 -2
  12. package/cjs/index.cjs +62 -103
  13. package/cjs/media-types.cjs +1 -2
  14. package/cjs/namespace.cjs +2 -3
  15. package/cjs/predicates/helpers.cjs +1 -2
  16. package/cjs/predicates/index.cjs +16 -31
  17. package/cjs/refractor/index.cjs +2 -3
  18. package/cjs/refractor/plugins/element-identity.cjs +2 -3
  19. package/cjs/refractor/plugins/semantic-element-identity.cjs +2 -3
  20. package/cjs/refractor/plugins/utils/index.cjs +1 -1
  21. package/cjs/refractor/registration.cjs +1 -1
  22. package/cjs/refractor/toolbox.cjs +3 -5
  23. package/cjs/transcluder/Transcluder.cjs +2 -3
  24. package/cjs/transcluder/index.cjs +2 -3
  25. package/cjs/transformers/dehydrate.cjs +14 -0
  26. package/cjs/transformers/from.cjs +27 -0
  27. package/cjs/{serializers → transformers/serializers}/json.cjs +2 -3
  28. package/cjs/{serializers → transformers/serializers}/value/ast/ephemeral-array.cjs +1 -2
  29. package/cjs/{serializers → transformers/serializers}/value/ast/ephemeral-object.cjs +1 -2
  30. package/cjs/{serializers → transformers/serializers}/value/index.cjs +9 -3
  31. package/cjs/{serializers → transformers/serializers}/value/visitor.cjs +1 -1
  32. package/cjs/{serializers → transformers/serializers}/yaml-1-2.cjs +3 -4
  33. package/cjs/{sexprs.cjs → transformers/sexprs.cjs} +3 -4
  34. package/cjs/transformers/to-string.cjs +15 -0
  35. package/cjs/traversal/filter.cjs +1 -2
  36. package/cjs/traversal/find.cjs +1 -2
  37. package/cjs/traversal/findAtOffset.cjs +5 -5
  38. package/cjs/traversal/index.cjs +1 -1
  39. package/cjs/traversal/parents.cjs +2 -3
  40. package/cjs/traversal/reject.cjs +2 -3
  41. package/cjs/traversal/some.cjs +2 -3
  42. package/cjs/traversal/traverse.cjs +3 -5
  43. package/cjs/traversal/visitor.cjs +18 -9
  44. package/dist/apidom-core.browser.js +9851 -11614
  45. package/dist/apidom-core.browser.min.js +1 -1
  46. package/es/clone/errors/CloneError.mjs +3 -0
  47. package/es/clone/errors/DeepCloneError.mjs +3 -0
  48. package/es/clone/errors/ShallowCloneError.mjs +3 -0
  49. package/es/clone/index.mjs +98 -0
  50. package/es/{deepmerge.js → deepmerge.mjs} +14 -13
  51. package/es/index.mjs +46 -0
  52. package/es/{media-types.js → media-types.mjs} +2 -5
  53. package/es/{namespace.js → namespace.mjs} +4 -4
  54. package/es/predicates/{index.js → index.mjs} +5 -5
  55. package/es/refractor/index.mjs +30 -0
  56. package/es/refractor/plugins/utils/{index.js → index.mjs} +2 -2
  57. package/es/refractor/{registration.js → registration.mjs} +5 -5
  58. package/es/refractor/toolbox.mjs +12 -0
  59. package/es/transcluder/{Transcluder.js → Transcluder.mjs} +1 -1
  60. package/es/transcluder/{index.js → index.mjs} +1 -1
  61. package/es/transformers/dehydrate.mjs +9 -0
  62. package/es/transformers/from.mjs +22 -0
  63. package/es/{serializers/json.js → transformers/serializers/json.mjs} +1 -1
  64. package/es/transformers/serializers/value/ast/ephemeral-array.mjs +17 -0
  65. package/es/transformers/serializers/value/ast/ephemeral-object.mjs +16 -0
  66. package/es/{serializers/value/index.js → transformers/serializers/value/index.mjs} +10 -3
  67. package/es/transformers/serializers/value/visitor.mjs +49 -0
  68. package/es/{serializers/yaml-1-2.js → transformers/serializers/yaml-1-2.mjs} +2 -2
  69. package/es/{sexprs.js → transformers/sexprs.mjs} +1 -1
  70. package/es/transformers/to-string.mjs +10 -0
  71. package/es/traversal/{filter.js → filter.mjs} +1 -1
  72. package/es/traversal/{find.js → find.mjs} +1 -1
  73. package/es/traversal/{findAtOffset.js → findAtOffset.mjs} +5 -4
  74. package/es/traversal/index.mjs +7 -0
  75. package/es/traversal/{parents.js → parents.mjs} +1 -1
  76. package/es/traversal/{reject.js → reject.mjs} +1 -1
  77. package/es/traversal/{some.js → some.mjs} +1 -1
  78. package/es/traversal/{traverse.js → traverse.mjs} +2 -2
  79. package/es/traversal/{visitor.js → visitor.mjs} +29 -24
  80. package/package.json +8 -8
  81. package/types/dist.d.ts +47 -32
  82. package/types/minim.d.ts +14 -2
  83. package/es/index.js +0 -72
  84. package/es/refractor/index.js +0 -32
  85. package/es/refractor/toolbox.js +0 -13
  86. package/es/serializers/value/ast/ephemeral-array.js +0 -18
  87. package/es/serializers/value/ast/ephemeral-object.js +0 -17
  88. package/es/serializers/value/visitor.js +0 -54
  89. package/es/traversal/index.js +0 -7
  90. /package/es/elements/{Annotation.js → Annotation.mjs} +0 -0
  91. /package/es/elements/{Comment.js → Comment.mjs} +0 -0
  92. /package/es/elements/{ParseResult.js → ParseResult.mjs} +0 -0
  93. /package/es/elements/{SourceMap.js → SourceMap.mjs} +0 -0
  94. /package/es/predicates/{helpers.js → helpers.mjs} +0 -0
  95. /package/es/refractor/plugins/{element-identity.js → element-identity.mjs} +0 -0
  96. /package/es/refractor/plugins/{semantic-element-identity.js → semantic-element-identity.mjs} +0 -0
  97. /package/es/{util.js → util.mjs} +0 -0
@@ -0,0 +1,3 @@
1
+ import { ApiDOMStructuredError } from '@swagger-api/apidom-error';
2
+ class CloneError extends ApiDOMStructuredError {}
3
+ export default CloneError;
@@ -0,0 +1,3 @@
1
+ import CloneError from "./CloneError.mjs";
2
+ class DeepCloneError extends CloneError {}
3
+ export default DeepCloneError;
@@ -0,0 +1,3 @@
1
+ import CloneError from "./CloneError.mjs";
2
+ class ShallowCloneError extends CloneError {}
3
+ export default ShallowCloneError;
@@ -0,0 +1,98 @@
1
+ import { ArraySlice, ObjectSlice, KeyValuePair } from 'minim';
2
+ import { isElement } from "../predicates/index.mjs";
3
+ import DeepCloneError from "./errors/DeepCloneError.mjs";
4
+ import ShallowCloneError from "./errors/ShallowCloneError.mjs";
5
+ const invokeClone = value => {
6
+ if (typeof (value === null || value === void 0 ? void 0 : value.clone) === 'function') {
7
+ return value.clone();
8
+ }
9
+ return value;
10
+ };
11
+ export const cloneDeep = value => {
12
+ if (value instanceof ObjectSlice) {
13
+ const items = [...value].map(invokeClone);
14
+ return new ObjectSlice(items);
15
+ }
16
+ if (value instanceof ArraySlice) {
17
+ const items = [...value].map(invokeClone);
18
+ return new ArraySlice(items);
19
+ }
20
+ if (typeof (value === null || value === void 0 ? void 0 : value.clone) === 'function') {
21
+ return value.clone();
22
+ }
23
+ throw new DeepCloneError("Value provided to cloneDeep function couldn't be cloned", {
24
+ value
25
+ });
26
+ };
27
+ cloneDeep.safe = value => {
28
+ try {
29
+ return cloneDeep(value);
30
+ } catch {
31
+ return value;
32
+ }
33
+ };
34
+ const cloneShallowKeyValuePair = keyValuePair => {
35
+ const {
36
+ key,
37
+ value
38
+ } = keyValuePair;
39
+ return new KeyValuePair(key, value);
40
+ };
41
+ const cloneShallowArraySlice = arraySlice => {
42
+ const items = [...arraySlice];
43
+ return new ArraySlice(items);
44
+ };
45
+ const cloneShallowObjectSlice = objectSlice => {
46
+ const items = [...objectSlice];
47
+ return new ObjectSlice(items);
48
+ };
49
+
50
+ /* eslint-disable no-underscore-dangle */
51
+ const cloneShallowElement = element => {
52
+ // @ts-ignore
53
+ const copy = new element.constructor();
54
+ copy.element = element.element;
55
+ if (element.meta.length > 0) {
56
+ copy._meta = cloneDeep(element.meta);
57
+ }
58
+ if (element.attributes.length > 0) {
59
+ copy._attributes = cloneDeep(element.attributes);
60
+ }
61
+ if (isElement(element.content)) {
62
+ const content = element.content;
63
+ copy.content = cloneShallowElement(content);
64
+ } else if (Array.isArray(element.content)) {
65
+ copy.content = [...element.content];
66
+ } else if (element.content instanceof KeyValuePair) {
67
+ copy.content = cloneShallowKeyValuePair(element.content);
68
+ } else {
69
+ copy.content = element.content;
70
+ }
71
+ return copy;
72
+ };
73
+ /* eslint-enable */
74
+
75
+ export const cloneShallow = value => {
76
+ if (value instanceof KeyValuePair) {
77
+ return cloneShallowKeyValuePair(value);
78
+ }
79
+ if (value instanceof ObjectSlice) {
80
+ return cloneShallowObjectSlice(value);
81
+ }
82
+ if (value instanceof ArraySlice) {
83
+ return cloneShallowArraySlice(value);
84
+ }
85
+ if (isElement(value)) {
86
+ return cloneShallowElement(value);
87
+ }
88
+ throw new ShallowCloneError("Value provided to cloneShallow function couldn't be cloned", {
89
+ value
90
+ });
91
+ };
92
+ cloneShallow.safe = value => {
93
+ try {
94
+ return cloneShallow(value);
95
+ } catch {
96
+ return value;
97
+ }
98
+ };
@@ -1,17 +1,15 @@
1
- import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
2
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
- import { ObjectElement, MemberElement } from 'minim';
5
- import { isObjectElement, isArrayElement } from "./predicates/index.js";
1
+ import { ObjectElement } from 'minim';
2
+ import { isObjectElement, isArrayElement } from "./predicates/index.mjs";
3
+ import { cloneDeep, cloneShallow } from "./clone/index.mjs";
4
+ import toValue from "./transformers/serializers/value/index.mjs";
6
5
  /* eslint-disable @typescript-eslint/no-use-before-define */
7
6
  const emptyElement = element => {
8
- const meta = element.meta.clone();
9
- const attributes = element.attributes.clone();
7
+ const meta = cloneDeep(element.meta);
8
+ const attributes = cloneDeep(element.attributes);
10
9
 
11
10
  // @ts-ignore
12
11
  return new element.constructor(undefined, meta, attributes);
13
12
  };
14
- const cloneMemberElement = memberElement => new MemberElement(memberElement.key, memberElement.value, memberElement.meta.clone(), memberElement.attributes.clone());
15
13
  const cloneUnlessOtherwiseSpecified = (element, options) => options.clone && options.isMergeableElement(element) ? deepmerge(emptyElement(element), element, options) : element;
16
14
  const getMergeFunction = (keyElement, options) => {
17
15
  if (typeof options.customMerge !== 'function') {
@@ -25,20 +23,20 @@ const mergeObjectElement = (targetElement, sourceElement, options) => {
25
23
  const destination = isObjectElement(targetElement) ? emptyElement(targetElement) : emptyElement(sourceElement);
26
24
  if (isObjectElement(targetElement)) {
27
25
  targetElement.forEach((value, key, member) => {
28
- const clonedMember = cloneMemberElement(member);
26
+ const clonedMember = cloneShallow(member);
29
27
  clonedMember.value = cloneUnlessOtherwiseSpecified(value, options);
30
28
  destination.content.push(clonedMember);
31
29
  });
32
30
  }
33
31
  sourceElement.forEach((value, key, member) => {
34
- const keyValue = key.toValue();
32
+ const keyValue = toValue(key);
35
33
  let clonedMember;
36
34
  if (isObjectElement(targetElement) && targetElement.hasKey(keyValue) && options.isMergeableElement(value)) {
37
35
  const targetValue = targetElement.get(keyValue);
38
- clonedMember = cloneMemberElement(member);
36
+ clonedMember = cloneShallow(member);
39
37
  clonedMember.value = getMergeFunction(key, options)(targetValue, value);
40
38
  } else {
41
- clonedMember = cloneMemberElement(member);
39
+ clonedMember = cloneShallow(member);
42
40
  clonedMember.value = cloneUnlessOtherwiseSpecified(value, options);
43
41
  }
44
42
  destination.remove(keyValue);
@@ -55,7 +53,10 @@ export default function deepmerge(targetElement, sourceElement, options) {
55
53
  objectElementMerge: mergeObjectElement,
56
54
  customMerge: undefined
57
55
  };
58
- const mergedOptions = _objectSpread(_objectSpread({}, defaultOptions), options);
56
+ const mergedOptions = {
57
+ ...defaultOptions,
58
+ ...options
59
+ };
59
60
  mergedOptions.isMergeableElement = (_mergedOptions$isMerg = mergedOptions.isMergeableElement) !== null && _mergedOptions$isMerg !== void 0 ? _mergedOptions$isMerg : defaultOptions.isMergeableElement;
60
61
  mergedOptions.arrayElementMerge = (_mergedOptions$arrayE = mergedOptions.arrayElementMerge) !== null && _mergedOptions$arrayE !== void 0 ? _mergedOptions$arrayE : defaultOptions.arrayElementMerge;
61
62
  mergedOptions.objectElementMerge = (_mergedOptions$object = mergedOptions.objectElementMerge) !== null && _mergedOptions$object !== void 0 ? _mergedOptions$object : defaultOptions.objectElementMerge;
package/es/index.mjs ADDED
@@ -0,0 +1,46 @@
1
+ export { dispatchPlugins as dispatchRefractorPlugins } from "./refractor/plugins/utils/index.mjs";
2
+ export { default as refractorPluginElementIdentity } from "./refractor/plugins/element-identity.mjs";
3
+ export { default as refractorPluginSemanticElementIdentity } from "./refractor/plugins/semantic-element-identity.mjs";
4
+ export { default as MediaTypes } from "./media-types.mjs";
5
+ export { Element, MemberElement, KeyValuePair, ObjectSlice, ArraySlice, refract } from 'minim';
6
+ export { default as namespace, Namespace, createNamespace } from "./namespace.mjs";
7
+ export { ObjectElement, ArrayElement, BooleanElement, NullElement, NumberElement, StringElement, LinkElement, RefElement, AnnotationElement, CommentElement, ParseResultElement, SourceMapElement } from "./refractor/registration.mjs";
8
+ export { isElement, isStringElement, isNumberElement, isNullElement, isBooleanElement, isArrayElement, isObjectElement, isMemberElement, isLinkElement, isRefElement, isAnnotationElement, isParseResultElement, isSourceMapElement, isPrimitiveElement, hasElementSourceMap, includesSymbols, includesClasses } from "./predicates/index.mjs";
9
+ export { default as createPredicate } from "./predicates/helpers.mjs";
10
+ export { filter, reject, find, findAtOffset, some, traverse, parents } from "./traversal/index.mjs";
11
+ export { visit, BREAK, mergeAllVisitors, getNodeType, cloneNode, keyMapDefault as keyMap } from "./traversal/visitor.mjs";
12
+ export { transclude, default as Transcluder } from "./transcluder/index.mjs";
13
+ export { dereference } from "./util.mjs";
14
+ export { cloneShallow, cloneDeep } from "./clone/index.mjs";
15
+ export { default as CloneError } from "./clone/errors/CloneError.mjs";
16
+ export { default as DeepCloneError } from "./clone/errors/DeepCloneError.mjs";
17
+ export { default as ShallowCloneError } from "./clone/errors/ShallowCloneError.mjs";
18
+ /**
19
+ * Transforms data to an Element from a particular namespace.
20
+ */
21
+ export { default as from } from "./transformers/from.mjs";
22
+ /**
23
+ * Transforms the ApiDOM into JavaScript POJO.
24
+ * This POJO would be the result of interpreting the ApiDOM
25
+ * into JavaScript structure.
26
+ */
27
+ export { default as toValue } from "./transformers/serializers/value/index.mjs";
28
+ /**
29
+ * Transforms the ApiDOM into JSON string.
30
+ */
31
+ export { default as toJSON } from "./transformers/serializers/json.mjs";
32
+ /**
33
+ * Transforms the ApiDOM into YAML string.
34
+ */
35
+ export { default as toYAML } from "./transformers/serializers/yaml-1-2.mjs";
36
+ /**
37
+ * Creates a refract representation of an Element.
38
+ * https://github.com/refractproject/refract-spec
39
+ */
40
+ export { default as dehydrate } from "./transformers/dehydrate.mjs";
41
+ /**
42
+ * Create a refracted string representation of an Element.
43
+ */
44
+ export { default as toString } from "./transformers/to-string.mjs";
45
+ export { default as sexprs } from "./transformers/sexprs.mjs";
46
+ export { default as deepmerge } from "./deepmerge.mjs";
@@ -1,10 +1,7 @@
1
- import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
2
1
  import { NotImplementedError } from '@swagger-api/apidom-error';
3
2
  class MediaTypes extends Array {
4
- constructor(...args) {
5
- super(...args);
6
- _defineProperty(this, "unknownMediaType", 'application/octet-stream');
7
- }
3
+ unknownMediaType = 'application/octet-stream';
4
+
8
5
  // eslint-disable-next-line class-methods-use-this
9
6
  filterByFormat() {
10
7
  throw new NotImplementedError('"filterByFormat" method is not implemented.');
@@ -1,9 +1,9 @@
1
1
  import { Namespace as MinimNamespace } from 'minim';
2
2
  import { isPlainObject } from 'ramda-adjunct';
3
- import AnnotationElement from "./elements/Annotation.js";
4
- import CommentElement from "./elements/Comment.js";
5
- import ParseResultElement from "./elements/ParseResult.js";
6
- import SourceMapElement from "./elements/SourceMap.js";
3
+ import AnnotationElement from "./elements/Annotation.mjs";
4
+ import CommentElement from "./elements/Comment.mjs";
5
+ import ParseResultElement from "./elements/ParseResult.mjs";
6
+ import SourceMapElement from "./elements/SourceMap.mjs";
7
7
  export class Namespace extends MinimNamespace {
8
8
  constructor() {
9
9
  super();
@@ -1,11 +1,11 @@
1
1
  import { Element, StringElement, NumberElement, NullElement, BooleanElement, ArrayElement, ObjectElement, MemberElement, LinkElement, RefElement } from 'minim';
2
2
  import { all } from 'ramda';
3
3
  import { included } from 'ramda-adjunct';
4
- import AnnotationElement from "../elements/Annotation.js";
5
- import CommentElement from "../elements/Comment.js";
6
- import ParserResultElement from "../elements/ParseResult.js";
7
- import SourceMapElement from "../elements/SourceMap.js";
8
- import createPredicate, { isElementType as isElementTypeHelper } from "./helpers.js";
4
+ import AnnotationElement from "../elements/Annotation.mjs";
5
+ import CommentElement from "../elements/Comment.mjs";
6
+ import ParserResultElement from "../elements/ParseResult.mjs";
7
+ import SourceMapElement from "../elements/SourceMap.mjs";
8
+ import createPredicate, { isElementType as isElementTypeHelper } from "./helpers.mjs";
9
9
  export const isElement = createPredicate(({
10
10
  hasBasicElementProps,
11
11
  primitiveEq
@@ -0,0 +1,30 @@
1
+ import { dispatchPlugins } from "./plugins/utils/index.mjs";
2
+ import { getNodeType } from "../traversal/visitor.mjs";
3
+ import createToolbox from "./toolbox.mjs";
4
+ const refract = (value, {
5
+ Type,
6
+ plugins = []
7
+ }) => {
8
+ /**
9
+ * This is where values gets refracted into generic ApiDOM.
10
+ * We don't allow consumers to hook into this translation.
11
+ * Though we allow consumers to define their onw plugins on already transformed ApiDOM.
12
+ */
13
+ const element = new Type(value);
14
+
15
+ /**
16
+ * Run plugins only when necessary.
17
+ * Running plugins visitors means extra single traversal === performance hit.
18
+ */
19
+ return dispatchPlugins(element, plugins, {
20
+ toolboxCreator: createToolbox,
21
+ visitorOptions: {
22
+ nodeTypeGetter: getNodeType
23
+ }
24
+ });
25
+ };
26
+ export const createRefractor = Type => (value, options = {}) => refract(value, {
27
+ ...options,
28
+ Type
29
+ });
30
+ export default refract;
@@ -1,7 +1,7 @@
1
1
  import { propOr } from 'ramda';
2
2
  import { invokeArgs } from 'ramda-adjunct';
3
- import createToolbox from "../../toolbox.js";
4
- import { getNodeType, mergeAllVisitors, visit } from "../../../traversal/visitor.js"; // eslint-disable-next-line import/prefer-default-export
3
+ import createToolbox from "../../toolbox.mjs";
4
+ import { getNodeType, mergeAllVisitors, visit } from "../../../traversal/visitor.mjs"; // eslint-disable-next-line import/prefer-default-export
5
5
  export const dispatchPlugins = (element, plugins, options = {}) => {
6
6
  if (plugins.length === 0) return element;
7
7
  const toolboxCreator = propOr(createToolbox, 'toolboxCreator', options);
@@ -1,9 +1,9 @@
1
1
  import { ObjectElement, ArrayElement, StringElement, BooleanElement, NullElement, NumberElement, LinkElement, RefElement } from 'minim';
2
- import AnnotationElement from "../elements/Annotation.js";
3
- import CommentElement from "../elements/Comment.js";
4
- import ParseResultElement from "../elements/ParseResult.js";
5
- import SourceMapElement from "../elements/SourceMap.js";
6
- import { createRefractor } from "./index.js";
2
+ import AnnotationElement from "../elements/Annotation.mjs";
3
+ import CommentElement from "../elements/Comment.mjs";
4
+ import ParseResultElement from "../elements/ParseResult.mjs";
5
+ import SourceMapElement from "../elements/SourceMap.mjs";
6
+ import { createRefractor } from "./index.mjs";
7
7
  ObjectElement.refract = createRefractor(ObjectElement);
8
8
  ArrayElement.refract = createRefractor(ArrayElement);
9
9
  StringElement.refract = createRefractor(StringElement);
@@ -0,0 +1,12 @@
1
+ import * as basePredicates from "../predicates/index.mjs";
2
+ import defaultNamespaceInstance from "../namespace.mjs";
3
+ const createToolbox = () => {
4
+ const predicates = {
5
+ ...basePredicates
6
+ };
7
+ return {
8
+ predicates,
9
+ namespace: defaultNamespaceInstance
10
+ };
11
+ };
12
+ export default createToolbox;
@@ -1,6 +1,6 @@
1
1
  import stampit from 'stampit';
2
2
  import { isUndefined } from 'ramda-adjunct';
3
- import { isObjectElement, isArrayElement, isMemberElement } from "../predicates/index.js";
3
+ import { isObjectElement, isArrayElement, isMemberElement } from "../predicates/index.mjs";
4
4
  const computeEdges = (element, edges = new WeakMap()) => {
5
5
  if (isMemberElement(element)) {
6
6
  // @ts-ignore
@@ -1,4 +1,4 @@
1
- import Transcluder from "./Transcluder.js";
1
+ import Transcluder from "./Transcluder.mjs";
2
2
  /**
3
3
  * This is a mutating function. If you don't want your Element to be mutated,
4
4
  * clone in before passing it to this function.
@@ -0,0 +1,9 @@
1
+ import defaultNamespaceInstance from "../namespace.mjs";
2
+ /**
3
+ * Creates a refract representation of an Element.
4
+ * https://github.com/refractproject/refract-spec
5
+ */
6
+ const dehydrate = (element, namespace = defaultNamespaceInstance) => {
7
+ return namespace.toRefract(element);
8
+ };
9
+ export default dehydrate;
@@ -0,0 +1,22 @@
1
+ import { has } from 'ramda';
2
+ import { isPlainObject, isString } from 'ramda-adjunct';
3
+ import defaultNamespaceInstance from "../namespace.mjs";
4
+ /**
5
+ * Transforms data to an Element from a particular namespace.
6
+ */
7
+ const from = (data, namespace = defaultNamespaceInstance) => {
8
+ if (isString(data)) {
9
+ // JSON serialized refract
10
+ try {
11
+ return namespace.fromRefract(JSON.parse(data));
12
+ } catch {
13
+ // noop
14
+ }
15
+ }
16
+ if (isPlainObject(data) && has('element', data)) {
17
+ // refract javascript structure
18
+ return namespace.fromRefract(data);
19
+ }
20
+ return namespace.toElement(data);
21
+ };
22
+ export default from;
@@ -1,3 +1,3 @@
1
- import serializeValue from "./value/index.js";
1
+ import serializeValue from "./value/index.mjs";
2
2
  const serializer = (element, replacer, space) => JSON.stringify(serializeValue(element), replacer, space);
3
3
  export default serializer;
@@ -0,0 +1,17 @@
1
+ class EphemeralArray {
2
+ type = 'EphemeralArray';
3
+ content = [];
4
+ reference = undefined;
5
+ constructor(content) {
6
+ this.content = content;
7
+ this.reference = [];
8
+ }
9
+ toReference() {
10
+ return this.reference;
11
+ }
12
+ toArray() {
13
+ this.reference.push(...this.content);
14
+ return this.reference;
15
+ }
16
+ }
17
+ export default EphemeralArray;
@@ -0,0 +1,16 @@
1
+ class EphemeralObject {
2
+ type = 'EphemeralObject';
3
+ content = [];
4
+ reference = undefined;
5
+ constructor(content) {
6
+ this.content = content;
7
+ this.reference = {};
8
+ }
9
+ toReference() {
10
+ return this.reference;
11
+ }
12
+ toObject() {
13
+ return Object.assign(this.reference, Object.fromEntries(this.content));
14
+ }
15
+ }
16
+ export default EphemeralObject;
@@ -1,7 +1,8 @@
1
1
  import stampit from 'stampit';
2
- import { visit } from "./visitor.js";
3
- import EphemeralArray from "./ast/ephemeral-array.js";
4
- import EphemeralObject from "./ast/ephemeral-object.js";
2
+ import { visit } from "./visitor.mjs";
3
+ import EphemeralArray from "./ast/ephemeral-array.mjs";
4
+ import EphemeralObject from "./ast/ephemeral-object.mjs";
5
+ import { isElement, isBooleanElement, isNumberElement, isStringElement, isNullElement } from "../../../predicates/index.mjs";
5
6
  /* eslint-disable @typescript-eslint/naming-convention */
6
7
  const Visitor = stampit.init(function _Visitor() {
7
8
  const references = new WeakMap();
@@ -56,6 +57,12 @@ const Visitor = stampit.init(function _Visitor() {
56
57
  /* eslint-enable */
57
58
 
58
59
  const serializer = element => {
60
+ if (!isElement(element)) return element;
61
+
62
+ // shortcut optimization for certain element types
63
+ if (isStringElement(element) || isNumberElement(element) || isBooleanElement(element) || isNullElement(element)) {
64
+ return element.toValue();
65
+ }
59
66
  return visit(element, Visitor());
60
67
  };
61
68
  export default serializer;
@@ -0,0 +1,49 @@
1
+ import { T as stubTrue } from 'ramda';
2
+ import { visit as astVisit, keyMapDefault as baseKeyMap, getNodeType as baseGetNodeType } from "../../../traversal/visitor.mjs";
3
+ const nodeTypeGetter = node => {
4
+ if (typeof (node === null || node === void 0 ? void 0 : node.type) === 'string') {
5
+ return node.type;
6
+ }
7
+ return baseGetNodeType(node);
8
+ };
9
+ const keyMapDefault = {
10
+ EphemeralObject: ['content'],
11
+ EphemeralArray: ['content'],
12
+ ...baseKeyMap
13
+ };
14
+
15
+ // eslint-disable-next-line import/prefer-default-export
16
+ export const visit = (root,
17
+ // @ts-ignore
18
+ visitor, {
19
+ keyMap = keyMapDefault,
20
+ ...rest
21
+ } = {}) => {
22
+ return astVisit(root, visitor, {
23
+ keyMap,
24
+ // @ts-ignore
25
+ nodeTypeGetter,
26
+ nodePredicate: stubTrue,
27
+ detectCycles: false,
28
+ deleteNodeSymbol: Symbol.for('delete-node'),
29
+ skipVisitingNodeSymbol: Symbol.for('skip-visiting-node'),
30
+ ...rest
31
+ });
32
+ };
33
+
34
+ // @ts-ignore
35
+ visit[Symbol.for('nodejs.util.promisify.custom')] = async (root, {
36
+ keyMap = keyMapDefault,
37
+ ...rest
38
+ } = {}) => {
39
+ // @ts-ignore
40
+ return astVisit[Symbol.for('nodejs.util.promisify.custom')](root, visitor, {
41
+ keyMap,
42
+ nodeTypeGetter,
43
+ nodePredicate: stubTrue,
44
+ detectCycles: false,
45
+ deleteNodeSymbol: Symbol.for('delete-node'),
46
+ skipVisitingNodeSymbol: Symbol.for('skip-visiting-node'),
47
+ ...rest
48
+ });
49
+ };
@@ -1,6 +1,6 @@
1
1
  import stampit from 'stampit';
2
- import { visit } from "../traversal/visitor.js";
3
- import serializeValue from "./value/index.js";
2
+ import { visit } from "../../traversal/visitor.mjs";
3
+ import serializeValue from "./value/index.mjs";
4
4
  const YamlVisitor = stampit({
5
5
  props: {
6
6
  result: '',
@@ -1,5 +1,5 @@
1
1
  import stampit from 'stampit';
2
- import { visit } from "./traversal/visitor.js";
2
+ import { visit } from "../traversal/visitor.mjs";
3
3
  const SymbolicExpressionsVisitor = stampit({
4
4
  props: {
5
5
  nestingLevel: 0,
@@ -0,0 +1,10 @@
1
+ import defaultNamespaceInstance from "../namespace.mjs";
2
+ import dehydrate from "./dehydrate.mjs";
3
+ /**
4
+ * Create a refracted string representation of an Element.
5
+ */
6
+ const toString = (element, namespace = defaultNamespaceInstance) => {
7
+ const refractStructure = dehydrate(element, namespace);
8
+ return JSON.stringify(refractStructure);
9
+ };
10
+ export default toString;
@@ -1,5 +1,5 @@
1
1
  import { ArraySlice } from 'minim';
2
- import { PredicateVisitor, visit } from "./visitor.js"; // finds all elements matching the predicate
2
+ import { PredicateVisitor, visit } from "./visitor.mjs"; // finds all elements matching the predicate
3
3
  const filter = (predicate, element) => {
4
4
  const visitor = PredicateVisitor({
5
5
  predicate
@@ -1,5 +1,5 @@
1
1
  import { pathOr } from 'ramda';
2
- import { PredicateVisitor, BREAK, visit } from "./visitor.js"; // find first element that satisfies the provided predicate
2
+ import { PredicateVisitor, BREAK, visit } from "./visitor.mjs"; // find first element that satisfies the provided predicate
3
3
  const find = (predicate, element) => {
4
4
  const visitor = PredicateVisitor({
5
5
  predicate,
@@ -1,8 +1,9 @@
1
1
  import stampit from 'stampit';
2
2
  import { last, pathOr } from 'ramda';
3
3
  import { isNumber } from 'ramda-adjunct';
4
- import { hasElementSourceMap } from "../predicates/index.js";
5
- import { visit } from "./visitor.js";
4
+ import { hasElementSourceMap } from "../predicates/index.mjs";
5
+ import { visit } from "./visitor.mjs";
6
+ import toValue from "../transformers/serializers/value/index.mjs";
6
7
  const Visitor = stampit({
7
8
  props: {
8
9
  result: [],
@@ -25,8 +26,8 @@ const Visitor = stampit({
25
26
  }
26
27
 
27
28
  const sourceMapElement = element.getMetaProperty('sourceMap');
28
- const charStart = sourceMapElement.positionStart.get(2).toValue();
29
- const charEnd = sourceMapElement.positionEnd.get(2).toValue();
29
+ const charStart = toValue(sourceMapElement.positionStart.get(2));
30
+ const charEnd = toValue(sourceMapElement.positionEnd.get(2));
30
31
  const isWithinOffsetRange = this.offset >= charStart && (this.offset < charEnd || this.includeRightBound && this.offset <= charEnd);
31
32
  if (isWithinOffsetRange) {
32
33
  this.result.push(element);
@@ -0,0 +1,7 @@
1
+ export { default as filter } from "./filter.mjs";
2
+ export { default as find } from "./find.mjs";
3
+ export { default as findAtOffset } from "./findAtOffset.mjs";
4
+ export { default as reject } from "./reject.mjs";
5
+ export { default as some } from "./some.mjs";
6
+ export { default as traverse } from "./traverse.mjs";
7
+ export { default as parents } from "./parents.mjs";
@@ -1,5 +1,5 @@
1
1
  import stampit from 'stampit';
2
- import { visit } from "./visitor.js";
2
+ import { visit } from "./visitor.mjs";
3
3
  /* eslint-disable no-param-reassign */
4
4
  const Visitor = stampit({
5
5
  props: {
@@ -1,5 +1,5 @@
1
1
  import { complement } from 'ramda';
2
- import filter from "./filter.js"; // complement of filter
2
+ import filter from "./filter.mjs"; // complement of filter
3
3
  const reject = (predicate, element) => {
4
4
  return filter(complement(predicate), element);
5
5
  };
@@ -1,5 +1,5 @@
1
1
  import { isNotUndefined } from 'ramda-adjunct';
2
- import find from "./find.js"; // tests whether at least one element passes the predicate
2
+ import find from "./find.mjs"; // tests whether at least one element passes the predicate
3
3
  const some = (predicate, element) => {
4
4
  return isNotUndefined(find(predicate, element));
5
5
  };
@@ -1,8 +1,8 @@
1
1
  import stampit from 'stampit';
2
2
  import { pathOr } from 'ramda';
3
3
  import { isFunction, noop } from 'ramda-adjunct';
4
- import { visit, PredicateVisitor } from "./visitor.js";
5
- import { isElement } from "../predicates/index.js";
4
+ import { visit, PredicateVisitor } from "./visitor.mjs";
5
+ import { isElement } from "../predicates/index.mjs";
6
6
  export const CallbackVisitor = stampit(PredicateVisitor, {
7
7
  props: {
8
8
  callback: noop