UNPKG

9.3 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, Option } from './component';\nimport { ParameterType } from './options/declaration';\n\n/**\n * Responsible for discovering and loading plugins.\n */\n@Component({ name: 'plugin-host', internal: true })\nexport class PluginHost extends AbstractComponent<Application> {\n @Option({\n name: 'plugin',\n help: 'Specify the npm plugins that should be loaded. Omit to load all installed plugins, set to \\'none\\' to load no plugins.',\n type: ParameterType.Array\n })\n plugins!: string[];\n\n /**\n * Load the given list of npm plugins.\n *\n * @param plugins A list of npm modules that should be loaded as plugins. When not specified\n * this function will invoke [[discoverNpmPlugins]] to find a list of all installed plugins.\n * @returns TRUE on success, otherwise FALSE.\n */\n load(): boolean {\n const logger = this.application.logger;\n const plugins = this.plugins || this.discoverNpmPlugins();\n\n let i: number, c: number = plugins.length;\n for (i = 0; i < c; i++) {\n const plugin = plugins[i];\n // TSLint would be correct here, but it doesn't take into account user config files.\n // tslint:disable-next-line:strict-type-predicates\n if (typeof plugin !== 'string') {\n logger.error('Unknown plugin %s', plugin);\n return false;\n } else if (plugin.toLowerCase() === 'none') {\n return true;\n }\n }\n\n for (i = 0; i < c; i++) {\n const plugin = plugins[i];\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 instance(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('@')) {\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(FS.readFileSync(fileName, { encoding: 'utf-8' }));\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"]}
\No newline at end of file