diff --git a/docs/docs/config.mdx b/docs/docs/config.mdx index 24cfe16d..ae38ea01 100644 --- a/docs/docs/config.mdx +++ b/docs/docs/config.mdx @@ -62,6 +62,10 @@ See [caching support](../additional/cache) section. ### `idKey` A custom `idKey` for `EntityStore` - see [EntityId](../entities/entity-store#entity-id) section. +### `disableTracking` +Option to disable devtools tracking. + + :::info You can also provide the `options` in the constructor: diff --git a/libs/akita/src/__tests__/devtools.spec.ts b/libs/akita/src/__tests__/devtools.spec.ts index 7b7f6ccf..70b619e0 100644 --- a/libs/akita/src/__tests__/devtools.spec.ts +++ b/libs/akita/src/__tests__/devtools.spec.ts @@ -3,7 +3,7 @@ import { capitalize } from '../lib/capitalize'; import { akitaDevtools } from '../lib/devtools'; import { Store } from '../lib/store'; import { applyTransaction } from '../lib/transaction'; -import { TodosStore } from './setup'; +import { TodosStore, DisabledTrackingConfigStore } from './setup'; function buildActionTypeString(store: Store, type: string) { return `[${capitalize(store.storeName)}] - ${type}`; @@ -201,6 +201,17 @@ describe('DevTools', () => { expect(connectMock.send.mock.calls[0][0]['type']).toEqual(expect.stringContaining(buildActionTypeString(store, `Custom Action`))); }); + it('should log only if disableTracking is not true', function () { + connectMock.send.mockReset(); + const noTrackingStoreConfig = new DisabledTrackingConfigStore(); + const noTrackingStoreOptions = new Store({}, { disableTracking: true }); + + noTrackingStoreConfig.setLoading(); + noTrackingStoreOptions.setLoading(); + + expect(connectMock.send.mock.calls.length).toBe(0); + }); + afterEach(() => { store.destroy(); connectMock.send.mockReset(); diff --git a/libs/akita/src/__tests__/setup.ts b/libs/akita/src/__tests__/setup.ts index 6ffb7cd4..f84834de 100644 --- a/libs/akita/src/__tests__/setup.ts +++ b/libs/akita/src/__tests__/setup.ts @@ -109,3 +109,6 @@ export function createWidget(id) { } export const tick = () => new Promise(process.nextTick); + +@StoreConfig({ name: 'disabledTrackingConfig', disableTracking: true }) +export class DisabledTrackingConfigStore extends EntityStore {} diff --git a/libs/akita/src/lib/devtools.ts b/libs/akita/src/lib/devtools.ts index fcd8a5a8..f31f2bce 100644 --- a/libs/akita/src/lib/devtools.ts +++ b/libs/akita/src/lib/devtools.ts @@ -57,7 +57,7 @@ export function akitaDevtools(ngZoneOrOptions?: NgZoneLike | Partial { - if (!storesWhitelist.length) { + if (!storesWhitelist.length && !__stores__[storeName].disabledTracking) { return true; } diff --git a/libs/akita/src/lib/store.ts b/libs/akita/src/lib/store.ts index 8e6b8364..2f098033 100644 --- a/libs/akita/src/lib/store.ts +++ b/libs/akita/src/lib/store.ts @@ -174,6 +174,11 @@ export class Store { return isDefined(this.config.resettable) ? this.config.resettable : this.options.resettable; } + // @internal + get disabledTracking() { + return isDefined(this.config.disableTracking) ? this.config.disableTracking : this.options.disableTracking; + } + // @internal _setState(newState: ((state: Readonly) => S) | S, _dispatchAction = true) { if (isFunction(newState)) { diff --git a/libs/akita/src/lib/storeConfig.ts b/libs/akita/src/lib/storeConfig.ts index c60028a7..fe9ed1ca 100644 --- a/libs/akita/src/lib/storeConfig.ts +++ b/libs/akita/src/lib/storeConfig.ts @@ -7,6 +7,7 @@ export type StoreConfigOptions = { deepFreezeFn?: (o: any) => any; idKey?: string; producerFn?: AkitaConfig['producerFn']; + disableTracking?: boolean; }; export type UpdatableStoreConfigOptions = { @@ -16,7 +17,7 @@ export type UpdatableStoreConfigOptions = { export const configKey = 'akitaConfig'; export function StoreConfig(metadata: StoreConfigOptions) { - return function(constructor: Function) { + return function (constructor: Function) { constructor[configKey] = { idKey: 'id' }; for (let i = 0, keys = Object.keys(metadata); i < keys.length; i++) {