@tolgee/core 5.0.0-alpha.1 → 5.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +174 -0
  2. package/README.njk.md +61 -0
  3. package/dist/tolgee.cjs.js +185 -143
  4. package/dist/tolgee.cjs.js.map +1 -1
  5. package/dist/tolgee.cjs.min.js +1 -1
  6. package/dist/tolgee.cjs.min.js.map +1 -1
  7. package/dist/tolgee.esm.js +185 -143
  8. package/dist/tolgee.esm.js.map +1 -1
  9. package/dist/tolgee.esm.min.mjs +1 -1
  10. package/dist/tolgee.esm.min.mjs.map +1 -1
  11. package/dist/tolgee.umd.js +185 -143
  12. package/dist/tolgee.umd.js.map +1 -1
  13. package/dist/tolgee.umd.min.js +1 -1
  14. package/dist/tolgee.umd.min.js.map +1 -1
  15. package/lib/Controller/Controller.d.ts +8 -4
  16. package/lib/Controller/Events/EventEmitter.d.ts +1 -1
  17. package/lib/Controller/Events/EventEmitterSelective.d.ts +1 -1
  18. package/lib/Controller/Events/Events.d.ts +1 -0
  19. package/lib/Controller/Plugins/Plugins.d.ts +4 -4
  20. package/lib/Controller/State/State.d.ts +2 -1
  21. package/lib/Controller/State/initState.d.ts +13 -2
  22. package/lib/{Tolgee.d.ts → TolgeeCore.d.ts} +13 -4
  23. package/lib/helpers.d.ts +1 -0
  24. package/lib/index.d.ts +1 -1
  25. package/lib/types/events.d.ts +2 -2
  26. package/lib/types/index.d.ts +1 -1
  27. package/lib/types/plugin.d.ts +6 -9
  28. package/package.json +2 -2
  29. package/src/Controller/Controller.ts +5 -4
  30. package/src/Controller/Events/EventEmitter.ts +6 -2
  31. package/src/Controller/Events/EventEmitterSelective.test.ts +23 -0
  32. package/src/Controller/Events/EventEmitterSelective.ts +8 -5
  33. package/src/Controller/Events/Events.ts +19 -8
  34. package/src/Controller/Plugins/Plugins.ts +66 -63
  35. package/src/Controller/State/initState.ts +16 -1
  36. package/src/{Tolgee.ts → TolgeeCore.ts} +12 -3
  37. package/src/__test/backend.test.ts +2 -2
  38. package/src/__test/cache.test.ts +6 -3
  39. package/src/__test/client.test.ts +2 -2
  40. package/src/__test/events.test.ts +30 -5
  41. package/src/__test/format.simple.test.ts +2 -14
  42. package/src/__test/formatError.test.ts +61 -0
  43. package/src/__test/initialization.test.ts +4 -4
  44. package/src/__test/languageDetection.test.ts +8 -8
  45. package/src/__test/languageStorage.test.ts +10 -11
  46. package/src/__test/languages.test.ts +8 -8
  47. package/src/__test/loading.test.ts +2 -2
  48. package/src/__test/namespaces.fallback.test.ts +5 -5
  49. package/src/__test/namespaces.test.ts +4 -4
  50. package/src/__test/options.test.ts +3 -3
  51. package/src/__test/plugins.test.ts +4 -4
  52. package/src/helpers.ts +8 -0
  53. package/src/index.ts +1 -1
  54. package/src/types/events.ts +2 -2
  55. package/src/types/index.ts +1 -1
  56. package/src/types/plugin.ts +12 -12
@@ -31,10 +31,10 @@ export declare const Controller: ({ options }: StateServiceProps) => Readonly<{
31
31
  language: string;
32
32
  namespace: string;
33
33
  }[];
34
- prepare: () => void;
35
34
  addPlugin: (tolgeeInstance: Readonly<{
36
35
  on: import("../types").TolgeeOn<keyof import("../types").EventType>;
37
36
  onNsUpdate: (handler: import("../types").Listener<undefined>) => import("../types").SubscriptionSelective;
37
+ setEmmiterActive: (active: boolean) => void;
38
38
  getLanguage: () => string | undefined;
39
39
  getPendingLanguage: () => string | undefined;
40
40
  changeLanguage: (language: string) => Promise<void>;
@@ -73,8 +73,9 @@ export declare const Controller: ({ options }: StateServiceProps) => Readonly<{
73
73
  fallbackNs?: import("../types").FallbackGeneral;
74
74
  defaultNs: string;
75
75
  staticData?: import("./State/initState").TolgeeStaticData | undefined;
76
- observerOptions: import("./State/observerOptions").ObserverOptionsInternal;
77
76
  observerType: "invisible" | "text";
77
+ observerOptions: import("./State/observerOptions").ObserverOptionsInternal;
78
+ onFormatError: import("../types").OnFormatError;
78
79
  };
79
80
  isDev: () => boolean;
80
81
  wrap: (params: import("../types").WrapperWrapProps) => string | undefined;
@@ -83,7 +84,7 @@ export declare const Controller: ({ options }: StateServiceProps) => Readonly<{
83
84
  addPlugin(plugin: import("../types").TolgeePlugin | undefined): void;
84
85
  updateOptions(options?: TolgeeOptions | undefined): void;
85
86
  }>, plugin: import("../types").TolgeePlugin) => void;
86
- formatTranslation: ({ key, translation, defaultValue, noWrap, params, orEmpty, ns, formatEnabled, }: {
87
+ formatTranslation: ({ formatEnabled, ...props }: {
87
88
  key: string;
88
89
  defaultValue?: string | undefined;
89
90
  params?: import("../types").TranslateParams<import("../types").DefaultParamType> | undefined;
@@ -96,6 +97,7 @@ export declare const Controller: ({ options }: StateServiceProps) => Readonly<{
96
97
  getBackendRecord: import("../types").BackendGetRecord;
97
98
  getBackendDevRecord: import("../types").BackendGetRecord;
98
99
  getLanguageDetector: () => import("../types").LanguageDetectorMiddleware | undefined;
100
+ getLanguageStorage: () => import("../types").LanguageStorageMiddleware | undefined;
99
101
  getInitialLanguage: () => string | Promise<string | undefined> | Promise<string | Promise<string | undefined> | undefined> | undefined;
100
102
  setStoredLanguage: (language: string) => void;
101
103
  retranslate: () => void;
@@ -123,8 +125,9 @@ export declare const Controller: ({ options }: StateServiceProps) => Readonly<{
123
125
  fallbackNs?: import("../types").FallbackGeneral;
124
126
  defaultNs: string;
125
127
  staticData?: import("./State/initState").TolgeeStaticData | undefined;
126
- observerOptions: import("./State/observerOptions").ObserverOptionsInternal;
127
128
  observerType: "invisible" | "text";
129
+ observerOptions: import("./State/observerOptions").ObserverOptionsInternal;
130
+ onFormatError: import("../types").OnFormatError;
128
131
  };
129
132
  removeActiveNs: (ns: NsFallback) => void;
130
133
  getRequiredNamespaces: () => string[];
@@ -142,6 +145,7 @@ export declare const Controller: ({ options }: StateServiceProps) => Readonly<{
142
145
  onRunningChange: import("./Events/EventEmitter").EventEmitterInstance<boolean>;
143
146
  onCacheChange: import("./Events/EventEmitter").EventEmitterInstance<import("../types").CacheDescriptorWithKey>;
144
147
  onUpdate: import("./Events/EventEmitterSelective").EventEmitterSelectiveInstance;
148
+ setEmmiterActive: (active: boolean) => void;
145
149
  on: import("../types").TolgeeOn<keyof import("../types").EventType>;
146
150
  }>;
147
151
  export declare type ControllerInstance = ReturnType<typeof Controller>;
@@ -1,5 +1,5 @@
1
1
  import { Subscription, Listener } from '../../types';
2
- export declare const EventEmitter: <T>() => EventEmitterInstance<T>;
2
+ export declare const EventEmitter: <T>(isActive: () => boolean) => EventEmitterInstance<T>;
3
3
  export declare type EventEmitterInstance<T> = {
4
4
  readonly listen: (handler: Listener<T>) => Subscription;
5
5
  readonly emit: (data: T) => void;
@@ -1,5 +1,5 @@
1
1
  import { Subscription, Listener, SubscriptionSelective } from '../../types';
2
- export declare const EventEmitterSelective: (getFallbackNs: () => string[], getDefaultNs: () => string) => EventEmitterSelectiveInstance;
2
+ export declare const EventEmitterSelective: (isActive: () => boolean, getFallbackNs: () => string[], getDefaultNs: () => string) => EventEmitterSelectiveInstance;
3
3
  export declare type EventEmitterSelectiveInstance = {
4
4
  readonly listenSome: (handler: Listener<undefined>) => SubscriptionSelective;
5
5
  readonly listen: (handler: Listener<undefined>) => Subscription;
@@ -8,6 +8,7 @@ export declare const Events: (getFallbackNs: () => string[], getDefaultNs: () =>
8
8
  onRunningChange: import("./EventEmitter").EventEmitterInstance<boolean>;
9
9
  onCacheChange: import("./EventEmitter").EventEmitterInstance<CacheDescriptorWithKey>;
10
10
  onUpdate: import("./EventEmitterSelective").EventEmitterSelectiveInstance;
11
+ setEmmiterActive: (active: boolean) => void;
11
12
  on: TolgeeOn<keyof import("../../types").EventType>;
12
13
  }>;
13
14
  export declare type EventsInstance = ReturnType<typeof Events>;
@@ -1,8 +1,7 @@
1
- import { BackendDevMiddleware, BackendGetRecord, TranslatePropsInternal, HighlightInterface, LanguageDetectorMiddleware, ChangeTranslationInterface, WrapperWrapProps, Unwrapped, KeyAndNamespacesInternal, TolgeePlugin, TolgeeInstance, TolgeeOptionsInternal } from '../../types';
1
+ import { BackendDevMiddleware, BackendGetRecord, TranslatePropsInternal, HighlightInterface, LanguageDetectorMiddleware, LanguageStorageMiddleware, ChangeTranslationInterface, WrapperWrapProps, Unwrapped, KeyAndNamespacesInternal, TolgeePlugin, TolgeeInstance, TolgeeOptionsInternal } from '../../types';
2
2
  export declare const Plugins: (getLanguage: () => string | undefined, getInitialOptions: () => TolgeeOptionsInternal, getAvailableLanguages: () => string[] | undefined, getTranslationNs: (props: KeyAndNamespacesInternal) => string[], getTranslation: (props: KeyAndNamespacesInternal) => string | undefined, changeTranslation: ChangeTranslationInterface) => Readonly<{
3
- prepare: () => void;
4
3
  addPlugin: (tolgeeInstance: TolgeeInstance, plugin: TolgeePlugin) => void;
5
- formatTranslation: ({ key, translation, defaultValue, noWrap, params, orEmpty, ns, formatEnabled, }: {
4
+ formatTranslation: ({ formatEnabled, ...props }: {
6
5
  key: string;
7
6
  defaultValue?: string | undefined;
8
7
  params?: import("../../types").TranslateParams<import("../../types").DefaultParamType> | undefined;
@@ -15,9 +14,10 @@ export declare const Plugins: (getLanguage: () => string | undefined, getInitial
15
14
  getBackendRecord: BackendGetRecord;
16
15
  getBackendDevRecord: BackendGetRecord;
17
16
  getLanguageDetector: () => LanguageDetectorMiddleware | undefined;
17
+ getLanguageStorage: () => LanguageStorageMiddleware | undefined;
18
18
  getInitialLanguage: () => string | Promise<string | undefined> | Promise<string | Promise<string | undefined> | undefined> | undefined;
19
19
  setStoredLanguage: (language: string) => void;
20
- run: (isDev: boolean) => void;
20
+ run: () => void;
21
21
  stop: () => void;
22
22
  retranslate: () => void;
23
23
  highlight: HighlightInterface;
@@ -23,8 +23,9 @@ export declare const State: (onLanguageChange: EventEmitterInstance<string>, onP
23
23
  fallbackNs?: import("../../types").FallbackGeneral;
24
24
  defaultNs: string;
25
25
  staticData?: import("./initState").TolgeeStaticData | undefined;
26
- observerOptions: import("./observerOptions").ObserverOptionsInternal;
27
26
  observerType: "invisible" | "text";
27
+ observerOptions: import("./observerOptions").ObserverOptionsInternal;
28
+ onFormatError: import("../../types").OnFormatError;
28
29
  };
29
30
  addActiveNs: (ns: NsFallback) => void;
30
31
  removeActiveNs: (ns: NsFallback) => void;
@@ -1,5 +1,6 @@
1
- import { FallbackGeneral, FallbackLanguageOption, TreeTranslationsData } from '../../types';
1
+ import { FallbackGeneral, FallbackLanguageOption, TreeTranslationsData, OnFormatError } from '../../types';
2
2
  import { ObserverOptions, ObserverOptionsInternal } from './observerOptions';
3
+ export declare const DEFAULT_FORMAT_ERROR = "invalid";
3
4
  export declare type TolgeeStaticData = {
4
5
  [key: string]: TreeTranslationsData | (() => Promise<TreeTranslationsData>);
5
6
  };
@@ -57,8 +58,18 @@ export declare type TolgeeOptionsInternal = {
57
58
  * ```
58
59
  */
59
60
  staticData?: TolgeeStaticData;
60
- observerOptions: ObserverOptionsInternal;
61
+ /**
62
+ * Switches between invisible and text observer. (Default: invisible)
63
+ */
61
64
  observerType: 'invisible' | 'text';
65
+ /**
66
+ * Observer options object.
67
+ */
68
+ observerOptions: ObserverOptionsInternal;
69
+ /**
70
+ * Define what to display in case of formatting error. (Default: 'invalid')
71
+ */
72
+ onFormatError: OnFormatError;
62
73
  };
63
74
  export declare type TolgeeOptions = Partial<Omit<TolgeeOptionsInternal, 'observerOptions'>> & {
64
75
  observerOptions?: ObserverOptions;
@@ -18,6 +18,10 @@ declare const createTolgee: (options: TolgeeOptions) => Readonly<{
18
18
  * ```
19
19
  */
20
20
  onNsUpdate: (handler: import("./types").Listener<undefined>) => import("./types").SubscriptionSelective;
21
+ /**
22
+ * Turn off/on events emitting. Is on by default.
23
+ */
24
+ setEmmiterActive: (active: boolean) => void;
21
25
  /**
22
26
  * @return current language if set.
23
27
  */
@@ -135,8 +139,9 @@ declare const createTolgee: (options: TolgeeOptions) => Readonly<{
135
139
  fallbackNs?: import("./types").FallbackGeneral;
136
140
  defaultNs: string;
137
141
  staticData?: import("./types").TolgeeStaticData | undefined;
138
- observerOptions: import("./types").ObserverOptionsInternal;
139
142
  observerType: "invisible" | "text";
143
+ observerOptions: import("./types").ObserverOptionsInternal;
144
+ onFormatError: import("./types").OnFormatError;
140
145
  };
141
146
  /**
142
147
  * Tolgee is in dev mode if `DevTools` plugin is used and `apiKey` + `apiUrl` are specified.
@@ -152,11 +157,15 @@ declare const createTolgee: (options: TolgeeOptions) => Readonly<{
152
157
  */
153
158
  unwrap: (text: string) => import("./types").Unwrapped;
154
159
  /**
155
- * Override creadentials passed on initialization
160
+ * Override creadentials passed on initialization.
161
+ *
162
+ * When called in running state, tolgee stops and runs again.
156
163
  */
157
164
  overrideCredentials(credentials: DevCredentials): void;
158
165
  /**
159
- * Add tolgee plugin.
166
+ * Add tolgee plugin after initialization.
167
+ *
168
+ * When called in running state, tolgee stops and runs again.
160
169
  */
161
170
  addPlugin(plugin: TolgeePlugin | undefined): void;
162
171
  /**
@@ -191,5 +200,5 @@ export declare type TolgeeChainer = {
191
200
  * const tolgee = Tolgee().use(...).init(...)
192
201
  * ```
193
202
  */
194
- export declare const Tolgee: () => TolgeeChainer;
203
+ export declare const TolgeeCore: () => TolgeeChainer;
195
204
  export {};
package/lib/helpers.d.ts CHANGED
@@ -8,3 +8,4 @@ export declare function getFallbackArray(value: FallbackGeneral): string[];
8
8
  export declare function getFallbackFromStruct(language: string, fallbackLanguage: FallbackLanguageOption): string[];
9
9
  export declare function unique<T>(arr: T[]): T[];
10
10
  export declare function sanitizeUrl(url: string | undefined): string | undefined;
11
+ export declare function getErrorMessage(error: any): string | undefined;
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { getFallback, getFallbackArray } from './helpers';
2
- export { Tolgee } from './Tolgee';
2
+ export { TolgeeCore } from './TolgeeCore';
3
3
  export * from './types';
4
4
  export { getTranslateProps } from './TranslateParams';
5
5
  export { FormatSimple } from './FormatSimple/FormatSimple';
@@ -17,10 +17,10 @@ export declare type ListenerEvent<T> = {
17
17
  value: T;
18
18
  };
19
19
  export declare type Listener<T> = (e: ListenerEvent<T>) => void;
20
- export declare type TolgeeEvent = 'pendingLanguage' | 'language' | 'loading' | 'fetching' | 'initialLoad' | 'running' | 'cache' | 'update';
20
+ export declare type TolgeeEvent = 'language' | 'pendingLanguage' | 'loading' | 'fetching' | 'initialLoad' | 'running' | 'cache' | 'update';
21
21
  export interface EventType {
22
- pendingLanguage: string;
23
22
  language: string;
23
+ pendingLanguage: string;
24
24
  loading: boolean;
25
25
  fetching: boolean;
26
26
  initialLoad: void;
@@ -4,4 +4,4 @@ export * from './cache';
4
4
  export * from './plugin';
5
5
  export type { State, TolgeeOptions, TolgeeOptionsInternal, TolgeeStaticData, } from '../Controller/State/initState';
6
6
  export type { ObserverOptions, ObserverOptionsInternal, ModifierKey, } from '../Controller/State/observerOptions';
7
- export type { TolgeeChainer, TolgeeInstance } from '../Tolgee';
7
+ export type { TolgeeChainer, TolgeeInstance } from '../TolgeeCore';
@@ -1,7 +1,7 @@
1
1
  import { ChangeTranslationInterface, TreeTranslationsData } from './cache';
2
2
  import { NsFallback, NsType, TranslateParams, TranslatePropsInternal } from './general';
3
3
  import type { ObserverOptionsInternal } from '../Controller/State/observerOptions';
4
- import { TolgeeInstance } from '../Tolgee';
4
+ import { TolgeeInstance } from '../TolgeeCore';
5
5
  export declare type BackendDevProps = {
6
6
  apiUrl?: string;
7
7
  apiKey?: string;
@@ -106,25 +106,22 @@ export declare type UiKeyOption = {
106
106
  ns: string[];
107
107
  translation: string | undefined;
108
108
  };
109
- export interface UiMiddleware {
109
+ export declare type UiMiddleware = (props: UiProps) => UiInterface;
110
+ export interface UiInterface {
110
111
  handleElementClick(keysAndDefaults: UiKeyOption[], event: any): Promise<void>;
111
112
  }
112
- export declare type UiConstructor = new (props: UiProps) => UiMiddleware;
113
- export declare type UiLibMiddleware = {
114
- UI: UiConstructor;
115
- };
116
- export declare type UiType = UiConstructor | UiLibMiddleware;
117
113
  export declare type PluginTools = Readonly<{
118
114
  setFinalFormatter: (formatter: FinalFormatterMiddleware | undefined) => void;
119
115
  addFormatter: (formatter: FormatterMiddleware | undefined) => void;
120
116
  setObserver: (observer: ObserverMiddleware | undefined) => void;
121
117
  hasObserver: () => boolean;
122
- setUi: (ui: UiLibMiddleware | undefined) => void;
118
+ setUi: (ui: UiMiddleware | undefined) => void;
123
119
  hasUi: () => boolean;
124
120
  addBackend: (backend: BackendMiddleware | undefined) => void;
125
121
  setDevBackend: (backend: BackendDevMiddleware | undefined) => void;
126
122
  setLanguageDetector: (languageDetector: LanguageDetectorMiddleware | undefined) => void;
127
123
  setLanguageStorage: (languageStorage: LanguageStorageMiddleware | undefined) => void;
128
- onPrepare: (callback: () => void) => void;
129
124
  }>;
130
125
  export declare type TolgeePlugin = (tolgee: TolgeeInstance, tools: PluginTools) => TolgeeInstance;
126
+ export declare type FormatErrorHandler = (error: string, info: TranslatePropsInternal) => string;
127
+ export declare type OnFormatError = string | FormatErrorHandler;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tolgee/core",
3
- "version": "5.0.0-alpha.1",
3
+ "version": "5.0.0-alpha.3",
4
4
  "description": "Library providing ability to translate messages directly in context of developed application.",
5
5
  "main": "./dist/tolgee.cjs.js",
6
6
  "module": "./dist/tolgee.esm.js",
@@ -62,5 +62,5 @@
62
62
  "publishConfig": {
63
63
  "access": "public"
64
64
  },
65
- "gitHead": "9c66dbc9a72cc2874cf24abbe99af5eb6df45d50"
65
+ "gitHead": "8bb0a0873ba83cce1292464649cb999fc7ecea72"
66
66
  }
@@ -248,15 +248,16 @@ export const Controller = ({ options }: StateServiceProps) => {
248
248
  }
249
249
 
250
250
  const checkCorrectConfiguration = () => {
251
- const languageDetector = pluginService.getLanguageDetector();
252
- if (languageDetector) {
251
+ const languageComputable =
252
+ pluginService.getLanguageDetector() || pluginService.getLanguageStorage();
253
+ if (languageComputable) {
253
254
  const availableLanguages = state.getAvailableLanguages();
254
255
  if (!availableLanguages) {
255
256
  throw new Error(missingOptionError('availableLanguages'));
256
257
  }
257
258
  }
258
259
  if (!state.getLanguage() && !state.getInitialOptions().defaultLanguage) {
259
- if (languageDetector) {
260
+ if (languageComputable) {
260
261
  throw new Error(missingOptionError('defaultLanguage'));
261
262
  } else {
262
263
  throw new Error(missingOptionError('language'));
@@ -272,7 +273,7 @@ export const Controller = ({ options }: StateServiceProps) => {
272
273
  cache.invalidate();
273
274
  }
274
275
  state.setRunning(true);
275
- pluginService.run(isDev());
276
+ pluginService.run();
276
277
  result = loadInitial();
277
278
  }
278
279
  return Promise.resolve(result);
@@ -1,6 +1,8 @@
1
1
  import { Subscription, Listener } from '../../types';
2
2
 
3
- export const EventEmitter = <T>(): EventEmitterInstance<T> => {
3
+ export const EventEmitter = <T>(
4
+ isActive: () => boolean
5
+ ): EventEmitterInstance<T> => {
4
6
  let handlers: Listener<T>[] = [];
5
7
 
6
8
  const listen = (handler: Listener<T>): Subscription => {
@@ -18,7 +20,9 @@ export const EventEmitter = <T>(): EventEmitterInstance<T> => {
18
20
  };
19
21
 
20
22
  const emit = (data: T) => {
21
- handlers.forEach((handler) => handler({ value: data }));
23
+ if (isActive()) {
24
+ handlers.forEach((handler) => handler({ value: data }));
25
+ }
22
26
  };
23
27
 
24
28
  return Object.freeze({ listen, emit });
@@ -3,6 +3,7 @@ import { EventEmitterSelective } from './EventEmitterSelective';
3
3
  describe('event emitter selective', () => {
4
4
  it('handles correctly default namespace', () => {
5
5
  const emitter = EventEmitterSelective(
6
+ () => true,
6
7
  () => [],
7
8
  () => 'default'
8
9
  );
@@ -22,6 +23,7 @@ describe('event emitter selective', () => {
22
23
 
23
24
  it('unsubscribes', () => {
24
25
  const emitter = EventEmitterSelective(
26
+ () => true,
25
27
  () => [],
26
28
  () => ''
27
29
  );
@@ -37,6 +39,7 @@ describe('event emitter selective', () => {
37
39
 
38
40
  it('groups events correctly', async () => {
39
41
  const emitter = EventEmitterSelective(
42
+ () => true,
40
43
  () => ['test', 'opqrst'],
41
44
  () => ''
42
45
  );
@@ -69,6 +72,7 @@ describe('event emitter selective', () => {
69
72
 
70
73
  it('always subscribes to fallback ns', async () => {
71
74
  const emitter = EventEmitterSelective(
75
+ () => true,
72
76
  () => ['fallback1', 'fallback2'],
73
77
  () => ''
74
78
  );
@@ -84,4 +88,23 @@ describe('event emitter selective', () => {
84
88
  emitter.emit(['test']);
85
89
  expect(handler).toBeCalledTimes(2);
86
90
  });
91
+
92
+ it('switches off emitting', () => {
93
+ const emitter = EventEmitterSelective(
94
+ () => false,
95
+ () => ['fallback1', 'fallback2'],
96
+ () => ''
97
+ );
98
+ const handler = jest.fn();
99
+ emitter.listenSome(handler);
100
+
101
+ emitter.emit(['fallback1']);
102
+ expect(handler).toBeCalledTimes(0);
103
+
104
+ emitter.emit(['fallback2']);
105
+ expect(handler).toBeCalledTimes(0);
106
+
107
+ emitter.emit(['']);
108
+ expect(handler).toBeCalledTimes(0);
109
+ });
87
110
  });
@@ -16,6 +16,7 @@ type HandlerWrapperType = {
16
16
  };
17
17
 
18
18
  export const EventEmitterSelective = (
19
+ isActive: () => boolean,
19
20
  getFallbackNs: () => string[],
20
21
  getDefaultNs: () => string
21
22
  ): EventEmitterSelectiveInstance => {
@@ -111,11 +112,13 @@ export const EventEmitterSelective = (
111
112
  };
112
113
 
113
114
  const emit = (ns?: string[], delayed?: boolean) => {
114
- queue.push(ns);
115
- if (!delayed) {
116
- solveQueue();
117
- } else {
118
- setTimeout(solveQueue, 0);
115
+ if (isActive()) {
116
+ queue.push(ns);
117
+ if (!delayed) {
118
+ solveQueue();
119
+ } else {
120
+ setTimeout(solveQueue, 0);
121
+ }
119
122
  }
120
123
  };
121
124
 
@@ -6,14 +6,20 @@ export const Events = (
6
6
  getFallbackNs: () => string[],
7
7
  getDefaultNs: () => string
8
8
  ) => {
9
- const onPendingLanguageChange = EventEmitter<string>();
10
- const onLanguageChange = EventEmitter<string>();
11
- const onLoadingChange = EventEmitter<boolean>();
12
- const onFetchingChange = EventEmitter<boolean>();
13
- const onInitialLoaded = EventEmitter<void>();
14
- const onRunningChange = EventEmitter<boolean>();
15
- const onCacheChange = EventEmitter<CacheDescriptorWithKey>();
16
- const onUpdate = EventEmitterSelective(getFallbackNs, getDefaultNs);
9
+ let emitterActive = true;
10
+
11
+ function isActive() {
12
+ return emitterActive;
13
+ }
14
+
15
+ const onPendingLanguageChange = EventEmitter<string>(isActive);
16
+ const onLanguageChange = EventEmitter<string>(isActive);
17
+ const onLoadingChange = EventEmitter<boolean>(isActive);
18
+ const onFetchingChange = EventEmitter<boolean>(isActive);
19
+ const onInitialLoaded = EventEmitter<void>(isActive);
20
+ const onRunningChange = EventEmitter<boolean>(isActive);
21
+ const onCacheChange = EventEmitter<CacheDescriptorWithKey>(isActive);
22
+ const onUpdate = EventEmitterSelective(isActive, getFallbackNs, getDefaultNs);
17
23
 
18
24
  onInitialLoaded.listen(() => onUpdate.emit());
19
25
  onLanguageChange.listen(() => onUpdate.emit());
@@ -42,6 +48,10 @@ export const Events = (
42
48
  }
43
49
  };
44
50
 
51
+ function setEmmiterActive(active: boolean) {
52
+ emitterActive = active;
53
+ }
54
+
45
55
  return Object.freeze({
46
56
  onPendingLanguageChange,
47
57
  onLanguageChange,
@@ -51,6 +61,7 @@ export const Events = (
51
61
  onRunningChange,
52
62
  onCacheChange,
53
63
  onUpdate,
64
+ setEmmiterActive,
54
65
  on,
55
66
  });
56
67
  };