diff --git a/change/@graphitation-cli-9daabaa8-a16b-4993-b562-42feaa6b8ba4.json b/change/@graphitation-cli-9daabaa8-a16b-4993-b562-42feaa6b8ba4.json new file mode 100644 index 000000000..eae72ee01 --- /dev/null +++ b/change/@graphitation-cli-9daabaa8-a16b-4993-b562-42feaa6b8ba4.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Resolver context type - subtype can be optional", + "packageName": "@graphitation/cli", + "email": "77059398+vejrj@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@graphitation-ts-codegen-7723a5bd-74e9-467a-9709-1adc838d0612.json b/change/@graphitation-ts-codegen-7723a5bd-74e9-467a-9709-1adc838d0612.json new file mode 100644 index 000000000..fe8b5c9b0 --- /dev/null +++ b/change/@graphitation-ts-codegen-7723a5bd-74e9-467a-9709-1adc838d0612.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Resolver context type - subtype can be optional", + "packageName": "@graphitation/ts-codegen", + "email": "77059398+vejrj@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/cli/src/supermassive.ts b/packages/cli/src/supermassive.ts index 8bd716d82..2cf7c01a7 100644 --- a/packages/cli/src/supermassive.ts +++ b/packages/cli/src/supermassive.ts @@ -72,7 +72,7 @@ export function supermassive(): Command { ) .option( "--context-type-extensions-file [contextTypeExtensionsFile]", - "Describes context types and their import paths. Used to generate resolver context type extensions. The file must be defined in the following format: { baseContextTypePath?: string, baseContextTypeName?: string, contextTypes: { [namespace: string]: { [type: string]: { importNamespaceName?: string, importPath: string, typeName: string }}}", + "Describes context types and their import paths. Used to generate resolver context type extensions. The file must be defined in the following format: { baseContextTypePath?: string, baseContextTypeName?: string, contextTypes: { [namespace: string]: { [type: string]: { importNamespaceName?: string, importPath: string, typeName: string, optional?: boolean }}}", ) .option( "--generate-resolver-map", diff --git a/packages/ts-codegen/src/__tests__/context.test.ts b/packages/ts-codegen/src/__tests__/context.test.ts index 05fd796b5..9768388cb 100644 --- a/packages/ts-codegen/src/__tests__/context.test.ts +++ b/packages/ts-codegen/src/__tests__/context.test.ts @@ -21,6 +21,11 @@ describe(generateTS, () => { importPath: "@package/whatever-state-machine", typeName: "whatever", }, + optionalWhatever: { + importPath: "@package/whatever-state-machine", + typeName: "optionalWhatever", + optional: true, + }, "different-whatever": { importNamespaceName: "DifferentWhateverStateMachineType", importPath: "@package/different-whatever-state-machine", @@ -31,6 +36,7 @@ describe(generateTS, () => { importNamespaceName: "PostStateMachineType", importPath: "@package/post-state-machine", typeName: 'PostStateMachineType["post"]', + optional: true, }, node: { importNamespaceName: "NodeStateMachineType", @@ -96,7 +102,10 @@ describe(generateTS, () => { } type User @context(uses: { managers: ["user"] }) { - id: ID! @context(uses: { managers: ["id-user", "user"] }) + id: ID! + @context( + uses: { managers: ["id-user", "user", "optionalWhatever"] } + ) name: String messagesWithAnswersNonRequired: [[Message]] messagesWithAnswersRequired: [[Message]]! @@ -149,6 +158,7 @@ describe(generateTS, () => { "managers": [ "id-user", "user", + "optionalWhatever", ], }, "messagesNonRequired": { @@ -245,6 +255,7 @@ describe(generateTS, () => { import type { DefaultContextType } from "@package/default-context"; import type { MessageStateMachineType } from "@package/message-state-machine"; import type { UserStateMachineType } from "@package/user-state-machine"; + import type { optionalWhatever } from "@package/whatever-state-machine"; import type { PostStateMachineType } from "@package/post-state-machine"; export declare namespace Post { export interface Resolvers { @@ -282,6 +293,7 @@ describe(generateTS, () => { managers: { "id-user": UserStateMachineType["id-user"]; "user": UserStateMachineType["user"]; + "optionalWhatever"?: optionalWhatever; }; }, info: ResolveInfo) => PromiseOrValue; export type name = (model: Models.User, args: {}, context: DefaultContextType & { @@ -326,7 +338,7 @@ describe(generateTS, () => { }, info: ResolveInfo) => PromiseOrValue | null | undefined>; export type post = (model: Models.User, args: {}, context: DefaultContextType & { managers: { - "post": PostStateMachineType["post"]; + "post"?: PostStateMachineType["post"]; }; }, info: ResolveInfo) => PromiseOrValue; export type postRequired = (model: Models.User, args: {}, context: DefaultContextType & { diff --git a/packages/ts-codegen/src/codegen.ts b/packages/ts-codegen/src/codegen.ts index 16fca4743..16878a8f9 100644 --- a/packages/ts-codegen/src/codegen.ts +++ b/packages/ts-codegen/src/codegen.ts @@ -14,6 +14,7 @@ export type SubTypeItem = { importNamespaceName?: string; importPath: string; typeName: string; + optional?: boolean; }; }; diff --git a/packages/ts-codegen/src/context/index.ts b/packages/ts-codegen/src/context/index.ts index e48e36047..bd72f84cc 100644 --- a/packages/ts-codegen/src/context/index.ts +++ b/packages/ts-codegen/src/context/index.ts @@ -204,11 +204,13 @@ export class TsCodegenContext { factory.createIdentifier(namespace), undefined, factory.createTypeLiteralNode( - subTypes.map(({ subType, name }) => { + subTypes.map(({ subType, name, optional }) => { return factory.createPropertySignature( undefined, factory.createIdentifier(`"${name}"`), - undefined, + optional + ? factory.createToken(ts.SyntaxKind.QuestionToken) + : undefined, factory.createTypeReferenceNode( factory.createIdentifier(subType), undefined, @@ -236,7 +238,7 @@ export class TsCodegenContext { } return typeNames.reduce< - Record + Record >((acc, typeName) => { const [namespaceName, subTypeName] = typeName.split(":"); if (!acc[namespaceName]) { @@ -268,6 +270,7 @@ export class TsCodegenContext { acc[namespaceName].push({ subType, name: subTypeName, + optional: subTypeRawMetadata.optional || false, }); return acc;