ohmygql
Version:
[![npm version][npm-version-src]][npm-version-href] [![npm downloads][npm-downloads-src]][npm-downloads-href] [![Github Actions][github-actions-src]][github-actions-href] [![Codecov][codecov-src]][codecov-href]
76 lines (72 loc) • 2.78 kB
JavaScript
;
const graphql = require('graphql');
const pluginHelpers = require('@graphql-codegen/plugin-helpers');
const visitorPluginCommon = require('@graphql-codegen/visitor-plugin-common');
const scule = require('scule');
const plugin = (schema, documents, config) => {
const allAst = graphql.concatAST(documents.map(({ document }) => document));
const operations = allAst.definitions.filter((d) => d.kind === graphql.Kind.OPERATION_DEFINITION);
const allFragments = [
...allAst.definitions.filter((d) => d.kind === graphql.Kind.FRAGMENT_DEFINITION).map(
(fragmentDef) => ({
node: fragmentDef,
name: fragmentDef.name.value,
onType: fragmentDef.typeCondition.name.value,
isExternal: false
})
),
...config.externalFragments || []
];
const visitor = new visitorPluginCommon.ClientSideBaseVisitor(schema, allFragments, config, {}, documents);
const visitorResult = pluginHelpers.oldVisit(allAst, { leave: visitor });
const GqlFunctions = [];
for (const entry of operations) {
const name = entry.name?.value;
if (!name) {
continue;
}
const opName = scule.upperFirst(name) + scule.upperFirst(entry.operation);
let func = ` ${name}: <T extends ${opName}, V extends ${opName}Variables> (variables?: null | V`;
if (entry.operation !== "subscription") {
func += `): Promise<T> => client.execute<T>(${scule.upperFirst(name)}Document, variables)`;
} else {
func += `, options?: WSClientOptions): WSOutput<T> => client.subscribe(${scule.upperFirst(name)}Document, variables, options)`;
}
GqlFunctions.push(func);
}
const importList = ["GqlClient", ...operations.some((o) => o.operation === "subscription") && ["WSOutput", "WSClientOptions"] || []];
return {
prepend: [
`import type { ${importList.join(", ")} } from 'ohmygql'`,
...visitor.getImports()
],
content: [
visitor.fragments,
...visitorResult.definitions.filter((t) => typeof t === "string"),
"export function gqlSdk (client: GqlClient) {",
" return {",
GqlFunctions.join(",\n"),
" }",
"}"
].join("\n")
};
};
const mockPlugin = (operations) => {
const GqlFunctions = [];
for (const [k, v] of Object.entries(operations)) {
if (!v.includes("subscription")) {
GqlFunctions.push(` ${k}: (variables = undefined) => client.execute(\`${v}\`, variables)`);
} else {
GqlFunctions.push(` ${k}: (variables = undefined, options = undefined) => client.subscribe(\`${v}\`, variables, options)`);
}
}
return [
"export function gqlSdk (client) {",
" return {",
GqlFunctions.join(",\n"),
" }",
"}"
].join("\n");
};
exports.mockPlugin = mockPlugin;
exports.plugin = plugin;