Skip to content

Commit

Permalink
feat(core): adds replace; modifies traverse api
Browse files Browse the repository at this point in the history
  • Loading branch information
rafamel committed Oct 14, 2019
1 parent 0d95871 commit ab3b3bd
Show file tree
Hide file tree
Showing 11 changed files with 298 additions and 181 deletions.
16 changes: 9 additions & 7 deletions packages/core/src/create/application/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,20 @@ export function application(
options
);

// clone collection and add global errors
collection = clone(collection);
// add global errors
const errors: {
[P in GenericError]: ErrorType;
} = {
ServerError: error({ code: 'ServerError' }),
ClientError: error({ code: 'ClientError' })
};
for (const [name, error] of Object.entries(errors)) {
if (!collection.types[name]) {
collection.types[name] = error;
collection = {
...collection,
types: {
...errors,
...collection.types
}
}
};

const internal: GenericError = 'ServerError';
collection = intercepts(
Expand Down Expand Up @@ -100,9 +101,10 @@ export function application(
)
};

collection = clone(collection);
traverse(
collection,
(element, path) => {
(element, { path }) => {
const name = opts.transform(path.slice(-1)[0], true);

if (isElementType(element)) {
Expand Down
26 changes: 12 additions & 14 deletions packages/core/src/create/intercepts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import {
} from '~/types';
import { from, Observable } from 'rxjs';
import { switchMap, mergeMap } from 'rxjs/operators';
import clone from 'lodash.clonedeep';
import { emptyIntercept, mergeServiceErrors } from '~/utils';
import { traverse, isElementService, isServiceImplementation } from '~/inspect';
import { isElementService, isServiceImplementation } from '~/inspect';
import { replace } from '~/transform';

export interface InterceptsCreateOptions {
prepend?: boolean;
Expand All @@ -22,24 +22,22 @@ export function intercepts<T extends CollectionTree>(
intercepts: InterceptImplementation[],
options?: InterceptsCreateOptions
): T {
collection = clone(collection);
const opts = Object.assign({ prepend: true }, options);

traverse(
return replace(
{ ...collection, types: {} },
(element) => {
if (!isElementService(element) || !isServiceImplementation(element)) {
return;
}

element.intercepts = opts.prepend
? intercepts.concat(element.intercepts || [])
: (element.intercepts || []).concat(intercepts);
return !isElementService(element) || !isServiceImplementation(element)
? element
: {
...element,
intercepts: opts.prepend
? intercepts.concat(element.intercepts || [])
: (element.intercepts || []).concat(intercepts)
};
},
{ deep: true, children: true, inline: true }
);

return collection;
) as T;
}

/**
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './create';
export * from './generate';
export * from './inspect';
export * from './transform';
export * from './types';
export * from './errors';
56 changes: 56 additions & 0 deletions packages/core/src/inspect/traverse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import {
QueryService,
MutationService,
SubscriptionService,
Element,
CollectionTree
} from '~/types';
import { replace } from '~/transform';

export type TraverseInspectFn<
Q extends QueryService = QueryService,
M extends MutationService = MutationService,
S extends SubscriptionService = SubscriptionService
> = (element: Element<Q, M, S>, data: TraverseInspectData) => void;

export interface TraverseInspectData {
path: string[];
route: string[];
}

export interface TraverseInspectOptions {
/**
* Whether to traverse a collection's inner scopes. Default: `true`.
*/
deep?: boolean;
/**
* Whether to traverse type's children services. Default: `false`.
*/
children?: boolean;
/**
* Whether to traverse types within services. Default: `false`.
*/
inline?: boolean;
}

/**
* Performs a collection traversal, with `cb` being called (top-down) for each `Element`.
*/
export function traverse<
Q extends QueryService = QueryService,
M extends MutationService = MutationService,
S extends SubscriptionService = SubscriptionService
>(
collection: CollectionTree<Q, M, S>,
cb: TraverseInspectFn<Q, M, S>,
options?: TraverseInspectOptions
): void {
replace(
collection,
(element, data) => {
cb(element, data);
return element;
},
options
);
}
121 changes: 0 additions & 121 deletions packages/core/src/inspect/traverse/helpers.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/core/src/inspect/traverse/index.ts

This file was deleted.

38 changes: 0 additions & 38 deletions packages/core/src/inspect/traverse/traverse.ts

This file was deleted.

1 change: 1 addition & 0 deletions packages/core/src/transform/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './replace';

0 comments on commit ab3b3bd

Please sign in to comment.