@speclynx/apidom-core 4.0.2 → 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 +6 -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
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [4.0.3](https://github.com/speclynx/apidom/compare/v4.0.2...v4.0.3) (2026-03-11)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **release:** fix v4.0.2 failed release ([b4dc1c4](https://github.com/speclynx/apidom/commit/b4dc1c48e8d9b2986a70e49b5554eb0a166d7528))
|
|
11
|
+
|
|
6
12
|
## [4.0.2](https://github.com/speclynx/apidom/compare/v4.0.1...v4.0.2) (2026-03-11)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @speclynx/apidom-core
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@speclynx/apidom-core",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.3",
|
|
4
4
|
"description": "Tools for manipulating ApiDOM structures.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"apidom",
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"license": "Apache-2.0",
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@babel/runtime-corejs3": "^7.28.4",
|
|
60
|
-
"@speclynx/apidom-datamodel": "4.0.
|
|
61
|
-
"@speclynx/apidom-error": "4.0.
|
|
62
|
-
"@speclynx/apidom-traverse": "4.0.
|
|
60
|
+
"@speclynx/apidom-datamodel": "4.0.3",
|
|
61
|
+
"@speclynx/apidom-error": "4.0.3",
|
|
62
|
+
"@speclynx/apidom-traverse": "4.0.3",
|
|
63
63
|
"ramda": "~0.32.0",
|
|
64
64
|
"ramda-adjunct": "^6.0.0",
|
|
65
65
|
"short-unique-id": "^5.3.2",
|
|
@@ -67,8 +67,7 @@
|
|
|
67
67
|
"yaml": "^2.8.2"
|
|
68
68
|
},
|
|
69
69
|
"files": [
|
|
70
|
-
"src
|
|
71
|
-
"src/**/*.cjs",
|
|
70
|
+
"src/",
|
|
72
71
|
"dist/",
|
|
73
72
|
"types/apidom-core.d.ts",
|
|
74
73
|
"LICENSES",
|
|
@@ -76,5 +75,5 @@
|
|
|
76
75
|
"README.md",
|
|
77
76
|
"CHANGELOG.md"
|
|
78
77
|
],
|
|
79
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "6ccfa09c02232516215e7de3ead276641957e626"
|
|
80
79
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = void 0;
|
|
5
|
+
exports.fixedFields = fixedFields;
|
|
6
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
7
|
+
/**
|
|
8
|
+
* Represents a fixed field definition.
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Returns the fixed fields for an Element class or instance.
|
|
18
|
+
*
|
|
19
|
+
* @param elementOrClass - Element instance or class
|
|
20
|
+
* @param options - Options for return format
|
|
21
|
+
* @returns Array of fixed fields, or object indexed by name if options.indexed is true
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { fixedFields } from '@speclynx/apidom-core';
|
|
26
|
+
*
|
|
27
|
+
* // Get fixed fields as array
|
|
28
|
+
* const fields = fixedFields(ParameterElement);
|
|
29
|
+
*
|
|
30
|
+
* // Get fixed fields as indexed object for O(1) lookups
|
|
31
|
+
* const fieldsIndex = fixedFields(ParameterElement, { indexed: true });
|
|
32
|
+
* if (Object.hasOwn(fieldsIndex, 'description')) {
|
|
33
|
+
* // field exists
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
function fixedFields(elementOrClass, options) {
|
|
40
|
+
const constructor = elementOrClass instanceof _apidomDatamodel.Element ? elementOrClass.constructor : elementOrClass;
|
|
41
|
+
const fields = constructor.fixedFields ?? [];
|
|
42
|
+
if (options?.indexed) {
|
|
43
|
+
return Object.fromEntries(fields.map(f => [f.name, f]));
|
|
44
|
+
}
|
|
45
|
+
return fields;
|
|
46
|
+
}
|
|
47
|
+
var _default = exports.default = fixedFields;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Element } from '@speclynx/apidom-datamodel';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents a fixed field definition.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Returns the fixed fields for an Element class or instance.
|
|
14
|
+
*
|
|
15
|
+
* @param elementOrClass - Element instance or class
|
|
16
|
+
* @param options - Options for return format
|
|
17
|
+
* @returns Array of fixed fields, or object indexed by name if options.indexed is true
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { fixedFields } from '@speclynx/apidom-core';
|
|
22
|
+
*
|
|
23
|
+
* // Get fixed fields as array
|
|
24
|
+
* const fields = fixedFields(ParameterElement);
|
|
25
|
+
*
|
|
26
|
+
* // Get fixed fields as indexed object for O(1) lookups
|
|
27
|
+
* const fieldsIndex = fixedFields(ParameterElement, { indexed: true });
|
|
28
|
+
* if (Object.hasOwn(fieldsIndex, 'description')) {
|
|
29
|
+
* // field exists
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
export function fixedFields(elementOrClass, options) {
|
|
36
|
+
const constructor = elementOrClass instanceof Element ? elementOrClass.constructor : elementOrClass;
|
|
37
|
+
const fields = constructor.fixedFields ?? [];
|
|
38
|
+
if (options?.indexed) {
|
|
39
|
+
return Object.fromEntries(fields.map(f => [f.name, f]));
|
|
40
|
+
}
|
|
41
|
+
return fields;
|
|
42
|
+
}
|
|
43
|
+
export default fixedFields;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Element } from '@speclynx/apidom-datamodel';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents a fixed field definition.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export interface FixedField {
|
|
8
|
+
name: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
export type FixedFieldsElementClass = typeof Element & {
|
|
16
|
+
fixedFields?: FixedField[];
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns the fixed fields for an Element class or instance.
|
|
21
|
+
*
|
|
22
|
+
* @param elementOrClass - Element instance or class
|
|
23
|
+
* @param options - Options for return format
|
|
24
|
+
* @returns Array of fixed fields, or object indexed by name if options.indexed is true
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { fixedFields } from '@speclynx/apidom-core';
|
|
29
|
+
*
|
|
30
|
+
* // Get fixed fields as array
|
|
31
|
+
* const fields = fixedFields(ParameterElement);
|
|
32
|
+
*
|
|
33
|
+
* // Get fixed fields as indexed object for O(1) lookups
|
|
34
|
+
* const fieldsIndex = fixedFields(ParameterElement, { indexed: true });
|
|
35
|
+
* if (Object.hasOwn(fieldsIndex, 'description')) {
|
|
36
|
+
* // field exists
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
export function fixedFields<T extends boolean = false>(
|
|
43
|
+
elementOrClass: Element | FixedFieldsElementClass,
|
|
44
|
+
options?: { indexed?: T },
|
|
45
|
+
): T extends true ? Record<string, FixedField> : FixedField[] {
|
|
46
|
+
const constructor = (
|
|
47
|
+
elementOrClass instanceof Element ? elementOrClass.constructor : elementOrClass
|
|
48
|
+
) as FixedFieldsElementClass;
|
|
49
|
+
|
|
50
|
+
const fields = constructor.fixedFields ?? [];
|
|
51
|
+
|
|
52
|
+
if (options?.indexed) {
|
|
53
|
+
return Object.fromEntries(fields.map((f) => [f.name, f])) as T extends true
|
|
54
|
+
? Record<string, FixedField>
|
|
55
|
+
: FixedField[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return fields as T extends true ? Record<string, FixedField> : FixedField[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default fixedFields;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.fixedFields = exports.default = void 0;
|
|
6
|
+
var _fixedFields = _interopRequireWildcard(require("./fixed-fields.cjs"));
|
|
7
|
+
exports.fixedFields = _fixedFields.fixedFields;
|
|
8
|
+
exports.default = _fixedFields.default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { fixedFields, default } from "./fixed-fields.mjs";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = void 0;
|
|
5
|
+
var _apidomError = require("@speclynx/apidom-error");
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
class ElementIdentityError extends _apidomError.ApiDOMStructuredError {
|
|
14
|
+
value;
|
|
15
|
+
constructor(message, structuredOptions) {
|
|
16
|
+
super(message, structuredOptions);
|
|
17
|
+
if (typeof structuredOptions !== 'undefined') {
|
|
18
|
+
this.value = structuredOptions.value;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
var _default = exports.default = ElementIdentityError;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ApiDOMStructuredError } from '@speclynx/apidom-error';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
class ElementIdentityError extends ApiDOMStructuredError {
|
|
11
|
+
value;
|
|
12
|
+
constructor(message, structuredOptions) {
|
|
13
|
+
super(message, structuredOptions);
|
|
14
|
+
if (typeof structuredOptions !== 'undefined') {
|
|
15
|
+
this.value = structuredOptions.value;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export default ElementIdentityError;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ApiDOMStructuredError } from '@speclynx/apidom-error';
|
|
2
|
+
import type { ApiDOMErrorOptions } from '@speclynx/apidom-error';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export interface ElementIdentityErrorOptions extends ApiDOMErrorOptions {
|
|
8
|
+
readonly value: unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
class ElementIdentityError extends ApiDOMStructuredError {
|
|
15
|
+
public readonly value: unknown;
|
|
16
|
+
|
|
17
|
+
constructor(message?: string, structuredOptions?: ElementIdentityErrorOptions) {
|
|
18
|
+
super(message, structuredOptions);
|
|
19
|
+
|
|
20
|
+
if (typeof structuredOptions !== 'undefined') {
|
|
21
|
+
this.value = structuredOptions.value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default ElementIdentityError;
|
|
@@ -0,0 +1,64 @@
|
|
|
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 _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
7
|
+
var _shortUniqueId = _interopRequireDefault(require("short-unique-id"));
|
|
8
|
+
var _ElementIdentityError = _interopRequireDefault(require("./errors/ElementIdentityError.cjs"));
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
class IdentityManager {
|
|
13
|
+
uuid;
|
|
14
|
+
identityMap;
|
|
15
|
+
constructor({
|
|
16
|
+
length = 6
|
|
17
|
+
} = {}) {
|
|
18
|
+
this.uuid = new _shortUniqueId.default({
|
|
19
|
+
length
|
|
20
|
+
});
|
|
21
|
+
this.identityMap = new WeakMap();
|
|
22
|
+
}
|
|
23
|
+
identify(element) {
|
|
24
|
+
if (!(0, _apidomDatamodel.isElement)(element)) {
|
|
25
|
+
throw new _ElementIdentityError.default('Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.', {
|
|
26
|
+
value: element
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// use already assigned identity
|
|
31
|
+
if (element.hasMetaProperty('id')) {
|
|
32
|
+
const existingId = element.id;
|
|
33
|
+
if (typeof existingId === 'string' && existingId !== '') {
|
|
34
|
+
return existingId;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// assign identity in immutable way
|
|
39
|
+
if (this.identityMap.has(element)) {
|
|
40
|
+
return this.identityMap.get(element);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// return element identity
|
|
44
|
+
const id = this.generateId();
|
|
45
|
+
this.identityMap.set(element, id);
|
|
46
|
+
return id;
|
|
47
|
+
}
|
|
48
|
+
forget(element) {
|
|
49
|
+
if (this.identityMap.has(element)) {
|
|
50
|
+
this.identityMap.delete(element);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
generateId() {
|
|
56
|
+
return this.uuid.randomUUID();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @public
|
|
62
|
+
*/
|
|
63
|
+
exports.IdentityManager = IdentityManager;
|
|
64
|
+
const defaultIdentityManager = exports.defaultIdentityManager = new IdentityManager();
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { isElement } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import ShortUniqueId from 'short-unique-id';
|
|
3
|
+
import ElementIdentityError from "./errors/ElementIdentityError.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export class IdentityManager {
|
|
8
|
+
uuid;
|
|
9
|
+
identityMap;
|
|
10
|
+
constructor({
|
|
11
|
+
length = 6
|
|
12
|
+
} = {}) {
|
|
13
|
+
this.uuid = new ShortUniqueId({
|
|
14
|
+
length
|
|
15
|
+
});
|
|
16
|
+
this.identityMap = new WeakMap();
|
|
17
|
+
}
|
|
18
|
+
identify(element) {
|
|
19
|
+
if (!isElement(element)) {
|
|
20
|
+
throw new ElementIdentityError('Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.', {
|
|
21
|
+
value: element
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// use already assigned identity
|
|
26
|
+
if (element.hasMetaProperty('id')) {
|
|
27
|
+
const existingId = element.id;
|
|
28
|
+
if (typeof existingId === 'string' && existingId !== '') {
|
|
29
|
+
return existingId;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// assign identity in immutable way
|
|
34
|
+
if (this.identityMap.has(element)) {
|
|
35
|
+
return this.identityMap.get(element);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// return element identity
|
|
39
|
+
const id = this.generateId();
|
|
40
|
+
this.identityMap.set(element, id);
|
|
41
|
+
return id;
|
|
42
|
+
}
|
|
43
|
+
forget(element) {
|
|
44
|
+
if (this.identityMap.has(element)) {
|
|
45
|
+
this.identityMap.delete(element);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
generateId() {
|
|
51
|
+
return this.uuid.randomUUID();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @public
|
|
57
|
+
*/
|
|
58
|
+
export const defaultIdentityManager = new IdentityManager();
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Element, isElement } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import ShortUniqueId from 'short-unique-id';
|
|
3
|
+
|
|
4
|
+
import ElementIdentityError from './errors/ElementIdentityError.ts';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export class IdentityManager {
|
|
10
|
+
protected readonly uuid: ShortUniqueId;
|
|
11
|
+
|
|
12
|
+
protected readonly identityMap: WeakMap<Element, string>;
|
|
13
|
+
|
|
14
|
+
constructor({ length = 6 } = {}) {
|
|
15
|
+
this.uuid = new ShortUniqueId({ length });
|
|
16
|
+
this.identityMap = new WeakMap();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
identify<T extends Element>(this: IdentityManager, element: T): string {
|
|
20
|
+
if (!isElement(element)) {
|
|
21
|
+
throw new ElementIdentityError(
|
|
22
|
+
'Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.',
|
|
23
|
+
{
|
|
24
|
+
value: element,
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// use already assigned identity
|
|
30
|
+
if (element.hasMetaProperty('id')) {
|
|
31
|
+
const existingId = element.id;
|
|
32
|
+
if (typeof existingId === 'string' && existingId !== '') {
|
|
33
|
+
return existingId;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// assign identity in immutable way
|
|
38
|
+
if (this.identityMap.has(element)) {
|
|
39
|
+
return this.identityMap.get(element)!;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// return element identity
|
|
43
|
+
const id = this.generateId();
|
|
44
|
+
this.identityMap.set(element, id);
|
|
45
|
+
return id;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
forget<T extends Element>(element: T): boolean {
|
|
49
|
+
if (this.identityMap.has(element)) {
|
|
50
|
+
this.identityMap.delete(element);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
generateId(): string {
|
|
57
|
+
return this.uuid.randomUUID();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
export const defaultIdentityManager = new IdentityManager();
|
package/src/index.cjs
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.transclude = exports.toYAML = exports.toValue = exports.toString = exports.toJSON = exports.sexprs = exports.resolveSpecification = exports.refractorPluginSemanticElementIdentity = exports.refractorPluginElementIdentity = exports.mergeRight = exports.mergeLeft = exports.from = exports.fixedFields = exports.dispatchRefractorPlugins = exports.dehydrate = exports.defaultIdentityManager = exports.deepmerge = exports.createToolbox = exports.Transcluder = exports.MediaTypes = exports.IdentityManager = exports.ElementIdentityError = void 0;
|
|
7
|
+
var _index = require("./refractor/plugins/dispatcher/index.cjs");
|
|
8
|
+
exports.dispatchRefractorPlugins = _index.dispatchPluginsSync;
|
|
9
|
+
var _toolbox = _interopRequireDefault(require("./refractor/toolbox.cjs"));
|
|
10
|
+
exports.createToolbox = _toolbox.default;
|
|
11
|
+
var _elementIdentity = _interopRequireDefault(require("./refractor/plugins/element-identity.cjs"));
|
|
12
|
+
exports.refractorPluginElementIdentity = _elementIdentity.default;
|
|
13
|
+
var _semanticElementIdentity = _interopRequireDefault(require("./refractor/plugins/semantic-element-identity.cjs"));
|
|
14
|
+
exports.refractorPluginSemanticElementIdentity = _semanticElementIdentity.default;
|
|
15
|
+
var _mediaTypes = _interopRequireDefault(require("./media-types.cjs"));
|
|
16
|
+
exports.MediaTypes = _mediaTypes.default;
|
|
17
|
+
var _index2 = _interopRequireWildcard(require("./transcluder/index.cjs"));
|
|
18
|
+
exports.transclude = _index2.transclude;
|
|
19
|
+
exports.Transcluder = _index2.default;
|
|
20
|
+
var _specification = require("./specification.cjs");
|
|
21
|
+
exports.resolveSpecification = _specification.resolveSpecification;
|
|
22
|
+
var _index3 = require("./identity/index.cjs");
|
|
23
|
+
exports.defaultIdentityManager = _index3.defaultIdentityManager;
|
|
24
|
+
exports.IdentityManager = _index3.IdentityManager;
|
|
25
|
+
var _ElementIdentityError = _interopRequireDefault(require("./identity/errors/ElementIdentityError.cjs"));
|
|
26
|
+
exports.ElementIdentityError = _ElementIdentityError.default;
|
|
27
|
+
var _from = _interopRequireDefault(require("./transformers/from.cjs"));
|
|
28
|
+
exports.from = _from.default;
|
|
29
|
+
var _value = _interopRequireDefault(require("./transformers/serializers/value.cjs"));
|
|
30
|
+
exports.toValue = _value.default;
|
|
31
|
+
var _json = _interopRequireDefault(require("./transformers/serializers/json.cjs"));
|
|
32
|
+
exports.toJSON = _json.default;
|
|
33
|
+
var _yaml = _interopRequireDefault(require("./transformers/serializers/yaml-1-2.cjs"));
|
|
34
|
+
exports.toYAML = _yaml.default;
|
|
35
|
+
var _dehydrate = _interopRequireDefault(require("./transformers/dehydrate.cjs"));
|
|
36
|
+
exports.dehydrate = _dehydrate.default;
|
|
37
|
+
var _toString = _interopRequireDefault(require("./transformers/to-string.cjs"));
|
|
38
|
+
exports.toString = _toString.default;
|
|
39
|
+
var _sexprs = _interopRequireDefault(require("./transformers/sexprs.cjs"));
|
|
40
|
+
exports.sexprs = _sexprs.default;
|
|
41
|
+
var _deepmerge = _interopRequireDefault(require("./merge/deepmerge.cjs"));
|
|
42
|
+
exports.deepmerge = _deepmerge.default;
|
|
43
|
+
var _mergeRight = _interopRequireDefault(require("./merge/merge-right.cjs"));
|
|
44
|
+
exports.mergeRight = _mergeRight.default;
|
|
45
|
+
var _mergeLeft = _interopRequireDefault(require("./merge/merge-left.cjs"));
|
|
46
|
+
exports.mergeLeft = _mergeLeft.default;
|
|
47
|
+
var _index4 = require("./fields/index.cjs");
|
|
48
|
+
exports.fixedFields = _index4.fixedFields;
|
package/src/index.mjs
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export { dispatchPluginsSync as dispatchRefractorPlugins } from "./refractor/plugins/dispatcher/index.mjs";
|
|
2
|
+
export { default as createToolbox } from "./refractor/toolbox.mjs";
|
|
3
|
+
export { default as refractorPluginElementIdentity } from "./refractor/plugins/element-identity.mjs";
|
|
4
|
+
export { default as refractorPluginSemanticElementIdentity } from "./refractor/plugins/semantic-element-identity.mjs";
|
|
5
|
+
export { default as MediaTypes } from "./media-types.mjs";
|
|
6
|
+
export { transclude, default as Transcluder } from "./transcluder/index.mjs";
|
|
7
|
+
export { resolveSpecification } from "./specification.mjs";
|
|
8
|
+
export { defaultIdentityManager, IdentityManager } from "./identity/index.mjs";
|
|
9
|
+
export { default as ElementIdentityError } from "./identity/errors/ElementIdentityError.mjs";
|
|
10
|
+
/**
|
|
11
|
+
* Transforms data to an Element from a particular namespace.
|
|
12
|
+
*/
|
|
13
|
+
export { default as from } from "./transformers/from.mjs";
|
|
14
|
+
/**
|
|
15
|
+
* Transforms the ApiDOM into JavaScript POJO.
|
|
16
|
+
* This POJO would be the result of interpreting the ApiDOM
|
|
17
|
+
* into JavaScript structure.
|
|
18
|
+
*/
|
|
19
|
+
export { default as toValue } from "./transformers/serializers/value.mjs";
|
|
20
|
+
/**
|
|
21
|
+
* Transforms the ApiDOM into JSON string.
|
|
22
|
+
*/
|
|
23
|
+
export { default as toJSON } from "./transformers/serializers/json.mjs";
|
|
24
|
+
/**
|
|
25
|
+
* Transforms the ApiDOM into YAML string.
|
|
26
|
+
*/
|
|
27
|
+
export { default as toYAML } from "./transformers/serializers/yaml-1-2.mjs";
|
|
28
|
+
/**
|
|
29
|
+
* Creates a refract representation of an Element.
|
|
30
|
+
* https://github.com/refractproject/refract-spec
|
|
31
|
+
*/
|
|
32
|
+
export { default as dehydrate } from "./transformers/dehydrate.mjs";
|
|
33
|
+
/**
|
|
34
|
+
* Create a refracted string representation of an Element.
|
|
35
|
+
*/
|
|
36
|
+
export { default as toString } from "./transformers/to-string.mjs";
|
|
37
|
+
export { default as sexprs } from "./transformers/sexprs.mjs";
|
|
38
|
+
export { default as deepmerge } from "./merge/deepmerge.mjs";
|
|
39
|
+
export { default as mergeRight } from "./merge/merge-right.mjs";
|
|
40
|
+
export { default as mergeLeft } from "./merge/merge-left.mjs";
|
|
41
|
+
export { fixedFields } from "./fields/index.mjs";
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export { dispatchPluginsSync as dispatchRefractorPlugins } from './refractor/plugins/dispatcher/index.ts';
|
|
2
|
+
export type {
|
|
3
|
+
DispatchPluginsSync,
|
|
4
|
+
DispatchPluginsAsync,
|
|
5
|
+
DispatchPluginsOptions,
|
|
6
|
+
} from './refractor/plugins/dispatcher/index.ts';
|
|
7
|
+
|
|
8
|
+
export { default as createToolbox } from './refractor/toolbox.ts';
|
|
9
|
+
export type { Toolbox, Predicates } from './refractor/toolbox.ts';
|
|
10
|
+
|
|
11
|
+
export { default as refractorPluginElementIdentity } from './refractor/plugins/element-identity.ts';
|
|
12
|
+
export { default as refractorPluginSemanticElementIdentity } from './refractor/plugins/semantic-element-identity.ts';
|
|
13
|
+
|
|
14
|
+
export { default as MediaTypes } from './media-types.ts';
|
|
15
|
+
|
|
16
|
+
export { transclude, default as Transcluder } from './transcluder/index.ts';
|
|
17
|
+
|
|
18
|
+
export { resolveSpecification, type ResolvedSpecification } from './specification.ts';
|
|
19
|
+
|
|
20
|
+
export { defaultIdentityManager, IdentityManager } from './identity/index.ts';
|
|
21
|
+
export { default as ElementIdentityError } from './identity/errors/ElementIdentityError.ts';
|
|
22
|
+
export type { ElementIdentityErrorOptions } from './identity/errors/ElementIdentityError.ts';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Transforms data to an Element from a particular namespace.
|
|
26
|
+
*/
|
|
27
|
+
export { default as from } from './transformers/from.ts';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Transforms the ApiDOM into JavaScript POJO.
|
|
31
|
+
* This POJO would be the result of interpreting the ApiDOM
|
|
32
|
+
* into JavaScript structure.
|
|
33
|
+
*/
|
|
34
|
+
export { default as toValue } from './transformers/serializers/value.ts';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Transforms the ApiDOM into JSON string.
|
|
38
|
+
*/
|
|
39
|
+
export { default as toJSON, type JSONSerializerOptions } from './transformers/serializers/json.ts';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Transforms the ApiDOM into YAML string.
|
|
43
|
+
*/
|
|
44
|
+
export {
|
|
45
|
+
default as toYAML,
|
|
46
|
+
type YAMLSerializerOptions,
|
|
47
|
+
} from './transformers/serializers/yaml-1-2.ts';
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Creates a refract representation of an Element.
|
|
51
|
+
* https://github.com/refractproject/refract-spec
|
|
52
|
+
*/
|
|
53
|
+
export { default as dehydrate } from './transformers/dehydrate.ts';
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Create a refracted string representation of an Element.
|
|
57
|
+
*/
|
|
58
|
+
export { default as toString } from './transformers/to-string.ts';
|
|
59
|
+
|
|
60
|
+
export { default as sexprs } from './transformers/sexprs.ts';
|
|
61
|
+
|
|
62
|
+
export { default as deepmerge } from './merge/deepmerge.ts';
|
|
63
|
+
export type {
|
|
64
|
+
DeepMergeUserOptions,
|
|
65
|
+
ObjectOrArrayElement,
|
|
66
|
+
AnyElement,
|
|
67
|
+
DeepMerge,
|
|
68
|
+
DeepMergeOptions,
|
|
69
|
+
ArrayElementMerge as DeepMergeArrayElementMerge,
|
|
70
|
+
ObjectElementMerge as DeepMergeObjectElementMerge,
|
|
71
|
+
CustomMerge as DeepMergeCustomMerge,
|
|
72
|
+
CustomMetaMerge as DeepMergeCustomMetaMerge,
|
|
73
|
+
CustomAttributesMerge as DeepMergeCustomAttributesMerge,
|
|
74
|
+
} from './merge/deepmerge.ts';
|
|
75
|
+
export { default as mergeRight } from './merge/merge-right.ts';
|
|
76
|
+
export type { MergeRightOptions } from './merge/merge-right.ts';
|
|
77
|
+
export { default as mergeLeft } from './merge/merge-left.ts';
|
|
78
|
+
export type { MergeRightOptions as MergeLeftOptions } from './merge/merge-right.ts';
|
|
79
|
+
|
|
80
|
+
export { fixedFields } from './fields/index.ts';
|
|
81
|
+
export type { FixedField, FixedFieldsElementClass } from './fields/index.ts';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = void 0;
|
|
5
|
+
var _apidomError = require("@speclynx/apidom-error");
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
class MediaTypes extends Array {
|
|
10
|
+
unknownMediaType = 'application/octet-stream';
|
|
11
|
+
filterByFormat() {
|
|
12
|
+
throw new _apidomError.NotImplementedError('filterByFormat method in MediaTypes class is not yet implemented.');
|
|
13
|
+
}
|
|
14
|
+
findBy() {
|
|
15
|
+
throw new _apidomError.NotImplementedError('findBy method in MediaTypes class is not yet implemented.');
|
|
16
|
+
}
|
|
17
|
+
latest() {
|
|
18
|
+
throw new _apidomError.NotImplementedError('latest method in MediaTypes class is not yet implemented.');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
var _default = exports.default = MediaTypes;
|