@tolgee/core 4.9.2 → 4.10.0-rc.14ca700.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 (274) hide show
  1. package/dist/tolgee.cjs.js +1075 -7022
  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 +1073 -7017
  8. package/dist/tolgee.esm.mjs.map +1 -1
  9. package/dist/tolgee.umd.js +1075 -7022
  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 +137 -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 +43 -0
  20. package/lib/Controller/State/State.d.ts +21 -0
  21. package/lib/Controller/State/helpers.d.ts +6 -0
  22. package/lib/Controller/State/initState.d.ts +55 -0
  23. package/lib/Controller/ValueObserver.d.ts +5 -0
  24. package/lib/Tolgee.d.ts +2 -68
  25. package/lib/TranslateParams.d.ts +2 -0
  26. package/lib/{Constants/Global.d.ts → constants.d.ts} +1 -2
  27. package/lib/helpers.d.ts +3 -0
  28. package/lib/index.d.ts +3 -8
  29. package/lib/types.d.ts +235 -84
  30. package/package.json +20 -29
  31. package/src/Controller/Cache/Cache.ts +293 -0
  32. package/src/Controller/Cache/helpers.ts +37 -0
  33. package/src/Controller/Controller.ts +307 -0
  34. package/src/Controller/Events/EventEmitter.ts +27 -0
  35. package/src/Controller/Events/EventEmitterSelective.test.ts +125 -0
  36. package/src/Controller/Events/EventEmitterSelective.ts +179 -0
  37. package/src/Controller/Events/Events.ts +66 -0
  38. package/src/Controller/Plugins/Plugins.ts +305 -0
  39. package/src/Controller/State/State.ts +156 -0
  40. package/src/Controller/State/helpers.ts +41 -0
  41. package/src/Controller/State/initState.ts +90 -0
  42. package/src/Controller/ValueObserver.ts +23 -0
  43. package/src/Tolgee.ts +72 -333
  44. package/src/TranslateParams.test.ts +41 -0
  45. package/src/TranslateParams.ts +51 -0
  46. package/src/__test/backend.test.ts +48 -0
  47. package/src/__test/cache.test.ts +148 -0
  48. package/src/__test/client.test.ts +48 -0
  49. package/src/__test/events.test.ts +33 -0
  50. package/src/__test/initialization.test.ts +73 -0
  51. package/src/__test/jest-setup.ts +2 -0
  52. package/src/__test/languageDetection.test.ts +129 -0
  53. package/src/__test/languageStorage.test.ts +145 -0
  54. package/src/__test/languages.test.ts +112 -0
  55. package/src/__test/loading.test.ts +39 -0
  56. package/src/__test/namespaces.test.ts +99 -0
  57. package/src/__test/namespacesFallback.test.ts +74 -0
  58. package/src/__test/plugins.test.ts +98 -0
  59. package/src/__test/testTools.ts +7 -0
  60. package/src/{Constants/Global.ts → constants.ts} +1 -3
  61. package/src/helpers.ts +17 -0
  62. package/src/index.ts +9 -8
  63. package/src/types.ts +322 -90
  64. package/README.md +0 -45
  65. package/dist/Constants/Global.d.ts +0 -6
  66. package/dist/Constants/ModifierKey.d.ts +0 -6
  67. package/dist/Errors/ApiHttpError.d.ts +0 -5
  68. package/dist/Observer.d.ts +0 -14
  69. package/dist/Observer.test.d.ts +0 -2
  70. package/dist/Properties.d.ts +0 -17
  71. package/dist/Properties.test.d.ts +0 -1
  72. package/dist/Tolgee.d.ts +0 -68
  73. package/dist/Tolgee.test.d.ts +0 -1
  74. package/dist/TolgeeConfig.d.ts +0 -69
  75. package/dist/TolgeeConfig.test.d.ts +0 -1
  76. package/dist/__integration/FormatterIcu.test.d.ts +0 -1
  77. package/dist/__integration/FormatterMissing.d.ts +0 -1
  78. package/dist/__integration/Tolgee.test.d.ts +0 -1
  79. package/dist/__integration/TolgeeInvisible.test.d.ts +0 -1
  80. package/dist/__integration/mockTranslations.d.ts +0 -7
  81. package/dist/__integration/testConfig.d.ts +0 -9
  82. package/dist/__testFixtures/classMock.d.ts +0 -3
  83. package/dist/__testFixtures/createElement.d.ts +0 -2
  84. package/dist/__testFixtures/createTestDom.d.ts +0 -9
  85. package/dist/__testFixtures/mocked.d.ts +0 -20
  86. package/dist/__testFixtures/setupAfterEnv.d.ts +0 -8
  87. package/dist/helpers/NodeHelper.d.ts +0 -14
  88. package/dist/helpers/TextHelper.d.ts +0 -5
  89. package/dist/helpers/TextHelper.test.d.ts +0 -1
  90. package/dist/helpers/commonTypes.d.ts +0 -2
  91. package/dist/helpers/encoderPolyfill.d.ts +0 -8
  92. package/dist/helpers/secret.d.ts +0 -6
  93. package/dist/helpers/secret.test.d.ts +0 -1
  94. package/dist/helpers/sleep.d.ts +0 -1
  95. package/dist/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  96. package/dist/highlighter/HighlightFunctionsInitializer.test.d.ts +0 -1
  97. package/dist/highlighter/MouseEventHandler.d.ts +0 -29
  98. package/dist/highlighter/MouseEventHandler.test.d.ts +0 -1
  99. package/dist/highlighter/TranslationHighlighter.d.ts +0 -14
  100. package/dist/highlighter/TranslationHighlighter.test.d.ts +0 -1
  101. package/dist/index.d.ts +0 -10
  102. package/dist/internal.d.ts +0 -2
  103. package/dist/modules/IcuFormatter.d.ts +0 -2
  104. package/dist/modules/IcuFormatter.test.d.ts +0 -1
  105. package/dist/modules/index.d.ts +0 -1
  106. package/dist/services/ApiHttpService.d.ts +0 -15
  107. package/dist/services/CoreService.d.ts +0 -18
  108. package/dist/services/CoreService.test.d.ts +0 -1
  109. package/dist/services/DependencyService.d.ts +0 -39
  110. package/dist/services/DependencyService.test.d.ts +0 -1
  111. package/dist/services/ElementRegistrar.d.ts +0 -19
  112. package/dist/services/ElementRegistrar.test.d.ts +0 -1
  113. package/dist/services/EventEmitter.d.ts +0 -13
  114. package/dist/services/EventService.d.ts +0 -9
  115. package/dist/services/ModuleService.d.ts +0 -5
  116. package/dist/services/ScreenshotService.d.ts +0 -15
  117. package/dist/services/Subscription.d.ts +0 -5
  118. package/dist/services/TextService.d.ts +0 -14
  119. package/dist/services/TextService.test.d.ts +0 -1
  120. package/dist/services/TranslationService.d.ts +0 -75
  121. package/dist/services/TranslationService.test.d.ts +0 -1
  122. package/dist/services/__mocks__/CoreService.d.ts +0 -2
  123. package/dist/toolsManager/Messages.d.ts +0 -8
  124. package/dist/toolsManager/Messages.test.d.ts +0 -1
  125. package/dist/toolsManager/PluginManager.d.ts +0 -21
  126. package/dist/toolsManager/PluginManager.test.d.ts +0 -1
  127. package/dist/types/DTOs.d.ts +0 -20
  128. package/dist/types/apiSchema.generated.d.ts +0 -6185
  129. package/dist/types.d.ts +0 -123
  130. package/dist/wrappers/AbstractWrapper.d.ts +0 -8
  131. package/dist/wrappers/NodeHandler.d.ts +0 -18
  132. package/dist/wrappers/WrappedHandler.d.ts +0 -8
  133. package/dist/wrappers/invisible/AttributeHandler.d.ts +0 -8
  134. package/dist/wrappers/invisible/Coder.d.ts +0 -7
  135. package/dist/wrappers/invisible/ContentHandler.d.ts +0 -6
  136. package/dist/wrappers/invisible/CoreHandler.d.ts +0 -10
  137. package/dist/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  138. package/dist/wrappers/invisible/ValueMemory.d.ts +0 -5
  139. package/dist/wrappers/invisible/ValueMemory.test.d.ts +0 -1
  140. package/dist/wrappers/text/AttributeHandler.d.ts +0 -8
  141. package/dist/wrappers/text/AttributeHandler.test.d.ts +0 -1
  142. package/dist/wrappers/text/Coder.d.ts +0 -15
  143. package/dist/wrappers/text/Coder.test.d.ts +0 -1
  144. package/dist/wrappers/text/ContentHandler.d.ts +0 -8
  145. package/dist/wrappers/text/ContentHandler.test.d.ts +0 -1
  146. package/dist/wrappers/text/CoreHandler.d.ts +0 -17
  147. package/dist/wrappers/text/CoreHandler.test.d.ts +0 -1
  148. package/dist/wrappers/text/TextWrapper.d.ts +0 -20
  149. package/index.js +0 -7
  150. package/lib/Constants/ModifierKey.d.ts +0 -6
  151. package/lib/Errors/ApiHttpError.d.ts +0 -5
  152. package/lib/Observer.d.ts +0 -14
  153. package/lib/Properties.d.ts +0 -17
  154. package/lib/TolgeeConfig.d.ts +0 -69
  155. package/lib/helpers/NodeHelper.d.ts +0 -14
  156. package/lib/helpers/TextHelper.d.ts +0 -5
  157. package/lib/helpers/commonTypes.d.ts +0 -2
  158. package/lib/helpers/encoderPolyfill.d.ts +0 -8
  159. package/lib/helpers/secret.d.ts +0 -6
  160. package/lib/helpers/sleep.d.ts +0 -1
  161. package/lib/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  162. package/lib/highlighter/MouseEventHandler.d.ts +0 -29
  163. package/lib/highlighter/TranslationHighlighter.d.ts +0 -14
  164. package/lib/modules/IcuFormatter.d.ts +0 -2
  165. package/lib/modules/index.d.ts +0 -1
  166. package/lib/services/ApiHttpService.d.ts +0 -15
  167. package/lib/services/CoreService.d.ts +0 -18
  168. package/lib/services/DependencyService.d.ts +0 -39
  169. package/lib/services/ElementRegistrar.d.ts +0 -19
  170. package/lib/services/EventEmitter.d.ts +0 -13
  171. package/lib/services/EventService.d.ts +0 -9
  172. package/lib/services/ModuleService.d.ts +0 -5
  173. package/lib/services/ScreenshotService.d.ts +0 -15
  174. package/lib/services/Subscription.d.ts +0 -5
  175. package/lib/services/TextService.d.ts +0 -14
  176. package/lib/services/TranslationService.d.ts +0 -75
  177. package/lib/toolsManager/Messages.d.ts +0 -8
  178. package/lib/toolsManager/PluginManager.d.ts +0 -21
  179. package/lib/types/DTOs.d.ts +0 -20
  180. package/lib/types/apiSchema.generated.d.ts +0 -6185
  181. package/lib/wrappers/AbstractWrapper.d.ts +0 -8
  182. package/lib/wrappers/NodeHandler.d.ts +0 -18
  183. package/lib/wrappers/WrappedHandler.d.ts +0 -8
  184. package/lib/wrappers/invisible/AttributeHandler.d.ts +0 -8
  185. package/lib/wrappers/invisible/Coder.d.ts +0 -7
  186. package/lib/wrappers/invisible/ContentHandler.d.ts +0 -6
  187. package/lib/wrappers/invisible/CoreHandler.d.ts +0 -10
  188. package/lib/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  189. package/lib/wrappers/invisible/ValueMemory.d.ts +0 -5
  190. package/lib/wrappers/text/AttributeHandler.d.ts +0 -8
  191. package/lib/wrappers/text/Coder.d.ts +0 -15
  192. package/lib/wrappers/text/ContentHandler.d.ts +0 -8
  193. package/lib/wrappers/text/CoreHandler.d.ts +0 -17
  194. package/lib/wrappers/text/TextWrapper.d.ts +0 -20
  195. package/src/Constants/ModifierKey.ts +0 -6
  196. package/src/Errors/ApiHttpError.ts +0 -8
  197. package/src/Observer.test.ts +0 -119
  198. package/src/Observer.ts +0 -68
  199. package/src/Properties.test.ts +0 -150
  200. package/src/Properties.ts +0 -112
  201. package/src/Tolgee.test.ts +0 -473
  202. package/src/TolgeeConfig.test.ts +0 -21
  203. package/src/TolgeeConfig.ts +0 -134
  204. package/src/__integration/FormatterIcu.test.ts +0 -80
  205. package/src/__integration/FormatterMissing.ts +0 -54
  206. package/src/__integration/Tolgee.test.ts +0 -90
  207. package/src/__integration/TolgeeInvisible.test.ts +0 -145
  208. package/src/__integration/mockTranslations.ts +0 -6
  209. package/src/__integration/testConfig.ts +0 -16
  210. package/src/__testFixtures/classMock.ts +0 -11
  211. package/src/__testFixtures/createElement.ts +0 -43
  212. package/src/__testFixtures/createTestDom.ts +0 -26
  213. package/src/__testFixtures/mocked.ts +0 -25
  214. package/src/__testFixtures/setupAfterEnv.ts +0 -34
  215. package/src/helpers/NodeHelper.ts +0 -90
  216. package/src/helpers/TextHelper.test.ts +0 -62
  217. package/src/helpers/TextHelper.ts +0 -58
  218. package/src/helpers/commonTypes.ts +0 -8
  219. package/src/helpers/encoderPolyfill.ts +0 -96
  220. package/src/helpers/secret.test.ts +0 -61
  221. package/src/helpers/secret.ts +0 -68
  222. package/src/helpers/sleep.ts +0 -2
  223. package/src/highlighter/HighlightFunctionsInitializer.test.ts +0 -40
  224. package/src/highlighter/HighlightFunctionsInitializer.ts +0 -61
  225. package/src/highlighter/MouseEventHandler.test.ts +0 -151
  226. package/src/highlighter/MouseEventHandler.ts +0 -191
  227. package/src/highlighter/TranslationHighlighter.test.ts +0 -177
  228. package/src/highlighter/TranslationHighlighter.ts +0 -113
  229. package/src/internal.ts +0 -2
  230. package/src/modules/IcuFormatter.test.ts +0 -21
  231. package/src/modules/IcuFormatter.ts +0 -39
  232. package/src/modules/index.ts +0 -1
  233. package/src/services/ApiHttpService.ts +0 -85
  234. package/src/services/CoreService.test.ts +0 -141
  235. package/src/services/CoreService.ts +0 -76
  236. package/src/services/DependencyService.test.ts +0 -51
  237. package/src/services/DependencyService.ts +0 -116
  238. package/src/services/ElementRegistrar.test.ts +0 -131
  239. package/src/services/ElementRegistrar.ts +0 -108
  240. package/src/services/EventEmitter.ts +0 -52
  241. package/src/services/EventService.ts +0 -14
  242. package/src/services/ModuleService.ts +0 -14
  243. package/src/services/ScreenshotService.ts +0 -31
  244. package/src/services/Subscription.ts +0 -7
  245. package/src/services/TextService.test.ts +0 -88
  246. package/src/services/TextService.ts +0 -82
  247. package/src/services/TranslationService.test.ts +0 -358
  248. package/src/services/TranslationService.ts +0 -417
  249. package/src/services/__mocks__/CoreService.ts +0 -17
  250. package/src/toolsManager/Messages.test.ts +0 -79
  251. package/src/toolsManager/Messages.ts +0 -60
  252. package/src/toolsManager/PluginManager.test.ts +0 -108
  253. package/src/toolsManager/PluginManager.ts +0 -129
  254. package/src/types/DTOs.ts +0 -25
  255. package/src/types/apiSchema.generated.ts +0 -6208
  256. package/src/wrappers/AbstractWrapper.ts +0 -14
  257. package/src/wrappers/NodeHandler.ts +0 -143
  258. package/src/wrappers/WrappedHandler.ts +0 -28
  259. package/src/wrappers/invisible/AttributeHandler.ts +0 -23
  260. package/src/wrappers/invisible/Coder.ts +0 -65
  261. package/src/wrappers/invisible/ContentHandler.ts +0 -15
  262. package/src/wrappers/invisible/CoreHandler.ts +0 -17
  263. package/src/wrappers/invisible/InvisibleWrapper.ts +0 -59
  264. package/src/wrappers/invisible/ValueMemory.test.ts +0 -25
  265. package/src/wrappers/invisible/ValueMemory.ts +0 -16
  266. package/src/wrappers/text/AttributeHandler.test.ts +0 -118
  267. package/src/wrappers/text/AttributeHandler.ts +0 -25
  268. package/src/wrappers/text/Coder.test.ts +0 -298
  269. package/src/wrappers/text/Coder.ts +0 -202
  270. package/src/wrappers/text/ContentHandler.test.ts +0 -185
  271. package/src/wrappers/text/ContentHandler.ts +0 -21
  272. package/src/wrappers/text/CoreHandler.test.ts +0 -106
  273. package/src/wrappers/text/CoreHandler.ts +0 -45
  274. package/src/wrappers/text/TextWrapper.ts +0 -69
@@ -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,98 @@
1
+ import { Tolgee } from '../Tolgee';
2
+ import {
3
+ FinalFormatterInterface,
4
+ FormatterInterface,
5
+ FormatterInterfaceFormatParams,
6
+ ObserverInterface,
7
+ TolgeePlugin,
8
+ WrapperWrapFunction,
9
+ } from '../types';
10
+
11
+ const testObserver =
12
+ (outputNotFormattable: boolean): ObserverInterface =>
13
+ () => {
14
+ const wrap: WrapperWrapFunction = ({ key, translation }) => {
15
+ return `${key}|${translation}`;
16
+ };
17
+ const unwrap = (input: string) => {
18
+ const [key, text] = input.split('|');
19
+ return { text, keys: [{ key }] };
20
+ };
21
+
22
+ const stop = () => {};
23
+ const run = () => {};
24
+
25
+ const retranslate = () => {};
26
+
27
+ return Object.freeze({
28
+ wrap,
29
+ unwrap,
30
+ run,
31
+ stop,
32
+ retranslate,
33
+ highlight: () => ({ unhighlight: () => {} }),
34
+ outputNotFormattable,
35
+ });
36
+ };
37
+
38
+ const testFormatter1: FormatterInterface = {
39
+ format: ({ translation }: FormatterInterfaceFormatParams) => {
40
+ return `(1${translation})`;
41
+ },
42
+ };
43
+
44
+ const testFormatter2: FormatterInterface = {
45
+ format: ({ translation }: FormatterInterfaceFormatParams) => {
46
+ return `(2${translation})`;
47
+ },
48
+ };
49
+
50
+ const testFinalFormatter: FinalFormatterInterface = {
51
+ format: ({ translation }: FormatterInterfaceFormatParams) => {
52
+ return { final: translation };
53
+ },
54
+ };
55
+
56
+ const observerPlugin =
57
+ (outputNotFormattable: boolean): TolgeePlugin =>
58
+ (tolgee, tools) => {
59
+ tools.setObserver(testObserver(outputNotFormattable));
60
+ return tolgee;
61
+ };
62
+
63
+ const formattersPlugin: TolgeePlugin = (tolgee, tools) => {
64
+ tools.addFormatter(testFormatter1);
65
+ tools.addFormatter(testFormatter2);
66
+ tools.setFinalFormatter(testFinalFormatter);
67
+ return tolgee;
68
+ };
69
+
70
+ describe('plugins', () => {
71
+ it('wraps and formats translation', () => {
72
+ const tolgee = Tolgee({
73
+ language: 'en',
74
+ staticData: { en: { hello: 'world' } },
75
+ });
76
+ tolgee.use(observerPlugin(false));
77
+ tolgee.run();
78
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello|world');
79
+
80
+ tolgee.use(formattersPlugin);
81
+ expect(tolgee.t({ key: 'hello' })).toEqual({ final: '(2(1hello|world))' });
82
+ tolgee.stop();
83
+ });
84
+
85
+ it("won't format when observer doesn't return formattable text", () => {
86
+ const tolgee = Tolgee({
87
+ language: 'en',
88
+ staticData: { en: { hello: 'world' } },
89
+ });
90
+ tolgee.use(observerPlugin(true));
91
+ tolgee.run();
92
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello|world');
93
+
94
+ tolgee.use(formattersPlugin);
95
+ expect(tolgee.t({ key: 'hello' })).toEqual('hello|world');
96
+ tolgee.stop();
97
+ });
98
+ });
@@ -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,7 @@
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';
4
+ export const TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE = 'data-tolgee-key-only';
7
5
 
8
6
  // needs to be same as in @tolgee/ui package
9
7
  export const DEVTOOLS_ID = '__tolgee_dev_tools';
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
+ DEVTOOLS_ID,
5
+ TOLGEE_ATTRIBUTE_NAME,
6
+ TOLGEE_HIGHLIGHTER_CLASS,
7
+ TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE,
8
+ } from './constants';
7
9
  export * from './types';
8
- export * from './Constants/Global';
9
- export * from './helpers/NodeHelper';
10
- export * from './helpers/TextHelper';
10
+ export { getTranslateParams } from './TranslateParams';
11
+ export { getFallback, getFallbackArray } from './Controller/State/helpers';
package/src/types.ts CHANGED
@@ -1,96 +1,279 @@
1
- export interface TextInputElementData {
2
- oldValue: string;
3
- valueInputs: string[];
4
- touched: boolean;
5
- oldPlaceholder: string;
6
- placeholderInputs: string[];
7
- }
1
+ import type { Options } from './Controller/State/initState';
8
2
 
9
- export type TreeTranslationsData = {
10
- [key: string]: string | TreeTranslationsData;
11
- };
3
+ export type { State, Options } from './Controller/State/initState';
4
+ export type { EventEmitterType } from './Controller/Events/EventEmitter';
5
+ export type { EventEmitterSelectiveType } from './Controller/Events/EventEmitterSelective';
12
6
 
13
- export type Translations = Record<string, string>;
14
- export type TranslationParams = {
15
- [key: string]: string | number | bigint;
16
- };
17
- export type TranslationParamsTags<T> = {
18
- [key: string]: string | number | bigint | ((value: T | T[]) => T);
19
- };
7
+ export type FallbackGeneral = undefined | false | string | string[];
20
8
 
21
- export type TranslateProps = {
22
- key: string;
23
- defaultValue?: string;
24
- params?: TranslationParams;
9
+ export type FallbackNS = FallbackGeneral;
10
+
11
+ export type NsType = string;
12
+
13
+ export type KeyType = string;
14
+
15
+ export type FallbackNSTranslation = undefined | NsType | NsType[];
16
+
17
+ export type FallbackLanguage = FallbackGeneral;
18
+
19
+ export type FallbackLanguageObject = Record<string, FallbackLanguage>;
20
+
21
+ export type FallbackLanguageOption = FallbackLanguage | FallbackLanguageObject;
22
+
23
+ export type TranslateOptions<T> = {
24
+ ns?: FallbackNSTranslation;
25
25
  noWrap?: boolean;
26
26
  orEmpty?: boolean;
27
+ params?: TranslateParams<T>;
27
28
  };
28
- export type TranslatePropsTags<T> = {
29
- key: string;
29
+
30
+ export type TranslateProps<T = DefaultParamType> = {
31
+ key: KeyType;
30
32
  defaultValue?: string;
31
- params?: TranslationParamsTags<T>;
32
- noWrap?: boolean;
33
- orEmpty?: boolean;
33
+ } & TranslateOptions<T>;
34
+
35
+ export type TranslatePropsInternal = TranslateProps & {
36
+ translation?: string;
34
37
  };
35
38
 
36
- export type InstantProps = {
37
- key: string;
38
- defaultValue?: string;
39
- params?: TranslationParams;
40
- noWrap?: boolean;
41
- orEmpty?: boolean;
39
+ export type TranslationValue = string | undefined | null;
40
+
41
+ export type TranslationsFlat = Map<string, TranslationValue>;
42
+
43
+ export type TreeTranslationsData = {
44
+ [key: string]: TranslationValue | TreeTranslationsData;
42
45
  };
43
- export type InstantPropsTags<T> = {
44
- key: string;
45
- defaultValue?: string;
46
- params?: TranslationParamsTags<T>;
47
- noWrap?: boolean;
48
- orEmpty?: boolean;
46
+
47
+ export type CacheAsyncRequests = Map<
48
+ string,
49
+ Promise<TreeTranslationsData | undefined> | undefined
50
+ >;
51
+
52
+ export type CacheDescriptor = {
53
+ language: string;
54
+ namespace?: string;
55
+ };
56
+
57
+ export type CacheDescriptorInternal = {
58
+ language: string;
59
+ namespace: string;
60
+ };
61
+
62
+ export type CacheDescriptorWithKey = CacheDescriptorInternal & {
63
+ key?: string;
49
64
  };
50
65
 
51
66
  export type KeyAndParams = {
52
67
  key: string;
53
- params: TranslationParams;
68
+ params?: TranslateParams;
54
69
  defaultValue?: string;
70
+ ns?: FallbackNSTranslation;
55
71
  };
56
- export type KeyAndParamsTags<T> = {
57
- key: string;
58
- params: TranslationParamsTags<T>;
59
- defaultValue?: string;
72
+
73
+ export type Unwrapped = { text: string; keys: KeyAndParams[] };
74
+
75
+ type PropType<TObj> = TObj[keyof TObj];
76
+
77
+ export type DefaultParamType = string | number | bigint;
78
+
79
+ export type TranslateParams<T = DefaultParamType> = {
80
+ [key: string]: T;
60
81
  };
61
82
 
62
- export type TranslatedWithMetadata = {
63
- translated: string;
64
- key: string;
65
- params: TranslationParams;
66
- defaultValue: string | undefined;
83
+ export type CombinedOptions<T> = TranslateOptions<T> & {
84
+ [key: string]: T | PropType<TranslateOptions<T>>;
67
85
  };
68
- export type TranslatedWithMetadataTags<T> = {
69
- translated: TranslationTags<T>;
70
- key: string;
71
- params: TranslationParamsTags<T>;
72
- defaultValue: string | undefined;
86
+
87
+ export type TFnType<T = DefaultParamType, R = string> = {
88
+ (key: string, defaultValue?: string, options?: CombinedOptions<T>): R;
89
+ (key: string, options?: CombinedOptions<T>): R;
90
+ (props: TranslateProps<T>): R;
91
+ };
92
+
93
+ export type WrapperWrapProps = Pick<
94
+ TranslatePropsInternal,
95
+ 'key' | 'params' | 'defaultValue' | 'ns' | 'translation'
96
+ >;
97
+ export type WrapperWrapFunction = (props: WrapperWrapProps) => string;
98
+ export type WrapperUnwrapFunction = (text: string) => Unwrapped;
99
+
100
+ export type WrapperAttributeXPathGetter = (props: {
101
+ tag: string;
102
+ attribute: string;
103
+ }) => string;
104
+
105
+ export type WrapperInterface = {
106
+ unwrap: WrapperUnwrapFunction;
107
+ wrap: WrapperWrapFunction;
108
+ getTextXPath: () => string;
109
+ getAttributeXPath: WrapperAttributeXPathGetter;
110
+ };
111
+
112
+ export type FormatterInterfaceFormatParams = {
113
+ translation: string;
114
+ language: string;
115
+ params: Record<string, any> | undefined;
116
+ };
117
+
118
+ export type FormatterInterface = {
119
+ format: (props: FormatterInterfaceFormatParams) => string;
120
+ };
121
+
122
+ export type FinalFormatterInterface = {
123
+ format: (props: FormatterInterfaceFormatParams) => any;
124
+ };
125
+
126
+ export type ObserverProps = {
127
+ translate: (params: TranslatePropsInternal) => string;
128
+ onClick: TranslationOnClick;
129
+ };
130
+
131
+ export type HighlightInterface = (
132
+ key?: string,
133
+ ns?: FallbackNSTranslation
134
+ ) => {
135
+ unhighlight(): void;
136
+ };
137
+
138
+ export type ObserverRunProps = {
139
+ mouseHighlight: boolean;
73
140
  };
74
141
 
75
- export type TranslationTags<T> = string | T[];
142
+ export type ObserverInterface = (props: ObserverProps) => {
143
+ unwrap: (text: string) => Unwrapped;
144
+ wrap: WrapperWrapFunction;
145
+ retranslate: () => void;
146
+ stop: () => void;
147
+ run: (props: ObserverRunProps) => void;
148
+ highlight: HighlightInterface;
149
+ outputNotFormattable: boolean;
150
+ };
76
151
 
77
- export type NodeWithMeta = Node & {
78
- _tolgee: NodeMeta;
152
+ export type LanguageDetectorProps = {
153
+ availableLanguages: string[];
79
154
  };
80
155
 
81
- export type NodeWithLock = Node & {
82
- _tolgee: NodeLock;
156
+ export type LanguageDetectorInterface = {
157
+ getLanguage: (
158
+ props: LanguageDetectorProps
159
+ ) => string | undefined | Promise<string | undefined>;
160
+ };
161
+
162
+ export type LanguageStorageInterface = {
163
+ getLanguage: () => string | undefined | Promise<string | undefined>;
164
+ setLanguage: (language: string) => void | Promise<void>;
165
+ };
166
+
167
+ export type BackendDevProps = {
168
+ apiUrl?: string;
169
+ apiKey?: string;
170
+ projectId?: number;
171
+ };
172
+
173
+ export type BackendGetRecordProps = {
174
+ language: string;
175
+ namespace?: string;
83
176
  };
84
177
 
85
- export type ElementWithMeta = Element &
86
- ElementCSSInlineStyle & {
87
- _tolgee: ElementMeta;
88
- };
178
+ export type BackendGetRecord = (
179
+ data: BackendGetRecordProps
180
+ ) => Promise<TreeTranslationsData | undefined> | undefined;
181
+
182
+ export interface BackendInterface {
183
+ getRecord: BackendGetRecord;
184
+ }
185
+
186
+ export type BackendGetDevRecord = (
187
+ data: BackendGetRecordProps & BackendDevProps
188
+ ) => Promise<TreeTranslationsData | undefined> | undefined;
189
+
190
+ export type BackendDevInterface = {
191
+ getRecord: BackendGetDevRecord;
192
+ };
193
+
194
+ export type TolgeeEvent =
195
+ | 'pendingLanguage'
196
+ | 'language'
197
+ | 'key'
198
+ | 'loading'
199
+ | 'fetching'
200
+ | 'initialLoad'
201
+ | 'running'
202
+ | 'cache'
203
+ | 'keyUpdate';
204
+
205
+ export type TolgeeOn = {
206
+ (event: 'pendingLanguage', handler: ListenerHandler<string>): Listener;
207
+ (event: 'language', handler: ListenerHandler<string>): Listener;
208
+ (event: 'key', handler: ListenerHandler<string>): Listener;
209
+ (event: 'loading', handler: ListenerHandler<boolean>): Listener;
210
+ (event: 'fetching', handler: ListenerHandler<boolean>): Listener;
211
+ (event: 'initialLoad', handler: ListenerHandler<void>): Listener;
212
+ (event: 'running', handler: ListenerHandler<boolean>): Listener;
213
+ (event: 'keyUpdate', handler: ListenerHandler<void>): Listener;
214
+ (event: TolgeeEvent, handler: ListenerHandler<any>): Listener;
215
+ };
216
+
217
+ export type TolgeeInstance = Readonly<{
218
+ on: TolgeeOn;
219
+ onKeyUpdate: (handler: ListenerHandler<void>) => ListenerSelective;
220
+
221
+ use: (plugin: TolgeePlugin | undefined) => TolgeeInstance;
222
+
223
+ getLanguage: () => string | undefined;
224
+ getPendingLanguage: () => string | undefined;
225
+ changeLanguage: (language: string) => Promise<void>;
226
+ changeTranslation: ChangeTranslationInterface;
227
+ addActiveNs: (ns: FallbackNSTranslation, forget?: boolean) => Promise<void>;
228
+ removeActiveNs: (ns: FallbackNSTranslation) => void;
229
+ loadRecords: (descriptors: CacheDescriptor[]) => Promise<TranslationsFlat[]>;
230
+ loadRecord: (descriptors: CacheDescriptor) => Promise<TranslationsFlat>;
231
+ addStaticData: (data: Options['staticData']) => void;
232
+ getRecord: (descriptor: CacheDescriptor) => TranslationsFlat | undefined;
233
+ getAllRecords: () => CachePublicRecord[];
234
+ isInitialLoading: () => boolean;
235
+ isLoading: (ns?: FallbackNSTranslation) => boolean;
236
+ isLoaded: (ns?: FallbackNSTranslation) => boolean;
237
+ isFetching: (ns?: FallbackNSTranslation) => boolean;
238
+ isRunning: () => boolean;
239
+ highlight: HighlightInterface;
240
+ getInitialOptions: () => Options;
241
+ isDev: () => boolean;
242
+ init: (options: Partial<Options>) => TolgeeInstance;
243
+ run: () => Promise<void>;
244
+ stop: () => void;
245
+ t: TFnType;
246
+ wrap: (params: TranslatePropsInternal) => string | undefined;
247
+ unwrap: (text: string) => Unwrapped;
248
+ }>;
249
+
250
+ export type PluginServicePublic = Readonly<{
251
+ setFinalFormatter: (formatter: FinalFormatterInterface | undefined) => void;
252
+ addFormatter: (formatter: FormatterInterface | undefined) => void;
253
+ setObserver: (observer: ObserverInterface | undefined) => void;
254
+ getObserver: () => ReturnType<ObserverInterface> | undefined;
255
+ setUi: (ui: UiLibInterface | undefined) => void;
256
+ getUi: () => UiConstructor | undefined;
257
+ addBackend: (backend: BackendInterface | undefined) => void;
258
+ setDevBackend: (backend: BackendInterface | undefined) => void;
259
+ setLanguageDetector: (
260
+ languageDetector: LanguageDetectorInterface | undefined
261
+ ) => void;
262
+ setLanguageStorage: (
263
+ languageStorage: LanguageStorageInterface | undefined
264
+ ) => void;
265
+ }>;
266
+
267
+ export type NodeMeta = {
268
+ oldTextContent: string;
269
+ keys: KeyAndParams[];
270
+ keyAttributeOnly?: boolean;
271
+ };
89
272
 
90
273
  export type ElementMeta = {
91
274
  wrappedWithElementOnlyKey?: string;
92
275
  wrappedWithElementOnlyDefaultHtml?: string;
93
- nodes: Set<NodeWithMeta>;
276
+ nodes: Map<Node, NodeMeta>;
94
277
  highlightEl?: HTMLDivElement;
95
278
  highlight?: () => void;
96
279
  unhighlight?: () => void;
@@ -104,43 +287,92 @@ export type ElementMeta = {
104
287
  * Triggering highlight needs the metadata stored on element, so
105
288
  * we need the ability to prevent clean.
106
289
  */
290
+
107
291
  preventClean?: boolean;
108
292
  };
109
293
 
110
- export type NodeMeta = {
111
- oldTextContent: string;
112
- keys: KeyAndParamsTags<any>[];
113
- } & NodeLock;
294
+ export type ChangeTranslationInterface = (
295
+ descriptor: CacheDescriptor,
296
+ key: string,
297
+ value: string
298
+ ) => { revert: () => void };
114
299
 
115
- export type NodeLock = {
116
- locked?: boolean;
300
+ export type UiProps = {
301
+ apiUrl: string;
302
+ apiKey: string;
303
+ highlight: HighlightInterface;
304
+ changeTranslation: ChangeTranslationInterface;
117
305
  };
118
306
 
119
- export type Scope =
120
- | 'translations.edit'
121
- | 'translations.view'
122
- | 'keys.edit'
123
- | 'screenshots.upload'
124
- | 'screenshots.view'
125
- | 'screenshots.delete';
307
+ export interface UiInterface {
308
+ handleElementClick(
309
+ event: MouseEvent,
310
+ keysAndDefaults: UiKeyOption[]
311
+ ): Promise<void>;
312
+ }
126
313
 
127
- export type Mode = 'development' | 'production';
314
+ export type UiConstructor = new (props: UiProps) => UiInterface;
128
315
 
129
- export type Unwrapped = { text: string; keys: KeyAndParamsTags<any>[] };
316
+ export type UiLibInterface = {
317
+ UI: UiConstructor;
318
+ };
130
319
 
131
- export interface Formatter {
132
- format: FormatFunction;
133
- }
320
+ export type UiType = UiConstructor | UiLibInterface;
134
321
 
135
- interface FormatterStatic {
136
- type: 'formatter';
137
- new (): Formatter;
138
- }
322
+ export type UiKeyOption = {
323
+ key: string;
324
+ defaultValue?: string;
325
+ ns: FallbackNSTranslation;
326
+ translation: string | undefined;
327
+ };
139
328
 
140
- export type TolgeeModule = FormatterStatic;
329
+ export type KeyWithDefault = {
330
+ key: string;
331
+ defaultValue?: string;
332
+ ns: FallbackNSTranslation;
333
+ };
141
334
 
142
- export type FormatFunction = (props: {
143
- translation: string;
144
- params: Record<string, any>;
335
+ export type TranslationOnClick = (
336
+ event: MouseEvent,
337
+ data: {
338
+ keysAndDefaults: KeyWithDefault[];
339
+ el: Element;
340
+ meta: ElementMeta;
341
+ }
342
+ ) => void;
343
+
344
+ export type Listener = {
345
+ unsubscribe: () => void;
346
+ };
347
+
348
+ export type KeyDescriptorInternal = {
349
+ key?: string;
350
+ ns?: string[] | undefined;
351
+ };
352
+
353
+ export type KeyDescriptor = {
354
+ key: string;
355
+ ns?: string | string[];
356
+ };
357
+
358
+ export type ListenerSelective = {
359
+ unsubscribe: () => void;
360
+ subscribeNs: (ns: FallbackNSTranslation) => ListenerSelective;
361
+ unsubscribeNs: (ns: FallbackNSTranslation) => ListenerSelective;
362
+ subscribeKey: (descriptor: KeyDescriptor) => ListenerSelective;
363
+ unsubscribeKey: (descriptor: KeyDescriptor) => ListenerSelective;
364
+ };
365
+
366
+ export type ListenerHandlerEvent<T> = { value: T };
367
+ export type ListenerHandler<T> = (e: ListenerHandlerEvent<T>) => void;
368
+
369
+ export type TolgeePlugin = (
370
+ tolgee: TolgeeInstance,
371
+ tools: PluginServicePublic
372
+ ) => TolgeeInstance;
373
+
374
+ export type CachePublicRecord = {
375
+ data: TranslationsFlat;
145
376
  language: string;
146
- }) => string | any[];
377
+ namespace: string;
378
+ };