diff --git a/plugins/catalog-graphql/codegen.yml b/plugins/catalog-graphql/codegen.yml new file mode 100644 index 0000000000..c9e0173256 --- /dev/null +++ b/plugins/catalog-graphql/codegen.yml @@ -0,0 +1,15 @@ +overwrite: true +schema: ./src/schema.gql # You can use .js files as well +require: + - ts-node/register/transpile-only # required if you're using TS-Node +generates: + ./src/generated-models.ts: + plugins: + - typescript + - typescript-resolvers + + hooks: + afterOneFileWrite: + - prettier --write + config: + contextType: '@graphql-modules/core#ModuleContext' diff --git a/plugins/catalog-graphql/package.json b/plugins/catalog-graphql/package.json index 57fade9654..8c478e767b 100644 --- a/plugins/catalog-graphql/package.json +++ b/plugins/catalog-graphql/package.json @@ -22,12 +22,15 @@ }, "dependencies": { "@backstage/backend-common": "^0.1.1-alpha.16", + "@graphql-codegen/cli": "^1.17.7", + "@graphql-codegen/typescript": "^1.17.7", + "@graphql-codegen/typescript-resolvers": "^1.17.7", "@graphql-modules/core": "^0.7.17", "@types/express": "^4.17.6", "@types/whatwg-fetch": "^0.0.33", "graphql": "^15.3.0", "node-fetch": "^2.6.0", - "whatwg-fetch": "^2.0.0", + "ts-node": "^8.10.2", "winston": "^3.2.1", "yn": "^4.0.0" }, diff --git a/plugins/catalog-graphql/src/generated-models.ts b/plugins/catalog-graphql/src/generated-models.ts new file mode 100644 index 0000000000..f0f7f2f372 --- /dev/null +++ b/plugins/catalog-graphql/src/generated-models.ts @@ -0,0 +1,288 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { GraphQLResolveInfo } from 'graphql'; +import { ModuleContext } from '@graphql-modules/core'; + +export type Maybe = T | null; +export type Exact = { + [K in keyof T]: T[K]; +}; +export type RequireFields = { + [X in Exclude]?: T[X]; +} & + { [P in K]-?: NonNullable }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string; + String: string; + Boolean: boolean; + Int: number; + Float: number; +}; + +export type EntityMetadataAnnotation = { + __typename?: 'EntityMetadataAnnotation'; + key: Scalars['String']; + value: Scalars['String']; +}; + +export type EntityMetadata = { + __typename?: 'EntityMetadata'; + name: Scalars['String']; + namespace?: Maybe; + annotation?: Maybe; + annotations: Array; +}; + +export type EntityMetadataAnnotationArgs = { + name?: Maybe; +}; + +export type CatalogEntity = { + __typename?: 'CatalogEntity'; + apiVersion?: Maybe; + kind: Scalars['String']; + metadata?: Maybe; +}; + +export type CatalogQuery = { + __typename?: 'CatalogQuery'; + list: Array; +}; + +export type Query = { + __typename?: 'Query'; + catalog: CatalogQuery; +}; + +export type ResolverTypeWrapper = Promise | T; + +export type LegacyStitchingResolver = { + fragment: string; + resolve: ResolverFn; +}; + +export type NewStitchingResolver = { + selectionSet: string; + resolve: ResolverFn; +}; +export type StitchingResolver = + | LegacyStitchingResolver + | NewStitchingResolver; +export type Resolver = + | ResolverFn + | StitchingResolver; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, +) => AsyncIterator | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, +) => TResult | Promise; + +export interface SubscriptionSubscriberObject< + TResult, + TKey extends string, + TParent, + TContext, + TArgs +> { + subscribe: SubscriptionSubscribeFn< + { [key in TKey]: TResult }, + TParent, + TContext, + TArgs + >; + resolve?: SubscriptionResolveFn< + TResult, + { [key in TKey]: TResult }, + TContext, + TArgs + >; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject< + TResult, + TKey extends string, + TParent, + TContext, + TArgs +> = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver< + TResult, + TKey extends string, + TParent = {}, + TContext = {}, + TArgs = {} +> = + | (( + ...args: any[] + ) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo, +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = ( + obj: T, + info: GraphQLResolveInfo, +) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn< + TResult = {}, + TParent = {}, + TContext = {}, + TArgs = {} +> = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, +) => TResult | Promise; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = { + EntityMetadataAnnotation: ResolverTypeWrapper; + String: ResolverTypeWrapper; + EntityMetadata: ResolverTypeWrapper; + CatalogEntity: ResolverTypeWrapper; + CatalogQuery: ResolverTypeWrapper; + Query: ResolverTypeWrapper<{}>; + Boolean: ResolverTypeWrapper; +}; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = { + EntityMetadataAnnotation: EntityMetadataAnnotation; + String: Scalars['String']; + EntityMetadata: EntityMetadata; + CatalogEntity: CatalogEntity; + CatalogQuery: CatalogQuery; + Query: {}; + Boolean: Scalars['Boolean']; +}; + +export type EntityMetadataAnnotationResolvers< + ContextType = ModuleContext, + ParentType extends ResolversParentTypes['EntityMetadataAnnotation'] = ResolversParentTypes['EntityMetadataAnnotation'] +> = { + key?: Resolver; + value?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type EntityMetadataResolvers< + ContextType = ModuleContext, + ParentType extends ResolversParentTypes['EntityMetadata'] = ResolversParentTypes['EntityMetadata'] +> = { + name?: Resolver; + namespace?: Resolver< + Maybe, + ParentType, + ContextType + >; + annotation?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + >; + annotations?: Resolver< + Array, + ParentType, + ContextType + >; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CatalogEntityResolvers< + ContextType = ModuleContext, + ParentType extends ResolversParentTypes['CatalogEntity'] = ResolversParentTypes['CatalogEntity'] +> = { + apiVersion?: Resolver< + Maybe, + ParentType, + ContextType + >; + kind?: Resolver; + metadata?: Resolver< + Maybe, + ParentType, + ContextType + >; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CatalogQueryResolvers< + ContextType = ModuleContext, + ParentType extends ResolversParentTypes['CatalogQuery'] = ResolversParentTypes['CatalogQuery'] +> = { + list?: Resolver< + Array, + ParentType, + ContextType + >; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QueryResolvers< + ContextType = ModuleContext, + ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query'] +> = { + catalog?: Resolver; +}; + +export type Resolvers = { + EntityMetadataAnnotation?: EntityMetadataAnnotationResolvers; + EntityMetadata?: EntityMetadataResolvers; + CatalogEntity?: CatalogEntityResolvers; + CatalogQuery?: CatalogQueryResolvers; + Query?: QueryResolvers; +}; + +/** + * @deprecated + * Use "Resolvers" root object instead. If you wish to get "IResolvers", add "typesPrefix: I" to your config. + */ +export type IResolvers = Resolvers; diff --git a/plugins/catalog-graphql/src/graphql/module.ts b/plugins/catalog-graphql/src/graphql/module.ts index 65239d27db..7648b7d302 100644 --- a/plugins/catalog-graphql/src/graphql/module.ts +++ b/plugins/catalog-graphql/src/graphql/module.ts @@ -19,6 +19,7 @@ import fetch from 'node-fetch'; import fs from 'fs'; import path from 'path'; import { GraphQLModule } from '@graphql-modules/core'; +import { QueryResolvers } from './types'; export interface ModuleOptions { logger: Logger; diff --git a/plugins/catalog-graphql/src/index.ts b/plugins/catalog-graphql/src/index.ts index dd6508f88a..2e3f1c1fe2 100644 --- a/plugins/catalog-graphql/src/index.ts +++ b/plugins/catalog-graphql/src/index.ts @@ -14,6 +14,4 @@ * limitations under the License. */ -require('whatwg-fetch'); - export * from './graphql/module'; diff --git a/plugins/catalog-graphql/src/setupTests.ts b/plugins/catalog-graphql/src/setupTests.ts index ac41ef995a..1485402d0d 100644 --- a/plugins/catalog-graphql/src/setupTests.ts +++ b/plugins/catalog-graphql/src/setupTests.ts @@ -13,6 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -require('whatwg-fetch'); - export {};