UNPKG

9.27 kBSource Map (JSON)View Raw
1{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../src/lib/utils/plugins.ts"],"names":[],"mappings":"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","sourcesContent":["import * as FS from 'fs';\nimport * as Path from 'path';\n\nimport { Application } from '../application';\nimport { AbstractComponent, Component } from './component';\nimport { BindOption } from './options';\nimport { readFile } from './fs';\n\n/**\n * Responsible for discovering and loading plugins.\n */\n@Component({ name: 'plugin-host', internal: true })\nexport class PluginHost extends AbstractComponent<Application> {\n @BindOption('plugin')\n plugins!: string[];\n\n /**\n * Load all npm plugins.\n * @returns TRUE on success, otherwise FALSE.\n */\n load(): boolean {\n const logger = this.application.logger;\n const plugins = this.plugins.length ? this.resolvePluginPaths(this.plugins) : this.discoverNpmPlugins();\n\n if (plugins.some(plugin => plugin.toLowerCase() === 'none')) {\n return true;\n }\n\n for (const plugin of plugins) {\n try {\n const instance = require(plugin);\n const initFunction = typeof instance.load === 'function'\n ? instance.load\n : instance // support legacy plugins\n ;\n if (typeof initFunction === 'function') {\n initFunction(this);\n logger.write('Loaded plugin %s', plugin);\n } else {\n logger.error('Invalid structure in plugin %s, no function found.', plugin);\n }\n } catch (error) {\n logger.error('The plugin %s could not be loaded.', plugin);\n logger.writeln(error.stack);\n return false;\n }\n }\n return true;\n }\n\n /**\n * Discover all installed TypeDoc plugins.\n *\n * @returns A list of all npm module names that are qualified TypeDoc plugins.\n */\n private discoverNpmPlugins(): string[] {\n const result: string[] = [];\n const logger = this.application.logger;\n discover();\n return result;\n\n /**\n * Find all parent folders containing a `node_modules` subdirectory.\n */\n function discover() {\n let path = process.cwd(), previous: string;\n do {\n const modules = Path.join(path, 'node_modules');\n if (FS.existsSync(modules) && FS.statSync(modules).isDirectory()) {\n discoverModules(modules);\n }\n\n previous = path;\n path = Path.resolve(Path.join(previous, '..'));\n } while (previous !== path);\n }\n\n /**\n * Scan the given `node_modules` directory for TypeDoc plugins.\n */\n function discoverModules(basePath: string) {\n const candidates: string[] = [];\n FS.readdirSync(basePath).forEach((name) => {\n const dir = Path.join(basePath, name);\n if (name.startsWith('@') && FS.statSync(dir).isDirectory()) {\n FS.readdirSync(dir).forEach((n) => {\n candidates.push(Path.join(name, n));\n });\n }\n candidates.push(name);\n });\n candidates.forEach((name) => {\n const infoFile = Path.join(basePath, name, 'package.json');\n if (!FS.existsSync(infoFile)) {\n return;\n }\n\n const info = loadPackageInfo(infoFile);\n if (isPlugin(info)) {\n result.push(Path.join(basePath, name));\n }\n });\n }\n\n /**\n * Load and parse the given `package.json`.\n */\n function loadPackageInfo(fileName: string): any {\n try {\n return JSON.parse(readFile(fileName));\n } catch (error) {\n logger.error('Could not parse %s', fileName);\n return {};\n }\n }\n\n /**\n * Test whether the given package info describes a TypeDoc plugin.\n */\n function isPlugin(info: any): boolean {\n const keywords: unknown[] = info.keywords;\n if (!keywords || !Array.isArray(keywords)) {\n return false;\n }\n\n for (let i = 0, c = keywords.length; i < c; i++) {\n const keyword = keywords[i];\n if (typeof keyword === 'string' && keyword.toLowerCase() === 'typedocplugin') {\n return true;\n }\n }\n\n return false;\n }\n }\n\n /**\n * Resolves plugin paths to absolute paths from the current working directory\n * (`process.cwd()`).\n *\n * ```txt\n * ./plugin -> resolve\n * ../plugin -> resolve\n * plugin -> don't resolve (module resolution)\n * /plugin -> don't resolve (already absolute path)\n * c:\\plugin -> don't resolve (already absolute path)\n * ```\n *\n * @param plugins\n */\n private resolvePluginPaths(plugins: string[]) {\n const cwd = process.cwd();\n return plugins.map(plugin => {\n // treat plugins that start with `.` as relative, requiring resolution\n if (plugin.startsWith('.')) {\n return Path.resolve(cwd, plugin);\n }\n return plugin;\n });\n }\n}\n"]}
\No newline at end of file