Skip to content

Commit

Permalink
Merge pull request #14 from sgrove/sg/open-codegen
Browse files Browse the repository at this point in the history
Sg/open codegen
  • Loading branch information
sgrove authored Aug 8, 2022
2 parents feb8989 + 87d454e commit 804d622
Show file tree
Hide file tree
Showing 18 changed files with 1,000 additions and 272 deletions.
21 changes: 11 additions & 10 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"author": "sgrove",
"license": "MIT",
"dependencies": {
"graphql": "16.0.0",
"graphql": "16.5.0",
"node-fetch": "^2.6.0",
"rusha": "^0.8.14",
"uuid": "^8.3.2"
Expand Down
204 changes: 204 additions & 0 deletions src/cliEventHelpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
import { CodegenModuleMeta } from "./codegen/codegenHelpers";

export const OneGraphNetlifyCliSessionTestEventSdl = `type OneGraphNetlifyCliSessionTestEvent {
id: String!
sessionId: String!
createdAt: String!
payload: JSON!
}`;

export type OneGraphNetlifyCliSessionTestEvent = {
__typename: "OneGraphNetlifyCliSessionTestEvent";
id: string;
sessionId: string;
createdAt: string;
payload: Record<string, unknown>;
};

export const OneGraphNetlifyCliSessionGenerateHandlerEventSdl = `type OneGraphNetlifyCliSessionGenerateHandlerEvent {
id: String!
sessionId: String!
createdAt: String!
payload: {
cliSessionId: String!
operationId: String
codegenId: String!
options: JSON
}
}`;

export type OneGraphNetlifyCliSessionGenerateHandlerEvent = {
__typename: "OneGraphNetlifyCliSessionGenerateHandlerEvent";
id: string;
sessionId: string;
createdAt: string;
payload: {
cliSessionId: string;
operationId: string;
codegenId: string;
options?: Record<string, unknown> | null;
};
};

export const OneGraphNetlifyCliSessionOpenFileEventSdl = `type OneGraphNetlifyCliSessionOpenFileEvent {
id: String!
sessionId: String!
createdAt: String!
payload: {
filePath: String!
}
}`;

export type OneGraphNetlifyCliSessionOpenFileEvent = {
__typename: "OneGraphNetlifyCliSessionOpenFileEvent";
id: string;
sessionId: string;
createdAt: string;
payload: {
filePath: string;
};
};

export const OneGraphNetlifyCliSessionPersistedLibraryUpdatedEventSdl = `type OneGraphNetlifyCliSessionPersistedLibraryUpdatedEvent {
id: String!
sessionId: String!
createdAt: String!
payload: {
docId: String!
schemaId: String!
}
}`;

export type OneGraphNetlifyCliSessionPersistedLibraryUpdatedEvent = {
__typename: "OneGraphNetlifyCliSessionPersistedLibraryUpdatedEvent";
id: string;
sessionId: string;
createdAt: string;
payload: {
docId: string;
schemaId: string;
};
};

export const OneGraphNetlifyCliSessionFileWrittenEventSdl = `type OneGraphNetlifyCliSessionFileWrittenEvent {
id: String!
sessionId: String!
createdAt: String!
payload: {
editor: String
filePath: String!
}
audience: String!
}`;

export type OneGraphNetlifyCliSessionFileWrittenEvent = {
__typename: "OneGraphNetlifyCliSessionFileWrittenEvent";
id: string;
sessionId: string;
createdAt: string;
payload: {
editor: string | null;
filePath: string;
};
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;
};
92 changes: 80 additions & 12 deletions src/codegen/codegenHelpers.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import {
import * as GraphQL from "graphql";
import type {
FragmentDefinitionNode,
GraphQLSchema,
OperationDefinitionNode,
} from "graphql";
import { NetlifyGraphConfig } from "../netlifyGraph";
import {
NetlifyGraphConfig,
ParsedFragment,
ParsedFunction,
} from "../netlifyGraph";

/**
* Keywords in both Javascript and TypeScript
Expand Down Expand Up @@ -89,41 +94,45 @@ export type NamedExportedFile = {
kind: "NamedExportedFile";
name: string[];
content: string;
language: string;
codeMirrorMode?: string;
};

export type UnnamedExportedFile = {
kind: "UnnamedExportedFile";
content: string;
language: string;
codeMirrorMode?: string;
};

export type ExportedFile = NamedExportedFile | UnnamedExportedFile;

export type ExporterResult = {
exportedFiles: ExportedFile[];
language: string;
};

export type FrameworkGenerator = (opts: {
export type GenerateHandlerFunction = (opts: {
GraphQL: typeof GraphQL;
operationDataList: OperationData[];
netlifyGraphConfig: NetlifyGraphConfig;
options: Record<string, boolean>;
schema: GraphQLSchema;
}) => ExporterResult;

export type GenerateHandlerPreviewFunction = (opts: {
GraphQL: typeof GraphQL;
operationDataList: OperationData[];
netlifyGraphConfig: NetlifyGraphConfig;
options: Record<string, boolean>;
schema: GraphQLSchema;
}) => ExportedFile;

export type SnippetOption = {
id: string;
label: string;
initial: boolean;
};

export type SnippetGeneratorWithMeta = {
language: string;
codeMirrorMode: string;
name: string;
options: SnippetOption[];
generate: FrameworkGenerator;
};

export type OperationDataList = {
operationDefinitions: (OperationDefinitionNode | FragmentDefinitionNode)[];
fragmentDefinitions: FragmentDefinitionNode[];
Expand All @@ -140,3 +149,62 @@ export type OperationData = {
operationDefinition: OperationDefinitionNode | FragmentDefinitionNode;
fragmentDependencies: FragmentDefinitionNode[];
};

export type GenerateRuntimeFunction = (opts: {
GraphQL: typeof GraphQL;
operationDataList: OperationData[];
netlifyGraphConfig: NetlifyGraphConfig;
options: Record<string, boolean>;
schema: GraphQLSchema;
schemaId: string;
functionDefinitions: ParsedFunction[];
fragments: ParsedFragment[];
}) => NamedExportedFile[];

type CodegenSupportableDefinitionType =
| "query"
| "mutation"
| "subscription"
| "fragment";

export type GenerateHandlerFunctionOptions = {
schemaSdl: string;
inputTypename: string;
defaultValue?: Record<string, unknown>;
};

export type GenerateHandlerFunctionOptionsDeserialized = {
schema: GraphQL.GraphQLSchema;
inputTypename: string;
defaultValue?: Record<string, unknown>;
};

export type Codegen = {
generatePreview?: GenerateHandlerPreviewFunction;
generateHandler: GenerateHandlerFunction;
generateHandlerOptions?: GenerateHandlerFunctionOptions;
supportedDefinitionTypes: CodegenSupportableDefinitionType[];
name: string;
id: string;
version: string;
};

export type CodegenMeta = {
id: string;
name: string;
options: GenerateHandlerFunctionOptions | null;
supportedDefinitionTypes: CodegenSupportableDefinitionType[];
};

export type CodegenModuleMeta = {
id: string;
version: string;
generators: CodegenMeta[];
};

export type CodegenModule = {
id: string;
version: string;
generateRuntime: GenerateRuntimeFunction;
generators: Codegen[];
};
Loading

0 comments on commit 804d622

Please sign in to comment.