Skip to content

Commit 3bb7131

Browse files
committed
feat(core): change from stamps to TypeScript classes (#4095)
Refs #3481 BREAKING CHANGE: IdentityManager from apidom-core package became a class and requires to be instantiated with new operator.
1 parent b84d9cb commit 3bb7131

File tree

9 files changed

+57
-72
lines changed

9 files changed

+57
-72
lines changed

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/apidom-core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"ramda": "~0.30.0",
5050
"ramda-adjunct": "^5.0.0",
5151
"short-unique-id": "^5.0.2",
52-
"stampit": "^4.3.2"
52+
"ts-mixer": "^6.0.3"
5353
},
5454
"files": [
5555
"cjs/",
+49-64
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,60 @@
11
import { Element, StringElement } from 'minim';
2-
import stampit from 'stampit';
32
import ShortUniqueId from 'short-unique-id';
43

54
import ElementIdentityError from './errors/ElementIdentityError';
65
import { isElement, isStringElement } from '../predicates';
76

8-
export interface IdentityManager<T extends Element = Element> {
9-
length: number;
10-
uuid: ShortUniqueId;
11-
identityMap: WeakMap<T, StringElement>;
7+
export class IdentityManager {
8+
protected readonly uuid: ShortUniqueId;
129

13-
identify(this: IdentityManager<T>, element: T): StringElement;
14-
forget(this: IdentityManager<T>, element: T): boolean;
15-
generateId(this: IdentityManager<T>): string;
16-
}
10+
protected readonly identityMap: WeakMap<Element, StringElement>;
1711

18-
// @TODO([email protected]): transforming this stamp to class will break backward compatibility
19-
export const IdentityManager: stampit.Stamp<IdentityManager> = stampit({
20-
props: {
21-
uuid: null,
22-
length: null,
23-
identityMap: null,
24-
},
25-
init(this: IdentityManager, { length = 6 } = {}) {
26-
this.length = 6;
12+
constructor({ length = 6 } = {}) {
2713
this.uuid = new ShortUniqueId({ length });
2814
this.identityMap = new WeakMap();
29-
},
30-
methods: {
31-
identify<T extends Element>(this: IdentityManager, element: T): StringElement {
32-
if (!isElement(element)) {
33-
throw new ElementIdentityError(
34-
'Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.',
35-
{
36-
value: element,
37-
},
38-
);
39-
}
40-
41-
// use already assigned identity
42-
if (
43-
element.meta.hasKey('id') &&
44-
isStringElement(element.meta.get('id')) &&
45-
!element.meta.get('id').equals('')
46-
) {
47-
return element.id;
48-
}
49-
50-
// assign identity in immutable way
51-
if (this.identityMap.has(element)) {
52-
return this.identityMap.get(element)!;
53-
}
54-
55-
// return element identity
56-
const id = new StringElement(this.generateId());
57-
this.identityMap.set(element, id);
58-
return id;
59-
},
60-
61-
forget<T extends Element>(this: IdentityManager, element: T): boolean {
62-
if (this.identityMap.has(element)) {
63-
this.identityMap.delete(element);
64-
return true;
65-
}
66-
return false;
67-
},
68-
69-
generateId(this: IdentityManager): string {
70-
return this.uuid.randomUUID();
71-
},
72-
},
73-
});
15+
}
16+
17+
identify<T extends Element>(this: IdentityManager, element: T): StringElement {
18+
if (!isElement(element)) {
19+
throw new ElementIdentityError(
20+
'Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.',
21+
{
22+
value: element,
23+
},
24+
);
25+
}
26+
27+
// use already assigned identity
28+
if (
29+
element.meta.hasKey('id') &&
30+
isStringElement(element.meta.get('id')) &&
31+
!element.meta.get('id').equals('')
32+
) {
33+
return element.id;
34+
}
35+
36+
// assign identity in immutable way
37+
if (this.identityMap.has(element)) {
38+
return this.identityMap.get(element)!;
39+
}
40+
41+
// return element identity
42+
const id = new StringElement(this.generateId());
43+
this.identityMap.set(element, id);
44+
return id;
45+
}
46+
47+
forget<T extends Element>(element: T): boolean {
48+
if (this.identityMap.has(element)) {
49+
this.identityMap.delete(element);
50+
return true;
51+
}
52+
return false;
53+
}
54+
55+
generateId() {
56+
return this.uuid.randomUUID();
57+
}
58+
}
7459

75-
export const defaultIdentityManager = IdentityManager({ length: 6 });
60+
export const defaultIdentityManager = new IdentityManager();

packages/apidom-core/src/refractor/plugins/element-identity.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const plugin =
1313

1414
return {
1515
pre() {
16-
identityManager = IdentityManager({ length });
16+
identityManager = new IdentityManager({ length });
1717
},
1818
visitor: {
1919
enter<T extends Element>(element: T) {

packages/apidom-core/src/refractor/plugins/semantic-element-identity.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const plugin =
1818

1919
return {
2020
pre() {
21-
identityManager = IdentityManager({ length });
21+
identityManager = new IdentityManager({ length });
2222
},
2323
visitor: {
2424
enter<T extends Element>(element: T) {

packages/apidom-reference/src/dereference/strategies/asyncapi-2/visitor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import Reference from '../../../Reference';
3939
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
4040

4141
// initialize element identity manager
42-
const identityManager = IdentityManager();
42+
const identityManager = new IdentityManager();
4343

4444
const AsyncApi2DereferenceVisitor = stampit({
4545
props: {

packages/apidom-reference/src/dereference/strategies/openapi-2/visitor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import Reference from '../../../Reference';
4040
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
4141

4242
// initialize element identity manager
43-
const identityManager = IdentityManager();
43+
const identityManager = new IdentityManager();
4444

4545
const OpenApi2DereferenceVisitor = stampit({
4646
props: {

packages/apidom-reference/src/dereference/strategies/openapi-3-0/visitor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import { AncestorLineage } from '../../util';
4343
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
4444

4545
// initialize element identity manager
46-
const identityManager = IdentityManager();
46+
const identityManager = new IdentityManager();
4747

4848
// eslint-disable-next-line @typescript-eslint/naming-convention
4949
const OpenApi3_0DereferenceVisitor = stampit({

packages/apidom-reference/src/dereference/strategies/openapi-3-1/visitor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import EvaluationJsonSchemaUriError from '../../../errors/EvaluationJsonSchemaUr
5353
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
5454

5555
// initialize element identity manager
56-
const identityManager = IdentityManager();
56+
const identityManager = new IdentityManager();
5757

5858
// eslint-disable-next-line @typescript-eslint/naming-convention
5959
const OpenApi3_1DereferenceVisitor = stampit({

0 commit comments

Comments
 (0)