graphql-codegen-typescript-operation-types
Version:
GraphQL codegen plugin that generates only the types used in the operations
140 lines • 11.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.plugin = void 0;
const plugin_helpers_1 = require("@graphql-codegen/plugin-helpers");
const graphql_1 = require("graphql");
const visitor_1 = require("./visitor");
const plugin = (schema, documents, config) => {
var _a;
const ast = (0, plugin_helpers_1.getCachedDocumentNodeFromSchema)(schema);
const discoveredTypes = discoverTypes(documents, schema, (_a = config.omitObjectTypes) !== null && _a !== void 0 ? _a : false);
const visitor = new visitor_1.SpecificTypesVisitor(schema, config, discoveredTypes);
// This is generally the same as the typescript plugin, just with only the types discovered in the operations
// @ts-expect-error The types are incompatible for some reason. This is actually due to the other typescript plugin not being in strict mode as this just inherits that visitor from that plugin.
const visitorResult = (0, plugin_helpers_1.oldVisit)(ast, { leave: visitor });
const scalars = visitor.scalarsDefinition;
const directiveArgumentAndInputFieldMappings = visitor.directiveArgumentAndInputFieldMappingsDefinition;
return {
prepend: [
...visitor.getEnumsImports(),
...visitor.getDirectiveArgumentAndInputFieldMappingsImports(),
...visitor.getScalarsImports(),
...visitor.getWrapperDefinitions(),
].filter(Boolean),
content: [
scalars,
directiveArgumentAndInputFieldMappings,
...visitorResult.definitions,
]
.filter(Boolean)
.join('\n'),
};
};
exports.plugin = plugin;
/**
* Navigates through a named node and collects all enum, input, and object types in the node tree.
* @param node
* @param discoveredTypes the discovered types names, a map is used for performant checking instead of an array as
* the list could become large for large sub graphs
*/
function collectTypesFromNode(node, discoveredTypes) {
const name = node.name;
if ((0, graphql_1.isInputObjectType)(node)) {
if (discoveredTypes.has(name)) {
return;
}
discoveredTypes.set(name, true);
const fields = node.getFields();
Object.keys(fields).forEach((key) => {
const field = fields[key];
const type = (0, graphql_1.getNamedType)(field.type);
collectTypesFromNode(type, discoveredTypes);
});
return;
}
if ((0, graphql_1.isObjectType)(node) || (0, graphql_1.isInterfaceType)(node)) {
if (discoveredTypes.has(name)) {
return;
}
discoveredTypes.set(name, true);
const fields = node.getFields();
Object.keys(fields).forEach((key) => {
const field = fields[key];
const type = (0, graphql_1.getNamedType)(field.type);
collectTypesFromNode(type, discoveredTypes);
});
const interfaces = node.getInterfaces();
for (const interfaceType of interfaces) {
collectTypesFromNode(interfaceType, discoveredTypes);
}
return;
}
if ((0, graphql_1.isUnionType)(node)) {
if (discoveredTypes.has(name)) {
return;
}
discoveredTypes.set(name, true);
const unionTypes = node.getTypes();
for (const type of unionTypes) {
collectTypesFromNode(type, discoveredTypes);
}
}
if ((0, graphql_1.isEnumType)(node)) {
if (!discoveredTypes.has(node.name)) {
discoveredTypes.set(node.name, true);
}
return;
}
}
function discoverTypes(documents, schema, omitModelTypes) {
const discoveredTypes = new Map();
// Visitor
const typeInfo = new graphql_1.TypeInfo(schema);
// noinspection JSUnusedGlobalSymbols
const documentVisitor = (0, graphql_1.visitWithTypeInfo)(typeInfo, {
Field: () => {
const type = (0, graphql_1.getNamedType)(typeInfo.getType());
if (type != null) {
// Collect fragment enum field types (always required even if fragments are pre resolved)
if ((0, graphql_1.isEnumType)(type)) {
discoveredTypes.set(type.name, true);
}
// Collect fragment field object types to be used if omitModelTypes is false
if ((0, graphql_1.isObjectType)(type) && !omitModelTypes) {
collectTypesFromNode(type, discoveredTypes);
}
}
},
FragmentDefinition: () => {
// Collect fragment object types to be used if omitModelTypes is false
const type = (0, graphql_1.getNamedType)(typeInfo.getType());
if (type != null && (0, graphql_1.isObjectType)(type) && !omitModelTypes) {
collectTypesFromNode(type, discoveredTypes);
}
},
InlineFragment: () => {
const type = (0, graphql_1.getNamedType)(typeInfo.getType());
if ((0, graphql_1.isObjectType)(type) && !omitModelTypes) {
collectTypesFromNode(type, discoveredTypes);
}
},
VariableDefinition: () => {
/*
Record the input types in the variables, this is the starting point of what input types
will be included, but we also need to iterate through the fields in the input types
in order to get all the enums and input types that exist in this input type
*/
const inputType = (0, graphql_1.getNamedType)(typeInfo.getInputType());
if (inputType && ((0, graphql_1.isInputObjectType)(inputType) || (0, graphql_1.isEnumType)(inputType))) {
collectTypesFromNode(inputType, discoveredTypes);
}
},
});
for (const document of documents) {
if (document.document) {
(0, graphql_1.visit)(document.document, documentVisitor);
}
}
return discoveredTypes;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9FQUt5QztBQUN6QyxxQ0FhaUI7QUFDakIsdUNBQWlEO0FBSzFDLE1BQU0sTUFBTSxHQUdmLENBQ0YsTUFBcUIsRUFDckIsU0FBK0IsRUFDL0IsTUFBNEMsRUFDNUMsRUFBRTs7SUFDRixNQUFNLEdBQUcsR0FBRyxJQUFBLGdEQUErQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXBELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FDbkMsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFBLE1BQU0sQ0FBQyxlQUFlLG1DQUFJLEtBQUssQ0FDaEMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFHLElBQUksOEJBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUUxRSw2R0FBNkc7SUFDN0csaU1BQWlNO0lBQ2pNLE1BQU0sYUFBYSxHQUFHLElBQUEseUJBQVEsRUFBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDMUMsTUFBTSxzQ0FBc0MsR0FDMUMsT0FBTyxDQUFDLGdEQUFnRCxDQUFDO0lBRTNELE9BQU87UUFDTCxPQUFPLEVBQUU7WUFDUCxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUU7WUFDNUIsR0FBRyxPQUFPLENBQUMsZ0RBQWdELEVBQUU7WUFDN0QsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEVBQUU7WUFDOUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUU7U0FDbkMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ2pCLE9BQU8sRUFBRTtZQUNQLE9BQU87WUFDUCxzQ0FBc0M7WUFDdEMsR0FBRyxhQUFhLENBQUMsV0FBVztTQUM3QjthQUNFLE1BQU0s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