@graphql-codegen/gql-tag-operations
Version:
GraphQL Code Generator plugin for generating a typed gql tag function
75 lines (74 loc) • 3.12 kB
JavaScript
;
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;
}