Socket
Socket
Sign inDemoInstall

offline-plugin

Package Overview
Dependencies
12
Maintainers
1
Versions
74
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 4.6.2 to 4.7.0

6

CHANGELOG.md
# CHANGELOG
### 4.7.0
* ServiceWorker can now be registered at `127.0.0.1` [#188](https://github.com/NekR/offline-plugin/pull/188)
* New `ServiceWorker.navigateFallbackForRedirects` option which is `true` by default (compatibility reasons) [#230](https://github.com/NekR/offline-plugin/pull/230)
* Fixed new security restriction introduced in browsers regardless navigation requests and redirects [#231](https://github.com/NekR/offline-plugin/issues/231)
### 4.6.2

@@ -4,0 +10,0 @@

3

lib/index.js

@@ -89,3 +89,4 @@ 'use strict';

cache: void 0
}
},
navigateFallbackForRedirects: true
},

@@ -92,0 +93,0 @@

@@ -35,2 +35,3 @@ 'use strict';

var navigateFallbackURL = params.navigateFallbackURL;
var navigateFallbackForRedirects = params.navigateFallbackForRedirects;

@@ -287,6 +288,6 @@ self.addEventListener('install', function (event) {

if (responseStrategy === "network-first") {
if (responseStrategy === 'network-first') {
resource = networkFirstResponse(event, urlString, cacheUrl);
}
// "cache-first"
// 'cache-first'
// (responseStrategy has been validated before)

@@ -369,6 +370,6 @@ else {

// throw to reach the code in the catch below
throw new Error("response is not ok");
// Throw to reach the code in the catch below
throw new Error('Response is not ok');
})
// this needs to be in a catch() and not just in the then() above
// This needs to be in a catch() and not just in the then() above
// cause if your network is down, the fetch() will throw

@@ -386,11 +387,14 @@ ['catch'](function () {

return fetching['catch'](function () {}).then(function (response) {
if (!response || !response.ok) {
if (DEBUG) {
console.log('[SW]:', 'Loading navigation fallback [' + navigateFallbackURL + '] from cache');
}
var isOk = response && response.ok;
var isRedirect = response && response.type === 'opaqueredirect';
return cachesMatch(navigateFallbackURL, CACHE_NAME);
if (isOk || isRedirect && !navigateFallbackForRedirects) {
return response;
}
return response;
if (DEBUG) {
console.log('[SW]:', 'Loading navigation fallback [' + navigateFallbackURL + '] from cache');
}
return cachesMatch(navigateFallbackURL, CACHE_NAME);
});

@@ -459,3 +463,3 @@ }

return fetch(request, requestInit);
return fetch(request, requestInit).then(fixRedirectedResponse);
})).then(function (responses) {

@@ -558,2 +562,15 @@ if (responses.some(function (response) {

cacheName: cacheName
}).then(function (response) {
if (isNotRedirectedResponse()) {
return response;
}
// Fix already cached redirected responses
return fixRedirectedResponse(response).then(function (fixedResponse) {
return caches.open(cacheName).then(function (cache) {
return cache.put(request, fixedResponse);
}).then(function () {
return fixedResponse;
});
});
})

@@ -600,2 +617,22 @@ // Return void if error happened (cache not found)

function isNotRedirectedResponse(response) {
return !response || !response.redirected || !response.ok || response.type === 'opaqueredirect';
}
// Based on https://github.com/GoogleChrome/sw-precache/pull/241/files#diff-3ee9060dc7a312c6a822cac63a8c630bR85
function fixRedirectedResponse(response) {
if (isNotRedirectedResponse(response)) {
return Promise.resolve(response);
}
var body = 'body' in response ? Promise.resolve(response.body) : response.blob();
return body.then(function (data) {
return new Response(data, {
headers: response.headers,
status: response.status
});
});
}
function copyObject(original) {

@@ -602,0 +639,0 @@ return Object.keys(original).reduce(function (result, key) {

@@ -51,2 +51,3 @@ 'use strict';

this.navigateFallbackURL = options.navigateFallbackURL;
this.navigateFallbackForRedirects = options.navigateFallbackForRedirects;
this.prefetchRequest = this.validatePrefetch(options.prefetchRequest);

@@ -187,2 +188,3 @@

navigateFallbackURL: this.navigateFallbackURL,
navigateFallbackForRedirects: this.navigateFallbackURL ? this.navigateFallbackForRedirects : void 0,

@@ -189,0 +191,0 @@ strategy: plugin.strategy,

{
"name": "offline-plugin",
"version": "4.6.2",
"version": "4.7.0",
"description": "offline-plugin for webpack",

@@ -17,6 +17,11 @@ "main": "lib/index.js",

"install:build-deps": "node build/install.js",
"tag": "git push && git push --tags && npm publish",
"release:patch": "npm version patch && npm run tag",
"release:minor": "npm version minor && npm run tag",
"release:major": "npm version major && npm run tag"
"tag": "git push && git push --tags",
"publish:latest": "npm publish",
"publish:next": "npm publish --tag=next",
"release:latest:patch": "npm version patch && npm run tag && npm run publish:latest",
"release:latest:minor": "npm version minor && npm run tag && npm run publish:latest",
"release:latest:major": "npm version major && npm run tag && npm run publish:latest",
"release:next:patch": "npm version patch && npm run tag && npm run publish:next",
"release:next:minor": "npm version minor && npm run tag && npm run publish:next",
"release:next:major": "npm version major && npm run tag && npm run publish:next"
},

@@ -64,3 +69,3 @@ "repository": {

"on-build-webpack": "^0.1.0",
"webpack": "^1.0.0"
"webpack": "1.14.0"
},

@@ -67,0 +72,0 @@ "buildDependencies": {

@@ -1,21 +0,58 @@

<table>
<tr>
<td>
<div align="center">
<img src="https://rawgit.com/NekR/offline-plugin/v4/logo/logo.svg" width="120" alt="offline-plugin logo">
</div>
</td>
<td>
<h1>`offline-plugin` for webpack</h1>
[![npm](https://img.shields.io/npm/v/offline-plugin.svg?maxAge=3600&v4)](https://www.npmjs.com/package/offline-plugin)
[![npm](https://img.shields.io/npm/dm/offline-plugin.svg?maxAge=3600)](https://www.npmjs.com/package/offline-plugin)
[![Join the chat at https://gitter.im/NekR/offline-plugin](https://badges.gitter.im/NekR/offline-plugin.svg)](https://gitter.im/NekR/offline-plugin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
</td>
<tr>
<table>
<div align="center">
<a href="https://offline-plugin.now.sh/"><img src="https://rawgit.com/NekR/offline-plugin/master/logo/logo.svg" width="120" alt="offline-plugin logo"></a>
<h1><code>offline-plugin</code> for webpack</h1>
<a href="#backers"><img src="https://opencollective.com/offline-plugin/backers/badge.svg" alt="backers" /></a>
<a href="#sponsors"><img src="https://opencollective.com/offline-plugin/sponsors/badge.svg" alt="sponsors" /></a>
<a href="https://www.npmjs.com/package/offline-plugin"><img src="https://img.shields.io/npm/v/offline-plugin.svg?maxAge=3600&v4" alt="npm"></a>
<a href="https://www.npmjs.com/package/offline-plugin"><img src="https://img.shields.io/npm/dm/offline-plugin.svg?maxAge=3600" alt="npm"></a>
<a href="https://gitter.im/NekR/offline-plugin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img src="https://badges.gitter.im/NekR/offline-plugin.svg" alt="Join the chat at https://gitter.im/NekR/offline-plugin"></a>
</div>
<br>
This plugin is intended to provide an offline experience for **webpack** projects. It uses **ServiceWorker**, and **AppCache** as a fallback under the hood. Simply include this plugin in your ``webpack.config``, and the accompanying runtime in your client script, and your project will become offline ready by caching all (or some) of the webpack output assets.
<div align="center">
<strong>Demo:<br><a href="https://offline-plugin.now.sh/"> Progressive Web App built with <code>offline-plugin</code></a></strong><br>
<div>(<a href="https://github.com/NekR/offline-plugin-pwa"><i>source code</i></a>)</div>
</div>
[[Demo] Progressive Web App built with `offline-plugin`](https://offline-plugin.now.sh/)
<div align="center">
<h1>Sponsors</h1>
<a href="https://opencollective.com/offline-plugin/sponsor/0/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/1/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/2/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/3/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/4/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/5/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/6/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/7/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/8/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/9/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/9/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/10/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/10/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/11/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/11/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/12/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/12/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/13/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/13/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/14/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/14/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/15/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/15/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/16/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/16/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/17/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/17/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/18/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/18/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/19/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/19/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/20/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/20/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/21/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/21/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/22/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/22/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/23/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/23/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/24/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/24/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/25/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/25/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/26/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/26/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/27/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/27/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/28/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/28/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/sponsor/29/website" target="_blank"><img src="https://opencollective.com/offline-plugin/sponsor/29/avatar.svg"></a>
Become a sponsor and get your logo on our README on Github with a link to your site.<br>
<strong><a href="https://opencollective.com/offline-plugin#sponsor">Become a sponsor</a></strong>
</div>

@@ -28,3 +65,3 @@ ## Install

First, instantiate the plugin with [options](#options) in your `webpack.config`:
First, instantiate the plugin with [options](docs/options.md) in your `webpack.config`:

@@ -41,3 +78,3 @@ ```js

// ... other plugins
// it always better if OfflinePlugin is the last plugin added
// it's always better if OfflinePlugin is the last plugin added
new OfflinePlugin()

@@ -56,2 +93,10 @@ ]

ES6/Babel/TypeScript
```js
import * as OfflinePluginRuntime from 'offline-plugin/runtime';
OfflinePluginRuntime.install();
```
> For more details of usage with `TypeScript` see [here](docs/typescript.md)
## Docs

@@ -62,146 +107,21 @@

* [Cache Maps](docs/cache-maps.md)
* [FAQ](FAQ.md)
* [Runtime API](docs/runtime.md)
* [Configuration options](docs/options.md)
* [FAQ](docs/FAQ.md)
## Examples
* [Single Page Application](docs/examples/SPA.md)
## Articles
* [Easy Offline First Apps With Webpack's Offline Plugin](https://dev.to/kayis/easy-offline-first-apps-with-webpacks-offline-plugin)
* [Handling Client Side App Updates (with Service Workers)](https://zach.codes/handling-client-side-app-updates-with-service-workers/)
## Options
**All options are optional and `offline-plugin` can be used without specifying them.** Also see full list of default options [here](https://github.com/NekR/offline-plugin/blob/master/src/index.js#L9).
All options are optional and `offline-plugin` can be used without specifying them.
#### `caches: 'all' | Object`
#### [See all available options here.](docs/options.md)
Allows you to define what to cache and how.
* `'all'`: means that everything (all the webpack output assets) and URLs listed in `externals` option will be cached on install.
* `Object`: Object with 3 possible `Array<string>` sections (properties): `main`, `additional`, `optional`. All sections are optional and by default are empty (no assets added).
[More details about `caches`](docs/caches.md)
> Default: `'all'`.
#### `publicPath: string`
Same as `webpack`'s `output.publicPath` option. Useful to specify or override `publicPath` specifically for `offline-plugin`. When not specified, `webpack`'s `output.publicPath` value is used. When `webpack`'s `output.publicPath` value isn't specified, relative paths are used (see `relativePaths` option).
> __Examples:__
`publicPath: '/project/'`
`publicPath: 'https://example.com/project'`
#### `responseStrategy: 'cache-first' | 'network-first'`
Response strategy. Whether to use a cache or network first for responses.
> Default: `'cache-first'`.
#### `updateStrategy: 'changed' | 'all'`
Cache update strategy. [More details about `updateStrategy`](docs/update-strategies.md)
> Default: `'changed'`.
#### `externals: Array<string>`
Allows you to specify _external_ assets (assets which aren't generated by webpack) that should be included in the cache. If you don't change the `caches` configuration option then it should be enough to simply add assets to this (`externals`) option. For other details and more advanced use cases see [`caches` docs](docs/caches.md).
> Default: `null`
> **Example value:** `['fonts/roboto.woff']`
#### `excludes: Array<string | globs_pattern>`
Excludes matched assets from being added to the [caches](https://github.com/NekR/offline-plugin#caches-all--object). Exclusion is performed before _rewrite_ happens.
[Learn more about assets _rewrite_](docs/rewrite.md)
> Default: `['**/.*', '**/*.map']`
> _Excludes all files which start with `.` or end with `.map`_
#### `relativePaths: boolean`
When set to `true`, all the asset paths generated in the cache will be relative to the `ServiceWorker` file or the `AppCache` folder location respectively.
`publicPath` option is ignored when this is **explicitly** set to `true`.
> **Default:** `true`
#### `version: string | (plugin: OfflinePlugin) => void`
Version of the cache. Can be a function, which is useful in _watch-mode_ when you need to apply dynamic value.
* `Function` is called with the plugin instance as the first argument
* `string` which can be interpolated with `[hash]` token
> Default: _Current date_
#### `rewrites: Function | Object`
Rewrite function or rewrite map (`Object`). Useful when assets are served in a different way from the client perspective, e.g. usually `index.html` is served as `/`.
[See more about `rewrites` option and default function](docs/rewrite.md)
#### `cacheMaps: Array<Object>`
See [documentation of `cacheMaps`](docs/cache-maps.md) for syntax and usage examples
#### `autoUpdate: true | number`
Enables automatic updates of ServiceWorker and AppCache. If set to `true`, it uses default interval of _1 hour_. Set a `number` value to have provide custom update interval.
_**Note:** Please not that if user has multiple opened tabs of your website then update may happen more often because each opened tab will have its own interval for updates._
> Default: `false`
> **Example:** `true`
> **Example:** `1000 * 60 * 60 * 5` (five hours)
#### `ServiceWorker: Object | null | false`
Settings for the `ServiceWorker` cache. Use `null` or `false` to disable `ServiceWorker` generation.
* `output`: `string`. Relative (from the _webpack_'s config `output.path`) output path for emitted script.
_Default:_ `'sw.js'`
* `entry`: `string`. Relative or absolute path to the file which will be used as the `ServiceWorker` entry/bootstrapping. Useful to implement additional features or handlers for Service Worker events such as `push`, `sync`, etc.
_Default:_ _empty file_
* `scope`: `string`. Reflects [ServiceWorker.register](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register)'s `scope` option.
_Default:_ `null`
* `cacheName`: `string`. **This option is very dangerous. Touching it you must realize that you should **not** change it after you go production. Changing it may corrupt the cache and leave old caches on users' devices. This option is useful when you need to run more than one project on _the same domain_.
_Default:_ _`''`_ (empty string)
_Example:_ `'my-project'`
* `navigateFallbackURL`: `string`. The URL that should be returned from the cache when a requested navigation URL isn't available on the cache or network. Similar to the `AppCache.FALLBACK` option.
_Example:_ `navigateFallbackURL: '/'`
* `events`: `boolean`. Enables runtime events for the ServiceWorker. For supported events see `Runtime`'s `install()` options.
_Default:_ `false`
* `publicPath`: `string`. Provides a way to override `ServiceWorker`'s script file location on the server. Should be an exact path to the generated `ServiceWorker` file.
_Default:_ `null`
_Example:_ `'my/new/path/sw.js'`
* `prefetchRequest`: `Object`. Provides a way to specify [request init options](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request) for pre-fetch requests (pre-cache requests on `install` event). Allowed options: `credentials`, `headers`, `mode`, `cache`.
_Default:_ `{ credentials: 'omit', mode: 'cors' }`
_Example:_ `{ credentials: 'same-origin' }`
#### `AppCache: Object | null | false`
Settings for the `AppCache` cache. Use `null` or `false` to disable `AppCache` generation.
> _**Warning**_: Officially the AppCache feature [has been deprecated](https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache) in favour of Service Workers. However, Service Workers are still being implemented across all browsers (you can track progress [here](https://jakearchibald.github.io/isserviceworkerready/)) so AppCache is unlikely to suddenly disappear. Therefore please don't be afraid to use the AppCache feature if you have a need to provide offline support to browsers that do not support Service Workers, but it is good to be aware of this fact and make a deliberate decision on your configuration.
* `directory`: `string`. Relative (from the _webpack_'s config `output.path`) output directly path for the `AppCache` emitted files.
_Default:_ `'appcache/'`
* `NETWORK`: `string`. Reflects `AppCache`'s `NETWORK` section.
_Default:_ `'*'`
* `FALLBACK`: `Object`. Reflects `AppCache`'s `FALLBACK` section. Useful for single page applications making use of HTML5 routing or for displaying custom _Offline page_.
_Example 1:_ `{ '/blog': '/' }` will map all requests starting with `/blog` to the domain roboto when request fails.
_Example 2:_ `{ '/': '/offline-page.html' }` will return contents of `/offline-page.html` for any failed request.
_Default:_ `null`
* `events`: `boolean`. Enables runtime events for AppCache. For supported events see `Runtime`'s `install()` options.
_Default:_ `false`
* `publicPath`: `string`. Provides a way to override `AppCache`'s folder location on the server. Should be exact path to the generated `AppCache` folder.
_Default:_ `null`
_Example:_ `'my/new/path/appcache'`
* `disableInstall` :`boolean`. Disable the automatic installation of the `AppCache` when calling to `runtime.install()`. Useful when you to specify `<html manifest="...">` attribute manually (to cache every page user visits).
_Default:_ `false`
* `includeCrossOrigin` :`boolean`. Outputs cross-origin URLs into `AppCache`'s manifest file. **Cross-origin URLs aren't supported in `AppCache` when used on HTTPS.**
_Default:_ `false`
## Who is using `offline-plugin`

@@ -213,4 +133,2 @@

* [Phenomic](https://phenomic.io)
* [Gatsby](https://github.com/gatsbyjs/gatsby)
* [Angular CLI](https://github.com/angular/angular-cli)
* [React, Universally](https://github.com/ctrlplusb/react-universally)

@@ -230,12 +148,51 @@

Support it by giving [feedback](https://github.com/NekR/offline-plugin/issues), contributing or just by 🌟 starring the project!
Support it by giving [feedback](https://github.com/NekR/offline-plugin/issues), [contributing](CONTIBUTING.md), becoming a [backer/sponsor](https://opencollective.com/offline-plugin) or just by 🌟 starring the project!
## Backers
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/offline-plugin#backer)]
<a href="https://opencollective.com/offline-plugin/backer/0/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/0/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/1/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/1/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/2/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/2/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/3/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/3/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/4/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/4/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/5/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/5/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/6/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/6/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/7/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/7/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/8/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/8/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/9/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/9/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/10/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/10/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/11/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/11/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/12/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/12/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/13/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/13/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/14/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/14/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/15/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/15/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/16/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/16/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/17/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/17/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/18/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/18/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/19/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/19/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/20/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/20/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/21/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/21/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/22/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/22/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/23/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/23/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/24/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/24/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/25/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/25/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/26/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/26/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/27/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/27/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/28/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/28/avatar.svg"></a>
<a href="https://opencollective.com/offline-plugin/backer/29/website" target="_blank"><img src="https://opencollective.com/offline-plugin/backer/29/avatar.svg"></a>
## Contribution
See [CONTRIBUTING](CONTIBUTING.md)
## License
[MIT](LICENSE.md)
[MIT](LICENSE.md)
[Logo](logo/LICENSE.md)
## CHANGELOG
[CHANGELOG](CHANGELOG.md)

@@ -8,3 +8,3 @@ var appCacheIframe;

(window.fetch || 'imageRendering' in document.documentElement.style) &&
(window.location.protocol === 'https:' || window.location.hostname === 'localhost')
(window.location.protocol === 'https:' || window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1')
}

@@ -11,0 +11,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc