#!/usr/bin/env node const fs = require("fs-extra"); const { glob } = require("glob"); const path = require("path"); const { loadJsonFileSync } = require("load-json-file"); const yaml = require("yamljs"); (async () => { // documentation v14 has moved to ESM so need to import as if async, and wrap // in an IIFE as top level async not allowed. const documentation = await import("documentation"); /** * When firing `npm run docs`: * - inside a module, only the docs of that module will be generated * - outside or at the root level it will generate docs for all modules */ const currentFolder = process.cwd().split(path.sep).pop() as string; const packages = currentFolder.includes("packages/turf-") ? [path.join(process.cwd(), "package.json")] : glob.sync( path.join(__dirname, "..", "packages", "turf-*", "package.json") ); // Template for README Markdown const postfix = fs.readFileSync(path.join(__dirname, "postfix.md"), "utf8"); const paths = yaml.parse( fs.readFileSync(path.join(__dirname, "..", "documentation.yml"), "utf8") ).paths; packages.forEach((packagePath) => { const directory = path.parse(packagePath).dir; let indexPath = path.join(directory, "index.js"); const pckg = loadJsonFileSync(packagePath); const name = pckg.name; const diagrams = glob .sync(path.join(directory, "diagrams", "*")) .filter(isImage); // some of the packages are typescript instead if (!fs.existsSync(indexPath)) { indexPath = path.join(directory, "index.ts"); } // Build Documentation documentation .build(indexPath, { shallow: true }) .then((res) => { if (res === undefined) return console.warn(packagePath); console.log("Building Docs: " + name); // Format Markdown documentation.formats .md(res, { paths }) .then((markdown) => { markdown = `# ${name}\n\n${markdown}${postfix.replace( /{module}/, name )}`; if (diagrams.length) markdown += "\n\n### Diagrams\n\n" + diagramToMarkdown(diagrams); fs.writeFileSync(path.join(directory, "README.md"), markdown); }) .catch((error) => console.warn(error)); }) .catch((error) => console.warn(error)); }); })(); function isImage(image) { return [".gif", ".jpg", ".png"].indexOf(path.parse(image).ext) !== -1; } function diagramToMarkdown(diagrams) { return diagrams .map((image) => { const { name, base } = path.parse(image); return `![${name}](diagrams/${base})`; }) .join("\n"); }