@speclynx/apidom-datamodel 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.
Files changed (95) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/package.json +4 -5
  3. package/src/KeyValuePair.cjs +31 -0
  4. package/src/KeyValuePair.mjs +27 -0
  5. package/src/KeyValuePair.ts +31 -0
  6. package/src/Metadata.cjs +91 -0
  7. package/src/Metadata.mjs +87 -0
  8. package/src/Metadata.ts +100 -0
  9. package/src/Namespace.cjs +212 -0
  10. package/src/Namespace.mjs +206 -0
  11. package/src/Namespace.ts +260 -0
  12. package/src/ObjectSlice.cjs +199 -0
  13. package/src/ObjectSlice.mjs +195 -0
  14. package/src/ObjectSlice.ts +228 -0
  15. package/src/clone/errors/CloneError.cjs +22 -0
  16. package/src/clone/errors/CloneError.mjs +19 -0
  17. package/src/clone/errors/CloneError.ts +26 -0
  18. package/src/clone/errors/DeepCloneError.cjs +11 -0
  19. package/src/clone/errors/DeepCloneError.mjs +6 -0
  20. package/src/clone/errors/DeepCloneError.ts +8 -0
  21. package/src/clone/errors/ShallowCloneError.cjs +11 -0
  22. package/src/clone/errors/ShallowCloneError.mjs +6 -0
  23. package/src/clone/errors/ShallowCloneError.ts +8 -0
  24. package/src/clone/index.cjs +188 -0
  25. package/src/clone/index.mjs +178 -0
  26. package/src/clone/index.ts +195 -0
  27. package/src/elements/Annotation.cjs +35 -0
  28. package/src/elements/Annotation.mjs +30 -0
  29. package/src/elements/Annotation.ts +35 -0
  30. package/src/elements/Comment.cjs +18 -0
  31. package/src/elements/Comment.mjs +13 -0
  32. package/src/elements/Comment.ts +16 -0
  33. package/src/elements/LinkElement.cjs +50 -0
  34. package/src/elements/LinkElement.mjs +45 -0
  35. package/src/elements/LinkElement.ts +49 -0
  36. package/src/elements/ParseResult.cjs +91 -0
  37. package/src/elements/ParseResult.mjs +86 -0
  38. package/src/elements/ParseResult.ts +94 -0
  39. package/src/elements/RefElement.cjs +34 -0
  40. package/src/elements/RefElement.mjs +29 -0
  41. package/src/elements/RefElement.ts +33 -0
  42. package/src/elements/SourceMap.cjs +140 -0
  43. package/src/elements/SourceMap.mjs +134 -0
  44. package/src/elements/SourceMap.ts +170 -0
  45. package/src/elements/Style.cjs +54 -0
  46. package/src/elements/Style.mjs +48 -0
  47. package/src/elements/Style.ts +56 -0
  48. package/src/index.cjs +58 -0
  49. package/src/index.mjs +11 -0
  50. package/src/index.ts +79 -0
  51. package/src/predicates/elements.cjs +46 -0
  52. package/src/predicates/elements.mjs +35 -0
  53. package/src/predicates/elements.ts +42 -0
  54. package/src/predicates/index.cjs +77 -0
  55. package/src/predicates/index.mjs +56 -0
  56. package/src/predicates/index.ts +89 -0
  57. package/src/predicates/primitives.cjs +69 -0
  58. package/src/predicates/primitives.mjs +56 -0
  59. package/src/predicates/primitives.ts +79 -0
  60. package/src/primitives/ArrayElement.cjs +155 -0
  61. package/src/primitives/ArrayElement.mjs +148 -0
  62. package/src/primitives/ArrayElement.ts +161 -0
  63. package/src/primitives/BooleanElement.cjs +20 -0
  64. package/src/primitives/BooleanElement.mjs +15 -0
  65. package/src/primitives/BooleanElement.ts +18 -0
  66. package/src/primitives/CollectionElement.cjs +180 -0
  67. package/src/primitives/CollectionElement.mjs +173 -0
  68. package/src/primitives/CollectionElement.ts +191 -0
  69. package/src/primitives/Element.cjs +510 -0
  70. package/src/primitives/Element.mjs +505 -0
  71. package/src/primitives/Element.ts +556 -0
  72. package/src/primitives/MemberElement.cjs +58 -0
  73. package/src/primitives/MemberElement.mjs +53 -0
  74. package/src/primitives/MemberElement.ts +61 -0
  75. package/src/primitives/NullElement.cjs +28 -0
  76. package/src/primitives/NullElement.mjs +23 -0
  77. package/src/primitives/NullElement.ts +26 -0
  78. package/src/primitives/NumberElement.cjs +20 -0
  79. package/src/primitives/NumberElement.mjs +15 -0
  80. package/src/primitives/NumberElement.ts +18 -0
  81. package/src/primitives/ObjectElement.cjs +220 -0
  82. package/src/primitives/ObjectElement.mjs +214 -0
  83. package/src/primitives/ObjectElement.ts +263 -0
  84. package/src/primitives/StringElement.cjs +27 -0
  85. package/src/primitives/StringElement.mjs +22 -0
  86. package/src/primitives/StringElement.ts +25 -0
  87. package/src/registration.cjs +101 -0
  88. package/src/registration.mjs +79 -0
  89. package/src/registration.ts +111 -0
  90. package/src/serialisers/JSONSerialiser.cjs +230 -0
  91. package/src/serialisers/JSONSerialiser.mjs +221 -0
  92. package/src/serialisers/JSONSerialiser.ts +295 -0
  93. package/src/types.cjs +3 -0
  94. package/src/types.mjs +1 -0
  95. package/src/types.ts +72 -0
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Callback type for ObjectSlice iteration methods.
3
+ * Receives (value, key, member) - the standard pattern for object-like iteration.
4
+ * @public
5
+ */
6
+
7
+ /**
8
+ * Callback type for ObjectSlice forEach that also receives the index.
9
+ * @public
10
+ */
11
+
12
+ /**
13
+ * ObjectSlice is a collection wrapper for MemberElement arrays.
14
+ * It provides functional methods with (value, key, member) callback signatures,
15
+ * which is the standard pattern for iterating over object-like structures.
16
+ *
17
+ * Unlike ArraySlice, ObjectSlice uses composition rather than inheritance
18
+ * because its callback signatures are fundamentally different.
19
+ *
20
+ * @public
21
+ */
22
+ class ObjectSlice {
23
+ elements;
24
+ constructor(elements) {
25
+ this.elements = elements ?? [];
26
+ }
27
+
28
+ /**
29
+ * Converts all member elements to their JavaScript values.
30
+ * Returns an array of \{ key, value \} objects.
31
+ */
32
+ toValue() {
33
+ return this.elements.map(member => ({
34
+ key: member.key?.toValue(),
35
+ value: member.value?.toValue()
36
+ }));
37
+ }
38
+
39
+ /**
40
+ * Maps over the member elements, calling callback with (value, key, member).
41
+ * @param callback - Function to execute for each member
42
+ * @param thisArg - Value to use as this when executing callback
43
+ */
44
+ map(callback, thisArg) {
45
+ return this.elements.map(member => {
46
+ const value = member.value;
47
+ const key = member.key;
48
+ if (value === undefined || key === undefined) {
49
+ throw new Error('MemberElement must have both key and value');
50
+ }
51
+ return thisArg !== undefined ? callback.call(thisArg, value, key, member) : callback(value, key, member);
52
+ });
53
+ }
54
+
55
+ /**
56
+ * Filters member elements using the provided callback.
57
+ * @param callback - Function that receives (value, key, member) and returns boolean
58
+ * @param thisArg - Value to use as this when executing callback
59
+ */
60
+ filter(callback, thisArg) {
61
+ const filtered = this.elements.filter(member => {
62
+ const value = member.value;
63
+ const key = member.key;
64
+ if (value === undefined || key === undefined) {
65
+ return false; // Skip malformed members
66
+ }
67
+ return thisArg !== undefined ? callback.call(thisArg, value, key, member) : callback(value, key, member);
68
+ });
69
+ return new ObjectSlice(filtered);
70
+ }
71
+
72
+ /**
73
+ * Rejects member elements that match the provided callback.
74
+ * @param callback - Function that receives (value, key, member) and returns boolean
75
+ * @param thisArg - Value to use as this when executing callback
76
+ */
77
+ reject(callback, thisArg) {
78
+ const results = [];
79
+ for (const member of this.elements) {
80
+ const value = member.value;
81
+ const key = member.key;
82
+ if (value === undefined || key === undefined) {
83
+ continue;
84
+ }
85
+ if (!callback.call(thisArg, value, key, member)) {
86
+ results.push(member);
87
+ }
88
+ }
89
+ return new ObjectSlice(results);
90
+ }
91
+
92
+ /**
93
+ * Executes a provided function once for each member element.
94
+ * @param callback - Function that receives (value, key, member, index)
95
+ * @param thisArg - Value to use as this when executing callback
96
+ */
97
+ forEach(callback, thisArg) {
98
+ this.elements.forEach((member, index) => {
99
+ const value = member.value;
100
+ const key = member.key;
101
+ if (value === undefined || key === undefined) {
102
+ return; // Skip malformed members
103
+ }
104
+ if (thisArg !== undefined) {
105
+ callback.call(thisArg, value, key, member, index);
106
+ } else {
107
+ callback(value, key, member, index);
108
+ }
109
+ });
110
+ }
111
+
112
+ /**
113
+ * Returns the first member element that satisfies the callback.
114
+ * @param callback - Function that receives (value, key, member) and returns boolean
115
+ * @param thisArg - Value to use as this when executing callback
116
+ */
117
+ find(callback, thisArg) {
118
+ return this.elements.find(member => {
119
+ const value = member.value;
120
+ const key = member.key;
121
+ if (value === undefined || key === undefined) {
122
+ return false;
123
+ }
124
+ return thisArg !== undefined ? callback.call(thisArg, value, key, member) : callback(value, key, member);
125
+ });
126
+ }
127
+
128
+ /**
129
+ * Returns an array of all keys' values.
130
+ */
131
+ keys() {
132
+ return this.elements.map(member => member.key?.toValue()).filter(key => key !== undefined);
133
+ }
134
+
135
+ /**
136
+ * Returns an array of all values' values.
137
+ */
138
+ values() {
139
+ return this.elements.map(member => member.value?.toValue()).filter(value => value !== undefined);
140
+ }
141
+
142
+ /**
143
+ * Returns the number of elements in the slice.
144
+ */
145
+ get length() {
146
+ return this.elements.length;
147
+ }
148
+
149
+ /**
150
+ * Returns whether the slice is empty.
151
+ */
152
+ get isEmpty() {
153
+ return this.length === 0;
154
+ }
155
+
156
+ /**
157
+ * Returns the first element in the slice or undefined if empty.
158
+ */
159
+ get first() {
160
+ return this.elements[0];
161
+ }
162
+
163
+ /**
164
+ * Gets the element at the specified index.
165
+ * @param index - The index of the element to get
166
+ */
167
+ get(index) {
168
+ return this.elements[index];
169
+ }
170
+
171
+ /**
172
+ * Adds the given member element to the end of the slice.
173
+ * @param member - The member element to add
174
+ */
175
+ push(member) {
176
+ this.elements.push(member);
177
+ return this;
178
+ }
179
+
180
+ /**
181
+ * Determines whether the slice includes a member with the given key value.
182
+ * @param keyValue - The key value to search for
183
+ */
184
+ includesKey(keyValue) {
185
+ return this.elements.some(member => member.key?.equals(keyValue));
186
+ }
187
+
188
+ /**
189
+ * Iterator support - allows for...of loops.
190
+ */
191
+ [Symbol.iterator]() {
192
+ return this.elements[Symbol.iterator]();
193
+ }
194
+ }
195
+ export default ObjectSlice;
@@ -0,0 +1,228 @@
1
+ import type Element from './primitives/Element.ts';
2
+ import type MemberElement from './primitives/MemberElement.ts';
3
+
4
+ /**
5
+ * Callback type for ObjectSlice iteration methods.
6
+ * Receives (value, key, member) - the standard pattern for object-like iteration.
7
+ * @public
8
+ */
9
+ export type ObjectSliceCallback<U> = (value: Element, key: Element, member: MemberElement) => U;
10
+
11
+ /**
12
+ * Callback type for ObjectSlice forEach that also receives the index.
13
+ * @public
14
+ */
15
+ export type ObjectSliceForEachCallback = (
16
+ value: Element,
17
+ key: Element,
18
+ member: MemberElement,
19
+ index: number,
20
+ ) => void;
21
+
22
+ /**
23
+ * ObjectSlice is a collection wrapper for MemberElement arrays.
24
+ * It provides functional methods with (value, key, member) callback signatures,
25
+ * which is the standard pattern for iterating over object-like structures.
26
+ *
27
+ * Unlike ArraySlice, ObjectSlice uses composition rather than inheritance
28
+ * because its callback signatures are fundamentally different.
29
+ *
30
+ * @public
31
+ */
32
+ class ObjectSlice {
33
+ public readonly elements: MemberElement[];
34
+
35
+ constructor(elements?: MemberElement[]) {
36
+ this.elements = elements ?? [];
37
+ }
38
+
39
+ /**
40
+ * Converts all member elements to their JavaScript values.
41
+ * Returns an array of \{ key, value \} objects.
42
+ */
43
+ toValue(): Array<{ key: unknown; value: unknown }> {
44
+ return this.elements.map((member) => ({
45
+ key: member.key?.toValue(),
46
+ value: member.value?.toValue(),
47
+ }));
48
+ }
49
+
50
+ /**
51
+ * Maps over the member elements, calling callback with (value, key, member).
52
+ * @param callback - Function to execute for each member
53
+ * @param thisArg - Value to use as this when executing callback
54
+ */
55
+ map<U>(callback: ObjectSliceCallback<U>, thisArg?: unknown): U[] {
56
+ return this.elements.map((member) => {
57
+ const value = member.value;
58
+ const key = member.key;
59
+
60
+ if (value === undefined || key === undefined) {
61
+ throw new Error('MemberElement must have both key and value');
62
+ }
63
+
64
+ return thisArg !== undefined
65
+ ? callback.call(thisArg, value, key, member)
66
+ : callback(value, key, member);
67
+ });
68
+ }
69
+
70
+ /**
71
+ * Filters member elements using the provided callback.
72
+ * @param callback - Function that receives (value, key, member) and returns boolean
73
+ * @param thisArg - Value to use as this when executing callback
74
+ */
75
+ filter(callback: ObjectSliceCallback<boolean>, thisArg?: unknown): ObjectSlice {
76
+ const filtered = this.elements.filter((member) => {
77
+ const value = member.value;
78
+ const key = member.key;
79
+
80
+ if (value === undefined || key === undefined) {
81
+ return false; // Skip malformed members
82
+ }
83
+
84
+ return thisArg !== undefined
85
+ ? callback.call(thisArg, value, key, member)
86
+ : callback(value, key, member);
87
+ });
88
+
89
+ return new ObjectSlice(filtered);
90
+ }
91
+
92
+ /**
93
+ * Rejects member elements that match the provided callback.
94
+ * @param callback - Function that receives (value, key, member) and returns boolean
95
+ * @param thisArg - Value to use as this when executing callback
96
+ */
97
+ reject(callback: ObjectSliceCallback<boolean>, thisArg?: unknown): ObjectSlice {
98
+ const results: MemberElement[] = [];
99
+ for (const member of this.elements) {
100
+ const value = member.value;
101
+ const key = member.key;
102
+
103
+ if (value === undefined || key === undefined) {
104
+ continue;
105
+ }
106
+
107
+ if (!callback.call(thisArg, value, key, member)) {
108
+ results.push(member);
109
+ }
110
+ }
111
+ return new ObjectSlice(results);
112
+ }
113
+
114
+ /**
115
+ * Executes a provided function once for each member element.
116
+ * @param callback - Function that receives (value, key, member, index)
117
+ * @param thisArg - Value to use as this when executing callback
118
+ */
119
+ forEach(callback: ObjectSliceForEachCallback, thisArg?: unknown): void {
120
+ this.elements.forEach((member, index) => {
121
+ const value = member.value;
122
+ const key = member.key;
123
+
124
+ if (value === undefined || key === undefined) {
125
+ return; // Skip malformed members
126
+ }
127
+
128
+ if (thisArg !== undefined) {
129
+ callback.call(thisArg, value, key, member, index);
130
+ } else {
131
+ callback(value, key, member, index);
132
+ }
133
+ });
134
+ }
135
+
136
+ /**
137
+ * Returns the first member element that satisfies the callback.
138
+ * @param callback - Function that receives (value, key, member) and returns boolean
139
+ * @param thisArg - Value to use as this when executing callback
140
+ */
141
+ find(callback: ObjectSliceCallback<boolean>, thisArg?: unknown): MemberElement | undefined {
142
+ return this.elements.find((member) => {
143
+ const value = member.value;
144
+ const key = member.key;
145
+
146
+ if (value === undefined || key === undefined) {
147
+ return false;
148
+ }
149
+
150
+ return thisArg !== undefined
151
+ ? callback.call(thisArg, value, key, member)
152
+ : callback(value, key, member);
153
+ });
154
+ }
155
+
156
+ /**
157
+ * Returns an array of all keys' values.
158
+ */
159
+ keys(): unknown[] {
160
+ return this.elements
161
+ .map((member) => member.key?.toValue())
162
+ .filter((key): key is unknown => key !== undefined);
163
+ }
164
+
165
+ /**
166
+ * Returns an array of all values' values.
167
+ */
168
+ values(): unknown[] {
169
+ return this.elements
170
+ .map((member) => member.value?.toValue())
171
+ .filter((value): value is unknown => value !== undefined);
172
+ }
173
+
174
+ /**
175
+ * Returns the number of elements in the slice.
176
+ */
177
+ get length(): number {
178
+ return this.elements.length;
179
+ }
180
+
181
+ /**
182
+ * Returns whether the slice is empty.
183
+ */
184
+ get isEmpty(): boolean {
185
+ return this.length === 0;
186
+ }
187
+
188
+ /**
189
+ * Returns the first element in the slice or undefined if empty.
190
+ */
191
+ get first(): MemberElement | undefined {
192
+ return this.elements[0];
193
+ }
194
+
195
+ /**
196
+ * Gets the element at the specified index.
197
+ * @param index - The index of the element to get
198
+ */
199
+ get(index: number): MemberElement | undefined {
200
+ return this.elements[index];
201
+ }
202
+
203
+ /**
204
+ * Adds the given member element to the end of the slice.
205
+ * @param member - The member element to add
206
+ */
207
+ push(member: MemberElement): this {
208
+ this.elements.push(member);
209
+ return this;
210
+ }
211
+
212
+ /**
213
+ * Determines whether the slice includes a member with the given key value.
214
+ * @param keyValue - The key value to search for
215
+ */
216
+ includesKey(keyValue: unknown): boolean {
217
+ return this.elements.some((member) => member.key?.equals(keyValue));
218
+ }
219
+
220
+ /**
221
+ * Iterator support - allows for...of loops.
222
+ */
223
+ [Symbol.iterator](): IterableIterator<MemberElement> {
224
+ return this.elements[Symbol.iterator]();
225
+ }
226
+ }
227
+
228
+ export default ObjectSlice;
@@ -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 CloneError 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 = CloneError;
@@ -0,0 +1,19 @@
1
+ import { ApiDOMStructuredError } from '@speclynx/apidom-error';
2
+
3
+ /**
4
+ * @public
5
+ */
6
+
7
+ /**
8
+ * @public
9
+ */
10
+ class CloneError 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 CloneError;
@@ -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 CloneErrorOptions extends ApiDOMErrorOptions {
8
+ readonly value: unknown;
9
+ }
10
+
11
+ /**
12
+ * @public
13
+ */
14
+ class CloneError extends ApiDOMStructuredError {
15
+ public readonly value: unknown;
16
+
17
+ constructor(message?: string, structuredOptions?: CloneErrorOptions) {
18
+ super(message, structuredOptions);
19
+
20
+ if (typeof structuredOptions !== 'undefined') {
21
+ this.value = structuredOptions.value;
22
+ }
23
+ }
24
+ }
25
+
26
+ export default CloneError;
@@ -0,0 +1,11 @@
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 _CloneError = _interopRequireDefault(require("./CloneError.cjs"));
7
+ /**
8
+ * @public
9
+ */
10
+ class DeepCloneError extends _CloneError.default {}
11
+ var _default = exports.default = DeepCloneError;
@@ -0,0 +1,6 @@
1
+ import CloneError from "./CloneError.mjs";
2
+ /**
3
+ * @public
4
+ */
5
+ class DeepCloneError extends CloneError {}
6
+ export default DeepCloneError;
@@ -0,0 +1,8 @@
1
+ import CloneError from './CloneError.ts';
2
+
3
+ /**
4
+ * @public
5
+ */
6
+ class DeepCloneError extends CloneError {}
7
+
8
+ export default DeepCloneError;
@@ -0,0 +1,11 @@
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 _CloneError = _interopRequireDefault(require("./CloneError.cjs"));
7
+ /**
8
+ * @public
9
+ */
10
+ class ShallowCloneError extends _CloneError.default {}
11
+ var _default = exports.default = ShallowCloneError;
@@ -0,0 +1,6 @@
1
+ import CloneError from "./CloneError.mjs";
2
+ /**
3
+ * @public
4
+ */
5
+ class ShallowCloneError extends CloneError {}
6
+ export default ShallowCloneError;
@@ -0,0 +1,8 @@
1
+ import CloneError from './CloneError.ts';
2
+
3
+ /**
4
+ * @public
5
+ */
6
+ class ShallowCloneError extends CloneError {}
7
+
8
+ export default ShallowCloneError;