UNPKG

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
'use strict'; 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;