UNPKG

typhonjs-escomplex-module

Version:

Provides module / individual file oriented AST processing for typhonjs-escomplex complexity reports.

333 lines (284 loc) 15 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _freeze = require('babel-runtime/core-js/object/freeze'); var _freeze2 = _interopRequireDefault(_freeze); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _PluginMetricsModule = require('escomplex-plugin-metrics-module/dist/PluginMetricsModule'); var _PluginMetricsModule2 = _interopRequireDefault(_PluginMetricsModule); var _PluginSyntaxBabylon = require('escomplex-plugin-syntax-babylon/dist/PluginSyntaxBabylon'); var _PluginSyntaxBabylon2 = _interopRequireDefault(_PluginSyntaxBabylon); var _ModuleReport = require('typhonjs-escomplex-commons/dist/module/report/ModuleReport'); var _ModuleReport2 = _interopRequireDefault(_ModuleReport); var _PluginManager = require('typhonjs-plugin-manager/dist/PluginManager'); var _PluginManager2 = _interopRequireDefault(_PluginManager); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Provides a wrapper around PluginManager for ESComplexModule. Several convenience methods for the plugin callbacks * properly manage and or create initial data that are processed by the plugins. * * The default plugins loaded include: * @see https://www.npmjs.com/package/escomplex-plugin-metrics-module * @see https://www.npmjs.com/package/escomplex-plugin-syntax-babylon */ var Plugins = function () { /** * Initializes Plugins. * * @param {object} options - module options including user plugins to load including: * ``` * (boolean) loadDefaultPlugins - When false ESComplexModule will not load any default plugins. * (Array<Object>) plugins - A list of ESComplexModule plugins that have already been instantiated. * ``` */ function Plugins() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck3.default)(this, Plugins); /** * Provides a generic plugin manager for dispatching events to module plugins. * @type {PluginManager} * @private */ this._pluginManager = new _PluginManager2.default(); if (typeof options.loadDefaultPlugins === 'boolean' && !options.loadDefaultPlugins) {/* nop */} else { this._pluginManager.add({ name: 'escomplex-plugin-syntax-babylon', instance: new _PluginSyntaxBabylon2.default() }); this._pluginManager.add({ name: 'escomplex-plugin-metrics-module', instance: new _PluginMetricsModule2.default() }); } } /** * Initializes the default `settings` object hash and then invokes the `onConfigure` plugin callback for all loaded * plugins. * * @param {object} options - (Optional) module processing options. * * @returns {object} */ (0, _createClass3.default)(Plugins, [{ key: 'onConfigure', value: function onConfigure(options) { var settings = {}; var event = this._pluginManager.invokeSyncEvent('onConfigure', void 0, { options: options, settings: settings }); settings = event !== null ? event.settings : settings; (0, _freeze2.default)(settings); return event !== null ? event.settings : settings; } /** * Invokes the `onEnterNode` plugin callback during AST traversal when a node is entered. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {ModuleScopeControl} scopeControl - The associated module report scope control. * @param {Array<string>} ignoreKeys - Any syntax assigned ignore keys for AST traversal. * @param {object} syntaxes - All loaded trait syntaxes for AST nodes. * @param {object} settings - Settings for module processing. * @param {object} node - The node being entered. * @param {object} parent - The parent node of the node being entered. * * @returns {Array<string>|null} - A directive indicating children keys to be skipped or if null all keys entirely. */ }, { key: 'onEnterNode', value: function onEnterNode(moduleReport, scopeControl, ignoreKeys, syntaxes, settings, node, parent) { var event = this._pluginManager.invokeSyncEvent('onEnterNode', void 0, { moduleReport: moduleReport, scopeControl: scopeControl, ignoreKeys: ignoreKeys, syntaxes: syntaxes, settings: settings, node: node, parent: parent }); return event !== null ? event.ignoreKeys : []; } /** * Invokes the `onExitNode` plugin callback during AST traversal when a node is exited. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {ModuleScopeControl} scopeControl - The associated module report scope control. * @param {object} syntaxes - All loaded trait syntaxes for AST nodes. * @param {object} settings - Settings for module processing. * @param {object} node - The node being entered. * @param {object} parent - The parent node of the node being entered. */ }, { key: 'onExitNode', value: function onExitNode(moduleReport, scopeControl, syntaxes, settings, node, parent) { this._pluginManager.invokeSyncEvent('onExitNode', void 0, { moduleReport: moduleReport, scopeControl: scopeControl, syntaxes: syntaxes, settings: settings, node: node, parent: parent }); } /** * Initializes the trait `syntaxes` object hash and then invokes the `onLoadSyntax` plugin callback for all loaded * plugins. * * @param {object} settings - Settings for module processing. * * @returns {object} - Loaded trait `syntaxes` for AST nodes. */ }, { key: 'onLoadSyntax', value: function onLoadSyntax(settings) { var syntaxes = {}; var event = this._pluginManager.invokeSyncEvent('onLoadSyntax', void 0, { settings: settings, syntaxes: syntaxes }); return event !== null ? event.syntaxes : syntaxes; } /** * Initializes the default ModuleReport and then invokes the `onModuleStart` plugin callback for all loaded plugins. * * @param {object} ast - Settings for module processing. * @param {object} syntaxes - All loaded trait syntaxes for AST nodes. * @param {object} settings - Settings for module processing. * * @returns {ModuleReport} - The ModuleReport being processed. */ }, { key: 'onModuleStart', value: function onModuleStart(ast, syntaxes, settings) { var moduleReport = new _ModuleReport2.default(ast.loc.start.line, ast.loc.end.line, settings); this._pluginManager.invokeSyncEvent('onModuleStart', void 0, { ast: ast, moduleReport: moduleReport, syntaxes: syntaxes, settings: settings }); return moduleReport; } /** * Invokes the `onModuleAverage` plugin callback for all loaded plugins such they might average any calculated * results. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {object} syntaxes - All loaded trait syntaxes for AST nodes. * @param {object} settings - Settings for module processing. * * @returns {ModuleReport} - The ModuleReport being processed. */ }, { key: 'onModuleAverage', value: function onModuleAverage(moduleReport, syntaxes, settings) { this._pluginManager.invokeSyncEvent('onModuleAverage', void 0, { moduleReport: moduleReport, syntaxes: syntaxes, settings: settings }); return moduleReport; } /** * Invokes the `onModuleCalculate` plugin callback for all loaded plugins such they might finish calculating results. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {object} syntaxes - All loaded trait syntaxes for AST nodes. * @param {object} settings - Settings for module processing. * * @returns {ModuleReport} - The ModuleReport being processed. */ }, { key: 'onModuleCalculate', value: function onModuleCalculate(moduleReport, syntaxes, settings) { this._pluginManager.invokeSyncEvent('onModuleCalculate', void 0, { moduleReport: moduleReport, syntaxes: syntaxes, settings: settings }); return moduleReport; } /** * Invokes the `onModuleEnd` plugin callback for all loaded plugins at the end of module processing. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {object} syntaxes - All loaded trait syntaxes for AST nodes. * @param {object} settings - Settings for module processing. * * @returns {ModuleReport} - The ModuleReport being processed. */ }, { key: 'onModuleEnd', value: function onModuleEnd(moduleReport, syntaxes, settings) { this._pluginManager.invokeSyncEvent('onModuleEnd', void 0, { moduleReport: moduleReport, syntaxes: syntaxes, settings: settings }); return moduleReport; } /** * Invokes the `onModulePostAverage` plugin callback for all loaded plugins such they might finish any calculations * that involve averaged results. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {object} syntaxes - All loaded trait syntaxes for AST nodes. * @param {object} settings - Settings for module processing. * * @returns {ModuleReport} - The ModuleReport being processed. */ }, { key: 'onModulePostAverage', value: function onModulePostAverage(moduleReport, syntaxes, settings) { this._pluginManager.invokeSyncEvent('onModulePostAverage', void 0, { moduleReport: moduleReport, syntaxes: syntaxes, settings: settings }); return moduleReport; } /** * Invokes the `onModulePostScopeCreated` plugin callback during AST traversal after a new module report scope is * created. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {ModuleScopeControl} scopeControl - The associated module report scope control. * @param {object} newScope - An object hash defining the new scope including: * ``` * (string) type - Type of report to create. * (string) name - Name of the class or method. * (number) lineStart - Start line of method. * (number) lineEnd - End line of method. * (number) paramCount - (For method scopes) Number of parameters for method. * ``` * @param {object} settings - Settings for module processing. * @param {object} node - The node being entered. * @param {object} parent - The parent node of the node being entered. */ }, { key: 'onModulePostScopeCreated', value: function onModulePostScopeCreated(moduleReport, scopeControl, newScope, settings, node, parent) { this._pluginManager.invokeSyncEvent('onModulePostScopeCreated', void 0, { moduleReport: moduleReport, scopeControl: scopeControl, newScope: newScope, settings: settings, node: node, parent: parent }); } /** * Invokes the `onModulePostScopePopped` plugin callback during AST traversal after a module report scope is * popped / exited. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {ModuleScopeControl} scopeControl - The associated module report scope control. * @param {object} scope - An object hash defining the new scope including: * ``` * (string) type - Type of report to pop. * ``` * @param {object} settings - Settings for module processing. * @param {object} node - The node being entered. * @param {object} parent - The parent node of the node being entered. */ }, { key: 'onModulePostScopePopped', value: function onModulePostScopePopped(moduleReport, scopeControl, scope, settings, node, parent) { this._pluginManager.invokeSyncEvent('onModulePostScopePopped', void 0, { moduleReport: moduleReport, scopeControl: scopeControl, scope: scope, settings: settings, node: node, parent: parent }); } /** * Invokes the `onModulePreScopeCreated` plugin callback during AST traversal before a new module report scope is * created. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {ModuleScopeControl} scopeControl - The associated module report scope control. * @param {object} newScope - An object hash defining the new scope including: * ``` * (string) type - Type of report to create. * (string) name - Name of the class or method. * (number) lineStart - Start line of method. * (number) lineEnd - End line of method. * (number) paramCount - (For method scopes) Number of parameters for method. * ``` * @param {object} settings - Settings for module processing. * @param {object} node - The node being entered. * @param {object} parent - The parent node of the node being entered. */ }, { key: 'onModulePreScopeCreated', value: function onModulePreScopeCreated(moduleReport, scopeControl, newScope, settings, node, parent) { this._pluginManager.invokeSyncEvent('onModulePreScopeCreated', void 0, { moduleReport: moduleReport, scopeControl: scopeControl, newScope: newScope, settings: settings, node: node, parent: parent }); } /** * Invokes the `onModulePreScopePopped` plugin callback during AST traversal before a module report scope is * popped / exited. * * @param {ModuleReport} moduleReport - The ModuleReport being processed. * @param {ModuleScopeControl} scopeControl - The associated module report scope control. * @param {object} scope - An object hash defining the new scope including: * ``` * (string) type - Type of report to pop. * ``` * @param {object} settings - Settings for module processing. * @param {object} node - The node being entered. * @param {object} parent - The parent node of the node being entered. */ }, { key: 'onModulePreScopePopped', value: function onModulePreScopePopped(moduleReport, scopeControl, scope, settings, node, parent) { this._pluginManager.invokeSyncEvent('onModulePreScopePopped', void 0, { moduleReport: moduleReport, scopeControl: scopeControl, scope: scope, settings: settings, node: node, parent: parent }); } }]); return Plugins; }(); exports.default = Plugins; module.exports = exports['default'];