2023-08-03 20:09:32 -04:00

92 lines
3.1 KiB
JavaScript
Executable File

#!/usr/bin/env -S node -r esbin
import { promises as fs } from "node:fs"
import { format } from "prettier"
import { CodeFileLoader } from "@graphql-tools/code-file-loader"
import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader"
import * as typescript from "@graphql-codegen/typescript"
import * as typescriptOperations from "@graphql-codegen/typescript-operations"
import * as add from "@graphql-codegen/add"
import { plugin as _, codegen, typedDocumentNodePlugin } from "@aet/gql-tools/codegen"
import { buildSchema } from "./build-schema-file"
async function main() {
await buildSchema()
const scalars: Record<string, string> = {
DateTime: "Date",
}
const context = await codegen({
schema: {
source: "./src/generated/schema.gql",
loaders: [new GraphQLFileLoader()],
},
documents: {
source: ["./src/**/*.{ts,tsx}", "!/src/generated/**/*.{ts,tsx}"],
loaders: [new CodeFileLoader({ pluckConfig: { skipIndent: true } })],
},
})
const content = await context.generate({
plugins: [
_(typescript, {
immutableTypes: true,
useTypeImports: true,
declarationKind: "interface",
allowEnumStringTypes: true,
enumsAsTypes: true,
scalars,
}),
_(typescriptOperations, {
declarationKind: "interface",
allowEnumStringTypes: true,
scalars,
}),
_(add, {
content: /* js */ `
/* eslint-disable */
import { gql as _gql } from "@apollo/client";
import type { DocumentNode } from "graphql";
export { ApolloClient, useQuery, useApolloClient, useLazyQuery, useMutation } from "@apollo/client";
export const gql = _gql as unknown as {
<K extends keyof DocumentMap>(
literals: string | readonly string[],
...args: any[]
): DocumentMap[K];
(
literals: string | readonly string[],
...args: any[]
): DocumentNode;
}
`,
}),
_(typedDocumentNodePlugin, {
createDocumentMap: true,
exportDocumentNodes: true,
}),
],
pipeline: [
source =>
source
.replace(/Scalars\['String']\['(in|out)put']/g, "string")
.replace(/Scalars\['ID']\['(in|out)put']/g, "string")
.replace(/Scalars\['Boolean']\['(in|out)put']/g, "boolean")
.replace(/Scalars\['Int']\['(in|out)put']/g, "number")
.replace(/Scalars\['Float']\['(in|out)put']/g, "number")
.replaceAll("Scalars['DateTime']['input']", "Date")
.replaceAll("Scalars['JSON']['input']", "any")
.replace(/(\w+) \| `\$\{\1}`/g, " $1")
.replace(/: (Input)?Maybe<([['\]\w<> ]+)>/g, ": $2 | null")
.replace(/: Array<([\w<> ]+)>/g, ": $1[]")
.replace(/export type (\w+) = {/g, "export interface $1 {")
.replace(/export type (Make|Maybe|InputMaybe|Exact|Incremental)/g, "type $1"),
code => format(code, { parser: "typescript" }),
],
})
await fs.writeFile("./src/generated/graphql.ts", content)
}
void main()