@speclynx/apidom-core 4.0.1 → 4.0.3
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 +10 -0
- package/package.json +6 -7
- package/src/fields/fixed-fields.cjs +47 -0
- package/src/fields/fixed-fields.mjs +43 -0
- package/src/fields/fixed-fields.ts +61 -0
- package/src/fields/index.cjs +8 -0
- package/src/fields/index.mjs +1 -0
- package/src/fields/index.ts +2 -0
- package/src/identity/errors/ElementIdentityError.cjs +22 -0
- package/src/identity/errors/ElementIdentityError.mjs +19 -0
- package/src/identity/errors/ElementIdentityError.ts +26 -0
- package/src/identity/index.cjs +64 -0
- package/src/identity/index.mjs +58 -0
- package/src/identity/index.ts +64 -0
- package/src/index.cjs +48 -0
- package/src/index.mjs +41 -0
- package/src/index.ts +81 -0
- package/src/media-types.cjs +21 -0
- package/src/media-types.mjs +18 -0
- package/src/media-types.ts +24 -0
- package/src/merge/deepmerge.cjs +165 -0
- package/src/merge/deepmerge.mjs +149 -0
- package/src/merge/deepmerge.ts +274 -0
- package/src/merge/merge-left.cjs +16 -0
- package/src/merge/merge-left.mjs +11 -0
- package/src/merge/merge-left.ts +14 -0
- package/src/merge/merge-right.cjs +35 -0
- package/src/merge/merge-right.mjs +29 -0
- package/src/merge/merge-right.ts +42 -0
- package/src/namespace.cjs +10 -0
- package/src/namespace.mjs +7 -0
- package/src/namespace.ts +8 -0
- package/src/refractor/plugins/dispatcher/index.cjs +64 -0
- package/src/refractor/plugins/dispatcher/index.mjs +54 -0
- package/src/refractor/plugins/dispatcher/index.ts +102 -0
- package/src/refractor/plugins/element-identity.cjs +31 -0
- package/src/refractor/plugins/element-identity.mjs +26 -0
- package/src/refractor/plugins/element-identity.ts +31 -0
- package/src/refractor/plugins/semantic-element-identity.cjs +33 -0
- package/src/refractor/plugins/semantic-element-identity.mjs +29 -0
- package/src/refractor/plugins/semantic-element-identity.ts +32 -0
- package/src/refractor/toolbox.cjs +47 -0
- package/src/refractor/toolbox.mjs +41 -0
- package/src/refractor/toolbox.ts +88 -0
- package/src/specification.cjs +63 -0
- package/src/specification.mjs +59 -0
- package/src/specification.ts +68 -0
- package/src/transcluder/Transcluder.cjs +111 -0
- package/src/transcluder/Transcluder.mjs +107 -0
- package/src/transcluder/Transcluder.ts +147 -0
- package/src/transcluder/index.cjs +19 -0
- package/src/transcluder/index.mjs +13 -0
- package/src/transcluder/index.ts +15 -0
- package/src/transformers/dehydrate.cjs +15 -0
- package/src/transformers/dehydrate.mjs +10 -0
- package/src/transformers/dehydrate.ts +14 -0
- package/src/transformers/from.cjs +34 -0
- package/src/transformers/from.mjs +29 -0
- package/src/transformers/from.ts +34 -0
- package/src/transformers/serializers/json.cjs +75 -0
- package/src/transformers/serializers/json.mjs +70 -0
- package/src/transformers/serializers/json.ts +107 -0
- package/src/transformers/serializers/value.cjs +50 -0
- package/src/transformers/serializers/value.mjs +47 -0
- package/src/transformers/serializers/value.ts +70 -0
- package/src/transformers/serializers/yaml-1-2.cjs +142 -0
- package/src/transformers/serializers/yaml-1-2.mjs +137 -0
- package/src/transformers/serializers/yaml-1-2.ts +205 -0
- package/src/transformers/sexprs.cjs +31 -0
- package/src/transformers/sexprs.mjs +28 -0
- package/src/transformers/sexprs.ts +30 -0
- package/src/transformers/to-string.cjs +16 -0
- package/src/transformers/to-string.mjs +11 -0
- package/src/transformers/to-string.ts +15 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _namespace = _interopRequireDefault(require("../namespace.cjs"));
|
|
7
|
+
/**
|
|
8
|
+
* Creates a refract representation of an Element.
|
|
9
|
+
* https://github.com/refractproject/refract-spec
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
const dehydrate = (element, namespace = _namespace.default) => {
|
|
13
|
+
return namespace.toRefract(element);
|
|
14
|
+
};
|
|
15
|
+
var _default = exports.default = dehydrate;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import defaultNamespaceInstance from "../namespace.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a refract representation of an Element.
|
|
4
|
+
* https://github.com/refractproject/refract-spec
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
const dehydrate = (element, namespace = defaultNamespaceInstance) => {
|
|
8
|
+
return namespace.toRefract(element);
|
|
9
|
+
};
|
|
10
|
+
export default dehydrate;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Element, Namespace } from '@speclynx/apidom-datamodel';
|
|
2
|
+
|
|
3
|
+
import defaultNamespaceInstance from '../namespace.ts';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates a refract representation of an Element.
|
|
7
|
+
* https://github.com/refractproject/refract-spec
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
const dehydrate = (element: Element, namespace: Namespace = defaultNamespaceInstance): unknown => {
|
|
11
|
+
return namespace.toRefract(element);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default dehydrate;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _ramda = require("ramda");
|
|
7
|
+
var _ramdaAdjunct = require("ramda-adjunct");
|
|
8
|
+
var _namespace = _interopRequireDefault(require("../namespace.cjs"));
|
|
9
|
+
/**
|
|
10
|
+
* Transforms data to an Element from a particular namespace.
|
|
11
|
+
*
|
|
12
|
+
* The name of the function was originally `from`,
|
|
13
|
+
* but it was renamed to `fromFn` to avoid issues with Parcel.js:
|
|
14
|
+
*
|
|
15
|
+
* - https://github.com/parcel-bundler/parcel/issues/9473
|
|
16
|
+
* - https://github.com/swagger-api/swagger-ui/issues/9466#issuecomment-1881053410
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
const fromFn = (data, namespace = _namespace.default) => {
|
|
20
|
+
if ((0, _ramdaAdjunct.isString)(data)) {
|
|
21
|
+
// JSON serialized refract
|
|
22
|
+
try {
|
|
23
|
+
return namespace.fromRefract(JSON.parse(data));
|
|
24
|
+
} catch {
|
|
25
|
+
// noop
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if ((0, _ramdaAdjunct.isPlainObject)(data) && (0, _ramda.has)('element', data)) {
|
|
29
|
+
// refract javascript structure
|
|
30
|
+
return namespace.fromRefract(data);
|
|
31
|
+
}
|
|
32
|
+
return namespace.toElement(data);
|
|
33
|
+
};
|
|
34
|
+
var _default = exports.default = fromFn;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { has } from 'ramda';
|
|
2
|
+
import { isPlainObject, isString } from 'ramda-adjunct';
|
|
3
|
+
import defaultNamespace from "../namespace.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Transforms data to an Element from a particular namespace.
|
|
6
|
+
*
|
|
7
|
+
* The name of the function was originally `from`,
|
|
8
|
+
* but it was renamed to `fromFn` to avoid issues with Parcel.js:
|
|
9
|
+
*
|
|
10
|
+
* - https://github.com/parcel-bundler/parcel/issues/9473
|
|
11
|
+
* - https://github.com/swagger-api/swagger-ui/issues/9466#issuecomment-1881053410
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
const fromFn = (data, namespace = defaultNamespace) => {
|
|
15
|
+
if (isString(data)) {
|
|
16
|
+
// JSON serialized refract
|
|
17
|
+
try {
|
|
18
|
+
return namespace.fromRefract(JSON.parse(data));
|
|
19
|
+
} catch {
|
|
20
|
+
// noop
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (isPlainObject(data) && has('element', data)) {
|
|
24
|
+
// refract javascript structure
|
|
25
|
+
return namespace.fromRefract(data);
|
|
26
|
+
}
|
|
27
|
+
return namespace.toElement(data);
|
|
28
|
+
};
|
|
29
|
+
export default fromFn;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { has } from 'ramda';
|
|
2
|
+
import { isPlainObject, isString } from 'ramda-adjunct';
|
|
3
|
+
import { Element, Namespace } from '@speclynx/apidom-datamodel';
|
|
4
|
+
|
|
5
|
+
import defaultNamespace from '../namespace.ts';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Transforms data to an Element from a particular namespace.
|
|
9
|
+
*
|
|
10
|
+
* The name of the function was originally `from`,
|
|
11
|
+
* but it was renamed to `fromFn` to avoid issues with Parcel.js:
|
|
12
|
+
*
|
|
13
|
+
* - https://github.com/parcel-bundler/parcel/issues/9473
|
|
14
|
+
* - https://github.com/swagger-api/swagger-ui/issues/9466#issuecomment-1881053410
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
const fromFn = (data: unknown, namespace: Namespace = defaultNamespace): Element | undefined => {
|
|
18
|
+
if (isString(data)) {
|
|
19
|
+
// JSON serialized refract
|
|
20
|
+
try {
|
|
21
|
+
return namespace.fromRefract(JSON.parse(data));
|
|
22
|
+
} catch {
|
|
23
|
+
// noop
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (isPlainObject(data) && has('element', data)) {
|
|
27
|
+
// refract javascript structure
|
|
28
|
+
return namespace.fromRefract(data);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return namespace.toElement(data);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export default fromFn;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
7
|
+
var _value = _interopRequireDefault(require("./value.cjs"));
|
|
8
|
+
const getStyle = element => {
|
|
9
|
+
return element.style?.json ?? {};
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Builds a POJO from an ApiDOM element tree. Numbers with rawContent
|
|
18
|
+
* are replaced with sentinel strings; all other values go through toValue().
|
|
19
|
+
*/
|
|
20
|
+
const toPojo = (element, sentinels) => {
|
|
21
|
+
const visited = new WeakSet();
|
|
22
|
+
const convert = node => {
|
|
23
|
+
if (!(0, _apidomDatamodel.isElement)(node)) return node;
|
|
24
|
+
if (visited.has(node)) return null;
|
|
25
|
+
visited.add(node);
|
|
26
|
+
if ((0, _apidomDatamodel.isObjectElement)(node)) {
|
|
27
|
+
const obj = {};
|
|
28
|
+
node.forEach((value, key) => {
|
|
29
|
+
const k = (0, _apidomDatamodel.isElement)(key) ? (0, _value.default)(key) : key;
|
|
30
|
+
if (typeof k === 'string') obj[k] = convert(value);
|
|
31
|
+
});
|
|
32
|
+
return obj;
|
|
33
|
+
}
|
|
34
|
+
if ((0, _apidomDatamodel.isArrayElement)(node)) {
|
|
35
|
+
const arr = [];
|
|
36
|
+
node.forEach(item => arr.push(convert(item)));
|
|
37
|
+
return arr;
|
|
38
|
+
}
|
|
39
|
+
if ((0, _apidomDatamodel.isRefElement)(node)) return String((0, _value.default)(node));
|
|
40
|
+
if ((0, _apidomDatamodel.isLinkElement)(node)) return (0, _apidomDatamodel.isStringElement)(node.href) ? (0, _value.default)(node.href) : '';
|
|
41
|
+
|
|
42
|
+
// number with rawContent — substitute with sentinel
|
|
43
|
+
if ((0, _apidomDatamodel.isNumberElement)(node)) {
|
|
44
|
+
const style = getStyle(node);
|
|
45
|
+
if (typeof style.rawContent === 'string') {
|
|
46
|
+
const sentinel = `\0RAW${sentinels.size}\0`;
|
|
47
|
+
sentinels.set(sentinel, style.rawContent);
|
|
48
|
+
return sentinel;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return (0, _value.default)(node);
|
|
52
|
+
};
|
|
53
|
+
return convert(element);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @public
|
|
58
|
+
*/
|
|
59
|
+
const serializer = (element, replacer, space, options) => {
|
|
60
|
+
if (options?.preserveStyle) {
|
|
61
|
+
const style = getStyle(element);
|
|
62
|
+
const indent = typeof space === 'number' ? space : typeof style.indent === 'number' ? style.indent : 0;
|
|
63
|
+
const sentinels = new Map();
|
|
64
|
+
const pojo = toPojo(element, sentinels);
|
|
65
|
+
let serialized = JSON.stringify(pojo, null, indent);
|
|
66
|
+
|
|
67
|
+
// replace quoted sentinels with raw number representations
|
|
68
|
+
for (const [sentinel, raw] of sentinels) {
|
|
69
|
+
serialized = serialized.replace(JSON.stringify(sentinel), raw);
|
|
70
|
+
}
|
|
71
|
+
return serialized;
|
|
72
|
+
}
|
|
73
|
+
return JSON.stringify((0, _value.default)(element), replacer, space);
|
|
74
|
+
};
|
|
75
|
+
var _default = exports.default = serializer;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { isElement, isObjectElement, isArrayElement, isRefElement, isLinkElement, isStringElement, isNumberElement } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import toValue from "./value.mjs";
|
|
3
|
+
const getStyle = element => {
|
|
4
|
+
return element.style?.json ?? {};
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Builds a POJO from an ApiDOM element tree. Numbers with rawContent
|
|
13
|
+
* are replaced with sentinel strings; all other values go through toValue().
|
|
14
|
+
*/
|
|
15
|
+
const toPojo = (element, sentinels) => {
|
|
16
|
+
const visited = new WeakSet();
|
|
17
|
+
const convert = node => {
|
|
18
|
+
if (!isElement(node)) return node;
|
|
19
|
+
if (visited.has(node)) return null;
|
|
20
|
+
visited.add(node);
|
|
21
|
+
if (isObjectElement(node)) {
|
|
22
|
+
const obj = {};
|
|
23
|
+
node.forEach((value, key) => {
|
|
24
|
+
const k = isElement(key) ? toValue(key) : key;
|
|
25
|
+
if (typeof k === 'string') obj[k] = convert(value);
|
|
26
|
+
});
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
if (isArrayElement(node)) {
|
|
30
|
+
const arr = [];
|
|
31
|
+
node.forEach(item => arr.push(convert(item)));
|
|
32
|
+
return arr;
|
|
33
|
+
}
|
|
34
|
+
if (isRefElement(node)) return String(toValue(node));
|
|
35
|
+
if (isLinkElement(node)) return isStringElement(node.href) ? toValue(node.href) : '';
|
|
36
|
+
|
|
37
|
+
// number with rawContent — substitute with sentinel
|
|
38
|
+
if (isNumberElement(node)) {
|
|
39
|
+
const style = getStyle(node);
|
|
40
|
+
if (typeof style.rawContent === 'string') {
|
|
41
|
+
const sentinel = `\0RAW${sentinels.size}\0`;
|
|
42
|
+
sentinels.set(sentinel, style.rawContent);
|
|
43
|
+
return sentinel;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return toValue(node);
|
|
47
|
+
};
|
|
48
|
+
return convert(element);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @public
|
|
53
|
+
*/
|
|
54
|
+
const serializer = (element, replacer, space, options) => {
|
|
55
|
+
if (options?.preserveStyle) {
|
|
56
|
+
const style = getStyle(element);
|
|
57
|
+
const indent = typeof space === 'number' ? space : typeof style.indent === 'number' ? style.indent : 0;
|
|
58
|
+
const sentinels = new Map();
|
|
59
|
+
const pojo = toPojo(element, sentinels);
|
|
60
|
+
let serialized = JSON.stringify(pojo, null, indent);
|
|
61
|
+
|
|
62
|
+
// replace quoted sentinels with raw number representations
|
|
63
|
+
for (const [sentinel, raw] of sentinels) {
|
|
64
|
+
serialized = serialized.replace(JSON.stringify(sentinel), raw);
|
|
65
|
+
}
|
|
66
|
+
return serialized;
|
|
67
|
+
}
|
|
68
|
+
return JSON.stringify(toValue(element), replacer, space);
|
|
69
|
+
};
|
|
70
|
+
export default serializer;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Element,
|
|
3
|
+
isElement,
|
|
4
|
+
isObjectElement,
|
|
5
|
+
isArrayElement,
|
|
6
|
+
isRefElement,
|
|
7
|
+
isLinkElement,
|
|
8
|
+
isStringElement,
|
|
9
|
+
isNumberElement,
|
|
10
|
+
} from '@speclynx/apidom-datamodel';
|
|
11
|
+
|
|
12
|
+
import toValue from './value.ts';
|
|
13
|
+
|
|
14
|
+
interface JSONElementStyle {
|
|
15
|
+
indent?: number;
|
|
16
|
+
rawContent?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const getStyle = (element: Element): JSONElementStyle => {
|
|
20
|
+
return (element.style?.json ?? {}) as JSONElementStyle;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export interface JSONSerializerOptions {
|
|
27
|
+
/** Preserve original formatting styles from `element.style.json` */
|
|
28
|
+
preserveStyle?: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Builds a POJO from an ApiDOM element tree. Numbers with rawContent
|
|
33
|
+
* are replaced with sentinel strings; all other values go through toValue().
|
|
34
|
+
*/
|
|
35
|
+
const toPojo = (element: Element, sentinels: Map<string, string>): unknown => {
|
|
36
|
+
const visited = new WeakSet<object>();
|
|
37
|
+
|
|
38
|
+
const convert = (node: unknown): unknown => {
|
|
39
|
+
if (!isElement(node)) return node;
|
|
40
|
+
|
|
41
|
+
if (visited.has(node as object)) return null;
|
|
42
|
+
visited.add(node as object);
|
|
43
|
+
|
|
44
|
+
if (isObjectElement(node)) {
|
|
45
|
+
const obj: Record<string, unknown> = {};
|
|
46
|
+
node.forEach((value, key) => {
|
|
47
|
+
const k = isElement(key) ? toValue(key) : key;
|
|
48
|
+
if (typeof k === 'string') obj[k] = convert(value);
|
|
49
|
+
});
|
|
50
|
+
return obj;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (isArrayElement(node)) {
|
|
54
|
+
const arr: unknown[] = [];
|
|
55
|
+
node.forEach((item) => arr.push(convert(item)));
|
|
56
|
+
return arr;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (isRefElement(node)) return String(toValue(node));
|
|
60
|
+
if (isLinkElement(node)) return isStringElement(node.href) ? toValue(node.href) : '';
|
|
61
|
+
|
|
62
|
+
// number with rawContent — substitute with sentinel
|
|
63
|
+
if (isNumberElement(node)) {
|
|
64
|
+
const style = getStyle(node);
|
|
65
|
+
if (typeof style.rawContent === 'string') {
|
|
66
|
+
const sentinel = `\0RAW${sentinels.size}\0`;
|
|
67
|
+
sentinels.set(sentinel, style.rawContent);
|
|
68
|
+
return sentinel;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return toValue(node);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
return convert(element);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @public
|
|
80
|
+
*/
|
|
81
|
+
const serializer = (
|
|
82
|
+
element: Element,
|
|
83
|
+
replacer?: (this: unknown, key: string, value: unknown) => unknown,
|
|
84
|
+
space?: string | number,
|
|
85
|
+
options?: JSONSerializerOptions,
|
|
86
|
+
): string => {
|
|
87
|
+
if (options?.preserveStyle) {
|
|
88
|
+
const style = getStyle(element);
|
|
89
|
+
const indent =
|
|
90
|
+
typeof space === 'number' ? space : typeof style.indent === 'number' ? style.indent : 0;
|
|
91
|
+
|
|
92
|
+
const sentinels = new Map<string, string>();
|
|
93
|
+
const pojo = toPojo(element, sentinels);
|
|
94
|
+
let serialized = JSON.stringify(pojo, null, indent);
|
|
95
|
+
|
|
96
|
+
// replace quoted sentinels with raw number representations
|
|
97
|
+
for (const [sentinel, raw] of sentinels) {
|
|
98
|
+
serialized = serialized.replace(JSON.stringify(sentinel), raw);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return serialized;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return JSON.stringify(toValue(element), replacer, space);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export default serializer;
|
|
@@ -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;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Element,
|
|
3
|
+
isElement,
|
|
4
|
+
isObjectElement,
|
|
5
|
+
isArrayElement,
|
|
6
|
+
isRefElement,
|
|
7
|
+
isLinkElement,
|
|
8
|
+
isStringElement,
|
|
9
|
+
isBooleanElement,
|
|
10
|
+
isNumberElement,
|
|
11
|
+
isNullElement,
|
|
12
|
+
} from '@speclynx/apidom-datamodel';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Transforms the ApiDOM into JavaScript POJO.
|
|
16
|
+
* This POJO would be the result of interpreting the ApiDOM
|
|
17
|
+
* into JavaScript structure.
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
const serializer = <T extends Element | unknown>(element: T): unknown => {
|
|
21
|
+
if (!isElement(element)) return element;
|
|
22
|
+
|
|
23
|
+
// Shortcut optimization for primitive element types
|
|
24
|
+
if (
|
|
25
|
+
isStringElement(element) ||
|
|
26
|
+
isNumberElement(element) ||
|
|
27
|
+
isBooleanElement(element) ||
|
|
28
|
+
isNullElement(element)
|
|
29
|
+
) {
|
|
30
|
+
return element.toValue();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// WeakMap for cycle handling - stores references to already-visited elements
|
|
34
|
+
const references = new WeakMap<Element, object | unknown[]>();
|
|
35
|
+
|
|
36
|
+
const serialize = (node: unknown): unknown => {
|
|
37
|
+
if (!isElement(node)) return node;
|
|
38
|
+
|
|
39
|
+
if (isObjectElement(node)) {
|
|
40
|
+
if (references.has(node)) return references.get(node);
|
|
41
|
+
const obj: Record<string, unknown> = {};
|
|
42
|
+
references.set(node, obj);
|
|
43
|
+
node.forEach((value, key) => {
|
|
44
|
+
const k = serialize(key);
|
|
45
|
+
const v = serialize(value);
|
|
46
|
+
if (typeof k === 'string') obj[k] = v;
|
|
47
|
+
});
|
|
48
|
+
return obj;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (isArrayElement(node)) {
|
|
52
|
+
if (references.has(node)) return references.get(node);
|
|
53
|
+
const arr: unknown[] = [];
|
|
54
|
+
references.set(node, arr);
|
|
55
|
+
node.forEach((item) => arr.push(serialize(item)));
|
|
56
|
+
return arr;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (isRefElement(node)) return String(node.toValue());
|
|
60
|
+
if (isLinkElement(node)) {
|
|
61
|
+
return isStringElement(node.href) ? node.href.toValue() : '';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return node.toValue();
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return serialize(element);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export default serializer;
|