Skip to content
This repository has been archived by the owner on Jan 27, 2023. It is now read-only.

Commit

Permalink
also override ResolverTypeWrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
magne4000 committed Sep 15, 2020
1 parent 3acef5f commit b6b1523
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 27 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

`npm install graphql-codegen-typescript-reactive-resolvers --save-dev`

⚠️ It overrides the `resolverTypeWrapperSignature` config

## Usage

Run `gql-gen` as usual with this config:
Expand Down
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
{
"name": "graphql-codegen-typescript-reactive-resolvers",
"version": "1.0.0",
"name": "@getstation/graphql-codegen-typescript-reactive-resolvers",
"version": "1.17.10",
"description": "graphql-codegen-cli template for TypeScript typings of reactive resolvers",
"repository": "[email protected]:getstation/graphql-codegen-typescript-reactive-resolvers.git",
"license": "MIT",
"scripts": {
"build": "tsc -m esnext --outDir dist/esnext && tsc -m commonjs --outDir dist/commonjs",
"test": "jest --config ./jest.config.js"
"test": "jest --config ./jest.config.js",
"prepublishOnly": "npm run build",
"prepack": "npm run build"
},
"dependencies": {
"@graphql-codegen/visitor-plugin-common": "^1.17.14",
Expand Down
17 changes: 15 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,20 @@ export type ResolverFn<TResult, TParent, TContext, TArgs> = (

const header = `${indexSignature}
${visitor.getResolverTypeWrapperSignature()}
export type DeepObservable<T> = [T] extends [Function]
? T : [T] extends [Array<infer U>]
? _DeepObservableArray<U>
: [T] extends [object]
? _DeepObservableObject<T>
: T | Observable<T> | Promise<T>;
export interface _DeepObservableArray<T> extends ReadonlyArray<DeepObservable<T>> {}
export type _DeepObservableObject<T> = {
[P in keyof T]: DeepObservable<T[P]>;
};
export type ResolverTypeWrapper<T> = DeepObservable<T> | Promise<T> | T;
${defsToInclude.join('\n')}
Expand Down Expand Up @@ -174,7 +187,7 @@ export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
parent: TParent,
context: TContext,
info${optionalSignForInfoArg}: GraphQLResolveInfo
) => ${namespacedImportPrefix}Maybe<TTypes> | Promise<${namespacedImportPrefix}Maybe<TTypes>>;
) => ${namespacedImportPrefix}Maybe<TTypes> | Promise<${namespacedImportPrefix}Maybe<TTypes>> | Observable<${namespacedImportPrefix}Maybe<TTypes>>;
export type IsTypeOfResolverFn<T = {}> = (obj: T, info${optionalSignForInfoArg}: GraphQLResolveInfo) => boolean | Promise<boolean>;
Expand Down
51 changes: 45 additions & 6 deletions tests/__snapshots__/ts-resolvers.spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,20 @@ export type MyUnion = MyType | MyOtherType;
export type WithIndex<TObject> = TObject & Record<string, any>;
export type ResolversObject<TObject> = WithIndex<TObject>;

export type ResolverTypeWrapper<T> = Promise<T> | T;
export type DeepObservable<T> = [T] extends [Function]
? T : [T] extends [Array<infer U>]
? _DeepObservableArray<U>
: [T] extends [object]
? _DeepObservableObject<T>
: T | Observable<T> | Promise<T>;

export interface _DeepObservableArray<T> extends ReadonlyArray<DeepObservable<T>> {}

export type _DeepObservableObject<T> = {
[P in keyof T]: DeepObservable<T[P]>;
};

export type ResolverTypeWrapper<T> = DeepObservable<T> | Promise<T> | T;

export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs>;

Expand Down Expand Up @@ -106,7 +119,7 @@ export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
parent: TParent,
context: TContext,
info: GraphQLResolveInfo
) => Maybe<TTypes> | Promise<Maybe<TTypes>>;
) => Maybe<TTypes> | Promise<Maybe<TTypes>> | Observable<Maybe<TTypes>>;

export type IsTypeOfResolverFn<T = {}> = (obj: T, info: GraphQLResolveInfo) => boolean | Promise<boolean>;

Expand Down Expand Up @@ -240,7 +253,20 @@ export type RequireFields<T, K extends keyof T> = { [X in Exclude<keyof T, K>]?:
export type WithIndex<TObject> = TObject & Record<string, any>;
export type ResolversObject<TObject> = WithIndex<TObject>;

export type ResolverTypeWrapper<T> = Promise<T> | T;
export type DeepObservable<T> = [T] extends [Function]
? T : [T] extends [Array<infer U>]
? _DeepObservableArray<U>
: [T] extends [object]
? _DeepObservableObject<T>
: T | Observable<T> | Promise<T>;

export interface _DeepObservableArray<T> extends ReadonlyArray<DeepObservable<T>> {}

export type _DeepObservableObject<T> = {
[P in keyof T]: DeepObservable<T[P]>;
};

export type ResolverTypeWrapper<T> = DeepObservable<T> | Promise<T> | T;

export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs>;

Expand Down Expand Up @@ -287,7 +313,7 @@ export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
parent: TParent,
context: TContext,
info: GraphQLResolveInfo
) => Types.Maybe<TTypes> | Promise<Types.Maybe<TTypes>>;
) => Types.Maybe<TTypes> | Promise<Types.Maybe<TTypes>> | Observable<Types.Maybe<TTypes>>;

export type IsTypeOfResolverFn<T = {}> = (obj: T, info: GraphQLResolveInfo) => boolean | Promise<boolean>;

Expand Down Expand Up @@ -465,7 +491,20 @@ export type MyUnion = MyType | MyOtherType;
export type WithIndex<TObject> = TObject & Record<string, any>;
export type ResolversObject<TObject> = WithIndex<TObject>;

export type ResolverTypeWrapper<T> = Promise<T> | T;
export type DeepObservable<T> = [T] extends [Function]
? T : [T] extends [Array<infer U>]
? _DeepObservableArray<U>
: [T] extends [object]
? _DeepObservableObject<T>
: T | Observable<T> | Promise<T>;

export interface _DeepObservableArray<T> extends ReadonlyArray<DeepObservable<T>> {}

export type _DeepObservableObject<T> = {
[P in keyof T]: DeepObservable<T[P]>;
};

export type ResolverTypeWrapper<T> = DeepObservable<T> | Promise<T> | T;

export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs>;

Expand Down Expand Up @@ -512,7 +551,7 @@ export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
parent: TParent,
context: TContext,
info?: GraphQLResolveInfo
) => Maybe<TTypes> | Promise<Maybe<TTypes>>;
) => Maybe<TTypes> | Promise<Maybe<TTypes>> | Observable<Maybe<TTypes>>;

export type IsTypeOfResolverFn<T = {}> = (obj: T, info?: GraphQLResolveInfo) => boolean | Promise<boolean>;

Expand Down
18 changes: 2 additions & 16 deletions tests/ts-resolvers.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -445,20 +445,6 @@ describe('TypeScript Resolvers Plugin', () => {
await validate(result);
});

it('Should allow to override ResolverTypeWrapper signature', async () => {
const result = (await plugin(
schema,
[],
{
noSchemaStitching: true,
resolverTypeWrapperSignature: 'Promise<DeepPartial<T>> | DeepPartial<T>',
},
{ outputFile: '' }
)) as Types.ComplexPluginOutput;

expect(result.content).toContain(`export type ResolverTypeWrapper<T> = Promise<DeepPartial<T>> | DeepPartial<T>;`);
});

it('Should have default value for ResolverTypeWrapper signature', async () => {
const result = (await plugin(
schema,
Expand All @@ -469,7 +455,7 @@ describe('TypeScript Resolvers Plugin', () => {
{ outputFile: '' }
)) as Types.ComplexPluginOutput;

expect(result.content).toContain(`export type ResolverTypeWrapper<T> = Promise<T> | T;`);
expect(result.content).toContain(`export type ResolverTypeWrapper<T> = DeepObservable<T> | Promise<T> | T`);
});

it('Should not warn when noSchemaStitching is not defined', async () => {
Expand Down Expand Up @@ -1737,7 +1723,7 @@ export type ResolverFn<TResult, TParent, TContext, TArgs> = (
)) as Types.ComplexPluginOutput;

expect(content.content).toBeSimilarStringTo(`
export type ResolverTypeWrapper<T> = Promise<T> | T;
export type ResolverTypeWrapper<T> = DeepObservable<T> | Promise<T> | T;
`);
});

Expand Down

0 comments on commit b6b1523

Please sign in to comment.