Skip to content

Commit a622ed9

Browse files
committed
feat: expose an option to support custom resolver resolution.
This feature exposes two separate entry points for creating a resolver, one using the makeCustomResolver() option and another for advanced users that want more or need more control over the resolution process, which allows users to extend the resolver class if needed. fixes #587
1 parent 8eb2315 commit a622ed9

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

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

Lines changed: 25 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,29 @@ 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 custom resolver option", async ()=> {
262+
const resolver = makeCustomResolver({"handler":
263+
async (uri: string): Promise<JSONSchema> => {
264+
return {}
265+
}
266+
});
267+
const document = await parseOpenRPCDocument(workingDocument,{
268+
dereference: true,
269+
resolver
270+
});
271+
expect(document.methods).toBeDefined();
272+
273+
});
274+
251275
it("rejects when the json provided is invalid from file", async () => {
252276
expect.assertions(1);
253277
fs.readJson.mockClear();

src/parse-open-rpc-document.ts

Lines changed: 19 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,11 +36,19 @@ 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 = {
4049
dereference: true,
4150
validate: true,
51+
resolver: defaultResolver
4252
};
4353

4454
const makeParseOpenRPCDocument = (fetchUrlSchema: TGetOpenRPCDocument, readSchemaFromFile: TGetOpenRPCDocument) => {
@@ -105,7 +115,11 @@ const makeParseOpenRPCDocument = (fetchUrlSchema: TGetOpenRPCDocument, readSchem
105115

106116
let postDeref: OpenrpcDocument = parsedSchema;
107117
if (parseOptions.dereference) {
108-
postDeref = await dereferenceDocument(parsedSchema, defaultResolver);
118+
if(parseOptions.resolver){
119+
postDeref = await dereferenceDocument(parsedSchema, parseOptions.resolver);
120+
}else {
121+
postDeref = await dereferenceDocument(parsedSchema, defaultResolver);
122+
}
109123
}
110124

111125
if (parseOptions.validate) {
@@ -119,4 +133,8 @@ const makeParseOpenRPCDocument = (fetchUrlSchema: TGetOpenRPCDocument, readSchem
119133
};
120134
};
121135

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

0 commit comments

Comments
 (0)