UNPKG

@graphql-codegen/gql-tag-operations

Version:

GraphQL Code Generator plugin for generating a typed gql tag function

75 lines (74 loc) 3.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.plugin = void 0; const documentTypePartial = ` export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode< infer TType, any > ? TType : never; `.split(`\n`); const plugin = (_, __, { sourcesWithOperations, useTypeImports, augmentedModuleName, emitLegacyCommonJSImports }, _info) => { if (!sourcesWithOperations) { return ''; } if (augmentedModuleName == null) { return [ `import * as graphql from './graphql${emitLegacyCommonJSImports ? '' : '.js'}';\n`, `${useTypeImports ? 'import type' : 'import'} { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n`, `\n`, ...getDocumentRegistryChunk(sourcesWithOperations), `\n`, ...getGqlOverloadChunk(sourcesWithOperations, 'lookup', emitLegacyCommonJSImports), `\n`, `export function gql(source: string): unknown;\n`, `export function gql(source: string) {\n`, ` return (documents as any)[source] ?? {};\n`, `}\n`, `\n`, ...documentTypePartial, ].join(``); } return [ `import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n`, `declare module "${augmentedModuleName}" {`, [ `\n`, ...getGqlOverloadChunk(sourcesWithOperations, 'augmented', emitLegacyCommonJSImports), `export function gql(source: string): unknown;\n`, `\n`, ...documentTypePartial, ] .map(line => (line === `\n` ? line : ` ${line}`)) .join(``), `}`, ].join(`\n`); }; exports.plugin = plugin; function getDocumentRegistryChunk(sourcesWithOperations = []) { const lines = new Set(); lines.add(`const documents = {\n`); for (const { operations, ...rest } of sourcesWithOperations) { const originalString = rest.source.rawSDL; const operation = operations[0]; lines.add(` ${JSON.stringify(originalString)}: graphql.${operation.initialName},\n`); } lines.add(`};\n`); return lines; } function getGqlOverloadChunk(sourcesWithOperations, mode, emitLegacyCommonJSImports) { const lines = new Set(); // We intentionally don't use a <T extends keyof typeof documents> generic, because TS // would print very long `gql` function signatures (duplicating the source). for (const { operations, ...rest } of sourcesWithOperations) { const originalString = rest.source.rawSDL; const returnType = mode === 'lookup' ? `(typeof documents)[${JSON.stringify(originalString)}]` : emitLegacyCommonJSImports ? `typeof import('./graphql').${operations[0].initialName}` : `typeof import('./graphql.js').${operations[0].initialName}`; lines.add(`export function gql(source: ${JSON.stringify(originalString)}): ${returnType};\n`); } return lines; }