├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── lib ├── angular-hot-loader.js ├── interceptors │ ├── animation.js │ ├── component.js │ ├── config.js │ ├── constant.js │ ├── controller.js │ ├── decorator.js │ ├── directive.js │ ├── factory.js │ ├── filter.js │ ├── info.js │ ├── module.js │ ├── provider.js │ ├── run.js │ ├── service.js │ └── value.js ├── loader.js ├── logger.js ├── makeIdentitySourceMap.js ├── module │ └── index.js └── utils │ ├── hasChanged.js │ └── transform.js ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .DS_Store 3 | Thumbs.db 4 | *.log 5 | node_modules/ 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '6' 4 | 5 | cache: 6 | yarn: true 7 | 8 | os: 9 | - linux 10 | 11 | script: 12 | - npm run lint 13 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.9.14 2 | ### Bug Fixes: 3 | - Implemented missed `info` interceptor. 4 | 5 | ## 0.9.13 6 | ### Bug Fixes: 7 | - Fix arrow function arguments. 8 | 9 | ## 0.9.12 10 | ### Bug Fixes: 11 | - Update module RegExp, thanks @miluoshi. 12 | - Fix directive strict DI compatibility, thanks @miluoshi. 13 | 14 | ## 0.9.11 15 | - Update documentation with notes about inline function inside angular methods declaration. 16 | 17 | ## 0.9.10 18 | ### Dependencies update 19 | ### Bug Fixes: 20 | - Add config functions cache 21 | - Update module RegExp to match all module definitions 22 | - Update recompile functionality 23 | 24 | ## 0.9.9 25 | ### Dependencies update 26 | ### Code style updates 27 | 28 | ## 0.9.8 29 | ### Bug Fixes: 30 | - Cache allow same names for different angular parts. 31 | 32 | ## 0.9.7 33 | ### Bug Fixes: 34 | - Move match logging to avoid undefined `map`. 35 | 36 | ## 0.9.6 37 | ### Bug Fixes: 38 | - Fixed **babel-runtime**: Make usage possible. 39 | 40 | ## 0.9.5 41 | ### Bug Fixes: 42 | - Fixed **decorator**: Add decorator invoke. 43 | 44 | ## 0.9.4 45 | ### Bug Fixes: 46 | - Fixed **filter**: Add filter invoke. 47 | - Fixed **factory**: Use cached factory if exists. 48 | 49 | ### Dependencies update 50 | 51 | ## 0.9.3 52 | ### Bug Fixes: 53 | - Fixed **windows path**: Windows path missed slahes, thanks @Sn0wFox. 54 | 55 | ## 0.9.2 56 | ### Bug Fixes: 57 | - Fixed **controller transform**: $element, $attrs and $transclude are locals, not providers, thanks @joaovieira. 58 | 59 | ## 0.9.1 60 | ### Bug Fixes: 61 | - Fixed **directive**: $injector for directives, thanks @joaovieira. 62 | 63 | ## 0.9.0 64 | ### Bug Fixes: 65 | - Fixed: handle multiple async modules, es6 classes, thanks @joaovieira. 66 | - Fixed: no options bug, thanks @joaovieira. 67 | 68 | ### Improvements: 69 | - Updated README with links to Webpack HMR configuration. 70 | - Added angular as PeerDependency. 71 | - Added linting. 72 | - Added logger. 73 | - Code style fixes and cleanup. 74 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Angular Hot Loader 2 | 3 | [![Build Status](https://travis-ci.org/vitaliy-bobrov/angular-hot-loader.svg?branch=master)](https://travis-ci.org/vitaliy-bobrov/angular-hot-loader) 4 | [![npm version](https://badge.fury.io/js/angular-hot-loader.svg)](https://badge.fury.io/js/angular-hot-loader) 5 | [![npm](https://img.shields.io/npm/dt/angular-hot-loader.svg)](https://github.com/vitaliy-bobrov/angular-hot-loader) 6 | 7 | 🔥 Webpack Hot Module Replacement for Angular 1.x applications. 8 | 9 | **Now works only with UI Router** 10 | 11 | Forked from [Angular-HMR](https://github.com/yargalot/Angular-HMR) 12 | 13 | ## Installation 14 | - npm 15 | ```bash 16 | npm install --save-dev angular-hot-loader 17 | ``` 18 | 19 | - yarn 20 | ```bash 21 | yarn add --dev angular-hot-loader 22 | ``` 23 | 24 | ## Webpack setup 25 | 26 | * Webpack 2.x: 27 | ```js 28 | rules: [ 29 | { 30 | test: /\.js$/, 31 | use: [ 32 | 'angular-hot-loader', 33 | // Any other loaders. 34 | ] 35 | } 36 | ] 37 | ``` 38 | 39 | With options: 40 | 41 | ```js 42 | rules: [ 43 | { 44 | test: /\.js$/, 45 | use: [ 46 | { 47 | loader: 'angular-hot-loader', 48 | options: { 49 | log: true, 50 | rootElement: 'html' 51 | } 52 | }, 53 | // Any other loaders. 54 | ] 55 | } 56 | ] 57 | ``` 58 | 59 | * Webpack 1.x: 60 | ```js 61 | loaders: [ 62 | { 63 | test: /\.js$/, 64 | loader: 'angular-hot!...other loaders' 65 | } 66 | ] 67 | ``` 68 | 69 | ### Webpack Hot Module Replacement setup: 70 | See Webpack documentation: 71 | - [Webpack 2.x](https://webpack.js.org/configuration/dev-server/#devserver-hot) 72 | - [Webpack 1.x](http://webpack.github.io/docs/hot-module-replacement-with-webpack.html) 73 | 74 | ## Options 75 | 76 | ### rootElement {String} 77 | Default: `[ng-app]` 78 | 79 | Specifies application DOM root element selector. Use 'html' when boostraping your Angular app on document. 80 | 81 | ### log {Boolean} 82 | Default: `false` 83 | 84 | Enables module output to console. 85 | 86 | ## How it works 87 | This will inject the new controller / template / service / whatever and then reload the state in UI Router. 88 | 89 | ### Example app structure: 90 | 91 | ```js 92 | import MyFactory from './your-factory'; 93 | import MyCtrl from './your-controller'; 94 | import MyComponent from './your-component'; 95 | 96 | angular 97 | .module('my-app', [ui.router]) 98 | .directive('MyDirective', require('MyDirective')) 99 | .factory('MyFactory', MyFactory) 100 | .controller('MyCtrl', MyCtrl) 101 | .component('myComponent', MyComponent); 102 | ``` 103 | -------------------------------------------------------------------------------- /lib/angular-hot-loader.js: -------------------------------------------------------------------------------- 1 | const toFactory = require('to-factory'); 2 | const logger = require('./logger'); 3 | 4 | let hotAngular; 5 | 6 | /** 7 | * Angular Hot Loader. 8 | * @param {Object} settings - hot loader setiings. 9 | */ 10 | const HotAngular = function(settings) { 11 | const toString = Function.prototype.toString; 12 | 13 | this.ANGULAR_MODULE; 14 | this.settings = settings || {}; 15 | 16 | // Create cahing objects. 17 | this.MODULE_CACHE = {}; 18 | this.cache = {}; 19 | this.configCache = function() {}; 20 | this.constantCache = {}; 21 | this.controllerCache = {}; 22 | this.decoratorCache = {}; 23 | this.factoryCache = {}; 24 | this.filterCache = {}; 25 | this.serviceCache = {}; 26 | this.valueCache = {}; 27 | this.templateCache = {}; 28 | 29 | this.name; 30 | this.bootstrapElement; 31 | 32 | /** 33 | * Gets transpiled function body. 34 | * @param {Function} fn - transpiled function source. 35 | */ 36 | function fnBody(fn) { 37 | return toString.call(fn).replace(/^[^{]*{\s*/,'').replace(/\s*}[^}]*$/,''); 38 | } 39 | 40 | /** 41 | * Checks if function is es6 or Babel class. 42 | * @param {Function} fn - transpiled function source. 43 | */ 44 | function isClass(fn) { 45 | return (typeof fn === 'function' && 46 | (/^class\s/.test(toString.call(fn)) || 47 | // babel class definition. 48 | (/.*classCallCheck\(?/.test(fnBody(fn))))); 49 | } 50 | 51 | /** 52 | * Wraps class functions in factory. 53 | */ 54 | this.classTransform = function(fn) { 55 | return isClass(fn) ? toFactory(fn) : fn; 56 | }; 57 | 58 | this.logger = this.settings.log ? logger : function() {}; 59 | 60 | /** 61 | * Document load handler. 62 | */ 63 | function loadHandler() { 64 | this.element = document.querySelector(this.settings.rootElement); 65 | this.originalContent = this.element.innerHTML; 66 | } 67 | 68 | // Module may have been lazy loaded after document load. 69 | if (document.readyState === 'complete') { 70 | loadHandler.call(this); 71 | } else { 72 | document.addEventListener('DOMContentLoaded', loadHandler.bind(this), false); 73 | } 74 | }; 75 | 76 | // Angular functions to replace 77 | HotAngular.prototype.animation = require('./interceptors/animation'); 78 | HotAngular.prototype.component = require('./interceptors/component'); 79 | HotAngular.prototype.config = require('./interceptors/config'); 80 | HotAngular.prototype.constant = require('./interceptors/constant'); 81 | HotAngular.prototype.controller = require('./interceptors/controller'); 82 | HotAngular.prototype.decorator = require('./interceptors/decorator'); 83 | HotAngular.prototype.directive = require('./interceptors/directive'); 84 | HotAngular.prototype.factory = require('./interceptors/factory'); 85 | HotAngular.prototype.filter = require('./interceptors/filter'); 86 | HotAngular.prototype.info = require('./interceptors/info'); 87 | HotAngular.prototype.module = require('./interceptors/module'); 88 | HotAngular.prototype.provider = require('./interceptors/provider'); 89 | HotAngular.prototype.run = require('./interceptors/run'); 90 | HotAngular.prototype.service = require('./interceptors/service'); 91 | HotAngular.prototype.value = require('./interceptors/value'); 92 | 93 | HotAngular.prototype.reloadState = function() { 94 | const elm = this.bootstrapElement; 95 | 96 | if (elm) { 97 | if (elm.injector().has('$state')) { 98 | this.logger('Reloading UI Router State', 'info'); 99 | 100 | const $state = elm.injector().get('$state'); 101 | 102 | $state.transitionTo($state.current, $state.params, { 103 | reload: true, 104 | inherit: false, 105 | notify: true 106 | }); 107 | } else { 108 | this.logger('Recompile App', 'info'); 109 | elm.injector().get('$compile')(elm.contents())(elm.scope()); 110 | } 111 | } 112 | }; 113 | 114 | HotAngular.prototype.recompile = function() { 115 | const elm = this.bootstrapElement; 116 | 117 | if (elm) { 118 | this.logger('Recompile App', 'info'); 119 | elm.injector().get('$compile')(elm.contents())(elm.scope()); 120 | } else { 121 | this.logger('Reload Page', 'info'); 122 | window.location.reload(); 123 | } 124 | }; 125 | 126 | // HotAngular must be a singleton so the cache remains the 127 | // same across consecutive updates. 128 | module.exports = function (settings) { 129 | if (!hotAngular) { 130 | hotAngular = new HotAngular(settings); 131 | } 132 | 133 | return hotAngular; 134 | }; 135 | -------------------------------------------------------------------------------- /lib/interceptors/animation.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, factoryFunction) { 2 | this.logger(`ANIMATION "${name}": 3 | ${factoryFunction}`, 'info'); 4 | 5 | return this; 6 | }; 7 | -------------------------------------------------------------------------------- /lib/interceptors/component.js: -------------------------------------------------------------------------------- 1 | const transform = require('../utils/transform'); 2 | const hasChanged = require('../utils/hasChanged'); 3 | 4 | module.exports = function(name, component) { 5 | let def = component; 6 | const cacheKey = `component:${name}`; 7 | 8 | this.logger(`COMPONENT "${name}": 9 | ${JSON.stringify(component)}`, 'info'); 10 | 11 | const exists = this.MODULE_CACHE[cacheKey]; 12 | const changed = hasChanged.call(this, name, def); 13 | 14 | if (def.template) { 15 | this.templateCache[name] = def.template; 16 | } 17 | 18 | if (def.controller) { 19 | this.controllerCache[name] = def.controller; 20 | } 21 | 22 | if (changed && exists) { 23 | this.reloadState(); 24 | } 25 | 26 | if (!exists) { 27 | this.MODULE_CACHE[cacheKey] = true; 28 | this.ANGULAR_MODULE.component(name, transform.call(this, name, def)); 29 | } 30 | 31 | return this; 32 | }; 33 | -------------------------------------------------------------------------------- /lib/interceptors/config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(configFunction) { 2 | this.logger(`CONFIG "${this.ANGULAR_MODULE.name}" 3 | ${configFunction}`, 'info'); 4 | 5 | const changed = this.configCache.toString() !== configFunction.toString(); 6 | 7 | if (changed) { 8 | this.ANGULAR_MODULE.config(configFunction); 9 | this.reloadState(); 10 | } 11 | 12 | return this; 13 | }; 14 | -------------------------------------------------------------------------------- /lib/interceptors/constant.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, constant) { 2 | const exists = !!this.constantCache[name]; 3 | 4 | this.constantCache[name] = constant; 5 | 6 | this.logger(`CONSTANT "${name}" 7 | ${constant}`, 'info'); 8 | 9 | if (exists) { 10 | /* eslint-disable no-unused-vars */ 11 | this.constantInject = this.constantCache[name]; 12 | 13 | this.bootstrapElement.injector().invoke([name, function(constant) { 14 | constant = this.constantInject; 15 | }], this); 16 | /* eslint-enable */ 17 | 18 | this.reloadState(); 19 | } else { 20 | this.ANGULAR_MODULE.constant(name, this.constantCache[name]); 21 | } 22 | 23 | return this; 24 | }; 25 | -------------------------------------------------------------------------------- /lib/interceptors/controller.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, controllerFunction) { 2 | const _that = this; 3 | const cacheKey = `ctrl:${name}`; 4 | const exists = this.MODULE_CACHE[cacheKey]; 5 | this.controllerCache[name] = controllerFunction; 6 | 7 | this.logger(`CONTROLLER: "${name}": 8 | ${controllerFunction}`, 'info'); 9 | 10 | if (exists) { 11 | this.reloadState(); 12 | } else { 13 | this.MODULE_CACHE[cacheKey] = true; 14 | this.ANGULAR_MODULE.controller(name, ['$injector', '$scope', function($injector, $scope) { 15 | return $injector.invoke(_that.classTransform(_that.controllerCache[name]), this, { 16 | '$scope': $scope 17 | }); 18 | }]); 19 | } 20 | 21 | return this; 22 | }; 23 | -------------------------------------------------------------------------------- /lib/interceptors/decorator.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, decoratorFunction) { 2 | const cacheKey = `decorator:${name}`; 3 | const exists = this.MODULE_CACHE[cacheKey]; 4 | this.decoratorCache[name] = decoratorFunction; 5 | 6 | this.logger(`DECORATOR "${name}": 7 | ${decoratorFunction}`, 'info'); 8 | 9 | if (exists) { 10 | /* eslint-disable no-unused-vars */ 11 | this.decoratorInject = decoratorFunction; 12 | 13 | this.bootstrapElement.injector().invoke([name, function(decorator) { 14 | decorator = this.decoratorInject; 15 | }], this); 16 | /* eslint-enable */ 17 | 18 | this.reloadState(); 19 | } else { 20 | this.MODULE_CACHE[cacheKey] = true; 21 | this.ANGULAR_MODULE.decorator(name, this.decoratorCache[name]); 22 | } 23 | 24 | return this; 25 | }; 26 | -------------------------------------------------------------------------------- /lib/interceptors/directive.js: -------------------------------------------------------------------------------- 1 | const transform = require('../utils/transform'); 2 | const hasChanged = require('../utils/hasChanged'); 3 | 4 | module.exports = function (name, directive) { 5 | let def, directiveFn, dependencies; 6 | const cacheKey = `directive:${name}`; 7 | 8 | if (Array.isArray(directive)) { 9 | dependencies = directive.slice(0, -1); 10 | directiveFn = directive[directive.length - 1]; 11 | } else if (typeof directive === 'function') { 12 | dependencies = directive.$inject || []; 13 | directiveFn = directive; 14 | } else { 15 | throw new Error('Malformed directive function'); 16 | } 17 | 18 | def = directiveFn(); 19 | 20 | this.logger(`DIRECTIVE "${name}": 21 | ${JSON.stringify(def)}`, 'info'); 22 | 23 | const exists = this.MODULE_CACHE[cacheKey]; 24 | const changed = hasChanged.call(this, name, def); 25 | 26 | if (def.template) { 27 | this.templateCache[name] = def.template; 28 | } 29 | 30 | if (def.controller) { 31 | this.controllerCache[name] = def.controller; 32 | } 33 | 34 | if (exists && changed) { 35 | this.reloadState(); 36 | } 37 | 38 | if (!exists) { 39 | this.MODULE_CACHE[cacheKey] = true; 40 | const transformedDirective = (...args) => { 41 | const directive = directiveFn.apply(null, args); 42 | const transformedDef = transform.call(this, name, directive); 43 | directive.controller = transformedDef.controller; 44 | 45 | return directive; 46 | }; 47 | transformedDirective.$inject = dependencies; 48 | 49 | this.ANGULAR_MODULE.directive(name, transformedDirective); 50 | } 51 | 52 | return this; 53 | }; 54 | -------------------------------------------------------------------------------- /lib/interceptors/factory.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, factoryFunction) { 2 | const cacheKey = `factory:${name}`; 3 | const exists = this.MODULE_CACHE[cacheKey]; 4 | this.factoryCache[name] = factoryFunction; 5 | 6 | this.logger(`FACTORY "${name}": 7 | ${factoryFunction}`, 'info'); 8 | 9 | if (exists) { 10 | this.factoryInject = factoryFunction(); 11 | 12 | this.bootstrapElement.injector().invoke([name, function(factory) { 13 | factory.loadSessions = this.factoryInject.loadSessions; 14 | }], this); 15 | 16 | this.reloadState(); 17 | } else { 18 | this.MODULE_CACHE[cacheKey] = true; 19 | this.ANGULAR_MODULE.factory(name, this.factoryCache[name]); 20 | } 21 | 22 | return this; 23 | }; 24 | -------------------------------------------------------------------------------- /lib/interceptors/filter.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, filterFunction) { 2 | const cacheKey = `filter:${name}`; 3 | const exists = this.MODULE_CACHE[cacheKey]; 4 | this.filterCache[name] = filterFunction; 5 | 6 | this.logger(`FILTER "${name}": 7 | ${filterFunction}`, 'info'); 8 | 9 | if (exists) { 10 | /* eslint-disable no-unused-vars */ 11 | this.filterInject = filterFunction; 12 | 13 | this.bootstrapElement.injector().invoke([name, function(filter) { 14 | filter = this.filterInject; 15 | }], this); 16 | /* eslint-enable */ 17 | 18 | this.reloadState(); 19 | } else { 20 | this.MODULE_CACHE[cacheKey] = true; 21 | this.ANGULAR_MODULE.filter(name, this.filterCache[name]); 22 | } 23 | 24 | return this; 25 | }; 26 | -------------------------------------------------------------------------------- /lib/interceptors/info.js: -------------------------------------------------------------------------------- 1 | module.exports = function(info) { 2 | this.logger(`INFO: 3 | ${info}`, 'info'); 4 | 5 | this.ANGULAR_MODULE.info(info); 6 | 7 | return this; 8 | }; 9 | -------------------------------------------------------------------------------- /lib/interceptors/module.js: -------------------------------------------------------------------------------- 1 | module.exports = function(moduleName, injectorArray) { 2 | this.strapped = false; 3 | 4 | if (this.strapped) { 5 | return this; 6 | } 7 | 8 | if (injectorArray) { 9 | injectorArray.push(require('../module').name); 10 | this.ANGULAR_MODULE = angular.module(moduleName, injectorArray); 11 | } else { 12 | angular.module(moduleName); 13 | } 14 | 15 | this.cache[moduleName] = this.cache[moduleName] || {}; 16 | this.MODULE_CACHE = this.cache[moduleName]; 17 | 18 | this.name = this.ANGULAR_MODULE.name; 19 | this.bootstrapElement = angular.element(this.element); 20 | this.strapped = true; 21 | 22 | return this; 23 | }; 24 | -------------------------------------------------------------------------------- /lib/interceptors/provider.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, factoryFunction) { 2 | this.logger(`PROVIDER "${name}": 3 | ${factoryFunction}`, 'info'); 4 | 5 | return this; 6 | }; 7 | -------------------------------------------------------------------------------- /lib/interceptors/run.js: -------------------------------------------------------------------------------- 1 | module.exports = function(runFunction) { 2 | this.logger(`RUN "${this.ANGULAR_MODULE}": 3 | ${runFunction}`, 'info'); 4 | 5 | this.ANGULAR_MODULE.run(runFunction); 6 | 7 | return this; 8 | }; 9 | -------------------------------------------------------------------------------- /lib/interceptors/service.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, serviceFunction) { 2 | const cacheKey = `service:${name}`; 3 | const exists = this.MODULE_CACHE[cacheKey]; 4 | this.serviceCache[name] = serviceFunction; 5 | 6 | this.logger(`SERVICE "${name}": 7 | ${serviceFunction}`, 'info'); 8 | 9 | const intercept = function($provide) { 10 | $provide.decorator(name, function($delegate) { 11 | return $delegate; 12 | }); 13 | }; 14 | 15 | if (exists) { 16 | /* eslint-disable no-unused-vars */ 17 | this.serviceInject = serviceFunction; 18 | 19 | this.bootstrapElement.injector().invoke([name, function(service) { 20 | service = this.serviceInject; 21 | }], this); 22 | /* eslint-enable */ 23 | 24 | this.reloadState(); 25 | } else { 26 | this.MODULE_CACHE[cacheKey] = true; 27 | this.ANGULAR_MODULE.service(name, this.serviceCache[name]); 28 | this.ANGULAR_MODULE.config(intercept); 29 | } 30 | 31 | return this; 32 | }; 33 | -------------------------------------------------------------------------------- /lib/interceptors/value.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, value) { 2 | const exists = !!this.valueCache[name]; 3 | 4 | this.valueCache[name] = value; 5 | 6 | this.logger(`VALUE "${name}": 7 | ${value}`, 'info'); 8 | 9 | if (exists) { 10 | /* eslint-disable */ 11 | this.valueInject = this.valueCache[name]; 12 | 13 | this.bootstrapElement.injector().invoke([name, function(value) { 14 | value = this.valueInject; 15 | }], this); 16 | /* eslint-enable */ 17 | 18 | this.reloadState(); 19 | } else { 20 | this.ANGULAR_MODULE.value(name, this.valueCache[name]); 21 | } 22 | 23 | return this; 24 | }; 25 | -------------------------------------------------------------------------------- /lib/loader.js: -------------------------------------------------------------------------------- 1 | const loaderUtils = require('loader-utils'); 2 | const { SourceNode, SourceMapConsumer } = require('source-map'); 3 | const makeIdentitySourceMap = require('./makeIdentitySourceMap'); 4 | const logger = require('./logger'); 5 | 6 | const angularModule = /(?:_?angular[0-9]?\s*(?:\.\s*default)?)?[.\s]+module\((["']?[\w.\-\/\\]+['"]?\s*,\s*\[(?:[\w.,\s()\[\]'"@\/\\]*)\]\s*)\)/g; 7 | 8 | function transform(source, map) { 9 | const options = loaderUtils.getOptions(this) || {}; 10 | const config = { 11 | rootElement: '[ng-app]', 12 | log: false 13 | }; 14 | 15 | if (this.cacheable) { 16 | this.cacheable(); 17 | } 18 | 19 | Object.keys(options).forEach(function(attr) { 20 | if (config.hasOwnProperty(attr)) { 21 | config[attr] = options[attr]; 22 | } 23 | }); 24 | 25 | if (!source.match(angularModule)) { 26 | return this.callback(null, source, map); 27 | } 28 | 29 | const separator = '\n\n'; 30 | const resolved = require.resolve('./angular-hot-loader') 31 | .replace(/\\/g, '\\\\'); // Replace for Windows path fix. 32 | 33 | const prependText = ` 34 | if (module.hot) { 35 | module.hot.accept(); 36 | var hotAngular = require('${resolved}')(${JSON.stringify(config)}); 37 | } 38 | `; 39 | 40 | const processedSource = source.replace(angularModule, 'hotAngular.module($1)'); 41 | 42 | if (this.sourceMap === false) { 43 | return this.callback(null, [ 44 | prependText, 45 | processedSource 46 | ].join(separator)); 47 | } 48 | 49 | if (!map) { 50 | map = makeIdentitySourceMap(source, this.resourcePath); 51 | } 52 | 53 | if (config.log) { 54 | const message = `[AHL] Replacement Matched: ${map.sources.join(', ')}`; 55 | 56 | logger(message, 'info'); 57 | } 58 | 59 | const node = new SourceNode(null, null, null, [ 60 | new SourceNode(null, null, this.resourcePath, prependText), 61 | SourceNode.fromStringWithSourceMap(processedSource, new SourceMapConsumer(map)) 62 | ]).join(separator); 63 | const result = node.toStringWithSourceMap(); 64 | 65 | return this.callback(null, result.code, result.map.toString()); 66 | } 67 | 68 | module.exports = transform; 69 | -------------------------------------------------------------------------------- /lib/logger.js: -------------------------------------------------------------------------------- 1 | module.exports = function(message, level) { 2 | level = level || 'log'; 3 | 4 | /* eslint-disable */ 5 | if (console[level]) { 6 | console[level](message); 7 | } else { 8 | console.log(message); 9 | } 10 | /* eslint-enable */ 11 | }; 12 | -------------------------------------------------------------------------------- /lib/makeIdentitySourceMap.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { SourceMapGenerator } = require('source-map'); 4 | 5 | function makeIdentitySourceMap(content, resourcePath) { 6 | const map = new SourceMapGenerator(); 7 | map.setSourceContent(resourcePath, content); 8 | 9 | content.split('\n').forEach((line, index) => { 10 | map.addMapping({ 11 | source: resourcePath, 12 | original: { 13 | line: index + 1, 14 | column: 0, 15 | }, 16 | generated: { 17 | line: index + 1, 18 | column: 0, 19 | }, 20 | }); 21 | }); 22 | 23 | return map.toJSON(); 24 | } 25 | 26 | module.exports = makeIdentitySourceMap; 27 | -------------------------------------------------------------------------------- /lib/module/index.js: -------------------------------------------------------------------------------- 1 | const logger = require('../logger'); 2 | 3 | module.exports = angular 4 | .module('angular-hot-loader', []) 5 | .config(function() { 6 | logger('[AHL] Angular Hot Loader module config phase', 'info'); 7 | }); 8 | -------------------------------------------------------------------------------- /lib/utils/hasChanged.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Get content of all the methods in the class definition, 3 | * (e.g. constructor and any other prototype methods). 4 | * 5 | * @param {Function} cls - Class 6 | * @return {string} 7 | */ 8 | function getClassContent(cls) { 9 | let content = ''; 10 | const props = Object.getOwnPropertyNames(cls.prototype); 11 | for (let prop of props) { 12 | content += cls.prototype[prop].toString(); 13 | } 14 | return content; 15 | } 16 | 17 | module.exports = function(name, def) { 18 | if (!this.templateCache[name]) return true; 19 | const templateChanged = def.template.toString() !== this.templateCache[name].toString(); 20 | 21 | // No need to check class, if template already changed. 22 | // Assuming template is smaller than controller class. 23 | if (templateChanged) return true; 24 | 25 | if (!this.controllerCache[name]) return true; 26 | const controllerChanged = getClassContent(def.controller) !== getClassContent(this.controllerCache[name]); 27 | 28 | return controllerChanged; 29 | }; 30 | -------------------------------------------------------------------------------- /lib/utils/transform.js: -------------------------------------------------------------------------------- 1 | module.exports = function(name, def) { 2 | if (def.template) { 3 | def.template = () => this.templateCache[name]; 4 | } 5 | 6 | if (def.controller && typeof def.controller === 'function') { 7 | const that = this; 8 | def.controller = function($injector, $scope, $element, $attrs, $transclude) { 9 | return $injector.invoke( 10 | that.classTransform(that.controllerCache[name]), 11 | this, 12 | { 13 | $scope, 14 | $element, 15 | $attrs, 16 | $transclude 17 | } 18 | ); 19 | }; 20 | } 21 | 22 | return def; 23 | }; 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-hot-loader", 3 | "version": "0.9.15", 4 | "description": "🔥 Webpack Hot Module Replacement for Angular 1.x applications.", 5 | "main": "./lib/loader.js", 6 | "scripts": { 7 | "test": "exit 0", 8 | "lint": "eslint ./lib/**/*.js" 9 | }, 10 | "engines": { 11 | "node": ">=6.0.0" 12 | }, 13 | "contributors": [ 14 | "Vitaliy Bobrov (https://vitaliy-bobrov.github.io)", 15 | "João Vieira (https://github.com/joaovieira)", 16 | "Jonas Pauthier (https://github.com/Nargonath)", 17 | "Sergey Bekrin (https://github.com/sergeybekrin)" 18 | ], 19 | "license": "ISC", 20 | "dependencies": { 21 | "loader-utils": "^1.1.0", 22 | "source-map": "^0.7.3", 23 | "to-factory": "^1.0.0" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "git+https://github.com/vitaliy-bobrov/angular-hot-loader.git" 28 | }, 29 | "keywords": [ 30 | "Angular", 31 | "loader", 32 | "webpack", 33 | "HMR", 34 | "hot module replacement" 35 | ], 36 | "bugs": { 37 | "url": "https://github.com/vitaliy-bobrov/angular-hot-loader/issues" 38 | }, 39 | "homepage": "https://github.com/vitaliy-bobrov/angular-hot-loader#readme", 40 | "devDependencies": { 41 | "eslint": "^5.9.0", 42 | "eslint-plugin-node": "^8.0.0" 43 | }, 44 | "eslintConfig": { 45 | "env": { 46 | "browser": true, 47 | "node": true 48 | }, 49 | "globals": { 50 | "angular": false 51 | }, 52 | "plugins": [ 53 | "node" 54 | ], 55 | "extends": [ 56 | "eslint:recommended", 57 | "plugin:node/recommended" 58 | ] 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.0.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 15 | integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | acorn-jsx@^5.0.0: 22 | version "5.0.1" 23 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" 24 | integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== 25 | 26 | acorn@^6.0.2: 27 | version "6.0.4" 28 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" 29 | integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== 30 | 31 | ajv@^6.5.3, ajv@^6.6.1: 32 | version "6.6.1" 33 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" 34 | integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== 35 | dependencies: 36 | fast-deep-equal "^2.0.1" 37 | fast-json-stable-stringify "^2.0.0" 38 | json-schema-traverse "^0.4.1" 39 | uri-js "^4.2.2" 40 | 41 | ansi-escapes@^3.0.0: 42 | version "3.0.0" 43 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" 44 | 45 | ansi-regex@^3.0.0: 46 | version "3.0.0" 47 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 48 | 49 | ansi-regex@^4.0.0: 50 | version "4.0.0" 51 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" 52 | integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== 53 | 54 | ansi-styles@^3.1.0: 55 | version "3.2.0" 56 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 57 | dependencies: 58 | color-convert "^1.9.0" 59 | 60 | ansi-styles@^3.2.0: 61 | version "3.2.1" 62 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 63 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 64 | dependencies: 65 | color-convert "^1.9.0" 66 | 67 | argparse@^1.0.7: 68 | version "1.0.9" 69 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 70 | dependencies: 71 | sprintf-js "~1.0.2" 72 | 73 | array-union@^1.0.1: 74 | version "1.0.2" 75 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 76 | dependencies: 77 | array-uniq "^1.0.1" 78 | 79 | array-uniq@^1.0.1: 80 | version "1.0.3" 81 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 82 | 83 | arrify@^1.0.0: 84 | version "1.0.1" 85 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 86 | 87 | astral-regex@^1.0.0: 88 | version "1.0.0" 89 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 90 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 91 | 92 | balanced-match@^1.0.0: 93 | version "1.0.0" 94 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 95 | 96 | big.js@^3.1.3: 97 | version "3.1.3" 98 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" 99 | 100 | brace-expansion@^1.1.7: 101 | version "1.1.8" 102 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 103 | dependencies: 104 | balanced-match "^1.0.0" 105 | concat-map "0.0.1" 106 | 107 | caller-path@^0.1.0: 108 | version "0.1.0" 109 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 110 | dependencies: 111 | callsites "^0.2.0" 112 | 113 | callsites@^0.2.0: 114 | version "0.2.0" 115 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 116 | 117 | chalk@^2.0.0, chalk@^2.1.0: 118 | version "2.3.0" 119 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 120 | dependencies: 121 | ansi-styles "^3.1.0" 122 | escape-string-regexp "^1.0.5" 123 | supports-color "^4.0.0" 124 | 125 | chardet@^0.7.0: 126 | version "0.7.0" 127 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 128 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 129 | 130 | circular-json@^0.3.1: 131 | version "0.3.3" 132 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 133 | 134 | cli-cursor@^2.1.0: 135 | version "2.1.0" 136 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 137 | dependencies: 138 | restore-cursor "^2.0.0" 139 | 140 | cli-width@^2.0.0: 141 | version "2.2.0" 142 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 143 | 144 | color-convert@^1.9.0: 145 | version "1.9.1" 146 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 147 | dependencies: 148 | color-name "^1.1.1" 149 | 150 | color-name@^1.1.1: 151 | version "1.1.3" 152 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 153 | 154 | concat-map@0.0.1: 155 | version "0.0.1" 156 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 157 | 158 | cross-spawn@^6.0.5: 159 | version "6.0.5" 160 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 161 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 162 | dependencies: 163 | nice-try "^1.0.4" 164 | path-key "^2.0.1" 165 | semver "^5.5.0" 166 | shebang-command "^1.2.0" 167 | which "^1.2.9" 168 | 169 | debug@^4.0.1: 170 | version "4.1.0" 171 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" 172 | integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== 173 | dependencies: 174 | ms "^2.1.1" 175 | 176 | deep-is@~0.1.3: 177 | version "0.1.3" 178 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 179 | 180 | del@^2.0.2: 181 | version "2.2.2" 182 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 183 | dependencies: 184 | globby "^5.0.0" 185 | is-path-cwd "^1.0.0" 186 | is-path-in-cwd "^1.0.0" 187 | object-assign "^4.0.1" 188 | pify "^2.0.0" 189 | pinkie-promise "^2.0.0" 190 | rimraf "^2.2.8" 191 | 192 | doctrine@^2.1.0: 193 | version "2.1.0" 194 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 195 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 196 | dependencies: 197 | esutils "^2.0.2" 198 | 199 | emojis-list@^2.0.0: 200 | version "2.1.0" 201 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 202 | 203 | escape-string-regexp@^1.0.5: 204 | version "1.0.5" 205 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 206 | 207 | eslint-plugin-es@^1.3.1: 208 | version "1.4.0" 209 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" 210 | integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== 211 | dependencies: 212 | eslint-utils "^1.3.0" 213 | regexpp "^2.0.1" 214 | 215 | eslint-plugin-node@^8.0.0: 216 | version "8.0.0" 217 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.0.tgz#fb9e8911f4543514f154bb6a5924b599aa645568" 218 | integrity sha512-Y+ln8iQ52scz9+rSPnSWRaAxeWaoJZ4wIveDR0vLHkuSZGe44Vk1J4HX7WvEP5Cm+iXPE8ixo7OM7gAO3/OKpQ== 219 | dependencies: 220 | eslint-plugin-es "^1.3.1" 221 | eslint-utils "^1.3.1" 222 | ignore "^5.0.2" 223 | minimatch "^3.0.4" 224 | resolve "^1.8.1" 225 | semver "^5.5.0" 226 | 227 | eslint-scope@^4.0.0: 228 | version "4.0.0" 229 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" 230 | integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== 231 | dependencies: 232 | esrecurse "^4.1.0" 233 | estraverse "^4.1.1" 234 | 235 | eslint-utils@^1.3.0, eslint-utils@^1.3.1: 236 | version "1.3.1" 237 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" 238 | integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== 239 | 240 | eslint-visitor-keys@^1.0.0: 241 | version "1.0.0" 242 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 243 | 244 | eslint@^5.9.0: 245 | version "5.9.0" 246 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.9.0.tgz#b234b6d15ef84b5849c6de2af43195a2d59d408e" 247 | integrity sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w== 248 | dependencies: 249 | "@babel/code-frame" "^7.0.0" 250 | ajv "^6.5.3" 251 | chalk "^2.1.0" 252 | cross-spawn "^6.0.5" 253 | debug "^4.0.1" 254 | doctrine "^2.1.0" 255 | eslint-scope "^4.0.0" 256 | eslint-utils "^1.3.1" 257 | eslint-visitor-keys "^1.0.0" 258 | espree "^4.0.0" 259 | esquery "^1.0.1" 260 | esutils "^2.0.2" 261 | file-entry-cache "^2.0.0" 262 | functional-red-black-tree "^1.0.1" 263 | glob "^7.1.2" 264 | globals "^11.7.0" 265 | ignore "^4.0.6" 266 | imurmurhash "^0.1.4" 267 | inquirer "^6.1.0" 268 | is-resolvable "^1.1.0" 269 | js-yaml "^3.12.0" 270 | json-stable-stringify-without-jsonify "^1.0.1" 271 | levn "^0.3.0" 272 | lodash "^4.17.5" 273 | minimatch "^3.0.4" 274 | mkdirp "^0.5.1" 275 | natural-compare "^1.4.0" 276 | optionator "^0.8.2" 277 | path-is-inside "^1.0.2" 278 | pluralize "^7.0.0" 279 | progress "^2.0.0" 280 | regexpp "^2.0.1" 281 | require-uncached "^1.0.3" 282 | semver "^5.5.1" 283 | strip-ansi "^4.0.0" 284 | strip-json-comments "^2.0.1" 285 | table "^5.0.2" 286 | text-table "^0.2.0" 287 | 288 | espree@^4.0.0: 289 | version "4.1.0" 290 | resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" 291 | integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== 292 | dependencies: 293 | acorn "^6.0.2" 294 | acorn-jsx "^5.0.0" 295 | eslint-visitor-keys "^1.0.0" 296 | 297 | esprima@^4.0.0: 298 | version "4.0.0" 299 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 300 | 301 | esquery@^1.0.1: 302 | version "1.0.1" 303 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 304 | integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 305 | dependencies: 306 | estraverse "^4.0.0" 307 | 308 | esrecurse@^4.1.0: 309 | version "4.2.0" 310 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 311 | dependencies: 312 | estraverse "^4.1.0" 313 | object-assign "^4.0.1" 314 | 315 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 316 | version "4.2.0" 317 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 318 | 319 | esutils@^2.0.2: 320 | version "2.0.2" 321 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 322 | 323 | external-editor@^3.0.0: 324 | version "3.0.3" 325 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" 326 | integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== 327 | dependencies: 328 | chardet "^0.7.0" 329 | iconv-lite "^0.4.24" 330 | tmp "^0.0.33" 331 | 332 | fast-deep-equal@^2.0.1: 333 | version "2.0.1" 334 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 335 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 336 | 337 | fast-json-stable-stringify@^2.0.0: 338 | version "2.0.0" 339 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 340 | 341 | fast-levenshtein@~2.0.4: 342 | version "2.0.6" 343 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 344 | 345 | figures@^2.0.0: 346 | version "2.0.0" 347 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 348 | dependencies: 349 | escape-string-regexp "^1.0.5" 350 | 351 | file-entry-cache@^2.0.0: 352 | version "2.0.0" 353 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 354 | dependencies: 355 | flat-cache "^1.2.1" 356 | object-assign "^4.0.1" 357 | 358 | flat-cache@^1.2.1: 359 | version "1.3.0" 360 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 361 | dependencies: 362 | circular-json "^0.3.1" 363 | del "^2.0.2" 364 | graceful-fs "^4.1.2" 365 | write "^0.2.1" 366 | 367 | fs.realpath@^1.0.0: 368 | version "1.0.0" 369 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 370 | 371 | functional-red-black-tree@^1.0.1: 372 | version "1.0.1" 373 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 374 | 375 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 376 | version "7.1.2" 377 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 378 | dependencies: 379 | fs.realpath "^1.0.0" 380 | inflight "^1.0.4" 381 | inherits "2" 382 | minimatch "^3.0.4" 383 | once "^1.3.0" 384 | path-is-absolute "^1.0.0" 385 | 386 | globals@^11.7.0: 387 | version "11.9.0" 388 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" 389 | integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg== 390 | 391 | globby@^5.0.0: 392 | version "5.0.0" 393 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 394 | dependencies: 395 | array-union "^1.0.1" 396 | arrify "^1.0.0" 397 | glob "^7.0.3" 398 | object-assign "^4.0.1" 399 | pify "^2.0.0" 400 | pinkie-promise "^2.0.0" 401 | 402 | graceful-fs@^4.1.2: 403 | version "4.1.11" 404 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 405 | 406 | has-flag@^2.0.0: 407 | version "2.0.0" 408 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 409 | 410 | iconv-lite@^0.4.24: 411 | version "0.4.24" 412 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 413 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 414 | dependencies: 415 | safer-buffer ">= 2.1.2 < 3" 416 | 417 | ignore@^4.0.6: 418 | version "4.0.6" 419 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 420 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 421 | 422 | ignore@^5.0.2: 423 | version "5.0.4" 424 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.4.tgz#33168af4a21e99b00c5d41cbadb6a6cb49903a45" 425 | integrity sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g== 426 | 427 | imurmurhash@^0.1.4: 428 | version "0.1.4" 429 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 430 | 431 | inflight@^1.0.4: 432 | version "1.0.6" 433 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 434 | dependencies: 435 | once "^1.3.0" 436 | wrappy "1" 437 | 438 | inherits@2: 439 | version "2.0.3" 440 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 441 | 442 | inquirer@^6.1.0: 443 | version "6.2.1" 444 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" 445 | integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg== 446 | dependencies: 447 | ansi-escapes "^3.0.0" 448 | chalk "^2.0.0" 449 | cli-cursor "^2.1.0" 450 | cli-width "^2.0.0" 451 | external-editor "^3.0.0" 452 | figures "^2.0.0" 453 | lodash "^4.17.10" 454 | mute-stream "0.0.7" 455 | run-async "^2.2.0" 456 | rxjs "^6.1.0" 457 | string-width "^2.1.0" 458 | strip-ansi "^5.0.0" 459 | through "^2.3.6" 460 | 461 | is-fullwidth-code-point@^2.0.0: 462 | version "2.0.0" 463 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 464 | 465 | is-path-cwd@^1.0.0: 466 | version "1.0.0" 467 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 468 | 469 | is-path-in-cwd@^1.0.0: 470 | version "1.0.0" 471 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 472 | dependencies: 473 | is-path-inside "^1.0.0" 474 | 475 | is-path-inside@^1.0.0: 476 | version "1.0.1" 477 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 478 | dependencies: 479 | path-is-inside "^1.0.1" 480 | 481 | is-promise@^2.1.0: 482 | version "2.1.0" 483 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 484 | 485 | is-resolvable@^1.1.0: 486 | version "1.1.0" 487 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 488 | integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== 489 | 490 | isexe@^2.0.0: 491 | version "2.0.0" 492 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 493 | 494 | js-tokens@^4.0.0: 495 | version "4.0.0" 496 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 497 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 498 | 499 | js-yaml@^3.12.0: 500 | version "3.12.0" 501 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 502 | integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== 503 | dependencies: 504 | argparse "^1.0.7" 505 | esprima "^4.0.0" 506 | 507 | json-schema-traverse@^0.4.1: 508 | version "0.4.1" 509 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 510 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 511 | 512 | json-stable-stringify-without-jsonify@^1.0.1: 513 | version "1.0.1" 514 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 515 | 516 | json5@^0.5.0: 517 | version "0.5.1" 518 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 519 | 520 | levn@^0.3.0, levn@~0.3.0: 521 | version "0.3.0" 522 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 523 | dependencies: 524 | prelude-ls "~1.1.2" 525 | type-check "~0.3.2" 526 | 527 | loader-utils@^1.1.0: 528 | version "1.1.0" 529 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 530 | dependencies: 531 | big.js "^3.1.3" 532 | emojis-list "^2.0.0" 533 | json5 "^0.5.0" 534 | 535 | lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: 536 | version "4.17.11" 537 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 538 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 539 | 540 | mimic-fn@^1.0.0: 541 | version "1.1.0" 542 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 543 | 544 | minimatch@^3.0.4: 545 | version "3.0.4" 546 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 547 | dependencies: 548 | brace-expansion "^1.1.7" 549 | 550 | minimist@0.0.8: 551 | version "0.0.8" 552 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 553 | 554 | mkdirp@^0.5.1: 555 | version "0.5.1" 556 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 557 | dependencies: 558 | minimist "0.0.8" 559 | 560 | ms@^2.1.1: 561 | version "2.1.1" 562 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 563 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 564 | 565 | mute-stream@0.0.7: 566 | version "0.0.7" 567 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 568 | 569 | natural-compare@^1.4.0: 570 | version "1.4.0" 571 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 572 | 573 | nice-try@^1.0.4: 574 | version "1.0.5" 575 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 576 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 577 | 578 | object-assign@^4.0.1: 579 | version "4.1.1" 580 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 581 | 582 | once@^1.3.0: 583 | version "1.4.0" 584 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 585 | dependencies: 586 | wrappy "1" 587 | 588 | onetime@^2.0.0: 589 | version "2.0.1" 590 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 591 | dependencies: 592 | mimic-fn "^1.0.0" 593 | 594 | optionator@^0.8.2: 595 | version "0.8.2" 596 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 597 | dependencies: 598 | deep-is "~0.1.3" 599 | fast-levenshtein "~2.0.4" 600 | levn "~0.3.0" 601 | prelude-ls "~1.1.2" 602 | type-check "~0.3.2" 603 | wordwrap "~1.0.0" 604 | 605 | os-tmpdir@~1.0.2: 606 | version "1.0.2" 607 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 608 | 609 | path-is-absolute@^1.0.0: 610 | version "1.0.1" 611 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 612 | 613 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 614 | version "1.0.2" 615 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 616 | 617 | path-key@^2.0.1: 618 | version "2.0.1" 619 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 620 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 621 | 622 | path-parse@^1.0.5: 623 | version "1.0.5" 624 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 625 | 626 | pify@^2.0.0: 627 | version "2.3.0" 628 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 629 | 630 | pinkie-promise@^2.0.0: 631 | version "2.0.1" 632 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 633 | dependencies: 634 | pinkie "^2.0.0" 635 | 636 | pinkie@^2.0.0: 637 | version "2.0.4" 638 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 639 | 640 | pluralize@^7.0.0: 641 | version "7.0.0" 642 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 643 | 644 | prelude-ls@~1.1.2: 645 | version "1.1.2" 646 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 647 | 648 | progress@^2.0.0: 649 | version "2.0.0" 650 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 651 | 652 | punycode@^2.1.0: 653 | version "2.1.1" 654 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 655 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 656 | 657 | regexpp@^2.0.1: 658 | version "2.0.1" 659 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 660 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 661 | 662 | require-uncached@^1.0.3: 663 | version "1.0.3" 664 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 665 | dependencies: 666 | caller-path "^0.1.0" 667 | resolve-from "^1.0.0" 668 | 669 | resolve-from@^1.0.0: 670 | version "1.0.1" 671 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 672 | 673 | resolve@^1.8.1: 674 | version "1.8.1" 675 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 676 | integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== 677 | dependencies: 678 | path-parse "^1.0.5" 679 | 680 | restore-cursor@^2.0.0: 681 | version "2.0.0" 682 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 683 | dependencies: 684 | onetime "^2.0.0" 685 | signal-exit "^3.0.2" 686 | 687 | rimraf@^2.2.8: 688 | version "2.6.2" 689 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 690 | dependencies: 691 | glob "^7.0.5" 692 | 693 | run-async@^2.2.0: 694 | version "2.3.0" 695 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 696 | dependencies: 697 | is-promise "^2.1.0" 698 | 699 | rxjs@^6.1.0: 700 | version "6.3.3" 701 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" 702 | integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== 703 | dependencies: 704 | tslib "^1.9.0" 705 | 706 | "safer-buffer@>= 2.1.2 < 3": 707 | version "2.1.2" 708 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 709 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 710 | 711 | semver@^5.5.0, semver@^5.5.1: 712 | version "5.6.0" 713 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 714 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 715 | 716 | shebang-command@^1.2.0: 717 | version "1.2.0" 718 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 719 | dependencies: 720 | shebang-regex "^1.0.0" 721 | 722 | shebang-regex@^1.0.0: 723 | version "1.0.0" 724 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 725 | 726 | signal-exit@^3.0.2: 727 | version "3.0.2" 728 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 729 | 730 | slice-ansi@2.0.0: 731 | version "2.0.0" 732 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.0.0.tgz#5373bdb8559b45676e8541c66916cdd6251612e7" 733 | integrity sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ== 734 | dependencies: 735 | ansi-styles "^3.2.0" 736 | astral-regex "^1.0.0" 737 | is-fullwidth-code-point "^2.0.0" 738 | 739 | source-map@^0.7.3: 740 | version "0.7.3" 741 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 742 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 743 | 744 | sprintf-js@~1.0.2: 745 | version "1.0.3" 746 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 747 | 748 | string-width@^2.1.0, string-width@^2.1.1: 749 | version "2.1.1" 750 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 751 | dependencies: 752 | is-fullwidth-code-point "^2.0.0" 753 | strip-ansi "^4.0.0" 754 | 755 | strip-ansi@^4.0.0: 756 | version "4.0.0" 757 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 758 | dependencies: 759 | ansi-regex "^3.0.0" 760 | 761 | strip-ansi@^5.0.0: 762 | version "5.0.0" 763 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" 764 | integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== 765 | dependencies: 766 | ansi-regex "^4.0.0" 767 | 768 | strip-json-comments@^2.0.1: 769 | version "2.0.1" 770 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 771 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 772 | 773 | supports-color@^4.0.0: 774 | version "4.5.0" 775 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 776 | dependencies: 777 | has-flag "^2.0.0" 778 | 779 | table@^5.0.2: 780 | version "5.1.1" 781 | resolved "https://registry.yarnpkg.com/table/-/table-5.1.1.tgz#92030192f1b7b51b6eeab23ed416862e47b70837" 782 | integrity sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw== 783 | dependencies: 784 | ajv "^6.6.1" 785 | lodash "^4.17.11" 786 | slice-ansi "2.0.0" 787 | string-width "^2.1.1" 788 | 789 | text-table@^0.2.0: 790 | version "0.2.0" 791 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 792 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 793 | 794 | through@^2.3.6: 795 | version "2.3.8" 796 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 797 | 798 | tmp@^0.0.33: 799 | version "0.0.33" 800 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 801 | dependencies: 802 | os-tmpdir "~1.0.2" 803 | 804 | to-factory@^1.0.0: 805 | version "1.0.0" 806 | resolved "https://registry.yarnpkg.com/to-factory/-/to-factory-1.0.0.tgz#8738af8bd97120ad1d4047972ada5563bf9479b1" 807 | 808 | tslib@^1.9.0: 809 | version "1.9.3" 810 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 811 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 812 | 813 | type-check@~0.3.2: 814 | version "0.3.2" 815 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 816 | dependencies: 817 | prelude-ls "~1.1.2" 818 | 819 | uri-js@^4.2.2: 820 | version "4.2.2" 821 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 822 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 823 | dependencies: 824 | punycode "^2.1.0" 825 | 826 | which@^1.2.9: 827 | version "1.3.0" 828 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 829 | dependencies: 830 | isexe "^2.0.0" 831 | 832 | wordwrap@~1.0.0: 833 | version "1.0.0" 834 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 835 | 836 | wrappy@1: 837 | version "1.0.2" 838 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 839 | 840 | write@^0.2.1: 841 | version "0.2.1" 842 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 843 | dependencies: 844 | mkdirp "^0.5.1" 845 | --------------------------------------------------------------------------------