@tolgee/core 4.9.2 → 4.9.3-rc.730f576.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/dist/tolgee.cjs.js +1127 -7028
  2. package/dist/tolgee.cjs.js.map +1 -1
  3. package/dist/tolgee.cjs.min.js +1 -1
  4. package/dist/tolgee.cjs.min.js.map +1 -1
  5. package/dist/tolgee.esm.min.mjs +1 -1
  6. package/dist/tolgee.esm.min.mjs.map +1 -1
  7. package/dist/tolgee.esm.mjs +1125 -7023
  8. package/dist/tolgee.esm.mjs.map +1 -1
  9. package/dist/tolgee.umd.js +1127 -7028
  10. package/dist/tolgee.umd.js.map +1 -1
  11. package/dist/tolgee.umd.min.js +1 -1
  12. package/dist/tolgee.umd.min.js.map +1 -1
  13. package/lib/Controller/Cache/Cache.d.ts +22 -0
  14. package/lib/Controller/Cache/helpers.d.ts +4 -0
  15. package/lib/Controller/Controller.d.ts +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/Tolgee.d.ts +2 -68
  26. package/lib/TranslateParams.d.ts +2 -0
  27. package/lib/{Constants/Global.d.ts → constants.d.ts} +1 -2
  28. package/lib/helpers.d.ts +3 -0
  29. package/lib/index.d.ts +3 -8
  30. package/lib/types.d.ts +244 -84
  31. package/package.json +20 -29
  32. package/src/Controller/Cache/Cache.ts +293 -0
  33. package/src/Controller/Cache/helpers.ts +37 -0
  34. package/src/Controller/Controller.ts +310 -0
  35. package/src/Controller/Events/EventEmitter.ts +30 -0
  36. package/src/Controller/Events/EventEmitterSelective.test.ts +125 -0
  37. package/src/Controller/Events/EventEmitterSelective.ts +188 -0
  38. package/src/Controller/Events/Events.ts +66 -0
  39. package/src/Controller/Plugins/Plugins.ts +315 -0
  40. package/src/Controller/State/State.ts +175 -0
  41. package/src/Controller/State/helpers.ts +41 -0
  42. package/src/Controller/State/initObserverOptions.ts +38 -0
  43. package/src/Controller/State/initState.ts +81 -0
  44. package/src/Controller/ValueObserver.ts +26 -0
  45. package/src/Tolgee.ts +79 -330
  46. package/src/TranslateParams.test.ts +41 -0
  47. package/src/TranslateParams.ts +51 -0
  48. package/src/__test/backend.test.ts +48 -0
  49. package/src/__test/cache.test.ts +148 -0
  50. package/src/__test/client.test.ts +48 -0
  51. package/src/__test/events.test.ts +33 -0
  52. package/src/__test/initialization.test.ts +85 -0
  53. package/src/__test/jest-setup.ts +2 -0
  54. package/src/__test/languageDetection.test.ts +129 -0
  55. package/src/__test/languageStorage.test.ts +145 -0
  56. package/src/__test/languages.test.ts +112 -0
  57. package/src/__test/loading.test.ts +39 -0
  58. package/src/__test/namespaces.test.ts +99 -0
  59. package/src/__test/namespacesFallback.test.ts +74 -0
  60. package/src/__test/plugins.test.ts +136 -0
  61. package/src/__test/testTools.ts +7 -0
  62. package/src/{Constants/Global.ts → constants.ts} +1 -3
  63. package/src/helpers.ts +17 -0
  64. package/src/index.ts +9 -8
  65. package/src/types.ts +338 -90
  66. package/README.md +0 -45
  67. package/dist/Constants/Global.d.ts +0 -6
  68. package/dist/Constants/ModifierKey.d.ts +0 -6
  69. package/dist/Errors/ApiHttpError.d.ts +0 -5
  70. package/dist/Observer.d.ts +0 -14
  71. package/dist/Observer.test.d.ts +0 -2
  72. package/dist/Properties.d.ts +0 -17
  73. package/dist/Properties.test.d.ts +0 -1
  74. package/dist/Tolgee.d.ts +0 -68
  75. package/dist/Tolgee.test.d.ts +0 -1
  76. package/dist/TolgeeConfig.d.ts +0 -69
  77. package/dist/TolgeeConfig.test.d.ts +0 -1
  78. package/dist/__integration/FormatterIcu.test.d.ts +0 -1
  79. package/dist/__integration/FormatterMissing.d.ts +0 -1
  80. package/dist/__integration/Tolgee.test.d.ts +0 -1
  81. package/dist/__integration/TolgeeInvisible.test.d.ts +0 -1
  82. package/dist/__integration/mockTranslations.d.ts +0 -7
  83. package/dist/__integration/testConfig.d.ts +0 -9
  84. package/dist/__testFixtures/classMock.d.ts +0 -3
  85. package/dist/__testFixtures/createElement.d.ts +0 -2
  86. package/dist/__testFixtures/createTestDom.d.ts +0 -9
  87. package/dist/__testFixtures/mocked.d.ts +0 -20
  88. package/dist/__testFixtures/setupAfterEnv.d.ts +0 -8
  89. package/dist/helpers/NodeHelper.d.ts +0 -14
  90. package/dist/helpers/TextHelper.d.ts +0 -5
  91. package/dist/helpers/TextHelper.test.d.ts +0 -1
  92. package/dist/helpers/commonTypes.d.ts +0 -2
  93. package/dist/helpers/encoderPolyfill.d.ts +0 -8
  94. package/dist/helpers/secret.d.ts +0 -6
  95. package/dist/helpers/secret.test.d.ts +0 -1
  96. package/dist/helpers/sleep.d.ts +0 -1
  97. package/dist/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  98. package/dist/highlighter/HighlightFunctionsInitializer.test.d.ts +0 -1
  99. package/dist/highlighter/MouseEventHandler.d.ts +0 -29
  100. package/dist/highlighter/MouseEventHandler.test.d.ts +0 -1
  101. package/dist/highlighter/TranslationHighlighter.d.ts +0 -14
  102. package/dist/highlighter/TranslationHighlighter.test.d.ts +0 -1
  103. package/dist/index.d.ts +0 -10
  104. package/dist/internal.d.ts +0 -2
  105. package/dist/modules/IcuFormatter.d.ts +0 -2
  106. package/dist/modules/IcuFormatter.test.d.ts +0 -1
  107. package/dist/modules/index.d.ts +0 -1
  108. package/dist/services/ApiHttpService.d.ts +0 -15
  109. package/dist/services/CoreService.d.ts +0 -18
  110. package/dist/services/CoreService.test.d.ts +0 -1
  111. package/dist/services/DependencyService.d.ts +0 -39
  112. package/dist/services/DependencyService.test.d.ts +0 -1
  113. package/dist/services/ElementRegistrar.d.ts +0 -19
  114. package/dist/services/ElementRegistrar.test.d.ts +0 -1
  115. package/dist/services/EventEmitter.d.ts +0 -13
  116. package/dist/services/EventService.d.ts +0 -9
  117. package/dist/services/ModuleService.d.ts +0 -5
  118. package/dist/services/ScreenshotService.d.ts +0 -15
  119. package/dist/services/Subscription.d.ts +0 -5
  120. package/dist/services/TextService.d.ts +0 -14
  121. package/dist/services/TextService.test.d.ts +0 -1
  122. package/dist/services/TranslationService.d.ts +0 -75
  123. package/dist/services/TranslationService.test.d.ts +0 -1
  124. package/dist/services/__mocks__/CoreService.d.ts +0 -2
  125. package/dist/toolsManager/Messages.d.ts +0 -8
  126. package/dist/toolsManager/Messages.test.d.ts +0 -1
  127. package/dist/toolsManager/PluginManager.d.ts +0 -21
  128. package/dist/toolsManager/PluginManager.test.d.ts +0 -1
  129. package/dist/types/DTOs.d.ts +0 -20
  130. package/dist/types/apiSchema.generated.d.ts +0 -6185
  131. package/dist/types.d.ts +0 -123
  132. package/dist/wrappers/AbstractWrapper.d.ts +0 -8
  133. package/dist/wrappers/NodeHandler.d.ts +0 -18
  134. package/dist/wrappers/WrappedHandler.d.ts +0 -8
  135. package/dist/wrappers/invisible/AttributeHandler.d.ts +0 -8
  136. package/dist/wrappers/invisible/Coder.d.ts +0 -7
  137. package/dist/wrappers/invisible/ContentHandler.d.ts +0 -6
  138. package/dist/wrappers/invisible/CoreHandler.d.ts +0 -10
  139. package/dist/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  140. package/dist/wrappers/invisible/ValueMemory.d.ts +0 -5
  141. package/dist/wrappers/invisible/ValueMemory.test.d.ts +0 -1
  142. package/dist/wrappers/text/AttributeHandler.d.ts +0 -8
  143. package/dist/wrappers/text/AttributeHandler.test.d.ts +0 -1
  144. package/dist/wrappers/text/Coder.d.ts +0 -15
  145. package/dist/wrappers/text/Coder.test.d.ts +0 -1
  146. package/dist/wrappers/text/ContentHandler.d.ts +0 -8
  147. package/dist/wrappers/text/ContentHandler.test.d.ts +0 -1
  148. package/dist/wrappers/text/CoreHandler.d.ts +0 -17
  149. package/dist/wrappers/text/CoreHandler.test.d.ts +0 -1
  150. package/dist/wrappers/text/TextWrapper.d.ts +0 -20
  151. package/index.js +0 -7
  152. package/lib/Constants/ModifierKey.d.ts +0 -6
  153. package/lib/Errors/ApiHttpError.d.ts +0 -5
  154. package/lib/Observer.d.ts +0 -14
  155. package/lib/Properties.d.ts +0 -17
  156. package/lib/TolgeeConfig.d.ts +0 -69
  157. package/lib/helpers/NodeHelper.d.ts +0 -14
  158. package/lib/helpers/TextHelper.d.ts +0 -5
  159. package/lib/helpers/commonTypes.d.ts +0 -2
  160. package/lib/helpers/encoderPolyfill.d.ts +0 -8
  161. package/lib/helpers/secret.d.ts +0 -6
  162. package/lib/helpers/sleep.d.ts +0 -1
  163. package/lib/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  164. package/lib/highlighter/MouseEventHandler.d.ts +0 -29
  165. package/lib/highlighter/TranslationHighlighter.d.ts +0 -14
  166. package/lib/modules/IcuFormatter.d.ts +0 -2
  167. package/lib/modules/index.d.ts +0 -1
  168. package/lib/services/ApiHttpService.d.ts +0 -15
  169. package/lib/services/CoreService.d.ts +0 -18
  170. package/lib/services/DependencyService.d.ts +0 -39
  171. package/lib/services/ElementRegistrar.d.ts +0 -19
  172. package/lib/services/EventEmitter.d.ts +0 -13
  173. package/lib/services/EventService.d.ts +0 -9
  174. package/lib/services/ModuleService.d.ts +0 -5
  175. package/lib/services/ScreenshotService.d.ts +0 -15
  176. package/lib/services/Subscription.d.ts +0 -5
  177. package/lib/services/TextService.d.ts +0 -14
  178. package/lib/services/TranslationService.d.ts +0 -75
  179. package/lib/toolsManager/Messages.d.ts +0 -8
  180. package/lib/toolsManager/PluginManager.d.ts +0 -21
  181. package/lib/types/DTOs.d.ts +0 -20
  182. package/lib/types/apiSchema.generated.d.ts +0 -6185
  183. package/lib/wrappers/AbstractWrapper.d.ts +0 -8
  184. package/lib/wrappers/NodeHandler.d.ts +0 -18
  185. package/lib/wrappers/WrappedHandler.d.ts +0 -8
  186. package/lib/wrappers/invisible/AttributeHandler.d.ts +0 -8
  187. package/lib/wrappers/invisible/Coder.d.ts +0 -7
  188. package/lib/wrappers/invisible/ContentHandler.d.ts +0 -6
  189. package/lib/wrappers/invisible/CoreHandler.d.ts +0 -10
  190. package/lib/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  191. package/lib/wrappers/invisible/ValueMemory.d.ts +0 -5
  192. package/lib/wrappers/text/AttributeHandler.d.ts +0 -8
  193. package/lib/wrappers/text/Coder.d.ts +0 -15
  194. package/lib/wrappers/text/ContentHandler.d.ts +0 -8
  195. package/lib/wrappers/text/CoreHandler.d.ts +0 -17
  196. package/lib/wrappers/text/TextWrapper.d.ts +0 -20
  197. package/src/Constants/ModifierKey.ts +0 -6
  198. package/src/Errors/ApiHttpError.ts +0 -8
  199. package/src/Observer.test.ts +0 -119
  200. package/src/Observer.ts +0 -68
  201. package/src/Properties.test.ts +0 -150
  202. package/src/Properties.ts +0 -112
  203. package/src/Tolgee.test.ts +0 -473
  204. package/src/TolgeeConfig.test.ts +0 -21
  205. package/src/TolgeeConfig.ts +0 -134
  206. package/src/__integration/FormatterIcu.test.ts +0 -80
  207. package/src/__integration/FormatterMissing.ts +0 -54
  208. package/src/__integration/Tolgee.test.ts +0 -90
  209. package/src/__integration/TolgeeInvisible.test.ts +0 -145
  210. package/src/__integration/mockTranslations.ts +0 -6
  211. package/src/__integration/testConfig.ts +0 -16
  212. package/src/__testFixtures/classMock.ts +0 -11
  213. package/src/__testFixtures/createElement.ts +0 -43
  214. package/src/__testFixtures/createTestDom.ts +0 -26
  215. package/src/__testFixtures/mocked.ts +0 -25
  216. package/src/__testFixtures/setupAfterEnv.ts +0 -34
  217. package/src/helpers/NodeHelper.ts +0 -90
  218. package/src/helpers/TextHelper.test.ts +0 -62
  219. package/src/helpers/TextHelper.ts +0 -58
  220. package/src/helpers/commonTypes.ts +0 -8
  221. package/src/helpers/encoderPolyfill.ts +0 -96
  222. package/src/helpers/secret.test.ts +0 -61
  223. package/src/helpers/secret.ts +0 -68
  224. package/src/helpers/sleep.ts +0 -2
  225. package/src/highlighter/HighlightFunctionsInitializer.test.ts +0 -40
  226. package/src/highlighter/HighlightFunctionsInitializer.ts +0 -61
  227. package/src/highlighter/MouseEventHandler.test.ts +0 -151
  228. package/src/highlighter/MouseEventHandler.ts +0 -191
  229. package/src/highlighter/TranslationHighlighter.test.ts +0 -177
  230. package/src/highlighter/TranslationHighlighter.ts +0 -113
  231. package/src/internal.ts +0 -2
  232. package/src/modules/IcuFormatter.test.ts +0 -21
  233. package/src/modules/IcuFormatter.ts +0 -39
  234. package/src/modules/index.ts +0 -1
  235. package/src/services/ApiHttpService.ts +0 -85
  236. package/src/services/CoreService.test.ts +0 -141
  237. package/src/services/CoreService.ts +0 -76
  238. package/src/services/DependencyService.test.ts +0 -51
  239. package/src/services/DependencyService.ts +0 -116
  240. package/src/services/ElementRegistrar.test.ts +0 -131
  241. package/src/services/ElementRegistrar.ts +0 -108
  242. package/src/services/EventEmitter.ts +0 -52
  243. package/src/services/EventService.ts +0 -14
  244. package/src/services/ModuleService.ts +0 -14
  245. package/src/services/ScreenshotService.ts +0 -31
  246. package/src/services/Subscription.ts +0 -7
  247. package/src/services/TextService.test.ts +0 -88
  248. package/src/services/TextService.ts +0 -82
  249. package/src/services/TranslationService.test.ts +0 -358
  250. package/src/services/TranslationService.ts +0 -417
  251. package/src/services/__mocks__/CoreService.ts +0 -17
  252. package/src/toolsManager/Messages.test.ts +0 -79
  253. package/src/toolsManager/Messages.ts +0 -60
  254. package/src/toolsManager/PluginManager.test.ts +0 -108
  255. package/src/toolsManager/PluginManager.ts +0 -129
  256. package/src/types/DTOs.ts +0 -25
  257. package/src/types/apiSchema.generated.ts +0 -6208
  258. package/src/wrappers/AbstractWrapper.ts +0 -14
  259. package/src/wrappers/NodeHandler.ts +0 -143
  260. package/src/wrappers/WrappedHandler.ts +0 -28
  261. package/src/wrappers/invisible/AttributeHandler.ts +0 -23
  262. package/src/wrappers/invisible/Coder.ts +0 -65
  263. package/src/wrappers/invisible/ContentHandler.ts +0 -15
  264. package/src/wrappers/invisible/CoreHandler.ts +0 -17
  265. package/src/wrappers/invisible/InvisibleWrapper.ts +0 -59
  266. package/src/wrappers/invisible/ValueMemory.test.ts +0 -25
  267. package/src/wrappers/invisible/ValueMemory.ts +0 -16
  268. package/src/wrappers/text/AttributeHandler.test.ts +0 -118
  269. package/src/wrappers/text/AttributeHandler.ts +0 -25
  270. package/src/wrappers/text/Coder.test.ts +0 -298
  271. package/src/wrappers/text/Coder.ts +0 -202
  272. package/src/wrappers/text/ContentHandler.test.ts +0 -185
  273. package/src/wrappers/text/ContentHandler.ts +0 -21
  274. package/src/wrappers/text/CoreHandler.test.ts +0 -106
  275. package/src/wrappers/text/CoreHandler.ts +0 -45
  276. package/src/wrappers/text/TextWrapper.ts +0 -69
@@ -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
- }