Skip to content

Commit aeb195b

Browse files
committed
feat(reference): change ReferenceSet from stamp to TypeScript class (#4100)
Refs #3481 BREAKING CHANGE: ReferenceSet from apidom-reference package became a class and requires to be instantiated with new operator.
1 parent 88f859c commit aeb195b

File tree

21 files changed

+128
-133
lines changed

21 files changed

+128
-133
lines changed

packages/apidom-converter/src/strategies/openapi-3-1-to-openapi-3-0-3/refractor-plugins/security-scheme-type.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ const securitySchemeTypeRefractorPlugin =
7777
uri: `${baseURI}#reference`,
7878
value: new ParseResultElement([referenceElement]),
7979
});
80-
const refSet = ReferenceSet({ refs: [reference, rootReference] });
80+
const refSet = new ReferenceSet({ refs: [reference, rootReference] });
8181
// eslint-disable-next-line no-await-in-loop
8282
const dereferenced = await dereferenceApiDOM(referenceElement, {
8383
resolve: { baseURI: reference.uri },

packages/apidom-ls/src/services/validation/validation-service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ export class DefaultValidationService implements ValidationService {
242242
uri: `${baseURI}#reference${fragmentId}`,
243243
value: refEl,
244244
});
245-
const refSet = ReferenceSet({ refs: [referenceElementReference, apiReference] });
245+
const refSet = new ReferenceSet({ refs: [referenceElementReference, apiReference] });
246246

247247
try {
248248
const promise = dereferenceApiDOM(refEl, {
@@ -344,7 +344,7 @@ export class DefaultValidationService implements ValidationService {
344344
uri: `${baseURI}#reference${fragmentId}`,
345345
value: refEl,
346346
});
347-
const refSet = ReferenceSet({ refs: [referenceElementReference, apiReference] });
347+
const refSet = new ReferenceSet({ refs: [referenceElementReference, apiReference] });
348348

349349
try {
350350
// eslint-disable-next-line no-await-in-loop

packages/apidom-reference/src/Reference.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Element } from '@swagger-api/apidom-core';
22

3-
import { ReferenceSet } from './types';
3+
import ReferenceSet from './ReferenceSet';
44

55
export interface ReferenceOptions<T = Element> {
66
readonly uri: string;
+60-56
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,67 @@
1-
import stampit from 'stampit';
2-
import { propEq } from 'ramda';
31
import { isNotUndefined, isString } from 'ramda-adjunct';
42

5-
import { ReferenceSet as IReferenceSet } from './types';
63
import type Reference from './Reference';
74

8-
const ReferenceSet: stampit.Stamp<IReferenceSet> = stampit({
9-
props: {
10-
rootRef: null,
11-
refs: [],
12-
circular: false,
13-
},
14-
init({ refs = [] } = {}) {
5+
export interface ReferenceSetOptions {
6+
readonly refs?: Reference[];
7+
readonly circular?: boolean;
8+
}
9+
10+
class ReferenceSet {
11+
public rootRef?: Reference;
12+
13+
public readonly refs: Reference[];
14+
15+
public readonly circular: boolean;
16+
17+
constructor({ refs = [], circular = false }: ReferenceSetOptions = {}) {
1518
this.refs = [];
16-
refs.forEach((ref: Reference) => this.add(ref));
17-
},
18-
methods: {
19-
get size(): number {
20-
// @ts-ignore
21-
return this.refs.length;
22-
},
23-
24-
add(reference: Reference): IReferenceSet {
25-
if (!this.has(reference)) {
26-
this.refs.push(reference);
27-
this.rootRef = this.rootRef === null ? reference : this.rootRef;
28-
reference.refSet = this; // eslint-disable-line no-param-reassign
29-
}
30-
return this;
31-
},
32-
33-
merge(anotherRefSet: IReferenceSet): IReferenceSet {
34-
for (const reference of anotherRefSet.values()) {
35-
this.add(reference);
36-
}
37-
return this;
38-
},
39-
40-
has(thing: string | Reference): boolean {
41-
const uri = isString(thing) ? thing : thing.uri;
42-
return isNotUndefined(this.find(propEq(uri, 'uri')));
43-
},
44-
45-
find(callback): Reference | undefined {
46-
return this.refs.find(callback);
47-
},
48-
49-
*values() {
50-
yield* this.refs;
51-
},
52-
53-
clean() {
54-
this.refs.forEach((ref: Reference) => {
55-
ref.refSet = undefined; // eslint-disable-line no-param-reassign
56-
});
57-
this.rootRef = null;
58-
this.refs = [];
59-
},
60-
},
61-
});
19+
this.circular = circular;
20+
refs.forEach(this.add.bind(this));
21+
}
22+
23+
get size(): number {
24+
return this.refs.length;
25+
}
26+
27+
add(reference: Reference): this {
28+
if (!this.has(reference)) {
29+
this.refs.push(reference);
30+
this.rootRef = this.rootRef === undefined ? reference : this.rootRef;
31+
reference.refSet = this; // eslint-disable-line no-param-reassign
32+
}
33+
return this;
34+
}
35+
36+
merge(anotherRefSet: this): this {
37+
for (const reference of anotherRefSet.values()) {
38+
this.add(reference);
39+
}
40+
return this;
41+
}
42+
43+
has(thing: string | Reference): boolean {
44+
const uri = isString(thing) ? thing : thing.uri;
45+
return isNotUndefined(this.find((ref: Reference) => ref.uri === uri));
46+
}
47+
48+
find(
49+
predicate: (value: Reference, index: number, obj: Reference[]) => boolean,
50+
): Reference | undefined {
51+
return this.refs.find(predicate);
52+
}
53+
54+
*values() {
55+
yield* this.refs;
56+
}
57+
58+
clean() {
59+
this.refs.forEach((ref: Reference) => {
60+
ref.refSet = undefined; // eslint-disable-line no-param-reassign
61+
});
62+
this.rootRef = undefined;
63+
this.refs.length = 0;
64+
}
65+
}
6266

6367
export default ReferenceSet;

packages/apidom-reference/src/dereference/strategies/apidom/index.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ const ApiDOMDereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit(
2828
},
2929

3030
async dereference(file: File, options: IReferenceOptions): Promise<Element> {
31-
const immutableRefSet = options.dereference.refSet ?? ReferenceSet();
32-
const mutableRefsSet = ReferenceSet();
31+
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
32+
const mutableRefSet = new ReferenceSet();
3333
let refSet = immutableRefSet;
3434
let reference;
3535

@@ -55,19 +55,19 @@ const ApiDOMDereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit(
5555
value: cloneDeep(ref.value),
5656
}),
5757
)
58-
.forEach((ref) => mutableRefsSet.add(ref));
59-
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
60-
refSet = mutableRefsSet;
58+
.forEach((ref) => mutableRefSet.add(ref));
59+
reference = mutableRefSet.find((ref) => ref.uri === file.uri);
60+
refSet = mutableRefSet;
6161
}
6262

6363
const visitor = ApiDOMDereferenceVisitor({ reference, options });
64-
const dereferencedElement = await visitAsync(refSet.rootRef.value, visitor);
64+
const dereferencedElement = await visitAsync(refSet.rootRef!.value, visitor);
6565

6666
/**
6767
* If immutable option is set, replay refs from the refSet.
6868
*/
6969
if (options.dereference.immutable) {
70-
mutableRefsSet.refs
70+
mutableRefSet.refs
7171
.filter((ref) => ref.uri.startsWith('immutable://'))
7272
.map(
7373
(ref) =>
@@ -89,7 +89,7 @@ const ApiDOMDereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit(
8989
immutableRefSet.clean();
9090
}
9191

92-
mutableRefsSet.clean();
92+
mutableRefSet.clean();
9393

9494
return dereferencedElement;
9595
},

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ const AsyncApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampi
3939

4040
async dereference(file: File, options: IReferenceOptions): Promise<Element> {
4141
const namespace = createNamespace(asyncApi2Namespace);
42-
const immutableRefSet = options.dereference.refSet ?? ReferenceSet();
43-
const mutableRefsSet = ReferenceSet();
42+
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
43+
const mutableRefSet = new ReferenceSet();
4444
let refSet = immutableRefSet;
4545
let reference;
4646

@@ -65,13 +65,13 @@ const AsyncApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampi
6565
value: cloneDeep(ref.value),
6666
}),
6767
)
68-
.forEach((ref) => mutableRefsSet.add(ref));
69-
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
70-
refSet = mutableRefsSet;
68+
.forEach((ref) => mutableRefSet.add(ref));
69+
reference = mutableRefSet.find((ref) => ref.uri === file.uri);
70+
refSet = mutableRefSet;
7171
}
7272

7373
const visitor = AsyncApi2DereferenceVisitor({ reference, namespace, options });
74-
const dereferencedElement = await visitAsync(refSet.rootRef.value, visitor, {
74+
const dereferencedElement = await visitAsync(refSet.rootRef!.value, visitor, {
7575
keyMap,
7676
nodeTypeGetter: getNodeType,
7777
});
@@ -80,7 +80,7 @@ const AsyncApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampi
8080
* If immutable option is set, replay refs from the refSet.
8181
*/
8282
if (options.dereference.immutable) {
83-
mutableRefsSet.refs
83+
mutableRefSet.refs
8484
.filter((ref) => ref.uri.startsWith('immutable://'))
8585
.map(
8686
(ref) =>
@@ -102,7 +102,7 @@ const AsyncApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampi
102102
immutableRefSet.clean();
103103
}
104104

105-
mutableRefsSet.clean();
105+
mutableRefSet.clean();
106106

107107
return dereferencedElement;
108108
},

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ const OpenApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit
3939

4040
async dereference(file: File, options: IReferenceOptions): Promise<Element> {
4141
const namespace = createNamespace(openApi2Namespace);
42-
const immutableRefSet = options.dereference.refSet ?? ReferenceSet();
43-
const mutableRefsSet = ReferenceSet();
42+
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
43+
const mutableRefSet = new ReferenceSet();
4444
let refSet = immutableRefSet;
4545
let reference;
4646

@@ -65,13 +65,13 @@ const OpenApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit
6565
value: cloneDeep(ref.value),
6666
}),
6767
)
68-
.forEach((ref) => mutableRefsSet.add(ref));
69-
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
70-
refSet = mutableRefsSet;
68+
.forEach((ref) => mutableRefSet.add(ref));
69+
reference = mutableRefSet.find((ref) => ref.uri === file.uri);
70+
refSet = mutableRefSet;
7171
}
7272

7373
const visitor = OpenApi2DereferenceVisitor({ reference, namespace, options });
74-
const dereferencedElement = await visitAsync(refSet.rootRef.value, visitor, {
74+
const dereferencedElement = await visitAsync(refSet.rootRef!.value, visitor, {
7575
keyMap,
7676
nodeTypeGetter: getNodeType,
7777
});
@@ -80,7 +80,7 @@ const OpenApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit
8080
* If immutable option is set, replay refs from the refSet.
8181
*/
8282
if (options.dereference.immutable) {
83-
mutableRefsSet.refs
83+
mutableRefSet.refs
8484
.filter((ref) => ref.uri.startsWith('immutable://'))
8585
.map(
8686
(ref) =>
@@ -102,7 +102,7 @@ const OpenApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit
102102
immutableRefSet.clean();
103103
}
104104

105-
mutableRefsSet.clean();
105+
mutableRefSet.clean();
106106

107107
return dereferencedElement;
108108
},

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ const OpenApi3_0DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
4040

4141
async dereference(file: File, options: IReferenceOptions): Promise<Element> {
4242
const namespace = createNamespace(openApi3_0Namespace);
43-
const immutableRefSet = options.dereference.refSet ?? ReferenceSet();
44-
const mutableRefsSet = ReferenceSet();
43+
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
44+
const mutableRefSet = new ReferenceSet();
4545
let refSet = immutableRefSet;
4646
let reference;
4747

@@ -67,13 +67,13 @@ const OpenApi3_0DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
6767
value: cloneDeep(ref.value),
6868
}),
6969
)
70-
.forEach((ref) => mutableRefsSet.add(ref));
71-
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
72-
refSet = mutableRefsSet;
70+
.forEach((ref) => mutableRefSet.add(ref));
71+
reference = mutableRefSet.find((ref) => ref.uri === file.uri);
72+
refSet = mutableRefSet;
7373
}
7474

7575
const visitor = OpenApi3_0DereferenceVisitor({ reference, namespace, options });
76-
const dereferencedElement = await visitAsync(refSet.rootRef.value, visitor, {
76+
const dereferencedElement = await visitAsync(refSet.rootRef!.value, visitor, {
7777
keyMap,
7878
nodeTypeGetter: getNodeType,
7979
});
@@ -82,7 +82,7 @@ const OpenApi3_0DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
8282
* If immutable option is set, replay refs from the refSet.
8383
*/
8484
if (options.dereference.immutable) {
85-
mutableRefsSet.refs
85+
mutableRefSet.refs
8686
.filter((ref) => ref.uri.startsWith('immutable://'))
8787
.map(
8888
(ref) =>
@@ -104,7 +104,7 @@ const OpenApi3_0DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
104104
immutableRefSet.clean();
105105
}
106106

107-
mutableRefsSet.clean();
107+
mutableRefSet.clean();
108108

109109
return dereferencedElement;
110110
},

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ const OpenApi3_1DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
4141

4242
async dereference(file: File, options: IReferenceOptions): Promise<Element> {
4343
const namespace = createNamespace(openApi3_1Namespace);
44-
const immutableRefSet = options.dereference.refSet ?? ReferenceSet();
45-
const mutableRefsSet = ReferenceSet();
44+
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
45+
const mutableRefSet = new ReferenceSet();
4646
let refSet = immutableRefSet;
4747
let reference;
4848

@@ -67,13 +67,13 @@ const OpenApi3_1DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
6767
value: cloneDeep(ref.value),
6868
}),
6969
)
70-
.forEach((ref) => mutableRefsSet.add(ref));
71-
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
72-
refSet = mutableRefsSet;
70+
.forEach((ref) => mutableRefSet.add(ref));
71+
reference = mutableRefSet.find((ref) => ref.uri === file.uri);
72+
refSet = mutableRefSet;
7373
}
7474

7575
const visitor = OpenApi3_1DereferenceVisitor({ reference, namespace, options });
76-
const dereferencedElement = await visitAsync(refSet.rootRef.value, visitor, {
76+
const dereferencedElement = await visitAsync(refSet.rootRef!.value, visitor, {
7777
keyMap,
7878
nodeTypeGetter: getNodeType,
7979
});
@@ -82,7 +82,7 @@ const OpenApi3_1DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
8282
* If immutable option is set, replay refs from the refSet.
8383
*/
8484
if (options.dereference.immutable) {
85-
mutableRefsSet.refs
85+
mutableRefSet.refs
8686
.filter((ref) => ref.uri.startsWith('immutable://'))
8787
.map(
8888
(ref) =>
@@ -104,7 +104,7 @@ const OpenApi3_1DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stamp
104104
immutableRefSet.clean();
105105
}
106106

107-
mutableRefsSet.clean();
107+
mutableRefSet.clean();
108108

109109
return dereferencedElement;
110110
},

0 commit comments

Comments
 (0)