Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/shaky-llamas-scream.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@eddeee888/gcg-typescript-resolver-files': minor
---

Add fixObjectTypeResolvers `fast` mode (experimental)

This is now the default static analysis mode. If you see behaviour or runtime issues, please set `fixObjectTypeResolvers: smart` and file a report at <https://github.com/eddeee888/graphql-code-generator-plugins/issues>
13 changes: 13 additions & 0 deletions packages/typescript-resolver-files-e2e/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"rimraf -g \"{projectRoot}/src/**/*.gen.*\"",
"rimraf -g \"{projectRoot}/src/**/generated\"",
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-mappers-vs-schema-types/testSetup.ts",
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-mappers-vs-schema-types-advanced/testSetup.ts",
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-resolvers-auto-wireup/testSetup.ts"
],
"parallel": false
Expand Down Expand Up @@ -81,6 +82,14 @@
],
"parallel": false
},
"test-mappers-vs-schema-types-advanced": {
"commands": [
"rimraf -g \"{projectRoot}/src/test-mappers-vs-schema-types-advanced/**/resolvers/\"",
"rimraf -g \"{projectRoot}/src/test-mappers-vs-schema-types-advanced/**/*.generated.*\"",
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-mappers-vs-schema-types-advanced/testSetup.ts"
],
"parallel": false
},
"test-config-ts": {
"commands": [
"rimraf -g \"{projectRoot}/src/test-config-ts/**/resolvers/\"",
Expand Down Expand Up @@ -179,6 +188,7 @@
"nx graphql-codegen typescript-resolver-files-e2e -c test-config-overrides --verbose",
"nx graphql-codegen typescript-resolver-files-e2e -c test-mappers --verbose",
"nx graphql-codegen typescript-resolver-files-e2e -c test-mappers-vs-schema-types --verbose",
"nx graphql-codegen typescript-resolver-files-e2e -c test-mappers-vs-schema-types-advanced --verbose",
"nx graphql-codegen typescript-resolver-files-e2e -c test-config-ts --verbose",
"nx graphql-codegen typescript-resolver-files-e2e -c test-modules-typedefs-file-mode --verbose",
"nx graphql-codegen typescript-resolver-files-e2e -c test-modules-resolver-main-file-mode --verbose",
Expand Down Expand Up @@ -231,6 +241,9 @@
"test-mappers-vs-schema-types": {
"configFile": "{projectRoot}/src/test-mappers-vs-schema-types/codegen.ts"
},
"test-mappers-vs-schema-types-advanced": {
"configFile": "{projectRoot}/src/test-mappers-vs-schema-types-advanced/codegen.ts"
},
"test-config-ts": {
"configFile": "{projectRoot}/src/test-config-ts/codegen.ts"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import type { CodegenConfig } from '@graphql-codegen/cli';
import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files';

const projectRoot = 'packages/typescript-resolver-files-e2e';

const config: CodegenConfig = {
schema: [
`${projectRoot}/src/test-mappers-vs-schema-types-advanced/**/*.graphqls`,
],
hooks: { afterAllFileWrite: ['prettier --write'] },
generates: {
[`${projectRoot}/src/test-mappers-vs-schema-types-advanced/modules`]:
defineConfig({
typeDefsFilePath: false,
mergeSchema: false,
resolverGeneration: 'minimal',
fixObjectTypeResolvers: 'fast',
tsConfigFilePath: `${projectRoot}/tsconfig.lib.json`,
}),
},
};

export default config;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
type Query
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/* This file was automatically generated. DO NOT UPDATE MANUALLY. */
import type { Resolvers } from './types.generated';
import { user as Query_user } from './test/resolvers/Query/user';
import { Book } from './test/resolvers/Book';
import { User } from './test/resolvers/User';
export const resolvers: Resolvers = {
Query: { user: Query_user },

Book: Book,
User: User,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { BookResolvers } from './../../types.generated';
export const Book: BookResolvers = {
relatedBooks: ({ relatedBooks }) => {
/* This existing content is not overwritten*/
},
nextBookInSeries: ({ nextBookInSeries }, _arg, _ctx) => {
/* Book.nextBookInSeries resolver is required because Book.nextBookInSeries and BookMapper.nextBookInSeries are not compatible */
return nextBookInSeries;
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { QueryResolvers } from './../../../types.generated';
export const user: NonNullable<QueryResolvers['user']> = async (
_parent,
_arg,
_ctx
) => {
/* Implement Query.user resolver logic here */
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import type { UserResolvers } from './../../types.generated';
/*
* Note: This object type is generated because "UserMapper" is declared. This is to ensure runtime safety.
*
* When a mapper is used, it is possible to hit runtime errors in some scenarios:
* - given a field name, the schema type's field type does not match mapper's field type
* - or a schema type's field does not exist in the mapper's fields
*
* If you want to skip this file generation, remove the mapper or update the pattern in the `resolverGeneration.object` config.
*/
export const User: UserResolvers = {
/* Implement User resolver logic here */
mmBook1: ({ mmBook1 }, _arg, _ctx) => {
/* User.mmBook1 resolver is required because User.mmBook1 and UserMapper.mmBook1 are not compatible */
return mmBook1;
},
mmBook2: ({ mmBook2 }, _arg, _ctx) => {
/* User.mmBook2 resolver is required because User.mmBook2 and UserMapper.mmBook2 are not compatible */
return mmBook2;
},
mmBooks1: ({ mmBooks1 }, _arg, _ctx) => {
/* User.mmBooks1 resolver is required because User.mmBooks1 and UserMapper.mmBooks1 are not compatible */
return mmBooks1;
},
mmBooks2: ({ mmBooks2 }, _arg, _ctx) => {
/* User.mmBooks2 resolver is required because User.mmBooks2 and UserMapper.mmBooks2 are not compatible */
return mmBooks2;
},
mmBooks3: ({ mmBooks3 }, _arg, _ctx) => {
/* User.mmBooks3 resolver is required because User.mmBooks3 and UserMapper.mmBooks3 are not compatible */
return mmBooks3;
},
mmBooks4: ({ mmBooks4 }, _arg, _ctx) => {
/* User.mmBooks4 resolver is required because User.mmBooks4 and UserMapper.mmBooks4 are not compatible */
return mmBooks4;
},
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
extend type Query {
user: User
}

type User {
id: ID!

# Matches
book: Book
bookNonNull: Book!
bookInline: Book!

## mappers fields use Array<T>
books1: [Book]
books2: [Book!]
books3: [Book]!
books4: [Book!]!

## mappers fields use T[]
books5: [Book]
books6: [Book!]
books7: [Book]!
books8: [Book!]!

# Mismatches
mmBook1: Book
mmBook2: Book!

mmBooks1: [Book]
mmBooks2: [Book!]
mmBooks3: [Book]!
mmBooks4: [Book!]!
}

type Book {
id: ID!
name: String!
relatedBooks: [Book!]!
nextBookInSeries: Book!
}

type NotMapped {
id: ID!
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
export type UserMapper = {
id: number;

// Matches
book: BookMapper | null | undefined;
bookNonNull: BookMapper;
bookInline: {
id: number;
name: string;
relatedBooks: { id: number }[];
nextBookInSeries: { id: number };
}; // Inline version of BookMapper. Must keep in sync.

books1: Array<BookMapper | null> | null;
books2: Array<BookMapper> | null;
books3: Array<BookMapper | null>;
books4: Array<BookMapper>;

books5: (BookMapper | null)[] | null;
books6: BookMapper[] | null;
books7: (BookMapper | null)[];
books8: BookMapper[];

// Mismatches
mmBook1: { id: string };
mmBook2: BookMapper | null;

mmBooks1: Array<BookMapper> | boolean;
mmBooks2: Array<BookMapper | null> | null;
mmBooks3: Array<BookMapper | null> | null;
mmBooks4: Array<BookMapper | null>;
};

export type BookMapper = {
id: number;
name: string;
relatedBooks: { id: number }[];
nextBookInSeries: { id: number };
};
Loading