@graphql-codegen/typescript
Version:
GraphQL Code Generator plugin for generating TypeScript types
78 lines (77 loc) • 3.47 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.plugin = void 0;
exports.includeIntrospectionTypesDefinitions = includeIntrospectionTypesDefinitions;
const tslib_1 = require("tslib");
const plugin_helpers_1 = require("@graphql-codegen/plugin-helpers");
const schema_ast_1 = require("@graphql-codegen/schema-ast");
const graphql_1 = require("graphql");
const introspection_visitor_js_1 = require("./introspection-visitor.js");
const visitor_js_1 = require("./visitor.js");
tslib_1.__exportStar(require("./config.js"), exports);
tslib_1.__exportStar(require("./introspection-visitor.js"), exports);
tslib_1.__exportStar(require("./typescript-variables-to-object.js"), exports);
tslib_1.__exportStar(require("./visitor.js"), exports);
const plugin = (schema, documents, config) => {
const { schema: _schema, ast } = (0, schema_ast_1.transformSchemaAST)(schema, config);
const visitor = new visitor_js_1.TsVisitor(_schema, config);
const visitorResult = (0, plugin_helpers_1.oldVisit)(ast, { leave: visitor });
const introspectionDefinitions = includeIntrospectionTypesDefinitions(_schema, documents, config);
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,
...introspectionDefinitions,
]
.filter(Boolean)
.join('\n'),
};
};
exports.plugin = plugin;
function includeIntrospectionTypesDefinitions(schema, documents, config) {
const typeInfo = new graphql_1.TypeInfo(schema);
const usedTypes = [];
const documentsVisitor = (0, graphql_1.visitWithTypeInfo)(typeInfo, {
Field() {
const type = (0, graphql_1.getNamedType)(typeInfo.getType());
if (type && (0, graphql_1.isIntrospectionType)(type) && !usedTypes.includes(type)) {
usedTypes.push(type);
}
},
});
for (const doc of documents) {
(0, graphql_1.visit)(doc.document, documentsVisitor);
}
const typesToInclude = [];
for (const type of usedTypes) {
collectTypes(type);
}
const visitor = new introspection_visitor_js_1.TsIntrospectionVisitor(schema, config, typesToInclude);
const result = (0, plugin_helpers_1.oldVisit)((0, graphql_1.parse)((0, graphql_1.printIntrospectionSchema)(schema)), { leave: visitor });
// recursively go through each `usedTypes` and their children and collect all used types
// we don't care about Interfaces, Unions and others, but Objects and Enums
function collectTypes(type) {
if (typesToInclude.includes(type)) {
return;
}
typesToInclude.push(type);
if ((0, graphql_1.isObjectType)(type)) {
const fields = type.getFields();
for (const key of Object.keys(fields)) {
const field = fields[key];
const type = (0, graphql_1.getNamedType)(field.type);
collectTypes(type);
}
}
}
return result.definitions;
}
;