Skip to content

Commit

Permalink
fix: multiple small federation related fixes, also dealing with multi…
Browse files Browse the repository at this point in the history
…ple capital letters in names (#726)
  • Loading branch information
lgandecki authored Jan 25, 2021
1 parent 3046681 commit 88530be
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 18 deletions.
12 changes: 12 additions & 0 deletions generateModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const finder = require('find-package-json');
const shelljs = require('shelljs');
const { Source, buildSchema } = require('graphql');
const path = require('path');
const { pascalCase } = require('pascal-case');

const getModuleInfos = require('./parse-graphql/getModuleInfos');
const getModuleNames = require('./parse-graphql/getModuleNames');
Expand Down Expand Up @@ -136,6 +137,7 @@ const execute = (appPrefix = '@app', generatedPrefix = '@generated', modulesPath
moduleName,
hasArguments,
generatedPrefix,
pascalCasedArgName: `Query${pascalCase(queryName)}Args`,
};
const filePath = `${projectMainPath}/src/${graphqlFileRootPath}/queries/`;
const fileName = `${queryName}Query.spec.ts`;
Expand All @@ -152,6 +154,7 @@ const execute = (appPrefix = '@app', generatedPrefix = '@generated', modulesPath
generatedPrefix,
appPrefix,
graphqlFileRootPath,
pascalCasedArgName: `Query${pascalCase(queryName)}Args`,
};
const filePath = `${projectMainPath}/generated/graphql/helpers/`;
const fileName = `${queryName}QuerySpecWrapper.ts`;
Expand Down Expand Up @@ -191,6 +194,7 @@ const execute = (appPrefix = '@app', generatedPrefix = '@generated', modulesPath
generatedPrefix,
appPrefix,
graphqlFileRootPath,
pascalCasedArgName: `Mutation${pascalCase(mutationName)}Args`,
};
const filePath = `${projectMainPath}/src/${graphqlFileRootPath}/mutations/`;
const fileName = `${mutationName}Mutation.spec.ts`;
Expand All @@ -207,6 +211,7 @@ const execute = (appPrefix = '@app', generatedPrefix = '@generated', modulesPath
generatedPrefix,
appPrefix,
graphqlFileRootPath,
pascalCasedArgName: `Mutation${pascalCase(mutationName)}Args`,
};
const filePath = `${projectMainPath}/generated/graphql/helpers/`;

Expand Down Expand Up @@ -319,8 +324,12 @@ const execute = (appPrefix = '@app', generatedPrefix = '@generated', modulesPath
);
}

let isFederatedAndExternal = false;
if (federatedEntities.find((e) => e === typeDef.name)) {
filtered.push({ name: { value: '__resolveReference' }, resolveReferenceType: true });
isFederatedAndExternal =
type.astNode &&
!!type.astNode.fields.find((field) => field.directives.find((d) => d.name.value === 'external'));
}

filtered.forEach(({ name: { value }, resolveReferenceType }) => {
Expand Down Expand Up @@ -352,6 +361,7 @@ const execute = (appPrefix = '@app', generatedPrefix = '@generated', modulesPath
resolveReferenceType,
capitalizedFieldName,
generatedPrefix,
pascalCasedArgName: `${typeDef.name}${pascalCase(capitalizedFieldName)}Args`,
};
const filePath = `${projectMainPath}/src/${graphqlFileRootPath}/types/`;
const fileName = `${typeDef.name}${capitalizedFieldName}.spec.ts`;
Expand All @@ -372,6 +382,8 @@ const execute = (appPrefix = '@app', generatedPrefix = '@generated', modulesPath
generatedPrefix,
appPrefix,
graphqlFileRootPath,
isFederatedAndExternal,
pascalCasedArgName: `${typeDef.name}${pascalCase(capitalizedFieldName)}Args`,
};
const filePath = `${projectMainPath}/generated/graphql/helpers/`;
const fileName = `${typeDef.name}${capitalizedFieldName}SpecWrapper.ts`;
Expand Down
2 changes: 1 addition & 1 deletion parse-graphql/getFederatedEntities.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module.exports = (graphqlString) => {

return graphqlAST.definitions
.filter((d) => ['Mutation', 'Query', 'Subscription'].indexOf(d.name.value) === -1)
.filter((d) => ['ObjectTypeDefinition'].indexOf(d.kind) > -1)
.filter((d) => ['ObjectTypeDefinition', 'ObjectTypeExtension'].indexOf(d.kind) > -1)
.filter((d) => {
return d.directives && d.directives.find((d) => d.name.value === 'key');
})
Expand Down
4 changes: 2 additions & 2 deletions templates/mutation.spec.handlebars
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import td from "testdouble";

import { GqlContext, {{#if hasArguments}}Mutation{{toUpperCase mutationName}}Args,{{/if}} test{{toUpperCase mutationName}} } from "{{generatedPrefix}}/graphql/helpers/{{mutationName}}MutationSpecWrapper"
import { GqlContext, {{#if hasArguments}}{{pascalCasedArgName}},{{/if}} test{{toUpperCase mutationName}} } from "{{generatedPrefix}}/graphql/helpers/{{mutationName}}MutationSpecWrapper"


test("{{mutationName}}", async () => {

const context = td.object<GqlContext>();
// td.when(context.{{moduleName}}Repository.findOne()).thenResolve()
{{#if hasArguments}}
const variables: Mutation{{toUpperCase mutationName}}Args = {}
const variables: {{pascalCasedArgName}} = {}
{{/if}}

const result = await test{{toUpperCase mutationName}}({{#if hasArguments}}variables,{{/if}} context);
Expand Down
6 changes: 3 additions & 3 deletions templates/mutationSpecWrapper.handlebars
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { GraphQLResolveInfo } from 'graphql'
import { GqlContext, {{#if hasArguments}}Mutation{{toUpperCase mutationName}}Args{{/if}} } from "{{generatedPrefix}}/graphql/types";
import { GqlContext, {{#if hasArguments}}{{pascalCasedArgName}}{{/if}} } from "{{generatedPrefix}}/graphql/types";
import { {{mutationName}}Mutation } from "{{appPrefix}}/{{graphqlFileRootPath}}mutations/{{mutationName}}Mutation";

export const test{{toUpperCase mutationName}} = ({{#if hasArguments}}variables: Mutation{{toUpperCase mutationName}}Args, {{/if}}context: GqlContext) => {{mutationName}}Mutation?.({}, {{#if hasArguments}}variables{{else}} {} {{/if}}, context, {} as GraphQLResolveInfo)
export const test{{toUpperCase mutationName}} = ({{#if hasArguments}}variables: {{pascalCasedArgName}}, {{/if}}context: GqlContext) => {{mutationName}}Mutation?.({}, {{#if hasArguments}}variables{{else}} {} {{/if}}, context, {} as GraphQLResolveInfo)

export type {GqlContext, {{#if hasArguments}}Mutation{{toUpperCase mutationName}}Args{{/if}} }
export type {GqlContext, {{#if hasArguments}}{{pascalCasedArgName}}{{/if}} }
4 changes: 2 additions & 2 deletions templates/query.spec.handlebars
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import td from "testdouble";
import { GqlContext, {{#if hasArguments}}Query{{toUpperCase queryName}}Args,{{/if}} test{{toUpperCase queryName}} } from "{{generatedPrefix}}/graphql/helpers/{{queryName}}QuerySpecWrapper"
import { GqlContext, {{#if hasArguments}}{{pascalCasedArgName}},{{/if}} test{{toUpperCase queryName}} } from "{{generatedPrefix}}/graphql/helpers/{{queryName}}QuerySpecWrapper"

test("{{queryName}}", async () => {

Expand All @@ -8,7 +8,7 @@ test("{{queryName}}", async () => {
// td.when(context.{{moduleName}}Repository.findOne()).thenResolve()

{{#if hasArguments}}
const variables: Query{{toUpperCase queryName}}Args = {}
const variables: {{pascalCasedArgName}} = {}
{{/if}}

const result = await test{{toUpperCase queryName}}({{#if hasArguments}}variables,{{/if}} context);
Expand Down
6 changes: 3 additions & 3 deletions templates/querySpecWrapper.handlebars
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { GraphQLResolveInfo } from 'graphql'
import { GqlContext, {{#if hasArguments}}Query{{toUpperCase queryName}}Args{{/if}} } from "{{generatedPrefix}}/graphql/types";
import { GqlContext, {{#if hasArguments}}{{pascalCasedArgName}}{{/if}} } from "{{generatedPrefix}}/graphql/types";
import { {{queryName}}Query } from "{{appPrefix}}/{{graphqlFileRootPath}}queries/{{queryName}}Query";


export const test{{toUpperCase queryName}} = ({{#if hasArguments}}variables: Query{{toUpperCase queryName}}Args,{{/if}} context: GqlContext) => {{queryName}}Query?.({}, {{#if hasArguments}}variables{{else}} {} {{/if}}, context, {} as GraphQLResolveInfo)
export const test{{toUpperCase queryName}} = ({{#if hasArguments}}variables: {{pascalCasedArgName}},{{/if}} context: GqlContext) => {{queryName}}Query?.({}, {{#if hasArguments}}variables{{else}} {} {{/if}}, context, {} as GraphQLResolveInfo)


export type {GqlContext, {{#if hasArguments}}Query{{toUpperCase queryName}}Args{{/if}} }
export type {GqlContext, {{#if hasArguments}}{{pascalCasedArgName}}{{/if}} }
6 changes: 3 additions & 3 deletions templates/typeTypeResolvers.spec.handlebars
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import td from "testdouble";
import { GqlContext, ResolversParentTypes, test{{typeName}}{{capitalizedFieldName}} {{#if hasArguments}},{{typeName}}{{capitalizedFieldName}}Args{{/if}} } from "{{generatedPrefix}}/graphql/helpers/{{typeName}}{{capitalizedFieldName}}SpecWrapper"
import { GqlContext, ParentType, test{{typeName}}{{capitalizedFieldName}} {{#if hasArguments}},{{pascalCasedArgName}}{{/if}} } from "{{generatedPrefix}}/graphql/helpers/{{typeName}}{{capitalizedFieldName}}SpecWrapper"

test("{{typeName}}{{capitalizedFieldName}}", async () => {
const context = td.object<GqlContext>();
// td.when(context.{{moduleName}}Repository.findOne()).thenResolve()
const parent{{#if resolveReferenceType}} = {} as ParentType {{else}} = {} as ResolversParentTypes["{{typeName}}"]{{/if}}
const parent = {} as ParentType
{{#if hasArguments}}
const variables = {} as {{typeName}}{{capitalizedFieldName}}Args
const variables = {} as {{pascalCasedArgName}}
{{/if}}

const result = await test{{typeName}}{{capitalizedFieldName}}(parent, {{#if hasArguments}}variables,{{/if}} context);
Expand Down
10 changes: 6 additions & 4 deletions templates/typeTypeResolversSpecWrapper.handlebars
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { GraphQLResolveInfo } from 'graphql'
import type { GqlContext, ResolversParentTypes, {{#if hasArguments}}{{typeName}}{{capitalizedFieldName}}Args{{/if}} } from "{{generatedPrefix}}/graphql/types";
import type { GqlContext, ResolversParentTypes, {{#if hasArguments}}{{pascalCasedArgName}}{{/if}} } from "{{generatedPrefix}}/graphql/types";
import { {{typeName}}{{capitalizedFieldName}} } from "{{appPrefix}}/{{graphqlFileRootPath}}types/{{typeName}}{{capitalizedFieldName}}";

{{#if resolveReferenceType}}type ParentType = Parameters<typeof {{typeName}}{{capitalizedFieldName}}>[0];{{/if}}
{{#if resolveReferenceType}}type ParentType = Parameters<NonNullable<typeof {{typeName}}{{capitalizedFieldName}}>>[0];{{else}}
type ParentType = ResolversParentTypes["{{typeName}}"]
{{/if}}

export const test{{typeName}}{{capitalizedFieldName}} = (parent: {{#if resolveReferenceType}}ParentType{{else}}ResolversParentTypes["{{typeName}}"]{{/if}}, {{#if hasArguments}}variables: {{typeName}}{{capitalizedFieldName}}Args,{{/if}} context: GqlContext) => {{typeName}}{{capitalizedFieldName}}?.({...parent, __typename: '{{typeName}}'}, {{#unless resolveReferenceType}}{{#if hasArguments}}variables{{else}} {} {{/if}},{{/unless}} context, {} as GraphQLResolveInfo)
export const test{{typeName}}{{capitalizedFieldName}} = (parent: ParentType, {{#if hasArguments}}variables: {{pascalCasedArgName}},{{/if}} context: GqlContext) => {{typeName}}{{capitalizedFieldName}}?.({...parent, {{#if isFederatedAndExternal}}__typename: '{{typeName}}'{{/if}} }, {{#unless resolveReferenceType}}{{#if hasArguments}}variables{{else}} {} {{/if}},{{/unless}} context, {} as GraphQLResolveInfo)

export type {GqlContext, ResolversParentTypes {{#if hasArguments}},{{typeName}}{{capitalizedFieldName}}Args{{/if}} }
export type {GqlContext, ParentType, ResolversParentTypes {{#if hasArguments}},{{pascalCasedArgName}}{{/if}} }

0 comments on commit 88530be

Please sign in to comment.