UNPKG

@graphql-codegen/typescript-graphql-files-modules

Version:

GraphQL Code Generator plugin for generating TypeScript module declarations based on GraphQL operations

38 lines (36 loc) 1.56 kB
import { basename, relative } from 'path'; export const plugin = async (schema, documents, { modulePathPrefix = '', relativeToCwd, prefix = '*/', type = 'DocumentNode', }) => { const useRelative = relativeToCwd === true; const mappedDocuments = documents.reduce((prev, documentRecord) => { const fileName = useRelative ? relative(process.cwd(), documentRecord.location) : basename(documentRecord.location); if (!prev[fileName]) { prev[fileName] = []; } prev[fileName].push(...documentRecord.document.definitions.filter(document => document.kind === 'OperationDefinition' || document.kind === 'FragmentDefinition')); return prev; }, {}); return Object.keys(mappedDocuments) .filter(fileName => mappedDocuments[fileName].length > 0) .map(fileName => { const operations = mappedDocuments[fileName]; return ` declare module '${prefix}${modulePathPrefix}${fileName}' { ${type === 'DocumentNode' ? `import { DocumentNode } from 'graphql';` : ''} const defaultDocument: ${type}; ${operations .filter(d => d.name && d.name.value) .map(d => `export const ${d.name.value}: ${type};`) .join('\n')} export default defaultDocument; } `; }) .join('\n'); }; export const validate = async (schema, documents, config, outputFile) => { if (!outputFile.endsWith('.d.ts')) { throw new Error(`Plugin "typescript-graphql-files-modules" requires extension to be ".d.ts"!`); } };