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))
+ }
+ })
+}