@tolgee/core 4.9.2 → 4.9.3-rc.23424f3.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 +146 -0
  16. package/lib/Controller/Events/EventEmitter.d.ts +6 -0
  17. package/lib/Controller/Events/EventEmitterSelective.d.ts +15 -0
  18. package/lib/Controller/Events/Events.d.ts +50 -0
  19. package/lib/Controller/Plugins/Plugins.d.ts +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 +27 -0
  36. package/src/Controller/Events/EventEmitterSelective.test.ts +125 -0
  37. package/src/Controller/Events/EventEmitterSelective.ts +179 -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 +23 -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,14 +0,0 @@
1
- import { TranslationTags, TranslationParamsTags, Unwrapped } from '../types';
2
-
3
- export interface AbstractWrapper {
4
- handleText(node: Element): Promise<void>;
5
- handleSubtree(node: Element): Promise<void>;
6
- handleAttribute(node: Element): Promise<void>;
7
- wrap: (
8
- key: string,
9
- params?: TranslationParamsTags<any>,
10
- defaultValue?: string | undefined,
11
- translation?: TranslationTags<any>
12
- ) => TranslationTags<any>;
13
- unwrap(text: string): Unwrapped;
14
- }
@@ -1,143 +0,0 @@
1
- import { NodeHelper } from '../helpers/NodeHelper';
2
- import { Properties } from '../Properties';
3
- import {
4
- ElementMeta,
5
- ElementWithMeta,
6
- KeyAndParamsTags,
7
- NodeLock,
8
- NodeMeta,
9
- NodeWithLock,
10
- NodeWithMeta,
11
- } from '../types';
12
- import { ElementRegistrar } from '../services/ElementRegistrar';
13
- import {
14
- RESTRICTED_ASCENDANT_ATTRIBUTE,
15
- TOLGEE_ATTRIBUTE_NAME,
16
- } from '../Constants/Global';
17
- import { AbstractWrapper } from './AbstractWrapper';
18
-
19
- export class NodeHandler {
20
- constructor(
21
- private properties: Properties,
22
- private elementRegistrar: ElementRegistrar,
23
- private wrapper: AbstractWrapper
24
- ) {}
25
-
26
- static initParentElement(element: Element): ElementWithMeta {
27
- if (element[TOLGEE_ATTRIBUTE_NAME] === undefined) {
28
- element[TOLGEE_ATTRIBUTE_NAME] = {
29
- nodes: new Set(),
30
- } as ElementMeta;
31
- element.setAttribute(TOLGEE_ATTRIBUTE_NAME, '');
32
- }
33
-
34
- return element as ElementWithMeta;
35
- }
36
-
37
- filterRestricted<T extends Element | Text>(nodes: T[]) {
38
- const restrictedElements = this.properties.config.restrictedElements;
39
- return nodes.filter((n) => {
40
- const e = NodeHelper.closestElement(n);
41
- if (!e) {
42
- return false;
43
- }
44
- return (
45
- restrictedElements.indexOf(e.tagName.toLowerCase()) === -1 &&
46
- e.closest(`[${RESTRICTED_ASCENDANT_ATTRIBUTE}="true"]`) === null
47
- );
48
- });
49
- }
50
-
51
- async handleNodes(nodes: Array<Text | Attr>) {
52
- for (const textNode of nodes) {
53
- if (textNode[TOLGEE_ATTRIBUTE_NAME] === undefined) {
54
- textNode[TOLGEE_ATTRIBUTE_NAME] = {} as NodeLock;
55
- }
56
- const tolgeeData = textNode[TOLGEE_ATTRIBUTE_NAME] as
57
- | NodeMeta
58
- | NodeLock
59
- | undefined;
60
- if (tolgeeData?.locked !== true) {
61
- this.lockNode(textNode);
62
- const result = await this.wrapper.unwrap(
63
- NodeHelper.getNodeText(textNode)
64
- );
65
- if (result) {
66
- const { text, keys } = result;
67
- const translatedNode = this.translateChildNode(textNode, text, keys);
68
- const parentElement = this.getParentElement(translatedNode);
69
- parentElement._tolgee.nodes.add(translatedNode);
70
- this.elementRegistrar.register(parentElement);
71
- }
72
- this.unlockNode(textNode);
73
- }
74
- }
75
- }
76
-
77
- translateChildNode(
78
- node: Text | Attr,
79
- newValue,
80
- keys: KeyAndParamsTags<any>[]
81
- ) {
82
- node[TOLGEE_ATTRIBUTE_NAME] = {
83
- oldTextContent: NodeHelper.getNodeText(node),
84
- keys,
85
- };
86
- NodeHelper.setNodeText(node, newValue);
87
- return node as Node as NodeWithMeta;
88
- }
89
-
90
- private lockNode(node: Node | Attr): NodeWithLock {
91
- if (node[TOLGEE_ATTRIBUTE_NAME] === undefined) {
92
- node[TOLGEE_ATTRIBUTE_NAME] = {} as NodeLock;
93
- }
94
-
95
- const tolgeeData = node[TOLGEE_ATTRIBUTE_NAME] as NodeMeta | NodeLock;
96
- if (tolgeeData?.locked !== true) {
97
- tolgeeData.locked = true;
98
- }
99
-
100
- return node as NodeWithLock;
101
- }
102
-
103
- private unlockNode(node: Node | Attr) {
104
- if (node[TOLGEE_ATTRIBUTE_NAME]) {
105
- node[TOLGEE_ATTRIBUTE_NAME].locked = false;
106
- }
107
- }
108
-
109
- private getParentElement(node: Node) {
110
- const parent = this.getSuitableParent(node);
111
- return NodeHandler.initParentElement(parent);
112
- }
113
-
114
- private getSuitableParent(node: Node): Element {
115
- const domParent = NodeHelper.getParentElement(node);
116
-
117
- if (domParent === undefined) {
118
- // eslint-disable-next-line no-console
119
- console.error(node);
120
- throw new Error('No suitable parent found for node above.');
121
- }
122
-
123
- if (!this.properties.config.passToParent) {
124
- return domParent;
125
- }
126
-
127
- if (Array.isArray(this.properties.config.passToParent)) {
128
- const tagNameEquals = (elementTagName: string) =>
129
- domParent.tagName.toLowerCase() === elementTagName.toLowerCase();
130
- if (this.properties.config.passToParent.findIndex(tagNameEquals) === -1) {
131
- return domParent;
132
- }
133
- }
134
-
135
- if (typeof this.properties.config.passToParent === 'function') {
136
- if (!this.properties.config.passToParent(domParent)) {
137
- return domParent;
138
- }
139
- }
140
-
141
- return this.getSuitableParent(domParent);
142
- }
143
- }
@@ -1,28 +0,0 @@
1
- import { NodeHelper } from '../helpers/NodeHelper';
2
- import { NodeHandler } from './NodeHandler';
3
- import { ElementRegistrar } from '../services/ElementRegistrar';
4
- import { TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE } from '../Constants/Global';
5
-
6
- export class WrappedHandler {
7
- constructor(
8
- private elementRegistrar: ElementRegistrar,
9
- private nodeHandler: NodeHandler
10
- ) {}
11
-
12
- async handle(node: Node): Promise<void> {
13
- const xPath = `./descendant-or-self::*[@${TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE}]`;
14
- const nodes = NodeHelper.evaluate(xPath, node);
15
- const filtered: Element[] = this.nodeHandler.filterRestricted(
16
- nodes as Element[]
17
- );
18
- filtered.forEach((element) => {
19
- const elementWithMeta = NodeHandler.initParentElement(element);
20
- elementWithMeta._tolgee.wrappedWithElementOnlyKey = element.getAttribute(
21
- TOLGEE_WRAPPED_ONLY_DATA_ATTRIBUTE
22
- );
23
- elementWithMeta._tolgee.wrappedWithElementOnlyDefaultHtml =
24
- element.innerHTML;
25
- this.elementRegistrar.register(elementWithMeta);
26
- });
27
- }
28
- }
@@ -1,23 +0,0 @@
1
- import { NodeHandler } from '../NodeHandler';
2
- import { Properties } from '../../Properties';
3
- import { NodeHelper } from '../../helpers/NodeHelper';
4
- import { INVISIBLE_CHARACTERS } from '../../helpers/secret';
5
-
6
- export class AttributeHandler {
7
- constructor(
8
- private properties: Properties,
9
- private nodeHandler: NodeHandler
10
- ) {}
11
-
12
- async handle(node: Element) {
13
- for (const [tag, attributes] of Object.entries(
14
- this.properties.config.tagAttributes
15
- )) {
16
- for (const attribute of attributes) {
17
- const expression = `descendant-or-self::${tag}/@${attribute}[contains(., '${INVISIBLE_CHARACTERS[0]}')]`;
18
- const nodes: Array<Attr | Text> = NodeHelper.evaluate(expression, node);
19
- await this.nodeHandler.handleNodes(nodes);
20
- }
21
- }
22
- }
23
- }
@@ -1,65 +0,0 @@
1
- import {
2
- decodeFromText,
3
- encodeMessage,
4
- removeSecrets,
5
- stringToCodePoints,
6
- } from '../../helpers/secret';
7
- import {
8
- KeyAndParams,
9
- TranslationTags,
10
- TranslationParamsTags,
11
- Unwrapped,
12
- } from '../../types';
13
- import { ValueMemory } from './ValueMemory';
14
-
15
- export class Coder {
16
- private keyMemory = new ValueMemory();
17
- private defaultMemory = new ValueMemory();
18
-
19
- unwrap(text: string): Unwrapped {
20
- const keysAndParams = [] as KeyAndParams[];
21
- const messages = decodeFromText(text);
22
-
23
- messages.forEach((msg) => {
24
- const [keyCode, defaultCode] = stringToCodePoints(msg);
25
- const key = this.keyMemory.numberToValue(keyCode);
26
- const defaultValue =
27
- defaultCode !== undefined
28
- ? this.defaultMemory.numberToValue(defaultCode)
29
- : undefined;
30
- keysAndParams.push({
31
- key: key,
32
- params: undefined,
33
- defaultValue,
34
- });
35
- });
36
-
37
- const result = removeSecrets(text);
38
-
39
- if (keysAndParams.length) {
40
- return { text: result, keys: keysAndParams };
41
- }
42
- return undefined;
43
- }
44
-
45
- public wrap(
46
- key: string,
47
- _params: TranslationParamsTags<any> = {},
48
- defaultValue: string | undefined = undefined,
49
- translation: string | any[] | undefined = undefined
50
- ): TranslationTags<any> {
51
- const codes = [this.keyMemory.valueToNumber(key)];
52
- if (defaultValue) {
53
- codes.push(this.defaultMemory.valueToNumber(defaultValue));
54
- }
55
-
56
- const value = translation || '';
57
- const invisibleMark = encodeMessage(String.fromCodePoint(...codes));
58
-
59
- return typeof value === 'string'
60
- ? value + invisibleMark
61
- : Array.isArray(value)
62
- ? [...value, invisibleMark]
63
- : [value, invisibleMark];
64
- }
65
- }
@@ -1,15 +0,0 @@
1
- import { NodeHelper } from '../../helpers/NodeHelper';
2
- import { INVISIBLE_CHARACTERS } from '../../helpers/secret';
3
- import { NodeHandler } from '../NodeHandler';
4
-
5
- export class ContentHandler {
6
- constructor(private nodeHandler: NodeHandler) {}
7
-
8
- async handle(node: Node): Promise<void> {
9
- const xPath = `./descendant-or-self::text()[contains(., '${INVISIBLE_CHARACTERS[0]}')]`;
10
- const nodes = NodeHelper.evaluate(xPath, node);
11
- const filtered: Text[] = this.nodeHandler.filterRestricted(nodes as Text[]);
12
-
13
- await this.nodeHandler.handleNodes(filtered);
14
- }
15
- }
@@ -1,17 +0,0 @@
1
- import { ContentHandler } from './ContentHandler';
2
- import { AttributeHandler } from './AttributeHandler';
3
- import { WrappedHandler } from '../WrappedHandler';
4
-
5
- export class CoreHandler {
6
- constructor(
7
- private textHandler: ContentHandler,
8
- private attributeHandler: AttributeHandler,
9
- private wrappedHandler: WrappedHandler
10
- ) {}
11
-
12
- public async handleSubtree(target: Element) {
13
- await this.attributeHandler.handle(target);
14
- await this.textHandler.handle(target);
15
- await this.wrappedHandler.handle(target);
16
- }
17
- }
@@ -1,59 +0,0 @@
1
- import { Properties } from '../../Properties';
2
- import { ElementRegistrar } from '../../services/ElementRegistrar';
3
- import { TranslationParams } from '../../types';
4
- import { NodeHandler } from '../NodeHandler';
5
- import { AttributeHandler } from './AttributeHandler';
6
- import { Coder } from './Coder';
7
- import { CoreHandler } from './CoreHandler';
8
- import { ContentHandler } from './ContentHandler';
9
- import { WrappedHandler } from '../WrappedHandler';
10
- import { AbstractWrapper } from '../AbstractWrapper';
11
-
12
- export class InvisibleWrapper implements AbstractWrapper {
13
- private coder: Coder;
14
- private coreHandler: CoreHandler;
15
- private attributeHandler: AttributeHandler;
16
- private wrappedHandler: WrappedHandler;
17
- private textHandler: ContentHandler;
18
- private nodeHandler: any;
19
- constructor(properties: Properties, elementRegistrar: ElementRegistrar) {
20
- this.coder = new Coder();
21
- this.nodeHandler = new NodeHandler(properties, elementRegistrar, this);
22
- this.textHandler = new ContentHandler(this.nodeHandler);
23
- this.attributeHandler = new AttributeHandler(properties, this.nodeHandler);
24
- this.wrappedHandler = new WrappedHandler(
25
- elementRegistrar,
26
- this.nodeHandler
27
- );
28
- this.coreHandler = new CoreHandler(
29
- this.textHandler,
30
- this.attributeHandler,
31
- this.wrappedHandler
32
- );
33
- }
34
-
35
- public handleText(node: Element) {
36
- return this.textHandler.handle(node);
37
- }
38
-
39
- public handleSubtree(node: Element) {
40
- return this.coreHandler.handleSubtree(node);
41
- }
42
-
43
- public handleAttribute(node: Element) {
44
- return this.attributeHandler.handle(node);
45
- }
46
-
47
- public wrap(
48
- key: string,
49
- params: TranslationParams = {},
50
- defaultValue: string | undefined = undefined,
51
- translation = ''
52
- ) {
53
- return this.coder.wrap(key, params, defaultValue, translation);
54
- }
55
-
56
- public unwrap(text: string) {
57
- return this.coder.unwrap(text);
58
- }
59
- }
@@ -1,25 +0,0 @@
1
- jest.dontMock('./ValueMemory');
2
- import { ValueMemory } from './ValueMemory';
3
-
4
- describe('Value memory', () => {
5
- let valueMemory: ValueMemory;
6
-
7
- beforeEach(() => {
8
- valueMemory = new ValueMemory();
9
- });
10
-
11
- it('stores key correctly', () => {
12
- const num = valueMemory.valueToNumber('abcd');
13
- expect(num).toEqual(0);
14
- expect(valueMemory.valueToNumber('abcd')).toEqual(0);
15
- });
16
-
17
- it('retrieves key correctly', () => {
18
- const num = valueMemory.valueToNumber('abcd');
19
- expect(valueMemory.numberToValue(num)).toEqual('abcd');
20
- });
21
-
22
- it('retrieves missing key correctly', () => {
23
- expect(valueMemory.numberToValue(100)).toEqual(undefined);
24
- });
25
- });
@@ -1,16 +0,0 @@
1
- export class ValueMemory {
2
- private values: string[] = [];
3
-
4
- public valueToNumber(key: string) {
5
- let index = this.values.indexOf(key);
6
- if (index === -1) {
7
- index = this.values.length;
8
- this.values.push(key);
9
- }
10
- return index;
11
- }
12
-
13
- public numberToValue(num: number) {
14
- return this.values[num];
15
- }
16
- }
@@ -1,118 +0,0 @@
1
- jest.dontMock('./AttributeHandler');
2
- jest.dontMock('./TextWrapper');
3
- jest.dontMock('../NodeHandler');
4
- jest.dontMock('../../services/EventService');
5
- jest.dontMock('../../helpers/NodeHelper.ts');
6
- jest.dontMock('../../services/DependencyService');
7
- jest.dontMock('../../TolgeeConfig');
8
-
9
- import { Properties } from '../../Properties';
10
- import { AttributeHandler } from './AttributeHandler';
11
- import { ElementWithMeta, NodeWithMeta, Unwrapped } from '../../types';
12
- import { NodeHelper } from '../../helpers/NodeHelper';
13
- import { createTestDom } from '@testFixtures/createTestDom';
14
- import { getMockedInstance } from '@testFixtures/mocked';
15
- import { ElementRegistrar } from '../../services/ElementRegistrar';
16
- import { DependencyService } from '../../services/DependencyService';
17
- import { Coder } from './Coder';
18
-
19
- describe('AttributeHandler', () => {
20
- let attributeHandler: AttributeHandler;
21
-
22
- const mockedKeys = [
23
- {
24
- key: 'dummyKey',
25
- params: { dummyParam: 'dummyValue' },
26
- },
27
- ];
28
-
29
- const mockedTranslateInner = (text) => {
30
- return {
31
- text: text.replace(/{{(.*?)}}/gs, '$1'),
32
- keys: mockedKeys,
33
- } as Unwrapped;
34
- };
35
-
36
- const gv = (key) => mockedTranslateInner(key).text;
37
- const mockedTranslate = jest.fn(mockedTranslateInner);
38
- let c: ReturnType<typeof createTestDom>;
39
-
40
- beforeEach(() => {
41
- c = createTestDom(document);
42
- const dependencyService = new DependencyService();
43
- dependencyService.init({});
44
- // @ts-ignore
45
- attributeHandler = dependencyService.wrapper.attributeHandler;
46
- getMockedInstance(Properties).config = {
47
- inputPrefix: '{{',
48
- inputSuffix: '}}',
49
- restrictedElements: [],
50
- tagAttributes: {
51
- '*': ['aria-label'],
52
- },
53
- passToParent: ['option'],
54
- wrapperMode: 'text',
55
- };
56
-
57
- getMockedInstance(Coder).unwrap = (...args) => mockedTranslate(...args);
58
- });
59
-
60
- afterEach(async () => {
61
- jest.clearAllMocks();
62
- });
63
-
64
- describe('in production mode', () => {
65
- let xPath: string;
66
-
67
- beforeEach(async () => {
68
- await attributeHandler.handle(document.body);
69
- xPath = `./div/div/@aria-label[contains(., '${gv(c.ariaLabelKey)}')]`;
70
- });
71
-
72
- test('Can be created', () => {
73
- expect(attributeHandler).not.toBeUndefined();
74
- });
75
-
76
- test('will handle text in aria-label attribute of div', async () => {
77
- expect(xPath).toBeFoundIn(document.body);
78
- });
79
-
80
- describe("Node's _tolgee property", () => {
81
- let node: NodeWithMeta;
82
-
83
- beforeEach(() => {
84
- node = NodeHelper.evaluateToSingle(
85
- xPath,
86
- document.body
87
- ) as NodeWithMeta;
88
- });
89
-
90
- test('will be defined', () => {
91
- expect(node._tolgee).toBeDefined();
92
- });
93
- });
94
-
95
- describe("Parent element's _tolgee property", () => {
96
- let element: ElementWithMeta;
97
- let node: NodeWithMeta;
98
-
99
- beforeEach(() => {
100
- node = NodeHelper.evaluateToSingle(xPath, document.body);
101
- element = (node as any as Attr).ownerElement as any as ElementWithMeta;
102
- });
103
-
104
- test('will be defined', () => {
105
- expect(element._tolgee).toBeDefined();
106
- });
107
- });
108
- });
109
-
110
- test('will register the node', async () => {
111
- await attributeHandler.handle(document.body);
112
- const xPath = `./div/div/@aria-label[contains(., '${gv(c.ariaLabelKey)}')]`;
113
- const node = NodeHelper.evaluateToSingle(xPath, document.body) as Attr;
114
- expect(getMockedInstance(ElementRegistrar).register).toBeCalledWith(
115
- node.ownerElement
116
- );
117
- });
118
- });
@@ -1,25 +0,0 @@
1
- import { NodeHandler } from '../NodeHandler';
2
- import { Properties } from '../../Properties';
3
- import { NodeHelper } from '../../helpers/NodeHelper';
4
-
5
- export class AttributeHandler {
6
- constructor(
7
- private properties: Properties,
8
- private nodeHandler: NodeHandler
9
- ) {}
10
-
11
- async handle(node: Element) {
12
- const inputPrefix = this.properties.config.inputPrefix;
13
- const inputSuffix = this.properties.config.inputSuffix;
14
-
15
- for (const [tag, attributes] of Object.entries(
16
- this.properties.config.tagAttributes
17
- )) {
18
- for (const attribute of attributes) {
19
- const expression = `descendant-or-self::${tag}/@${attribute}[contains(., '${inputPrefix}') and contains(., '${inputSuffix}')]`;
20
- const nodes: Array<Attr | Text> = NodeHelper.evaluate(expression, node);
21
- await this.nodeHandler.handleNodes(nodes);
22
- }
23
- }
24
- }
25
- }