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