diff --git a/packages/ts-doc/bin/tsdoc.js b/packages/ts-doc/bin/tsdoc.js index 55211ee..c101ca8 100755 --- a/packages/ts-doc/bin/tsdoc.js +++ b/packages/ts-doc/bin/tsdoc.js @@ -1,6 +1,7 @@ #!/usr/bin/env node const fs = require("fs"); const {buildApi} = require("../src/tasks/build-api"); +const path = require("path"); let config = { rootDir: process.cwd(), @@ -9,6 +10,7 @@ let config = { outputDir: "/docs/api", baseUrl: "/api", jsonOutputDir: "/docs/.vuepress/public", + templatesDir: path.join(__dirname, "..", "..", "components"), modules: {} }; diff --git a/packages/ts-doc/src/context/context.js b/packages/ts-doc/src/context/context.js index 27d14e8..ef41e2b 100644 --- a/packages/ts-doc/src/context/context.js +++ b/packages/ts-doc/src/context/context.js @@ -1,6 +1,7 @@ const readPkgUp = require("read-pkg-up"); const logger = require("fancy-log"); const normalizePath = require("normalize-path"); +const path = require("path"); const SYMBOL_TYPES = { "@": {value: "decorator", label: "Decorator"}, @@ -31,7 +32,9 @@ const reverseKeys = (obj) => { }; module.exports = { - settings: {}, + settings: { + templatesDir: path.join(__dirname, "..", "..", "components") + }, symbolTypes: reverseKeys(SYMBOL_TYPES), symbolStatus: SYMBOL_STATUS, status: SYMBOL_STATUS, @@ -64,6 +67,10 @@ module.exports = { return normalizePath(this.settings.jsonOutputDir.replace("", this.rootDir)); }, + get templatesDir() { + return normalizePath(this.settings.templatesDir.replace("", this.rootDir)); + }, + get baseUrl() { return this.settings.baseUrl; }, diff --git a/packages/ts-doc/src/scan/scan.js b/packages/ts-doc/src/scan/scan.js index dfe616f..8649ac8 100644 --- a/packages/ts-doc/src/scan/scan.js +++ b/packages/ts-doc/src/scan/scan.js @@ -10,30 +10,33 @@ const {DocParser} = require("../parsers/DocParser"); const {DocFile} = require("../models/DocFile"); module.exports = { - /** - * - * @param directory - */ - scanComponents(directory) { + async scanComponents(directory) { context.logger("Scan components '" + chalk.cyan(directory) + "'"); - const files = globby.sync(path.join(directory, "**/*.ejs")); + const files = await globby(path.join(directory, "**/*.ejs")); - files.forEach((file) => { - const component = require(file.replace(".ejs", ".js")); + const promises = files.map(async (file) => { + try { + const mod = await import(file.replace(".ejs", ".js")); + const component = mod.default || mod; - context.components[component.name] = (...args) => { - const content = render(file, component.method(...args)); + context.components[component.name] = (...args) => { + const content = render(file, component.method(...args)); - if (component.trim) { - return trim(content); - } - return "\n" + content + "\n"; - }; + if (component.trim) { + return trim(content); + } + return "\n" + content + "\n"; + }; - context.logger("Import component '" + chalk.cyan(path.basename(file)) + "'"); + context.logger("Import component '" + chalk.cyan(path.basename(file)) + "'"); + } catch (er) { + context.logger.error("Fail to load template", chalk.red(er), er.stack); + } }); + await Promise.all(promises); + return files; }, /** diff --git a/packages/ts-doc/src/tasks/build-api.js b/packages/ts-doc/src/tasks/build-api.js index ca0c866..ef730cf 100644 --- a/packages/ts-doc/src/tasks/build-api.js +++ b/packages/ts-doc/src/tasks/build-api.js @@ -2,13 +2,8 @@ const logger = require("fancy-log"); const chalk = require("chalk"); const {context} = require("../context"); -const {writeSymbol, writeTemplate, writeJson} = require("../write/write"); +const {writeSymbol, writeJson} = require("../write/write"); const {scanFiles, scanComponents} = require("../scan/scan"); -const path = require("path"); - -const options = { - components: path.join(__dirname, "..", "..", "components") -}; module.exports = { /** @@ -16,24 +11,21 @@ module.exports = { */ buildApi(config) { context.set(config); - return ( - Promise.resolve() - .then(() => context.readPkg()) - .then(() => scanComponents(options.components)) - .then(() => scanFiles(context.scanPatterns)) - .then(() => { - let symbols = 0; - context.symbols.forEach((symbol) => { - const content = context.components.page(symbol); - symbols++; - return writeSymbol(symbol, content); - }); - logger(chalk.green(symbols) + " symbols write"); - }) - // .then(() => writeTemplate(context.docsDir + '/**/*.{ejs,emd}')) - .then(() => writeJson()) - .then(() => logger("done")) - .catch((err) => console.error(err)) - ); + return Promise.resolve() + .then(() => context.readPkg()) + .then(() => scanComponents(config.templatesDir)) + .then(() => scanFiles(context.scanPatterns)) + .then(() => { + let symbols = 0; + context.symbols.forEach((symbol) => { + const content = context.components.page(symbol); + symbols++; + return writeSymbol(symbol, content); + }); + logger(chalk.green(symbols) + " symbols write"); + }) + .then(() => writeJson()) + .then(() => logger("done")) + .catch((err) => console.error(err)); } }; diff --git a/packages/ts-doc/src/write/write.js b/packages/ts-doc/src/write/write.js index 135128d..f194622 100644 --- a/packages/ts-doc/src/write/write.js +++ b/packages/ts-doc/src/write/write.js @@ -4,29 +4,8 @@ const fsExtra = require("fs-extra"); const logger = require("fancy-log"); const chalk = require("chalk"); const {context, symbolTypes, symbolStatus} = require("../context"); -const {render} = require("../render/render"); -const {scanTemplate} = require("../scan/scan"); module.exports = { - /** - * - * @param templatePattern - */ - writeTemplate(templatePattern) { - scanTemplate(templatePattern).forEach((file) => { - const outfile = file.replace(/.ejs|.emd/, ".md"); - logger(`Write '${chalk.cyan(outfile)}'`); - const content = render(file); - - try { - fsExtra.mkdirsSync(outfile); - } catch (er) {} - fsExtra.writeFileSync(outfile, content.trim(), { - encoding: "utf8", - flag: "w+" - }); - }); - }, /** * * @param symbol diff --git a/packages/ts-doc/test/utils.js b/packages/ts-doc/test/utils.js index b1934b0..4195a75 100644 --- a/packages/ts-doc/test/utils.js +++ b/packages/ts-doc/test/utils.js @@ -2,6 +2,7 @@ const {existsSync, writeFileSync, readFileSync} = require("fs"); const {resolve, join} = require("path"); const {scanComponents, scanFiles} = require("../src/scan/scan"); const {context} = require("../src/context"); +const path = require("path"); const ROOT_DIR = __dirname; const SNAPSHOTS_DIR = resolve(join(ROOT_DIR, "snapshots")); @@ -18,13 +19,14 @@ async function compilePage() { baseUrl: "/api", scope: "@tsed", scanPatterns: ["/packages/**/lib/**/*.d.ts"], + templatesDir: COMPONENTS_DIR, modules: {} }; context.logger = () => {}; context.logger.error = console.error; - await scanComponents(COMPONENTS_DIR); + await scanComponents(context.settings.templatesDir); await scanFiles(context.scanPatterns); return context.symbols.toArray().reduce((map, symbol) => {