Skip to content

Commit 88f859c

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

File tree

19 files changed

+136
-126
lines changed

19 files changed

+136
-126
lines changed

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,15 @@ const securitySchemeTypeRefractorPlugin =
6565
* to Security Scheme Objects that are going to be removed.
6666
*/
6767
const baseURI = url.cwd();
68-
const rootReference = Reference({ uri: baseURI, value: cloneDeep(parseResultElement!) });
68+
const rootReference = new Reference({
69+
uri: baseURI,
70+
value: cloneDeep(parseResultElement!),
71+
});
6972
for (const memberElement of element.securitySchemes) {
7073
if (!isReferenceElement(memberElement.value)) continue; // eslint-disable-line no-continue
7174

7275
const { value: referenceElement } = memberElement;
73-
const reference = Reference({
76+
const reference = new Reference({
7477
uri: `${baseURI}#reference`,
7578
value: new ParseResultElement([referenceElement]),
7679
});

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,11 @@ export class DefaultValidationService implements ValidationService {
234234
const baseURI = validationContext?.baseURI
235235
? validationContext?.baseURI
236236
: 'https://smartbear.com/';
237-
const apiReference = Reference({ uri: baseURI, value: cloneDeep(result) });
237+
const apiReference = new Reference({ uri: baseURI, value: cloneDeep(result)! });
238238
const cachedParsers = options.parse.parsers.map(DefaultValidationService.createCachedParser);
239239

240240
for (const [fragmentId, refEl] of refElements.entries()) {
241-
const referenceElementReference = Reference({
241+
const referenceElementReference = new Reference({
242242
uri: `${baseURI}#reference${fragmentId}`,
243243
value: refEl,
244244
});
@@ -336,11 +336,11 @@ export class DefaultValidationService implements ValidationService {
336336
const baseURI = validationContext?.baseURI
337337
? validationContext?.baseURI
338338
: 'https://smartbear.com/';
339-
const apiReference = Reference({ uri: baseURI, value: cloneDeep(result) });
339+
const apiReference = new Reference({ uri: baseURI, value: cloneDeep(result) });
340340
const cachedParsers = options.parse.parsers.map(DefaultValidationService.createCachedParser);
341341

342342
for (const [fragmentId, refEl] of refElements.entries()) {
343-
const referenceElementReference = Reference({
343+
const referenceElementReference = new Reference({
344344
uri: `${baseURI}#reference${fragmentId}`,
345345
value: refEl,
346346
});
+25-18
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
1-
import stampit from 'stampit';
2-
3-
import { Reference as IReference } from './types';
4-
5-
const Reference: stampit.Stamp<IReference> = stampit({
6-
props: {
7-
uri: '',
8-
value: null,
9-
depth: 0,
10-
refSet: null,
11-
errors: [],
12-
},
13-
init(
14-
this: IReference,
15-
{ depth = this.depth, refSet = this.refSet, uri = this.uri, value = this.value } = {},
16-
) {
1+
import { Element } from '@swagger-api/apidom-core';
2+
3+
import { ReferenceSet } from './types';
4+
5+
export interface ReferenceOptions<T = Element> {
6+
readonly uri: string;
7+
readonly depth?: number;
8+
readonly refSet?: ReferenceSet;
9+
readonly value: T;
10+
}
11+
12+
class Reference<T = Element> {
13+
public readonly uri: string;
14+
15+
public readonly depth: number;
16+
17+
public readonly value: T;
18+
19+
public refSet?: ReferenceSet;
20+
21+
public readonly errors: Array<Error>;
22+
23+
constructor({ uri, depth = 0, refSet, value }: ReferenceOptions<T>) {
1724
this.uri = uri;
1825
this.value = value;
1926
this.depth = depth;
2027
this.refSet = refSet;
2128
this.errors = [];
22-
},
23-
});
29+
}
30+
}
2431

2532
export default Reference;

packages/apidom-reference/src/ReferenceSet.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import stampit from 'stampit';
22
import { propEq } from 'ramda';
33
import { isNotUndefined, isString } from 'ramda-adjunct';
44

5-
import { Reference as IReference, ReferenceSet as IReferenceSet } from './types';
5+
import { ReferenceSet as IReferenceSet } from './types';
6+
import type Reference from './Reference';
67

78
const ReferenceSet: stampit.Stamp<IReferenceSet> = stampit({
89
props: {
@@ -12,15 +13,15 @@ const ReferenceSet: stampit.Stamp<IReferenceSet> = stampit({
1213
},
1314
init({ refs = [] } = {}) {
1415
this.refs = [];
15-
refs.forEach((ref: IReference) => this.add(ref));
16+
refs.forEach((ref: Reference) => this.add(ref));
1617
},
1718
methods: {
1819
get size(): number {
1920
// @ts-ignore
2021
return this.refs.length;
2122
},
2223

23-
add(reference: IReference): IReferenceSet {
24+
add(reference: Reference): IReferenceSet {
2425
if (!this.has(reference)) {
2526
this.refs.push(reference);
2627
this.rootRef = this.rootRef === null ? reference : this.rootRef;
@@ -36,12 +37,12 @@ const ReferenceSet: stampit.Stamp<IReferenceSet> = stampit({
3637
return this;
3738
},
3839

39-
has(thing: string | IReference): boolean {
40+
has(thing: string | Reference): boolean {
4041
const uri = isString(thing) ? thing : thing.uri;
4142
return isNotUndefined(this.find(propEq(uri, 'uri')));
4243
},
4344

44-
find(callback): IReference | undefined {
45+
find(callback): Reference | undefined {
4546
return this.refs.find(callback);
4647
},
4748

@@ -50,8 +51,8 @@ const ReferenceSet: stampit.Stamp<IReferenceSet> = stampit({
5051
},
5152

5253
clean() {
53-
this.refs.forEach((ref: IReference) => {
54-
ref.refSet = null; // eslint-disable-line no-param-reassign
54+
this.refs.forEach((ref: Reference) => {
55+
ref.refSet = undefined; // eslint-disable-line no-param-reassign
5556
});
5657
this.rootRef = null;
5758
this.refs = [];

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

+13-11
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const ApiDOMDereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit(
3535

3636
// determine the initial reference
3737
if (!immutableRefSet.has(file.uri)) {
38-
reference = Reference({ uri: file.uri, value: file.parseResult });
38+
reference = new Reference({ uri: file.uri, value: file.parseResult! });
3939
immutableRefSet.add(reference);
4040
} else {
4141
// pre-computed refSet was provided as configuration option
@@ -48,11 +48,12 @@ const ApiDOMDereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit(
4848
*/
4949
if (options.dereference.immutable) {
5050
immutableRefSet.refs
51-
.map((ref) =>
52-
Reference({
53-
...ref,
54-
value: cloneDeep(ref.value),
55-
}),
51+
.map(
52+
(ref) =>
53+
new Reference({
54+
...ref,
55+
value: cloneDeep(ref.value),
56+
}),
5657
)
5758
.forEach((ref) => mutableRefsSet.add(ref));
5859
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
@@ -68,11 +69,12 @@ const ApiDOMDereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit(
6869
if (options.dereference.immutable) {
6970
mutableRefsSet.refs
7071
.filter((ref) => ref.uri.startsWith('immutable://'))
71-
.map((ref) =>
72-
Reference({
73-
...ref,
74-
uri: ref.uri.replace(/^immutable:\/\//, ''),
75-
}),
72+
.map(
73+
(ref) =>
74+
new Reference({
75+
...ref,
76+
uri: ref.uri.replace(/^immutable:\/\//, ''),
77+
}),
7678
)
7779
.forEach((ref) => immutableRefSet.add(ref));
7880
reference = immutableRefSet.find((ref) => ref.uri === file.uri);

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
} from '@swagger-api/apidom-core';
1717
import { uriToPointer as uriToElementID } from '@swagger-api/apidom-json-pointer';
1818

19-
import { Reference as IReference } from '../../../types';
2019
import MaximumResolveDepthError from '../../../errors/MaximumResolveDepthError';
2120
import * as url from '../../../util/url';
2221
import parse from '../../../parse';
@@ -53,7 +52,7 @@ const ApiDOMDereferenceVisitor = stampit({
5352
return url.resolve(this.reference.uri, url.sanitize(url.stripHash(uri)));
5453
},
5554

56-
async toReference(uri: string): Promise<IReference> {
55+
async toReference(uri: string): Promise<Reference> {
5756
// detect maximum depth of resolution
5857
if (this.reference.depth >= this.options.resolve.maxDepth) {
5958
throw new MaximumResolveDepthError(
@@ -75,7 +74,7 @@ const ApiDOMDereferenceVisitor = stampit({
7574
});
7675

7776
// register new mutable reference with a refSet
78-
const mutableReference = Reference({
77+
const mutableReference = new Reference({
7978
uri: baseURI,
8079
value: cloneDeep(parseResult),
8180
depth: this.reference.depth + 1,
@@ -84,7 +83,7 @@ const ApiDOMDereferenceVisitor = stampit({
8483

8584
if (this.options.dereference.immutable) {
8685
// register new immutable reference with a refSet
87-
const immutableReference = Reference({
86+
const immutableReference = new Reference({
8887
uri: `immutable://${baseURI}`,
8988
value: parseResult,
9089
depth: this.reference.depth + 1,

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

+13-11
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const AsyncApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampi
4545
let reference;
4646

4747
if (!immutableRefSet.has(file.uri)) {
48-
reference = Reference({ uri: file.uri, value: file.parseResult });
48+
reference = new Reference({ uri: file.uri, value: file.parseResult! });
4949
immutableRefSet.add(reference);
5050
} else {
5151
// pre-computed refSet was provided as configuration option
@@ -58,11 +58,12 @@ const AsyncApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampi
5858
*/
5959
if (options.dereference.immutable) {
6060
immutableRefSet.refs
61-
.map((ref) =>
62-
Reference({
63-
...ref,
64-
value: cloneDeep(ref.value),
65-
}),
61+
.map(
62+
(ref) =>
63+
new Reference({
64+
...ref,
65+
value: cloneDeep(ref.value),
66+
}),
6667
)
6768
.forEach((ref) => mutableRefsSet.add(ref));
6869
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
@@ -81,11 +82,12 @@ const AsyncApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampi
8182
if (options.dereference.immutable) {
8283
mutableRefsSet.refs
8384
.filter((ref) => ref.uri.startsWith('immutable://'))
84-
.map((ref) =>
85-
Reference({
86-
...ref,
87-
uri: ref.uri.replace(/^immutable:\/\//, ''),
88-
}),
85+
.map(
86+
(ref) =>
87+
new Reference({
88+
...ref,
89+
uri: ref.uri.replace(/^immutable:\/\//, ''),
90+
}),
8991
)
9092
.forEach((ref) => immutableRefSet.add(ref));
9193
reference = immutableRefSet.find((ref) => ref.uri === file.uri);

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
ReferenceElement,
2828
} from '@swagger-api/apidom-ns-asyncapi-2';
2929

30-
import { Reference as IReference } from '../../../types';
3130
import MaximumDereferenceDepthError from '../../../errors/MaximumDereferenceDepthError';
3231
import MaximumResolveDepthError from '../../../errors/MaximumResolveDepthError';
3332
import { AncestorLineage } from '../../util';
@@ -70,7 +69,7 @@ const AsyncApi2DereferenceVisitor = stampit({
7069
return url.resolve(this.reference.uri, url.sanitize(url.stripHash(uri)));
7170
},
7271

73-
async toReference(uri: string): Promise<IReference> {
72+
async toReference(uri: string): Promise<Reference> {
7473
// detect maximum depth of resolution
7574
if (this.reference.depth >= this.options.resolve.maxDepth) {
7675
throw new MaximumResolveDepthError(
@@ -92,7 +91,7 @@ const AsyncApi2DereferenceVisitor = stampit({
9291
});
9392

9493
// register new mutable reference with a refSet
95-
const mutableReference = Reference({
94+
const mutableReference = new Reference({
9695
uri: baseURI,
9796
value: cloneDeep(parseResult),
9897
depth: this.reference.depth + 1,
@@ -101,7 +100,7 @@ const AsyncApi2DereferenceVisitor = stampit({
101100

102101
if (this.options.dereference.immutable) {
103102
// register new immutable reference with a refSet
104-
const immutableReference = Reference({
103+
const immutableReference = new Reference({
105104
uri: `immutable://${baseURI}`,
106105
value: parseResult,
107106
depth: this.reference.depth + 1,

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

+13-11
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const OpenApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit
4545
let reference;
4646

4747
if (!immutableRefSet.has(file.uri)) {
48-
reference = Reference({ uri: file.uri, value: file.parseResult });
48+
reference = new Reference({ uri: file.uri, value: file.parseResult! });
4949
immutableRefSet.add(reference);
5050
} else {
5151
// pre-computed refSet was provided as configuration option
@@ -58,11 +58,12 @@ const OpenApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit
5858
*/
5959
if (options.dereference.immutable) {
6060
immutableRefSet.refs
61-
.map((ref) =>
62-
Reference({
63-
...ref,
64-
value: cloneDeep(ref.value),
65-
}),
61+
.map(
62+
(ref) =>
63+
new Reference({
64+
...ref,
65+
value: cloneDeep(ref.value),
66+
}),
6667
)
6768
.forEach((ref) => mutableRefsSet.add(ref));
6869
reference = mutableRefsSet.find((ref) => ref.uri === file.uri);
@@ -81,11 +82,12 @@ const OpenApi2DereferenceStrategy: stampit.Stamp<IDereferenceStrategy> = stampit
8182
if (options.dereference.immutable) {
8283
mutableRefsSet.refs
8384
.filter((ref) => ref.uri.startsWith('immutable://'))
84-
.map((ref) =>
85-
Reference({
86-
...ref,
87-
uri: ref.uri.replace(/^immutable:\/\//, ''),
88-
}),
85+
.map(
86+
(ref) =>
87+
new Reference({
88+
...ref,
89+
uri: ref.uri.replace(/^immutable:\/\//, ''),
90+
}),
8991
)
9092
.forEach((ref) => immutableRefSet.add(ref));
9193
reference = immutableRefSet.find((ref) => ref.uri === file.uri);

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import {
2828
JSONReferenceElement,
2929
} from '@swagger-api/apidom-ns-openapi-2';
3030

31-
import { Reference as IReference } from '../../../types';
3231
import MaximumDereferenceDepthError from '../../../errors/MaximumDereferenceDepthError';
3332
import MaximumResolveDepthError from '../../../errors/MaximumResolveDepthError';
3433
import { AncestorLineage } from '../../util';
@@ -71,7 +70,7 @@ const OpenApi2DereferenceVisitor = stampit({
7170
return url.resolve(this.reference.uri, url.sanitize(url.stripHash(uri)));
7271
},
7372

74-
async toReference(uri: string): Promise<IReference> {
73+
async toReference(uri: string): Promise<Reference> {
7574
// detect maximum depth of resolution
7675
if (this.reference.depth >= this.options.resolve.maxDepth) {
7776
throw new MaximumResolveDepthError(
@@ -93,7 +92,7 @@ const OpenApi2DereferenceVisitor = stampit({
9392
});
9493

9594
// register new mutable reference with a refSet
96-
const mutableReference = Reference({
95+
const mutableReference = new Reference({
9796
uri: baseURI,
9897
value: cloneDeep(parseResult),
9998
depth: this.reference.depth + 1,
@@ -102,7 +101,7 @@ const OpenApi2DereferenceVisitor = stampit({
102101

103102
if (this.options.dereference.immutable) {
104103
// register new immutable reference with a refSet
105-
const immutableReference = Reference({
104+
const immutableReference = new Reference({
106105
uri: `immutable://${baseURI}`,
107106
value: parseResult,
108107
depth: this.reference.depth + 1,

0 commit comments

Comments
 (0)