@tolgee/core 4.9.2 → 4.9.3-rc.128edeb.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 +1275 -7024
  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 +1404 -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 +1275 -7024
  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 +293 -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,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
+ });
@@ -0,0 +1,74 @@
1
+ import { Tolgee } from '../Tolgee';
2
+
3
+ describe('namespaces fallback', () => {
4
+ test('works with multiple and default', () => {
5
+ const tolgee = Tolgee({
6
+ language: 'en',
7
+ staticData: {
8
+ en: { '0': 'noNamespace' },
9
+ 'en:first': { '1': 'first' },
10
+ 'en:second': { '2': 'second' },
11
+ },
12
+ fallbackNs: ['first', 'second'],
13
+ });
14
+
15
+ expect(tolgee.t({ key: '0' })).toEqual('noNamespace');
16
+ expect(tolgee.t({ key: '1' })).toEqual('first');
17
+ expect(tolgee.t({ key: '2' })).toEqual('second');
18
+ expect(tolgee.t({ key: '4' })).toEqual('4');
19
+ expect(tolgee.t({ key: '4', orEmpty: true })).toEqual('');
20
+ });
21
+
22
+ test('works when no fallback specified', () => {
23
+ const tolgee = Tolgee({
24
+ language: 'en',
25
+ staticData: {
26
+ en: { '0': 'noNamespace' },
27
+ 'en:second': { '2': 'second' },
28
+ },
29
+ fallbackNs: ['first', 'second'],
30
+ });
31
+
32
+ expect(tolgee.t({ key: '0' })).toEqual('noNamespace');
33
+ expect(tolgee.t({ key: '1' })).toEqual('1');
34
+ expect(tolgee.t({ key: '2' })).toEqual('second');
35
+ expect(tolgee.t({ key: '4' })).toEqual('4');
36
+ expect(tolgee.t({ key: '4', orEmpty: true })).toEqual('');
37
+ });
38
+
39
+ test('works when data present but no fallback', () => {
40
+ const tolgee = Tolgee({
41
+ language: 'en',
42
+ staticData: {
43
+ en: { '0': 'noNamespace' },
44
+ 'en:first': { '1': 'first' },
45
+ 'en:second': { '2': 'second' },
46
+ },
47
+ fallbackNs: ['second'],
48
+ });
49
+
50
+ expect(tolgee.t({ key: '0' })).toEqual('noNamespace');
51
+ expect(tolgee.t({ key: '1' })).toEqual('1');
52
+ expect(tolgee.t({ key: '2' })).toEqual('second');
53
+ expect(tolgee.t({ key: '4' })).toEqual('4');
54
+ expect(tolgee.t({ key: '4', orEmpty: true })).toEqual('');
55
+ });
56
+
57
+ test('works with override', () => {
58
+ const tolgee = Tolgee({
59
+ language: 'en',
60
+ staticData: {
61
+ en: { '0': 'noNamespace' },
62
+ 'en:first': { '1': 'first' },
63
+ 'en:second': { '2': 'second' },
64
+ },
65
+ fallbackNs: ['second'],
66
+ });
67
+
68
+ expect(tolgee.t({ key: '1' })).toEqual('1');
69
+ expect(tolgee.t({ key: '1', ns: 'first' })).toEqual('first');
70
+ expect(tolgee.t({ key: '0', ns: 'first' })).toEqual('0');
71
+ expect(tolgee.t({ key: '2', ns: 'first' })).toEqual('2');
72
+ expect(tolgee.t({ key: '2', ns: 'second' })).toEqual('second');
73
+ });
74
+ });
@@ -0,0 +1,136 @@
1
+ import { Tolgee } from '../Tolgee';
2
+ import {
3
+ FinalFormatterInterface,
4
+ FormatterInterface,
5
+ FormatterInterfaceFormatParams,
6
+ ObserverInterface,
7
+ TolgeePlugin,
8
+ WrapperWrapFunction,
9
+ ObserverOptions,
10
+ } from '../types';
11
+
12
+ const testObserver =
13
+ (
14
+ outputNotFormattable: boolean,
15
+ onCreate?: (options: ObserverOptions) => void
16
+ ): ObserverInterface =>
17
+ ({ options }) => {
18
+ const wrap: WrapperWrapFunction = ({ key, translation }) => {
19
+ return `${key}|${translation}`;
20
+ };
21
+ const unwrap = (input: string) => {
22
+ const [key, text] = input.split('|');
23
+ return { text, keys: [{ key }] };
24
+ };
25
+
26
+ const stop = () => {};
27
+ const run = () => {};
28
+
29
+ const retranslate = () => {};
30
+
31
+ onCreate?.(options);
32
+
33
+ return Object.freeze({
34
+ wrap,
35
+ unwrap,
36
+ run,
37
+ stop,
38
+ retranslate,
39
+ highlight: () => ({ unhighlight: () => {} }),
40
+ outputNotFormattable,
41
+ });
42
+ };
43
+
44
+ const testFormatter1: FormatterInterface = {
45
+ format: ({ translation }: FormatterInterfaceFormatParams) => {
46
+ return `(1${translation})`;
47
+ },
48
+ };
49
+
50
+ const testFormatter2: FormatterInterface = {
51
+ format: ({ translation }: FormatterInterfaceFormatParams) => {
52
+ return `(2${translation})`;
53
+ },
54
+ };
55
+
56
+ const testFinalFormatter: FinalFormatterInterface = {
57
+ format: ({ translation }: FormatterInterfaceFormatParams) => {
58
+ return { final: translation };
59
+ },
60
+ };
61
+
62
+ const observerPlugin =
63
+ (
64
+ outputNotFormattable: boolean,
65
+ onCreate?: (options: ObserverOptions) => void
66
+ ): TolgeePlugin =>
67
+ (tolgee, tools) => {
68
+ tools.setObserver(testObserver(outputNotFormattable, onCreate));
69
+ return tolgee;
70
+ };
71
+
72
+ const formattersPlugin: TolgeePlugin = (tolgee, tools) => {
73
+ tools.addFormatter(testFormatter1);
74
+ tools.addFormatter(testFormatter2);
75
+ tools.setFinalFormatter(testFinalFormatter);
76
+ return tolgee;
77
+ };
78
+
79
+ describe('plugins', () => {
80
+ it('wraps and formats translation', () => {
81
+ const tolgee = Tolgee({
82
+ language: 'en',
83
+ staticData: { en: { hello: 'world' } },
84
+ });
85
+ tolgee.use(observerPlugin(false));
86
+ tolgee.run();
87
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello|world');
88
+
89
+ tolgee.use(formattersPlugin);
90
+ expect(tolgee.t({ key: 'hello' })).toEqual({ final: '(2(1hello|world))' });
91
+ tolgee.stop();
92
+ });
93
+
94
+ it("won't format when observer doesn't return formattable text", () => {
95
+ const tolgee = Tolgee({
96
+ language: 'en',
97
+ staticData: { en: { hello: 'world' } },
98
+ });
99
+ tolgee.use(observerPlugin(true));
100
+ tolgee.run();
101
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello|world');
102
+
103
+ tolgee.use(formattersPlugin);
104
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello|world');
105
+ tolgee.stop();
106
+ });
107
+
108
+ it("won't wrap before run", () => {
109
+ const tolgee = Tolgee({
110
+ language: 'en',
111
+ staticData: { en: { hello: 'world' } },
112
+ });
113
+ tolgee.use(observerPlugin(false));
114
+ expect(tolgee.t({ key: 'hello' })).toEqual('world');
115
+ tolgee.run();
116
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello|world');
117
+ });
118
+
119
+ it('observer recieves options', () => {
120
+ const tolgee = Tolgee({
121
+ language: 'en',
122
+ staticData: { en: { hello: 'world' } },
123
+ });
124
+ const restrictedElements = ['test'];
125
+ tolgee.setObserverOptions({
126
+ restrictedElements,
127
+ });
128
+ const onCreate = jest.fn();
129
+ tolgee.use(observerPlugin(false, onCreate));
130
+ tolgee.run();
131
+ expect(onCreate).toBeCalledTimes(1);
132
+ expect(onCreate.mock.calls[0][0].restrictedElements).toEqual(
133
+ restrictedElements
134
+ );
135
+ });
136
+ });
@@ -0,0 +1,7 @@
1
+ export const resolvablePromise = <T = any>() => {
2
+ let resolve: (value: T) => void;
3
+ const promise = new Promise<T>((innerResolve) => {
4
+ resolve = innerResolve;
5
+ });
6
+ return [promise, resolve!] as const;
7
+ };
@@ -1,9 +1,4 @@
1
1
  export const RESTRICTED_ASCENDANT_ATTRIBUTE = 'data-tolgee-restricted';
2
-
3
2
  export const TOLGEE_ATTRIBUTE_NAME = '_tolgee';
4
- export const TOLGEE_TARGET_ATTRIBUTE = '_tolgee-target';
5
- export const TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE = 'data-tolgee-key-only';
6
3
  export const TOLGEE_HIGHLIGHTER_CLASS = '_tolgee-highlighter';
7
-
8
- // needs to be same as in @tolgee/ui package
9
- export const DEVTOOLS_ID = '__tolgee_dev_tools';
4
+ export const TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE = 'data-tolgee-key-only';
package/src/helpers.ts ADDED
@@ -0,0 +1,17 @@
1
+ export function isPromise(value: any) {
2
+ return Boolean(value && typeof value.then === 'function');
3
+ }
4
+
5
+ export const valueOrPromise = <T, R>(
6
+ value: T | Promise<T>,
7
+ callback: (value: T) => R
8
+ ) => {
9
+ if (isPromise(value)) {
10
+ return Promise.resolve(value).then(callback);
11
+ } else {
12
+ return callback(value as T);
13
+ }
14
+ };
15
+
16
+ export const missingOptionError = (option: string) =>
17
+ `Tolgee: You need to specify '${option}' option`;
package/src/index.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  export { Tolgee } from './Tolgee';
2
- export { TolgeeConfig } from './TolgeeConfig';
3
- export { ModifierKey } from './Constants/ModifierKey';
4
- export { TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE } from './Constants/Global';
5
- export * from './modules';
6
- export * from './types/DTOs';
2
+ export {
3
+ RESTRICTED_ASCENDANT_ATTRIBUTE,
4
+ TOLGEE_ATTRIBUTE_NAME,
5
+ TOLGEE_HIGHLIGHTER_CLASS,
6
+ TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE,
7
+ } from './constants';
7
8
  export * from './types';
8
- export * from './Constants/Global';
9
- export * from './helpers/NodeHelper';
10
- export * from './helpers/TextHelper';
9
+ export { getTranslateParams } from './TranslateParams';
10
+ export { getFallback, getFallbackArray } from './Controller/State/helpers';
11
+ export { FormatSimple } from './FormatSimple/FormatSimple';