Skip to content

Commit e0476b3

Browse files
authored
Improve static analysis speed (#397)
* Use assignableTo to improve analysis speed * Set up e2e for advanced static analysis * Improve ts-morph practices
1 parent 6dd6d99 commit e0476b3

21 files changed

Lines changed: 1254 additions & 53 deletions

.changeset/shaky-llamas-scream.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@eddeee888/gcg-typescript-resolver-files': minor
3+
---
4+
5+
Add fixObjectTypeResolvers `fast` mode (experimental)
6+
7+
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>

packages/typescript-resolver-files-e2e/project.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"rimraf -g \"{projectRoot}/src/**/*.gen.*\"",
2727
"rimraf -g \"{projectRoot}/src/**/generated\"",
2828
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-mappers-vs-schema-types/testSetup.ts",
29+
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-mappers-vs-schema-types-advanced/testSetup.ts",
2930
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-resolvers-auto-wireup/testSetup.ts"
3031
],
3132
"parallel": false
@@ -81,6 +82,14 @@
8182
],
8283
"parallel": false
8384
},
85+
"test-mappers-vs-schema-types-advanced": {
86+
"commands": [
87+
"rimraf -g \"{projectRoot}/src/test-mappers-vs-schema-types-advanced/**/resolvers/\"",
88+
"rimraf -g \"{projectRoot}/src/test-mappers-vs-schema-types-advanced/**/*.generated.*\"",
89+
"tsx --tsconfig={projectRoot}/tsconfig.json {projectRoot}/src/test-mappers-vs-schema-types-advanced/testSetup.ts"
90+
],
91+
"parallel": false
92+
},
8493
"test-config-ts": {
8594
"commands": [
8695
"rimraf -g \"{projectRoot}/src/test-config-ts/**/resolvers/\"",
@@ -179,6 +188,7 @@
179188
"nx graphql-codegen typescript-resolver-files-e2e -c test-config-overrides --verbose",
180189
"nx graphql-codegen typescript-resolver-files-e2e -c test-mappers --verbose",
181190
"nx graphql-codegen typescript-resolver-files-e2e -c test-mappers-vs-schema-types --verbose",
191+
"nx graphql-codegen typescript-resolver-files-e2e -c test-mappers-vs-schema-types-advanced --verbose",
182192
"nx graphql-codegen typescript-resolver-files-e2e -c test-config-ts --verbose",
183193
"nx graphql-codegen typescript-resolver-files-e2e -c test-modules-typedefs-file-mode --verbose",
184194
"nx graphql-codegen typescript-resolver-files-e2e -c test-modules-resolver-main-file-mode --verbose",
@@ -231,6 +241,9 @@
231241
"test-mappers-vs-schema-types": {
232242
"configFile": "{projectRoot}/src/test-mappers-vs-schema-types/codegen.ts"
233243
},
244+
"test-mappers-vs-schema-types-advanced": {
245+
"configFile": "{projectRoot}/src/test-mappers-vs-schema-types-advanced/codegen.ts"
246+
},
234247
"test-config-ts": {
235248
"configFile": "{projectRoot}/src/test-config-ts/codegen.ts"
236249
},
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import type { CodegenConfig } from '@graphql-codegen/cli';
2+
import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files';
3+
4+
const projectRoot = 'packages/typescript-resolver-files-e2e';
5+
6+
const config: CodegenConfig = {
7+
schema: [
8+
`${projectRoot}/src/test-mappers-vs-schema-types-advanced/**/*.graphqls`,
9+
],
10+
hooks: { afterAllFileWrite: ['prettier --write'] },
11+
generates: {
12+
[`${projectRoot}/src/test-mappers-vs-schema-types-advanced/modules`]:
13+
defineConfig({
14+
typeDefsFilePath: false,
15+
mergeSchema: false,
16+
resolverGeneration: 'minimal',
17+
fixObjectTypeResolvers: 'fast',
18+
tsConfigFilePath: `${projectRoot}/tsconfig.lib.json`,
19+
}),
20+
},
21+
};
22+
23+
export default config;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
type Query
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/* This file was automatically generated. DO NOT UPDATE MANUALLY. */
2+
import type { Resolvers } from './types.generated';
3+
import { user as Query_user } from './test/resolvers/Query/user';
4+
import { Book } from './test/resolvers/Book';
5+
import { User } from './test/resolvers/User';
6+
export const resolvers: Resolvers = {
7+
Query: { user: Query_user },
8+
9+
Book: Book,
10+
User: User,
11+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { BookResolvers } from './../../types.generated';
2+
export const Book: BookResolvers = {
3+
relatedBooks: ({ relatedBooks }) => {
4+
/* This existing content is not overwritten*/
5+
},
6+
nextBookInSeries: ({ nextBookInSeries }, _arg, _ctx) => {
7+
/* Book.nextBookInSeries resolver is required because Book.nextBookInSeries and BookMapper.nextBookInSeries are not compatible */
8+
return nextBookInSeries;
9+
},
10+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { QueryResolvers } from './../../../types.generated';
2+
export const user: NonNullable<QueryResolvers['user']> = async (
3+
_parent,
4+
_arg,
5+
_ctx
6+
) => {
7+
/* Implement Query.user resolver logic here */
8+
};
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import type { UserResolvers } from './../../types.generated';
2+
/*
3+
* Note: This object type is generated because "UserMapper" is declared. This is to ensure runtime safety.
4+
*
5+
* When a mapper is used, it is possible to hit runtime errors in some scenarios:
6+
* - given a field name, the schema type's field type does not match mapper's field type
7+
* - or a schema type's field does not exist in the mapper's fields
8+
*
9+
* If you want to skip this file generation, remove the mapper or update the pattern in the `resolverGeneration.object` config.
10+
*/
11+
export const User: UserResolvers = {
12+
/* Implement User resolver logic here */
13+
mmBook1: ({ mmBook1 }, _arg, _ctx) => {
14+
/* User.mmBook1 resolver is required because User.mmBook1 and UserMapper.mmBook1 are not compatible */
15+
return mmBook1;
16+
},
17+
mmBook2: ({ mmBook2 }, _arg, _ctx) => {
18+
/* User.mmBook2 resolver is required because User.mmBook2 and UserMapper.mmBook2 are not compatible */
19+
return mmBook2;
20+
},
21+
mmBooks1: ({ mmBooks1 }, _arg, _ctx) => {
22+
/* User.mmBooks1 resolver is required because User.mmBooks1 and UserMapper.mmBooks1 are not compatible */
23+
return mmBooks1;
24+
},
25+
mmBooks2: ({ mmBooks2 }, _arg, _ctx) => {
26+
/* User.mmBooks2 resolver is required because User.mmBooks2 and UserMapper.mmBooks2 are not compatible */
27+
return mmBooks2;
28+
},
29+
mmBooks3: ({ mmBooks3 }, _arg, _ctx) => {
30+
/* User.mmBooks3 resolver is required because User.mmBooks3 and UserMapper.mmBooks3 are not compatible */
31+
return mmBooks3;
32+
},
33+
mmBooks4: ({ mmBooks4 }, _arg, _ctx) => {
34+
/* User.mmBooks4 resolver is required because User.mmBooks4 and UserMapper.mmBooks4 are not compatible */
35+
return mmBooks4;
36+
},
37+
};
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
extend type Query {
2+
user: User
3+
}
4+
5+
type User {
6+
id: ID!
7+
8+
# Matches
9+
book: Book
10+
bookNonNull: Book!
11+
bookInline: Book!
12+
13+
## mappers fields use Array<T>
14+
books1: [Book]
15+
books2: [Book!]
16+
books3: [Book]!
17+
books4: [Book!]!
18+
19+
## mappers fields use T[]
20+
books5: [Book]
21+
books6: [Book!]
22+
books7: [Book]!
23+
books8: [Book!]!
24+
25+
# Mismatches
26+
mmBook1: Book
27+
mmBook2: Book!
28+
29+
mmBooks1: [Book]
30+
mmBooks2: [Book!]
31+
mmBooks3: [Book]!
32+
mmBooks4: [Book!]!
33+
}
34+
35+
type Book {
36+
id: ID!
37+
name: String!
38+
relatedBooks: [Book!]!
39+
nextBookInSeries: Book!
40+
}
41+
42+
type NotMapped {
43+
id: ID!
44+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
export type UserMapper = {
2+
id: number;
3+
4+
// Matches
5+
book: BookMapper | null | undefined;
6+
bookNonNull: BookMapper;
7+
bookInline: {
8+
id: number;
9+
name: string;
10+
relatedBooks: { id: number }[];
11+
nextBookInSeries: { id: number };
12+
}; // Inline version of BookMapper. Must keep in sync.
13+
14+
books1: Array<BookMapper | null> | null;
15+
books2: Array<BookMapper> | null;
16+
books3: Array<BookMapper | null>;
17+
books4: Array<BookMapper>;
18+
19+
books5: (BookMapper | null)[] | null;
20+
books6: BookMapper[] | null;
21+
books7: (BookMapper | null)[];
22+
books8: BookMapper[];
23+
24+
// Mismatches
25+
mmBook1: { id: string };
26+
mmBook2: BookMapper | null;
27+
28+
mmBooks1: Array<BookMapper> | boolean;
29+
mmBooks2: Array<BookMapper | null> | null;
30+
mmBooks3: Array<BookMapper | null> | null;
31+
mmBooks4: Array<BookMapper | null>;
32+
};
33+
34+
export type BookMapper = {
35+
id: number;
36+
name: string;
37+
relatedBooks: { id: number }[];
38+
nextBookInSeries: { id: number };
39+
};

0 commit comments

Comments
 (0)