From c7cbb272484570c9d3980334751a065191094464 Mon Sep 17 00:00:00 2001 From: Sean Grove Date: Sun, 7 Aug 2022 18:00:48 -0700 Subject: [PATCH] Update CLI events helper --- src/cliEventHelpers.ts | 110 ++++++++++++++++++++++++++++++++- src/codegen/codegenHelpers.ts | 14 ++--- src/codegen/genericExporter.ts | 5 +- src/codegen/nextjsExporter.ts | 4 +- src/codegen/remixExporter.ts | 4 +- src/netlifyGraph.ts | 6 +- src/oneGraphClient.ts | 12 ++-- 7 files changed, 132 insertions(+), 23 deletions(-) diff --git a/src/cliEventHelpers.ts b/src/cliEventHelpers.ts index 59adf7b..b5be717 100644 --- a/src/cliEventHelpers.ts +++ b/src/cliEventHelpers.ts @@ -1,3 +1,5 @@ +import { CodegenModuleMeta } from "./codegen/codegenHelpers"; + export const OneGraphNetlifyCliSessionTestEventSdl = `type OneGraphNetlifyCliSessionTestEvent { id: String! sessionId: String! @@ -20,7 +22,7 @@ export const OneGraphNetlifyCliSessionGenerateHandlerEventSdl = `type OneGraphNe payload: { cliSessionId: String! operationId: String - codeGeneratorId: String! + codegenId: String! options: JSON } }`; @@ -33,7 +35,7 @@ export type OneGraphNetlifyCliSessionGenerateHandlerEvent = { payload: { cliSessionId: string; operationId: string; - codeGeneratorId: string; + codegenId: string; options?: Record | null; }; }; @@ -63,16 +65,18 @@ export const OneGraphNetlifyCliSessionPersistedLibraryUpdatedEventSdl = `type On createdAt: String! payload: { docId: String! + schemaId: String! } }`; export type OneGraphNetlifyCliSessionPersistedLibraryUpdatedEvent = { - __typename: "OneGraphNetlifyCliSessionOpenFileEvent"; + __typename: "OneGraphNetlifyCliSessionPersistedLibraryUpdatedEvent"; id: string; sessionId: string; createdAt: string; payload: { docId: string; + schemaId: string; }; }; @@ -98,3 +102,103 @@ export type OneGraphNetlifyCliSessionFileWrittenEvent = { }; audience: "UI" | "CLI"; }; + +export const OneGraphNetlifyCliSessionCodegenHandlerFunctionOptionsSdl = `type OneGraphNetlifyCliSessionCodegenHandlerFunctionOptions { + schemaSdl: String! + inputTypename: String! + defaultValue: JSON +}`; + +export const OneGraphNetlifyCliSessionCodegenSupportedDefinitionTypesEnumSdl = `enum OneGraphNetlifyCliSessionCodegenSupportedDefinitionTypesEnum { + QUERY + MUTATION + SUBSCRIPTION + FRAGMENT +}`; + +export const OneGraphNetlifyCliSessionCodegenMetadataSdl = `type OneGraphNetlifyCliSessionCodegenMetadata { + id: String! + name: String! + operations: OneGraphNetlifyCliSessionCodegenHandlerFunctionOptions + supportedDefinitionTypes: [OneGraphNetlifyCliSessionCodegenSupportedDefinitionTypesEnum!]! +}`; + +export const OneGraphNetlifyCliSessionCodegenModuleMetadataSdl = `type OneGraphNetlifyCliSessionCodegenModuleMetadata { + id: String! + version: String! + generators: [OneGraphNetlifyCliSessionCodegenMetadata!]! +}`; + +export const OneGraphNetlifyCliSessionMetadataPublishEventSdl = `type OneGraphNetlifyCliSessionMetadataPublishEvent { + id: String! + sessionId: String! + createdAt: String! + payload: { + editor: String + siteRoot: String + siteRootFriendly: String + schemaId: String! + persistedDocId: String! + codegenModule: OneGraphNetlifyCliSessionCodegenModuleMetadata + } + audience: String! +}`; + +export type OneGraphNetlifyCliSessionMetadataPublishEvent = { + __typename: "OneGraphNetlifyCliSessionMetadataPublishEvent"; + id: string; + sessionId: string; + createdAt: string; + payload: { + cliVersion: string; + editor: string | null; + siteRoot: string | null; + siteRootFriendly: string | null; + schemaId: string; + persistedDocId: string; + codegenModule: CodegenModuleMeta | null; + }; + audience: "UI"; +}; + +export const OneGraphNetlifyCliSessionMetadataRequestEventSdl = `type OneGraphNetlifyCliSessionMetadataRequestEvent { + id: String! + sessionId: String! + createdAt: String! + payload: { + minimumCliVersionExpected: String! + expectedAudience: String! + } + audience: String! +}`; + +export type OneGraphNetlifyCliSessionMetadataRequestEvent = { + __typename: "OneGraphNetlifyCliSessionMetadataRequestEvent"; + id: string; + sessionId: string; + createdAt: string; + payload: { + minimumCliVersionExpected: string; + expectedAudience: "UI"; + }; + audience: "CLI"; +}; + +export type CliEvent = + | OneGraphNetlifyCliSessionTestEvent + | OneGraphNetlifyCliSessionGenerateHandlerEvent + | OneGraphNetlifyCliSessionOpenFileEvent + | OneGraphNetlifyCliSessionPersistedLibraryUpdatedEvent + | OneGraphNetlifyCliSessionFileWrittenEvent + | OneGraphNetlifyCliSessionMetadataPublishEvent + | OneGraphNetlifyCliSessionMetadataRequestEvent; + +export type DetectedLocalCLISessionMetadata = { + gitBranch: string | null; + hostname: string | null; + username: string | null; + siteRoot: string | null; + cliVersion: string; + editor: string | null; + codegen: CodegenModuleMeta | null; +}; diff --git a/src/codegen/codegenHelpers.ts b/src/codegen/codegenHelpers.ts index 0d63eca..7ed4cfd 100644 --- a/src/codegen/codegenHelpers.ts +++ b/src/codegen/codegenHelpers.ts @@ -161,7 +161,7 @@ export type GenerateRuntimeFunction = (opts: { fragments: ParsedFragment[]; }) => NamedExportedFile[]; -type CodeGeneratorSupportableDefinitionType = +type CodegenSupportableDefinitionType = | "query" | "mutation" | "subscription" @@ -179,32 +179,32 @@ export type GenerateHandlerFunctionOptionsDeserialized = { defaultValue?: Record; }; -export type CodeGenerator = { +export type Codegen = { generatePreview?: GenerateHandlerPreviewFunction; generateHandler: GenerateHandlerFunction; generateHandlerOptions?: GenerateHandlerFunctionOptions; - supportedDefinitionTypes: CodeGeneratorSupportableDefinitionType[]; + supportedDefinitionTypes: CodegenSupportableDefinitionType[]; name: string; id: string; version: string; }; -export type CodeGeneratorMeta = { +export type CodegenMeta = { id: string; name: string; options: GenerateHandlerFunctionOptions | null; - supportedDefinitionTypes: CodeGeneratorSupportableDefinitionType[]; + supportedDefinitionTypes: CodegenSupportableDefinitionType[]; }; export type CodegenModuleMeta = { id: string; version: string; - generators: CodeGeneratorMeta[]; + generators: CodegenMeta[]; }; export type CodegenModule = { id: string; version: string; generateRuntime: GenerateRuntimeFunction; - generators: CodeGenerator[]; + generators: Codegen[]; }; diff --git a/src/codegen/genericExporter.ts b/src/codegen/genericExporter.ts index 1443879..49ae821 100644 --- a/src/codegen/genericExporter.ts +++ b/src/codegen/genericExporter.ts @@ -10,7 +10,8 @@ import { ExportedFile, ExporterResult, munge, - CodeGenerator, + GenerateHandlerFunction, + Codegen, UnnamedExportedFile, } from "./codegenHelpers"; import { internalConsole } from "../internalConsole"; @@ -531,7 +532,7 @@ const exp = (netlifyGraphConfig, name) => { }; // Snippet generation! -export const netlifyFunctionSnippet: CodeGenerator = { +export const netlifyFunctionSnippet: Codegen = { name: "Netlify Function", generateHandlerOptions: snippetOptions, supportedDefinitionTypes: [], diff --git a/src/codegen/nextjsExporter.ts b/src/codegen/nextjsExporter.ts index ab895a4..0534059 100644 --- a/src/codegen/nextjsExporter.ts +++ b/src/codegen/nextjsExporter.ts @@ -12,7 +12,7 @@ import { NamedExportedFile, OperationData, OperationDataList, - CodeGenerator, + Codegen, UnnamedExportedFile, } from "./codegenHelpers"; import { internalConsole } from "../internalConsole"; @@ -748,7 +748,7 @@ const expDefault = (netlifyGraphConfig: NetlifyGraphConfig, name: string) => { }; // Snippet generation! -export const nextjsFunctionSnippet: CodeGenerator = { +export const nextjsFunctionSnippet: Codegen = { name: "Next.js Function", generateHandlerOptions: snippetOptions, supportedDefinitionTypes: [], diff --git a/src/codegen/remixExporter.ts b/src/codegen/remixExporter.ts index 48d1ffa..525463c 100644 --- a/src/codegen/remixExporter.ts +++ b/src/codegen/remixExporter.ts @@ -12,7 +12,7 @@ import { NamedExportedFile, OperationData, OperationDataList, - CodeGenerator, + Codegen, } from "./codegenHelpers"; import { internalConsole } from "../internalConsole"; import { remixFormInput } from "../graphqlHelpers"; @@ -744,7 +744,7 @@ const expDefault = (netlifyGraphConfig: NetlifyGraphConfig, name: string) => { }; // Snippet generation! -export const remixFunctionSnippet: CodeGenerator = { +export const remixFunctionSnippet: Codegen = { name: "Remix Function", generateHandlerOptions: snippetOptions, supportedDefinitionTypes: [], diff --git a/src/netlifyGraph.ts b/src/netlifyGraph.ts index 609dad2..2499a0d 100644 --- a/src/netlifyGraph.ts +++ b/src/netlifyGraph.ts @@ -32,7 +32,7 @@ import { import { nextjsFunctionSnippet } from "./codegen/nextjsExporter"; import { remixFunctionSnippet } from "./codegen/remixExporter"; import { - CodeGenerator, + Codegen, ExportedFile, GenerateHandlerFunction, } from "./codegen/codegenHelpers"; @@ -2399,7 +2399,7 @@ export const generateCustomHandlerSource = ({ operationId: string; operationsDoc: string; schema: GraphQLSchema; - generate: CodeGenerator["generateHandler"]; + generate: Codegen["generateHandler"]; }): | { exportedFiles: ExportedFile[]; @@ -2452,7 +2452,7 @@ export const generatePreview = ({ operationId: string; operationsDoc: string; schema: GraphQLSchema; - generate: CodeGenerator["generatePreview"]; + generate: Codegen["generatePreview"]; }): | { exportedFile: ExportedFile; diff --git a/src/oneGraphClient.ts b/src/oneGraphClient.ts index 0d778ae..22c26c5 100644 --- a/src/oneGraphClient.ts +++ b/src/oneGraphClient.ts @@ -451,23 +451,27 @@ export const friendlyEventName = (event: OneGraphCliEvent): string => { } }; -export type OneGraphCliEventAudience = "ui" | "cli"; +export type OneGraphCliEventAudience = "UI" | "CLI"; /** * * @param {OneGraphCliEvent} event - * @returns {'ui' | 'cli'} Which audience the event is intended for + * @returns {OneGraphCliEventAudience} Which audience the event is intended for */ export const eventAudience = ( event: OneGraphCliEvent ): OneGraphCliEventAudience => { const { __typename, payload } = event; + if (event.audience || payload.audience) { + return event.audience || payload.audience; + } + switch (__typename) { case "OneGraphNetlifyCliSessionTestEvent": return eventAudience(payload); case "OneGraphNetlifyCliSessionFileWrittenEvent": - return "ui"; + return "UI"; default: { - return "cli"; + return "CLI"; } } };