ngrx-store-localstorage
Advanced tools
Comparing version 0.0.7 to 0.0.8
@@ -1,3 +0,1 @@ | ||
import { Provider } from '@angular/core'; | ||
import 'rxjs/add/operator/do'; | ||
export declare const localStorageMiddleware: (keys: string[], rehydrateState?: boolean) => Provider[]; | ||
export declare const localStorageSync: (keys: string[], rehydrate?: boolean) => (reducer: any) => (state: {}, action: any) => any; |
"use strict"; | ||
var core_1 = require('@angular/core'); | ||
require('rxjs/add/operator/do'); | ||
var store_1 = require('@ngrx/store'); | ||
var _this = this; | ||
var detectDate = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/; | ||
//correctly parse dates from local storage | ||
var parseWithDates = function (jsonData) { | ||
return JSON.parse(jsonData, function (key, value) { | ||
if (typeof value === 'string' && (_this.detectDate.test(value))) { | ||
return new Date(value); | ||
} | ||
return value; | ||
}); | ||
}; | ||
var validateStateKeys = function (keys) { | ||
return keys.map(function (key) { | ||
if (typeof (key) !== 'string') { | ||
throw new TypeError("localStorageMiddleware Unknown Parameter Type: " | ||
throw new TypeError("localStorageSync Unknown Parameter Type: " | ||
+ ("Expected type of string, got " + typeof key)); | ||
@@ -15,3 +23,3 @@ } | ||
var rehydrateApplicationState = function (keys) { | ||
var rehydratedState = keys.reduce(function (acc, curr) { | ||
return keys.reduce(function (acc, curr) { | ||
var stateSlice = localStorage.getItem(curr); | ||
@@ -24,27 +32,28 @@ if (stateSlice) { | ||
}, {}); | ||
return core_1.provide(store_1.INITIAL_STATE, { useValue: rehydratedState }); | ||
}; | ||
var createLocalStorageMiddleware = function (keys) { | ||
var stateKeys = validateStateKeys(keys); | ||
return function (obs) { | ||
return obs.do(function (state) { | ||
stateKeys.forEach(function (key) { | ||
var stateSlice = state[key]; | ||
if (typeof (stateSlice) !== 'undefined') { | ||
localStorage.setItem(key, JSON.stringify(state[key])); | ||
} | ||
}); | ||
}); | ||
var syncStateUpdate = function (state, keys) { | ||
keys.forEach(function (key) { | ||
var stateSlice = state[key]; | ||
if (typeof (stateSlice) !== 'undefined') { | ||
try { | ||
localStorage.setItem(key, JSON.stringify(state[key])); | ||
} | ||
catch (e) { | ||
console.warn('Unable to save state to localStorage:', e); | ||
} | ||
} | ||
}); | ||
}; | ||
exports.localStorageSync = function (keys, rehydrate) { | ||
if (rehydrate === void 0) { rehydrate = false; } | ||
return function (reducer) { | ||
var stateKeys = validateStateKeys(keys); | ||
var rehydratedState = rehydrate ? rehydrateApplicationState(stateKeys) : undefined; | ||
return function (state, action) { | ||
if (state === void 0) { state = rehydratedState; } | ||
var nextState = reducer(state, action); | ||
syncStateUpdate(nextState, stateKeys); | ||
return nextState; | ||
}; | ||
}; | ||
}; | ||
exports.localStorageMiddleware = function (keys, rehydrateState) { | ||
if (rehydrateState === void 0) { rehydrateState = false; } | ||
var middleware = createLocalStorageMiddleware(keys); | ||
var localStorageProvider = core_1.provide(store_1.POST_MIDDLEWARE, { | ||
multi: true, | ||
useValue: middleware | ||
}); | ||
return rehydrateState | ||
? [localStorageProvider, rehydrateApplicationState(keys)] | ||
: [localStorageProvider]; | ||
}; |
{ | ||
"name": "ngrx-store-localstorage", | ||
"version": "0.0.7", | ||
"version": "0.0.8", | ||
"description": "State and local storage syncing for @ngrx/store", | ||
@@ -31,3 +31,3 @@ "main": "./dist/index.js", | ||
"@angular/core": "2.0.0-rc.1", | ||
"@ngrx/store": "^1.5.0" | ||
"@ngrx/store": "^2.0.0" | ||
}, | ||
@@ -34,0 +34,0 @@ "devDependencies": { |
@@ -11,17 +11,21 @@ # ngrx-store-localstorage | ||
``` | ||
1. Configure your ngrx store as normal using `provideStore`. | ||
2. Using the provided `localStorageMiddleware` function, specify the slices of state you would like to keep synced with local storage. | ||
1. Import `compose` and `combineReducers` from `@ngrx/store` | ||
2. Invoke the `localStorageSync` function after `combineReducers`, specifying the slices of state you would like to keep synced with local storage. | ||
3. Optionally specify whether to rehydrate this state from local storage as `initialState` on application bootstrap. | ||
4. Invoke composed function with application reducers as an argument to `provideStore`. | ||
```ts | ||
import {bootstrap} from 'angular2/platform/browser'; | ||
import {bootstrap} from '@angular/platform-browser-dynamic'; | ||
import {TodoApp} from './todo-app'; | ||
import {provideStore} from "@ngrx/store"; | ||
import {localStorageMiddleware} from "ngrx-store-localstorage"; | ||
import {provideStore, compose} from "@ngrx/store"; | ||
import {localStorageSync} from "ngrx-store-localstorage"; | ||
export function main() { | ||
return bootstrap(TodoApp, [ | ||
provideStore({todos, visibilityFilter}), | ||
localStorageMiddleware(['todos', 'visibilityFilter'], true) | ||
provideStore( | ||
compose( | ||
localStorageSync(['todos']), | ||
combineReducers | ||
)({todos, visibilityFilter}) | ||
) | ||
]) | ||
@@ -35,4 +39,5 @@ .catch(err => console.error(err)); | ||
## API | ||
### `localStorageMiddleware(keys : string[], rehydrateState : boolean = false)` | ||
### `localStorageSync(keys : string[], rehydrateState : boolean = false) : Reducer` | ||
Provide state (reducer) keys to sync with local storage. Optionally specify whether to rehydrate `initialState` from local storage on bootstrap. | ||
*Returns a meta-reducer* | ||
@@ -39,0 +44,0 @@ #### Arguments |
@@ -1,6 +0,13 @@ | ||
import {provide, Provider} from '@angular/core'; | ||
import {Observable} from 'rxjs/Observable'; | ||
import 'rxjs/add/operator/do'; | ||
import {POST_MIDDLEWARE, INITIAL_STATE} from '@ngrx/store'; | ||
const detectDate = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/; | ||
//correctly parse dates from local storage | ||
const parseWithDates = (jsonData: string) => { | ||
return JSON.parse(jsonData, (key: any, value: any) => { | ||
if (typeof value === 'string' && (this.detectDate.test(value))) { | ||
return new Date(value); | ||
} | ||
return value; | ||
}); | ||
}; | ||
const validateStateKeys = (keys: string[]) => { | ||
@@ -10,3 +17,3 @@ return keys.map(key => { | ||
throw new TypeError( | ||
`localStorageMiddleware Unknown Parameter Type: ` | ||
`localStorageSync Unknown Parameter Type: ` | ||
+ `Expected type of string, got ${typeof key}` | ||
@@ -20,3 +27,3 @@ ); | ||
const rehydrateApplicationState = (keys: string[]) => { | ||
let rehydratedState = keys.reduce((acc, curr) => { | ||
return keys.reduce((acc, curr) => { | ||
let stateSlice = localStorage.getItem(curr); | ||
@@ -28,30 +35,26 @@ if(stateSlice){ | ||
}, {}); | ||
}; | ||
return provide(INITIAL_STATE, { useValue: rehydratedState }); | ||
const syncStateUpdate = (state : any, keys : string[]) => { | ||
keys.forEach(key => { | ||
let stateSlice = state[key]; | ||
if (typeof(stateSlice) !== 'undefined') { | ||
try{ | ||
localStorage.setItem(key, JSON.stringify(state[key])); | ||
} catch(e){ | ||
console.warn('Unable to save state to localStorage:', e); | ||
} | ||
} | ||
}); | ||
}; | ||
const createLocalStorageMiddleware = (keys : string[]) => { | ||
export const localStorageSync = (keys : string[], rehydrate : boolean = false) => (reducer : any) => { | ||
const stateKeys = validateStateKeys(keys); | ||
return (obs:Observable<any>) => { | ||
return obs.do(state => { | ||
stateKeys.forEach(key => { | ||
let stateSlice = state[key]; | ||
if (typeof(stateSlice) !== 'undefined') { | ||
localStorage.setItem(key, JSON.stringify(state[key])); | ||
} | ||
}); | ||
}); | ||
} | ||
}; | ||
const rehydratedState = rehydrate ? rehydrateApplicationState(stateKeys) : undefined; | ||
export const localStorageMiddleware = (keys : string[], rehydrateState : boolean = false) => { | ||
const middleware = createLocalStorageMiddleware(keys); | ||
const localStorageProvider = provide(POST_MIDDLEWARE, { | ||
multi: true, | ||
useValue: middleware | ||
}); | ||
return rehydrateState | ||
? [localStorageProvider, rehydrateApplicationState(keys)] | ||
: [localStorageProvider] | ||
return function(state = rehydratedState, action : any){ | ||
const nextState = reducer(state, action); | ||
syncStateUpdate(nextState, stateKeys); | ||
return nextState; | ||
}; | ||
}; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
9370
133
44