From 51e14d99a933bec2d84f99f0177f9f6ac4757aa7 Mon Sep 17 00:00:00 2001 From: benitogf Date: Sun, 28 Jan 2018 13:35:45 +0800 Subject: [PATCH] setItem mutation param --- README.md | 6 +- dist/AsyncStorage.d.ts | 2 +- dist/MockStorage.d.ts | 2 +- dist/PersistOptions.d.ts | 3 +- dist/index.d.ts | 2 +- dist/index.js | 24 +- dist/index.js.map | 2 +- package-lock.json | 691 ++++++++++++--------------------- package.json | 22 +- src/AsyncStorage.ts | 2 +- src/MockStorage.ts | 2 +- src/PersistOptions.ts | 3 +- src/index.ts | 24 +- test/vuex-asyncstorage.spec.ts | 29 +- tsconfig.json | 2 +- 15 files changed, 324 insertions(+), 492 deletions(-) diff --git a/README.md b/README.md index 75cd390..030b862 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ In strict mode, we cannot use `store.replaceState` so instead we use a mutation You'll need to keep in mind to add the **`RESTORE_MUTATION`** to your mutations See example below -To configure with strict mode support - +To configure with strict mode support - ```typescript import Vue from 'vue' @@ -237,7 +237,7 @@ interface Storage { getItem(key: string): string | null; key(index: number): string | null; removeItem(key: string): void; - setItem(key: string, data: string): void; + setItem(key: string, data: string, mutation: string): void; [key: string]: any; [index: number]: string; } @@ -251,7 +251,7 @@ Now note the representative interface of Local Forage - ```typescript export interface LocalForage { getItem(key: string): Promise - setItem(key: string, data: T): Promise + setItem(key: string, data: T, mutation: string): Promise removeItem(key: string): Promise clear(): Promise length(): Promise diff --git a/dist/AsyncStorage.d.ts b/dist/AsyncStorage.d.ts index bb1ce0f..cc314e5 100644 --- a/dist/AsyncStorage.d.ts +++ b/dist/AsyncStorage.d.ts @@ -3,7 +3,7 @@ export interface AsyncStorage { name: string; }; getItem(key: string): Promise; - setItem(key: string, data: T): Promise; + setItem(key: string, data: T, mutation: string): Promise; removeItem(key: string): Promise; clear(): Promise; length(): Promise; diff --git a/dist/MockStorage.d.ts b/dist/MockStorage.d.ts index c054546..c22b067 100644 --- a/dist/MockStorage.d.ts +++ b/dist/MockStorage.d.ts @@ -6,7 +6,7 @@ export default class MockStorage implements Storage { [key: string]: any; readonly length: number; key(index: number): string | any; - setItem(key: string, data: any): void; + setItem(key: string, data: any, mutation?: string): void; getItem(key: string): string; removeItem(key: string): void; clear(): void; diff --git a/dist/PersistOptions.d.ts b/dist/PersistOptions.d.ts index d89cf0d..6e1c0f5 100644 --- a/dist/PersistOptions.d.ts +++ b/dist/PersistOptions.d.ts @@ -19,8 +19,9 @@ export interface PersistOptions { * @param key * @param state * @param [storage] + * @param [mutation] */ - saveState?: (key: string, state: {}, storage?: Storage) => Promise | void; + saveState?: (key: string, state: {}, storage?: Storage, mutation?: string) => Promise | void; /** * Function to reduce state to the object you want to save. * Be default, we save the entire state. diff --git a/dist/index.d.ts b/dist/index.d.ts index 7b652a2..1a49831 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -9,7 +9,7 @@ export declare class VuexPersistence implements PersistOpt asyncStorage: boolean; storage: Storage | AsyncStorage; restoreState: (key: string, storage?: AsyncStorage | Storage) => Promise | S; - saveState: (key: string, state: {}, storage?: AsyncStorage | Storage) => Promise | void; + saveState: (key: string, state: {}, storage?: AsyncStorage | Storage, mutation?: string) => Promise | void; reducer: (state: S) => {}; key: string; filter: (mutation: Payload) => boolean; diff --git a/dist/index.js b/dist/index.js index 927641e..e666ab5 100644 --- a/dist/index.js +++ b/dist/index.js @@ -22,7 +22,7 @@ var MockStorage = /** @class */ (function () { MockStorage.prototype.key = function (index) { return Object.keys(this)[index]; }; - MockStorage.prototype.setItem = function (key, data) { + MockStorage.prototype.setItem = function (key, data, mutation) { this[key] = data.toString(); }; MockStorage.prototype.getItem = function (key) { @@ -146,16 +146,16 @@ var VuexPersistence = /** @class */ (function () { })); /** * Async {@link #VuexPersistence.saveState} implementation - * @type {((key: string, state: {}, storage?: Storage) => - * (Promise | void)) | ((key: string, state: {}, storage?: Storage) => Promise)} + * @type {((key: string, state: {}, storage?: Storage, mutation?: string) => + * (Promise | void)) | ((key: string, state: {}, storage?: Storage, mutation?: string) => Promise)} */ this.saveState = ((options.saveState != null) ? options.saveState - : (function (key, state, storage) { + : (function (key, state, storage, mutation) { return (storage).setItem(key, // Second argument is state _object_ if localforage, stringified otherwise (((storage && storage._config && storage._config.name) === 'localforage') ? merge({}, state) - : JSON.stringify(state))); + : JSON.stringify(state)), mutation); })); /** * Async version of plugin @@ -174,7 +174,7 @@ var VuexPersistence = /** @class */ (function () { } _this.subscriber(store)(function (mutation, state) { if (_this.filter(mutation)) { - _this._mutex.enqueue(_this.saveState(_this.key, _this.reducer(state), _this.storage)); + _this._mutex.enqueue(_this.saveState(_this.key, _this.reducer(state), _this.storage, mutation.type)); } }); _this.subscribed = true; @@ -200,14 +200,14 @@ var VuexPersistence = /** @class */ (function () { })); /** * Sync {@link #VuexPersistence.saveState} implementation - * @type {((key: string, state: {}, storage?: Storage) => - * (Promise | void)) | ((key: string, state: {}, storage?: Storage) => Promise)} + * @type {((key: string, state: {}, storage?: Storage, mutation?: string) => + * (Promise | void)) | ((key: string, state: {}, storage?: Storage, mutation?: string) => Promise)} */ this.saveState = ((options.saveState != null) ? options.saveState - : (function (key, state, storage) { + : (function (key, state, storage, mutation) { return (storage).setItem(key, // Second argument is state _object_ if localforage, stringified otherwise - JSON.stringify(state)); + JSON.stringify(state), mutation); })); /** * Sync version of plugin @@ -223,7 +223,7 @@ var VuexPersistence = /** @class */ (function () { } _this.subscriber(store)(function (mutation, state) { if (_this.filter(mutation)) { - _this.saveState(_this.key, _this.reducer(state), _this.storage); + _this.saveState(_this.key, _this.reducer(state), _this.storage, mutation.type); } }); _this.subscribed = true; @@ -235,5 +235,5 @@ var VuexPersistence = /** @class */ (function () { exports.VuexPersistence = VuexPersistence; exports.MockStorage = MockStorage; -exports['default'] = VuexPersistence; +exports.default = VuexPersistence; //# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map index cda1df8..716c8df 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/MockStorage.ts","../src/SimplePromiseQueue.ts","../src/index.ts"],"sourcesContent":["/**\n * Created by championswimmer on 22/07/17.\n */\nexport default class MockStorage implements Storage {\n [index: number]: string;\n [key: string]: any;\n\n public get length(): number {\n return Object.keys(this).length\n }\n\n public key(index: number): string | any {\n return Object.keys(this)[index]\n }\n\n public setItem(key: string, data: any): void {\n this[key] = data.toString()\n }\n public getItem(key: string): string {\n return this[key]\n }\n public removeItem(key: string): void {\n delete this[key]\n }\n public clear(): void {\n for (const key of Object.keys(this)) {\n delete this[key]\n }\n }\n}\n","// tslint:disable: variable-name\nexport default class SimplePromiseQueue {\n private readonly _queue: Array> = []\n private _flushing = false\n\n public enqueue(promise: Promise) {\n this._queue.push(promise)\n if (!this._flushing) { return this.flushQueue() }\n return Promise.resolve()\n }\n\n private flushQueue() {\n this._flushing = true\n\n const chain = (): Promise | void => {\n const nextTask = this._queue.shift()\n if (nextTask) {\n return nextTask.then(chain)\n } else {\n this._flushing = false\n }\n }\n return Promise.resolve(chain())\n }\n}\n","/**\n * Created by championswimmer on 18/07/17.\n */\nimport merge from 'lodash.merge'\nimport {Mutation, MutationPayload, Payload, Plugin, Store} from 'vuex'\nimport {AsyncStorage} from './AsyncStorage'\nimport MockStorage from './MockStorage'\nimport {PersistOptions} from './PersistOptions'\nimport SimplePromiseQueue from './SimplePromiseQueue'\n\n/**\n * A class that implements the vuex persistence.\n */\nexport class VuexPersistence implements PersistOptions {\n public asyncStorage: boolean\n public storage: Storage | AsyncStorage\n public restoreState: (key: string, storage?: AsyncStorage | Storage) => Promise | S\n public saveState: (key: string, state: {}, storage?: AsyncStorage | Storage) => Promise | void\n public reducer: (state: S) => {}\n public key: string\n public filter: (mutation: Payload) => boolean\n public modules: string[]\n public strictMode: boolean\n\n /**\n * The plugin function that can be used inside a vuex store.\n */\n public plugin: Plugin\n /**\n * A mutation that can be used to restore state\n * Helpful if we are running in strict mode\n */\n public RESTORE_MUTATION: Mutation\n public subscribed: boolean\n\n // tslint:disable-next-line:variable-name\n private _mutex = new SimplePromiseQueue()\n\n /**\n * Create a {@link VuexPersistence} object.\n * Use the plugin function of this class as a\n * Vuex plugin.\n * @param {PersistOptions} options\n */\n public constructor(options: PersistOptions) {\n this.key = ((options.key != null) ? options.key : 'vuex')\n\n this.subscribed = false\n\n this.storage =\n ((options.storage != null) ? options.storage : (new MockStorage()))\n\n /**\n * How this works is -\n * 1. If there is options.reducer function, we use that, if not;\n * 2. We check options.modules;\n * 1. If there is no options.modules array, we use entire state in reducer\n * 2. Otherwise, we create a reducer that merges all those state modules that are\n * defined in the options.modules[] array\n * @type {((state: S) => {}) | ((state: S) => S) | ((state: any) => {})}\n */\n this.reducer = (\n (options.reducer != null)\n ? options.reducer\n : (\n (options.modules == null)\n ? ((state: S) => state)\n : (\n (state: any) =>\n (options.modules as string[]).reduce((a, i) =>\n merge(a, { [i]: state[i] }), {})\n )\n )\n )\n\n this.filter = (\n (options.filter != null)\n ? options.filter\n : ((mutation) => true)\n )\n\n this.strictMode = options.strictMode || false\n\n this.RESTORE_MUTATION = function RESTORE_MUTATION(state: S, savedState: any) {\n (this as any)._vm.$set(state, merge(state, savedState))\n }\n\n this.asyncStorage = options.asyncStorage || false\n const storageConfig = ((this.storage) as any)._config\n this.asyncStorage = (storageConfig && storageConfig.name) === 'localforage'\n\n if (this.asyncStorage) {\n\n /**\n * Async {@link #VuexPersistence.restoreState} implementation\n * @type {((key: string, storage?: Storage) =>\n * (Promise | S)) | ((key: string, storage: AsyncStorage) => Promise)}\n */\n this.restoreState = (\n (options.restoreState != null)\n ? options.restoreState\n : ((key: string, storage: AsyncStorage) =>\n (storage ).getItem(key)\n .then((value) =>\n typeof value === 'string' // If string, parse, or else, just return\n ? JSON.parse(value || '{}')\n : (value || {})\n )\n )\n )\n\n /**\n * Async {@link #VuexPersistence.saveState} implementation\n * @type {((key: string, state: {}, storage?: Storage) =>\n * (Promise | void)) | ((key: string, state: {}, storage?: Storage) => Promise)}\n */\n this.saveState = (\n (options.saveState != null)\n ? options.saveState\n : ((key: string, state: {}, storage: AsyncStorage) =>\n (storage).setItem(\n key, // Second argument is state _object_ if localforage, stringified otherwise\n (((storage && storage._config && storage._config.name) === 'localforage')\n ? merge({}, state)\n : JSON.stringify(state) as any)\n )\n )\n )\n\n /**\n * Async version of plugin\n * @param {Store} store\n */\n this.plugin = (store: Store) => {\n ((this.restoreState(this.key, this.storage)) as Promise).then((savedState) => {\n /**\n * If in strict mode, do only via mutation\n */\n if (this.strictMode) {\n store.commit('RESTORE_MUTATION', savedState)\n } else {\n store.replaceState(merge(store.state, savedState))\n }\n\n this.subscriber(store)((mutation: MutationPayload, state: S) => {\n if (this.filter(mutation)) {\n this._mutex.enqueue(\n this.saveState(this.key, this.reducer(state), this.storage) as Promise\n )\n }\n })\n this.subscribed = true\n })\n }\n } else {\n\n /**\n * Sync {@link #VuexPersistence.restoreState} implementation\n * @type {((key: string, storage?: Storage) =>\n * (Promise | S)) | ((key: string, storage: Storage) => (any | string | {}))}\n */\n this.restoreState = (\n (options.restoreState != null)\n ? options.restoreState\n : ((key: string, storage: Storage) => {\n const value = (storage).getItem(key)\n if (typeof value === 'string') {// If string, parse, or else, just return\n return JSON.parse(value || '{}')\n } else {\n return (value || {})\n }\n })\n )\n\n /**\n * Sync {@link #VuexPersistence.saveState} implementation\n * @type {((key: string, state: {}, storage?: Storage) =>\n * (Promise | void)) | ((key: string, state: {}, storage?: Storage) => Promise)}\n */\n this.saveState = (\n (options.saveState != null)\n ? options.saveState\n : ((key: string, state: {}, storage: Storage) =>\n (storage).setItem(\n key, // Second argument is state _object_ if localforage, stringified otherwise\n JSON.stringify(state) as any\n )\n )\n )\n\n /**\n * Sync version of plugin\n * @param {Store} store\n */\n this.plugin = (store: Store) => {\n const savedState = this.restoreState(this.key, this.storage) as S\n\n if (this.strictMode) {\n store.commit('RESTORE_MUTATION', savedState)\n } else {\n store.replaceState(merge(store.state, savedState))\n }\n\n this.subscriber(store)((mutation: MutationPayload, state: S) => {\n if (this.filter(mutation)) {\n this.saveState(this.key, this.reducer(state), this.storage)\n }\n })\n\n this.subscribed = true\n }\n }\n }\n\n /**\n * Creates a subscriber on the store. automatically is used\n * when this is used a vuex plugin. Not for manual usage.\n * @param store\n */\n private subscriber = (store: Store) =>\n (handler: (mutation: MutationPayload, state: S) => any) => store.subscribe(handler)\n}\n\nexport {\n MockStorage, AsyncStorage, PersistOptions\n}\n\nexport default VuexPersistence\n"],"names":[],"mappings":";;;;;;;;AAAA;;;AAGA;IAAA;KA0BC;IAtBC,sBAAW,+BAAM;aAAjB;YACE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;SAChC;;;OAAA;IAEM,yBAAG,GAAV,UAAW,KAAa;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAA;KAChC;IAEM,6BAAO,GAAd,UAAe,GAAW,EAAE,IAAS;QACnC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;KAC5B;IACM,6BAAO,GAAd,UAAe,GAAW;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;KACjB;IACM,gCAAU,GAAjB,UAAkB,GAAW;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;KACjB;IACM,2BAAK,GAAZ;QACE,KAAkB,UAAiB,EAAjB,KAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAjB,cAAiB,EAAjB,IAAiB;YAA9B,IAAM,GAAG,SAAA;YACZ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;SACjB;KACF;IACH,kBAAC;CAAA;;AC7BD;AACA;IAAA;QACmB,WAAM,GAAyB,EAAE,CAAA;QAC1C,cAAS,GAAG,KAAK,CAAA;KAqB1B;IAnBQ,oCAAO,GAAd,UAAe,OAAsB;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAA;SAAE;QACjD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;KACzB;IAEO,uCAAU,GAAlB;QAAA,iBAYC;QAXC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QAErB,IAAM,KAAK,GAAG;YACZ,IAAM,QAAQ,GAAG,KAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;YACpC,IAAI,QAAQ,EAAE;gBACZ,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;aAC5B;iBAAM;gBACL,KAAI,CAAC,SAAS,GAAG,KAAK,CAAA;aACvB;SACF,CAAA;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;KAChC;IACH,yBAAC;CAAA;;ACxBD;;;AAGA,AAOA;;;AAGA;;;;;;;IA+BE,yBAAmB,OAA0B;QAA7C,iBAwKC;;QAhLO,WAAM,GAAG,IAAI,kBAAkB,EAAE,CAAA;;;;;;QAuLjC,eAAU,GAAG,UAAC,KAAe;YACnC,OAAA,UAAC,OAAqD,IAAK,OAAA,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,GAAA;SAAA,CAAA;QA/KnF,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,CAAA;QAEzD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QAEvB,IAAI,CAAC,OAAO;aACT,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC,CAAA;;;;;;;;;;QAWrE,IAAI,CAAC,OAAO,IACV,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI;cACpB,OAAO,CAAC,OAAO;eAEf,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI;mBACnB,UAAC,KAAQ,IAAK,OAAA,KAAK,GAAA;mBAEpB,UAAC,KAAU;oBACT,OAAC,OAAO,CAAC,OAAoB,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC;wBACxC,OAAA,KAAK,CAAC,CAAC,YAAI,GAAC,CAAC,IAAG,KAAK,CAAC,CAAC,CAAC,MAAG;;qBAAA,EAAE,EAAE,CAAC;iBAAA,CACrC,CACJ,CACJ,CAAA;QAED,IAAI,CAAC,MAAM,IACT,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI;cACnB,OAAO,CAAC,MAAM;eACb,UAAC,QAAQ,IAAK,OAAA,IAAI,GAAA,CAAC,CACzB,CAAA;QAED,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAA;QAE7C,IAAI,CAAC,gBAAgB,GAAG,0BAA0B,KAAQ,EAAE,UAAe;YACxE,IAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;SACxD,CAAA;QAED,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAA;QACjD,IAAM,aAAa,GAAI,CAAC,IAAI,CAAC,OAAO,EAAU,OAAO,CAAA;QACrD,IAAI,CAAC,YAAY,GAAG,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,MAAM,aAAa,CAAA;QAE3E,IAAI,IAAI,CAAC,YAAY,EAAE;;;;;;YAOrB,IAAI,CAAC,YAAY,IACf,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI;kBACzB,OAAO,CAAC,YAAY;mBACnB,UAAC,GAAW,EAAE,OAAqB;oBAClC,OAAA,CAAC,OAAO,EAAG,OAAO,CAAC,GAAG,CAAC;yBACpB,IAAI,CAAC,UAAC,KAAK;wBACV,OAAA,OAAO,KAAK,KAAK,QAAQ;8BACrB,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;+BACxB,KAAK,IAAI,EAAE,CAAC;qBAAA,CAClB;iBAAA,CACN,CACJ,CAAA;;;;;;YAOD,IAAI,CAAC,SAAS,IACZ,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI;kBACtB,OAAO,CAAC,SAAS;mBAChB,UAAC,GAAW,EAAE,KAAS,EAAE,OAAqB;oBAC7C,OAAA,CAAC,OAAO,EAAE,OAAO,CACf,GAAG;qBACF,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,aAAa;0BACpE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC;0BAChB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAQ,EACjC;iBAAA,CACJ,CACJ,CAAA;;;;;YAMD,IAAI,CAAC,MAAM,GAAG,UAAC,KAAe;gBAC3B,CAAC,KAAI,CAAC,YAAY,CAAC,KAAI,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,EAAiB,IAAI,CAAC,UAAC,UAAU;;;;oBAI1E,IAAI,KAAI,CAAC,UAAU,EAAE;wBACnB,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAA;qBAC7C;yBAAM;wBACL,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;qBACnD;oBAED,KAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAC,QAAyB,EAAE,KAAQ;wBACzD,IAAI,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;4BACzB,KAAI,CAAC,MAAM,CAAC,OAAO,CACjB,KAAI,CAAC,SAAS,CAAC,KAAI,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAI,CAAC,OAAO,CAAkB,CAC7E,CAAA;yBACF;qBACF,CAAC,CAAA;oBACF,KAAI,CAAC,UAAU,GAAG,IAAI,CAAA;iBACvB,CAAC,CAAA;aACH,CAAA;SACF;aAAM;;;;;;YAOL,IAAI,CAAC,YAAY,IACf,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI;kBACzB,OAAO,CAAC,YAAY;mBACnB,UAAC,GAAW,EAAE,OAAgB;oBAC9B,IAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;oBACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;wBAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;qBAClC;yBAAM;wBACL,QAAQ,KAAK,IAAI,EAAE,EAAC;qBACrB;iBACH,CAAC,CACL,CAAA;;;;;;YAOD,IAAI,CAAC,SAAS,IACZ,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI;kBACtB,OAAO,CAAC,SAAS;mBAChB,UAAC,GAAW,EAAE,KAAS,EAAE,OAAgB;oBACxC,OAAA,CAAC,OAAO,EAAE,OAAO,CACf,GAAG;oBACH,IAAI,CAAC,SAAS,CAAC,KAAK,CAAQ,CAC7B;iBAAA,CACJ,CACJ,CAAA;;;;;YAMD,IAAI,CAAC,MAAM,GAAG,UAAC,KAAe;gBAC5B,IAAM,UAAU,GAAG,KAAI,CAAC,YAAY,CAAC,KAAI,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAM,CAAA;gBAEjE,IAAI,KAAI,CAAC,UAAU,EAAE;oBACnB,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAA;iBAC7C;qBAAM;oBACL,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;iBACnD;gBAED,KAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAC,QAAyB,EAAE,KAAQ;oBACzD,IAAI,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;wBACzB,KAAI,CAAC,SAAS,CAAC,KAAI,CAAC,GAAG,EAAE,KAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAI,CAAC,OAAO,CAAC,CAAA;qBAC5D;iBACF,CAAC,CAAA;gBAEF,KAAI,CAAC,UAAU,GAAG,IAAI,CAAA;aACvB,CAAA;SACF;KACF;IASH,sBAAC;CAAA;;;;;;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/MockStorage.ts","../src/SimplePromiseQueue.ts","../src/index.ts"],"sourcesContent":["/**\r\n * Created by championswimmer on 22/07/17.\r\n */\r\nexport default class MockStorage implements Storage {\r\n [index: number]: string;\r\n [key: string]: any;\r\n\r\n public get length(): number {\r\n return Object.keys(this).length\r\n }\r\n\r\n public key(index: number): string | any {\r\n return Object.keys(this)[index]\r\n }\r\n\r\n public setItem(key: string, data: any, mutation?: string): void {\r\n this[key] = data.toString()\r\n }\r\n public getItem(key: string): string {\r\n return this[key]\r\n }\r\n public removeItem(key: string): void {\r\n delete this[key]\r\n }\r\n public clear(): void {\r\n for (const key of Object.keys(this)) {\r\n delete this[key]\r\n }\r\n }\r\n}\r\n","// tslint:disable: variable-name\r\nexport default class SimplePromiseQueue {\r\n private readonly _queue: Array> = []\r\n private _flushing = false\r\n\r\n public enqueue(promise: Promise) {\r\n this._queue.push(promise)\r\n if (!this._flushing) { return this.flushQueue() }\r\n return Promise.resolve()\r\n }\r\n\r\n private flushQueue() {\r\n this._flushing = true\r\n\r\n const chain = (): Promise | void => {\r\n const nextTask = this._queue.shift()\r\n if (nextTask) {\r\n return nextTask.then(chain)\r\n } else {\r\n this._flushing = false\r\n }\r\n }\r\n return Promise.resolve(chain())\r\n }\r\n}\r\n","/**\r\n * Created by championswimmer on 18/07/17.\r\n */\r\nimport merge from 'lodash.merge'\r\nimport {Mutation, MutationPayload, Payload, Plugin, Store} from 'vuex'\r\nimport {AsyncStorage} from './AsyncStorage'\r\nimport MockStorage from './MockStorage'\r\nimport {PersistOptions} from './PersistOptions'\r\nimport SimplePromiseQueue from './SimplePromiseQueue'\r\n\r\n/**\r\n * A class that implements the vuex persistence.\r\n */\r\nexport class VuexPersistence implements PersistOptions {\r\n public asyncStorage: boolean\r\n public storage: Storage | AsyncStorage\r\n public restoreState: (key: string, storage?: AsyncStorage | Storage) => Promise | S\r\n public saveState: (key: string, state: {}, storage?: AsyncStorage | Storage, mutation?: string) => Promise | void\r\n public reducer: (state: S) => {}\r\n public key: string\r\n public filter: (mutation: Payload) => boolean\r\n public modules: string[]\r\n public strictMode: boolean\r\n\r\n /**\r\n * The plugin function that can be used inside a vuex store.\r\n */\r\n public plugin: Plugin\r\n /**\r\n * A mutation that can be used to restore state\r\n * Helpful if we are running in strict mode\r\n */\r\n public RESTORE_MUTATION: Mutation\r\n public subscribed: boolean\r\n\r\n // tslint:disable-next-line:variable-name\r\n private _mutex = new SimplePromiseQueue()\r\n\r\n /**\r\n * Create a {@link VuexPersistence} object.\r\n * Use the plugin function of this class as a\r\n * Vuex plugin.\r\n * @param {PersistOptions} options\r\n */\r\n public constructor(options: PersistOptions) {\r\n this.key = ((options.key != null) ? options.key : 'vuex')\r\n\r\n this.subscribed = false\r\n\r\n this.storage =\r\n ((options.storage != null) ? options.storage : (new MockStorage()))\r\n\r\n /**\r\n * How this works is -\r\n * 1. If there is options.reducer function, we use that, if not;\r\n * 2. We check options.modules;\r\n * 1. If there is no options.modules array, we use entire state in reducer\r\n * 2. Otherwise, we create a reducer that merges all those state modules that are\r\n * defined in the options.modules[] array\r\n * @type {((state: S) => {}) | ((state: S) => S) | ((state: any) => {})}\r\n */\r\n this.reducer = (\r\n (options.reducer != null)\r\n ? options.reducer\r\n : (\r\n (options.modules == null)\r\n ? ((state: S) => state)\r\n : (\r\n (state: any) =>\r\n (options.modules as string[]).reduce((a, i) =>\r\n merge(a, { [i]: state[i] }), {})\r\n )\r\n )\r\n )\r\n\r\n this.filter = (\r\n (options.filter != null)\r\n ? options.filter\r\n : ((mutation) => true)\r\n )\r\n\r\n this.strictMode = options.strictMode || false\r\n\r\n this.RESTORE_MUTATION = function RESTORE_MUTATION(state: S, savedState: any) {\r\n (this as any)._vm.$set(state, merge(state, savedState))\r\n }\r\n\r\n this.asyncStorage = options.asyncStorage || false\r\n const storageConfig = ((this.storage) as any)._config\r\n this.asyncStorage = (storageConfig && storageConfig.name) === 'localforage'\r\n\r\n if (this.asyncStorage) {\r\n\r\n /**\r\n * Async {@link #VuexPersistence.restoreState} implementation\r\n * @type {((key: string, storage?: Storage) =>\r\n * (Promise | S)) | ((key: string, storage: AsyncStorage) => Promise)}\r\n */\r\n this.restoreState = (\r\n (options.restoreState != null)\r\n ? options.restoreState\r\n : ((key: string, storage: AsyncStorage) =>\r\n (storage ).getItem(key)\r\n .then((value) =>\r\n typeof value === 'string' // If string, parse, or else, just return\r\n ? JSON.parse(value || '{}')\r\n : (value || {})\r\n )\r\n )\r\n )\r\n\r\n /**\r\n * Async {@link #VuexPersistence.saveState} implementation\r\n * @type {((key: string, state: {}, storage?: Storage, mutation?: string) =>\r\n * (Promise | void)) | ((key: string, state: {}, storage?: Storage, mutation?: string) => Promise)}\r\n */\r\n this.saveState = (\r\n (options.saveState != null)\r\n ? options.saveState\r\n : ((key: string, state: {}, storage: AsyncStorage, mutation: string) =>\r\n (storage).setItem(\r\n key, // Second argument is state _object_ if localforage, stringified otherwise\r\n (((storage && storage._config && storage._config.name) === 'localforage')\r\n ? merge({}, state)\r\n : JSON.stringify(state) as any),\r\n mutation\r\n )\r\n )\r\n )\r\n\r\n /**\r\n * Async version of plugin\r\n * @param {Store} store\r\n */\r\n this.plugin = (store: Store) => {\r\n ((this.restoreState(this.key, this.storage)) as Promise).then((savedState) => {\r\n /**\r\n * If in strict mode, do only via mutation\r\n */\r\n if (this.strictMode) {\r\n store.commit('RESTORE_MUTATION', savedState)\r\n } else {\r\n store.replaceState(merge(store.state, savedState))\r\n }\r\n\r\n this.subscriber(store)((mutation: MutationPayload, state: S) => {\r\n if (this.filter(mutation)) {\r\n this._mutex.enqueue(\r\n this.saveState(this.key, this.reducer(state), this.storage, mutation.type) as Promise\r\n )\r\n }\r\n })\r\n this.subscribed = true\r\n })\r\n }\r\n } else {\r\n\r\n /**\r\n * Sync {@link #VuexPersistence.restoreState} implementation\r\n * @type {((key: string, storage?: Storage) =>\r\n * (Promise | S)) | ((key: string, storage: Storage) => (any | string | {}))}\r\n */\r\n this.restoreState = (\r\n (options.restoreState != null)\r\n ? options.restoreState\r\n : ((key: string, storage: Storage) => {\r\n const value = (storage).getItem(key)\r\n if (typeof value === 'string') {// If string, parse, or else, just return\r\n return JSON.parse(value || '{}')\r\n } else {\r\n return (value || {})\r\n }\r\n })\r\n )\r\n\r\n /**\r\n * Sync {@link #VuexPersistence.saveState} implementation\r\n * @type {((key: string, state: {}, storage?: Storage, mutation?: string) =>\r\n * (Promise | void)) | ((key: string, state: {}, storage?: Storage, mutation?: string) => Promise)}\r\n */\r\n this.saveState = (\r\n (options.saveState != null)\r\n ? options.saveState\r\n : ((key: string, state: {}, storage: Storage | any, mutation: string) =>\r\n (storage).setItem(\r\n key, // Second argument is state _object_ if localforage, stringified otherwise\r\n JSON.stringify(state) as any,\r\n mutation\r\n )\r\n )\r\n )\r\n\r\n /**\r\n * Sync version of plugin\r\n * @param {Store} store\r\n */\r\n this.plugin = (store: Store) => {\r\n const savedState = this.restoreState(this.key, this.storage) as S\r\n\r\n if (this.strictMode) {\r\n store.commit('RESTORE_MUTATION', savedState)\r\n } else {\r\n store.replaceState(merge(store.state, savedState))\r\n }\r\n\r\n this.subscriber(store)((mutation: MutationPayload, state: S) => {\r\n if (this.filter(mutation)) {\r\n this.saveState(this.key, this.reducer(state), this.storage, mutation.type)\r\n }\r\n })\r\n\r\n this.subscribed = true\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a subscriber on the store. automatically is used\r\n * when this is used a vuex plugin. Not for manual usage.\r\n * @param store\r\n */\r\n private subscriber = (store: Store) =>\r\n (handler: (mutation: MutationPayload, state: S) => any) => store.subscribe(handler)\r\n}\r\n\r\nexport {\r\n MockStorage, AsyncStorage, PersistOptions\r\n}\r\n\r\nexport default VuexPersistence\r\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6434a47..02f6830 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@types/chai": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.1.tgz", - "integrity": "sha512-DWrdkraJO+KvBB7+Jc6AuDd2+fwV6Z9iK8cqEEoYpcurYrH7GiUZmwjFuQIIWj5HhFz6NsSxdN72YMIHT7Fy2Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz", + "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==", "dev": true }, "@types/fs-extra": { @@ -32,9 +32,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.69", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.69.tgz", - "integrity": "sha512-eWxq5qGxNSklW7FYt3EFGkayngxHAa5nPzC2cQdamt68BCvlZWPT6WAPFzQ8tKr4EPajJxmSRq0HvyxdspJvDg==", + "version": "4.14.97", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.97.tgz", + "integrity": "sha512-uIKSroywPzhFYw6azoXK2ChfgW/lTfeiNDJKSGOp5RQSAvMdKMI1g0C1NqdU3I9k9bb8iwcWXGwA0n+JSn/N3A==", "dev": true }, "@types/lodash.merge": { @@ -43,7 +43,7 @@ "integrity": "sha512-bOCCutkbehfCeiSqJO5XcVKjsJvX28dgvjhs4aMmBAHAsOy2oOJQwHuIZ0elI1E94qQIdEsCvz8oLgUumd6teA==", "dev": true, "requires": { - "@types/lodash": "4.14.69" + "@types/lodash": "4.14.97" } }, "@types/marked": { @@ -59,9 +59,9 @@ "dev": true }, "@types/mocha": { - "version": "2.2.41", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.41.tgz", - "integrity": "sha1-4nzwgXFT658nE7LT9saPHhw8pgg=", + "version": "2.2.47", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.47.tgz", + "integrity": "sha512-v/lko8AvmTt1K8p+ebdhdiHJE7zpPBYsDKjJSNCl8GwPGkKe5xND7s6M36LKye/USbWSPA7gYCDL0+DZ5h0L6Q==", "dev": true }, "@types/node": { @@ -79,18 +79,24 @@ "@types/node": "8.0.47" } }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=", - "dev": true - }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -145,15 +151,9 @@ "dev": true }, "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "ast-types": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz", - "integrity": "sha1-ju8IJ/BN/w7IhXupJavj/qYZTlI=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "async": { @@ -168,12 +168,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base62": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", - "integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=", - "dev": true - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -220,17 +214,17 @@ } }, "chai": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.0.tgz", - "integrity": "sha1-MxoDkbVcOvh0CunDt0WLwcOAXm0=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.0.2", + "assertion-error": "1.1.0", "check-error": "1.0.2", - "deep-eql": "2.0.2", + "deep-eql": "3.0.1", "get-func-name": "2.0.0", "pathval": "1.1.0", - "type-detect": "4.0.3" + "type-detect": "4.0.7" } }, "chalk": { @@ -298,12 +292,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -321,20 +309,12 @@ "optional": true }, "deep-eql": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", - "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "3.0.0" - }, - "dependencies": { - "type-detect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", - "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", - "dev": true - } + "type-detect": "4.0.7" } }, "diff": { @@ -343,17 +323,6 @@ "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", "dev": true }, - "es3ify": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es3ify/-/es3ify-0.1.4.tgz", - "integrity": "sha1-rZ+l3xrjTz8x4SEbWBiy1RB439E=", - "dev": true, - "requires": { - "esprima-fb": "3001.1.0-dev-harmony-fb", - "jstransform": "3.0.0", - "through": "2.3.8" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -372,18 +341,6 @@ "semver": "5.3.0" } }, - "esmangle-evaluator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz", - "integrity": "sha1-Yg2GbvSGGzMR91dm1SqFcrs8YzY=", - "dev": true - }, - "esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=", - "dev": true - }, "estree-walker": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz", @@ -417,26 +374,6 @@ "is-extglob": "1.0.0" } }, - "falafel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", - "integrity": "sha1-wY0k71CRF0pJfzGM0ksCaiXN2rQ=", - "dev": true, - "requires": { - "acorn": "1.2.2", - "foreach": "2.0.5", - "isarray": "0.0.1", - "object-keys": "1.0.11" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -471,12 +408,6 @@ "for-in": "1.0.2" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "fs-extra": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", @@ -626,16 +557,6 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "inline-process-browser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inline-process-browser/-/inline-process-browser-1.0.0.tgz", - "integrity": "sha1-RqYbFT3TybFiSxoAYm7bT39BTyI=", - "dev": true, - "requires": { - "falafel": "1.2.0", - "through2": "0.6.5" - } - }, "interpret": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", @@ -729,28 +650,6 @@ "graceful-fs": "4.1.11" } }, - "jstransform": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-3.0.0.tgz", - "integrity": "sha1-olkats7o2XvzvoMNv6IxO4fNZAs=", - "dev": true, - "requires": { - "base62": "0.1.1", - "esprima-fb": "3001.1.0-dev-harmony-fb", - "source-map": "0.1.31" - }, - "dependencies": { - "source-map": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", - "integrity": "sha1-n3BNDWnZ4TioG63267T94z0VHGE=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -768,24 +667,21 @@ "optional": true }, "lie": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.0.2.tgz", - "integrity": "sha1-/9oh17uibzd8rYZdNkmy/Izjn+o=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "dev": true, "requires": { - "es3ify": "0.1.4", - "immediate": "3.0.6", - "inline-process-browser": "1.0.0", - "unreachable-branch-transform": "0.3.0" + "immediate": "3.0.6" } }, "localforage": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.5.3.tgz", - "integrity": "sha1-aYqhavECI0CyQL6dkxkuivAi/xY=", + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.5.6.tgz", + "integrity": "sha1-0DTRXlNy7pfGQXPpqa65aBX13QY=", "dev": true, "requires": { - "lie": "3.0.2" + "lie": "3.1.1" } }, "lodash": { @@ -806,9 +702,9 @@ "dev": true }, "make-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.2.tgz", + "integrity": "sha512-l9ra35l5VWLF24y75Tg8XgfGLX0ueRhph118WKM6H5denx4bB5QF59+4UAm9oJ2qsPQZas/CQUDdtDdfvYHBdQ==", "dev": true }, "marked": { @@ -913,15 +809,15 @@ } }, "nyc": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.0.3.tgz", - "integrity": "sha1-DCi8ZpqFFiFwm/eghQMDS+44ErY=", + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.4.1.tgz", + "integrity": "sha512-5eCZpvaksFVjP2rt1r60cfXmt3MUtsQDw8bAzNqNEr4WLvUMLgiVENMf/B9bE9YAX0mGVvaGA3v9IS9ekNqB1Q==", "dev": true, "requires": { "archy": "1.0.0", "arrify": "1.0.1", "caching-transform": "1.0.1", - "convert-source-map": "1.5.0", + "convert-source-map": "1.5.1", "debug-log": "1.0.1", "default-require-extensions": "1.0.0", "find-cache-dir": "0.1.1", @@ -929,22 +825,22 @@ "foreground-child": "1.5.6", "glob": "7.1.2", "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.7.3", - "istanbul-lib-report": "1.1.1", - "istanbul-lib-source-maps": "1.2.1", - "istanbul-reports": "1.1.1", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-report": "1.1.2", + "istanbul-lib-source-maps": "1.2.2", + "istanbul-reports": "1.1.3", "md5-hex": "1.3.0", "merge-source-map": "1.0.4", "micromatch": "2.3.11", "mkdirp": "0.5.1", "resolve-from": "2.0.0", - "rimraf": "2.6.1", + "rimraf": "2.6.2", "signal-exit": "3.0.2", - "spawn-wrap": "1.3.7", + "spawn-wrap": "1.4.2", "test-exclude": "4.1.1", - "yargs": "8.0.2", - "yargs-parser": "5.0.0" + "yargs": "10.0.3", + "yargs-parser": "8.0.0" }, "dependencies": { "align-text": { @@ -990,11 +886,11 @@ "bundled": true, "dev": true, "requires": { - "arr-flatten": "1.0.3" + "arr-flatten": "1.1.0" } }, "arr-flatten": { - "version": "1.0.3", + "version": "1.1.0", "bundled": true, "dev": true }, @@ -1014,27 +910,27 @@ "dev": true }, "babel-code-frame": { - "version": "6.22.0", + "version": "6.26.0", "bundled": true, "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", - "js-tokens": "3.0.1" + "js-tokens": "3.0.2" } }, "babel-generator": { - "version": "6.25.0", + "version": "6.26.0", "bundled": true, "dev": true, "requires": { "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", "lodash": "4.17.4", - "source-map": "0.5.6", + "source-map": "0.5.7", "trim-right": "1.0.1" } }, @@ -1043,59 +939,59 @@ "bundled": true, "dev": true, "requires": { - "babel-runtime": "6.23.0" + "babel-runtime": "6.26.0" } }, "babel-runtime": { - "version": "6.23.0", + "version": "6.26.0", "bundled": true, "dev": true, "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" } }, "babel-template": { - "version": "6.25.0", + "version": "6.26.0", "bundled": true, "dev": true, "requires": { - "babel-runtime": "6.23.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", "lodash": "4.17.4" } }, "babel-traverse": { - "version": "6.25.0", + "version": "6.26.0", "bundled": true, "dev": true, "requires": { - "babel-code-frame": "6.22.0", + "babel-code-frame": "6.26.0", "babel-messages": "6.23.0", - "babel-runtime": "6.23.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.2", "lodash": "4.17.4" } }, "babel-types": { - "version": "6.25.0", + "version": "6.26.0", "bundled": true, "dev": true, "requires": { - "babel-runtime": "6.23.0", + "babel-runtime": "6.26.0", "esutils": "2.0.2", "lodash": "4.17.4", "to-fast-properties": "1.0.3" } }, "babylon": { - "version": "6.17.4", + "version": "6.18.0", "bundled": true, "dev": true }, @@ -1201,12 +1097,12 @@ "dev": true }, "convert-source-map": { - "version": "1.5.0", + "version": "1.5.1", "bundled": true, "dev": true }, "core-js": { - "version": "2.4.1", + "version": "2.5.3", "bundled": true, "dev": true }, @@ -1216,11 +1112,11 @@ "dev": true, "requires": { "lru-cache": "4.1.1", - "which": "1.2.14" + "which": "1.3.0" } }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, "dev": true, "requires": { @@ -1272,17 +1168,29 @@ "dev": true }, "execa": { - "version": "0.5.1", + "version": "0.7.0", "bundled": true, "dev": true, "requires": { - "cross-spawn": "4.0.2", - "get-stream": "2.3.1", + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", "is-stream": "1.1.0", "npm-run-path": "2.0.2", "p-finally": "1.0.0", "signal-exit": "3.0.2", "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } } }, "expand-brackets": { @@ -1377,13 +1285,9 @@ "dev": true }, "get-stream": { - "version": "2.3.1", + "version": "3.0.0", "bundled": true, - "dev": true, - "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" - } + "dev": true }, "glob": { "version": "7.1.2", @@ -1426,7 +1330,7 @@ "dev": true }, "handlebars": { - "version": "4.0.10", + "version": "4.0.11", "bundled": true, "dev": true, "requires": { @@ -1460,7 +1364,7 @@ "dev": true }, "hosted-git-info": { - "version": "2.4.2", + "version": "2.5.0", "bundled": true, "dev": true }, @@ -1502,7 +1406,7 @@ "dev": true }, "is-buffer": { - "version": "1.1.5", + "version": "1.1.6", "bundled": true, "dev": true }, @@ -1613,7 +1517,7 @@ "dev": true }, "istanbul-lib-hook": { - "version": "1.0.7", + "version": "1.1.0", "bundled": true, "dev": true, "requires": { @@ -1621,21 +1525,21 @@ } }, "istanbul-lib-instrument": { - "version": "1.7.3", + "version": "1.9.1", "bundled": true, "dev": true, "requires": { - "babel-generator": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", "istanbul-lib-coverage": "1.1.1", - "semver": "5.3.0" + "semver": "5.4.1" } }, "istanbul-lib-report": { - "version": "1.1.1", + "version": "1.1.2", "bundled": true, "dev": true, "requires": { @@ -1656,27 +1560,37 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.1", + "version": "1.2.2", "bundled": true, "dev": true, "requires": { - "debug": "2.6.8", + "debug": "3.1.0", "istanbul-lib-coverage": "1.1.1", "mkdirp": "0.5.1", - "rimraf": "2.6.1", - "source-map": "0.5.6" + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "istanbul-reports": { - "version": "1.1.1", + "version": "1.1.3", "bundled": true, "dev": true, "requires": { - "handlebars": "4.0.10" + "handlebars": "4.0.11" } }, "js-tokens": { - "version": "3.0.1", + "version": "3.0.2", "bundled": true, "dev": true }, @@ -1690,7 +1604,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } }, "lazy-cache": { @@ -1750,7 +1664,7 @@ "bundled": true, "dev": true, "requires": { - "js-tokens": "3.0.1" + "js-tokens": "3.0.2" } }, "lru-cache": { @@ -1788,7 +1702,7 @@ "bundled": true, "dev": true, "requires": { - "source-map": "0.5.6" + "source-map": "0.5.7" } }, "micromatch": { @@ -1808,7 +1722,7 @@ "normalize-path": "2.1.1", "object.omit": "2.0.1", "parse-glob": "3.0.4", - "regex-cache": "0.4.3" + "regex-cache": "0.4.4" } }, "mimic-fn": { @@ -1843,13 +1757,13 @@ "dev": true }, "normalize-package-data": { - "version": "2.3.8", + "version": "2.4.0", "bundled": true, "dev": true, "requires": { - "hosted-git-info": "2.4.2", + "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "5.3.0", + "semver": "5.4.1", "validate-npm-package-license": "3.0.1" } }, @@ -1858,7 +1772,7 @@ "bundled": true, "dev": true, "requires": { - "remove-trailing-separator": "1.0.2" + "remove-trailing-separator": "1.1.0" } }, "npm-run-path": { @@ -1911,11 +1825,11 @@ "dev": true }, "os-locale": { - "version": "2.0.0", + "version": "2.1.0", "bundled": true, "dev": true, "requires": { - "execa": "0.5.1", + "execa": "0.7.0", "lcid": "1.0.0", "mem": "1.1.0" } @@ -2059,7 +1973,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } @@ -2069,7 +1983,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } @@ -2080,7 +1994,7 @@ "dev": true, "requires": { "load-json-file": "1.1.0", - "normalize-package-data": "2.3.8", + "normalize-package-data": "2.4.0", "path-type": "1.1.0" } }, @@ -2105,21 +2019,20 @@ } }, "regenerator-runtime": { - "version": "0.10.5", + "version": "0.11.1", "bundled": true, "dev": true }, "regex-cache": { - "version": "0.4.3", + "version": "0.4.4", "bundled": true, "dev": true, "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" + "is-equal-shallow": "0.1.3" } }, "remove-trailing-separator": { - "version": "1.0.2", + "version": "1.1.0", "bundled": true, "dev": true }, @@ -2166,7 +2079,7 @@ } }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "dev": true, "requires": { @@ -2174,7 +2087,7 @@ } }, "semver": { - "version": "5.3.0", + "version": "5.4.1", "bundled": true, "dev": true }, @@ -2183,6 +2096,19 @@ "bundled": true, "dev": true }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "signal-exit": { "version": "3.0.2", "bundled": true, @@ -2194,21 +2120,21 @@ "dev": true }, "source-map": { - "version": "0.5.6", + "version": "0.5.7", "bundled": true, "dev": true }, "spawn-wrap": { - "version": "1.3.7", + "version": "1.4.2", "bundled": true, "dev": true, "requires": { "foreground-child": "1.5.6", "mkdirp": "0.5.1", "os-homedir": "1.0.2", - "rimraf": "2.6.1", + "rimraf": "2.6.2", "signal-exit": "3.0.2", - "which": "1.2.14" + "which": "1.3.0" } }, "spdx-correct": { @@ -2230,18 +2156,31 @@ "dev": true }, "string-width": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "3.0.1" + "strip-ansi": "4.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "bundled": true, "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } } } }, @@ -2299,7 +2238,7 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.6", + "source-map": "0.5.7", "uglify-to-browserify": "1.0.2", "yargs": "3.10.0" }, @@ -2334,7 +2273,7 @@ } }, "which": { - "version": "1.2.14", + "version": "1.3.0", "bundled": true, "dev": true, "requires": { @@ -2404,30 +2343,24 @@ "dev": true }, "yargs": { - "version": "8.0.2", + "version": "10.0.3", "bundled": true, "dev": true, "requires": { - "camelcase": "4.1.0", "cliui": "3.2.0", "decamelize": "1.2.0", + "find-up": "2.1.0", "get-caller-file": "1.0.2", - "os-locale": "2.0.0", - "read-pkg-up": "2.0.0", + "os-locale": "2.1.0", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", - "string-width": "2.0.0", + "string-width": "2.1.1", "which-module": "2.0.0", "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "yargs-parser": "8.0.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, "cliui": { "version": "3.2.0", "bundled": true, @@ -2449,70 +2382,19 @@ } } } - }, - "load-json-file": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.3.8", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "yargs-parser": { - "version": "7.0.0", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "4.1.0" - } } } }, "yargs-parser": { - "version": "5.0.0", + "version": "8.0.0", "bundled": true, "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", + "version": "4.1.0", "bundled": true, "dev": true } @@ -2520,12 +2402,6 @@ } } }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -2597,12 +2473,6 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", @@ -2650,46 +2520,6 @@ } } }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "recast": { - "version": "0.10.43", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.43.tgz", - "integrity": "sha1-uV1Q9tYHYaX2JS4V2AZ4FoSRzn8=", - "dev": true, - "requires": { - "ast-types": "0.8.15", - "esprima-fb": "15001.1001.0-dev-harmony-fb", - "private": "0.1.8", - "source-map": "0.5.6" - }, - "dependencies": { - "esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", - "dev": true - } - } - }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -2755,21 +2585,32 @@ } }, "rollup": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.50.0.tgz", - "integrity": "sha512-7RqCBQ9iwsOBPkjYgoIaeUij606mSkDMExP0NT7QDI3bqkHYQHrQ83uoNIXwPcQm/vP2VbsUz3kiyZZ1qPlLTQ==", + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.55.1.tgz", + "integrity": "sha512-lV8lBkpA1PXsshgu8zy51QrGPvWDIhZjcShEyMKk/Riobz4xwutSb0TjAtRyS6wtnn5LNVmCL7KIj4pirOhEdw==", "dev": true }, "rollup-plugin-typescript2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.7.0.tgz", - "integrity": "sha1-Ez0NesWpIRGAVAxlCzL7tfaTAsA=", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.10.0.tgz", + "integrity": "sha512-Sa2/lFV6VvaMmydyt5lL9L6lk78v2X3x1YpATl2hZIyI/HuiRpP0ls5T3Tmfk3Mniuxx33HXUfmcseIvevqI8Q==", "dev": true, "requires": { "fs-extra": "4.0.2", - "resolve": "1.4.0", + "resolve": "1.5.0", "rollup-pluginutils": "2.0.1", - "tslib": "1.8.0" + "tslib": "1.9.0" + }, + "dependencies": { + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + } } }, "rollup-pluginutils": { @@ -2803,23 +2644,26 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true + "dev": true, + "optional": true }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", + "integrity": "sha512-eKkTgWYeBOQqFGXRfKabMFdnWepo51vWqEdoeikaEPFiJC7MCU5j2h4+6Q8npkZTeLGbSyecZvRxiSoWl3rh+w==", "dev": true, "requires": { - "source-map": "0.5.6" + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -2841,22 +2685,6 @@ "has-flag": "2.0.0" } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -2867,19 +2695,19 @@ } }, "ts-node": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz", - "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", + "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.0", "diff": "3.4.0", - "make-error": "1.3.0", + "make-error": "1.3.2", "minimist": "1.2.0", "mkdirp": "0.5.1", - "source-map-support": "0.4.18", - "tsconfig": "6.0.0", + "source-map-support": "0.5.3", + "tsconfig": "7.0.0", "v8flags": "3.0.1", "yn": "2.0.0" }, @@ -2893,25 +2721,27 @@ } }, "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", "dev": true, "requires": { + "@types/strip-bom": "3.0.0", + "@types/strip-json-comments": "0.0.30", "strip-bom": "3.0.0", "strip-json-comments": "2.0.1" } }, "tslib": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", - "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", "dev": true }, "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.7.tgz", + "integrity": "sha512-4Rh17pAMVdMWzktddFhISRnUnFIStObtUMNGzDwlA6w/77bmGv3aBbRdCmQR6IjzfkTo9otnW+2K/cDRhKSxDA==", "dev": true }, "typedoc": { @@ -2960,9 +2790,9 @@ "dev": true }, "typescript": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", "dev": true }, "uglify-js": { @@ -2990,17 +2820,6 @@ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", "dev": true }, - "unreachable-branch-transform": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unreachable-branch-transform/-/unreachable-branch-transform-0.3.0.tgz", - "integrity": "sha1-2ZzExudG0mSSiEW2EdtUsPNHTKo=", - "dev": true, - "requires": { - "esmangle-evaluator": "1.0.1", - "recast": "0.10.43", - "through2": "0.6.5" - } - }, "v8flags": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", @@ -3011,9 +2830,9 @@ } }, "vue": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.4.1.tgz", - "integrity": "sha512-V/3mbqPeXJf+AEdm2Qdrho8ADjN2/Th+q7abrDqQrGaERgtlGPLe8SRLDzJ2eNEV4Gh+L8T/vfbxb2sLUfwYbA==", + "version": "2.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.13.tgz", + "integrity": "sha512-3D+lY7HTkKbtswDM4BBHgqyq+qo8IAEE8lz8va1dz3LLmttjgo0FxairO4r1iN2OBqk8o1FyL4hvzzTFEdQSEw==", "dev": true }, "vuex": { @@ -3041,12 +2860,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", diff --git a/package.json b/package.json index 7a9b700..84d1c0e 100644 --- a/package.json +++ b/package.json @@ -43,23 +43,23 @@ }, "homepage": "https://github.com/championswimmer/vuex-persist#readme", "devDependencies": { - "@types/chai": "^4.0.1", - "@types/lodash": "^4.14.69", + "@types/chai": "^4.1.2", + "@types/lodash": "^4.14.97", "@types/lodash.merge": "^4.6.3", - "@types/mocha": "^2.2.41", - "chai": "^4.1.0", - "localforage": "^1.5.3", + "@types/mocha": "^2.2.47", + "chai": "^4.1.2", + "localforage": "^1.5.6", "mkdirp": "^0.5.1", "mocha": "^4.0.0", - "nyc": "^11.0.3", + "nyc": "^11.4.1", "rimraf": "^2.6.2", - "rollup": "^0.50.0", - "rollup-plugin-typescript2": "^0.7.0", + "rollup": "^0.55.1", + "rollup-plugin-typescript2": "^0.10.0", "touch": "^3.1.0", - "ts-node": "^3.3.0", + "ts-node": "^4.1.0", "typedoc": "^0.9.0", - "typescript": "^2.5.3", - "vue": "^2.4.1", + "typescript": "^2.6.2", + "vue": "^2.5.13", "vuex": "^3.0.1" }, "dependencies": { diff --git a/src/AsyncStorage.ts b/src/AsyncStorage.ts index 97680f6..315ba30 100644 --- a/src/AsyncStorage.ts +++ b/src/AsyncStorage.ts @@ -3,7 +3,7 @@ export interface AsyncStorage { name: string } getItem(key: string): Promise - setItem(key: string, data: T): Promise + setItem(key: string, data: T, mutation: string): Promise removeItem(key: string): Promise clear(): Promise length(): Promise diff --git a/src/MockStorage.ts b/src/MockStorage.ts index 733b953..58630f5 100644 --- a/src/MockStorage.ts +++ b/src/MockStorage.ts @@ -13,7 +13,7 @@ export default class MockStorage implements Storage { return Object.keys(this)[index] } - public setItem(key: string, data: any): void { + public setItem(key: string, data: any, mutation?: string): void { this[key] = data.toString() } public getItem(key: string): string { diff --git a/src/PersistOptions.ts b/src/PersistOptions.ts index 1d569d4..3c09396 100644 --- a/src/PersistOptions.ts +++ b/src/PersistOptions.ts @@ -22,8 +22,9 @@ export interface PersistOptions { * @param key * @param state * @param [storage] + * @param [mutation] */ - saveState?: (key: string, state: {}, storage?: Storage) => Promise | void + saveState?: (key: string, state: {}, storage?: Storage, mutation?: string) => Promise | void /** * Function to reduce state to the object you want to save. diff --git a/src/index.ts b/src/index.ts index 9fa4679..660dc6e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,7 +15,7 @@ export class VuexPersistence implements PersistOptions public asyncStorage: boolean public storage: Storage | AsyncStorage public restoreState: (key: string, storage?: AsyncStorage | Storage) => Promise | S - public saveState: (key: string, state: {}, storage?: AsyncStorage | Storage) => Promise | void + public saveState: (key: string, state: {}, storage?: AsyncStorage | Storage, mutation?: string) => Promise | void public reducer: (state: S) => {} public key: string public filter: (mutation: Payload) => boolean @@ -111,18 +111,19 @@ export class VuexPersistence implements PersistOptions /** * Async {@link #VuexPersistence.saveState} implementation - * @type {((key: string, state: {}, storage?: Storage) => - * (Promise | void)) | ((key: string, state: {}, storage?: Storage) => Promise)} + * @type {((key: string, state: {}, storage?: Storage, mutation?: string) => + * (Promise | void)) | ((key: string, state: {}, storage?: Storage, mutation?: string) => Promise)} */ this.saveState = ( (options.saveState != null) ? options.saveState - : ((key: string, state: {}, storage: AsyncStorage) => + : ((key: string, state: {}, storage: AsyncStorage, mutation: string) => (storage).setItem( key, // Second argument is state _object_ if localforage, stringified otherwise (((storage && storage._config && storage._config.name) === 'localforage') ? merge({}, state) - : JSON.stringify(state) as any) + : JSON.stringify(state) as any), + mutation ) ) ) @@ -145,7 +146,7 @@ export class VuexPersistence implements PersistOptions this.subscriber(store)((mutation: MutationPayload, state: S) => { if (this.filter(mutation)) { this._mutex.enqueue( - this.saveState(this.key, this.reducer(state), this.storage) as Promise + this.saveState(this.key, this.reducer(state), this.storage, mutation.type) as Promise ) } }) @@ -174,16 +175,17 @@ export class VuexPersistence implements PersistOptions /** * Sync {@link #VuexPersistence.saveState} implementation - * @type {((key: string, state: {}, storage?: Storage) => - * (Promise | void)) | ((key: string, state: {}, storage?: Storage) => Promise)} + * @type {((key: string, state: {}, storage?: Storage, mutation?: string) => + * (Promise | void)) | ((key: string, state: {}, storage?: Storage, mutation?: string) => Promise)} */ this.saveState = ( (options.saveState != null) ? options.saveState - : ((key: string, state: {}, storage: Storage) => + : ((key: string, state: {}, storage: Storage | any, mutation: string) => (storage).setItem( key, // Second argument is state _object_ if localforage, stringified otherwise - JSON.stringify(state) as any + JSON.stringify(state) as any, + mutation ) ) ) @@ -203,7 +205,7 @@ export class VuexPersistence implements PersistOptions this.subscriber(store)((mutation: MutationPayload, state: S) => { if (this.filter(mutation)) { - this.saveState(this.key, this.reducer(state), this.storage) + this.saveState(this.key, this.reducer(state), this.storage, mutation.type) } }) diff --git a/test/vuex-asyncstorage.spec.ts b/test/vuex-asyncstorage.spec.ts index 369a3d3..f58e9ce 100644 --- a/test/vuex-asyncstorage.spec.ts +++ b/test/vuex-asyncstorage.spec.ts @@ -9,7 +9,7 @@ import VuexPersistence from '../dist' import { assert, expect, should } from 'chai' import * as localForage from 'localforage' -const objectStore: { [key: string]: any } = {} +const objectStore: { [key: string]: any } = { barn: {} } const MockForageStorage = { _driver: 'objectStorage', _support: true, @@ -23,8 +23,12 @@ const MockForageStorage = { keys() { }, length() { }, removeItem() { }, - setItem(key: string, data: T): Promise { - return Promise.resolve((objectStore[key] = data)) + setItem(key: string, data: T | any, mutation: string): Promise { + if (mutation !== 'cowMoo') + return Promise.resolve(objectStore[key] = data) + else { + return Promise.resolve(objectStore['barn'].cow = data.cow) + } } } @@ -36,8 +40,8 @@ localForage.setDriver('objectStorage') const vuexPersist = new VuexPersistence({ storage: localForage, key: 'dafuq', - reducer: (state) => ({ dog: state.dog }), - filter: (mutation) => (mutation.type === 'dogBark') + reducer: (state) => ({ dog: state.dog, cow: state.cow }), + filter: (mutation) => (mutation.type !== 'catMew') }) const store = new Store({ @@ -47,6 +51,9 @@ const store = new Store({ }, cat: { mews: 0 + }, + cow: { + moos: 0 } }, mutations: { @@ -55,12 +62,15 @@ const store = new Store({ }, catMew(state) { state.cat.mews++ + }, + cowMoo(state) { + state.cow.moos++ } }, plugins: [vuexPersist.plugin] }) -describe('Storage: AsyncStorage; Test: reducer, filter; Strict Mode: OFF', () => { +describe('Storage: AsyncStorage; Test: reducer, filter, mutation; Strict Mode: OFF', () => { before(() => waitUntil(() => vuexPersist.subscribed)) it('should persist reduced state', async () => { await waitUntil(() => vuexPersist.subscribed) @@ -68,6 +78,11 @@ describe('Storage: AsyncStorage; Test: reducer, filter; Strict Mode: OFF', () => expect(objectStore["dafuq"]).to.exist expect(objectStore["dafuq"].dog.barks).to.equal(1) }) + it('should handle mutation in the storage', async () => { + store.commit('cowMoo') + expect(objectStore["barn"].cow.moos).to.equal(1) + expect(objectStore["dafuq"].cow.moos).to.equal(0) + }) it('should not persist non reduced state', async () => { store.commit('catMew') expect(objectStore["dafuq"].cat).to.be.undefined @@ -83,4 +98,4 @@ function waitUntil(condition: () => boolean): Promise { } resolve() }) -} \ No newline at end of file +} diff --git a/tsconfig.json b/tsconfig.json index ce29eaa..b06a53d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,4 +23,4 @@ "node_modules", "test/**/*" ] -} \ No newline at end of file +}