@datorama/akita
Version:
State Management Tailored-Made for JS Applications
139 lines • 14.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { currentAction, setSkipAction } from './actions';
import { isDefined } from './isDefined';
import { $$addStore, $$deleteStore, $$updateStore } from './dispatchers';
import { __stores__ } from './stores';
import { capitalize } from './captialize';
import { isNotBrowser } from './root';
/** @type {?} */
let subs = [];
/**
* @param {?=} ngZoneOrOptions
* @param {?=} options
* @return {?}
*/
export function akitaDevtools(ngZoneOrOptions, options = {}) {
if (isNotBrowser)
return;
if (!((/** @type {?} */ (window))).__REDUX_DEVTOOLS_EXTENSION__) {
return;
}
subs.length &&
subs.forEach((/**
* @param {?} s
* @return {?}
*/
s => {
if (s.unsubscribe) {
s.unsubscribe();
}
else {
s && s();
}
}));
/** @type {?} */
const isAngular = ngZoneOrOptions && ngZoneOrOptions['run'];
if (!isAngular) {
ngZoneOrOptions = ngZoneOrOptions || {};
((/** @type {?} */ (ngZoneOrOptions))).run = (/**
* @param {?} cb
* @return {?}
*/
cb => cb());
options = (/** @type {?} */ (ngZoneOrOptions));
}
/** @type {?} */
const defaultOptions = { name: 'Akita', shallow: true };
/** @type {?} */
const merged = Object.assign({}, defaultOptions, options);
/** @type {?} */
const devTools = ((/** @type {?} */ (window))).__REDUX_DEVTOOLS_EXTENSION__.connect(merged);
/** @type {?} */
let appState = {};
subs.push($$addStore.subscribe((/**
* @param {?} storeName
* @return {?}
*/
storeName => {
appState = Object.assign({}, appState, { [storeName]: __stores__[storeName]._value() });
devTools.send({ type: `[${capitalize(storeName)}] - @@INIT` }, appState);
})));
subs.push($$deleteStore.subscribe((/**
* @param {?} storeName
* @return {?}
*/
storeName => {
delete appState[storeName];
devTools.send({ type: `[${storeName}] - Delete Store` }, appState);
})));
subs.push($$updateStore.subscribe((/**
* @param {?} storeName
* @return {?}
*/
storeName => {
const { type, entityIds, skip } = currentAction;
if (skip) {
setSkipAction(false);
return;
}
/** @type {?} */
const store = __stores__[storeName];
if (!store) {
return;
}
if (options.shallow === false && appState[storeName]) {
/** @type {?} */
const isEqual = JSON.stringify(store._value()) === JSON.stringify(appState[storeName]);
if (isEqual)
return;
}
appState = Object.assign({}, appState, { [storeName]: store._value() });
/** @type {?} */
const normalize = capitalize(storeName);
/** @type {?} */
let msg = isDefined(entityIds) ? `[${normalize}] - ${type} (ids: ${entityIds})` : `[${normalize}] - ${type}`;
if (options.logTrace) {
console.group(msg);
console.trace();
console.groupEnd();
}
devTools.send({ type: msg }, appState);
})));
subs.push(devTools.subscribe((/**
* @param {?} message
* @return {?}
*/
message => {
if (message.type === 'DISPATCH') {
/** @type {?} */
const payloadType = message.payload.type;
if (payloadType === 'COMMIT') {
devTools.init(appState);
return;
}
if (message.state) {
/** @type {?} */
const rootState = JSON.parse(message.state);
for (let i = 0, keys = Object.keys(rootState); i < keys.length; i++) {
/** @type {?} */
const storeName = keys[i];
if (__stores__[storeName]) {
((/** @type {?} */ (ngZoneOrOptions))).run((/**
* @return {?}
*/
() => {
__stores__[storeName]._setState((/**
* @return {?}
*/
() => rootState[storeName]), false);
}));
}
}
}
}
})));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2dG9vbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvZGV2dG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDOztJQWVsQyxJQUFJLEdBQUcsRUFBRTs7Ozs7O0FBTWIsTUFBTSxVQUFVLGFBQWEsQ0FBQyxlQUF1RCxFQUFFLFVBQW9DLEVBQUU7SUFDM0gsSUFBSSxZQUFZO1FBQUUsT0FBTztJQUV6QixJQUFJLENBQUMsQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLDRCQUE0QixFQUFFO1FBQ2pELE9BQU87S0FDUjtJQUVELElBQUksQ0FBQyxNQUFNO1FBQ1QsSUFBSSxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLENBQUMsRUFBRTtZQUNmLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtnQkFDakIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNMLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUNWO1FBQ0gsQ0FBQyxFQUFDLENBQUM7O1VBRUMsU0FBUyxHQUFHLGVBQWUsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDO0lBRTNELElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDZCxlQUFlLEdBQUcsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxDQUFDLG1CQUFBLGVBQWUs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QUFRLENBQUMsU0FBUzs7OztJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7O2tCQUN6QixXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJO1lBRXhDLElBQUksV0FBVyxLQUFLLFFBQVEsRUFBRTtnQkFDNUIsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDeEIsT0FBTzthQUNSO1lBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFOztzQkFDWCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7MEJBQzdELFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUN6QixJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTt3QkFDekIsQ0FBQyxtQkFBQSxlQUFlLEVBQWMsQ0FBQyxDQUFDLEdBQUc7Ozt3QkFBQyxHQUFHLEVBQUU7NEJBQ3ZDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTOzs7NEJBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUNyRSxDQUFDLEVBQUMsQ0FBQztxQkFDSjtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDLEVBQUMsQ0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGN1cnJlbnRBY3Rpb24sIHNldFNraXBBY3Rpb24gfSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHsgaXNEZWZpbmVkIH0gZnJvbSAnLi9pc0RlZmluZWQnO1xuaW1wb3J0IHsgJCRhZGRTdG9yZSwgJCRkZWxldGVTdG9yZSwgJCR1cGRhdGVTdG9yZSB9IGZyb20gJy4vZGlzcGF0Y2hlcnMnO1xuaW1wb3J0IHsgX19zdG9yZXNfXyB9IGZyb20gJy4vc3RvcmVzJztcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tICcuL2NhcHRpYWxpemUnO1xuaW1wb3J0IHsgaXNOb3RCcm93c2VyIH0gZnJvbSAnLi9yb290JztcblxuZXhwb3J0IHR5cGUgRGV2dG9vbHNPcHRpb25zID0ge1xuICAvKiogaW5zdGFuY2UgbmFtZSB2aXNpYmxlIGluIGRldnRvb2xzICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqICBtYXhpbXVtIGFsbG93ZWQgYWN0aW9ucyB0byBiZSBzdG9yZWQgaW4gdGhlIGhpc3RvcnkgdHJlZSAqL1xuICBtYXhBZ2U6IG51bWJlcjtcbiAgbGF0ZW5jeTogbnVtYmVyO1xuICBhY3Rpb25zQmxhY2tsaXN0OiBzdHJpbmdbXTtcbiAgYWN0aW9uc1doaXRlbGlzdDogc3RyaW5nW107XG4gIHNob3VsZENhdGNoRXJyb3JzOiBib29sZWFuO1xuICBsb2dUcmFjZTogYm9vbGVhbjtcbiAgcHJlZGljYXRlOiAoc3RhdGU6IGFueSwgYWN0aW9uOiBhbnkpID0+IGJvb2xlYW47XG4gIHNoYWxsb3c6IGJvb2xlYW47XG59O1xubGV0IHN1YnMgPSBbXTtcblxuZXhwb3J0IHR5cGUgTmdab25lTGlrZSA9IHsgcnVuOiBhbnkgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFraXRhRGV2dG9vbHMobmdab25lOiBOZ1pvbmVMaWtlLCBvcHRpb25zPzogUGFydGlhbDxEZXZ0b29sc09wdGlvbnM+KTtcbmV4cG9ydCBmdW5jdGlvbiBha2l0YURldnRvb2xzKG9wdGlvbnM/OiBQYXJ0aWFsPERldnRvb2xzT3B0aW9ucz4pO1xuZXhwb3J0IGZ1bmN0aW9uIGFraXRhRGV2dG9vbHMobmdab25lT3JPcHRpb25zPzogTmdab25lTGlrZSB8IFBhcnRpYWw8RGV2dG9vbHNPcHRpb25zPiwgb3B0aW9uczogUGFydGlhbDxEZXZ0b29sc09wdGlvbnM+ID0ge30pIHtcbiAgaWYgKGlzTm90QnJvd3NlcikgcmV0dXJuO1xuXG4gIGlmICghKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJzLmxlbmd0aCAmJlxuICAgIHN1YnMuZm9yRWFjaChzID0+IHtcbiAgICAgIGlmIChzLnVuc3Vic2NyaWJlKSB7XG4gICAgICAgIHMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMgJiYgcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbnN0IGlzQW5ndWxhciA9IG5nWm9uZU9yT3B0aW9ucyAmJiBuZ1pvbmVPck9wdGlvbnNbJ3J1biddO1xuXG4gIGlmICghaXNBbmd1bGFyKSB7XG4gICAgbmdab25lT3JPcHRpb25zID0gbmdab25lT3JPcHRpb25zIHx8IHt9O1xuICAgIChuZ1pvbmVPck9wdGlvbnMgYXMgYW55KS5ydW4gPSBjYiA9PiBjYigpO1xuICAgIG9wdGlvbnMgPSBuZ1pvbmVPck9wdGlvbnMgYXMgUGFydGlhbDxEZXZ0b29sc09wdGlvbnM+O1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IFBhcnRpYWw8RGV2dG9vbHNPcHRpb25zPiAmIHsgbmFtZTogc3RyaW5nIH0gPSB7IG5hbWU6ICdBa2l0YScsIHNoYWxsb3c6IHRydWUgfTtcbiAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IGRldlRvb2xzID0gKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18uY29ubmVjdChtZXJnZWQpO1xuICBsZXQgYXBwU3RhdGUgPSB7fTtcblxuICBzdWJzLnB1c2goXG4gICAgJCRhZGRTdG9yZS5zdWJzY3JpYmUoc3RvcmVOYW1lID0+IHtcbiAgICAgIGFwcFN0YXRlID0ge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgW3N0b3JlTmFtZV06IF9fc3RvcmVzX19bc3RvcmVOYW1lXS5fdmFsdWUoKVxuICAgICAgfTtcbiAgICAgIGRldlRvb2xzLnNlbmQoeyB0eXBlOiBgWyR7Y2FwaXRhbGl6ZShzdG9yZU5hbWUpfV0gLSBAQElOSVRgIH0sIGFwcFN0YXRlKTtcbiAgICB9KVxuICApO1xuXG4gIHN1YnMucHVzaChcbiAgICAkJGRlbGV0ZVN0b3JlLnN1YnNjcmliZShzdG9yZU5hbWUgPT4ge1xuICAgICAgZGVsZXRlIGFwcFN0YXRlW3N0b3JlTmFtZV07XG4gICAgICBkZXZUb29scy5zZW5kKHsgdHlwZTogYFske3N0b3JlTmFtZX1dIC0gRGVsZXRlIFN0b3JlYCB9LCBhcHBTdGF0ZSk7XG4gICAgfSlcbiAgKTtcblxuICBzdWJzLnB1c2goXG4gICAgJCR1cGRhdGVTdG9yZS5zdWJzY3JpYmUoc3RvcmVOYW1lID0+IHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgZW50aXR5SWRzLCBza2lwIH0gPSBjdXJyZW50QWN0aW9uO1xuXG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICBzZXRTa2lwQWN0aW9uKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IF9fc3RvcmVzX19bc3RvcmVOYW1lXTtcbiAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5zaGFsbG93ID09PSBmYWxzZSAmJiBhcHBTdGF0ZVtzdG9yZU5hbWVdKSB7XG4gICAgICAgIGNvbnN0IGlzRXF1YWwgPSBKU09OLnN0cmluZ2lmeShzdG9yZS5fdmFsdWUoKSkgPT09IEpTT04uc3RyaW5naWZ5KGFwcFN0YXRlW3N0b3JlTmFtZV0pO1xuICAgICAgICBpZiAoaXNFcXVhbCkgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhcHBTdGF0ZSA9IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIFtzdG9yZU5hbWVdOiBzdG9yZS5fdmFsdWUoKVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplID0gY2FwaXRhbGl6ZShzdG9yZU5hbWUpO1xuICAgICAgbGV0IG1zZyA9IGlzRGVmaW5lZChlbnRpdHlJZHMpID8gYFske25vcm1hbGl6ZX1dIC0gJHt0eXBlfSAoaWRzOiAke2VudGl0eUlkc30pYCA6IGBbJHtub3JtYWxpemV9XSAtICR7dHlwZX1gO1xuXG4gICAgICBpZiAob3B0aW9ucy5sb2dUcmFjZSkge1xuICAgICAgICBjb25zb2xlLmdyb3VwKG1zZyk7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgfVxuXG4gICAgICBkZXZUb29scy5zZW5kKHsgdHlwZTogbXNnIH0sIGFwcFN0YXRlKTtcbiAgICB9KVxuICApO1xuXG4gIHN1YnMucHVzaChcbiAgICBkZXZUb29scy5zdWJzY3JpYmUobWVzc2FnZSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS50eXBlID09PSAnRElTUEFUQ0gnKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWRUeXBlID0gbWVzc2FnZS5wYXlsb2FkLnR5cGU7XG5cbiAgICAgICAgaWYgKHBheWxvYWRUeXBlID09PSAnQ09NTUlUJykge1xuICAgICAgICAgIGRldlRvb2xzLmluaXQoYXBwU3RhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXRlKSB7XG4gICAgICAgICAgY29uc3Qgcm9vdFN0YXRlID0gSlNPTi5wYXJzZShtZXNzYWdlLnN0YXRlKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMCwga2V5cyA9IE9iamVjdC5rZXlzKHJvb3RTdGF0ZSk7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSBrZXlzW2ldO1xuICAgICAgICAgICAgaWYgKF9fc3RvcmVzX19bc3RvcmVOYW1lXSkge1xuICAgICAgICAgICAgICAobmdab25lT3JPcHRpb25zIGFzIE5nWm9uZUxpa2UpLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgX19zdG9yZXNfX1tzdG9yZU5hbWVdLl9zZXRTdGF0ZSgoKSA9PiByb290U3RhdGVbc3RvcmVOYW1lXSwgZmFsc2UpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICApO1xufVxuIl19