@tolgee/core 4.9.2 → 4.9.3-rc.04b22e6.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 (288) hide show
  1. package/dist/tolgee.cjs.js +1277 -7023
  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 +1407 -0
  6. package/dist/tolgee.esm.js.map +1 -0
  7. package/dist/tolgee.esm.min.mjs +1 -1
  8. package/dist/tolgee.esm.min.mjs.map +1 -1
  9. package/dist/tolgee.umd.js +1277 -7023
  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 +110 -0
  16. package/lib/Controller/Events/EventEmitter.d.ts +6 -0
  17. package/lib/Controller/Events/EventEmitterSelective.d.ts +7 -0
  18. package/lib/Controller/Events/Events.d.ts +14 -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/FormatSimple/FormatError.d.ts +7 -0
  26. package/lib/FormatSimple/FormatSimple.d.ts +3 -0
  27. package/lib/FormatSimple/formatParser.d.ts +1 -0
  28. package/lib/FormatSimple/formatter.d.ts +2 -0
  29. package/lib/Tolgee.d.ts +2 -68
  30. package/lib/TranslateParams.d.ts +2 -0
  31. package/lib/{Constants/Global.d.ts → constants.d.ts} +1 -3
  32. package/lib/helpers.d.ts +3 -0
  33. package/lib/index.d.ts +4 -8
  34. package/lib/types.d.ts +244 -84
  35. package/package.json +21 -29
  36. package/src/Controller/Cache/Cache.ts +296 -0
  37. package/src/Controller/Cache/helpers.ts +37 -0
  38. package/src/Controller/Controller.ts +310 -0
  39. package/src/Controller/Events/EventEmitter.ts +30 -0
  40. package/src/Controller/Events/EventEmitterSelective.test.ts +125 -0
  41. package/src/Controller/Events/EventEmitterSelective.ts +188 -0
  42. package/src/Controller/Events/Events.ts +66 -0
  43. package/src/Controller/Plugins/Plugins.ts +315 -0
  44. package/src/Controller/State/State.ts +175 -0
  45. package/src/Controller/State/helpers.ts +41 -0
  46. package/src/Controller/State/initObserverOptions.ts +38 -0
  47. package/src/Controller/State/initState.ts +81 -0
  48. package/src/Controller/ValueObserver.ts +26 -0
  49. package/src/FormatSimple/FormatError.ts +26 -0
  50. package/src/FormatSimple/FormatSimple.ts +13 -0
  51. package/src/FormatSimple/formatParser.ts +133 -0
  52. package/src/FormatSimple/formatter.test.ts +190 -0
  53. package/src/FormatSimple/formatter.ts +19 -0
  54. package/src/Tolgee.ts +79 -330
  55. package/src/TranslateParams.test.ts +41 -0
  56. package/src/TranslateParams.ts +51 -0
  57. package/src/__test/backend.test.ts +48 -0
  58. package/src/__test/cache.test.ts +148 -0
  59. package/src/__test/client.test.ts +48 -0
  60. package/src/__test/events.test.ts +33 -0
  61. package/src/__test/format.simple.test.ts +26 -0
  62. package/src/__test/initialization.test.ts +85 -0
  63. package/src/__test/jest-setup.ts +2 -0
  64. package/src/__test/languageDetection.test.ts +129 -0
  65. package/src/__test/languageStorage.test.ts +145 -0
  66. package/src/__test/languages.test.ts +112 -0
  67. package/src/__test/loading.test.ts +39 -0
  68. package/src/__test/namespaces.test.ts +99 -0
  69. package/src/__test/namespacesFallback.test.ts +74 -0
  70. package/src/__test/plugins.test.ts +136 -0
  71. package/src/__test/testTools.ts +7 -0
  72. package/src/{Constants/Global.ts → constants.ts} +1 -6
  73. package/src/helpers.ts +17 -0
  74. package/src/index.ts +9 -8
  75. package/src/types.ts +338 -90
  76. package/README.md +0 -45
  77. package/dist/Constants/Global.d.ts +0 -6
  78. package/dist/Constants/ModifierKey.d.ts +0 -6
  79. package/dist/Errors/ApiHttpError.d.ts +0 -5
  80. package/dist/Observer.d.ts +0 -14
  81. package/dist/Observer.test.d.ts +0 -2
  82. package/dist/Properties.d.ts +0 -17
  83. package/dist/Properties.test.d.ts +0 -1
  84. package/dist/Tolgee.d.ts +0 -68
  85. package/dist/Tolgee.test.d.ts +0 -1
  86. package/dist/TolgeeConfig.d.ts +0 -69
  87. package/dist/TolgeeConfig.test.d.ts +0 -1
  88. package/dist/__integration/FormatterIcu.test.d.ts +0 -1
  89. package/dist/__integration/FormatterMissing.d.ts +0 -1
  90. package/dist/__integration/Tolgee.test.d.ts +0 -1
  91. package/dist/__integration/TolgeeInvisible.test.d.ts +0 -1
  92. package/dist/__integration/mockTranslations.d.ts +0 -7
  93. package/dist/__integration/testConfig.d.ts +0 -9
  94. package/dist/__testFixtures/classMock.d.ts +0 -3
  95. package/dist/__testFixtures/createElement.d.ts +0 -2
  96. package/dist/__testFixtures/createTestDom.d.ts +0 -9
  97. package/dist/__testFixtures/mocked.d.ts +0 -20
  98. package/dist/__testFixtures/setupAfterEnv.d.ts +0 -8
  99. package/dist/helpers/NodeHelper.d.ts +0 -14
  100. package/dist/helpers/TextHelper.d.ts +0 -5
  101. package/dist/helpers/TextHelper.test.d.ts +0 -1
  102. package/dist/helpers/commonTypes.d.ts +0 -2
  103. package/dist/helpers/encoderPolyfill.d.ts +0 -8
  104. package/dist/helpers/secret.d.ts +0 -6
  105. package/dist/helpers/secret.test.d.ts +0 -1
  106. package/dist/helpers/sleep.d.ts +0 -1
  107. package/dist/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  108. package/dist/highlighter/HighlightFunctionsInitializer.test.d.ts +0 -1
  109. package/dist/highlighter/MouseEventHandler.d.ts +0 -29
  110. package/dist/highlighter/MouseEventHandler.test.d.ts +0 -1
  111. package/dist/highlighter/TranslationHighlighter.d.ts +0 -14
  112. package/dist/highlighter/TranslationHighlighter.test.d.ts +0 -1
  113. package/dist/index.d.ts +0 -10
  114. package/dist/internal.d.ts +0 -2
  115. package/dist/modules/IcuFormatter.d.ts +0 -2
  116. package/dist/modules/IcuFormatter.test.d.ts +0 -1
  117. package/dist/modules/index.d.ts +0 -1
  118. package/dist/services/ApiHttpService.d.ts +0 -15
  119. package/dist/services/CoreService.d.ts +0 -18
  120. package/dist/services/CoreService.test.d.ts +0 -1
  121. package/dist/services/DependencyService.d.ts +0 -39
  122. package/dist/services/DependencyService.test.d.ts +0 -1
  123. package/dist/services/ElementRegistrar.d.ts +0 -19
  124. package/dist/services/ElementRegistrar.test.d.ts +0 -1
  125. package/dist/services/EventEmitter.d.ts +0 -13
  126. package/dist/services/EventService.d.ts +0 -9
  127. package/dist/services/ModuleService.d.ts +0 -5
  128. package/dist/services/ScreenshotService.d.ts +0 -15
  129. package/dist/services/Subscription.d.ts +0 -5
  130. package/dist/services/TextService.d.ts +0 -14
  131. package/dist/services/TextService.test.d.ts +0 -1
  132. package/dist/services/TranslationService.d.ts +0 -75
  133. package/dist/services/TranslationService.test.d.ts +0 -1
  134. package/dist/services/__mocks__/CoreService.d.ts +0 -2
  135. package/dist/tolgee.esm.mjs +0 -7150
  136. package/dist/tolgee.esm.mjs.map +0 -1
  137. package/dist/toolsManager/Messages.d.ts +0 -8
  138. package/dist/toolsManager/Messages.test.d.ts +0 -1
  139. package/dist/toolsManager/PluginManager.d.ts +0 -21
  140. package/dist/toolsManager/PluginManager.test.d.ts +0 -1
  141. package/dist/types/DTOs.d.ts +0 -20
  142. package/dist/types/apiSchema.generated.d.ts +0 -6185
  143. package/dist/types.d.ts +0 -123
  144. package/dist/wrappers/AbstractWrapper.d.ts +0 -8
  145. package/dist/wrappers/NodeHandler.d.ts +0 -18
  146. package/dist/wrappers/WrappedHandler.d.ts +0 -8
  147. package/dist/wrappers/invisible/AttributeHandler.d.ts +0 -8
  148. package/dist/wrappers/invisible/Coder.d.ts +0 -7
  149. package/dist/wrappers/invisible/ContentHandler.d.ts +0 -6
  150. package/dist/wrappers/invisible/CoreHandler.d.ts +0 -10
  151. package/dist/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  152. package/dist/wrappers/invisible/ValueMemory.d.ts +0 -5
  153. package/dist/wrappers/invisible/ValueMemory.test.d.ts +0 -1
  154. package/dist/wrappers/text/AttributeHandler.d.ts +0 -8
  155. package/dist/wrappers/text/AttributeHandler.test.d.ts +0 -1
  156. package/dist/wrappers/text/Coder.d.ts +0 -15
  157. package/dist/wrappers/text/Coder.test.d.ts +0 -1
  158. package/dist/wrappers/text/ContentHandler.d.ts +0 -8
  159. package/dist/wrappers/text/ContentHandler.test.d.ts +0 -1
  160. package/dist/wrappers/text/CoreHandler.d.ts +0 -17
  161. package/dist/wrappers/text/CoreHandler.test.d.ts +0 -1
  162. package/dist/wrappers/text/TextWrapper.d.ts +0 -20
  163. package/index.js +0 -7
  164. package/lib/Constants/ModifierKey.d.ts +0 -6
  165. package/lib/Errors/ApiHttpError.d.ts +0 -5
  166. package/lib/Observer.d.ts +0 -14
  167. package/lib/Properties.d.ts +0 -17
  168. package/lib/TolgeeConfig.d.ts +0 -69
  169. package/lib/helpers/NodeHelper.d.ts +0 -14
  170. package/lib/helpers/TextHelper.d.ts +0 -5
  171. package/lib/helpers/commonTypes.d.ts +0 -2
  172. package/lib/helpers/encoderPolyfill.d.ts +0 -8
  173. package/lib/helpers/secret.d.ts +0 -6
  174. package/lib/helpers/sleep.d.ts +0 -1
  175. package/lib/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  176. package/lib/highlighter/MouseEventHandler.d.ts +0 -29
  177. package/lib/highlighter/TranslationHighlighter.d.ts +0 -14
  178. package/lib/modules/IcuFormatter.d.ts +0 -2
  179. package/lib/modules/index.d.ts +0 -1
  180. package/lib/services/ApiHttpService.d.ts +0 -15
  181. package/lib/services/CoreService.d.ts +0 -18
  182. package/lib/services/DependencyService.d.ts +0 -39
  183. package/lib/services/ElementRegistrar.d.ts +0 -19
  184. package/lib/services/EventEmitter.d.ts +0 -13
  185. package/lib/services/EventService.d.ts +0 -9
  186. package/lib/services/ModuleService.d.ts +0 -5
  187. package/lib/services/ScreenshotService.d.ts +0 -15
  188. package/lib/services/Subscription.d.ts +0 -5
  189. package/lib/services/TextService.d.ts +0 -14
  190. package/lib/services/TranslationService.d.ts +0 -75
  191. package/lib/toolsManager/Messages.d.ts +0 -8
  192. package/lib/toolsManager/PluginManager.d.ts +0 -21
  193. package/lib/types/DTOs.d.ts +0 -20
  194. package/lib/types/apiSchema.generated.d.ts +0 -6185
  195. package/lib/wrappers/AbstractWrapper.d.ts +0 -8
  196. package/lib/wrappers/NodeHandler.d.ts +0 -18
  197. package/lib/wrappers/WrappedHandler.d.ts +0 -8
  198. package/lib/wrappers/invisible/AttributeHandler.d.ts +0 -8
  199. package/lib/wrappers/invisible/Coder.d.ts +0 -7
  200. package/lib/wrappers/invisible/ContentHandler.d.ts +0 -6
  201. package/lib/wrappers/invisible/CoreHandler.d.ts +0 -10
  202. package/lib/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  203. package/lib/wrappers/invisible/ValueMemory.d.ts +0 -5
  204. package/lib/wrappers/text/AttributeHandler.d.ts +0 -8
  205. package/lib/wrappers/text/Coder.d.ts +0 -15
  206. package/lib/wrappers/text/ContentHandler.d.ts +0 -8
  207. package/lib/wrappers/text/CoreHandler.d.ts +0 -17
  208. package/lib/wrappers/text/TextWrapper.d.ts +0 -20
  209. package/src/Constants/ModifierKey.ts +0 -6
  210. package/src/Errors/ApiHttpError.ts +0 -8
  211. package/src/Observer.test.ts +0 -119
  212. package/src/Observer.ts +0 -68
  213. package/src/Properties.test.ts +0 -150
  214. package/src/Properties.ts +0 -112
  215. package/src/Tolgee.test.ts +0 -473
  216. package/src/TolgeeConfig.test.ts +0 -21
  217. package/src/TolgeeConfig.ts +0 -134
  218. package/src/__integration/FormatterIcu.test.ts +0 -80
  219. package/src/__integration/FormatterMissing.ts +0 -54
  220. package/src/__integration/Tolgee.test.ts +0 -90
  221. package/src/__integration/TolgeeInvisible.test.ts +0 -145
  222. package/src/__integration/mockTranslations.ts +0 -6
  223. package/src/__integration/testConfig.ts +0 -16
  224. package/src/__testFixtures/classMock.ts +0 -11
  225. package/src/__testFixtures/createElement.ts +0 -43
  226. package/src/__testFixtures/createTestDom.ts +0 -26
  227. package/src/__testFixtures/mocked.ts +0 -25
  228. package/src/__testFixtures/setupAfterEnv.ts +0 -34
  229. package/src/helpers/NodeHelper.ts +0 -90
  230. package/src/helpers/TextHelper.test.ts +0 -62
  231. package/src/helpers/TextHelper.ts +0 -58
  232. package/src/helpers/commonTypes.ts +0 -8
  233. package/src/helpers/encoderPolyfill.ts +0 -96
  234. package/src/helpers/secret.test.ts +0 -61
  235. package/src/helpers/secret.ts +0 -68
  236. package/src/helpers/sleep.ts +0 -2
  237. package/src/highlighter/HighlightFunctionsInitializer.test.ts +0 -40
  238. package/src/highlighter/HighlightFunctionsInitializer.ts +0 -61
  239. package/src/highlighter/MouseEventHandler.test.ts +0 -151
  240. package/src/highlighter/MouseEventHandler.ts +0 -191
  241. package/src/highlighter/TranslationHighlighter.test.ts +0 -177
  242. package/src/highlighter/TranslationHighlighter.ts +0 -113
  243. package/src/internal.ts +0 -2
  244. package/src/modules/IcuFormatter.test.ts +0 -21
  245. package/src/modules/IcuFormatter.ts +0 -39
  246. package/src/modules/index.ts +0 -1
  247. package/src/services/ApiHttpService.ts +0 -85
  248. package/src/services/CoreService.test.ts +0 -141
  249. package/src/services/CoreService.ts +0 -76
  250. package/src/services/DependencyService.test.ts +0 -51
  251. package/src/services/DependencyService.ts +0 -116
  252. package/src/services/ElementRegistrar.test.ts +0 -131
  253. package/src/services/ElementRegistrar.ts +0 -108
  254. package/src/services/EventEmitter.ts +0 -52
  255. package/src/services/EventService.ts +0 -14
  256. package/src/services/ModuleService.ts +0 -14
  257. package/src/services/ScreenshotService.ts +0 -31
  258. package/src/services/Subscription.ts +0 -7
  259. package/src/services/TextService.test.ts +0 -88
  260. package/src/services/TextService.ts +0 -82
  261. package/src/services/TranslationService.test.ts +0 -358
  262. package/src/services/TranslationService.ts +0 -417
  263. package/src/services/__mocks__/CoreService.ts +0 -17
  264. package/src/toolsManager/Messages.test.ts +0 -79
  265. package/src/toolsManager/Messages.ts +0 -60
  266. package/src/toolsManager/PluginManager.test.ts +0 -108
  267. package/src/toolsManager/PluginManager.ts +0 -129
  268. package/src/types/DTOs.ts +0 -25
  269. package/src/types/apiSchema.generated.ts +0 -6208
  270. package/src/wrappers/AbstractWrapper.ts +0 -14
  271. package/src/wrappers/NodeHandler.ts +0 -143
  272. package/src/wrappers/WrappedHandler.ts +0 -28
  273. package/src/wrappers/invisible/AttributeHandler.ts +0 -23
  274. package/src/wrappers/invisible/Coder.ts +0 -65
  275. package/src/wrappers/invisible/ContentHandler.ts +0 -15
  276. package/src/wrappers/invisible/CoreHandler.ts +0 -17
  277. package/src/wrappers/invisible/InvisibleWrapper.ts +0 -59
  278. package/src/wrappers/invisible/ValueMemory.test.ts +0 -25
  279. package/src/wrappers/invisible/ValueMemory.ts +0 -16
  280. package/src/wrappers/text/AttributeHandler.test.ts +0 -118
  281. package/src/wrappers/text/AttributeHandler.ts +0 -25
  282. package/src/wrappers/text/Coder.test.ts +0 -298
  283. package/src/wrappers/text/Coder.ts +0 -202
  284. package/src/wrappers/text/ContentHandler.test.ts +0 -185
  285. package/src/wrappers/text/ContentHandler.ts +0 -21
  286. package/src/wrappers/text/CoreHandler.test.ts +0 -106
  287. package/src/wrappers/text/CoreHandler.ts +0 -45
  288. package/src/wrappers/text/TextWrapper.ts +0 -69
@@ -0,0 +1,51 @@
1
+ import {
2
+ CombinedOptions,
3
+ TFnType,
4
+ TranslateOptions,
5
+ TranslateProps,
6
+ } from './types';
7
+
8
+ function parseCombinedOptions({
9
+ ns,
10
+ noWrap,
11
+ orEmpty,
12
+ params,
13
+ ...rest
14
+ }: CombinedOptions<any>): Partial<TranslateProps> {
15
+ const options: Required<TranslateOptions<any>> = {
16
+ ns: ns!,
17
+ noWrap: noWrap!,
18
+ orEmpty: orEmpty!,
19
+ params: {
20
+ ...rest,
21
+ ...params,
22
+ },
23
+ };
24
+ return options;
25
+ }
26
+
27
+ export const getTranslateParams: TFnType<any, TranslateProps<any>> = (
28
+ keyOrProps,
29
+ ...params
30
+ ) => {
31
+ let result = {} as TranslateProps<any>;
32
+ let options: CombinedOptions<any> | undefined;
33
+ if (typeof keyOrProps === 'object') {
34
+ result = keyOrProps;
35
+ } else {
36
+ result.key = keyOrProps;
37
+ if (typeof params[0] === 'string') {
38
+ result.defaultValue = params[0];
39
+ options = params[1] as CombinedOptions<any>;
40
+ } else if (typeof params[0] === 'object') {
41
+ options = params[0] as CombinedOptions<any>;
42
+ }
43
+ }
44
+ if (options) {
45
+ result = {
46
+ ...parseCombinedOptions(options),
47
+ ...result,
48
+ };
49
+ }
50
+ return result;
51
+ };
@@ -0,0 +1,48 @@
1
+ import { Tolgee } from '../Tolgee';
2
+ import { BackendInterface, TolgeePlugin } from '../types';
3
+
4
+ const data = {
5
+ en: {
6
+ common: { cancel: 'Cancel' },
7
+ test: { test: 'Test' },
8
+ },
9
+ es: {
10
+ common: { cancel: 'Cancellar' },
11
+ test: { test: 'Testar' },
12
+ },
13
+ } as any;
14
+
15
+ const backendNormal: BackendInterface = {
16
+ getRecord({ language, namespace = '' }) {
17
+ return data[language]?.[namespace];
18
+ },
19
+ };
20
+
21
+ const backendDev: BackendInterface = {
22
+ getRecord() {
23
+ return Promise.resolve({ cancel: 'Dev' });
24
+ },
25
+ };
26
+
27
+ const backendPlugin: TolgeePlugin = (tolgee, tools) => {
28
+ tools.addBackend(backendNormal);
29
+ tools.setDevBackend(backendDev);
30
+ return tolgee;
31
+ };
32
+
33
+ describe('backend plugins', () => {
34
+ it('uses plugin to fetch', async () => {
35
+ const tolgee = Tolgee()
36
+ .use(backendPlugin)
37
+ .init({
38
+ ns: ['common', 'test'],
39
+ language: 'en',
40
+ });
41
+ await tolgee.run();
42
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Cancel');
43
+ tolgee.stop();
44
+ tolgee.init({ apiUrl: 'asdfasdf', apiKey: 'test' });
45
+ await tolgee.run();
46
+ expect(tolgee.t({ key: 'cancel', ns: 'common' })).toEqual('Dev');
47
+ });
48
+ });
@@ -0,0 +1,148 @@
1
+ import { Tolgee } from '../Tolgee';
2
+ import { TolgeeInstance, TolgeePlugin, TreeTranslationsData } from '../types';
3
+ import { resolvablePromise } from './testTools';
4
+
5
+ const waitForInitialLoad = (tolgee: TolgeeInstance) =>
6
+ new Promise<void>((resolve) => {
7
+ const { unsubscribe } = tolgee.on('initialLoad', () => {
8
+ unsubscribe();
9
+ resolve();
10
+ });
11
+ });
12
+
13
+ const DevToolsPlugin =
14
+ (postfix = ''): TolgeePlugin =>
15
+ (tolgee, tools) => {
16
+ tolgee.init({ apiKey: 'test', apiUrl: 'test' });
17
+ tools.setDevBackend({
18
+ getRecord({ language, namespace }) {
19
+ return Promise.resolve({
20
+ test: { sub: `${language}.${namespace || 'default'}${postfix}` },
21
+ });
22
+ },
23
+ });
24
+ return tolgee;
25
+ };
26
+
27
+ describe('cache', () => {
28
+ let tolgee: TolgeeInstance;
29
+
30
+ beforeEach(async () => {
31
+ tolgee = Tolgee({
32
+ language: 'en',
33
+ staticData: {
34
+ en: { test: { sub: 'subtestEn' } },
35
+ cs: { 'test.sub': 'subtestCs' },
36
+ },
37
+ });
38
+ });
39
+
40
+ afterEach(() => {
41
+ tolgee.stop();
42
+ });
43
+
44
+ it('stores initial data correctly', async () => {
45
+ expect(tolgee.t('test.sub')).toEqual('subtestEn');
46
+ await tolgee.changeLanguage('cs');
47
+ expect(tolgee.t('test.sub')).toEqual('subtestCs');
48
+ });
49
+
50
+ it('ignores empty values', async () => {
51
+ tolgee.addStaticData({
52
+ en: { sub: { test: 'Test', null: null, undefined: undefined } },
53
+ });
54
+ expect(tolgee.t('sub.test')).toEqual('Test');
55
+ expect(tolgee.t('sub.null')).toEqual('sub.null');
56
+ expect(tolgee.t('sub.undefined')).toEqual('sub.undefined');
57
+ });
58
+
59
+ it('returns correct data when in dev mode', async () => {
60
+ expect(tolgee.t('test.sub')).toEqual('subtestEn');
61
+ tolgee.use(DevToolsPlugin());
62
+ await tolgee.run();
63
+ expect(tolgee.t('test.sub')).toEqual('en.default');
64
+ const changeLangPromise = tolgee.changeLanguage('cs');
65
+ expect(tolgee.t('test.sub')).toEqual('en.default');
66
+ await changeLangPromise;
67
+ expect(tolgee.t('test.sub')).toEqual('cs.default');
68
+ });
69
+
70
+ it('invalidates the cache when switching to dev', async () => {
71
+ await tolgee.run();
72
+ expect(tolgee.t('test.sub')).toEqual('subtestEn');
73
+ tolgee.use(DevToolsPlugin());
74
+ expect(tolgee.t('test.sub')).toEqual('subtestEn');
75
+
76
+ await new Promise<void>((resolve) => {
77
+ const { unsubscribe } = tolgee.on('initialLoad', async () => {
78
+ expect(tolgee.t('test.sub')).toEqual('en.default');
79
+ unsubscribe();
80
+ resolve();
81
+ });
82
+ });
83
+ });
84
+
85
+ it('works with switching to different dev backend', async () => {
86
+ tolgee.use(DevToolsPlugin());
87
+ await tolgee.run();
88
+ expect(tolgee.t('test.sub')).toEqual('en.default');
89
+ tolgee.use(DevToolsPlugin('.new'));
90
+ expect(tolgee.t('test.sub')).toEqual('en.default');
91
+
92
+ await waitForInitialLoad(tolgee);
93
+ expect(tolgee.t('test.sub')).toEqual('en.default.new');
94
+ });
95
+
96
+ it('updates initial data correctly', async () => {
97
+ await tolgee.run();
98
+ expect(tolgee.t('test.sub')).toEqual('subtestEn');
99
+ tolgee.addStaticData({ en: { test: { sub: 'newSubtestEn' } } });
100
+ expect(tolgee.t('test.sub')).toEqual('newSubtestEn');
101
+ });
102
+
103
+ it('ignores new initial data when already in dev mode', async () => {
104
+ tolgee.use(DevToolsPlugin());
105
+ await tolgee.run();
106
+ expect(tolgee.t('test.sub')).toEqual('en.default');
107
+ tolgee.addStaticData({ en: { test: { sub: 'newSubtestEn' } } });
108
+ expect(tolgee.t('test.sub')).toEqual('en.default');
109
+ });
110
+
111
+ it('gets all records', async () => {
112
+ await tolgee.run();
113
+ expect(tolgee.getAllRecords().length).toEqual(2);
114
+ });
115
+
116
+ it('fetching works with namespaces', async () => {
117
+ tolgee.use(DevToolsPlugin());
118
+ const runPromise = tolgee.run();
119
+ expect(tolgee.isFetching()).toBeTruthy();
120
+ await runPromise;
121
+ expect(tolgee.t('test.sub', { ns: 'common' })).toEqual('test.sub');
122
+ const nsPromise = tolgee.addActiveNs('common');
123
+ expect(tolgee.isFetching()).toBeTruthy();
124
+ expect(tolgee.isFetching('common')).toBeTruthy();
125
+ expect(tolgee.isFetching('nonexistant')).toBeFalsy();
126
+ await nsPromise;
127
+ expect(tolgee.t('test.sub', { ns: 'common' })).toEqual('en.common');
128
+ expect(tolgee.isFetching()).toBeFalsy();
129
+ });
130
+
131
+ it("pending requests won't rewrite cache when reinitialized", async () => {
132
+ const [promiseEn, resolveEn] = resolvablePromise<TreeTranslationsData>();
133
+ tolgee = Tolgee({
134
+ language: 'en',
135
+ staticData: {
136
+ en: () => promiseEn,
137
+ },
138
+ });
139
+ tolgee.run();
140
+ await Promise.resolve();
141
+ tolgee.use(DevToolsPlugin());
142
+ await waitForInitialLoad(tolgee);
143
+ expect(tolgee.t('test.sub')).toEqual('en.default');
144
+ resolveEn({ test: { sub: 'Invalid' } });
145
+ await Promise.resolve();
146
+ expect(tolgee.t('test.sub')).toEqual('en.default');
147
+ });
148
+ });
@@ -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,26 @@
1
+ import { FormatSimple } from '../FormatSimple/FormatSimple';
2
+ import { Tolgee } from '../Tolgee';
3
+
4
+ describe('format simple', () => {
5
+ it('works with parameters', () => {
6
+ const tolgee = Tolgee()
7
+ .use(FormatSimple())
8
+ .init({
9
+ language: 'en',
10
+ staticData: { en: { apples: 'Bob has { num } apples' } },
11
+ });
12
+ expect(tolgee.t('apples', { num: 7 })).toEqual('Bob has 7 apples');
13
+ });
14
+
15
+ it('throws an error when parameter missing', () => {
16
+ const tolgee = Tolgee()
17
+ .use(FormatSimple())
18
+ .init({
19
+ language: 'en',
20
+ staticData: { en: { apples: 'Bob has { num } apples' } },
21
+ });
22
+ expect(() => tolgee.t('apples')).toThrow(
23
+ 'Missing parameter "num" in "Bob has { num } apples"'
24
+ );
25
+ });
26
+ });
@@ -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
+ });