Skip to content

Commit

Permalink
Interim commit for open-codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
sgrove committed Aug 3, 2022
1 parent be3fe99 commit fdd0c82
Show file tree
Hide file tree
Showing 14 changed files with 712 additions and 229 deletions.
67 changes: 55 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,37 @@ 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 CodeGeneratorSupportableDefinitionType =
| "query"
| "mutation"
| "subscription"
| "fragment";

export type CodeGenerator = {
generatePreview?: GenerateHandlerPreviewFunction;
generateHandler: GenerateHandlerFunction;
generateHandlerOptions?: { schemaSdl: string; inputTypename: string };
supportedDefinitionTypes: CodeGeneratorSupportableDefinitionType[];
name: string;
id: string;
version: string;
};

export type CodegenModule = {
id: string;
version: string;
generateRuntime: GenerateRuntimeFunction;
generators: CodeGenerator[];
};
53 changes: 32 additions & 21 deletions src/codegen/genericExporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
ExportedFile,
ExporterResult,
munge,
SnippetGeneratorWithMeta,
CodeGenerator,
UnnamedExportedFile,
} from "./codegenHelpers";
import { internalConsole } from "../internalConsole";
Expand Down Expand Up @@ -217,18 +217,26 @@ const addLeftWhitespace = (string, padding) => {

const collapseExtraNewlines = (string) => string.replace(/\n{2,}/g, "\n\n");

const snippetOptions = [
{
id: "postHttpMethod",
label: "POST function",
initial: true,
},
{
id: "useClientAuth",
label: "Use user's OAuth token",
initial: false,
},
];
const snippetOptions = {
inputTypename: "Options",
schemaSdl: `
enum HttpMethod {
POST
GET
}
input Options {
"""
Make call over POST
"""
postHttpMethod: HttpMethod
"""
Use user's OAuth token
"""
useClientAuth: Boolean!
}
`,
};

const operationFunctionName = (operationData) => {
const { type } = operationData;
Expand Down Expand Up @@ -449,6 +457,7 @@ const subscriptionHandler = ({
}): UnnamedExportedFile => {
return {
kind: "UnnamedExportedFile",
language: "javascript",
content: `${imp(
netlifyGraphConfig,
"NetlifyGraph",
Expand Down Expand Up @@ -522,12 +531,13 @@ const exp = (netlifyGraphConfig, name) => {
};

// Snippet generation!
export const netlifyFunctionSnippet: SnippetGeneratorWithMeta = {
language: "JavaScript",
codeMirrorMode: "javascript",
export const netlifyFunctionSnippet: CodeGenerator = {
name: "Netlify Function",
options: snippetOptions,
generate: (opts): ExporterResult => {
generateHandlerOptions: snippetOptions,
supportedDefinitionTypes: [],
id: "Netlify Functions",
version: "0.0.1",
generateHandler: (opts): ExporterResult => {
const { netlifyGraphConfig, options } = opts;

const operationDataList = opts.operationDataList.map(
Expand Down Expand Up @@ -560,11 +570,11 @@ ${operationData.type} unnamed${capitalizeFirstLetter(operationData.type)}${

if (!firstOperation) {
return {
language: "javascript",
exportedFiles: [
{
kind: "UnnamedExportedFile",
content: "// No operation found",
language: "javascript",
},
],
};
Expand All @@ -581,7 +591,6 @@ ${operationData.type} unnamed${capitalizeFirstLetter(operationData.type)}${
});

return {
language: "javascript",
exportedFiles: [result],
};
}
Expand Down Expand Up @@ -657,13 +666,15 @@ ${clientSideCalls}
const content = collapseExtraNewlines(snippet);

return {
language: "javascript",
exportedFiles: [
{
kind: "UnnamedExportedFile",
content: content,
language: "javascript",
},
],
};
},
};

export const generators = [netlifyFunctionSnippet];
Loading

0 comments on commit fdd0c82

Please sign in to comment.