@tolgee/core 5.8.0 → 5.8.2

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 (39) hide show
  1. package/dist/tolgee.cjs.js +650 -716
  2. package/dist/tolgee.cjs.js.map +1 -1
  3. package/dist/tolgee.cjs.min.js +1 -1
  4. package/dist/tolgee.cjs.min.js.map +1 -1
  5. package/dist/tolgee.esm.js +650 -716
  6. package/dist/tolgee.esm.js.map +1 -1
  7. package/dist/tolgee.esm.min.js +1 -1
  8. package/dist/tolgee.esm.min.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.esm.mjs +650 -716
  12. package/dist/tolgee.esm.mjs.map +1 -1
  13. package/dist/tolgee.umd.js +650 -716
  14. package/dist/tolgee.umd.js.map +1 -1
  15. package/dist/tolgee.umd.min.js +1 -1
  16. package/dist/tolgee.umd.min.js.map +1 -1
  17. package/lib/Controller/Cache/Cache.d.ts +14 -14
  18. package/lib/Controller/Controller.d.ts +23 -23
  19. package/lib/Controller/Events/EventEmitter.d.ts +1 -1
  20. package/lib/Controller/Events/EventEmitterSelective.d.ts +1 -1
  21. package/lib/Controller/Events/Events.d.ts +2 -2
  22. package/lib/Controller/Plugins/Plugins.d.ts +17 -17
  23. package/lib/Controller/State/State.d.ts +20 -20
  24. package/lib/Controller/State/initState.d.ts +1 -1
  25. package/lib/TolgeeCore.d.ts +2 -2
  26. package/lib/helpers.d.ts +2 -2
  27. package/package.json +2 -2
  28. package/src/Controller/Cache/Cache.ts +175 -193
  29. package/src/Controller/Controller.ts +105 -114
  30. package/src/Controller/Events/EventEmitter.ts +21 -22
  31. package/src/Controller/Events/EventEmitterSelective.ts +59 -58
  32. package/src/Controller/Events/Events.ts +41 -52
  33. package/src/Controller/Plugins/Plugins.ts +206 -219
  34. package/src/Controller/State/State.ts +135 -152
  35. package/src/Controller/State/initState.ts +3 -3
  36. package/src/Controller/ValueObserver.ts +11 -12
  37. package/src/TolgeeCore.ts +7 -7
  38. package/src/__test/cache.test.ts +3 -2
  39. package/src/helpers.ts +6 -5
@@ -1,32 +1,31 @@
1
1
  import { Subscription, Listener } from '../../types';
2
2
 
3
- export const EventEmitter = <T>(
3
+ export function EventEmitter<T>(
4
4
  isActive: () => boolean
5
- ): EventEmitterInstance<T> => {
5
+ ): EventEmitterInstance<T> {
6
6
  let handlers: Listener<T>[] = [];
7
7
 
8
- const listen = (handler: Listener<T>): Subscription => {
9
- const handlerWrapper: Listener<T> = (e) => {
10
- handler(e);
11
- };
8
+ return Object.freeze({
9
+ listen(handler: Listener<T>): Subscription {
10
+ const handlerWrapper: Listener<T> = (e) => {
11
+ handler(e);
12
+ };
12
13
 
13
- handlers.push(handlerWrapper);
14
+ handlers.push(handlerWrapper);
14
15
 
15
- return {
16
- unsubscribe: () => {
17
- handlers = handlers.filter((i) => handlerWrapper !== i);
18
- },
19
- };
20
- };
21
-
22
- const emit = (data: T) => {
23
- if (isActive()) {
24
- handlers.forEach((handler) => handler({ value: data }));
25
- }
26
- };
27
-
28
- return Object.freeze({ listen, emit });
29
- };
16
+ return {
17
+ unsubscribe() {
18
+ handlers = handlers.filter((i) => handlerWrapper !== i);
19
+ },
20
+ };
21
+ },
22
+ emit(data: T) {
23
+ if (isActive()) {
24
+ handlers.forEach((handler) => handler({ value: data }));
25
+ }
26
+ },
27
+ });
28
+ }
30
29
 
31
30
  export type EventEmitterInstance<T> = {
32
31
  readonly listen: (handler: Listener<T>) => Subscription;
@@ -15,54 +15,15 @@ type HandlerWrapperType = {
15
15
  namespaces: Set<string>;
16
16
  };
17
17
 
18
- export const EventEmitterSelective = (
18
+ export function EventEmitterSelective(
19
19
  isActive: () => boolean,
20
20
  getFallbackNs: () => string[],
21
21
  getDefaultNs: () => string
22
- ): EventEmitterSelectiveInstance => {
22
+ ): EventEmitterSelectiveInstance {
23
23
  const listeners: Set<Listener<undefined>> = new Set();
24
24
  const partialListeners: Set<HandlerWrapperType> = new Set();
25
25
 
26
- const listen = (handler: Listener<undefined>) => {
27
- listeners.add(handler);
28
- const result = {
29
- unsubscribe: () => {
30
- listeners.delete(handler);
31
- },
32
- };
33
- return result;
34
- };
35
-
36
- const listenSome = (handler: Listener<undefined>) => {
37
- const handlerWrapper = {
38
- fn: (e: ListenerEvent<undefined>) => {
39
- handler(e);
40
- },
41
- namespaces: new Set<NsListType>(),
42
- };
43
-
44
- partialListeners.add(handlerWrapper);
45
-
46
- const result = {
47
- unsubscribe: () => {
48
- partialListeners.delete(handlerWrapper);
49
- },
50
- subscribeNs: (ns: NsFallback) => {
51
- getFallbackArray(ns).forEach((val) =>
52
- handlerWrapper.namespaces.add(val)
53
- );
54
- if (ns === undefined) {
55
- // subscribing to default ns
56
- handlerWrapper.namespaces.add(getDefaultNs());
57
- }
58
- return result;
59
- },
60
- };
61
-
62
- return result;
63
- };
64
-
65
- const callHandlers = (ns: Array<string> | undefined) => {
26
+ function callHandlers(ns: Array<string> | undefined) {
66
27
  // everything is implicitly subscribed to fallbacks
67
28
  // as it can always fall through to it
68
29
  const fallbackNamespaces = new Set(getFallbackNs());
@@ -78,11 +39,12 @@ export const EventEmitterSelective = (
78
39
  handler.fn({ value: undefined as any });
79
40
  }
80
41
  });
81
- };
42
+ }
82
43
 
83
44
  let queue: (string[] | undefined)[] = [];
45
+
84
46
  // merge events in queue into one event
85
- const solveQueue = () => {
47
+ function solveQueue() {
86
48
  if (queue.length === 0) {
87
49
  return;
88
50
  }
@@ -109,21 +71,60 @@ export const EventEmitterSelective = (
109
71
  : undefined;
110
72
 
111
73
  callHandlers(namespacesArray);
112
- };
113
-
114
- const emit = (ns?: string[], delayed?: boolean) => {
115
- if (isActive()) {
116
- queue.push(ns);
117
- if (!delayed) {
118
- solveQueue();
119
- } else {
120
- setTimeout(solveQueue, 0);
74
+ }
75
+
76
+ return Object.freeze({
77
+ emit(ns?: string[], delayed?: boolean) {
78
+ if (isActive()) {
79
+ queue.push(ns);
80
+ if (!delayed) {
81
+ solveQueue();
82
+ } else {
83
+ setTimeout(solveQueue, 0);
84
+ }
121
85
  }
122
- }
123
- };
124
-
125
- return Object.freeze({ listenSome, listen, emit });
126
- };
86
+ },
87
+
88
+ listen(handler: Listener<undefined>) {
89
+ listeners.add(handler);
90
+ const result = {
91
+ unsubscribe: () => {
92
+ listeners.delete(handler);
93
+ },
94
+ };
95
+ return result;
96
+ },
97
+
98
+ listenSome(handler: Listener<undefined>) {
99
+ const handlerWrapper = {
100
+ fn: (e: ListenerEvent<undefined>) => {
101
+ handler(e);
102
+ },
103
+ namespaces: new Set<NsListType>(),
104
+ };
105
+
106
+ partialListeners.add(handlerWrapper);
107
+
108
+ const result = {
109
+ unsubscribe: () => {
110
+ partialListeners.delete(handlerWrapper);
111
+ },
112
+ subscribeNs: (ns: NsFallback) => {
113
+ getFallbackArray(ns).forEach((val) =>
114
+ handlerWrapper.namespaces.add(val)
115
+ );
116
+ if (ns === undefined) {
117
+ // subscribing to default ns
118
+ handlerWrapper.namespaces.add(getDefaultNs());
119
+ }
120
+ return result;
121
+ },
122
+ };
123
+
124
+ return result;
125
+ },
126
+ });
127
+ }
127
128
 
128
129
  export type EventEmitterSelectiveInstance = {
129
130
  readonly listenSome: (handler: Listener<undefined>) => SubscriptionSelective;
@@ -2,68 +2,57 @@ import { EventEmitter } from './EventEmitter';
2
2
  import { EventEmitterSelective } from './EventEmitterSelective';
3
3
  import { CacheDescriptorWithKey, TolgeeOn } from '../../types';
4
4
 
5
- export const Events = (
5
+ export function Events(
6
6
  getFallbackNs: () => string[],
7
7
  getDefaultNs: () => string
8
- ) => {
8
+ ) {
9
9
  let emitterActive = true;
10
10
 
11
11
  function isActive() {
12
12
  return emitterActive;
13
13
  }
14
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);
23
-
24
- onInitialLoaded.listen(() => onUpdate.emit());
25
- onLanguageChange.listen(() => onUpdate.emit());
26
- onCacheChange.listen(({ value }) => {
27
- onUpdate.emit([value.namespace], true);
15
+ const self = Object.freeze({
16
+ onPendingLanguageChange: EventEmitter<string>(isActive),
17
+ onLanguageChange: EventEmitter<string>(isActive),
18
+ onLoadingChange: EventEmitter<boolean>(isActive),
19
+ onFetchingChange: EventEmitter<boolean>(isActive),
20
+ onInitialLoaded: EventEmitter<void>(isActive),
21
+ onRunningChange: EventEmitter<boolean>(isActive),
22
+ onCacheChange: EventEmitter<CacheDescriptorWithKey>(isActive),
23
+ onUpdate: EventEmitterSelective(isActive, getFallbackNs, getDefaultNs),
24
+ setEmitterActive(active: boolean) {
25
+ emitterActive = active;
26
+ },
27
+ on: ((event, handler): any => {
28
+ switch (event) {
29
+ case 'pendingLanguage':
30
+ return self.onPendingLanguageChange.listen(handler as any);
31
+ case 'language':
32
+ return self.onLanguageChange.listen(handler as any);
33
+ case 'loading':
34
+ return self.onLoadingChange.listen(handler as any);
35
+ case 'fetching':
36
+ return self.onFetchingChange.listen(handler as any);
37
+ case 'initialLoad':
38
+ return self.onInitialLoaded.listen(handler as any);
39
+ case 'running':
40
+ return self.onRunningChange.listen(handler as any);
41
+ case 'cache':
42
+ return self.onCacheChange.listen(handler as any);
43
+ case 'update':
44
+ return self.onUpdate.listen(handler as any);
45
+ }
46
+ }) as TolgeeOn,
28
47
  });
29
48
 
30
- const on: TolgeeOn = (event, handler): any => {
31
- switch (event) {
32
- case 'pendingLanguage':
33
- return onPendingLanguageChange.listen(handler as any);
34
- case 'language':
35
- return onLanguageChange.listen(handler as any);
36
- case 'loading':
37
- return onLoadingChange.listen(handler as any);
38
- case 'fetching':
39
- return onFetchingChange.listen(handler as any);
40
- case 'initialLoad':
41
- return onInitialLoaded.listen(handler as any);
42
- case 'running':
43
- return onRunningChange.listen(handler as any);
44
- case 'cache':
45
- return onCacheChange.listen(handler as any);
46
- case 'update':
47
- return onUpdate.listen(handler as any);
48
- }
49
- };
50
-
51
- function setEmitterActive(active: boolean) {
52
- emitterActive = active;
53
- }
49
+ self.onInitialLoaded.listen(() => self.onUpdate.emit());
50
+ self.onLanguageChange.listen(() => self.onUpdate.emit());
51
+ self.onCacheChange.listen(({ value }) =>
52
+ self.onUpdate.emit([value.namespace], true)
53
+ );
54
54
 
55
- return Object.freeze({
56
- onPendingLanguageChange,
57
- onLanguageChange,
58
- onLoadingChange,
59
- onFetchingChange,
60
- onInitialLoaded,
61
- onRunningChange,
62
- onCacheChange,
63
- onUpdate,
64
- setEmitterActive,
65
- on,
66
- });
67
- };
55
+ return self;
56
+ }
68
57
 
69
58
  export type EventsInstance = ReturnType<typeof Events>;