import {Provider, OpaqueToken, Optional, Inject} from 'angular2/core'; export const WEBPACK_HMR = new OpaqueToken('$$AppState'); export class WebpackState { private _state = {}; private _noop = Function.prototype; private _states = []; constructor(@Optional() @Inject(WEBPACK_HMR) state?: any) { if (state) { console.log('WebpackState initial data', state); } this._state = state || this._state; } set(prop, value) { this._state[prop] = value; return this._state[prop]; } get(prop) { return this._state[prop]; } select(name, getState) { this._states.push({ name, getState }); let defaultData = getState(); let currentData = this.get(name); if (defaultData && !currentData) { return this.set(name, defaultData); } else if (defaultData && currentData) { return this.set(name, (Object).assign({}, defaultData, currentData)); } else { return this.set(name, currentData || defaultData); } } dispose() { this._states = []; } getState() { let initialState = (Object).assign({}, this._state); return this._states .reduce((memo, item) => { memo[item.name] = item.getState(); return memo; }, initialState); } toJSON() { return this.getState(); } } export function provideInitialState(initialState = {}): Array { return [ new Provider(WEBPACK_HMR, {useValue: initialState }), new Provider(WebpackState, {useClass: WebpackState}) ]; }