feat(gql/catalog): Reduce the amount of duplication a little for unions
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
overwrite: true
|
||||
schema: ./src/schema.gql
|
||||
schema: ./schema.gql
|
||||
require:
|
||||
- ts-node/register/transpile-only
|
||||
generates:
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
|
||||
@@ -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>;
|
||||
|
||||
Reference in New Issue
Block a user