Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sg/open codegen #14

Merged
merged 7 commits into from
Aug 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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