From 794a8ce0bb22519af0c04992df74e2da7cabc09c Mon Sep 17 00:00:00 2001 From: Zachary Belford Date: Mon, 2 Nov 2020 11:54:17 -0800 Subject: [PATCH 1/3] fix: refactor code into shared method --- src/reference-resolver.ts | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/reference-resolver.ts b/src/reference-resolver.ts index 8d2b915..2e48f4b 100644 --- a/src/reference-resolver.ts +++ b/src/reference-resolver.ts @@ -121,19 +121,23 @@ export default (fetch: any, fs: any) => { return new Promise((resolve) => fs.readFile(f, "utf8", (err: any, data: any) => resolve(data))); }; + const resolvePointer = (ref: string, root: any): any => { + try { + const withoutHash = ref.replace("#", ""); + const pointer = Ptr.parse(withoutHash); + return pointer.eval(root); + } catch (e) { + throw new InvalidJsonPointerRefError({ $ref: ref }); + } + }; + /** * Given a $ref string, it will return the underlying pointed-to value. * For remote references, the root object is not used. */ const resolveReference = async (ref: string, root: any): Promise => { if (ref[0] === "#") { - const withoutHash = ref.replace("#", ""); - try { - const pointer = Ptr.parse(withoutHash); - return Promise.resolve(pointer.eval(root)); - } catch (e) { - throw new InvalidJsonPointerRefError({ $ref: ref }); - } + return resolvePointer(ref, root); } const hashFragmentSplit = ref.split("#"); @@ -142,10 +146,7 @@ export default (fetch: any, fs: any) => { hashFragment = hashFragmentSplit[hashFragmentSplit.length - 1]; } - let hashlessRef = ref; - if (hashFragment) { - hashlessRef = ref.replace(`#${hashFragment}`, ""); - } + const hashlessRef = hashFragmentSplit[0]; if (await fileExistsAndReadable(hashlessRef) === true) { const fileContents = await readFile(hashlessRef); @@ -157,12 +158,7 @@ export default (fetch: any, fs: any) => { } if (hashFragment) { - try { - const pointer = Ptr.parse(hashFragment); - return Promise.resolve(pointer.eval(reffedSchema)); - } catch (e) { - throw new InvalidJsonPointerRefError({ $ref: ref }); - } + reffedSchema = resolvePointer(hashFragment, reffedSchema); } return reffedSchema; @@ -178,12 +174,7 @@ export default (fetch: any, fs: any) => { } if (hashFragment) { - try { - const pointer = Ptr.parse(hashFragment); - return Promise.resolve(pointer.eval(result)); - } catch (e) { - throw new InvalidJsonPointerRefError({ $ref: ref }); - } + result = resolvePointer(hashFragment, result); } return result; From f278761c9c934a38de415c9756f2c40b29c8d1cd Mon Sep 17 00:00:00 2001 From: Zachary Belford Date: Mon, 2 Nov 2020 11:55:49 -0800 Subject: [PATCH 2/3] fix: use hashless ref for urls --- src/reference-resolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reference-resolver.ts b/src/reference-resolver.ts index 2e48f4b..4960124 100644 --- a/src/reference-resolver.ts +++ b/src/reference-resolver.ts @@ -168,7 +168,7 @@ export default (fetch: any, fs: any) => { let result; try { - result = await fetch(ref).then((r: any) => r.json()); + result = await fetch(hashlessRef).then((r: any) => r.json()); } catch (e) { throw new InvalidRemoteURLError(ref); } From 772302da07e808f56053be7cde679e6aa52bd8a9 Mon Sep 17 00:00:00 2001 From: Zachary Belford Date: Mon, 2 Nov 2020 12:03:34 -0800 Subject: [PATCH 3/3] fix: return a promise once again --- src/reference-resolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reference-resolver.ts b/src/reference-resolver.ts index 4960124..7107f6a 100644 --- a/src/reference-resolver.ts +++ b/src/reference-resolver.ts @@ -137,7 +137,7 @@ export default (fetch: any, fs: any) => { */ const resolveReference = async (ref: string, root: any): Promise => { if (ref[0] === "#") { - return resolvePointer(ref, root); + return Promise.resolve(resolvePointer(ref, root)); } const hashFragmentSplit = ref.split("#");