@tolgee/core 4.9.2 → 5.0.0-rc.0b3e627.0

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 (273) hide show
  1. package/dist/tolgee.cjs.js +1069 -7029
  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.min.mjs +1 -1
  6. package/dist/tolgee.esm.min.mjs.map +1 -1
  7. package/dist/tolgee.esm.mjs +1067 -7024
  8. package/dist/tolgee.esm.mjs.map +1 -1
  9. package/dist/tolgee.umd.js +1069 -7029
  10. package/dist/tolgee.umd.js.map +1 -1
  11. package/dist/tolgee.umd.min.js +1 -1
  12. package/dist/tolgee.umd.min.js.map +1 -1
  13. package/lib/Controller/Cache/Cache.d.ts +23 -0
  14. package/lib/Controller/Cache/helpers.d.ts +4 -0
  15. package/lib/Controller/Controller.d.ts +93 -0
  16. package/lib/Controller/Plugins/Plugins.d.ts +41 -0
  17. package/lib/Controller/State/State.d.ts +22 -0
  18. package/lib/Controller/State/helpers.d.ts +6 -0
  19. package/lib/Controller/State/initState.d.ts +55 -0
  20. package/lib/Controller/ValueObserver.d.ts +5 -0
  21. package/lib/Events/EventEmitter.d.ts +6 -0
  22. package/lib/Events/EventEmitterSelective.d.ts +15 -0
  23. package/lib/Events/Events.d.ts +50 -0
  24. package/lib/Tolgee.d.ts +2 -68
  25. package/lib/TranslateParams.d.ts +2 -0
  26. package/lib/{Constants/Global.d.ts → constants.d.ts} +1 -2
  27. package/lib/helpers.d.ts +3 -0
  28. package/lib/index.d.ts +3 -8
  29. package/lib/types.d.ts +235 -84
  30. package/package.json +20 -29
  31. package/src/Controller/Cache/Cache.ts +295 -0
  32. package/src/Controller/Cache/helpers.ts +39 -0
  33. package/src/Controller/Controller.ts +289 -0
  34. package/src/Controller/Plugins/Plugins.ts +305 -0
  35. package/src/Controller/State/State.ts +165 -0
  36. package/src/Controller/State/helpers.ts +41 -0
  37. package/src/Controller/State/initState.ts +90 -0
  38. package/src/Controller/ValueObserver.ts +23 -0
  39. package/src/Events/EventEmitter.ts +27 -0
  40. package/src/Events/EventEmitterSelective.test.ts +108 -0
  41. package/src/Events/EventEmitterSelective.ts +160 -0
  42. package/src/Events/Events.ts +66 -0
  43. package/src/Tolgee.ts +75 -333
  44. package/src/TranslateParams.test.ts +41 -0
  45. package/src/TranslateParams.ts +51 -0
  46. package/src/__test/backend.test.ts +48 -0
  47. package/src/__test/client.test.ts +48 -0
  48. package/src/__test/events.test.ts +33 -0
  49. package/src/__test/initialization.test.ts +73 -0
  50. package/src/__test/jest-setup.ts +2 -0
  51. package/src/__test/languageDetection.test.ts +123 -0
  52. package/src/__test/languageStorage.test.ts +145 -0
  53. package/src/__test/languages.test.ts +106 -0
  54. package/src/__test/loading.test.ts +39 -0
  55. package/src/__test/namespaces.test.ts +99 -0
  56. package/src/__test/namespacesFallback.test.ts +73 -0
  57. package/src/__test/plugins.test.ts +98 -0
  58. package/src/__test/testTools.ts +7 -0
  59. package/src/{Constants/Global.ts → constants.ts} +1 -3
  60. package/src/helpers.ts +17 -0
  61. package/src/index.ts +9 -8
  62. package/src/types.ts +324 -90
  63. package/README.md +0 -45
  64. package/dist/Constants/Global.d.ts +0 -6
  65. package/dist/Constants/ModifierKey.d.ts +0 -6
  66. package/dist/Errors/ApiHttpError.d.ts +0 -5
  67. package/dist/Observer.d.ts +0 -14
  68. package/dist/Observer.test.d.ts +0 -2
  69. package/dist/Properties.d.ts +0 -17
  70. package/dist/Properties.test.d.ts +0 -1
  71. package/dist/Tolgee.d.ts +0 -68
  72. package/dist/Tolgee.test.d.ts +0 -1
  73. package/dist/TolgeeConfig.d.ts +0 -69
  74. package/dist/TolgeeConfig.test.d.ts +0 -1
  75. package/dist/__integration/FormatterIcu.test.d.ts +0 -1
  76. package/dist/__integration/FormatterMissing.d.ts +0 -1
  77. package/dist/__integration/Tolgee.test.d.ts +0 -1
  78. package/dist/__integration/TolgeeInvisible.test.d.ts +0 -1
  79. package/dist/__integration/mockTranslations.d.ts +0 -7
  80. package/dist/__integration/testConfig.d.ts +0 -9
  81. package/dist/__testFixtures/classMock.d.ts +0 -3
  82. package/dist/__testFixtures/createElement.d.ts +0 -2
  83. package/dist/__testFixtures/createTestDom.d.ts +0 -9
  84. package/dist/__testFixtures/mocked.d.ts +0 -20
  85. package/dist/__testFixtures/setupAfterEnv.d.ts +0 -8
  86. package/dist/helpers/NodeHelper.d.ts +0 -14
  87. package/dist/helpers/TextHelper.d.ts +0 -5
  88. package/dist/helpers/TextHelper.test.d.ts +0 -1
  89. package/dist/helpers/commonTypes.d.ts +0 -2
  90. package/dist/helpers/encoderPolyfill.d.ts +0 -8
  91. package/dist/helpers/secret.d.ts +0 -6
  92. package/dist/helpers/secret.test.d.ts +0 -1
  93. package/dist/helpers/sleep.d.ts +0 -1
  94. package/dist/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  95. package/dist/highlighter/HighlightFunctionsInitializer.test.d.ts +0 -1
  96. package/dist/highlighter/MouseEventHandler.d.ts +0 -29
  97. package/dist/highlighter/MouseEventHandler.test.d.ts +0 -1
  98. package/dist/highlighter/TranslationHighlighter.d.ts +0 -14
  99. package/dist/highlighter/TranslationHighlighter.test.d.ts +0 -1
  100. package/dist/index.d.ts +0 -10
  101. package/dist/internal.d.ts +0 -2
  102. package/dist/modules/IcuFormatter.d.ts +0 -2
  103. package/dist/modules/IcuFormatter.test.d.ts +0 -1
  104. package/dist/modules/index.d.ts +0 -1
  105. package/dist/services/ApiHttpService.d.ts +0 -15
  106. package/dist/services/CoreService.d.ts +0 -18
  107. package/dist/services/CoreService.test.d.ts +0 -1
  108. package/dist/services/DependencyService.d.ts +0 -39
  109. package/dist/services/DependencyService.test.d.ts +0 -1
  110. package/dist/services/ElementRegistrar.d.ts +0 -19
  111. package/dist/services/ElementRegistrar.test.d.ts +0 -1
  112. package/dist/services/EventEmitter.d.ts +0 -13
  113. package/dist/services/EventService.d.ts +0 -9
  114. package/dist/services/ModuleService.d.ts +0 -5
  115. package/dist/services/ScreenshotService.d.ts +0 -15
  116. package/dist/services/Subscription.d.ts +0 -5
  117. package/dist/services/TextService.d.ts +0 -14
  118. package/dist/services/TextService.test.d.ts +0 -1
  119. package/dist/services/TranslationService.d.ts +0 -75
  120. package/dist/services/TranslationService.test.d.ts +0 -1
  121. package/dist/services/__mocks__/CoreService.d.ts +0 -2
  122. package/dist/toolsManager/Messages.d.ts +0 -8
  123. package/dist/toolsManager/Messages.test.d.ts +0 -1
  124. package/dist/toolsManager/PluginManager.d.ts +0 -21
  125. package/dist/toolsManager/PluginManager.test.d.ts +0 -1
  126. package/dist/types/DTOs.d.ts +0 -20
  127. package/dist/types/apiSchema.generated.d.ts +0 -6185
  128. package/dist/types.d.ts +0 -123
  129. package/dist/wrappers/AbstractWrapper.d.ts +0 -8
  130. package/dist/wrappers/NodeHandler.d.ts +0 -18
  131. package/dist/wrappers/WrappedHandler.d.ts +0 -8
  132. package/dist/wrappers/invisible/AttributeHandler.d.ts +0 -8
  133. package/dist/wrappers/invisible/Coder.d.ts +0 -7
  134. package/dist/wrappers/invisible/ContentHandler.d.ts +0 -6
  135. package/dist/wrappers/invisible/CoreHandler.d.ts +0 -10
  136. package/dist/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  137. package/dist/wrappers/invisible/ValueMemory.d.ts +0 -5
  138. package/dist/wrappers/invisible/ValueMemory.test.d.ts +0 -1
  139. package/dist/wrappers/text/AttributeHandler.d.ts +0 -8
  140. package/dist/wrappers/text/AttributeHandler.test.d.ts +0 -1
  141. package/dist/wrappers/text/Coder.d.ts +0 -15
  142. package/dist/wrappers/text/Coder.test.d.ts +0 -1
  143. package/dist/wrappers/text/ContentHandler.d.ts +0 -8
  144. package/dist/wrappers/text/ContentHandler.test.d.ts +0 -1
  145. package/dist/wrappers/text/CoreHandler.d.ts +0 -17
  146. package/dist/wrappers/text/CoreHandler.test.d.ts +0 -1
  147. package/dist/wrappers/text/TextWrapper.d.ts +0 -20
  148. package/index.js +0 -7
  149. package/lib/Constants/ModifierKey.d.ts +0 -6
  150. package/lib/Errors/ApiHttpError.d.ts +0 -5
  151. package/lib/Observer.d.ts +0 -14
  152. package/lib/Properties.d.ts +0 -17
  153. package/lib/TolgeeConfig.d.ts +0 -69
  154. package/lib/helpers/NodeHelper.d.ts +0 -14
  155. package/lib/helpers/TextHelper.d.ts +0 -5
  156. package/lib/helpers/commonTypes.d.ts +0 -2
  157. package/lib/helpers/encoderPolyfill.d.ts +0 -8
  158. package/lib/helpers/secret.d.ts +0 -6
  159. package/lib/helpers/sleep.d.ts +0 -1
  160. package/lib/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  161. package/lib/highlighter/MouseEventHandler.d.ts +0 -29
  162. package/lib/highlighter/TranslationHighlighter.d.ts +0 -14
  163. package/lib/modules/IcuFormatter.d.ts +0 -2
  164. package/lib/modules/index.d.ts +0 -1
  165. package/lib/services/ApiHttpService.d.ts +0 -15
  166. package/lib/services/CoreService.d.ts +0 -18
  167. package/lib/services/DependencyService.d.ts +0 -39
  168. package/lib/services/ElementRegistrar.d.ts +0 -19
  169. package/lib/services/EventEmitter.d.ts +0 -13
  170. package/lib/services/EventService.d.ts +0 -9
  171. package/lib/services/ModuleService.d.ts +0 -5
  172. package/lib/services/ScreenshotService.d.ts +0 -15
  173. package/lib/services/Subscription.d.ts +0 -5
  174. package/lib/services/TextService.d.ts +0 -14
  175. package/lib/services/TranslationService.d.ts +0 -75
  176. package/lib/toolsManager/Messages.d.ts +0 -8
  177. package/lib/toolsManager/PluginManager.d.ts +0 -21
  178. package/lib/types/DTOs.d.ts +0 -20
  179. package/lib/types/apiSchema.generated.d.ts +0 -6185
  180. package/lib/wrappers/AbstractWrapper.d.ts +0 -8
  181. package/lib/wrappers/NodeHandler.d.ts +0 -18
  182. package/lib/wrappers/WrappedHandler.d.ts +0 -8
  183. package/lib/wrappers/invisible/AttributeHandler.d.ts +0 -8
  184. package/lib/wrappers/invisible/Coder.d.ts +0 -7
  185. package/lib/wrappers/invisible/ContentHandler.d.ts +0 -6
  186. package/lib/wrappers/invisible/CoreHandler.d.ts +0 -10
  187. package/lib/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  188. package/lib/wrappers/invisible/ValueMemory.d.ts +0 -5
  189. package/lib/wrappers/text/AttributeHandler.d.ts +0 -8
  190. package/lib/wrappers/text/Coder.d.ts +0 -15
  191. package/lib/wrappers/text/ContentHandler.d.ts +0 -8
  192. package/lib/wrappers/text/CoreHandler.d.ts +0 -17
  193. package/lib/wrappers/text/TextWrapper.d.ts +0 -20
  194. package/src/Constants/ModifierKey.ts +0 -6
  195. package/src/Errors/ApiHttpError.ts +0 -8
  196. package/src/Observer.test.ts +0 -119
  197. package/src/Observer.ts +0 -68
  198. package/src/Properties.test.ts +0 -150
  199. package/src/Properties.ts +0 -112
  200. package/src/Tolgee.test.ts +0 -473
  201. package/src/TolgeeConfig.test.ts +0 -21
  202. package/src/TolgeeConfig.ts +0 -134
  203. package/src/__integration/FormatterIcu.test.ts +0 -80
  204. package/src/__integration/FormatterMissing.ts +0 -54
  205. package/src/__integration/Tolgee.test.ts +0 -90
  206. package/src/__integration/TolgeeInvisible.test.ts +0 -145
  207. package/src/__integration/mockTranslations.ts +0 -6
  208. package/src/__integration/testConfig.ts +0 -16
  209. package/src/__testFixtures/classMock.ts +0 -11
  210. package/src/__testFixtures/createElement.ts +0 -43
  211. package/src/__testFixtures/createTestDom.ts +0 -26
  212. package/src/__testFixtures/mocked.ts +0 -25
  213. package/src/__testFixtures/setupAfterEnv.ts +0 -34
  214. package/src/helpers/NodeHelper.ts +0 -90
  215. package/src/helpers/TextHelper.test.ts +0 -62
  216. package/src/helpers/TextHelper.ts +0 -58
  217. package/src/helpers/commonTypes.ts +0 -8
  218. package/src/helpers/encoderPolyfill.ts +0 -96
  219. package/src/helpers/secret.test.ts +0 -61
  220. package/src/helpers/secret.ts +0 -68
  221. package/src/helpers/sleep.ts +0 -2
  222. package/src/highlighter/HighlightFunctionsInitializer.test.ts +0 -40
  223. package/src/highlighter/HighlightFunctionsInitializer.ts +0 -61
  224. package/src/highlighter/MouseEventHandler.test.ts +0 -151
  225. package/src/highlighter/MouseEventHandler.ts +0 -191
  226. package/src/highlighter/TranslationHighlighter.test.ts +0 -177
  227. package/src/highlighter/TranslationHighlighter.ts +0 -113
  228. package/src/internal.ts +0 -2
  229. package/src/modules/IcuFormatter.test.ts +0 -21
  230. package/src/modules/IcuFormatter.ts +0 -39
  231. package/src/modules/index.ts +0 -1
  232. package/src/services/ApiHttpService.ts +0 -85
  233. package/src/services/CoreService.test.ts +0 -141
  234. package/src/services/CoreService.ts +0 -76
  235. package/src/services/DependencyService.test.ts +0 -51
  236. package/src/services/DependencyService.ts +0 -116
  237. package/src/services/ElementRegistrar.test.ts +0 -131
  238. package/src/services/ElementRegistrar.ts +0 -108
  239. package/src/services/EventEmitter.ts +0 -52
  240. package/src/services/EventService.ts +0 -14
  241. package/src/services/ModuleService.ts +0 -14
  242. package/src/services/ScreenshotService.ts +0 -31
  243. package/src/services/Subscription.ts +0 -7
  244. package/src/services/TextService.test.ts +0 -88
  245. package/src/services/TextService.ts +0 -82
  246. package/src/services/TranslationService.test.ts +0 -358
  247. package/src/services/TranslationService.ts +0 -417
  248. package/src/services/__mocks__/CoreService.ts +0 -17
  249. package/src/toolsManager/Messages.test.ts +0 -79
  250. package/src/toolsManager/Messages.ts +0 -60
  251. package/src/toolsManager/PluginManager.test.ts +0 -108
  252. package/src/toolsManager/PluginManager.ts +0 -129
  253. package/src/types/DTOs.ts +0 -25
  254. package/src/types/apiSchema.generated.ts +0 -6208
  255. package/src/wrappers/AbstractWrapper.ts +0 -14
  256. package/src/wrappers/NodeHandler.ts +0 -143
  257. package/src/wrappers/WrappedHandler.ts +0 -28
  258. package/src/wrappers/invisible/AttributeHandler.ts +0 -23
  259. package/src/wrappers/invisible/Coder.ts +0 -65
  260. package/src/wrappers/invisible/ContentHandler.ts +0 -15
  261. package/src/wrappers/invisible/CoreHandler.ts +0 -17
  262. package/src/wrappers/invisible/InvisibleWrapper.ts +0 -59
  263. package/src/wrappers/invisible/ValueMemory.test.ts +0 -25
  264. package/src/wrappers/invisible/ValueMemory.ts +0 -16
  265. package/src/wrappers/text/AttributeHandler.test.ts +0 -118
  266. package/src/wrappers/text/AttributeHandler.ts +0 -25
  267. package/src/wrappers/text/Coder.test.ts +0 -298
  268. package/src/wrappers/text/Coder.ts +0 -202
  269. package/src/wrappers/text/ContentHandler.test.ts +0 -185
  270. package/src/wrappers/text/ContentHandler.ts +0 -21
  271. package/src/wrappers/text/CoreHandler.test.ts +0 -106
  272. package/src/wrappers/text/CoreHandler.ts +0 -45
  273. package/src/wrappers/text/TextWrapper.ts +0 -69
@@ -0,0 +1,108 @@
1
+ import { EventEmitterSelective } from './EventEmitterSelective';
2
+
3
+ describe('event emitter selective', () => {
4
+ it('subscribes to key', () => {
5
+ const emitter = EventEmitterSelective<void>();
6
+ const handler = jest.fn();
7
+ const listener = emitter.listenSome(handler);
8
+ listener.subscribeKey({ key: 'test' });
9
+ listener.subscribeKey({ key: 'abcd' });
10
+
11
+ emitter.emit({ key: 'test' });
12
+ emitter.emit({ key: 'youda' });
13
+ expect(handler).toBeCalledTimes(1);
14
+ listener.unsubscribe();
15
+ emitter.emit();
16
+ expect(handler).toBeCalledTimes(1);
17
+ });
18
+
19
+ it('subscribes to key with namespaces', () => {
20
+ const emitter = EventEmitterSelective<void>();
21
+ const handler = jest.fn();
22
+ const listener = emitter.listenSome(handler);
23
+
24
+ listener.subscribeKey({ key: 'test', ns: 'common' });
25
+ listener.subscribeKey({ key: 'abcd', ns: ['test', 'abcd'] });
26
+
27
+ emitter.emit({ key: 'youda', ns: ['common'] });
28
+ emitter.emit({ key: 'test', ns: ['youda'] });
29
+ expect(handler).toBeCalledTimes(0);
30
+ emitter.emit({ key: 'abcd', ns: ['abcd'] });
31
+ emitter.emit({ ns: ['test'] });
32
+ expect(handler).toBeCalledTimes(2);
33
+ listener.unsubscribe();
34
+ emitter.emit();
35
+ expect(handler).toBeCalledTimes(2);
36
+ });
37
+
38
+ it('unsubscribes', () => {
39
+ const emitter = EventEmitterSelective<void>();
40
+ const handler = jest.fn();
41
+ const listener = emitter.listenSome(handler);
42
+
43
+ listener.subscribeKey({ key: 'test', ns: 'common' });
44
+ listener.subscribeKey({ key: 'abcd', ns: ['test', 'abcd'] });
45
+
46
+ emitter.emit({ key: 'youda', ns: ['common'] });
47
+ emitter.emit({ key: 'test', ns: ['youda'] });
48
+ expect(handler).toBeCalledTimes(0);
49
+ emitter.emit({ key: 'abcd', ns: ['abcd'] });
50
+ emitter.emit({ ns: ['test'] });
51
+ expect(handler).toBeCalledTimes(2);
52
+
53
+ listener.unsubscribeKey({ key: 'abcd', ns: ['test', 'abcd'] });
54
+ emitter.emit({ key: 'abcd' });
55
+ emitter.emit({ ns: ['test'] });
56
+
57
+ listener.unsubscribe();
58
+ emitter.emit();
59
+ expect(handler).toBeCalledTimes(2);
60
+ });
61
+
62
+ it('groups events correctly', async () => {
63
+ const emitter = EventEmitterSelective<void>();
64
+ const handler = jest.fn();
65
+ const hanlderAll = jest.fn();
66
+ const listener = emitter.listenSome(handler);
67
+ const listenerAll = emitter.listen(hanlderAll);
68
+
69
+ listener.subscribeKey({ key: 'abcd', ns: ['test', 'abcd'] });
70
+
71
+ emitter.emit({ key: 'abcd' }, true);
72
+ emitter.emit({ ns: ['opqrst'] }, true);
73
+
74
+ await Promise.resolve();
75
+
76
+ expect(hanlderAll).toBeCalledTimes(1);
77
+ expect(handler).toBeCalledTimes(1);
78
+
79
+ emitter.emit({ key: 'youda', ns: ['test'] }, true);
80
+ emitter.emit({ key: 'filda', ns: ['test'] });
81
+
82
+ expect(hanlderAll).toBeCalledTimes(2);
83
+ expect(handler).toBeCalledTimes(1);
84
+
85
+ listener.unsubscribe();
86
+ listenerAll.unsubscribe();
87
+ emitter.emit();
88
+ });
89
+
90
+ it('subscribes to ns only', async () => {
91
+ const emitter = EventEmitterSelective<void>();
92
+ const handler = jest.fn();
93
+ const listener = emitter.listenSome(handler);
94
+ listener.subscribeNs(['test']);
95
+
96
+ emitter.emit({ key: 'youda' });
97
+ expect(handler).toBeCalledTimes(1);
98
+
99
+ emitter.emit({ ns: ['test'] });
100
+ expect(handler).toBeCalledTimes(2);
101
+
102
+ emitter.emit({ ns: ['youda'] });
103
+ expect(handler).toBeCalledTimes(2);
104
+
105
+ emitter.emit({ key: 'youda', ns: ['youda'] });
106
+ expect(handler).toBeCalledTimes(2);
107
+ });
108
+ });
@@ -0,0 +1,160 @@
1
+ import { getFallbackArray } from '../Controller/State/helpers';
2
+ import {
3
+ FallbackNSTranslation,
4
+ KeyDescriptor,
5
+ KeyDescriptorInternal,
6
+ ListenerHandler,
7
+ ListenerHandlerEvent,
8
+ } from '../types';
9
+
10
+ type HandlerWrapperType = {
11
+ fn: ListenerHandler<undefined>;
12
+ keys: Map<string, number>;
13
+ namespaces: Map<string | undefined, number>;
14
+ };
15
+
16
+ function incrementInMap(map: Map<any, number>, value: any) {
17
+ const currNum = map.get(value) || 0;
18
+ map.set(value, currNum + 1);
19
+ }
20
+
21
+ function decrementInMap(map: Map<any, number>, value: any) {
22
+ let currNum = map.get(value) || 1;
23
+ currNum -= 1;
24
+ if (currNum <= 0) {
25
+ map.delete(value);
26
+ } else {
27
+ map.set(value, currNum);
28
+ }
29
+ }
30
+
31
+ export const EventEmitterSelective = <T>() => {
32
+ const listeners: Set<ListenerHandler<T>> = new Set();
33
+ const partialListeners: Set<HandlerWrapperType> = new Set();
34
+
35
+ const listen = (handler: ListenerHandler<T>) => {
36
+ listeners.add(handler);
37
+ const result = {
38
+ unsubscribe: () => {
39
+ listeners.delete(handler);
40
+ },
41
+ };
42
+ return result;
43
+ };
44
+
45
+ const listenSome = (handler: ListenerHandler<undefined>) => {
46
+ const handlerWrapper = {
47
+ fn: (e: ListenerHandlerEvent<undefined>) => {
48
+ handler(e);
49
+ },
50
+ keys: new Map<string, number>(),
51
+ namespaces: new Map<string | undefined, number>(),
52
+ };
53
+
54
+ partialListeners.add(handlerWrapper);
55
+
56
+ const result = {
57
+ unsubscribe: () => {
58
+ partialListeners.delete(handlerWrapper);
59
+ },
60
+ subscribeNs: (ns: FallbackNSTranslation) => {
61
+ getFallbackArray(ns).forEach((val) =>
62
+ incrementInMap(handlerWrapper.namespaces, val)
63
+ );
64
+ return result;
65
+ },
66
+ unsubscribeNs: (ns: FallbackNSTranslation) => {
67
+ getFallbackArray(ns).forEach((val) =>
68
+ decrementInMap(handlerWrapper.namespaces, val)
69
+ );
70
+ return result;
71
+ },
72
+ subscribeKey: (descriptor: KeyDescriptor) => {
73
+ const { key, ns } = descriptor;
74
+ incrementInMap(handlerWrapper.keys, key);
75
+ getFallbackArray(ns).forEach((val) =>
76
+ incrementInMap(handlerWrapper.namespaces, val)
77
+ );
78
+ if (ns === undefined) {
79
+ // subscribing to all namespaces
80
+ incrementInMap(handlerWrapper.namespaces, undefined);
81
+ }
82
+ return result;
83
+ },
84
+ unsubscribeKey: (descriptor: KeyDescriptor) => {
85
+ const { key, ns } = descriptor;
86
+ decrementInMap(handlerWrapper.keys, key);
87
+ getFallbackArray(ns).forEach((val) =>
88
+ decrementInMap(handlerWrapper.namespaces, val)
89
+ );
90
+ if (ns === undefined) {
91
+ // subscribing to all namespaces
92
+ decrementInMap(handlerWrapper.namespaces, undefined);
93
+ }
94
+ return result;
95
+ },
96
+ };
97
+
98
+ return result;
99
+ };
100
+
101
+ const callHandlers = (key: string | undefined, ns: string[] | undefined) => {
102
+ partialListeners.forEach((handler) => {
103
+ const nsMentioned = ns !== undefined;
104
+ const nsMatches =
105
+ handler.namespaces.has(undefined) ||
106
+ ns?.findIndex((ns) => handler.namespaces.has(ns)) !== -1;
107
+ const keyMentioned = key !== undefined;
108
+ const keyMatches =
109
+ key === undefined || handler.keys.has(key) || handler.keys.size === 0;
110
+ if ((!nsMentioned || nsMatches) && (!keyMentioned || keyMatches)) {
111
+ handler.fn({ value: undefined as any });
112
+ }
113
+ });
114
+ };
115
+
116
+ let queue: (KeyDescriptorInternal | undefined)[] = [];
117
+ const solveQueue = () => {
118
+ if (queue.length === 0) {
119
+ return;
120
+ }
121
+ listeners.forEach((handler) => {
122
+ handler({ value: undefined as any });
123
+ });
124
+
125
+ let namespaces = [] as string[] | undefined;
126
+ let keys = [] as string[] | undefined;
127
+ queue.forEach((descriptor) => {
128
+ if (descriptor?.ns === undefined) {
129
+ namespaces = undefined;
130
+ } else if (namespaces !== undefined) {
131
+ namespaces = [...namespaces, ...descriptor.ns];
132
+ }
133
+ if (descriptor?.key === undefined) {
134
+ keys = undefined;
135
+ } else if (keys !== undefined) {
136
+ keys = [...keys, descriptor.key];
137
+ }
138
+ });
139
+ (keys || [undefined]).forEach((key) => {
140
+ callHandlers(key, namespaces);
141
+ });
142
+ queue = [];
143
+ };
144
+ const emit = (descriptor?: KeyDescriptorInternal, delayed?: boolean) => {
145
+ queue.push(descriptor);
146
+ if (!delayed) {
147
+ solveQueue();
148
+ } else {
149
+ Promise.resolve().then(() => {
150
+ solveQueue();
151
+ });
152
+ }
153
+ };
154
+
155
+ return Object.freeze({ listenSome, listen, emit });
156
+ };
157
+
158
+ export type EventEmitterSelectiveType<T> = ReturnType<
159
+ typeof EventEmitterSelective<T>
160
+ >;
@@ -0,0 +1,66 @@
1
+ import { EventEmitter } from './EventEmitter';
2
+ import { EventEmitterSelective } from './EventEmitterSelective';
3
+ import {
4
+ CacheDescriptorWithKey,
5
+ KeyDescriptorInternal,
6
+ ListenerHandler,
7
+ TolgeeOn,
8
+ } from '../types';
9
+
10
+ export const Events = () => {
11
+ const onPendingLanguageChange = EventEmitter<string>();
12
+ const onLanguageChange = EventEmitter<string>();
13
+ const onKeyChange = EventEmitter<KeyDescriptorInternal>();
14
+ const onLoadingChange = EventEmitter<boolean>();
15
+ const onFetchingChange = EventEmitter<boolean>();
16
+ const onInitialLoaded = EventEmitter<void>();
17
+ const onKeyUpdate = EventEmitterSelective<void>();
18
+ const onCacheChange = EventEmitter<CacheDescriptorWithKey>();
19
+ const onRunningChange = EventEmitter<boolean>();
20
+
21
+ onInitialLoaded.listen(() => onKeyUpdate.emit());
22
+ onLanguageChange.listen(() => onKeyUpdate.emit());
23
+ onCacheChange.listen(({ value }) => {
24
+ onKeyUpdate.emit({ ns: [value.namespace], key: value.key }, true);
25
+ });
26
+
27
+ const on: TolgeeOn = (event, handler): any => {
28
+ switch (event) {
29
+ case 'pendingLanguage':
30
+ return onPendingLanguageChange.listen(
31
+ handler as ListenerHandler<string>
32
+ );
33
+ case 'language':
34
+ return onLanguageChange.listen(handler as ListenerHandler<string>);
35
+ case 'loading':
36
+ return onLoadingChange.listen(handler as ListenerHandler<boolean>);
37
+ case 'fetching':
38
+ return onFetchingChange.listen(handler as ListenerHandler<boolean>);
39
+ case 'initialLoad':
40
+ return onInitialLoaded.listen(handler as ListenerHandler<void>);
41
+ case 'running':
42
+ return onRunningChange.listen(handler as ListenerHandler<boolean>);
43
+ case 'cache':
44
+ return onCacheChange.listen(
45
+ handler as ListenerHandler<CacheDescriptorWithKey>
46
+ );
47
+ case 'keyUpdate':
48
+ return onKeyUpdate.listen(handler as ListenerHandler<void>);
49
+ }
50
+ };
51
+
52
+ return Object.freeze({
53
+ onPendingLanguageChange,
54
+ onLanguageChange,
55
+ onKeyChange,
56
+ onKeyUpdate,
57
+ onLoadingChange,
58
+ onFetchingChange,
59
+ onInitialLoaded,
60
+ onRunningChange,
61
+ onCacheChange,
62
+ on,
63
+ });
64
+ };
65
+
66
+ export type EventServiceType = ReturnType<typeof Events>;