@graphql-markdown/core
Version:
GraphQL-Markdown core package for generating Markdown documentation from a GraphQL schema.
144 lines (143 loc) • 6.02 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateDocFromSchema = void 0;
const logger_1 = __importStar(require("@graphql-markdown/logger"));
const graphql_1 = require("@graphql-markdown/graphql");
const utils_1 = require("@graphql-markdown/utils");
const config_1 = require("./config");
const diff_1 = require("./diff");
const printer_1 = require("./printer");
const renderer_1 = require("./renderer");
/**
* Constant representing nanoseconds per second.
*
* This constant is used for high-precision time measurements and conversions
* between seconds and nanoseconds.
*
*/
const NS_PER_SEC = 1e9;
/**
* The number of decimal places to display when reporting times in seconds.
*
*/
const SEC_DECIMALS = 3;
/**
* Main entry point for generating Markdown documentation from a GraphQL schema.
*
* This function coordinates the entire documentation generation process:
* - Loads and validates the schema
* - Checks for schema changes if diffing is enabled
* - Processes directives and groups
* - Initializes printers and renderers
* - Generates markdown files
*
* @param options - Complete configuration for the documentation generation
* @returns Promise that resolves when documentation is fully generated
*/
const generateDocFromSchema = async ({ baseURL, customDirective, diffMethod, docOptions, force, groupByDirective, homepageLocation, linkRoot, loaders: loadersList, loggerModule, mdxParser, metatags, onlyDocDirective, outputDir, prettify, printer: printerModule, printTypeOptions, schemaLocation, skipDocDirective, tmpDir, }) => {
const start = process.hrtime.bigint();
await (0, logger_1.default)(loggerModule);
const loaders = await (0, graphql_1.getDocumentLoaders)(loadersList);
if (!loaders) {
(0, logger_1.log)(`An error occurred while loading GraphQL loader.\nCheck your dependencies and configuration.`, "error");
return;
}
const schema = await (0, graphql_1.loadSchema)(schemaLocation, loaders);
if (diffMethod !== config_1.DiffMethod.NONE) {
const changed = await (0, diff_1.hasChanges)(schema, tmpDir, diffMethod);
if (!changed) {
(0, logger_1.log)(`No changes detected in schema "${(0, utils_1.toString)(schemaLocation)}".`);
}
}
const [onlyDocDirectives, skipDocDirectives] = [
onlyDocDirective,
skipDocDirective,
].map((directiveList) => {
return directiveList
.map((name) => {
return schema.getDirective(name);
})
.filter((directive) => {
return typeof directive !== "undefined";
});
});
const rootTypes = (0, graphql_1.getSchemaMap)(schema);
const customDirectives = (0, graphql_1.getCustomDirectives)(rootTypes, customDirective);
const groups = (0, graphql_1.getGroups)(rootTypes, groupByDirective);
const mdxModule = await (!mdxParser
? undefined
: Promise.resolve(`${mdxParser}`).then(s => __importStar(require(s))).catch(() => {
(0, logger_1.log)(`An error occurred while loading MDX formatter "${mdxParser}"`, logger_1.LogLevel.warn);
return undefined;
}));
const printer = await (0, printer_1.getPrinter)(
// module mandatory
printerModule,
// config mandatory
{
baseURL,
linkRoot,
schema,
},
// options
{
customDirectives,
groups,
meta: {
generatorFrameworkName: docOptions?.generatorFrameworkName,
generatorFrameworkVersion: docOptions?.generatorFrameworkVersion,
},
metatags,
onlyDocDirectives,
printTypeOptions,
skipDocDirectives,
}, mdxModule);
const renderer = await (0, renderer_1.getRenderer)(printer, outputDir, baseURL, groups, prettify, {
...docOptions,
deprecated: printTypeOptions?.deprecated,
force,
hierarchy: printTypeOptions?.hierarchy,
}, mdxModule);
const pages = await Promise.all(Object.keys(rootTypes).map(async (name) => {
const typeName = name;
return renderer.renderRootTypes(typeName, rootTypes[typeName]);
}));
await renderer.renderHomepage(homepageLocation);
const duration = (Number(process.hrtime.bigint() - start) / NS_PER_SEC).toFixed(SEC_DECIMALS);
(0, logger_1.log)(`Documentation successfully generated in "${outputDir}" with base URL "${baseURL}".`, "success");
(0, logger_1.log)(`${pages.flat().length} pages generated in ${duration}s from schema "${(0, utils_1.toString)(schemaLocation)}".`);
};
exports.generateDocFromSchema = generateDocFromSchema;
;