{"id":26977488,"url":"https://github.com/jherax/proxy-storage","last_synced_at":"2025-10-17T09:33:17.445Z","repository":{"id":65476753,"uuid":"70543040","full_name":"jherax/proxy-storage","owner":"jherax","description":"Provides an adapter for storage mechanisms (cookies, localStorage, sessionStorage, memoryStorage) and implements the Web Storage interface","archived":false,"fork":false,"pushed_at":"2019-11-20T23:37:56.000Z","size":333,"stargazers_count":17,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-24T03:37:41.311Z","etag":null,"topics":["cookie","interceptor","javascript","json","localstorage","proxy-storage","sessionstorage","storage","umd","webstorage"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jherax.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-10-11T01:16:44.000Z","updated_at":"2024-12-12T16:38:58.000Z","dependencies_parsed_at":"2023-01-25T06:25:15.955Z","dependency_job_id":null,"html_url":"https://github.com/jherax/proxy-storage","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jherax%2Fproxy-storage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jherax%2Fproxy-storage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jherax%2Fproxy-storage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jherax%2Fproxy-storage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jherax","download_url":"https://codeload.github.com/jherax/proxy-storage/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247000762,"owners_count":20867144,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cookie","interceptor","javascript","json","localstorage","proxy-storage","sessionstorage","storage","umd","webstorage"],"created_at":"2025-04-03T12:27:49.426Z","updated_at":"2025-10-17T09:33:12.349Z","avatar_url":"https://github.com/jherax.png","language":"JavaScript","readme":"# Proxy Storage\n\n\u003c!-- markdownlint-disable MD014 MD025 MD033 MD034 MD036 --\u003e\n\nThis library manages an adapter that implements an interface similar to\n[Web Storage] to normalize the API for [document.cookie] to be as\n[window.localStorage] and [window.sessionStorage].\n\nOne of the advantages of this library is that the adapter stores the data\nas **JSON**, allowing to save `Object` and `Array\u003cAny\u003e` values, which\nis not the default behavior when using the native `window.localStorage`,\n`window.sessionStorage` or `document.cookie` storages.\n\nIt also provides a new mechanism -- [`memoryStorage`](#storage-or-default),\nthat persists the data in memory (for current browser-tab), even if a forced\nrefresh is done on the page. It is a mimic of `sessionStorage` and it could\nbe used as fallback when the other storage mechanisms are not available, for\nexample, some browsers navigating in private mode.\nRead more about [window.sessionStorage].\n\nAnother advantage with **proxy-storage** is that you can register\n[interceptors](#interceptors) as functions for the prototype methods of\n[WebStorage](#webstorage) class: `setItem`, `getItem`, `removeItem`, and\n`clear`, giving you the ability to intercept and modify the values to read,\nwrite, or delete.\n\n## Content\n\n1. [Installing the library](#installing-the-library)\n1. [Including the library](#including-the-library)\n1. [API: storage/default](#storage-or-default)\n1. [API: WebStorage](#webstorage)\n   1. [Handling cookies](#handling-cookies)\n   1. [Looping the storage](#looping-the-storage)\n   1. [Clearing data](#clearing-data)\n   1. [Interceptors](#interceptors)\n1. [API: configStorage](#configstorage)\n1. [API: isAvailable](#isavailable)\n1. [Polyfills](#polyfills)\n\n## Installing the library\n\nTo include this library into your package manager with `npm` or `yarn`, run:\n\n```shell\n# with npm\n$ npm install proxy-storage --save\n\n# with yarn\n$ yarn add proxy-storage\n```\n\n## Including the library\n\n`proxy-storage` can be included directly from a CDN in your page:\n\n```html\n\u003c!-- from unpkg.com --\u003e\n\u003cscript src=\"https://unpkg.com/proxy-storage/dist/proxy-storage.min.js\"\u003e\u003c/script\u003e\n\n\u003c!-- or from rawgit.com --\u003e\n\u003cscript src=\"https://cdn.rawgit.com/jherax/proxy-storage/2.3.2/dist/proxy-storage.min.js\"\u003e\u003c/script\u003e\n```\n\nIn the above case, [`proxyStorage`](#api) is included as a global object\nin the browser, and you can use it like this:\n\n### Browser\n\n```javascript\n// gets the default storage mechanism (usually localStorage)\nvar storage = proxyStorage.default;\n\n// or get an specific storage mechanism\nvar cookieStore = new proxyStorage.WebStorage('cookieStorage');\n```\n\nAs `proxy-storage` is built as [UMD] _(Universal Module Definition)_,\nit can be included from module loaders such as [CommonJS], [ES2015 Imports]\nor [AMD RequireJS].\n\n### CommonJS\n\n```javascript\n// gets the default storage mechanism (usually localStorage)\nvar storage = require('proxy-storage').default;\n\n// or get an specific storage mechanism\nvar WebStorage = require('proxy-storage').WebStorage;\nvar cookieStore = new WebStorage('cookieStorage');\n```\n\n### ES2015 Imports\n\n```javascript\n// gets the default storage mechanism (usually localStorage)\nimport storage from 'proxy-storage';\n\n// or get some API members\nimport storage, { WebStorage, configStorage } from 'proxy-storage';\nconst cookieStore = new WebStorage('cookieStorage');\n```\n\n### AMD\n\n```javascript\n// using RequireJS\nrequirejs.config({\n  paths: {\n    // remove the extension .js\n    'proxy-storage': '\u003cPATH\u003e/proxy-storage.min'\n  }\n});\nrequire(['proxy-storage'], function(proxyStorage) {\n  // gets the default storage mechanism (usually localStorage)\n  var storage = proxyStorage.default;\n  // or get an specific storage mechanism\n  var sessionStore = new proxyStorage.WebStorage('sessionStorage');\n});\n```\n\nSee an example with RequireJS here: http://jsfiddle.net/FdKTn/77/\n\n[\u0026#9751; Back to Index](#content)\n\n# API\n\nThe exposed API manages an adapter that stores the data\nas **JSON**, allowing to save and retrieve **primitive**,\n`Object` and `Array\u003cAny\u003e` values, thanks to `JSON.stringify`.\n\nIt also provides a new storage mechanism called **`memoryStorage`**\nwhich persists the data in memory (current tab in the browser), even\nif a forced refresh is done on the page, as `sessionStorage` does.\n\nThe [`WebStorage`](#webstorage) class has a static member called\n[`interceptors`](#interceptors) which lets you to register callback\nfunctions upon the prototype methods `setItem`, `getItem`, `removeItem`,\nand `clear`, giving you the ability to intercept and modify the values\nto read, write, or delete.\n\nThis library is exported as [UMD] _(Universal Module Definition)_ and\nthe API contains the following members:\n\n## storage (or default)\n\n**_@type_ `Object`**\n\nThis is the **default** member of the library and is an instance of\n[`WebStorage`](#webstorage). It inherits the following members from\nthe prototype:\n\n- **`setItem`**`(key, value [,options])`: stores a `value` given a `key` name.\n  \u003cbr\u003eThe `options` parameter is used only with instances of `cookieStorage`.\n  Read more details [here](#handling-cookies).\n- **`getItem`**`(key [, noParse])`: retrieves a value by its `key` name.\n  \u003cbr\u003eIf `noParse` is `true` then the value retrieved is not parsed with `JSON.parse`.\n- **`removeItem`**`(key [,options])`: deletes an item from the storage.\n  \u003cbr\u003eThe `options` parameter is used only with instances of `cookieStorage`.\n  Read more details [here](#handling-cookies).\n- **`clear`**`()`: removes all items from the storage instance.\n- **`length`**: gets the number of items stored in the instance.\n\nThe `storage` object is a proxy for the first storage mechanism available,\nusually `localStorage`, which is established when the library is initialized.\nThe availability of the storage mechanisms is determined in the following order:\n\n1. **`localStorage`**: adapter of the [window.localStorage] object.\n1. **`cookieStorage`**: adapter of the [document.cookie] object, and\n   normalized with the [`WebStorage`](#webstorage) interface.\n1. **`sessionStorage`**: adapter of the [window.sessionStorage] object.\n1. **`memoryStorage`**: internal storage mechanism that can be used as\n   _fallback_ when none of the above mechanisms are available. The behavior\n   of `memoryStorage` is similar to `sessionStorage`, which let you to persist\n   data in the current session (browser tab)\n\n**Important**: As the `storage` object is a proxy for the first storage\nmechanism available, that means if `localStorage` is available to read and\nwrite data, it will be used, otherwise, if `localStorage` is not available,\nthen `cookieStorage` will be used, and finally if none of the above are\navailable, `memoryStorage` will be the fallback mechanism.\n\n**Example**\n\n```javascript\nimport storage from 'proxy-storage';\n// for browser: storage = proxyStorage.default;\n\n// use the default storage mechanism, usually localStorage\nstorage.setItem('qwerty', [{ garbage: true, some: 'object' }]);\nconsole.log(storage.getItem('qwerty'));\n// [{ garbage: true, some: 'object' }]\n\nconsole.log(storage.getItem('qwerty', true));\n// '[{ \"garbage\": true, \"some\": \"object\" }]'\n\nstorage.setItem('persisted', true);\nstorage.setItem('o-really', { status: 'saved' });\nconsole.log(`items: ${storage.length}`);\n\nstorage.removeItem('qwerty');\nconsole.log(storage.getItem('qwerty'));\n// null\n\n// removes all data in the current storage\nstorage.clear();\nconsole.log(`items: ${storage.length}`);\n// items: 0\n```\n\n**ProTip**: you can override the default storage mechanism by calling\nthe method [configStorage.set()](#configstorage)\n\n[\u0026#9751; Back to Index](#content)\n\n## WebStorage\n\n**_@type_ `Class`**\n\nThis constructor mimics the [Web Storage] interface and manages an adapter\nthat allows saving `Object` and `Array\u003cAny\u003e` values as **JSON**. It also\nlets you register [interceptors](#interceptors) for the methods `setItem`,\n`getItem`, `removeItem` and `clear`.\n\nThis is the usage:\n\n```javascript\nvar instance = new WebStorage(storageType)\n```\n\nWhere **`storageType`** is a `string` that describes the type of storage\nto manage. It can be one of the following values:\n\n- `\"localStorage\"`\n- `\"cookieStorage\"`\n- `\"sessionStorage\"`\n- `\"memoryStorage\"`\n\nEach instance inherits the following properties:\n\n- **`setItem`**`(key, value [,options])`: stores a `value` given a `key` name.\n  \u003cbr\u003eThe `options` parameter is used only with instances of `cookieStorage`.\n  Read more details [here](#handling-cookies).\n- **`getItem`**`(key [, noParse])`: retrieves a value by its `key` name.\n  \u003cbr\u003eIf `noParse` is `true` then the value retrieved is not parsed with `JSON.parse`.\n- **`removeItem`**`(key [,options])`: deletes an item from the storage.\n  \u003cbr\u003eThe `options` parameter is used only with instances of `cookieStorage`.\n  Read more details [here](#handling-cookies).\n- **`clear`**`()`: removes all items from the storage instance.\n- **`length`**: gets the number of items stored in the instance.\n\nYou can create multiple instances of `WebStorage` to handle different\nstorage mechanisms. For example, to store data in `cookies` and also in\n`sessionStorage`, you can do as follow:\n\n```javascript\nimport storage, { WebStorage } from 'proxy-storage';\n// for browser:\n// var storage = proxyStorage.default;\n// var WebStorage = proxyStorage.WebStorage;\n\n// use the default storage mechanism, usually localStorage\nstorage.setItem('tv-show', { name: 'Regular Show' });\n\n// store in sessionStorage\nconst sessionStore = new WebStorage('sessionStorage');\nsessionStore.setItem('character', { name: 'Mordecai' });\n\n// store in cookies\nconst options = { expires: {days: 1} };\nconst cookieStore = new WebStorage('cookieStorage');\ncookieStore.setItem('character', { name: 'Rigby' }, options);\n```\n\n**Important**: If you request an instance of a storage mechanism that is not\navailable, you will get an instance of the first storage mechanism available,\nso you can continue storing data. It is useful when you rely on a\nspecific storage mechanism. Let's see an example:\n\n```javascript\nimport { WebStorage, isAvailable } from 'proxy-storage';\n// for browser:\n// var WebStorage = proxyStorage.WebStorage;\n// var isAvailable = proxyStorage.isAvailable;\n\n // let's suppose the following storage is not available\n isAvailable.sessionStorage = false;\n\n const sessionStore = new WebStorage('sessionStorage');\n // sessionStorage is not available. Falling back to memoryStorage\n sessionStore.setItem('ulugrun', 3.1415926);\n\n // as sessionStorage is not available, the instance\n // obtained is the fallback mechanism: memoryStorage\n console.dir(sessionStore);\n```\n\n[\u0026#9751; Back to Index](#content)\n\n### Handling cookies\n\nWhen you create an instance of `WebStorage` with `cookieStorage`, the\nmethod `setItem()` receives an optional argument as the last parameter\nthat configures the way how the cookie is stored.\n\nSignature of `setItem`:\n\n```javascript\ninstance.setItem(key: String, value: Any, options: Object) : void\n```\n\nWhere the **`options`** parameter is an `object` with the following properties:\n\n- `domain`_`{string}`_: the domain or subdomain where the cookie will be valid.\n- `path`_`{string}`_: relative path where the cookie is valid. _Default `\"/\"`_\n- `secure`_`{boolean}`_: if provided, creates a secure cookie over HTTPS.\n- `expires`_`{Date, object}`_: the cookie expiration date.\n  You can pass an object describing the expiration:\n  - `date`_`{Date}`_: if provided, this date will be applied, otherwise the\n    current date is used.\n  - `minutes`_`{number}`_: minutes to add / subtract\n  - `hours`_`{number}`_: hours to add / subtract\n  - `days`_`{number}`_: days to add / subtract\n  - `months`_`{number}`_: months to add / subtract\n  - `years`_`{number}`_: years to add / subtract\n\n**Example**\n\n```javascript\nimport { WebStorage } from 'proxy-storage';\n// for browser: WebStorage = proxyStorage.WebStorage;\n\nconst cookieStore = new WebStorage('cookieStorage');\n\nlet data = {\n  start: new Date().toISOString(),\n  sessionId: 'J34H5609-SG7ND98W3',\n  platform: 'Linux x86_64',\n};\n\ncookieStore.setItem('activity', data, {\n  expires: { minutes: 30 },\n});\n\ncookieStore.setItem('testing1', true, {\n  secure: true,\n  path: '/jherax',\n  expires: new Date('2017/12/31'),\n});\n\ncookieStore.setItem('testing2', [1,4,7], {\n  domain: '.github.com',\n  expires: { days: 1 },\n});\n\ncookieStore.setItem('testing3', 3, {\n  expires: {\n    date: new Date('2018/03/06'),\n    hours: -6,\n  },\n});\n```\n\n**Important**: Take into account that if you want to **modify** or **remove**\na cookie that was created under specific `path` or `domain` (subdomain), you\nneed to specify the `domain` or `path` attributes in the `options` parameter\nwhen calling `setItem(key, value, options)` or `removeItem(key, options)`.\n\nIf you have created the cookie with **proxyStorage**, it will handle the\nmetadata internally, so that you can call `removeItem(key)` with no more\narguments. Otherwise you will need to provide the metadata **`path`** or\n**`domain`**:\n\n![cookies-metadata](https://assets.healthcare.com/static/docs/img/cookies-metadata.png)\n\n```javascript\n// change the value of an external cookie in /answers\ncookieStore.setItem('landedAnswers', 999, {\n  path: '/answers',\n});\n\n// remove an external cookie in a subdomain\ncookieStore.removeItem('optimizelyEndUserId', {\n  domain: '.healthcare.org',\n});\n```\n\n[\u0026#9751; Back to Index](#content)\n\n### Looping the storage\n\nYou can loop over the items in the `storage` instance,\nbut it is not recommended to rely on it because navigable\nitems in the `storage` instance are not synchronized with\nexternal changes, for example, a cookie has expired, or a\ncookie/localStorage element was created/deleted from another\npage with the same domain/subdomain.\n\n```javascript\nconst sessionStore = new WebStorage('sessionStorage');\n\nsessionStore.setItem('test1', 1);\nsessionStore.setItem('test2', 2);\n\n// loop over the storage object (not recommended)\nObject.keys(sessionStore).forEach((key) =\u003e {\n  console.log(key, sessionStore[key]);\n});\n\n// or this way (not recommended either)\nfor (let key in sessionStore) {\n  console.log(key, sessionStore[key]);\n}\n```\n\nIt is also applied not only when reading, but also when writing to storage:\n\n```javascript\n// not recommended: not synchronized with the real storage\nvar title = cookieStorage['title'];\nvar session = cookieStorage.sessionId;\ncookieStorage['sessionId'] = 'E6URTG5';\n\n// good practice: it is synchronized for external changes\nvar title = cookieStorage.getItem('title');\nvar session = cookieStorage.getItem('sessionId');\ncookieStorage.setItem('sessionId', 'E6URTG5');\n```\n\n[\u0026#9751; Back to Index](#content)\n\n### Clearing data\n\nYou can use the `removeItem(key)` method to delete a specific item in\nthe storage instance, or use the `clear()` method to remove all items\nin the storage instance, e.g.\n\n```javascript\nimport { WebStorage } from 'proxy-storage';\n// for browser: WebStorage = proxyStorage.WebStorage;\n\nfunction clearAllStorages() {\n  new WebStorage('localStorage').clear();\n  new WebStorage('sessionStorage').clear();\n  new WebStorage('cookieStorage').clear();\n}\n```\n\n**Important**: When handling `cookieStorage`, the method `clear()` only will\nremove the cookies with no metadata or those created through **proxyStorage**.\nTake into account that if you want to remove a cookie that was created from\nanother page, you need to set the `domain` or `path` attributes in the\n`options` parameter when calling `removeItem(key, options)`.\u003cbr\u003e\nSee [handling-cookies](#handling-cookies).\n\n[\u0026#9751; Back to Index](#content)\n\n### Interceptors\n\nThe [`WebStorage`](#webstorage) class exposes the static member `interceptors`\nwhich lets you to register callback functions upon the prototype methods\n`setItem`, `getItem`, `removeItem`, and `clear`. It is very useful when you\nneed to perform an action to intercept the value to read, write, or delete.\n\n- **`WebStorage.interceptors`**`(command, action)`: adds an interceptor to\n  the API method.\n  - `command`_`{string}`_: name of the API method to intercept. It can be\n    `setItem`, `getItem`, `removeItem`, `clear`.\n  - `action`_`{function}`_: callback executed when the API method is called.\n    It **must** return the value in order to be processed by the API method.\n\n**ProTip**: interceptors are registered in chain, allowing you to transform\nthe _value_ passed and returned in each callback.\n\n```javascript\nimport storage, { WebStorage } from 'proxy-storage';\n// for browser:\n// var storage = proxyStorage.default;\n// var WebStorage = proxyStorage.WebStorage;\n\n// adds first interceptor for 'setItem'\nWebStorage.interceptors('setItem', (key, value/*, options*/) =\u003e {\n  if (key === 'storage-test') {\n    // encodes the 'id' to base64\n    value.id = btoa(value.id);\n    return value;\n  }\n});\n\n// adds second interceptor for 'setItem'\nWebStorage.interceptors('setItem', (key, value) =\u003e {\n  // does not apply any transformation\n  console.info('setItem: See the application storage in your browser');\n  console.log(`${key}: ${JSON.stringify(value)}`);\n});\n\n// adds first interceptor for 'getItem'\nWebStorage.interceptors('getItem', (key, value) =\u003e {\n  if (key === 'storage-test') {\n    // decodes from base64\n    value.id = +atob(value.id);\n  }\n  return value;\n});\n\nWebStorage.interceptors('removeItem', (key/*, options*/) =\u003e {\n  console.log(`removeItem: ${key}`);\n});\n\n// uses the default storage mechanism (usually localStorage)\nstorage.setItem('storage-test', {id: 1040, text: 'it works!'});\nlet data = storage.getItem('storage-test');\nconsole.log(data);\n\n// storage.removeItem('storage-test');\n```\n\n[\u0026#9751; Back to Index](#content)\n\n## configStorage\n\n**_@type_ `Object`**\n\nSets the [default storage](##storage-or-default) mechanism, or get the current\ndefault storage mechanism. This object contains the following methods:\n\n- **`get`**`()`: returns a `string` with the name of the current storage mechanism.\n- **`set`**`(storageType)`: sets the default storage mechanism. `storageType`\n  must be one of the following strings: `\"localStorage\"`, `\"sessionStorage\"`,\n  `\"cookieStorage\"`, or `\"memoryStorage\"`. If the storage type provided is\n  not valid, it will throw an exception.\n\n**Example**\n\n```javascript\nimport storage, { configStorage } from 'proxy-storage';\n// for browser:\n// var storage = proxyStorage.default;\n// var configStorage = proxyStorage.configStorage;\n\n// gets the default storage mechanism\nlet storageName = configStorage.get();\nconsole.log('Default:', storageName);\n\nstorage.setItem('defaultStorage', storageName);\n\n// sets the new default storage mechanism\nconfigStorage.set('cookieStorage');\nstorageName = configStorage.get();\nconsole.log('Current:', storageName);\n\n// if you are running in the browser,\n// you MUST update the alias of the storage:\n// storage = proxyStorage.default;\nstorage.setItem('currentStorage', storageName);\n```\n\n[\u0026#9751; Back to Index](#content)\n\n## isAvailable\n\n**_@type_ `Object`**\n\nDetermines which storage mechanisms are available to _read, write,_\nor _delete_ data.\n\nIt contains the following flags:\n\n- **`localStorage`**: is set to `true` if the local storage is available.\n- **`cookieStorage`**: is set to `true` if the document cookies are available.\n- **`sessionStorage`**: is set to `true` if the session storage is available.\n- **`memoryStorage`**: always is set to `true`.\n\n**Example**\n\n```javascript\nimport storage, * as proxyStorage from 'proxy-storage';\n// * imports the entire module's members into proxyStorage.\n\nconst flags = proxyStorage.isAvailable;\n\nif (!flags.sessionStorage) {\n  // forces the storage mechanism to memoryStorage\n  proxyStorage.configStorage.set('memoryStorage');\n}\n\nlet data = storage.getItem('hidden-data');\n\nif (!data) {\n  storage.setItem('hidden-data', {\n    mechanism: 'memoryStorage',\n    availability: 'Current page: you can refresh the page, data still remain'\n  });\n}\n\nconsole.log('in memoryStorage', data);\n```\n\n[\u0026#9751; Back to Index](#content)\n\n## Polyfills\n\nThis library is written using some of the new ES5/ES6 features. If you have\nto support Non-standard-compliant browsers like Internet Explorer, you can\npolyfill some of the missing features with the following alternatives:\n\n**Using [es6-shim](https://github.com/paulmillr/es6-shim)**\n\n```html\n\u003c!-- put this script FIRST, before all other scripts --\u003e\n\u003cscript src=\"https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.35.3/es6-shim.min.js\"\u003e\u003c/script\u003e\n```\n\n**Using [polyfill.io](https://polyfill.io/v2/docs/)**\n\n```html\n\u003c!-- put this script FIRST, before all other scripts --\u003e\n\u003cscript src=\"https://cdn.polyfill.io/v2/polyfill.min.js?features=default-3.3\"\u003e\u003c/script\u003e\n```\n\n[Polyfill.io](https://polyfill.io/v2/docs/examples) reads the `User-Agent`\nheader of each request and returns the polyfills that are suitable for the\nrequesting browser.\n\nIf you want to request specific polyfills, you can pass a query parameter\nto the url, for example:\n\n```html\n\u003c!--[if IE]\u003e\n\u003cscript src=\"https://polyfill.io/v2/polyfill.min.js?features=default-3.3\u0026flags=always\"\u003e\u003c/script\u003e\n\u003c![endif]--\u003e\n```\n\nRead the list of available features:\n[Features and Browsers Supported](https://polyfill.io/v2/docs/features/).\n\n[\u0026#9751; Back to Index](#content)\n\n## Versioning\n\nThis projects adopts the [Semantic Versioning](http://semver.org/)\n(SemVer) guidelines:\n\n```text\n\u003cMAJOR\u003e.\u003cMINOR\u003e.\u003cPATCH\u003e\n```\n\nGiven a version number MAJOR.MINOR.PATCH, increment the:\n\n1. MAJOR version when you make incompatible API changes.\n1. MINOR version when you add functionality in a backwards-compatible manner.\n1. PATCH version when you make backwards-compatible bug fixes.\n\n[\u0026#9751; Back to Index](#content)\n\n## Issues\n\nTo report an issue and keep traceability of bug-fixes, please report to:\n\n- https://github.com/jherax/proxy-storage/issues\n\n## Changelog\n\nThe change history for each version is documented [here](CHANGELOG.md).\n\n## License\n\nThis project is released under the [MIT](https://opensource.org/licenses/MIT)\nlicense. This license applies ONLY to the source of this repository and doesn't\nextend to any other distribution, or any other 3rd party libraries used in a\nrepository. See [LICENSE](LICENSE) file for more information.\n\n\u003c!-- LINKS --\u003e\n\n[Web Storage]: https://developer.mozilla.org/en-US/docs/Web/API/Storage\n[document.cookie]: https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie\n[window.localStorage]: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage\n[window.sessionStorage]: https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage\n[UMD]: http://davidbcalhoun.com/2014/what-is-amd-commonjs-and-umd/\n[CommonJS]: https://blog.risingstack.com/node-js-at-scale-module-system-commonjs-require/\n[ES2015 Imports]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import\n[AMD RequireJS]: http://requirejs.org/docs/api.html#jsfiles\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjherax%2Fproxy-storage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjherax%2Fproxy-storage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjherax%2Fproxy-storage/lists"}