Skip to content

Commit d2d097f

Browse files
committed
rebase
1 parent 9a0b8b8 commit d2d097f

File tree

2 files changed

+85
-28
lines changed

2 files changed

+85
-28
lines changed

src/helper.ts

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,34 +30,28 @@ export const or = (...conditions) => resolver => (...query) => {
3030
});
3131
}
3232

33-
export class Composable {
34-
resolver: any; // stricter types won't pass the compiler because createResolver is unexpected on Funciton.
35-
36-
/**
37-
*
38-
* @param resolver
39-
* TODO: a Resolver type is probably needed, but outside the scope of this PR because it requires refactoring resolver.ts
40-
*/
41-
constructor(resFn, errFn) {
42-
this.resolver = createResolver(resFn, errFn);
43-
}
44-
45-
/**
46-
*
47-
* @param resolvers
48-
*/
49-
public compose( resolvers: {} ) {
33+
/**
34+
* Constructs a composable resolver with the same arguments as createResolver.
35+
* The composable resolver provides the compose method which takes an object of named resolver functions.
36+
* @param resFn resolver function
37+
* @param errFn error handler
38+
*/
39+
export const composable = (resFn, errFn) => {
40+
const baseResolver = createResolver(resFn, errFn);
41+
42+
baseResolver['compose'] = ( resolvers: {} ) => {
5043
const composed = {};
51-
5244
Object.keys(resolvers).forEach(key => {
5345
const resolver = resolvers[key];
54-
55-
composed[key] = (resolver.resolve || resolver.error)
56-
? this.resolver.createResolver(resolver.resolve, resolver.error)
57-
: this.resolver.createResolver(resolver);
46+
// composed[key] = baseResolver['createResolver'](resolver);
47+
composed[key] = (resolver.resolve || resolver.error)
48+
// supports syntax: compose( { myResolver: { resolve: resFn, error: errFn } } )
49+
? baseResolver['createResolver'](resolver.resolve, resolver.error)
50+
// suports syntax: compose( { myResolver: resolver } )
51+
: baseResolver['createResolver'](resolver);
5852
});
59-
6053
return composed;
6154
}
6255

56+
return baseResolver;
6357
}

test/unit/helper_spec.js

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { expect } from 'chai';
22
import { stub } from 'sinon';
33

44
import {
5-
combineResolvers, and, or, compose, Composable
5+
combineResolvers, and, or, compose, composable
66
} from '../../dist/helper';
77
import { createResolver } from '../../dist/resolver';
88
import { resolveAll } from 'jspm-config';
@@ -190,7 +190,7 @@ describe('(unit) src/helper.js', () => {
190190

191191
stub(b, 'resolve', b.resolve);
192192

193-
const base = new Composable(b.resolve, b.error);
193+
const base = composable(b.resolve, b.error);
194194
const comp = base.compose({
195195
r1: () => true,
196196
r2: () => true,
@@ -232,7 +232,7 @@ describe('(unit) src/helper.js', () => {
232232
stub(b, 'error', b.error);
233233
stub(r1, 'error', r1.error);
234234

235-
const base = new Composable(b.resolve, b.error);
235+
const base = composable(b.resolve, b.error);
236236
const comp = base.compose( { r1: r1 } );
237237

238238
comp.r1()
@@ -245,7 +245,6 @@ describe('(unit) src/helper.js', () => {
245245
});
246246

247247
it('when child throws, parent error is called ', () => {
248-
249248
const b = {
250249
resolve: null,
251250
error: d => null
@@ -259,7 +258,7 @@ describe('(unit) src/helper.js', () => {
259258
stub(b, 'error', b.error);
260259
stub(r1, 'error', r1.error);
261260

262-
const base = new Composable(b.resolve, b.error);
261+
const base = composable(b.resolve, b.error);
263262
const comp = base.compose( { r1: r1 } );
264263

265264
comp.r1()
@@ -270,5 +269,69 @@ describe('(unit) src/helper.js', () => {
270269
});
271270
});
272271

272+
it('composed resolvers with { resolve: resFn, error: resFn } syntax, resolve and bubble errors correctly', () => {
273+
274+
const b = {
275+
resolve: () => {},
276+
error: d => compositionErr
277+
};
278+
279+
const r1 = {
280+
resolve: () => { throw Error('some other error') },
281+
error: () => compositionErr };
282+
283+
const r2 = { resolve: () => 'r2Result', error: () => compositionErr };
284+
285+
stub(b, 'resolve', b.resolve);
286+
stub(r1, 'error', r1.error);
287+
stub(r1, 'resolve', r1.resolve);
288+
stub(r2, 'resolve', r2.resolve);
289+
stub(r2, 'error', r2.error);
290+
291+
const base = composable(b.resolve, b.error);
292+
const comp = base.compose({
293+
r1: r1,
294+
r2: r2,
295+
});
296+
297+
return Promise.all([
298+
comp.r1().catch(e => {
299+
expect(e).to.equal(compositionErr);
300+
}),
301+
comp.r2().then(r => {
302+
expect(r).to.equal('r2Result');
303+
}),
304+
305+
]).then(()=> {
306+
expect(r1.resolve.calledOnce).to.be.true;
307+
expect(r1.error.calledOnce).to.be.true;
308+
expect(r2.resolve.calledOnce).to.be.true;
309+
expect(r2.error.notCalled).to.be.true;
310+
});
311+
});
312+
313+
it('composed result has correct structure', () => {
314+
315+
const b = {
316+
resolve: () => {},
317+
error: d => compositionErr
318+
};
319+
320+
stub(b, 'resolve', b.resolve);
321+
322+
const base = composable(b.resolve, b.error);
323+
const comp = base.compose({
324+
r1: { resolve: () => { throw Error('some other error') }, error: () => compositionErr },
325+
r2: { resolve: () => 'r2Result', error: () => compositionErr },
326+
r3: {} // should this throw an exception since it is not a resolver or createResolver params?
327+
});
328+
329+
console.log(typeof Function);
330+
expect(comp.r1).to.be.a(typeof Function);
331+
expect(comp.r2).to.be.a(typeof Function);
332+
expect(comp.r3).to.be.a(typeof Function);
333+
334+
});
335+
273336
});
274337
});

0 commit comments

Comments
 (0)