angular2-hmr
Version:
angular2-hmr: Hot Module Replacement for Webpack and Angular 2
56 lines (45 loc) • 1.53 kB
text/typescript
import {HmrStore} from './hmr-store';
// noop in parentNode
// TODO: find a better way to noop
const _env = typeof process !== 'undefined' &&
process &&
process.env &&
(process.env.ENV ||
process.env.NODE_ENV);
let _dev: boolean = ((
_env &&
typeof _env === 'string' &&
(_env.indexOf('dev') > -1)
) || // default true
_env === undefined);
export function setDev(newDev: string | boolean): boolean | void {
if (typeof newDev === 'string') {
return _dev = (newDev.indexOf('dev') > -1);
} else if (typeof newDev === 'boolean') {
return _dev = newDev;
}
throw new Error('Please provide a string or boolean');
}
export function HmrState(namespaceOrConfig?: string | any, config?: any): Function {
function decoratorFactory(target: any, decoratedPropertyName?: string, descriptor?: any): void {
if (!_dev) { return descriptor; }
let key = namespaceOrConfig || target.constructor.name + '#' + decoratedPropertyName;
HmrStore.select(key, () => HmrStore.get(key));
Object.defineProperty(target, decoratedPropertyName, {
get: () => HmrStore.get(key),
set: (newValue?: any) => {
let currentValue = HmrStore.get(key);
if (!currentValue) {
HmrStore._initialValues[key] = newValue;
} else {
newValue = Object.assign(newValue, currentValue);
}
return HmrStore.set(key, newValue);
},
enumerable: true,
configurable: true
});
return descriptor;
}
return decoratorFactory;
}