From 734be4c44142bfb5116f52b475c947f6224b5eb6 Mon Sep 17 00:00:00 2001 From: Ryan Baxley Date: Sat, 17 Mar 2018 00:48:40 -0400 Subject: [PATCH 1/5] Adding and/or --- src/helper.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/helper.ts b/src/helper.ts index 348331d..e66b375 100644 --- a/src/helper.ts +++ b/src/helper.ts @@ -3,3 +3,23 @@ import * as merge from "deepmerge"; // Helper function to combine multiple resolver definition hashes into a single hash for consumption by Apollostack's graphql-server export const combineResolvers = (resolvers = []) => resolvers .reduce((combined, resolver) => merge(combined, resolver)); + +export const and = (...conditions) => resolver => { + return conditions.reduceRight((p, c) => { + return c.createResolver(p); + }, resolver) +} + +export const or = (...conditions) => resolver => (...query) => { + return new Promise((resolve, reject) => { + let limit = conditions.length - 1; + const attempt = (i) => + conditions[limit - i].createResolver(resolver)(...query) + .then(res => resolve(res)) + .catch(err => { + if(i === limit) reject(err); + else attempt(i + 1); + }); + attempt(0); + }); +} \ No newline at end of file From ed0184d4ffa11544015bff086e4ee09d5a4a38f0 Mon Sep 17 00:00:00 2001 From: Ryan Baxley Date: Sun, 15 Apr 2018 14:00:09 -0400 Subject: [PATCH 2/5] Adding tests for and / or --- src/helper.ts | 2 +- test/unit/helper_spec.js | 125 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 125 insertions(+), 2 deletions(-) diff --git a/src/helper.ts b/src/helper.ts index e66b375..f097542 100644 --- a/src/helper.ts +++ b/src/helper.ts @@ -14,7 +14,7 @@ export const or = (...conditions) => resolver => (...query) => { return new Promise((resolve, reject) => { let limit = conditions.length - 1; const attempt = (i) => - conditions[limit - i].createResolver(resolver)(...query) + conditions[i].createResolver(resolver)(...query) .then(res => resolve(res)) .catch(err => { if(i === limit) reject(err); diff --git a/test/unit/helper_spec.js b/test/unit/helper_spec.js index 1006ed9..394f4f8 100644 --- a/test/unit/helper_spec.js +++ b/test/unit/helper_spec.js @@ -1,8 +1,10 @@ import { expect } from 'chai'; +import { stub } from 'sinon'; import { - combineResolvers + combineResolvers, and, or, } from '../../dist/helper'; +import { createResolver } from '../../dist/resolver'; describe('(unit) src/helper.js', () => { describe('combineResolvers', () => { @@ -51,4 +53,125 @@ describe('(unit) src/helper.js', () => { }); }) }); + + describe('Conditional resolvers', () => { + const conditionalErr = new Error('conditional error'); + const successResolver = createResolver(() => null, () => null); + const failureResolver = createResolver(() => { throw conditionalErr; }, () => null); + + describe('and', () => { + it('(true, true) succeeds', () => { + const resolver = and(successResolver, successResolver)(() => true); + return resolver().then(res => expect(res).to.be.true); + }); + + it('(false, true) throws', () => { + const resolver = and(failureResolver, successResolver)(() => true); + return resolver().catch(err => expect(err).to.equal(conditionalErr)); + }); + + it('(false, false) throws', () => { + const resolver = and(failureResolver, failureResolver)(() => true); + return resolver().catch(err => expect(err).to.equal(conditionalErr)); + }); + + it('stops evaluating resolvers after first failure', () => { + const r1 = { + handle: () => { throw conditionalErr }, + error: () => null, + }; + + const r2 = { + handle: () => null, + error: () => null, + }; + + stub(r1, 'handle', r1.handle); + stub(r2, 'handle', r2.handle); + + const resolver = or( + createResolver(r1.handle, r1.error), + createResolver(r2.handle, r2.error) + )(() => true); + return resolver().catch(err => { + expect(err).to.equal(conditionalErr) + expect(r1.handle.calledOnce).to.be.true; + expect(r2.handle.notCalled).to.be.true; + }); + }); + + it('only calls the result resolver once', () => { + const r1 = { + handle: () => true, + error: () => null, + }; + + stub(r1, 'handle', r1.handle); + + const resolver = and(successResolver, successResolver)(createResolver(r1.handle, r1.error)); + return resolver().then(res => { + expect(res).to.be.true; + expect(r1.handle.calledOnce).to.be.true; + }); + }); + }); + + describe('or', () => { + it('(true, true) succeeds', () => { + const resolver = or(successResolver, successResolver)(() => true); + return resolver().then(res => expect(res).to.be.true); + }); + + it('(false, true) succeeds', () => { + const resolver = or(failureResolver, successResolver)(() => true); + return resolver().then(res => expect(res).to.be.true); + }); + + it('(false, false) throws', () => { + const resolver = or(failureResolver, failureResolver)(() => true); + return resolver().catch(err => expect(err).to.equal(conditionalErr)); + }); + + it('stops evaluating resolvers after first success', () => { + const r1 = { + handle: () => null, + error: () => null, + }; + + const r2 = { + handle: () => null, + error: () => null, + }; + + stub(r1, 'handle', r1.handle); + stub(r2, 'handle', r2.handle); + + const resolver = or( + createResolver(r1.handle, r1.error), + createResolver(r2.handle, r2.error) + )(() => true); + return resolver().then(res => { + expect(res).to.be.true; + expect(r1.handle.calledOnce).to.be.true; + expect(r2.handle.notCalled).to.be.true; + }); + }); + + it('only calls the result resolver once', () => { + const r1 = { + handle: () => true, + error: () => null, + }; + + stub(r1, 'handle', r1.handle); + + const resolver = or(failureResolver, successResolver)(createResolver(r1.handle, r1.error)); + return resolver().then(res => { + expect(res).to.be.true; + expect(r1.handle.calledOnce).to.be.true; + }); + }); + }); + + }); }); From f3d3869f7f20452f8e2a64b6273b49fa2bb8dad4 Mon Sep 17 00:00:00 2001 From: Ryan Baxley Date: Sun, 15 Apr 2018 14:02:28 -0400 Subject: [PATCH 3/5] tsc --- dist/context.js.map | 2 +- dist/helper.d.ts | 2 ++ dist/helper.js | 19 +++++++++++++++++++ dist/helper.js.map | 2 +- dist/promise.js.map | 2 +- dist/resolver.js.map | 2 +- dist/util.js.map | 2 +- 7 files changed, 26 insertions(+), 5 deletions(-) diff --git a/dist/context.js.map b/dist/context.js.map index 5a2a43e..ad30cef 100644 --- a/dist/context.js.map +++ b/dist/context.js.map @@ -1 +1 @@ -{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAIhC,CAAC;AACW,QAAA,oBAAoB,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAChD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACR,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,oFAAoF,CAAC,CAAC;QAC7H,gEAAgE;QAChE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,CAAC,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;IAGE,YAAa,IAAiB;QAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,sEAAsE;QACtE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC;CACF;AAhBD,0BAgBC"} \ No newline at end of file +{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAIhC,CAAC;AACW,QAAA,oBAAoB,GAAG,CAAC,IAAI,EAAE,GAAG;IAC5C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACR,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,oFAAoF,CAAC,CAAC;QAC7H,gEAAgE;QAChE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,CAAC,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF;IAGE,YAAa,IAAiB;QAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG;YAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,sEAAsE;QACtE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3F,CAAC;CACF;AAhBD,0BAgBC"} \ No newline at end of file diff --git a/dist/helper.d.ts b/dist/helper.d.ts index bc3bb32..606f240 100644 --- a/dist/helper.d.ts +++ b/dist/helper.d.ts @@ -1 +1,3 @@ export declare const combineResolvers: (resolvers?: any[]) => any; +export declare const and: (...conditions: any[]) => (resolver: any) => any; +export declare const or: (...conditions: any[]) => (resolver: any) => (...query: any[]) => Promise<{}>; diff --git a/dist/helper.js b/dist/helper.js index e870612..41cf1f1 100644 --- a/dist/helper.js +++ b/dist/helper.js @@ -4,4 +4,23 @@ const merge = require("deepmerge"); // Helper function to combine multiple resolver definition hashes into a single hash for consumption by Apollostack's graphql-server exports.combineResolvers = (resolvers = []) => resolvers .reduce((combined, resolver) => merge(combined, resolver)); +exports.and = (...conditions) => resolver => { + return conditions.reduceRight((p, c) => { + return c.createResolver(p); + }, resolver); +}; +exports.or = (...conditions) => resolver => (...query) => { + return new Promise((resolve, reject) => { + let limit = conditions.length - 1; + const attempt = (i) => conditions[i].createResolver(resolver)(...query) + .then(res => resolve(res)) + .catch(err => { + if (i === limit) + reject(err); + else + attempt(i + 1); + }); + attempt(0); + }); +}; //# sourceMappingURL=helper.js.map \ No newline at end of file diff --git a/dist/helper.js.map b/dist/helper.js.map index cc9ac1d..f015f52 100644 --- a/dist/helper.js.map +++ b/dist/helper.js.map @@ -1 +1 @@ -{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AAEnC,oIAAoI;AACvH,QAAA,gBAAgB,GAAG,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,SAAS;KAC1D,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AAEnC,oIAAoI;AACvH,QAAA,gBAAgB,GAAG,CAAC,SAAS,GAAG,EAAE,KAAK,SAAS;KAC1D,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEhD,QAAA,GAAG,GAAG,CAAC,GAAG,UAAU,KAAK,QAAQ;IAC5C,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,EAAE,QAAQ,CAAC,CAAA;AACd,CAAC,CAAA;AAEY,QAAA,EAAE,GAAG,CAAC,GAAG,UAAU,KAAK,QAAQ,IAAI,CAAC,GAAG,KAAK;IACxD,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM;QACjC,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,CAAC,KAChB,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;aAC7C,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;aACzB,KAAK,CAAC,GAAG;YACR,EAAE,CAAA,CAAC,CAAC,KAAK,KAAK,CAAC;gBAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI;gBAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACP,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAA"} \ No newline at end of file diff --git a/dist/promise.js.map b/dist/promise.js.map index 164c5ba..647345e 100644 --- a/dist/promise.js.map +++ b/dist/promise.js.map @@ -1 +1 @@ -{"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAEjC,gGAAgG;AAChG,IAAI,CAAC,GAAG,OAAO,CAAC;AAEhB,4CAA4C;AAC/B,QAAA,UAAU,GAAG,IAAI,CAAC,EAAE;IAC/B,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,0DAA0D,CAAC,CAAC;IAC3F,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,oGAAoG,CAAC,CAAC;IAC7H,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,mGAAmG,CAAC,CAAC;IAC3H,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,gGAAgG,CAAC,CAAC;IACrH,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,uHAAuH,CAAC,CAAC;IACvJ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,wHAAwH,CAAC,CAAC;IACzJ,CAAC,GAAG,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,4CAA4C;AAC/B,QAAA,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAEjC,gGAAgG;AAChG,IAAI,CAAC,GAAG,OAAO,CAAC;AAEhB,4CAA4C;AAC/B,QAAA,UAAU,GAAG,IAAI;IAC5B,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,0DAA0D,CAAC,CAAC;IAC3F,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,oGAAoG,CAAC,CAAC;IAC7H,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,mGAAmG,CAAC,CAAC;IAC3H,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,gGAAgG,CAAC,CAAC;IACrH,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,uHAAuH,CAAC,CAAC;IACvJ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,wHAAwH,CAAC,CAAC;IACzJ,CAAC,GAAG,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,4CAA4C;AAC/B,QAAA,UAAU,GAAG,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/resolver.js.map b/dist/resolver.js.map index 4750573..b14dbf1 100644 --- a/dist/resolver.js.map +++ b/dist/resolver.js.map @@ -1 +1 @@ -{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/util.js.map b/dist/util.js.map index df4520e..b3dfbe9 100644 --- a/dist/util.js.map +++ b/dist/util.js.map @@ -1 +1 @@ -{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAAA,uCAAuC;AAE1B,QAAA,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC;AAE5C,QAAA,SAAS,GAAG,EAAE,CAAC,EAAE;IAC5B,MAAM,OAAO,GAAG,oBAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEW,QAAA,oBAAoB,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC"} \ No newline at end of file +{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAAA,uCAAuC;AAE1B,QAAA,UAAU,GAAG,EAAE,IAAI,OAAO,EAAE,KAAK,UAAU,CAAC;AAE5C,QAAA,SAAS,GAAG,EAAE;IACzB,MAAM,OAAO,GAAG,oBAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM;QAC9C,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEW,QAAA,oBAAoB,GAAG,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,CAAC"} \ No newline at end of file From 43f573eb4ee430919fa95c23d45a14f02f2ff1aa Mon Sep 17 00:00:00 2001 From: Ryan Baxley Date: Sun, 22 Apr 2018 13:39:04 -0400 Subject: [PATCH 4/5] Adding section to readme --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index bbbd695..2c89a45 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,28 @@ const resolvers = combineResolvers([ export default resolvers; ``` +Conditional resovlers: +```javascript +import { and, or } from 'apollo-resolvers'; + +import isFooResolver from './foo'; +import isBarResolver from './bar'; + +const banResolver = (root, { input }, { models: { UserModel } })=> UserModel.ban(input); + +// Will execute banResolver if either isFooResolver or isBarResolver successfully resolve +// If none of the resolvers succeed, the error from the last conditional resolver will +// be returned +const orBanResolver = or(isFooResolver, isBarResolver)(banResolver); + +// Will execute banResolver if both isFooResolver and isBarResolver successfully resolve +// If one of the condition resolvers throws an error, it will stop the execution and +// return the error +const andBanResolver = and(isFooResolver, isBarResolver)(banResolver); + +// In both cases, conditions are evaluated from left to right +``` + ## Resolver context Resolvers are provided a mutable context object that is shared between all resolvers for a given request. A common pattern with GraphQL is inject request-specific model instances into the resolver context for each request. Models frequently reference one another, and unbinding circular references can be a pain. `apollo-resolvers` provides a request context factory that allows you to bind context disposal to server responses, calling a `dispose` method on each model instance attached to the context to do any sort of required reference cleanup necessary to avoid memory leaks: From 1a06a0e6fa3e31726b3127910db063af6cc5f03f Mon Sep 17 00:00:00 2001 From: Ryan Baxley Date: Thu, 3 May 2018 19:25:54 -0400 Subject: [PATCH 5/5] Adding comments above conditional functions --- src/helper.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/helper.ts b/src/helper.ts index f097542..c2a73c9 100644 --- a/src/helper.ts +++ b/src/helper.ts @@ -4,12 +4,16 @@ import * as merge from "deepmerge"; export const combineResolvers = (resolvers = []) => resolvers .reduce((combined, resolver) => merge(combined, resolver)); +// Accepts multiple authentication resolvers and returns a function which will be called +// if all of the authentication resolvers succeed, or throw an error if one of them fails export const and = (...conditions) => resolver => { return conditions.reduceRight((p, c) => { return c.createResolver(p); }, resolver) } +// Accepts multiple authentication resolvers and returns a function which will be called +// if any of the authentication resolvers succeed, or throw an error if all of them fail export const or = (...conditions) => resolver => (...query) => { return new Promise((resolve, reject) => { let limit = conditions.length - 1;