@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
@@ -1,177 +0,0 @@
1
- jest.dontMock('./TranslationHighlighter');
2
- jest.dontMock('../services/DependencyService');
3
-
4
- import { TranslationHighlighter } from './TranslationHighlighter';
5
- import classMock from '@testFixtures/classMock';
6
- import { getMockedInstance } from '@testFixtures/mocked';
7
- import { Properties } from '../Properties';
8
- import { createElement } from '@testFixtures/createElement';
9
- import { DependencyService } from '../services/DependencyService';
10
-
11
- describe('TranslationHighlighter', () => {
12
- let translationHighlighter: TranslationHighlighter;
13
-
14
- beforeEach(async () => {
15
- const dependencyService = new DependencyService();
16
- dependencyService.init({});
17
- translationHighlighter = dependencyService.translationHighlighter;
18
- });
19
-
20
- afterEach(async () => {
21
- jest.clearAllMocks();
22
- window['@tolgee/ui'] = undefined;
23
- });
24
-
25
- describe('passing UI', () => {
26
- const checkIt = async () => {
27
- const mockedElement = createElement(20, 20, true);
28
- translationHighlighter.listen(mockedElement);
29
- await translationHighlighter.translationEdit(openEvent, mockedElement);
30
- expect(rendererViewerMock).toBeCalledTimes(1);
31
- };
32
-
33
- test('Works when UI is provided using regular provider', async () => {
34
- getMockedInstance(Properties).config.ui = getUiClassMock();
35
- await checkIt();
36
- });
37
-
38
- test('Works when UI is provided using promise provider', async () => {
39
- // @ts-ignore
40
- getMockedInstance(Properties).config.ui = new Promise((resolve) =>
41
- resolve(getUiClassMock())
42
- );
43
- await checkIt();
44
- });
45
-
46
- test('works when UI is provided using window provider', async () => {
47
- getMockedInstance(Properties).config.ui = undefined;
48
- window['@tolgee/ui'] = {
49
- UI: getUiClassMock(),
50
- };
51
-
52
- await checkIt();
53
- });
54
-
55
- test('works when UI is provided using window constructor', async () => {
56
- getMockedInstance(Properties).config.ui = undefined;
57
- window['@tolgee/ui'] = getUiClassMock();
58
- await checkIt();
59
- });
60
- });
61
-
62
- describe('key rendering', () => {
63
- test('will open renderer key context menu when multiple nodes', async () => {
64
- await testNodeCounts(2, 1);
65
- });
66
-
67
- test('will open renderer key context menu when multiple keys', async () => {
68
- await testNodeCounts(1, 10);
69
- });
70
-
71
- test('will open translation dialog when single key', async () => {
72
- const mockedElement = createElement(1, 1, true);
73
- translationHighlighter.listen(mockedElement);
74
- await translationHighlighter.translationEdit(openEvent, mockedElement);
75
-
76
- expect(rendererViewerMock).toBeCalledTimes(1);
77
- expect(rendererViewerMock).toBeCalledWith('key', 'default value');
78
- });
79
-
80
- test('will open translation dialog when single key multiplied', async () => {
81
- const mockedElement = createElement(20, 20, true);
82
- translationHighlighter.listen(mockedElement);
83
- await translationHighlighter.translationEdit(openEvent, mockedElement);
84
-
85
- expect(rendererViewerMock).toBeCalledTimes(1);
86
- expect(rendererViewerMock).toBeCalledWith('key', 'default value');
87
- });
88
- });
89
-
90
- describe('warnings & errors', () => {
91
- test('will print error on no key', async () => {
92
- // eslint-disable-next-line no-console
93
- console.error = jest.fn();
94
- rendererGetKeyMock = jest.fn(async (): Promise<string> => {
95
- return;
96
- });
97
-
98
- rendererViewerMock = jest.fn();
99
-
100
- getMockedInstance(Properties).config.ui = classMock<any>(
101
- () => ({
102
- getKey: rendererGetKeyMock,
103
- }),
104
- function () {
105
- return {};
106
- } as any
107
- );
108
-
109
- const mockedElement = createElement(0, 0);
110
- translationHighlighter.listen(mockedElement);
111
-
112
- await translationHighlighter.translationEdit(openEvent, mockedElement);
113
-
114
- // eslint-disable-next-line no-console
115
- expect(console.error).toBeCalledTimes(1);
116
- });
117
-
118
- test('will print warning when UI not provided', async () => {
119
- // eslint-disable-next-line no-console
120
- console.warn = jest.fn();
121
-
122
- getMockedInstance(Properties).config.ui = null;
123
-
124
- const mockedElement = createElement(1, 1);
125
- translationHighlighter.listen(mockedElement);
126
-
127
- await translationHighlighter.translationEdit(openEvent, mockedElement);
128
-
129
- // eslint-disable-next-line no-console
130
- expect(console.warn).toBeCalledTimes(1);
131
- });
132
- });
133
-
134
- let rendererGetKeyMock: (...args) => Promise<string>;
135
- let rendererViewerMock: (...args) => void;
136
-
137
- beforeEach(() => {
138
- rendererGetKeyMock = jest.fn(async (): Promise<string> => {
139
- return 'test';
140
- });
141
-
142
- rendererViewerMock = jest.fn();
143
- getMockedInstance(Properties).config.ui = getUiClassMock();
144
- });
145
-
146
- const openEvent = new MouseEvent('click');
147
-
148
- const testNodeCounts = async (nodeCount, keyCount) => {
149
- const mockedElement = createElement(nodeCount, keyCount);
150
- translationHighlighter.listen(mockedElement);
151
- await translationHighlighter.translationEdit(openEvent, mockedElement);
152
- expect(rendererGetKeyMock).toBeCalledTimes(1);
153
-
154
- const keySet = new Set();
155
- for (let i = 0; i < nodeCount * keyCount; i++) {
156
- keySet.add(`key ${i}`);
157
- }
158
-
159
- expect(rendererGetKeyMock).toBeCalledTimes(1);
160
- expect(rendererGetKeyMock).toBeCalledWith({ keys: keySet, openEvent });
161
- expect(rendererGetKeyMock).not.toBeCalledWith({
162
- keys: new Set(['key 0']),
163
- openEvent,
164
- });
165
- };
166
-
167
- const getUiClassMock = () =>
168
- classMock<any>(
169
- () => ({
170
- getKey: rendererGetKeyMock,
171
- renderViewer: rendererViewerMock,
172
- }),
173
- function () {
174
- return {};
175
- } as any
176
- );
177
- });
@@ -1,113 +0,0 @@
1
- import { ElementWithMeta } from '../types';
2
- import { PluginManager } from '../toolsManager/PluginManager';
3
- import { DependencyService } from '../services/DependencyService';
4
-
5
- type KeyWithDefault = { key: string; defaultValue?: string };
6
-
7
- export class TranslationHighlighter {
8
- public pluginManager: PluginManager;
9
- private _renderer: any;
10
-
11
- constructor(private dependencies: DependencyService) {}
12
-
13
- private static getKeyOptions(node: ElementWithMeta): KeyWithDefault[] {
14
- const nodes = Array.from(node._tolgee.nodes);
15
- return nodes.reduce(
16
- (acc, curr) => [
17
- ...acc,
18
- ...curr._tolgee.keys.map((k) => ({
19
- key: k.key,
20
- defaultValue: k.defaultValue,
21
- })),
22
- ],
23
- []
24
- );
25
- }
26
-
27
- listen(element: ElementWithMeta & ElementCSSInlineStyle) {
28
- this.dependencies.highlightFunctionInitializer.initFunctions(element);
29
- }
30
-
31
- private async getRenderer() {
32
- if (this._renderer === undefined) {
33
- const possibleProviders = [
34
- this.dependencies.properties.config.ui,
35
- window['@tolgee/ui'],
36
- ];
37
- for (const possiblePromise of possibleProviders) {
38
- // if dynamic import is used
39
- const possibleObject =
40
- possiblePromise instanceof Promise
41
- ? await possiblePromise
42
- : possiblePromise;
43
-
44
- // extract .UI property
45
- const possibleProvider =
46
- typeof possibleObject === 'object'
47
- ? possibleObject?.UI
48
- : possibleObject;
49
-
50
- if (typeof possibleProvider === 'function') {
51
- this._renderer = new possibleProvider(this.dependencies);
52
- break;
53
- }
54
- }
55
- if (this._renderer === undefined) {
56
- // eslint-disable-next-line no-console
57
- console.warn(
58
- 'Tolgee UI is not provided. To translate interactively provide tolgee ui constructor to "ui" configuration property. ' +
59
- 'To disable highlighting use production mode.'
60
- );
61
- }
62
- }
63
- return this._renderer;
64
- }
65
-
66
- private async getKeyAndDefault(
67
- mouseEvent: MouseEvent,
68
- element: ElementWithMeta
69
- ): Promise<KeyWithDefault> {
70
- if (element._tolgee.wrappedWithElementOnlyKey) {
71
- return {
72
- key: element._tolgee.wrappedWithElementOnlyKey,
73
- defaultValue: element._tolgee.wrappedWithElementOnlyDefaultHtml,
74
- };
75
- }
76
- const keysWithDefaults = TranslationHighlighter.getKeyOptions(element);
77
-
78
- // create Set to remove duplicated key values
79
- const keySet = new Set(
80
- keysWithDefaults.map((keyWithDefault) => keyWithDefault.key)
81
- );
82
- if (keySet.size > 1) {
83
- const renderer = await this.getRenderer();
84
- // this opens the popover where user chooses the key
85
- const selectedKey = await renderer.getKey({
86
- keys: keySet,
87
- openEvent: mouseEvent,
88
- });
89
- // get the key with default
90
- const found = keysWithDefaults.find((kwd) => kwd.key === selectedKey);
91
- if (found) {
92
- return found;
93
- }
94
- }
95
- if (keySet.size === 1) {
96
- return keysWithDefaults[0];
97
- }
98
- // eslint-disable-next-line no-console
99
- console.error('No key to translate. This seems like a bug in tolgee.');
100
- }
101
-
102
- public translationEdit = async (e: MouseEvent, element: ElementWithMeta) => {
103
- const renderer = await this.getRenderer();
104
- if (typeof renderer === 'object') {
105
- const key = await this.getKeyAndDefault(e, element);
106
- if (key) {
107
- renderer.renderViewer(key.key, key.defaultValue);
108
- return;
109
- }
110
- return;
111
- }
112
- };
113
- }
package/src/internal.ts DELETED
@@ -1,2 +0,0 @@
1
- export { NodeHelper } from './helpers/NodeHelper';
2
- export { TextHelper } from './helpers/TextHelper';
@@ -1,21 +0,0 @@
1
- jest.autoMockOff();
2
- import { IcuFormatter } from './IcuFormatter';
3
-
4
- describe('icu formatter', () => {
5
- it('formats simple string', () => {
6
- const formatter = new IcuFormatter();
7
- const result = formatter.format({
8
- translation: 'result is {number, number}',
9
- params: { number: 42000 },
10
- language: 'en',
11
- });
12
- expect(result).toEqual('result is 42,000');
13
- });
14
-
15
- it('fixes invalid locale', () => {
16
- const formatter = new IcuFormatter() as any;
17
- expect(formatter.getLocale('en_GB')).toEqual('en-GB');
18
- expect(formatter.getLocale('en_GB-nonsenceeeee')).toEqual('en-GB');
19
- expect(formatter.getLocale('cs CZ')).toEqual('cs-CZ');
20
- });
21
- });
@@ -1,39 +0,0 @@
1
- import IntlMessageFormat from 'intl-messageformat';
2
- import { TolgeeModule } from '../types';
3
- export const IcuFormatter: TolgeeModule = class {
4
- static type = 'formatter' as const;
5
-
6
- private locales = new Map() as Map<string, string>;
7
-
8
- isLocaleValid(locale: string) {
9
- try {
10
- return Boolean(Intl.NumberFormat.supportedLocalesOf(locale).length);
11
- } catch {
12
- return false;
13
- }
14
- }
15
-
16
- getLocale(language: string) {
17
- if (!this.locales.get(language)) {
18
- let localeCandidate: string = String(language).replace(/[^a-zA-Z]/g, '-');
19
- while (!this.isLocaleValid(localeCandidate)) {
20
- localeCandidate =
21
- localeCandidate.split('-').slice(0, -1).join('-') || 'en';
22
- }
23
- this.locales.set(language, localeCandidate);
24
- }
25
- return this.locales.get(language);
26
- }
27
-
28
- format({ translation, language, params }) {
29
- const ignoreTag = !Object.values(params).find(
30
- (p) => typeof p === 'function'
31
- );
32
-
33
- const locale = this.getLocale(language);
34
-
35
- return new IntlMessageFormat(translation, locale, undefined, {
36
- ignoreTag,
37
- }).format(params) as string;
38
- }
39
- };
@@ -1 +0,0 @@
1
- export { IcuFormatter } from './IcuFormatter';
@@ -1,85 +0,0 @@
1
- import { Properties } from '../Properties';
2
- import { ApiHttpError } from '../Errors/ApiHttpError';
3
- import { ArgumentTypes } from '../helpers/commonTypes';
4
-
5
- type FetchArgumentTypes = ArgumentTypes<typeof fetch>;
6
-
7
- type Tail<T extends any[]> = ((...args: T) => any) extends (
8
- _: infer First,
9
- ...rest: infer Rest
10
- ) => any
11
- ? T extends any[]
12
- ? Rest
13
- : ReadonlyArray<Rest[number]>
14
- : [];
15
-
16
- export class ApiHttpService {
17
- constructor(private properties: Properties) {}
18
-
19
- private static async handleErrors(response: Response) {
20
- if (response.status >= 400) {
21
- const error = new ApiHttpError(response);
22
- try {
23
- const data = await response.json();
24
- error.code = data.code;
25
- } catch (e) {
26
- // eslint-disable-next-line no-console
27
- console.warn('Tolgee server responded with invalid status code.');
28
- }
29
- throw error;
30
- }
31
- return response;
32
- }
33
-
34
- async fetch(...args: ArgumentTypes<typeof fetch>) {
35
- if (typeof args[0] === 'object') {
36
- return fetch({ ...args[0], url: this.getUrl((args[0] as any).url) }).then(
37
- (r) => ApiHttpService.handleErrors(r)
38
- );
39
- }
40
- const [url, ...rest] = args;
41
- return fetch(this.getUrl(url), ...rest).then((r) =>
42
- ApiHttpService.handleErrors(r)
43
- );
44
- }
45
-
46
- async fetchJson(...args: ArgumentTypes<typeof fetch>) {
47
- return this.fetch(...args).then((res) => {
48
- return res.json();
49
- });
50
- }
51
-
52
- async post(
53
- url,
54
- body,
55
- init: FetchArgumentTypes[1] = {},
56
- ...rest: Tail<Tail<FetchArgumentTypes>>
57
- ) {
58
- return this.fetch(
59
- url,
60
- {
61
- body: JSON.stringify(body),
62
- method: 'POST',
63
- headers: {
64
- 'Content-Type': 'application/json',
65
- },
66
- ...init,
67
- },
68
- ...rest
69
- );
70
- }
71
-
72
- async postJson(
73
- url,
74
- body,
75
- init: FetchArgumentTypes[1] = {},
76
- ...rest: Tail<Tail<FetchArgumentTypes>>
77
- ) {
78
- return this.post(url, body, init, ...rest).then((res) => res.json());
79
- }
80
-
81
- private getUrl(path: string) {
82
- const querySeparator = path.indexOf('?') < 0 ? '?' : '&';
83
- return `${this.properties.config.apiUrl}/${path}${querySeparator}ak=${this.properties.config.apiKey}`;
84
- }
85
- }
@@ -1,141 +0,0 @@
1
- jest.dontMock('./CoreService');
2
- jest.dontMock('./DependencyService');
3
-
4
- import '@testing-library/jest-dom/extend-expect';
5
- import { CoreService } from './CoreService';
6
- import { getMockedInstance } from '@testFixtures/mocked';
7
- import { ApiHttpService } from './ApiHttpService';
8
- import { mocked } from 'jest-mock';
9
- import { Properties } from '../Properties';
10
- import { Scope } from '../types';
11
- import { DependencyService } from './DependencyService';
12
-
13
- describe('CoreService', () => {
14
- let coreService: CoreService;
15
- let mockedFetchJson;
16
-
17
- beforeEach(() => {
18
- coreService = new DependencyService().coreService;
19
- getMockedInstance(Properties).preferredLanguages = new Set<string>();
20
- getMockedInstance(Properties).config = {
21
- inputPrefix: '{{',
22
- inputSuffix: '}}',
23
- restrictedElements: [],
24
- tagAttributes: {
25
- '*': ['aria-label'],
26
- },
27
- };
28
- mockedFetchJson = mocked(getMockedInstance(ApiHttpService).fetchJson);
29
- });
30
-
31
- afterEach(() => {
32
- jest.clearAllMocks();
33
- });
34
-
35
- test('can be created', () => {
36
- expect(coreService).not.toBeNull();
37
- });
38
-
39
- describe('getLanguages', () => {
40
- const dummyLanguages = ['dummyLang1', 'dummyLang2'];
41
-
42
- beforeEach(() => {
43
- mockedFetchJson.mockImplementation(async () => {
44
- return {
45
- _embedded: {
46
- languages: dummyLanguages.map((l) => ({
47
- tag: l,
48
- })),
49
- },
50
- };
51
- });
52
- });
53
-
54
- test('will return languages returned from api http service', async () => {
55
- expect(await coreService.getLanguages()).toEqual(new Set(dummyLanguages));
56
- expect(mockedFetchJson).toBeCalledTimes(1);
57
- });
58
-
59
- test('sets preferred languages of properties', async () => {
60
- getMockedInstance(Properties).preferredLanguages = new Set([
61
- dummyLanguages[0],
62
- ]);
63
- await coreService.getLanguages();
64
- expect(getMockedInstance(Properties).preferredLanguages).toEqual(
65
- new Set([dummyLanguages[0]])
66
- );
67
- });
68
- });
69
-
70
- describe('getScopes', () => {
71
- // eslint-disable-next-line no-console
72
- console.error = jest.fn();
73
-
74
- test('will switch to production mode on error', async () => {
75
- mocked(mockedFetchJson).mockImplementation(async () => {
76
- throw new Error();
77
- });
78
- await coreService.getApiKeyDetails();
79
- expect(getMockedInstance(Properties).mode).toEqual('production');
80
- // eslint-disable-next-line no-console
81
- expect(console.error).toBeCalledTimes(2);
82
- });
83
-
84
- test('will return value from http service', async () => {
85
- const mockedReturn = {
86
- scopes: ['translations.view', 'translations.edit'],
87
- };
88
- mocked(mockedFetchJson).mockImplementation(async () => mockedReturn);
89
- expect(await coreService.getApiKeyDetails()).toEqual(mockedReturn);
90
- });
91
- });
92
-
93
- describe('loadApiKeyDetails', () => {
94
- beforeEach(() => {
95
- const mockedReturn = {
96
- scopes: ['translations.edit'],
97
- projectId: 0,
98
- };
99
- mocked(mockedFetchJson).mockImplementation(async () => mockedReturn);
100
- });
101
-
102
- test('will set properties.scopes on run in development mode', async () => {
103
- const propertiesMock = getMockedInstance(Properties);
104
- propertiesMock.mode = 'development';
105
- await coreService.loadApiKeyDetails();
106
- expect(propertiesMock.scopes).toContain('translations.edit' as Scope);
107
- expect(propertiesMock.scopes).not.toContain('translations.view' as Scope);
108
- });
109
-
110
- test('will set properties.projectId on run in development mode', async () => {
111
- const propertiesMock = getMockedInstance(Properties);
112
- propertiesMock.mode = 'development';
113
- await coreService.loadApiKeyDetails();
114
- expect(propertiesMock.projectId).toEqual(0);
115
- });
116
- });
117
-
118
- describe('Authorization', () => {
119
- test('will return proper value on isAuthorizedTo', () => {
120
- getMockedInstance(Properties).scopes = [
121
- 'translations.edit',
122
- 'translations.view',
123
- ] as Scope[];
124
- expect(coreService.isAuthorizedTo('keys.edit')).toBeFalsy();
125
- expect(coreService.isAuthorizedTo('translations.view')).toBeTruthy();
126
- });
127
-
128
- test('will return proper on checkScopes', () => {
129
- getMockedInstance(Properties).scopes = [
130
- 'translations.edit',
131
- 'translations.view',
132
- ] as Scope[];
133
- expect(jest.fn(() => coreService.checkScope('keys.edit'))).toThrowError();
134
- const checkMock = jest.fn(() =>
135
- coreService.checkScope('translations.view')
136
- );
137
- checkMock();
138
- expect(checkMock).toReturn();
139
- });
140
- });
141
- });
@@ -1,76 +0,0 @@
1
- import { Properties } from '../Properties';
2
- import { ApiHttpService } from './ApiHttpService';
3
- import { Scope } from '../types';
4
- import { LanguageModel, PagedModelLanguageModel } from '../types/DTOs';
5
- import { components } from '../types/apiSchema.generated';
6
-
7
- export type ApiKeyWithLanguagesModel =
8
- components['schemas']['ApiKeyWithLanguagesModel'];
9
-
10
- export class CoreService {
11
- private languagePromise: Promise<PagedModelLanguageModel>;
12
-
13
- constructor(
14
- private properties: Properties,
15
- private apiHttpService: ApiHttpService
16
- ) {}
17
-
18
- async getLanguages(): Promise<Set<string>> {
19
- if (!(this.languagePromise instanceof Promise)) {
20
- this.languagePromise = this.apiHttpService.fetchJson(
21
- `v2/projects/languages?size=1000&sort=tag`
22
- );
23
- }
24
-
25
- const languages = new Set(
26
- (await this.languagePromise)._embedded.languages.map((l) => l.tag)
27
- );
28
- this.properties.preferredLanguages = new Set<string>(
29
- Array.from(this.properties.preferredLanguages).filter((l) =>
30
- languages.has(l)
31
- )
32
- );
33
- return languages;
34
- }
35
-
36
- async getLanguagesFull(): Promise<LanguageModel[]> {
37
- this.getLanguages();
38
- const languages = await this.languagePromise;
39
- return languages._embedded.languages;
40
- }
41
-
42
- async getApiKeyDetails(): Promise<ApiKeyWithLanguagesModel> {
43
- try {
44
- return await this.apiHttpService.fetchJson(`v2/api-keys/current`);
45
- } catch (e) {
46
- // eslint-disable-next-line no-console
47
- console.error(e);
48
- // eslint-disable-next-line no-console
49
- console.error(
50
- 'Error getting scopes. Trying to switch to production mode!'
51
- );
52
- this.properties.mode = 'production';
53
- }
54
- }
55
-
56
- isAuthorizedTo(scope: Scope) {
57
- return this.properties.scopes.indexOf(scope) > -1;
58
- }
59
-
60
- checkScope(scope: Scope) {
61
- if (!this.isAuthorizedTo(scope)) {
62
- throw new Error(
63
- "Api key not permitted to do this, please add 'translations.view' scope."
64
- );
65
- }
66
- }
67
-
68
- async loadApiKeyDetails() {
69
- if (this.properties.scopes === undefined) {
70
- const details = await this.getApiKeyDetails();
71
- this.properties.scopes = details.scopes as Scope[];
72
- this.properties.projectId = details.projectId;
73
- this.properties.permittedLanguageIds = details.permittedLanguageIds;
74
- }
75
- }
76
- }