Skip to content

Commit 6827197

Browse files
authored
Merge pull request #739 from open-rpc/feat/custom-resolver-option
feat: expose an option to support custom resolver resolution.
2 parents 8eb2315 + 3f765bc commit 6827197

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

src/parse-open-rpc-document.test.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ jest.mock("fs-extra", () => ({
44
}));
55

66
import * as _fs from "fs-extra";
7-
import makeParseOpenRPCDocument from "./parse-open-rpc-document";
7+
import makeParseOpenRPCDocument, { makeCustomResolver } from "./parse-open-rpc-document";
88
import { OpenrpcDocument as OpenRPC, OpenrpcDocument } from "@open-rpc/meta-schema";
99
import { OpenRPCDocumentValidationError } from "./validate-open-rpc-document";
1010
import fetchUrlSchema from "./get-open-rpc-document-from-url";
1111
import readSchemaFromFile from "./get-open-rpc-document-from-file";
1212
import { OpenRPCDocumentDereferencingError } from "./dereference-document";
13+
import { JSONSchema } from "@json-schema-tools/meta-schema";
1314

1415
const parseOpenRPCDocument = makeParseOpenRPCDocument(fetchUrlSchema, readSchemaFromFile);
1516
const fs: any = _fs;
@@ -248,6 +249,35 @@ describe("parseOpenRPCDocument", () => {
248249
}
249250
});
250251

252+
it("should make a reference resolver", ()=> {
253+
const resolver = makeCustomResolver({"file":
254+
async (): Promise<JSONSchema> => {
255+
return {}
256+
}
257+
});
258+
expect(resolver).toBeDefined()
259+
});
260+
261+
it("should handle dereference option true", async ()=> {
262+
const document = await parseOpenRPCDocument(workingDocument,{
263+
dereference: true,
264+
});
265+
expect(document.methods).toBeDefined();
266+
});
267+
268+
it("should handle custom resolver option", async ()=> {
269+
const resolver = makeCustomResolver({"handler":
270+
async (uri: string): Promise<JSONSchema> => {
271+
return {}
272+
}
273+
});
274+
const document = await parseOpenRPCDocument(workingDocument,{
275+
resolver
276+
});
277+
expect(document.methods).toBeDefined();
278+
279+
});
280+
251281
it("rejects when the json provided is invalid from file", async () => {
252282
expect.assertions(1);
253283
fs.readJson.mockClear();

src/parse-open-rpc-document.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import defaultResolver from "@json-schema-tools/reference-resolver"
44
import isUrl = require("is-url");
55
import { OpenrpcDocument } from "@open-rpc/meta-schema";
66
import { TGetOpenRPCDocument } from "./get-open-rpc-document";
7+
import ReferenceResolver, { ProtocolHandlerMap } from "@json-schema-tools/reference-resolver/build/reference-resolver";
8+
export { JSONSchema } from "@json-schema-tools/meta-schema";
79

810
/**
911
* @ignore
@@ -34,6 +36,13 @@ export interface ParseOpenRPCDocumentOptions {
3436
*
3537
*/
3638
dereference?: boolean;
39+
/*
40+
* Enable custom reference resolver. This will allow people to resolve 3rd party custom reference values like for ipfs.
41+
*
42+
* @default defaultReferenceResolver
43+
*
44+
*/
45+
resolver?: ReferenceResolver;
3746
}
3847

3948
const defaultParseOpenRPCDocumentOptions = {
@@ -105,7 +114,11 @@ const makeParseOpenRPCDocument = (fetchUrlSchema: TGetOpenRPCDocument, readSchem
105114

106115
let postDeref: OpenrpcDocument = parsedSchema;
107116
if (parseOptions.dereference) {
108-
postDeref = await dereferenceDocument(parsedSchema, defaultResolver);
117+
if (parseOptions.resolver !== undefined) {
118+
postDeref = await dereferenceDocument(parsedSchema, parseOptions.resolver);
119+
} else {
120+
postDeref = await dereferenceDocument(parsedSchema, defaultResolver);
121+
}
109122
}
110123

111124
if (parseOptions.validate) {
@@ -119,4 +132,8 @@ const makeParseOpenRPCDocument = (fetchUrlSchema: TGetOpenRPCDocument, readSchem
119132
};
120133
};
121134

135+
export function makeCustomResolver(protocolMapHandler: ProtocolHandlerMap): ReferenceResolver{
136+
return new ReferenceResolver(protocolMapHandler);
137+
}
138+
122139
export default makeParseOpenRPCDocument;

0 commit comments

Comments
 (0)