@graphql-codegen/graphql-modules-preset
Version:
GraphQL Code Generator preset for modularized schema
115 lines (114 loc) • 5.77 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.preset = void 0;
const path_1 = require("path");
const visitor_plugin_common_1 = require("@graphql-codegen/visitor-plugin-common");
const graphql_1 = require("graphql");
const builder_js_1 = require("./builder.js");
const utils_js_1 = require("./utils.js");
exports.preset = {
buildGeneratesSection: options => {
const { baseOutputDir } = options;
const { baseTypesPath, encapsulateModuleTypes } = options.presetConfig;
const useGraphQLModules = (0, visitor_plugin_common_1.getConfigValue)(options?.presetConfig.useGraphQLModules, true);
const requireRootResolvers = (0, visitor_plugin_common_1.getConfigValue)(options?.presetConfig.requireRootResolvers, false);
const useTypeImports = (0, visitor_plugin_common_1.getConfigValue)(options?.config.useTypeImports, false) || false;
const cwd = (0, path_1.resolve)(options.presetConfig.cwd || process.cwd());
const importTypesNamespace = options.presetConfig.importTypesNamespace || 'Types';
if (!baseTypesPath) {
throw new Error(`Preset "graphql-modules" requires you to specify "baseTypesPath" configuration and point it to your base types file (generated by "typescript" plugin)!`);
}
if (!options.schemaAst?.extensions.sources) {
throw new Error(`Preset "graphql-modules" requires to use GraphQL SDL`);
}
const extensions = options.schemaAst.extensions;
const sourcesByModuleMap = (0, utils_js_1.groupSourcesByModule)(extensions.extendedSources, baseOutputDir);
const modules = Object.keys(sourcesByModuleMap);
const baseVisitor = new visitor_plugin_common_1.BaseVisitor(options.config, {});
// One file with an output from all plugins
const baseOutput = {
filename: (0, path_1.resolve)(cwd, baseOutputDir, baseTypesPath),
schema: options.schema,
documents: options.documents,
plugins: [
...options.plugins,
{
'modules-exported-scalars': {},
},
],
pluginMap: {
...options.pluginMap,
'modules-exported-scalars': {
plugin: schema => {
const typeMap = schema.getTypeMap();
return Object.keys(typeMap)
.map(t => {
if (t && typeMap[t] && (0, graphql_1.isScalarType)(typeMap[t]) && !(0, utils_js_1.isGraphQLPrimitive)(t)) {
const convertedName = baseVisitor.convertName(t);
return `export type ${convertedName} = Scalars["${t}"];`;
}
return null;
})
.filter(Boolean)
.join('\n');
},
},
},
config: {
...options.config,
enumsAsTypes: true,
},
schemaAst: options.schemaAst,
documentTransforms: options.documentTransforms,
};
const baseTypesFilename = baseTypesPath.replace(/\.(js|ts|d.ts)$/, '');
const baseTypesDir = (0, utils_js_1.stripFilename)(baseOutput.filename);
// One file per each module
const outputs = modules.map(moduleName => {
const filename = (0, path_1.resolve)(cwd, baseOutputDir, moduleName, options.presetConfig.filename);
const dirpath = (0, utils_js_1.stripFilename)(filename);
const relativePath = (0, path_1.relative)(dirpath, baseTypesDir);
const importPath = options.presetConfig.importBaseTypesFrom || (0, utils_js_1.normalize)((0, path_1.join)(relativePath, baseTypesFilename));
const sources = sourcesByModuleMap[moduleName];
const moduleDocument = (0, graphql_1.concatAST)(sources.map(source => source.document));
const shouldDeclare = filename.endsWith('.d.ts');
return {
filename,
schema: options.schema,
documents: [],
plugins: [
...options.plugins.filter(p => typeof p === 'object' && !!p.add),
{
'graphql-modules-plugin': {},
},
],
pluginMap: {
...options.pluginMap,
'graphql-modules-plugin': {
plugin: schema => (0, builder_js_1.buildModule)(moduleName, moduleDocument, {
importNamespace: importTypesNamespace,
importPath,
encapsulate: encapsulateModuleTypes || 'namespace',
requireRootResolvers,
shouldDeclare,
schema,
baseVisitor,
useGraphQLModules,
rootTypes: [
schema.getQueryType()?.name,
schema.getMutationType()?.name,
schema.getSubscriptionType()?.name,
].filter(Boolean),
useTypeImports,
}),
},
},
config: options.config,
schemaAst: options.schemaAst,
documentTransforms: options.documentTransforms,
};
});
return [baseOutput].concat(outputs);
},
};
exports.default = exports.preset;
;