graphqldoc
Version:
Generate GraphQL docs from schema.
112 lines (111 loc) • 4.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = require("path");
const striptags = require("striptags");
const utility_1 = require("../../lib/utility");
class RequireByPlugin extends utility_1.Plugin {
constructor(document, projectPackage, graphqldocPackage) {
super(document, projectPackage, graphqldocPackage);
this.document = document;
this.projectPackage = projectPackage;
this.graphqldocPackage = graphqldocPackage;
this.requireBy = new Map();
if (Array.isArray(document.types))
document.types.forEach((type) => {
switch (type.kind) {
// Scalars and enums have no dependencies
case utility_1.SCALAR:
case utility_1.ENUM:
return;
case utility_1.OBJECT:
case utility_1.INTERFACE:
case utility_1.UNION:
case utility_1.INPUT_OBJECT:
this.getDependencies(type)
.forEach((curr) => {
let deps = this.requireBy.get(curr) || [];
deps.push(type);
this.requireBy.set(curr, deps);
});
break;
}
});
}
getAssets() {
return [
path_1.resolve(__dirname, 'require-by.css')
];
}
getDependencies(type) {
let deps = [];
if (Array.isArray(type.interfaces) && type.interfaces.length > 0) {
type.interfaces
.forEach(i => deps.push(i.name));
}
if (Array.isArray(type.fields) && type.fields.length > 0) {
type.fields
.forEach(field => {
deps.push(utility_1.getTypeOf(field.type).name);
if (Array.isArray(field.args) && field.args.length > 0) {
field.args
.forEach(arg => {
deps.push(utility_1.getTypeOf(arg.type).name);
});
}
});
}
if (Array.isArray(type.inputFields) && type.inputFields.length > 0) {
type.inputFields
.forEach(field => {
deps.push(utility_1.getTypeOf(field.type).name);
});
}
if (type.kind !== utility_1.INTERFACE && Array.isArray(type.possibleTypes) && type.possibleTypes.length > 0) {
type.possibleTypes
.forEach(t => {
deps.push(utility_1.getTypeOf(t).name);
});
}
return deps;
}
getDescription(type) {
return '<li>' +
'<a href="' + this.url(type) + '" title="' +
type.name + ' - ' + striptags(type.description).replace(/"/gi, '"') +
'">' +
type.name + '<em>' + (type.description || '') + '</em>' +
'</a>' +
'<li>';
}
getDocuments(buildForType) {
if (!buildForType)
return [];
const requireBy = this.requireBy.get(buildForType);
if (!Array.isArray(requireBy) || requireBy.length === 0)
return [{
title: 'Required by',
description: '<div class="require-by anyone">' +
'This element is not required by anyone' +
'</div>',
}];
let used = new Set();
return [{
title: 'Required by',
description: '<ul class="require-by">' +
requireBy
.filter((t) => {
return used.has(t.name) ?
false : used.add(t.name);
})
.map(t => this.getDescription(t))
.join('') +
'</ul>',
}];
}
getHeaders() {
return [
'<link type="text/css" rel="stylesheet" href="./assets/require-by.css" />',
];
}
}
exports.default = RequireByPlugin;