Skip to content

Commit 4d4696b

Browse files
committed
fix(reference): allow resolution on other elements than ParseResult
Refs #476
1 parent 0b099ee commit 4d4696b

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

apidom/packages/apidom-reference/src/resolve/index.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { isEmpty } from 'ramda';
2-
import { Element } from 'apidom';
2+
import { Element, isParseResultElement, ParseResultElement } from 'apidom';
33

44
import { merge as mergeOptions } from '../options/util';
55
import { ReferenceOptions as IReferenceOptions, ReferenceSet as IReferenceSet } from '../types';
@@ -15,16 +15,28 @@ export const resolveApiDOM = async <T extends Element>(
1515
element: T,
1616
options: IReferenceOptions,
1717
): Promise<IReferenceSet> => {
18+
let parseResult: ParseResultElement;
19+
20+
// wrap element into parse result and temporary mutate it with `result` metadata
21+
if (!isParseResultElement(element)) {
22+
element.classes.push('result');
23+
parseResult = new ParseResultElement([element]);
24+
} else {
25+
// @ts-ignore
26+
parseResult = element;
27+
}
28+
1829
const file = File({
1930
uri: options.resolve.baseURI,
20-
parseResult: element,
31+
parseResult,
2132
mediaType: options.parse.mediaType,
2233
});
2334

2435
const resolveStrategies = plugins.filter('canResolve', file, options.resolve.strategies);
2536

2637
// we couldn't find any resolver for this File
2738
if (isEmpty(resolveStrategies)) {
39+
element.classes.content.pop();
2840
throw new UnmatchedResolveStrategyError(file.uri);
2941
}
3042

@@ -33,6 +45,8 @@ export const resolveApiDOM = async <T extends Element>(
3345
return result;
3446
} catch (error) {
3547
throw new ResolverError(`Error while resolving file "${file.uri}"`, error);
48+
} finally {
49+
element.classes.content.pop();
3650
}
3751
};
3852

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const OpenApi3_1ResolveStrategy: stampit.Stamp<IResolveStrategy> = stampit(Resol
3535
}
3636

3737
// assert by inspecting ApiDOM
38-
return isOpenApi3_1Element(file.parseResult?.api);
38+
return isOpenApi3_1Element(file.parseResult?.result);
3939
},
4040

4141
async resolve(file: IFile, options: IReferenceOptions) {

apidom/packages/apidom-reference/test/dereference/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ describe('dereference', function () {
4848

4949
// @ts-ignore
5050
const actual = await dereferenceApiDOM(api, {
51-
parse: { mediaType: 'application/vnd.oai.openapi+json;version=3.1.0' },
5251
resolve: { baseURI: rootFilePath },
5352
});
5453

apidom/packages/apidom-reference/test/resolve/index.ts

+23-7
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,31 @@ describe('resolve', function () {
2929
});
3030

3131
context('resolveApiDOM', function () {
32-
specify('should resolve an ApiDOM fragment', async function () {
33-
const fragment = await parse(rootFilePath, {
34-
parse: { mediaType: 'application/vnd.oai.openapi+json;version=3.1.0' },
35-
});
36-
const refSet = await resolveApiDOM(fragment, {
37-
resolve: { baseURI: rootFilePath },
32+
context('given fragment is instance of ParseResultElement', function () {
33+
specify('should resolve an ApiDOM fragment', async function () {
34+
const fragment = await parse(rootFilePath, {
35+
parse: { mediaType: 'application/vnd.oai.openapi+json;version=3.1.0' },
36+
});
37+
const refSet = await resolveApiDOM(fragment, {
38+
resolve: { baseURI: rootFilePath },
39+
});
40+
41+
assert.strictEqual(refSet.size, 2);
3842
});
43+
});
3944

40-
assert.strictEqual(refSet.size, 2);
45+
context("given fragment isn't instance of ParseResultElement", function () {
46+
specify('should resolve an ApiDOM fragment', async function () {
47+
const { api } = await parse(rootFilePath, {
48+
parse: { mediaType: 'application/vnd.oai.openapi+json;version=3.1.0' },
49+
});
50+
// @ts-ignore
51+
const refSet = await resolveApiDOM(api, {
52+
resolve: { baseURI: rootFilePath },
53+
});
54+
55+
assert.strictEqual(refSet.size, 2);
56+
});
4157
});
4258
});
4359
});

0 commit comments

Comments
 (0)