UNPKG

graphqldoc

Version:
112 lines (111 loc) 4.18 kB
"use strict"; 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, '&quot;') + '">' + 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;