diff --git a/README.md b/README.md index fc2c2ae..df38aa1 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,14 @@ Here's [a blog post explaining it](https://60devs.com/hot-reloading-for-chrome-e - Works by checking timestamps of files - Supports nested directories - Automatically disables itself in production -- And it's just a 50 lines of code! +- And it's just 50 lines of code! + +## Options + +| Name | Value | Description | +|--------------|------------------------------|----------------------------------------| +| `reloadTab` | `boolean` (default: `true`) | reload the active tab when crx changes.| +| `exclude` | `string[]` (default: `[]`) | file names that we shouldn't watch. | ## How To Use @@ -31,4 +38,10 @@ It is also available as NPM module: npm install crx-hotreload ``` -Then use a `require` (or `import`) to execute the script. +In your script: +``` +const hotReload = require('crx-hotreload'); +hotReload.default({ + reloadTab: false +}); +``` diff --git a/hot-reload.js b/hot-reload.js index de5e58c..ade04ce 100644 --- a/hot-reload.js +++ b/hot-reload.js @@ -1,11 +1,13 @@ -const filesInDirectory = dir => new Promise (resolve => +const filesInDirectory = (dir, exclude) => new Promise (resolve => dir.createReader ().readEntries (entries => - Promise.all (entries.filter (e => e.name[0] !== '.').map (e => - + Promise.all (entries + .filter (e => e.name[0] !== '.') + .filter (f => !exclude.includes(f.name)) + .map (e => e.isDirectory - ? filesInDirectory (e) + ? filesInDirectory (e, exclude) : new Promise (resolve => e.file (resolve)) )) .then (files => [].concat (...files)) @@ -13,40 +15,56 @@ const filesInDirectory = dir => new Promise (resolve => ) ) -const timestampForFilesInDirectory = dir => - filesInDirectory (dir).then (files => - files.map (f => f.name + f.lastModifiedDate).join ()) +const timestampForFilesInDirectory = (dir, exclude) => + filesInDirectory (dir, exclude).then (files => + files. map (f => f.name + f.lastModifiedDate).join ()) -const reload = () => { +const reload = (reloadTab) => { - chrome.tabs.query ({ active: true, currentWindow: true }, tabs => { // NB: see https://github.com/xpl/crx-hotreload/issues/5 + if (reloadTab) { + chrome.tabs.query ({ active: true, currentWindow: true }, tabs => { // NB: see https://github.com/xpl/crx-hotreload/issues/5 - if (tabs[0]) { chrome.tabs.reload (tabs[0].id) } + if (tabs[0]) { chrome.tabs.reload (tabs[0].id) } + chrome.runtime.reload () + }) + } else { chrome.runtime.reload () - }) + } } -const watchChanges = (dir, lastTimestamp) => { - - timestampForFilesInDirectory (dir).then (timestamp => { +const watchChanges = (dir, opts, lastTimestamp) => { + timestampForFilesInDirectory (dir, opts.exclude).then (timestamp => { if (!lastTimestamp || (lastTimestamp === timestamp)) { - setTimeout (() => watchChanges (dir, timestamp), 1000) // retry after 1s + setTimeout (() => watchChanges (dir, opts, timestamp), 1000) // poll every 1s } else { - - reload () + reload (opts.reloadTab) } }) } -chrome.management.getSelf (self => { - - if (self.installType === 'development') { - - chrome.runtime.getPackageDirectoryEntry (dir => watchChanges (dir)) +const defaultOpts = { + reloadTab: true, + exclude: [], +}; + +if (typeof module === 'object') { + exports.default = (opts) => { + const combinedOpts = Object.assign({}, defaultOpts, opts); + chrome.management.getSelf (self => { + if (self.installType === 'development') { + chrome.runtime.getPackageDirectoryEntry (dir => watchChanges (dir, combinedOpts)) + } + }) } -}) +} else { + chrome.management.getSelf (self => { + if (self.installType === 'development') { + chrome.runtime.getPackageDirectoryEntry (dir => watchChanges (dir, defaultOpts)) + } + }) +}