Skip to content

Commit 440172c

Browse files
PabloSzxardatanrenovate-bot
authored
ESM support (#6102)
* ESM support * Fix tests * update lock * export config types * fix plugins-helpers esm compat * refactor lodash usage for esm * add programmatic typescript example with esm * small fixes * use "createRequire" for resolve in cli "createContext" * fix enum-array package ESM exports * fix deep graphql import with ".js" * add test-esm script * fix gql-tag-operations-preset package * fix esm import issues * specify prettier in root * use globby v11 * update prisma-loader & fix mkdirp import * remove createRequireFromPath imports * simplify example * fix support ESM changeset * update lock * update bob-the-bundler to v1.5.1 * fix changeset Co-authored-by: Arda TANRIKULU <[email protected]> Co-authored-by: Renovate Bot <[email protected]>
1 parent 62629b3 commit 440172c

File tree

84 files changed

+1747
-621
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+1747
-621
lines changed

.changeset/config.json

+2-5
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,5 @@
66
"access": "restricted",
77
"baseBranch": "master",
88
"updateInternalDependencies": "patch",
9-
"ignore": [
10-
"@graphql-codegen/testing",
11-
"@graphql-codegen/website"
12-
]
13-
}
9+
"ignore": ["@graphql-codegen/testing", "@graphql-codegen/website", "example-*"]
10+
}

.changeset/lemon-frogs-yawn.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@graphql-codegen/typescript-resolvers': patch
3+
'@graphql-codegen/typed-document-node': patch
4+
---
5+
6+
export config types

.changeset/unlucky-dots-judge.md

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
---
2+
'@graphql-cli/codegen': minor
3+
'@graphql-codegen/cli': minor
4+
'@graphql-codegen/core': minor
5+
'@graphql-codegen/c-sharp': minor
6+
'@graphql-codegen/c-sharp-operations': minor
7+
'@graphql-codegen/flow': minor
8+
'@graphql-codegen/flow-operations': minor
9+
'@graphql-codegen/flow-resolvers': minor
10+
'@graphql-codegen/java-apollo-android': minor
11+
'@graphql-codegen/java-common': minor
12+
'@graphql-codegen/java': minor
13+
'@graphql-codegen/kotlin': minor
14+
'@graphql-codegen/java-resolvers': minor
15+
'@graphql-codegen/add': minor
16+
'@graphql-codegen/fragment-matcher': minor
17+
'@graphql-codegen/introspection': minor
18+
'@graphql-codegen/jsdoc': minor
19+
'@graphql-codegen/schema-ast': minor
20+
'@graphql-codegen/time': minor
21+
'@graphql-codegen/urql-introspection': minor
22+
'@graphql-codegen/visitor-plugin-common': minor
23+
'@graphql-codegen/typescript-apollo-angular': minor
24+
'@graphql-codegen/typescript-apollo-client-helpers': minor
25+
'@graphql-codegen/typescript-document-nodes': minor
26+
'@graphql-codegen/typescript-enum-array': minor
27+
'@graphql-codegen/typescript-generic-sdk': minor
28+
'@graphql-codegen/gql-tag-operations': minor
29+
'@graphql-codegen/typescript-graphql-files-modules': minor
30+
'@graphql-codegen/typescript-graphql-request': minor
31+
'@graphql-codegen/typescript-mongodb': minor
32+
'@graphql-codegen/named-operations-object': minor
33+
'@graphql-codegen/typescript-oclif': minor
34+
'@graphql-codegen/typescript-operations': minor
35+
'@graphql-codegen/typescript-react-apollo': minor
36+
'@graphql-codegen/typescript-react-offix': minor
37+
'@graphql-codegen/typescript-react-query': minor
38+
'@graphql-codegen/typescript-resolvers': minor
39+
'@graphql-codegen/typescript-rtk-query': minor
40+
'@graphql-codegen/typescript-stencil-apollo': minor
41+
'@graphql-codegen/typescript-type-graphql': minor
42+
'@graphql-codegen/typed-document-node': minor
43+
'@graphql-codegen/typescript': minor
44+
'@graphql-codegen/typescript-urql': minor
45+
'@graphql-codegen/typescript-urql-graphcache': minor
46+
'@graphql-codegen/urql-svelte-operations-store': minor
47+
'@graphql-codegen/typescript-vue-apollo': minor
48+
'@graphql-codegen/typescript-vue-apollo-smart-ops': minor
49+
'@graphql-codegen/typescript-vue-urql': minor
50+
'@graphql-codegen/gql-tag-operations-preset': minor
51+
'@graphql-codegen/graphql-modules-preset': minor
52+
'@graphql-codegen/import-types-preset': minor
53+
'@graphql-codegen/near-operation-file-preset': minor
54+
'@graphql-codegen/plugin-helpers': minor
55+
---
56+
57+
support ESM

.github/workflows/main.yml

+2
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,5 @@ jobs:
5151
run: |
5252
yarn run generate:examples
5353
git diff --exit-code -- dev-test/
54+
- name: Test ESM
55+
run: node scripts/test-esm.mjs

bob.config.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
module.exports = {
2-
ignore: ['@graphql-codegen/website', '@graphql-codegen/live-demo', '@graphql-codegen/config-schema'],
2+
ignore: [
3+
'@graphql-codegen/website',
4+
'@graphql-codegen/live-demo',
5+
'@graphql-codegen/config-schema',
6+
'example-programmatic-typescript',
7+
],
38
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "example-programmatic-typescript",
3+
"version": "0.0.1",
4+
"private": true,
5+
"scripts": {
6+
"start:cjs": "tsup --onSuccess \"node dist/index.js\"",
7+
"start:mjs": "tsup --onSuccess \"node dist/index.mjs\""
8+
},
9+
"dependencies": {
10+
"@graphql-codegen/core": "*",
11+
"@graphql-codegen/typed-document-node": "*",
12+
"@graphql-codegen/typescript": "*",
13+
"@graphql-codegen/typescript-operations": "*",
14+
"@graphql-codegen/typescript-resolvers": "*",
15+
"@graphql-tools/graphql-file-loader": "^7.0.1",
16+
"@graphql-tools/load": "^7.1.0",
17+
"@graphql-tools/schema": "^8.0.1",
18+
"graphql": "^15.5.1",
19+
"graphql-tag": "^2.12.5",
20+
"prettier": "^2.3.2"
21+
},
22+
"devDependencies": {
23+
"@types/node": "^16.4.10",
24+
"tsup": "^4.12.5"
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import type { GraphQLResolveInfo } from 'graphql';
2+
import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
3+
export type Maybe<T> = T | null;
4+
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
5+
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
6+
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
7+
/** All built-in and custom scalars, mapped to their actual values */
8+
export type Scalars = {
9+
ID: string;
10+
String: string;
11+
Boolean: boolean;
12+
Int: number;
13+
Float: number;
14+
};
15+
16+
export type Query = {
17+
__typename?: 'Query';
18+
hello: Scalars['String'];
19+
};
20+
21+
export type ResolverTypeWrapper<T> = Promise<T> | T;
22+
23+
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
24+
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
25+
};
26+
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
27+
| ResolverFn<TResult, TParent, TContext, TArgs>
28+
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
29+
30+
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
31+
parent: TParent,
32+
args: TArgs,
33+
context: TContext,
34+
info: GraphQLResolveInfo
35+
) => Promise<TResult> | TResult;
36+
37+
export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (
38+
parent: TParent,
39+
args: TArgs,
40+
context: TContext,
41+
info: GraphQLResolveInfo
42+
) => AsyncIterator<TResult> | Promise<AsyncIterator<TResult>>;
43+
44+
export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (
45+
parent: TParent,
46+
args: TArgs,
47+
context: TContext,
48+
info: GraphQLResolveInfo
49+
) => TResult | Promise<TResult>;
50+
51+
export interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {
52+
subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;
53+
resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;
54+
}
55+
56+
export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {
57+
subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;
58+
resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;
59+
}
60+
61+
export type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =
62+
| SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>
63+
| SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;
64+
65+
export type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> =
66+
| ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)
67+
| SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;
68+
69+
export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
70+
parent: TParent,
71+
context: TContext,
72+
info: GraphQLResolveInfo
73+
) => Maybe<TTypes> | Promise<Maybe<TTypes>>;
74+
75+
export type IsTypeOfResolverFn<T = {}, TContext = {}> = (
76+
obj: T,
77+
context: TContext,
78+
info: GraphQLResolveInfo
79+
) => boolean | Promise<boolean>;
80+
81+
export type NextResolverFn<T> = () => Promise<T>;
82+
83+
export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs = {}> = (
84+
next: NextResolverFn<TResult>,
85+
parent: TParent,
86+
args: TArgs,
87+
context: TContext,
88+
info: GraphQLResolveInfo
89+
) => TResult | Promise<TResult>;
90+
91+
/** Mapping between all available schema types and the resolvers types */
92+
export type ResolversTypes = {
93+
Query: ResolverTypeWrapper<{}>;
94+
String: ResolverTypeWrapper<Scalars['String']>;
95+
Boolean: ResolverTypeWrapper<Scalars['Boolean']>;
96+
};
97+
98+
/** Mapping between all available schema types and the resolvers parents */
99+
export type ResolversParentTypes = {
100+
Query: {};
101+
String: Scalars['String'];
102+
Boolean: Scalars['Boolean'];
103+
};
104+
105+
export type QueryResolvers<
106+
ContextType = any,
107+
ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']
108+
> = {
109+
hello?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
110+
};
111+
112+
export type Resolvers<ContextType = any> = {
113+
Query?: QueryResolvers<ContextType>;
114+
};
115+
116+
export type HelloQueryVariables = Exact<{ [key: string]: never }>;
117+
118+
export type HelloQuery = { __typename?: 'Query'; hello: string };
119+
120+
export const HelloDocument = {
121+
kind: 'Document',
122+
definitions: [
123+
{
124+
kind: 'OperationDefinition',
125+
operation: 'query',
126+
name: { kind: 'Name', value: 'hello' },
127+
selectionSet: { kind: 'SelectionSet', selections: [{ kind: 'Field', name: { kind: 'Name', value: 'hello' } }] },
128+
},
129+
],
130+
} as unknown as DocumentNode<HelloQuery, HelloQueryVariables>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
query hello {
2+
hello
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/* eslint-disable no-console */
2+
3+
import { promises } from 'fs';
4+
import { parse, printSchema } from 'graphql';
5+
import gql from 'graphql-tag';
6+
import prettier from 'prettier';
7+
8+
import { codegen } from '@graphql-codegen/core';
9+
import * as typedDocumentNode from '@graphql-codegen/typed-document-node';
10+
import * as typescript from '@graphql-codegen/typescript';
11+
import * as typescriptOperations from '@graphql-codegen/typescript-operations';
12+
import * as typescriptResolvers from '@graphql-codegen/typescript-resolvers';
13+
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
14+
import { loadDocuments } from '@graphql-tools/load';
15+
import { makeExecutableSchema } from '@graphql-tools/schema';
16+
17+
import type { Resolvers } from './gql.generated';
18+
19+
const schema = makeExecutableSchema({
20+
typeDefs: gql`
21+
type Query {
22+
hello: String!
23+
}
24+
`,
25+
resolvers: {
26+
Query: {
27+
hello(_root, _args, _ctx) {
28+
return 'world';
29+
},
30+
},
31+
} as Resolvers<unknown>,
32+
});
33+
34+
(async () => {
35+
const loadedDocuments = await loadDocuments(['src/graphql/**/*.gql'], {
36+
loaders: [new GraphQLFileLoader()],
37+
});
38+
39+
const config: typescript.TypeScriptPluginConfig &
40+
typescriptResolvers.TypeScriptResolversPluginConfig &
41+
typescriptOperations.TypeScriptDocumentsPluginConfig &
42+
typedDocumentNode.TypeScriptTypedDocumentNodesConfig = {
43+
useTypeImports: true,
44+
};
45+
46+
const codegenCode = await codegen({
47+
schema: parse(printSchema(schema)),
48+
config,
49+
documents: loadedDocuments,
50+
filename: 'gql.generated.ts',
51+
pluginMap: {
52+
typescript,
53+
typescriptResolvers,
54+
typescriptOperations,
55+
typedDocumentNode,
56+
},
57+
plugins: [
58+
{
59+
typescript: {},
60+
},
61+
{
62+
typescriptResolvers: {},
63+
},
64+
{
65+
typescriptOperations: {},
66+
},
67+
{
68+
typedDocumentNode: {},
69+
},
70+
],
71+
});
72+
73+
await promises.writeFile(
74+
'src/gql.generated.ts',
75+
prettier.format(codegenCode, {
76+
...(await prettier.resolveConfig(process.cwd())),
77+
parser: 'typescript',
78+
}),
79+
{
80+
encoding: 'utf-8',
81+
}
82+
);
83+
})().catch(err => {
84+
console.error(err);
85+
process.exit(1);
86+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"extends": "../../tsconfig.json",
3+
"compilerOptions": {
4+
"target": "es2020",
5+
"module": "commonjs",
6+
"strict": true,
7+
"esModuleInterop": true,
8+
"skipLibCheck": true,
9+
"forceConsistentCasingInFileNames": true,
10+
"rootDir": "../../"
11+
},
12+
"include": ["src/**/*.ts"]
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export const tsup: import('tsup').Options = {
2+
target: 'es2019',
3+
entryPoints: ['src/index.ts'],
4+
format: ['cjs', 'esm'],
5+
ignoreWatch: ['src/ez.generated.ts'],
6+
};

0 commit comments

Comments
 (0)