@tolgee/core 4.9.2 → 4.9.3-rc.d287ae9.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 (276) hide show
  1. package/dist/tolgee.cjs.js +1127 -7028
  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 +1125 -7023
  8. package/dist/tolgee.esm.mjs.map +1 -1
  9. package/dist/tolgee.umd.js +1127 -7028
  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 +22 -0
  14. package/lib/Controller/Cache/helpers.d.ts +4 -0
  15. package/lib/Controller/Controller.d.ts +146 -0
  16. package/lib/Controller/Events/EventEmitter.d.ts +6 -0
  17. package/lib/Controller/Events/EventEmitterSelective.d.ts +15 -0
  18. package/lib/Controller/Events/Events.d.ts +50 -0
  19. package/lib/Controller/Plugins/Plugins.d.ts +36 -0
  20. package/lib/Controller/State/State.d.ts +39 -0
  21. package/lib/Controller/State/helpers.d.ts +6 -0
  22. package/lib/Controller/State/initObserverOptions.d.ts +13 -0
  23. package/lib/Controller/State/initState.d.ts +47 -0
  24. package/lib/Controller/ValueObserver.d.ts +5 -0
  25. package/lib/Tolgee.d.ts +2 -68
  26. package/lib/TranslateParams.d.ts +2 -0
  27. package/lib/{Constants/Global.d.ts → constants.d.ts} +1 -2
  28. package/lib/helpers.d.ts +3 -0
  29. package/lib/index.d.ts +3 -8
  30. package/lib/types.d.ts +244 -84
  31. package/package.json +20 -29
  32. package/src/Controller/Cache/Cache.ts +293 -0
  33. package/src/Controller/Cache/helpers.ts +37 -0
  34. package/src/Controller/Controller.ts +310 -0
  35. package/src/Controller/Events/EventEmitter.ts +27 -0
  36. package/src/Controller/Events/EventEmitterSelective.test.ts +125 -0
  37. package/src/Controller/Events/EventEmitterSelective.ts +179 -0
  38. package/src/Controller/Events/Events.ts +66 -0
  39. package/src/Controller/Plugins/Plugins.ts +315 -0
  40. package/src/Controller/State/State.ts +175 -0
  41. package/src/Controller/State/helpers.ts +41 -0
  42. package/src/Controller/State/initObserverOptions.ts +38 -0
  43. package/src/Controller/State/initState.ts +81 -0
  44. package/src/Controller/ValueObserver.ts +23 -0
  45. package/src/Tolgee.ts +79 -330
  46. package/src/TranslateParams.test.ts +41 -0
  47. package/src/TranslateParams.ts +51 -0
  48. package/src/__test/backend.test.ts +48 -0
  49. package/src/__test/cache.test.ts +148 -0
  50. package/src/__test/client.test.ts +48 -0
  51. package/src/__test/events.test.ts +33 -0
  52. package/src/__test/initialization.test.ts +85 -0
  53. package/src/__test/jest-setup.ts +2 -0
  54. package/src/__test/languageDetection.test.ts +129 -0
  55. package/src/__test/languageStorage.test.ts +145 -0
  56. package/src/__test/languages.test.ts +112 -0
  57. package/src/__test/loading.test.ts +39 -0
  58. package/src/__test/namespaces.test.ts +99 -0
  59. package/src/__test/namespacesFallback.test.ts +74 -0
  60. package/src/__test/plugins.test.ts +136 -0
  61. package/src/__test/testTools.ts +7 -0
  62. package/src/{Constants/Global.ts → constants.ts} +1 -3
  63. package/src/helpers.ts +17 -0
  64. package/src/index.ts +9 -8
  65. package/src/types.ts +338 -90
  66. package/README.md +0 -45
  67. package/dist/Constants/Global.d.ts +0 -6
  68. package/dist/Constants/ModifierKey.d.ts +0 -6
  69. package/dist/Errors/ApiHttpError.d.ts +0 -5
  70. package/dist/Observer.d.ts +0 -14
  71. package/dist/Observer.test.d.ts +0 -2
  72. package/dist/Properties.d.ts +0 -17
  73. package/dist/Properties.test.d.ts +0 -1
  74. package/dist/Tolgee.d.ts +0 -68
  75. package/dist/Tolgee.test.d.ts +0 -1
  76. package/dist/TolgeeConfig.d.ts +0 -69
  77. package/dist/TolgeeConfig.test.d.ts +0 -1
  78. package/dist/__integration/FormatterIcu.test.d.ts +0 -1
  79. package/dist/__integration/FormatterMissing.d.ts +0 -1
  80. package/dist/__integration/Tolgee.test.d.ts +0 -1
  81. package/dist/__integration/TolgeeInvisible.test.d.ts +0 -1
  82. package/dist/__integration/mockTranslations.d.ts +0 -7
  83. package/dist/__integration/testConfig.d.ts +0 -9
  84. package/dist/__testFixtures/classMock.d.ts +0 -3
  85. package/dist/__testFixtures/createElement.d.ts +0 -2
  86. package/dist/__testFixtures/createTestDom.d.ts +0 -9
  87. package/dist/__testFixtures/mocked.d.ts +0 -20
  88. package/dist/__testFixtures/setupAfterEnv.d.ts +0 -8
  89. package/dist/helpers/NodeHelper.d.ts +0 -14
  90. package/dist/helpers/TextHelper.d.ts +0 -5
  91. package/dist/helpers/TextHelper.test.d.ts +0 -1
  92. package/dist/helpers/commonTypes.d.ts +0 -2
  93. package/dist/helpers/encoderPolyfill.d.ts +0 -8
  94. package/dist/helpers/secret.d.ts +0 -6
  95. package/dist/helpers/secret.test.d.ts +0 -1
  96. package/dist/helpers/sleep.d.ts +0 -1
  97. package/dist/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  98. package/dist/highlighter/HighlightFunctionsInitializer.test.d.ts +0 -1
  99. package/dist/highlighter/MouseEventHandler.d.ts +0 -29
  100. package/dist/highlighter/MouseEventHandler.test.d.ts +0 -1
  101. package/dist/highlighter/TranslationHighlighter.d.ts +0 -14
  102. package/dist/highlighter/TranslationHighlighter.test.d.ts +0 -1
  103. package/dist/index.d.ts +0 -10
  104. package/dist/internal.d.ts +0 -2
  105. package/dist/modules/IcuFormatter.d.ts +0 -2
  106. package/dist/modules/IcuFormatter.test.d.ts +0 -1
  107. package/dist/modules/index.d.ts +0 -1
  108. package/dist/services/ApiHttpService.d.ts +0 -15
  109. package/dist/services/CoreService.d.ts +0 -18
  110. package/dist/services/CoreService.test.d.ts +0 -1
  111. package/dist/services/DependencyService.d.ts +0 -39
  112. package/dist/services/DependencyService.test.d.ts +0 -1
  113. package/dist/services/ElementRegistrar.d.ts +0 -19
  114. package/dist/services/ElementRegistrar.test.d.ts +0 -1
  115. package/dist/services/EventEmitter.d.ts +0 -13
  116. package/dist/services/EventService.d.ts +0 -9
  117. package/dist/services/ModuleService.d.ts +0 -5
  118. package/dist/services/ScreenshotService.d.ts +0 -15
  119. package/dist/services/Subscription.d.ts +0 -5
  120. package/dist/services/TextService.d.ts +0 -14
  121. package/dist/services/TextService.test.d.ts +0 -1
  122. package/dist/services/TranslationService.d.ts +0 -75
  123. package/dist/services/TranslationService.test.d.ts +0 -1
  124. package/dist/services/__mocks__/CoreService.d.ts +0 -2
  125. package/dist/toolsManager/Messages.d.ts +0 -8
  126. package/dist/toolsManager/Messages.test.d.ts +0 -1
  127. package/dist/toolsManager/PluginManager.d.ts +0 -21
  128. package/dist/toolsManager/PluginManager.test.d.ts +0 -1
  129. package/dist/types/DTOs.d.ts +0 -20
  130. package/dist/types/apiSchema.generated.d.ts +0 -6185
  131. package/dist/types.d.ts +0 -123
  132. package/dist/wrappers/AbstractWrapper.d.ts +0 -8
  133. package/dist/wrappers/NodeHandler.d.ts +0 -18
  134. package/dist/wrappers/WrappedHandler.d.ts +0 -8
  135. package/dist/wrappers/invisible/AttributeHandler.d.ts +0 -8
  136. package/dist/wrappers/invisible/Coder.d.ts +0 -7
  137. package/dist/wrappers/invisible/ContentHandler.d.ts +0 -6
  138. package/dist/wrappers/invisible/CoreHandler.d.ts +0 -10
  139. package/dist/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  140. package/dist/wrappers/invisible/ValueMemory.d.ts +0 -5
  141. package/dist/wrappers/invisible/ValueMemory.test.d.ts +0 -1
  142. package/dist/wrappers/text/AttributeHandler.d.ts +0 -8
  143. package/dist/wrappers/text/AttributeHandler.test.d.ts +0 -1
  144. package/dist/wrappers/text/Coder.d.ts +0 -15
  145. package/dist/wrappers/text/Coder.test.d.ts +0 -1
  146. package/dist/wrappers/text/ContentHandler.d.ts +0 -8
  147. package/dist/wrappers/text/ContentHandler.test.d.ts +0 -1
  148. package/dist/wrappers/text/CoreHandler.d.ts +0 -17
  149. package/dist/wrappers/text/CoreHandler.test.d.ts +0 -1
  150. package/dist/wrappers/text/TextWrapper.d.ts +0 -20
  151. package/index.js +0 -7
  152. package/lib/Constants/ModifierKey.d.ts +0 -6
  153. package/lib/Errors/ApiHttpError.d.ts +0 -5
  154. package/lib/Observer.d.ts +0 -14
  155. package/lib/Properties.d.ts +0 -17
  156. package/lib/TolgeeConfig.d.ts +0 -69
  157. package/lib/helpers/NodeHelper.d.ts +0 -14
  158. package/lib/helpers/TextHelper.d.ts +0 -5
  159. package/lib/helpers/commonTypes.d.ts +0 -2
  160. package/lib/helpers/encoderPolyfill.d.ts +0 -8
  161. package/lib/helpers/secret.d.ts +0 -6
  162. package/lib/helpers/sleep.d.ts +0 -1
  163. package/lib/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  164. package/lib/highlighter/MouseEventHandler.d.ts +0 -29
  165. package/lib/highlighter/TranslationHighlighter.d.ts +0 -14
  166. package/lib/modules/IcuFormatter.d.ts +0 -2
  167. package/lib/modules/index.d.ts +0 -1
  168. package/lib/services/ApiHttpService.d.ts +0 -15
  169. package/lib/services/CoreService.d.ts +0 -18
  170. package/lib/services/DependencyService.d.ts +0 -39
  171. package/lib/services/ElementRegistrar.d.ts +0 -19
  172. package/lib/services/EventEmitter.d.ts +0 -13
  173. package/lib/services/EventService.d.ts +0 -9
  174. package/lib/services/ModuleService.d.ts +0 -5
  175. package/lib/services/ScreenshotService.d.ts +0 -15
  176. package/lib/services/Subscription.d.ts +0 -5
  177. package/lib/services/TextService.d.ts +0 -14
  178. package/lib/services/TranslationService.d.ts +0 -75
  179. package/lib/toolsManager/Messages.d.ts +0 -8
  180. package/lib/toolsManager/PluginManager.d.ts +0 -21
  181. package/lib/types/DTOs.d.ts +0 -20
  182. package/lib/types/apiSchema.generated.d.ts +0 -6185
  183. package/lib/wrappers/AbstractWrapper.d.ts +0 -8
  184. package/lib/wrappers/NodeHandler.d.ts +0 -18
  185. package/lib/wrappers/WrappedHandler.d.ts +0 -8
  186. package/lib/wrappers/invisible/AttributeHandler.d.ts +0 -8
  187. package/lib/wrappers/invisible/Coder.d.ts +0 -7
  188. package/lib/wrappers/invisible/ContentHandler.d.ts +0 -6
  189. package/lib/wrappers/invisible/CoreHandler.d.ts +0 -10
  190. package/lib/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  191. package/lib/wrappers/invisible/ValueMemory.d.ts +0 -5
  192. package/lib/wrappers/text/AttributeHandler.d.ts +0 -8
  193. package/lib/wrappers/text/Coder.d.ts +0 -15
  194. package/lib/wrappers/text/ContentHandler.d.ts +0 -8
  195. package/lib/wrappers/text/CoreHandler.d.ts +0 -17
  196. package/lib/wrappers/text/TextWrapper.d.ts +0 -20
  197. package/src/Constants/ModifierKey.ts +0 -6
  198. package/src/Errors/ApiHttpError.ts +0 -8
  199. package/src/Observer.test.ts +0 -119
  200. package/src/Observer.ts +0 -68
  201. package/src/Properties.test.ts +0 -150
  202. package/src/Properties.ts +0 -112
  203. package/src/Tolgee.test.ts +0 -473
  204. package/src/TolgeeConfig.test.ts +0 -21
  205. package/src/TolgeeConfig.ts +0 -134
  206. package/src/__integration/FormatterIcu.test.ts +0 -80
  207. package/src/__integration/FormatterMissing.ts +0 -54
  208. package/src/__integration/Tolgee.test.ts +0 -90
  209. package/src/__integration/TolgeeInvisible.test.ts +0 -145
  210. package/src/__integration/mockTranslations.ts +0 -6
  211. package/src/__integration/testConfig.ts +0 -16
  212. package/src/__testFixtures/classMock.ts +0 -11
  213. package/src/__testFixtures/createElement.ts +0 -43
  214. package/src/__testFixtures/createTestDom.ts +0 -26
  215. package/src/__testFixtures/mocked.ts +0 -25
  216. package/src/__testFixtures/setupAfterEnv.ts +0 -34
  217. package/src/helpers/NodeHelper.ts +0 -90
  218. package/src/helpers/TextHelper.test.ts +0 -62
  219. package/src/helpers/TextHelper.ts +0 -58
  220. package/src/helpers/commonTypes.ts +0 -8
  221. package/src/helpers/encoderPolyfill.ts +0 -96
  222. package/src/helpers/secret.test.ts +0 -61
  223. package/src/helpers/secret.ts +0 -68
  224. package/src/helpers/sleep.ts +0 -2
  225. package/src/highlighter/HighlightFunctionsInitializer.test.ts +0 -40
  226. package/src/highlighter/HighlightFunctionsInitializer.ts +0 -61
  227. package/src/highlighter/MouseEventHandler.test.ts +0 -151
  228. package/src/highlighter/MouseEventHandler.ts +0 -191
  229. package/src/highlighter/TranslationHighlighter.test.ts +0 -177
  230. package/src/highlighter/TranslationHighlighter.ts +0 -113
  231. package/src/internal.ts +0 -2
  232. package/src/modules/IcuFormatter.test.ts +0 -21
  233. package/src/modules/IcuFormatter.ts +0 -39
  234. package/src/modules/index.ts +0 -1
  235. package/src/services/ApiHttpService.ts +0 -85
  236. package/src/services/CoreService.test.ts +0 -141
  237. package/src/services/CoreService.ts +0 -76
  238. package/src/services/DependencyService.test.ts +0 -51
  239. package/src/services/DependencyService.ts +0 -116
  240. package/src/services/ElementRegistrar.test.ts +0 -131
  241. package/src/services/ElementRegistrar.ts +0 -108
  242. package/src/services/EventEmitter.ts +0 -52
  243. package/src/services/EventService.ts +0 -14
  244. package/src/services/ModuleService.ts +0 -14
  245. package/src/services/ScreenshotService.ts +0 -31
  246. package/src/services/Subscription.ts +0 -7
  247. package/src/services/TextService.test.ts +0 -88
  248. package/src/services/TextService.ts +0 -82
  249. package/src/services/TranslationService.test.ts +0 -358
  250. package/src/services/TranslationService.ts +0 -417
  251. package/src/services/__mocks__/CoreService.ts +0 -17
  252. package/src/toolsManager/Messages.test.ts +0 -79
  253. package/src/toolsManager/Messages.ts +0 -60
  254. package/src/toolsManager/PluginManager.test.ts +0 -108
  255. package/src/toolsManager/PluginManager.ts +0 -129
  256. package/src/types/DTOs.ts +0 -25
  257. package/src/types/apiSchema.generated.ts +0 -6208
  258. package/src/wrappers/AbstractWrapper.ts +0 -14
  259. package/src/wrappers/NodeHandler.ts +0 -143
  260. package/src/wrappers/WrappedHandler.ts +0 -28
  261. package/src/wrappers/invisible/AttributeHandler.ts +0 -23
  262. package/src/wrappers/invisible/Coder.ts +0 -65
  263. package/src/wrappers/invisible/ContentHandler.ts +0 -15
  264. package/src/wrappers/invisible/CoreHandler.ts +0 -17
  265. package/src/wrappers/invisible/InvisibleWrapper.ts +0 -59
  266. package/src/wrappers/invisible/ValueMemory.test.ts +0 -25
  267. package/src/wrappers/invisible/ValueMemory.ts +0 -16
  268. package/src/wrappers/text/AttributeHandler.test.ts +0 -118
  269. package/src/wrappers/text/AttributeHandler.ts +0 -25
  270. package/src/wrappers/text/Coder.test.ts +0 -298
  271. package/src/wrappers/text/Coder.ts +0 -202
  272. package/src/wrappers/text/ContentHandler.test.ts +0 -185
  273. package/src/wrappers/text/ContentHandler.ts +0 -21
  274. package/src/wrappers/text/CoreHandler.test.ts +0 -106
  275. package/src/wrappers/text/CoreHandler.ts +0 -45
  276. package/src/wrappers/text/TextWrapper.ts +0 -69
@@ -0,0 +1,48 @@
1
+ import { Tolgee } from '../index';
2
+
3
+ describe('using tolgee as client', () => {
4
+ it('fetch data without running', async () => {
5
+ const promiseEnTest = jest.fn(() => Promise.resolve({ test: 'Test' }));
6
+ const promiseEnCommon = jest.fn(() =>
7
+ Promise.resolve({ cancel: 'Cancel' })
8
+ );
9
+ const promiseEsTest = jest.fn(() => Promise.resolve({ test: 'Testa' }));
10
+ const promiseEsCommon = jest.fn(() =>
11
+ Promise.resolve({ cancel: 'Cancellar' })
12
+ );
13
+
14
+ const tolgee = Tolgee({
15
+ language: 'en',
16
+ ns: ['common'],
17
+ staticData: {
18
+ 'en:common': promiseEnCommon,
19
+ 'en:test': promiseEnTest,
20
+ 'es:common': promiseEsCommon,
21
+ 'es:test': promiseEsTest,
22
+ },
23
+ });
24
+
25
+ const enTest = await tolgee.loadRecord({
26
+ language: 'en',
27
+ namespace: 'test',
28
+ });
29
+ expect(promiseEnTest).toBeCalledTimes(1);
30
+ expect(promiseEnCommon).not.toBeCalled();
31
+ expect(enTest).toEqual(new Map([['test', 'Test']]));
32
+
33
+ const enCommon = await tolgee.loadRecord({
34
+ language: 'en',
35
+ namespace: 'common',
36
+ });
37
+ expect(promiseEnCommon).toBeCalledTimes(1);
38
+ expect(enCommon).toEqual(new Map([['cancel', 'Cancel']]));
39
+
40
+ const esTest = await tolgee.loadRecord({
41
+ language: 'es',
42
+ namespace: 'test',
43
+ });
44
+ expect(promiseEsTest).toBeCalledTimes(1);
45
+ expect(promiseEsCommon).not.toBeCalled();
46
+ expect(esTest).toEqual(new Map([['test', 'Testa']]));
47
+ });
48
+ });
@@ -0,0 +1,33 @@
1
+ import { Tolgee } from '../index';
2
+
3
+ describe('events', () => {
4
+ it('emits language change event', async () => {
5
+ const tolgee = Tolgee({ language: 'en' });
6
+ const handler = jest.fn((lang) => {});
7
+ tolgee.on('language', handler);
8
+ await tolgee.changeLanguage('es');
9
+ expect(handler).toHaveBeenCalledWith({ value: 'es' });
10
+ });
11
+
12
+ it('correctly emits translation change listeners', async () => {
13
+ const tolgee = Tolgee({
14
+ language: 'en',
15
+ staticData: {
16
+ en: { hello: 'World', language: 'English' },
17
+ es: { hello: 'Mundo', language: 'Spanish' },
18
+ },
19
+ });
20
+ const helloHandler = jest.fn((data) => {});
21
+ const languageHandler = jest.fn((data) => {});
22
+
23
+ tolgee.onKeyUpdate(helloHandler).subscribeKey({ key: 'hello' });
24
+ tolgee.onKeyUpdate(languageHandler).subscribeKey({ key: 'language' });
25
+
26
+ tolgee.changeTranslation({ language: 'es' }, 'hello', 'Světe');
27
+ tolgee.changeLanguage('es');
28
+
29
+ await Promise.resolve();
30
+ expect(helloHandler).toHaveBeenCalledTimes(1);
31
+ expect(languageHandler).toHaveBeenCalledTimes(1);
32
+ });
33
+ });
@@ -0,0 +1,85 @@
1
+ import { Tolgee } from '../index';
2
+
3
+ describe('initialization behavior', () => {
4
+ it("change in state before running won't trigger fetch", async () => {
5
+ const promiseEnTest = jest.fn(() => Promise.resolve({ test: 'Test' }));
6
+ const promiseEnCommon = jest.fn(() =>
7
+ Promise.resolve({ cancel: 'Cancel' })
8
+ );
9
+ const promiseEsTest = jest.fn(() => Promise.resolve({ test: 'Testa' }));
10
+ const promiseEsCommon = jest.fn(() =>
11
+ Promise.resolve({ cancel: 'Cancellar' })
12
+ );
13
+
14
+ const tolgee = Tolgee({
15
+ language: 'en',
16
+ ns: ['common'],
17
+ staticData: {
18
+ 'en:common': promiseEnCommon,
19
+ 'en:test': promiseEnTest,
20
+ 'es:common': promiseEsCommon,
21
+ 'es:test': promiseEsTest,
22
+ },
23
+ });
24
+ const onInitialLoad = jest.fn();
25
+ const onRunningChange = jest.fn();
26
+ tolgee.on('initialLoad', onInitialLoad);
27
+ tolgee.on('running', onRunningChange);
28
+
29
+ await tolgee.changeLanguage('es');
30
+ await tolgee.addActiveNs('test');
31
+ expect(promiseEsCommon).not.toBeCalled();
32
+ expect(promiseEnCommon).not.toBeCalled();
33
+ expect(promiseEsTest).not.toBeCalled();
34
+ expect(promiseEnTest).not.toBeCalled();
35
+ expect(tolgee.isLoaded()).toBeFalsy();
36
+
37
+ await tolgee.run();
38
+ expect(promiseEsCommon).toBeCalled();
39
+ expect(promiseEnCommon).not.toBeCalled();
40
+ expect(promiseEsTest).toBeCalled();
41
+ expect(promiseEnTest).not.toBeCalled();
42
+ expect(tolgee.isLoaded()).toBeTruthy();
43
+
44
+ tolgee.stop();
45
+
46
+ expect(onInitialLoad).toBeCalledTimes(1);
47
+ expect(onRunningChange).toBeCalledTimes(2);
48
+ });
49
+
50
+ it("won't start loading when nothing to load", async () => {
51
+ const tolgee = Tolgee({
52
+ language: 'en',
53
+ staticData: {
54
+ en: { test: 'Test' },
55
+ },
56
+ });
57
+ const onFetchingHandler = jest.fn(() => {});
58
+ const onLoadingHandler = jest.fn(() => {});
59
+
60
+ tolgee.on('fetching', onFetchingHandler);
61
+ tolgee.on('loading', onLoadingHandler);
62
+
63
+ const runPromise = tolgee.run();
64
+ expect(tolgee.isLoading()).toBeFalsy();
65
+ expect(tolgee.isFetching()).toBeFalsy();
66
+
67
+ await runPromise;
68
+ expect(tolgee.isLoading()).toBeFalsy();
69
+ expect(tolgee.isFetching()).toBeFalsy();
70
+ expect(onFetchingHandler).not.toBeCalled();
71
+ expect(onLoadingHandler).not.toBeCalled();
72
+ });
73
+
74
+ it('emits keyUpdate on initialLoad', async () => {
75
+ const tolgee = Tolgee({
76
+ language: 'en',
77
+ staticData: { en: { hello: 'world' } },
78
+ });
79
+ const onKeyChange = jest.fn();
80
+ tolgee.on('keyUpdate', onKeyChange);
81
+ expect(onKeyChange).toBeCalledTimes(0);
82
+ await tolgee.run();
83
+ expect(onKeyChange).toBeCalledTimes(1);
84
+ });
85
+ });
@@ -0,0 +1,2 @@
1
+ // In your own jest-setup.js (or any other name)
2
+ import '@testing-library/jest-dom';
@@ -0,0 +1,129 @@
1
+ import { Tolgee, TolgeePlugin, TolgeeInstance } from '../index';
2
+
3
+ const DetectionPlugin =
4
+ (value: any): TolgeePlugin =>
5
+ (tolgee, tools) => {
6
+ tools.setLanguageDetector({
7
+ getLanguage() {
8
+ return value;
9
+ },
10
+ });
11
+ return tolgee;
12
+ };
13
+
14
+ describe('language detection plugin', () => {
15
+ let tolgee: TolgeeInstance;
16
+
17
+ afterEach(() => {
18
+ tolgee.stop();
19
+ });
20
+
21
+ it('will detect language without loading', async () => {
22
+ tolgee = Tolgee()
23
+ .use(DetectionPlugin('en'))
24
+ .init({
25
+ defaultLanguage: 'es',
26
+ staticData: {
27
+ en: { test: 'Test' },
28
+ },
29
+ });
30
+ const onFetchingHandler = jest.fn(() => {});
31
+ const onLoadingHandler = jest.fn(() => {});
32
+
33
+ tolgee.on('fetching', onFetchingHandler);
34
+ tolgee.on('loading', onLoadingHandler);
35
+
36
+ tolgee.run();
37
+ expect(tolgee.getLanguage()).toEqual('en');
38
+ expect(tolgee.isLoading()).toBeFalsy();
39
+ expect(tolgee.isFetching()).toBeFalsy();
40
+
41
+ expect(onFetchingHandler).not.toBeCalled();
42
+ expect(onLoadingHandler).not.toBeCalled();
43
+ });
44
+
45
+ it('will detect language async', async () => {
46
+ tolgee = Tolgee()
47
+ .use(DetectionPlugin(Promise.resolve('en')))
48
+ .init({
49
+ defaultLanguage: 'es',
50
+ staticData: {
51
+ en: { test: 'Test' },
52
+ },
53
+ });
54
+ const onFetchingHandler = jest.fn(() => {});
55
+ const onLoadingHandler = jest.fn(() => {});
56
+
57
+ tolgee.on('fetching', onFetchingHandler);
58
+ tolgee.on('loading', onLoadingHandler);
59
+
60
+ const runPromise = tolgee.run();
61
+ expect(tolgee.isLoading()).toBeTruthy();
62
+ expect(tolgee.isFetching()).toBeTruthy();
63
+
64
+ await runPromise;
65
+ expect(tolgee.isLoading()).toBeFalsy();
66
+ expect(tolgee.isFetching()).toBeFalsy();
67
+ expect(onFetchingHandler).toBeCalledTimes(2);
68
+ expect(onLoadingHandler).toBeCalledTimes(2);
69
+ });
70
+
71
+ it('will fallback correctly', async () => {
72
+ tolgee = Tolgee()
73
+ .use(DetectionPlugin(Promise.resolve(undefined)))
74
+ .init({
75
+ defaultLanguage: 'es',
76
+ staticData: {
77
+ en: { test: 'Test' },
78
+ },
79
+ });
80
+ const runPromise = tolgee.run();
81
+ expect(tolgee.getLanguage()).toEqual(undefined);
82
+
83
+ await runPromise;
84
+ expect(tolgee.getLanguage()).toEqual('es');
85
+ });
86
+
87
+ it('will return key before language is loaded', async () => {
88
+ tolgee = Tolgee()
89
+ .use(DetectionPlugin(Promise.resolve('en')))
90
+ .init({
91
+ defaultLanguage: 'es',
92
+ staticData: {
93
+ en: { test: 'Test' },
94
+ },
95
+ });
96
+
97
+ const runPromise = tolgee.run();
98
+ expect(tolgee.t({ key: 'test' })).toEqual('test');
99
+
100
+ await runPromise;
101
+ expect(tolgee.t({ key: 'test' })).toEqual('Test');
102
+ });
103
+
104
+ it('will throw error when no avaliableLanguages are set', () => {
105
+ tolgee = Tolgee().use(DetectionPlugin('en')).init({
106
+ defaultLanguage: 'es',
107
+ });
108
+
109
+ expect(() => tolgee.run()).toThrow();
110
+ });
111
+
112
+ it('will throw error when no defaultLanguage specified', () => {
113
+ tolgee = Tolgee()
114
+ .use(DetectionPlugin('en'))
115
+ .init({
116
+ staticData: {
117
+ en: { test: 'Test' },
118
+ },
119
+ });
120
+
121
+ expect(() => tolgee.run()).toThrow(/'defaultLanguage'/);
122
+ });
123
+
124
+ it('will throw error when no available languages specified', () => {
125
+ tolgee = Tolgee().use(DetectionPlugin('en')).init({});
126
+
127
+ expect(() => tolgee.run()).toThrow(/'availableLanguages'/);
128
+ });
129
+ });
@@ -0,0 +1,145 @@
1
+ import { Tolgee, TolgeePlugin, TolgeeInstance } from '../index';
2
+
3
+ describe('language storage plugin', () => {
4
+ let tolgee: TolgeeInstance;
5
+ let storedValue: string | undefined;
6
+ const StoragePlugin =
7
+ (value: any): TolgeePlugin =>
8
+ (tolgee, tools) => {
9
+ tools.setLanguageStorage({
10
+ getLanguage() {
11
+ return value;
12
+ },
13
+ setLanguage(language: string) {
14
+ storedValue = language;
15
+ },
16
+ });
17
+ return tolgee;
18
+ };
19
+
20
+ afterEach(() => {
21
+ tolgee.stop();
22
+ });
23
+
24
+ it('will restore language without loading', async () => {
25
+ tolgee = Tolgee()
26
+ .use(StoragePlugin('en'))
27
+ .init({
28
+ defaultLanguage: 'es',
29
+ staticData: {
30
+ en: { test: 'Test' },
31
+ },
32
+ });
33
+ const onFetchingHandler = jest.fn(() => {});
34
+ const onLoadingHandler = jest.fn(() => {});
35
+
36
+ tolgee.on('fetching', onFetchingHandler);
37
+ tolgee.on('loading', onLoadingHandler);
38
+
39
+ tolgee.run();
40
+ expect(tolgee.getLanguage()).toEqual('en');
41
+ expect(tolgee.isLoading()).toBeFalsy();
42
+ expect(tolgee.isFetching()).toBeFalsy();
43
+
44
+ expect(onFetchingHandler).not.toBeCalled();
45
+ expect(onLoadingHandler).not.toBeCalled();
46
+ });
47
+
48
+ it('will restore language async', async () => {
49
+ tolgee = Tolgee()
50
+ .use(StoragePlugin(Promise.resolve('en')))
51
+ .init({
52
+ defaultLanguage: 'es',
53
+ staticData: {
54
+ en: { test: 'Test' },
55
+ },
56
+ });
57
+ const onFetchingHandler = jest.fn(() => {});
58
+ const onLoadingHandler = jest.fn(() => {});
59
+
60
+ tolgee.on('fetching', onFetchingHandler);
61
+ tolgee.on('loading', onLoadingHandler);
62
+
63
+ const runPromise = tolgee.run();
64
+ expect(tolgee.isLoading()).toBeTruthy();
65
+ expect(tolgee.isFetching()).toBeTruthy();
66
+
67
+ await runPromise;
68
+ expect(tolgee.isLoading()).toBeFalsy();
69
+ expect(tolgee.isFetching()).toBeFalsy();
70
+ expect(onFetchingHandler).toBeCalledTimes(2);
71
+ expect(onLoadingHandler).toBeCalledTimes(2);
72
+ });
73
+
74
+ it('will fallback correctly', async () => {
75
+ tolgee = Tolgee()
76
+ .use(StoragePlugin(Promise.resolve(undefined)))
77
+ .init({
78
+ defaultLanguage: 'es',
79
+ staticData: {
80
+ en: { test: 'Test' },
81
+ },
82
+ });
83
+ const runPromise = tolgee.run();
84
+ expect(tolgee.getLanguage()).toEqual(undefined);
85
+
86
+ await runPromise;
87
+ expect(tolgee.getLanguage()).toEqual('es');
88
+ });
89
+
90
+ it('will return key before language is loaded', async () => {
91
+ tolgee = Tolgee()
92
+ .use(StoragePlugin(Promise.resolve('en')))
93
+ .init({
94
+ defaultLanguage: 'es',
95
+ staticData: {
96
+ en: { test: 'Test' },
97
+ },
98
+ });
99
+
100
+ const runPromise = tolgee.run();
101
+ expect(tolgee.t({ key: 'test' })).toEqual('test');
102
+
103
+ await runPromise;
104
+ expect(tolgee.t({ key: 'test' })).toEqual('Test');
105
+ });
106
+
107
+ it('will store language value on language change', async () => {
108
+ tolgee = Tolgee()
109
+ .use(StoragePlugin(Promise.resolve('en')))
110
+ .init({
111
+ defaultLanguage: 'es',
112
+ staticData: {
113
+ en: { test: 'Test' },
114
+ es: { test: 'Testa' },
115
+ },
116
+ });
117
+
118
+ tolgee.run();
119
+
120
+ await tolgee.changeLanguage('es');
121
+ expect(storedValue).toEqual('es');
122
+ });
123
+
124
+ it('will ignore invalid values', () => {
125
+ tolgee = Tolgee()
126
+ .use(StoragePlugin('eq'))
127
+ .init({
128
+ defaultLanguage: 'es',
129
+ staticData: {
130
+ en: { test: 'Test' },
131
+ es: { test: 'Testa' },
132
+ },
133
+ });
134
+ tolgee.run();
135
+ expect(tolgee.getLanguage()).toEqual('es');
136
+ });
137
+
138
+ it('will return invalid value if no available languages', () => {
139
+ tolgee = Tolgee().use(StoragePlugin('eq')).init({
140
+ defaultLanguage: 'es',
141
+ });
142
+ tolgee.run();
143
+ expect(tolgee.getLanguage()).toEqual('eq');
144
+ });
145
+ });
@@ -0,0 +1,112 @@
1
+ import { Tolgee, TreeTranslationsData } from '../index';
2
+ import { resolvablePromise } from './testTools';
3
+
4
+ describe('language changes', () => {
5
+ it('changes language', async () => {
6
+ const tolgee = Tolgee({ language: 'en' });
7
+ expect(tolgee.getLanguage()).toEqual('en');
8
+ await tolgee.changeLanguage('es');
9
+ expect(tolgee.getLanguage()).toEqual('es');
10
+ });
11
+
12
+ it('returns correct translation', async () => {
13
+ const tolgee = Tolgee({
14
+ language: 'en',
15
+ staticData: { en: { hello: 'World' }, es: { hello: 'Mundo' } },
16
+ });
17
+ expect(tolgee.t({ key: 'hello' })).toEqual('World');
18
+ await tolgee.changeLanguage('es');
19
+ expect(tolgee.t({ key: 'hello' })).toEqual('Mundo');
20
+ await tolgee.changeLanguage('cs');
21
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello');
22
+ });
23
+
24
+ it('fetches language data correctly', async () => {
25
+ const [promiseEn, resolveEn] = resolvablePromise<TreeTranslationsData>();
26
+ const [promiseEs, resolveEs] = resolvablePromise<TreeTranslationsData>();
27
+ const tolgee = Tolgee({
28
+ language: 'en',
29
+ staticData: {
30
+ en: () => promiseEn,
31
+ es: () => promiseEs,
32
+ },
33
+ });
34
+ const runPromise = tolgee.run();
35
+ expect(tolgee.t({ key: 'test' })).toEqual('test');
36
+ expect(tolgee.getPendingLanguage()).toEqual('en');
37
+ resolveEn({ test: 'Test' });
38
+ await runPromise;
39
+ expect(tolgee.t({ key: 'test' })).toEqual('Test');
40
+
41
+ const langChangeEsPromise = tolgee.changeLanguage('es');
42
+ expect(tolgee.getPendingLanguage()).toEqual('es');
43
+ resolveEs({ test: 'Testa' });
44
+ await langChangeEsPromise;
45
+ expect(tolgee.t({ key: 'test' })).toEqual('Testa');
46
+ });
47
+
48
+ it('fetches fallback', async () => {
49
+ const [promiseEn, resolveEn] = resolvablePromise<TreeTranslationsData>();
50
+ const [promiseEs, resolveEs] = resolvablePromise<TreeTranslationsData>();
51
+ const [promiseEnGb, resolveEnGb] =
52
+ resolvablePromise<TreeTranslationsData>();
53
+ const [promiseEnIn, resolveEnIn] =
54
+ resolvablePromise<TreeTranslationsData>();
55
+
56
+ const tolgee = Tolgee({
57
+ language: 'es',
58
+ staticData: {
59
+ en: () => promiseEn,
60
+ es: () => promiseEs,
61
+ 'en-GB': () => promiseEnGb,
62
+ 'en-IN': () => promiseEnIn,
63
+ },
64
+ fallbackLanguage: {
65
+ es: 'en',
66
+ 'en-GB': 'en',
67
+ 'en-IN': ['en-GB', 'en'],
68
+ },
69
+ });
70
+
71
+ resolveEn({ color: 'Color', egg: 'Egg' });
72
+ resolveEs({ color: 'Pintar' });
73
+ await tolgee.run();
74
+
75
+ expect(tolgee.t({ key: 'color' })).toEqual('Pintar');
76
+ expect(tolgee.t({ key: 'egg' })).toEqual('Egg');
77
+
78
+ resolveEnGb({ color: 'Colour', india: 'India' });
79
+ resolveEnIn({ india: 'Blabla' });
80
+
81
+ await tolgee.changeLanguage('en-IN');
82
+ expect(tolgee.t({ key: 'color' })).toEqual('Colour');
83
+ expect(tolgee.t({ key: 'egg' })).toEqual('Egg');
84
+ expect(tolgee.t({ key: 'india' })).toEqual('Blabla');
85
+
86
+ await tolgee.changeLanguage('en-GB');
87
+ expect(tolgee.t({ key: 'color' })).toEqual('Colour');
88
+ expect(tolgee.t({ key: 'egg' })).toEqual('Egg');
89
+ expect(tolgee.t({ key: 'india' })).toEqual('India');
90
+
91
+ await tolgee.changeLanguage('en');
92
+ expect(tolgee.t({ key: 'color' })).toEqual('Color');
93
+ expect(tolgee.t({ key: 'egg' })).toEqual('Egg');
94
+ expect(tolgee.t({ key: 'india' })).toEqual('india');
95
+ });
96
+
97
+ it('will fallback to default value', () => {
98
+ const tolgee = Tolgee({
99
+ defaultLanguage: 'en',
100
+ });
101
+
102
+ expect(tolgee.getLanguage()).toEqual(undefined);
103
+ tolgee.run();
104
+ expect(tolgee.getLanguage()).toEqual('en');
105
+ });
106
+
107
+ it('will throw error when no language specified', () => {
108
+ const tolgee = Tolgee({});
109
+
110
+ expect(() => tolgee.run()).toThrow(/'language'/);
111
+ });
112
+ });
@@ -0,0 +1,39 @@
1
+ import { Tolgee, TreeTranslationsData } from '../index';
2
+ import { resolvablePromise } from './testTools';
3
+
4
+ describe('loading', () => {
5
+ it('isLoading & isFetching', async () => {
6
+ const [promiseEn, resolveEn] = resolvablePromise<TreeTranslationsData>();
7
+ const [promiseEs, resolveEs] = resolvablePromise<TreeTranslationsData>();
8
+ const onLoadHandler = jest.fn(() => {});
9
+ const onFetchingHandler = jest.fn(() => {});
10
+ const tolgee = Tolgee({
11
+ language: 'en',
12
+ staticData: {
13
+ en: () => promiseEn,
14
+ es: () => promiseEs,
15
+ },
16
+ });
17
+ tolgee.on('initialLoad', onLoadHandler);
18
+ tolgee.on('fetching', onFetchingHandler);
19
+
20
+ const runPromise = tolgee.run();
21
+ expect(tolgee.isLoading()).toBeTruthy();
22
+ expect(tolgee.isFetching()).toBeTruthy();
23
+ resolveEn({});
24
+ await runPromise;
25
+ expect(tolgee.isLoading()).toBeFalsy();
26
+ expect(tolgee.isFetching()).toBeFalsy();
27
+ expect(onLoadHandler).toBeCalledTimes(1);
28
+ expect(onFetchingHandler).toBeCalledTimes(2);
29
+
30
+ const changeLanguagePromise = tolgee.changeLanguage('es');
31
+ expect(tolgee.isLoading()).toBeFalsy();
32
+ expect(tolgee.isFetching()).toBeTruthy();
33
+ resolveEs({});
34
+ await changeLanguagePromise;
35
+ expect(onLoadHandler).toBeCalledTimes(1);
36
+ expect(onFetchingHandler).toBeCalledTimes(4);
37
+ expect(tolgee.isFetching()).toBeFalsy();
38
+ });
39
+ });
@@ -0,0 +1,99 @@
1
+ import { Tolgee } from '../index';
2
+
3
+ const tolgeeWithNamespaces = () => {
4
+ const promiseEnTest = jest.fn(() => Promise.resolve({ test: 'Test' }));
5
+ const promiseEnCommon = jest.fn(() => Promise.resolve({ cancel: 'Cancel' }));
6
+ const promiseEsTest = jest.fn(() => Promise.resolve({ test: 'Testa' }));
7
+ const promiseEsCommon = jest.fn(() =>
8
+ Promise.resolve({ cancel: 'Cancellar' })
9
+ );
10
+
11
+ return Tolgee({
12
+ language: 'en',
13
+ ns: ['common'],
14
+ staticData: {
15
+ 'en:common': promiseEnCommon,
16
+ 'en:test': promiseEnTest,
17
+ 'es:common': promiseEsCommon,
18
+ 'es:test': promiseEsTest,
19
+ },
20
+ });
21
+ };
22
+
23
+ describe('language changes', () => {
24
+ it('returns correct translation from namespace', () => {
25
+ const tolgee = Tolgee({
26
+ language: 'en',
27
+ staticData: {
28
+ en: { hello: 'World' },
29
+ 'en:common': { test: 'Test' },
30
+ },
31
+ });
32
+ expect(tolgee.t({ key: 'hello' })).toEqual('World');
33
+ expect(tolgee.t({ key: 'test' })).toEqual('test');
34
+ expect(tolgee.t({ key: 'test', ns: 'common' })).toEqual('Test');
35
+ });
36
+
37
+ it('uses defaultNs', async () => {
38
+ const tolgee = Tolgee({
39
+ language: 'en',
40
+ defaultNs: 'common',
41
+ staticData: {
42
+ 'en:common': { test: 'Test' },
43
+ 'es:common': { test: 'Testa' },
44
+ },
45
+ });
46
+ await tolgee.run();
47
+
48
+ expect(tolgee.t({ key: 'test' })).toEqual('Test');
49
+ await tolgee.changeLanguage('es');
50
+ expect(tolgee.t({ key: 'test' })).toEqual('Testa');
51
+ });
52
+
53
+ it('active namespaces', async () => {
54
+ const tolgee = tolgeeWithNamespaces();
55
+ await tolgee.run();
56
+
57
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancel');
58
+ expect(tolgee.t({ key: 'test', ns: 'test' })).toEqual('test');
59
+
60
+ await tolgee.changeLanguage('es');
61
+
62
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancellar');
63
+ expect(tolgee.t({ key: 'test', ns: 'test' })).toEqual('test');
64
+
65
+ await tolgee.changeLanguage('en');
66
+ await tolgee.addActiveNs('test');
67
+
68
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancel');
69
+ expect(tolgee.t({ key: 'test', ns: 'test' })).toEqual('Test');
70
+
71
+ await tolgee.changeLanguage('es');
72
+
73
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancellar');
74
+ expect(tolgee.t({ key: 'test', ns: 'test' })).toEqual('Testa');
75
+ });
76
+
77
+ it('removing active namespaces', async () => {
78
+ const tolgee = tolgeeWithNamespaces();
79
+ await tolgee.run();
80
+ const handler = jest.fn();
81
+ tolgee.on('cache', handler);
82
+
83
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancel');
84
+ expect(tolgee.t({ key: 'test', ns: 'test' })).toEqual('test');
85
+
86
+ await tolgee.addActiveNs('test');
87
+ expect(handler).toBeCalledTimes(1);
88
+
89
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancel');
90
+ expect(tolgee.t({ key: 'test', ns: 'test' })).toEqual('Test');
91
+
92
+ tolgee.removeActiveNs('test');
93
+ await tolgee.changeLanguage('es');
94
+ expect(handler).toBeCalledTimes(2);
95
+
96
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancellar');
97
+ expect(tolgee.t({ key: 'test', ns: 'test' })).toEqual('test');
98
+ });
99
+ });