feat(gql/catalog): Reduce the amount of duplication a little for unions

This commit is contained in:
blam
2020-08-10 18:50:08 +02:00
parent e01952279e
commit 90579b9089
4 changed files with 156 additions and 10 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
overwrite: true
schema: ./src/schema.gql
schema: ./schema.gql
require:
- ts-node/register/transpile-only
generates:
+36 -2
View File
@@ -1,9 +1,43 @@
scalar JSON
scalar JSONObject
type EntityMetadata {
interface EntityMetadata {
name: String!
annotations: JSONObject!
annotation(name: String!): JSON
labels: JSONObject!
label(name: String!): JSON
uid: String!
etag: String!
generation: Int!
}
type ComponentMetadata implements EntityMetadata {
name: String!
annotations: JSONObject!
annotation(name: String!): JSON
labels: JSONObject!
label(name: String!): JSON
uid: String!
etag: String!
generation: Int!
relationships: String!
}
type TemplateMetadata implements EntityMetadata {
name: String!
annotations: JSONObject!
annotation(name: String!): JSON
labels: JSONObject!
label(name: String!): JSON
uid: String!
etag: String!
generation: Int!
updatedBy: String!
}
type DefaultEntityMetadata implements EntityMetadata {
name: String!
namespace: String!
annotations: JSONObject!
annotation(name: String!): JSON
labels: JSONObject!
+52 -2
View File
@@ -17,8 +17,14 @@
import { Logger } from 'winston';
import fs from 'fs';
import path from 'path';
import { makeExecutableSchema } from 'apollo-server';
import { GraphQLModule } from '@graphql-modules/core';
import { Resolvers, CatalogQuery } from './types';
import {
Resolvers,
CatalogQuery,
CatalogEntityTypes,
EntityMetadataResolvers,
} from './types';
import { Config } from '@backstage/config';
import { CatalogClient } from '../service/client';
import GraphQLJSON, { GraphQLJSONObject } from 'graphql-type-json';
@@ -33,6 +39,19 @@ const schemaPath = path.resolve(
'../schema.gql',
);
const getSpecTypenameForEntity = (e: { kind?: string }) => {
switch (e.kind) {
case 'Component':
return 'ComponentEntity';
case 'Location':
return 'LocationEntity';
case 'Template':
return 'TemplateEntity';
default:
return null;
}
};
export async function createModule(
options: ModuleOptions,
): Promise<GraphQLModule> {
@@ -53,15 +72,46 @@ export async function createModule(
return await catalogClient.list();
},
},
ComponentMetadata: {
relationships: () => 'boop',
},
TemplateMetadata: {
updatedBy: () => 'blam',
},
CatalogEntity: {
metadata: e => ({ ...e.metadata!, catalogEntity: e }),
},
EntityMetadata: {
__resolveType: (obj: any) => {
const kind = obj.catalogEntity!.kind;
switch (kind) {
case 'Component':
return 'ComponentMetadata';
case 'Template':
return 'TemplateMetadata';
default:
return 'DefaultEntityMetadata';
}
},
annotation: (e, { name }) => e.annotations?.[name] ?? null,
labels: e => e ?? {},
annotations: e => e ?? {},
label: (e, { name }) => e.labels?.[name] ?? null,
},
};
const module = new GraphQLModule({
const schema = makeExecutableSchema({
typeDefs,
resolvers,
inheritResolversFromInterfaces: true,
resolverValidationOptions: {
allowResolversNotInSchema: true,
},
});
const module = new GraphQLModule({
resolverValidationOptions: {},
extraSchemas: [schema],
logger: options.logger as any,
});
+67 -5
View File
@@ -33,9 +33,7 @@ export type Scalars = {
export type EntityMetadata = {
__typename?: 'EntityMetadata';
name: Scalars['String'];
namespace: Scalars['String'];
annotations: Scalars['JSONObject'];
annotation?: Maybe<Scalars['JSON']>;
labels: Scalars['JSONObject'];
@@ -55,6 +53,39 @@ export type EntityMetadataLabelArgs = {
name: Scalars['String'];
};
export type ComponentMetadata = EntityMetadata & {
__typename?: 'ComponentMetadata';
relationships: Scalars['String'];
};
export type TemplateMetadata = EntityMetadata & {
__typename?: 'TemplateMetadata';
updatedBy: Scalars['String'];
};
export type DefaultEntityMetadata = EntityMetadata & {
__typename?: 'DefaultEntityMetadata';
name: Scalars['String'];
annotations: Scalars['JSONObject'];
annotation?: Maybe<Scalars['JSON']>;
labels: Scalars['JSONObject'];
label?: Maybe<Scalars['JSON']>;
uid: Scalars['String'];
etag: Scalars['String'];
generation: Scalars['Int'];
updatedBy: Scalars['String'];
};
export type DefaultEntityMetadataAnnotationArgs = {
name: Scalars['String'];
};
export type DefaultEntityMetadataLabelArgs = {
name: Scalars['String'];
};
export type CatalogEntity = {
__typename?: 'CatalogEntity';
apiVersion: Scalars['String'];
@@ -153,9 +184,12 @@ export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs
export type ResolversTypes = ResolversObject<{
JSON: ResolverTypeWrapper<Partial<Scalars['JSON']>>;
JSONObject: ResolverTypeWrapper<Partial<Scalars['JSONObject']>>;
EntityMetadata: ResolverTypeWrapper<Partial<EntityMetadata>>;
EntityMetadata: ResolversTypes['ComponentMetadata'] | ResolversTypes['TemplateMetadata'] | ResolversTypes['DefaultEntityMetadata'];
String: ResolverTypeWrapper<Partial<Scalars['String']>>;
Int: ResolverTypeWrapper<Partial<Scalars['Int']>>;
ComponentMetadata: ResolverTypeWrapper<Partial<ComponentMetadata>>;
TemplateMetadata: ResolverTypeWrapper<Partial<TemplateMetadata>>;
DefaultEntityMetadata: ResolverTypeWrapper<Partial<DefaultEntityMetadata>>;
CatalogEntity: ResolverTypeWrapper<Partial<CatalogEntity>>;
CatalogQuery: ResolverTypeWrapper<Partial<CatalogQuery>>;
Query: ResolverTypeWrapper<{}>;
@@ -166,9 +200,12 @@ export type ResolversTypes = ResolversObject<{
export type ResolversParentTypes = ResolversObject<{
JSON: Partial<Scalars['JSON']>;
JSONObject: Partial<Scalars['JSONObject']>;
EntityMetadata: Partial<EntityMetadata>;
EntityMetadata: ResolversParentTypes['ComponentMetadata'] | ResolversParentTypes['TemplateMetadata'] | ResolversParentTypes['DefaultEntityMetadata'];
String: Partial<Scalars['String']>;
Int: Partial<Scalars['Int']>;
ComponentMetadata: Partial<ComponentMetadata>;
TemplateMetadata: Partial<TemplateMetadata>;
DefaultEntityMetadata: Partial<DefaultEntityMetadata>;
CatalogEntity: Partial<CatalogEntity>;
CatalogQuery: Partial<CatalogQuery>;
Query: {};
@@ -184,8 +221,8 @@ export interface JsonObjectScalarConfig extends GraphQLScalarTypeConfig<Resolver
}
export type EntityMetadataResolvers<ContextType = ModuleContext, ParentType extends ResolversParentTypes['EntityMetadata'] = ResolversParentTypes['EntityMetadata']> = ResolversObject<{
__resolveType: TypeResolveFn<'ComponentMetadata' | 'TemplateMetadata' | 'DefaultEntityMetadata', ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
namespace?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
annotations?: Resolver<ResolversTypes['JSONObject'], ParentType, ContextType>;
annotation?: Resolver<Maybe<ResolversTypes['JSON']>, ParentType, ContextType, RequireFields<EntityMetadataAnnotationArgs, 'name'>>;
labels?: Resolver<ResolversTypes['JSONObject'], ParentType, ContextType>;
@@ -193,6 +230,28 @@ export type EntityMetadataResolvers<ContextType = ModuleContext, ParentType exte
uid?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
etag?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
generation?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
}>;
export type ComponentMetadataResolvers<ContextType = ModuleContext, ParentType extends ResolversParentTypes['ComponentMetadata'] = ResolversParentTypes['ComponentMetadata']> = ResolversObject<{
relationships?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType>;
}>;
export type TemplateMetadataResolvers<ContextType = ModuleContext, ParentType extends ResolversParentTypes['TemplateMetadata'] = ResolversParentTypes['TemplateMetadata']> = ResolversObject<{
updatedBy?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType>;
}>;
export type DefaultEntityMetadataResolvers<ContextType = ModuleContext, ParentType extends ResolversParentTypes['DefaultEntityMetadata'] = ResolversParentTypes['DefaultEntityMetadata']> = ResolversObject<{
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
annotations?: Resolver<ResolversTypes['JSONObject'], ParentType, ContextType>;
annotation?: Resolver<Maybe<ResolversTypes['JSON']>, ParentType, ContextType, RequireFields<DefaultEntityMetadataAnnotationArgs, 'name'>>;
labels?: Resolver<ResolversTypes['JSONObject'], ParentType, ContextType>;
label?: Resolver<Maybe<ResolversTypes['JSON']>, ParentType, ContextType, RequireFields<DefaultEntityMetadataLabelArgs, 'name'>>;
uid?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
etag?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
generation?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
updatedBy?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType>;
}>;
@@ -216,6 +275,9 @@ export type Resolvers<ContextType = ModuleContext> = ResolversObject<{
JSON?: GraphQLScalarType;
JSONObject?: GraphQLScalarType;
EntityMetadata?: EntityMetadataResolvers<ContextType>;
ComponentMetadata?: ComponentMetadataResolvers<ContextType>;
TemplateMetadata?: TemplateMetadataResolvers<ContextType>;
DefaultEntityMetadata?: DefaultEntityMetadataResolvers<ContextType>;
CatalogEntity?: CatalogEntityResolvers<ContextType>;
CatalogQuery?: CatalogQueryResolvers<ContextType>;
Query?: QueryResolvers<ContextType>;