Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

systemjs-hot-reloader-ex

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

systemjs-hot-reloader-ex - npm Package Compare versions

Comparing version
2.0.0
to
2.0.1
+20
LICENSE
The MIT License (MIT)
Copyright (c) 2016 Artem Butusov
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+8
-3

@@ -27,9 +27,14 @@ 'use strict';

this.loader = opts.loader || SystemJS || System;
this.logLevel = opts.loader === undefined ? 2 : opts.logLevel;
this.logger = this.createLogger('HMR');
if (!this.loader) {
throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS');
}
if (this.loader.hotReloaderOptions) {
Object.assign(opts, this.loader.hotReloaderOptions);
}
this.logLevel = opts.logLevel === undefined ? 2 : opts.logLevel;
this.logger = this.createLogger('HMR');
}

@@ -36,0 +41,0 @@

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/SystemHotReloader.js"],"names":["SystemHotReloader","options","opts","loader","SystemJS","System","logLevel","undefined","logger","createLogger","Error","prefix","debug","message","console","info","error","warn","path","name1","normalizeSync","get","name2","name3","Object","keys","_loader","modules","find","name","startsWith","resolvePath","reloadModule","Promise","resolve","baseURL","substr","length","replace","moduleName","startTime","window","performance","now","cleanName","moduleChain","getReloadChain","moduleBackups","then","forEach","getModuleBackup","promise","reloadModuleInstance","exports","__reload","push","__unload","suffix","join","time","timeSecRound","Math","floor","catch","realError","originalErr","stack","backup","unload","reload","fixModuleDeps","restoreModuleBackup","deleteModule","importModule","moduleRecords","moduleRecord","dependencies","depModuleRecord","index","newDepModuleRecord","setters","impRecord","importers","record","import","impModuleRecord","delete","data","set","cache","distance","reduce","result","impDistance","getModuleDistanceToRoot","min","records","farNode","map","item","meta","nextModules","slice","splice","indexOf","nextResult","concat"],"mappings":"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","file":"SystemHotReloader.js","sourcesContent":["import 'core-js/shim';\n\nexport default class SystemHotReloader {\n /**\n * Constructor.\n *\n * @param {Object} options\n * @prop {Object} loader SystemJS instance, default to SystemJS || System\n * @prop {Number} logLevel 0 - none, 1 - error, 2 - info (default), 3 - debug\n */\n constructor(options) {\n const opts = options || {};\n\n this.loader = opts.loader || SystemJS || System;\n this.logLevel = opts.loader === undefined ? 2 : opts.logLevel;\n\n this.logger = this.createLogger('HMR');\n\n if (!this.loader) {\n throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS');\n }\n }\n\n /**\n * Create logger.\n */\n createLogger(prefix) {\n return {\n debug: (message) => {\n if (this.logLevel >= 3 && console && console.debug) {\n console.debug(`[${prefix}] ${message}`);\n }\n },\n info: (message) => {\n if (this.logLevel >= 2 && console && console.info) {\n console.info(`[${prefix}] ${message}`);\n }\n },\n error: (message) => {\n if (this.logLevel >= 1 && console && console.warn) {\n console.warn(`[${prefix}] ${message}`);\n }\n },\n };\n }\n\n /**\n * Resolve module file path to module name.\n */\n resolvePath(path) {\n // try obvious resolve filename.ext => filename.ext\n const name1 = this.loader.normalizeSync(path);\n if (this.loader.get(name1)) {\n return name1;\n }\n\n // try less obvious resolve filename.ext => filename.ext!\n const name2 = this.loader.normalizeSync(`${path}!`);\n if (this.loader.get(name2)) {\n return name2;\n }\n\n // try to find by filename path in all registered modules, slow :-(\n const name3 = Object.keys(this.loader._loader.modules).find((name) => {\n return name.startsWith(`${name1}!`);\n });\n if (name3) {\n return name3;\n }\n\n return undefined;\n }\n\n /**\n * Reload module by file path.\n */\n reloadPath(path) {\n this.logger.debug(`Reloading file: ${path}`);\n\n const name = this.resolvePath(path);\n\n if (name) {\n return this.reloadModule(name);\n }\n\n // we did not find module :-(\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n /**\n * Clean full module name from useless base url prefix and loader related suffix.\n */\n cleanName(name) {\n // remove base url prefix\n if (name.startsWith(this.loader.baseURL)) {\n name = `./${name.substr(this.loader.baseURL.length)}`;\n }\n\n // remove loader related garbage\n return name.replace(/!.*$/, '');\n }\n\n /**\n * Reload module by full module name.\n */\n reloadModule(moduleName) {\n const startTime = window.performance.now();\n\n this.logger.info(`Reloading module ${this.cleanName(moduleName)}`);\n\n if (!this.loader.get(moduleName)) {\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n const moduleChain = this.getReloadChain([moduleName]);\n const moduleBackups = {};\n\n return Promise.resolve()\n .then(() => {\n this.logger.debug('Reload chain:');\n moduleChain.forEach((name) => {\n this.logger.debug(` - ${this.cleanName(name)}`);\n });\n })\n .then(() => {\n this.logger.debug('Saving backup');\n moduleChain.forEach((name) => {\n moduleBackups[name] = this.getModuleBackup(name);\n });\n })\n .then(() => {\n let promise = Promise.resolve();\n moduleChain.forEach((name) => {\n promise = promise.then(() => this.reloadModuleInstance(name, moduleChain));\n });\n return promise;\n })\n .then(() => {\n if (moduleChain.length) {\n this.logger.info('Updated modules:');\n moduleChain.forEach((name) => {\n const exports = this.loader.get(name);\n const options = [];\n if (exports && exports.__reload) {\n options.push('__reload()');\n } else if (exports && exports.__unload) {\n options.push('__unload()');\n }\n const suffix = options.length ? `{ ${options.join(', ')} }` : '';\n this.logger.info(` - ${this.cleanName(name)} ${suffix}`);\n });\n } else {\n this.logger.info('Nothing to update');\n }\n\n const time = (window.performance.now() - startTime) / 1000;\n const timeSecRound = Math.floor(time * 100) / 100;\n this.logger.info(`Reload took ${timeSecRound} sec`);\n })\n .catch((error) => {\n if (error) {\n const realError = error.originalErr || error;\n this.logger.error(realError.stack || realError);\n }\n\n this.logger.error('An error occured during reloading. Reverting...');\n\n let promise = Promise.resolve();\n\n moduleChain.forEach((name) => {\n promise = promise.then(() => {\n return this.reloadModuleInstance(name, moduleChain, moduleBackups[name]);\n });\n });\n\n promise = promise.then(() => {\n this.logger.info('Application state was restored');\n });\n\n return promise;\n })\n .catch((error) => {\n if (error) {\n this.logger.error(error.stack || error);\n }\n this.logger.error('An unrecoverable error occured during reverting');\n });\n }\n\n /**\n * Reload module instance with option to reload from backup.\n */\n reloadModuleInstance(name, moduleChain, backup) {\n const exports = backup ? backup.exports : this.loader.get(name);\n\n const unload = exports ? exports.__unload : undefined;\n const reload = exports ? exports.__reload : undefined;\n\n if (reload) {\n return Promise.resolve()\n .then(() => this.fixModuleDeps(name))\n .then(() => reload(moduleChain));\n }\n\n return Promise.resolve()\n .then(() => (unload ? unload(moduleChain) : undefined))\n .then(() => (backup ? this.restoreModuleBackup(backup) : this.deleteModule(name)))\n .then(() => this.importModule(name));\n }\n\n /**\n * Fix module dependencies before hooked reload.\n */\n fixModuleDeps(name) {\n const moduleRecords = this.loader._loader.moduleRecords;\n\n const moduleRecord = moduleRecords[name];\n\n moduleRecord.dependencies\n .forEach((depModuleRecord, index) => {\n if (!depModuleRecord) {\n return;\n }\n\n const newDepModuleRecord = moduleRecords[depModuleRecord.name];\n\n if (!newDepModuleRecord) {\n return;\n }\n\n if (newDepModuleRecord !== depModuleRecord) {\n this.logger.debug(`Fixing dependency ${this.cleanName(depModuleRecord.name)} for module ${this.cleanName(moduleRecord.name)}`);\n\n moduleRecord.setters[index](newDepModuleRecord.exports);\n\n if (moduleRecord.dependencies[index] !== newDepModuleRecord.exports) {\n moduleRecord.dependencies[index] = newDepModuleRecord;\n }\n\n const impRecord = newDepModuleRecord.importers\n .find(record => record && record.name === moduleRecord);\n if (!impRecord) {\n newDepModuleRecord.importers.push(moduleRecord);\n }\n }\n });\n }\n\n /**\n * Import module.\n */\n importModule(name) {\n this.logger.debug(`Importing module ${this.cleanName(name)}`);\n return this.loader.import(name);\n }\n\n /**\n * Delete module and fix importers for dependencies.\n */\n deleteModule(name) {\n const moduleRecord = this.loader._loader.moduleRecords[name];\n\n if (moduleRecord) {\n moduleRecord.dependencies\n .forEach((depModuleRecord) => {\n if (!depModuleRecord) {\n return;\n }\n depModuleRecord.importers\n .forEach((impModuleRecord, index) => {\n if (impModuleRecord && moduleRecord.name === impModuleRecord.name) {\n this.logger.debug(`Removing importer ${this.cleanName(impModuleRecord.name)} from module ${this.cleanName(depModuleRecord.name)}`);\n depModuleRecord.importers[index] = null;\n }\n });\n });\n }\n\n this.logger.debug(`Removing module ${this.cleanName(name)}`);\n this.loader.delete(name);\n }\n\n /**\n * Get module backup which could be used to restore module state.\n */\n getModuleBackup(name) {\n const exports = this.loader.get(name);\n const record = this.loader._loader.moduleRecords[name];\n return { name, record, exports };\n }\n\n /**\n * Restore module from backup.\n */\n restoreModuleBackup(data) {\n this.loader.set(data.name, data.exports);\n this.loader._loader.moduleRecords[data.name] = data.record;\n }\n\n /**\n * Get shortest distance to the root module (root modules have no importers).\n */\n getModuleDistanceToRoot(name, record, cache) {\n let distance;\n if (cache[name] !== undefined) {\n return cache[name];\n }\n if (!record || !record.importers.length) {\n distance = 0;\n } else {\n distance = record.importers.reduce((result, impRecord) => {\n const impDistance = 1 + this.getModuleDistanceToRoot(impRecord.name, impRecord, cache);\n return result === null ? impDistance : Math.min(result, impDistance);\n }, null);\n }\n cache[name] = distance;\n return distance;\n }\n\n /**\n * Reduce dependency tree and return modules in the order they should be reloaded.\n */\n getReloadChain(modules, cache) {\n if (modules.length === 0) {\n return modules;\n }\n\n const records = this.loader._loader.moduleRecords;\n\n if (!cache) {\n cache = {};\n }\n\n const farNode = modules.reduce((result, name, index) => {\n const record = records[name] ? records[name] : undefined;\n const distance = this.getModuleDistanceToRoot(name, record, cache);\n const importers = !record ? [] : record.importers.map(item => item.name);\n const reload = record && record.exports && record.exports.__reload;\n const meta = { distance, index, name, importers, reload };\n if (result === undefined) {\n return meta;\n }\n return result.distance >= distance ? result : meta;\n }, undefined);\n\n const nextModules = modules.slice(0);\n nextModules.splice(farNode.index, 1);\n if (!farNode.reload) {\n farNode.importers.forEach((name) => {\n if (nextModules.indexOf(name) === -1) {\n nextModules.push(name);\n }\n });\n }\n\n const nextResult = this.getReloadChain(nextModules, cache);\n\n const result = [farNode.name].concat(nextResult);\n\n return result;\n }\n}\n"]}
{"version":3,"sources":["../src/SystemHotReloader.js"],"names":["SystemHotReloader","options","opts","loader","SystemJS","System","Error","hotReloaderOptions","Object","assign","logLevel","undefined","logger","createLogger","prefix","debug","message","console","info","error","warn","path","name1","normalizeSync","get","name2","name3","keys","_loader","modules","find","name","startsWith","resolvePath","reloadModule","Promise","resolve","baseURL","substr","length","replace","moduleName","startTime","window","performance","now","cleanName","moduleChain","getReloadChain","moduleBackups","then","forEach","getModuleBackup","promise","reloadModuleInstance","exports","__reload","push","__unload","suffix","join","time","timeSecRound","Math","floor","catch","realError","originalErr","stack","backup","unload","reload","fixModuleDeps","restoreModuleBackup","deleteModule","importModule","moduleRecords","moduleRecord","dependencies","depModuleRecord","index","newDepModuleRecord","setters","impRecord","importers","record","import","impModuleRecord","delete","data","set","cache","distance","reduce","result","impDistance","getModuleDistanceToRoot","min","records","farNode","map","item","meta","nextModules","slice","splice","indexOf","nextResult","concat"],"mappings":"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","file":"SystemHotReloader.js","sourcesContent":["import 'core-js/shim';\n\nexport default class SystemHotReloader {\n /**\n * Constructor.\n *\n * @param {Object} options\n * @prop {Object} loader SystemJS instance, default to SystemJS || System\n * @prop {Number} logLevel 0 - none, 1 - error, 2 - info (default), 3 - debug\n */\n constructor(options) {\n const opts = options || {};\n\n this.loader = opts.loader || SystemJS || System;\n\n if (!this.loader) {\n throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS');\n }\n\n if (this.loader.hotReloaderOptions) {\n Object.assign(opts, this.loader.hotReloaderOptions);\n }\n\n this.logLevel = opts.logLevel === undefined ? 2 : opts.logLevel;\n\n this.logger = this.createLogger('HMR');\n }\n\n /**\n * Create logger.\n */\n createLogger(prefix) {\n return {\n debug: (message) => {\n if (this.logLevel >= 3 && console && console.debug) {\n console.debug(`[${prefix}] ${message}`);\n }\n },\n info: (message) => {\n if (this.logLevel >= 2 && console && console.info) {\n console.info(`[${prefix}] ${message}`);\n }\n },\n error: (message) => {\n if (this.logLevel >= 1 && console && console.warn) {\n console.warn(`[${prefix}] ${message}`);\n }\n },\n };\n }\n\n /**\n * Resolve module file path to module name.\n */\n resolvePath(path) {\n // try obvious resolve filename.ext => filename.ext\n const name1 = this.loader.normalizeSync(path);\n if (this.loader.get(name1)) {\n return name1;\n }\n\n // try less obvious resolve filename.ext => filename.ext!\n const name2 = this.loader.normalizeSync(`${path}!`);\n if (this.loader.get(name2)) {\n return name2;\n }\n\n // try to find by filename path in all registered modules, slow :-(\n const name3 = Object.keys(this.loader._loader.modules).find((name) => {\n return name.startsWith(`${name1}!`);\n });\n if (name3) {\n return name3;\n }\n\n return undefined;\n }\n\n /**\n * Reload module by file path.\n */\n reloadPath(path) {\n this.logger.debug(`Reloading file: ${path}`);\n\n const name = this.resolvePath(path);\n\n if (name) {\n return this.reloadModule(name);\n }\n\n // we did not find module :-(\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n /**\n * Clean full module name from useless base url prefix and loader related suffix.\n */\n cleanName(name) {\n // remove base url prefix\n if (name.startsWith(this.loader.baseURL)) {\n name = `./${name.substr(this.loader.baseURL.length)}`;\n }\n\n // remove loader related garbage\n return name.replace(/!.*$/, '');\n }\n\n /**\n * Reload module by full module name.\n */\n reloadModule(moduleName) {\n const startTime = window.performance.now();\n\n this.logger.info(`Reloading module ${this.cleanName(moduleName)}`);\n\n if (!this.loader.get(moduleName)) {\n this.logger.info('Nothing to update');\n return Promise.resolve();\n }\n\n const moduleChain = this.getReloadChain([moduleName]);\n const moduleBackups = {};\n\n return Promise.resolve()\n .then(() => {\n this.logger.debug('Reload chain:');\n moduleChain.forEach((name) => {\n this.logger.debug(` - ${this.cleanName(name)}`);\n });\n })\n .then(() => {\n this.logger.debug('Saving backup');\n moduleChain.forEach((name) => {\n moduleBackups[name] = this.getModuleBackup(name);\n });\n })\n .then(() => {\n let promise = Promise.resolve();\n moduleChain.forEach((name) => {\n promise = promise.then(() => this.reloadModuleInstance(name, moduleChain));\n });\n return promise;\n })\n .then(() => {\n if (moduleChain.length) {\n this.logger.info('Updated modules:');\n moduleChain.forEach((name) => {\n const exports = this.loader.get(name);\n const options = [];\n if (exports && exports.__reload) {\n options.push('__reload()');\n } else if (exports && exports.__unload) {\n options.push('__unload()');\n }\n const suffix = options.length ? `{ ${options.join(', ')} }` : '';\n this.logger.info(` - ${this.cleanName(name)} ${suffix}`);\n });\n } else {\n this.logger.info('Nothing to update');\n }\n\n const time = (window.performance.now() - startTime) / 1000;\n const timeSecRound = Math.floor(time * 100) / 100;\n this.logger.info(`Reload took ${timeSecRound} sec`);\n })\n .catch((error) => {\n if (error) {\n const realError = error.originalErr || error;\n this.logger.error(realError.stack || realError);\n }\n\n this.logger.error('An error occured during reloading. Reverting...');\n\n let promise = Promise.resolve();\n\n moduleChain.forEach((name) => {\n promise = promise.then(() => {\n return this.reloadModuleInstance(name, moduleChain, moduleBackups[name]);\n });\n });\n\n promise = promise.then(() => {\n this.logger.info('Application state was restored');\n });\n\n return promise;\n })\n .catch((error) => {\n if (error) {\n this.logger.error(error.stack || error);\n }\n this.logger.error('An unrecoverable error occured during reverting');\n });\n }\n\n /**\n * Reload module instance with option to reload from backup.\n */\n reloadModuleInstance(name, moduleChain, backup) {\n const exports = backup ? backup.exports : this.loader.get(name);\n\n const unload = exports ? exports.__unload : undefined;\n const reload = exports ? exports.__reload : undefined;\n\n if (reload) {\n return Promise.resolve()\n .then(() => this.fixModuleDeps(name))\n .then(() => reload(moduleChain));\n }\n\n return Promise.resolve()\n .then(() => (unload ? unload(moduleChain) : undefined))\n .then(() => (backup ? this.restoreModuleBackup(backup) : this.deleteModule(name)))\n .then(() => this.importModule(name));\n }\n\n /**\n * Fix module dependencies before hooked reload.\n */\n fixModuleDeps(name) {\n const moduleRecords = this.loader._loader.moduleRecords;\n\n const moduleRecord = moduleRecords[name];\n\n moduleRecord.dependencies\n .forEach((depModuleRecord, index) => {\n if (!depModuleRecord) {\n return;\n }\n\n const newDepModuleRecord = moduleRecords[depModuleRecord.name];\n\n if (!newDepModuleRecord) {\n return;\n }\n\n if (newDepModuleRecord !== depModuleRecord) {\n this.logger.debug(`Fixing dependency ${this.cleanName(depModuleRecord.name)} for module ${this.cleanName(moduleRecord.name)}`);\n\n moduleRecord.setters[index](newDepModuleRecord.exports);\n\n if (moduleRecord.dependencies[index] !== newDepModuleRecord.exports) {\n moduleRecord.dependencies[index] = newDepModuleRecord;\n }\n\n const impRecord = newDepModuleRecord.importers\n .find(record => record && record.name === moduleRecord);\n if (!impRecord) {\n newDepModuleRecord.importers.push(moduleRecord);\n }\n }\n });\n }\n\n /**\n * Import module.\n */\n importModule(name) {\n this.logger.debug(`Importing module ${this.cleanName(name)}`);\n return this.loader.import(name);\n }\n\n /**\n * Delete module and fix importers for dependencies.\n */\n deleteModule(name) {\n const moduleRecord = this.loader._loader.moduleRecords[name];\n\n if (moduleRecord) {\n moduleRecord.dependencies\n .forEach((depModuleRecord) => {\n if (!depModuleRecord) {\n return;\n }\n depModuleRecord.importers\n .forEach((impModuleRecord, index) => {\n if (impModuleRecord && moduleRecord.name === impModuleRecord.name) {\n this.logger.debug(`Removing importer ${this.cleanName(impModuleRecord.name)} from module ${this.cleanName(depModuleRecord.name)}`);\n depModuleRecord.importers[index] = null;\n }\n });\n });\n }\n\n this.logger.debug(`Removing module ${this.cleanName(name)}`);\n this.loader.delete(name);\n }\n\n /**\n * Get module backup which could be used to restore module state.\n */\n getModuleBackup(name) {\n const exports = this.loader.get(name);\n const record = this.loader._loader.moduleRecords[name];\n return { name, record, exports };\n }\n\n /**\n * Restore module from backup.\n */\n restoreModuleBackup(data) {\n this.loader.set(data.name, data.exports);\n this.loader._loader.moduleRecords[data.name] = data.record;\n }\n\n /**\n * Get shortest distance to the root module (root modules have no importers).\n */\n getModuleDistanceToRoot(name, record, cache) {\n let distance;\n if (cache[name] !== undefined) {\n return cache[name];\n }\n if (!record || !record.importers.length) {\n distance = 0;\n } else {\n distance = record.importers.reduce((result, impRecord) => {\n const impDistance = 1 + this.getModuleDistanceToRoot(impRecord.name, impRecord, cache);\n return result === null ? impDistance : Math.min(result, impDistance);\n }, null);\n }\n cache[name] = distance;\n return distance;\n }\n\n /**\n * Reduce dependency tree and return modules in the order they should be reloaded.\n */\n getReloadChain(modules, cache) {\n if (modules.length === 0) {\n return modules;\n }\n\n const records = this.loader._loader.moduleRecords;\n\n if (!cache) {\n cache = {};\n }\n\n const farNode = modules.reduce((result, name, index) => {\n const record = records[name] ? records[name] : undefined;\n const distance = this.getModuleDistanceToRoot(name, record, cache);\n const importers = !record ? [] : record.importers.map(item => item.name);\n const reload = record && record.exports && record.exports.__reload;\n const meta = { distance, index, name, importers, reload };\n if (result === undefined) {\n return meta;\n }\n return result.distance >= distance ? result : meta;\n }, undefined);\n\n const nextModules = modules.slice(0);\n nextModules.splice(farNode.index, 1);\n if (!farNode.reload) {\n farNode.importers.forEach((name) => {\n if (nextModules.indexOf(name) === -1) {\n nextModules.push(name);\n }\n });\n }\n\n const nextResult = this.getReloadChain(nextModules, cache);\n\n const result = [farNode.name].concat(nextResult);\n\n return result;\n }\n}\n"]}
{
"name": "systemjs-hot-reloader-ex",
"version": "2.0.0",
"version": "2.0.1",
"description": "SystemJS / JSPM hot reloader with support of CSS, SCSS, SASS, LESS, Stylus, React and JavaScript",

@@ -5,0 +5,0 @@ "main": "dist/index.js",

+35
-12

@@ -63,2 +63,12 @@ # SystemJS Hot Reloader #

or via `jspm.config.js`:
```javascript
SystemJS.config({
hotReloaderOptions: {
logLevel: 3
}
});
```
### JavaScript Hot Reloader ###

@@ -85,2 +95,7 @@

Avoid using of loaders via `!` because in that case there is no 100% way to
convert file name into module name so reloader will have to iterate over all
registered modules to find correct module name. It is recommended to define
loader via `meta` SystemJS config section for files based on their extension.
The fastest reload is guaranteed when css filename could be 1:1 resolved to

@@ -92,8 +107,6 @@ module name. It works when you have css loading workflow like below:

meta: {
"*.css": {
"loader": "plugin-css"
},
"*.scss": {
"loader": "plugin-sass"
}
"*.css": { "loader": "plugin-css" },
"*.scss": { "loader": "plugin-sass" },
"*.sass": { "loader": "plugin-sass" },
"*.less": { "loader": "plugin-less" }
},

@@ -124,2 +137,6 @@ });

If you keep state in store model object or in `mobx` and your application will be
able to restore state from it, then you don't need this part, just keep you store
instance in separate module.
React, babel plugin, babel preset are required (obviously):

@@ -143,8 +160,11 @@

* `react-hot-loader/babel` required to wrap `import()`
* `react-hot-loader/lib/patch.dev.js` will patch React
* `react-hot-loader/babel` babel plugin is required to wrap `import()`
* `react-hot-loader/lib/patch.dev.js` is required, will patch React on the fly
* `react-hot-loader/lib/AppContainer.dev.js` will restore state on reload
* `__reload()` hook required to rerender application instead of module reload
* `__reload()` hook required to rerender application instead of full module reload
* different application entry points for development and production
Please note, that **react-hot-loader/babel** should be **FIRST** plugin in list
of Babel plugins.
File: `jspm.config.js`:

@@ -157,2 +177,5 @@

},
meta: {
"*.jsx": { loader: "plugin-babel" }
},
transpiler: "plugin-babel",

@@ -172,3 +195,3 @@ babelOptions: {

"app": {
"main": "index"
"main": "index.jsx"
}

@@ -179,3 +202,3 @@ }

"app": {
"main": "index.dist",
"main": "index.dist.jsx",
"defaultExtension": "jsx"

@@ -246,3 +269,3 @@ }

<body>
<div id="app-root"></div>
<div id="root"></div>
<script src="app.js"></script>

@@ -249,0 +272,0 @@ </body>

@@ -15,9 +15,14 @@ import 'core-js/shim';

this.loader = opts.loader || SystemJS || System;
this.logLevel = opts.loader === undefined ? 2 : opts.logLevel;
this.logger = this.createLogger('HMR');
if (!this.loader) {
throw new Error('Unable to instantiate SystemJS Hot Reloader without SystemJS');
}
if (this.loader.hotReloaderOptions) {
Object.assign(opts, this.loader.hotReloaderOptions);
}
this.logLevel = opts.logLevel === undefined ? 2 : opts.logLevel;
this.logger = this.createLogger('HMR');
}

@@ -24,0 +29,0 @@

The MIT License (MIT)
Copyright (c) 2016 Artem Butusov
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.