@tolgee/core 4.9.2 → 4.9.3-rc.128edeb.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/dist/tolgee.cjs.js +1275 -7024
  2. package/dist/tolgee.cjs.js.map +1 -1
  3. package/dist/tolgee.cjs.min.js +1 -1
  4. package/dist/tolgee.cjs.min.js.map +1 -1
  5. package/dist/tolgee.esm.js +1404 -0
  6. package/dist/tolgee.esm.js.map +1 -0
  7. package/dist/tolgee.esm.min.mjs +1 -1
  8. package/dist/tolgee.esm.min.mjs.map +1 -1
  9. package/dist/tolgee.umd.js +1275 -7024
  10. package/dist/tolgee.umd.js.map +1 -1
  11. package/dist/tolgee.umd.min.js +1 -1
  12. package/dist/tolgee.umd.min.js.map +1 -1
  13. package/lib/Controller/Cache/Cache.d.ts +22 -0
  14. package/lib/Controller/Cache/helpers.d.ts +4 -0
  15. package/lib/Controller/Controller.d.ts +110 -0
  16. package/lib/Controller/Events/EventEmitter.d.ts +6 -0
  17. package/lib/Controller/Events/EventEmitterSelective.d.ts +7 -0
  18. package/lib/Controller/Events/Events.d.ts +14 -0
  19. package/lib/Controller/Plugins/Plugins.d.ts +36 -0
  20. package/lib/Controller/State/State.d.ts +39 -0
  21. package/lib/Controller/State/helpers.d.ts +6 -0
  22. package/lib/Controller/State/initObserverOptions.d.ts +13 -0
  23. package/lib/Controller/State/initState.d.ts +47 -0
  24. package/lib/Controller/ValueObserver.d.ts +5 -0
  25. package/lib/FormatSimple/FormatError.d.ts +7 -0
  26. package/lib/FormatSimple/FormatSimple.d.ts +3 -0
  27. package/lib/FormatSimple/formatParser.d.ts +1 -0
  28. package/lib/FormatSimple/formatter.d.ts +2 -0
  29. package/lib/Tolgee.d.ts +2 -68
  30. package/lib/TranslateParams.d.ts +2 -0
  31. package/lib/{Constants/Global.d.ts → constants.d.ts} +1 -3
  32. package/lib/helpers.d.ts +3 -0
  33. package/lib/index.d.ts +4 -8
  34. package/lib/types.d.ts +244 -84
  35. package/package.json +21 -29
  36. package/src/Controller/Cache/Cache.ts +293 -0
  37. package/src/Controller/Cache/helpers.ts +37 -0
  38. package/src/Controller/Controller.ts +310 -0
  39. package/src/Controller/Events/EventEmitter.ts +30 -0
  40. package/src/Controller/Events/EventEmitterSelective.test.ts +125 -0
  41. package/src/Controller/Events/EventEmitterSelective.ts +188 -0
  42. package/src/Controller/Events/Events.ts +66 -0
  43. package/src/Controller/Plugins/Plugins.ts +315 -0
  44. package/src/Controller/State/State.ts +175 -0
  45. package/src/Controller/State/helpers.ts +41 -0
  46. package/src/Controller/State/initObserverOptions.ts +38 -0
  47. package/src/Controller/State/initState.ts +81 -0
  48. package/src/Controller/ValueObserver.ts +26 -0
  49. package/src/FormatSimple/FormatError.ts +26 -0
  50. package/src/FormatSimple/FormatSimple.ts +13 -0
  51. package/src/FormatSimple/formatParser.ts +133 -0
  52. package/src/FormatSimple/formatter.test.ts +190 -0
  53. package/src/FormatSimple/formatter.ts +19 -0
  54. package/src/Tolgee.ts +79 -330
  55. package/src/TranslateParams.test.ts +41 -0
  56. package/src/TranslateParams.ts +51 -0
  57. package/src/__test/backend.test.ts +48 -0
  58. package/src/__test/cache.test.ts +148 -0
  59. package/src/__test/client.test.ts +48 -0
  60. package/src/__test/events.test.ts +33 -0
  61. package/src/__test/format.simple.test.ts +26 -0
  62. package/src/__test/initialization.test.ts +85 -0
  63. package/src/__test/jest-setup.ts +2 -0
  64. package/src/__test/languageDetection.test.ts +129 -0
  65. package/src/__test/languageStorage.test.ts +145 -0
  66. package/src/__test/languages.test.ts +112 -0
  67. package/src/__test/loading.test.ts +39 -0
  68. package/src/__test/namespaces.test.ts +99 -0
  69. package/src/__test/namespacesFallback.test.ts +74 -0
  70. package/src/__test/plugins.test.ts +136 -0
  71. package/src/__test/testTools.ts +7 -0
  72. package/src/{Constants/Global.ts → constants.ts} +1 -6
  73. package/src/helpers.ts +17 -0
  74. package/src/index.ts +9 -8
  75. package/src/types.ts +338 -90
  76. package/README.md +0 -45
  77. package/dist/Constants/Global.d.ts +0 -6
  78. package/dist/Constants/ModifierKey.d.ts +0 -6
  79. package/dist/Errors/ApiHttpError.d.ts +0 -5
  80. package/dist/Observer.d.ts +0 -14
  81. package/dist/Observer.test.d.ts +0 -2
  82. package/dist/Properties.d.ts +0 -17
  83. package/dist/Properties.test.d.ts +0 -1
  84. package/dist/Tolgee.d.ts +0 -68
  85. package/dist/Tolgee.test.d.ts +0 -1
  86. package/dist/TolgeeConfig.d.ts +0 -69
  87. package/dist/TolgeeConfig.test.d.ts +0 -1
  88. package/dist/__integration/FormatterIcu.test.d.ts +0 -1
  89. package/dist/__integration/FormatterMissing.d.ts +0 -1
  90. package/dist/__integration/Tolgee.test.d.ts +0 -1
  91. package/dist/__integration/TolgeeInvisible.test.d.ts +0 -1
  92. package/dist/__integration/mockTranslations.d.ts +0 -7
  93. package/dist/__integration/testConfig.d.ts +0 -9
  94. package/dist/__testFixtures/classMock.d.ts +0 -3
  95. package/dist/__testFixtures/createElement.d.ts +0 -2
  96. package/dist/__testFixtures/createTestDom.d.ts +0 -9
  97. package/dist/__testFixtures/mocked.d.ts +0 -20
  98. package/dist/__testFixtures/setupAfterEnv.d.ts +0 -8
  99. package/dist/helpers/NodeHelper.d.ts +0 -14
  100. package/dist/helpers/TextHelper.d.ts +0 -5
  101. package/dist/helpers/TextHelper.test.d.ts +0 -1
  102. package/dist/helpers/commonTypes.d.ts +0 -2
  103. package/dist/helpers/encoderPolyfill.d.ts +0 -8
  104. package/dist/helpers/secret.d.ts +0 -6
  105. package/dist/helpers/secret.test.d.ts +0 -1
  106. package/dist/helpers/sleep.d.ts +0 -1
  107. package/dist/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  108. package/dist/highlighter/HighlightFunctionsInitializer.test.d.ts +0 -1
  109. package/dist/highlighter/MouseEventHandler.d.ts +0 -29
  110. package/dist/highlighter/MouseEventHandler.test.d.ts +0 -1
  111. package/dist/highlighter/TranslationHighlighter.d.ts +0 -14
  112. package/dist/highlighter/TranslationHighlighter.test.d.ts +0 -1
  113. package/dist/index.d.ts +0 -10
  114. package/dist/internal.d.ts +0 -2
  115. package/dist/modules/IcuFormatter.d.ts +0 -2
  116. package/dist/modules/IcuFormatter.test.d.ts +0 -1
  117. package/dist/modules/index.d.ts +0 -1
  118. package/dist/services/ApiHttpService.d.ts +0 -15
  119. package/dist/services/CoreService.d.ts +0 -18
  120. package/dist/services/CoreService.test.d.ts +0 -1
  121. package/dist/services/DependencyService.d.ts +0 -39
  122. package/dist/services/DependencyService.test.d.ts +0 -1
  123. package/dist/services/ElementRegistrar.d.ts +0 -19
  124. package/dist/services/ElementRegistrar.test.d.ts +0 -1
  125. package/dist/services/EventEmitter.d.ts +0 -13
  126. package/dist/services/EventService.d.ts +0 -9
  127. package/dist/services/ModuleService.d.ts +0 -5
  128. package/dist/services/ScreenshotService.d.ts +0 -15
  129. package/dist/services/Subscription.d.ts +0 -5
  130. package/dist/services/TextService.d.ts +0 -14
  131. package/dist/services/TextService.test.d.ts +0 -1
  132. package/dist/services/TranslationService.d.ts +0 -75
  133. package/dist/services/TranslationService.test.d.ts +0 -1
  134. package/dist/services/__mocks__/CoreService.d.ts +0 -2
  135. package/dist/tolgee.esm.mjs +0 -7150
  136. package/dist/tolgee.esm.mjs.map +0 -1
  137. package/dist/toolsManager/Messages.d.ts +0 -8
  138. package/dist/toolsManager/Messages.test.d.ts +0 -1
  139. package/dist/toolsManager/PluginManager.d.ts +0 -21
  140. package/dist/toolsManager/PluginManager.test.d.ts +0 -1
  141. package/dist/types/DTOs.d.ts +0 -20
  142. package/dist/types/apiSchema.generated.d.ts +0 -6185
  143. package/dist/types.d.ts +0 -123
  144. package/dist/wrappers/AbstractWrapper.d.ts +0 -8
  145. package/dist/wrappers/NodeHandler.d.ts +0 -18
  146. package/dist/wrappers/WrappedHandler.d.ts +0 -8
  147. package/dist/wrappers/invisible/AttributeHandler.d.ts +0 -8
  148. package/dist/wrappers/invisible/Coder.d.ts +0 -7
  149. package/dist/wrappers/invisible/ContentHandler.d.ts +0 -6
  150. package/dist/wrappers/invisible/CoreHandler.d.ts +0 -10
  151. package/dist/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  152. package/dist/wrappers/invisible/ValueMemory.d.ts +0 -5
  153. package/dist/wrappers/invisible/ValueMemory.test.d.ts +0 -1
  154. package/dist/wrappers/text/AttributeHandler.d.ts +0 -8
  155. package/dist/wrappers/text/AttributeHandler.test.d.ts +0 -1
  156. package/dist/wrappers/text/Coder.d.ts +0 -15
  157. package/dist/wrappers/text/Coder.test.d.ts +0 -1
  158. package/dist/wrappers/text/ContentHandler.d.ts +0 -8
  159. package/dist/wrappers/text/ContentHandler.test.d.ts +0 -1
  160. package/dist/wrappers/text/CoreHandler.d.ts +0 -17
  161. package/dist/wrappers/text/CoreHandler.test.d.ts +0 -1
  162. package/dist/wrappers/text/TextWrapper.d.ts +0 -20
  163. package/index.js +0 -7
  164. package/lib/Constants/ModifierKey.d.ts +0 -6
  165. package/lib/Errors/ApiHttpError.d.ts +0 -5
  166. package/lib/Observer.d.ts +0 -14
  167. package/lib/Properties.d.ts +0 -17
  168. package/lib/TolgeeConfig.d.ts +0 -69
  169. package/lib/helpers/NodeHelper.d.ts +0 -14
  170. package/lib/helpers/TextHelper.d.ts +0 -5
  171. package/lib/helpers/commonTypes.d.ts +0 -2
  172. package/lib/helpers/encoderPolyfill.d.ts +0 -8
  173. package/lib/helpers/secret.d.ts +0 -6
  174. package/lib/helpers/sleep.d.ts +0 -1
  175. package/lib/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
  176. package/lib/highlighter/MouseEventHandler.d.ts +0 -29
  177. package/lib/highlighter/TranslationHighlighter.d.ts +0 -14
  178. package/lib/modules/IcuFormatter.d.ts +0 -2
  179. package/lib/modules/index.d.ts +0 -1
  180. package/lib/services/ApiHttpService.d.ts +0 -15
  181. package/lib/services/CoreService.d.ts +0 -18
  182. package/lib/services/DependencyService.d.ts +0 -39
  183. package/lib/services/ElementRegistrar.d.ts +0 -19
  184. package/lib/services/EventEmitter.d.ts +0 -13
  185. package/lib/services/EventService.d.ts +0 -9
  186. package/lib/services/ModuleService.d.ts +0 -5
  187. package/lib/services/ScreenshotService.d.ts +0 -15
  188. package/lib/services/Subscription.d.ts +0 -5
  189. package/lib/services/TextService.d.ts +0 -14
  190. package/lib/services/TranslationService.d.ts +0 -75
  191. package/lib/toolsManager/Messages.d.ts +0 -8
  192. package/lib/toolsManager/PluginManager.d.ts +0 -21
  193. package/lib/types/DTOs.d.ts +0 -20
  194. package/lib/types/apiSchema.generated.d.ts +0 -6185
  195. package/lib/wrappers/AbstractWrapper.d.ts +0 -8
  196. package/lib/wrappers/NodeHandler.d.ts +0 -18
  197. package/lib/wrappers/WrappedHandler.d.ts +0 -8
  198. package/lib/wrappers/invisible/AttributeHandler.d.ts +0 -8
  199. package/lib/wrappers/invisible/Coder.d.ts +0 -7
  200. package/lib/wrappers/invisible/ContentHandler.d.ts +0 -6
  201. package/lib/wrappers/invisible/CoreHandler.d.ts +0 -10
  202. package/lib/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
  203. package/lib/wrappers/invisible/ValueMemory.d.ts +0 -5
  204. package/lib/wrappers/text/AttributeHandler.d.ts +0 -8
  205. package/lib/wrappers/text/Coder.d.ts +0 -15
  206. package/lib/wrappers/text/ContentHandler.d.ts +0 -8
  207. package/lib/wrappers/text/CoreHandler.d.ts +0 -17
  208. package/lib/wrappers/text/TextWrapper.d.ts +0 -20
  209. package/src/Constants/ModifierKey.ts +0 -6
  210. package/src/Errors/ApiHttpError.ts +0 -8
  211. package/src/Observer.test.ts +0 -119
  212. package/src/Observer.ts +0 -68
  213. package/src/Properties.test.ts +0 -150
  214. package/src/Properties.ts +0 -112
  215. package/src/Tolgee.test.ts +0 -473
  216. package/src/TolgeeConfig.test.ts +0 -21
  217. package/src/TolgeeConfig.ts +0 -134
  218. package/src/__integration/FormatterIcu.test.ts +0 -80
  219. package/src/__integration/FormatterMissing.ts +0 -54
  220. package/src/__integration/Tolgee.test.ts +0 -90
  221. package/src/__integration/TolgeeInvisible.test.ts +0 -145
  222. package/src/__integration/mockTranslations.ts +0 -6
  223. package/src/__integration/testConfig.ts +0 -16
  224. package/src/__testFixtures/classMock.ts +0 -11
  225. package/src/__testFixtures/createElement.ts +0 -43
  226. package/src/__testFixtures/createTestDom.ts +0 -26
  227. package/src/__testFixtures/mocked.ts +0 -25
  228. package/src/__testFixtures/setupAfterEnv.ts +0 -34
  229. package/src/helpers/NodeHelper.ts +0 -90
  230. package/src/helpers/TextHelper.test.ts +0 -62
  231. package/src/helpers/TextHelper.ts +0 -58
  232. package/src/helpers/commonTypes.ts +0 -8
  233. package/src/helpers/encoderPolyfill.ts +0 -96
  234. package/src/helpers/secret.test.ts +0 -61
  235. package/src/helpers/secret.ts +0 -68
  236. package/src/helpers/sleep.ts +0 -2
  237. package/src/highlighter/HighlightFunctionsInitializer.test.ts +0 -40
  238. package/src/highlighter/HighlightFunctionsInitializer.ts +0 -61
  239. package/src/highlighter/MouseEventHandler.test.ts +0 -151
  240. package/src/highlighter/MouseEventHandler.ts +0 -191
  241. package/src/highlighter/TranslationHighlighter.test.ts +0 -177
  242. package/src/highlighter/TranslationHighlighter.ts +0 -113
  243. package/src/internal.ts +0 -2
  244. package/src/modules/IcuFormatter.test.ts +0 -21
  245. package/src/modules/IcuFormatter.ts +0 -39
  246. package/src/modules/index.ts +0 -1
  247. package/src/services/ApiHttpService.ts +0 -85
  248. package/src/services/CoreService.test.ts +0 -141
  249. package/src/services/CoreService.ts +0 -76
  250. package/src/services/DependencyService.test.ts +0 -51
  251. package/src/services/DependencyService.ts +0 -116
  252. package/src/services/ElementRegistrar.test.ts +0 -131
  253. package/src/services/ElementRegistrar.ts +0 -108
  254. package/src/services/EventEmitter.ts +0 -52
  255. package/src/services/EventService.ts +0 -14
  256. package/src/services/ModuleService.ts +0 -14
  257. package/src/services/ScreenshotService.ts +0 -31
  258. package/src/services/Subscription.ts +0 -7
  259. package/src/services/TextService.test.ts +0 -88
  260. package/src/services/TextService.ts +0 -82
  261. package/src/services/TranslationService.test.ts +0 -358
  262. package/src/services/TranslationService.ts +0 -417
  263. package/src/services/__mocks__/CoreService.ts +0 -17
  264. package/src/toolsManager/Messages.test.ts +0 -79
  265. package/src/toolsManager/Messages.ts +0 -60
  266. package/src/toolsManager/PluginManager.test.ts +0 -108
  267. package/src/toolsManager/PluginManager.ts +0 -129
  268. package/src/types/DTOs.ts +0 -25
  269. package/src/types/apiSchema.generated.ts +0 -6208
  270. package/src/wrappers/AbstractWrapper.ts +0 -14
  271. package/src/wrappers/NodeHandler.ts +0 -143
  272. package/src/wrappers/WrappedHandler.ts +0 -28
  273. package/src/wrappers/invisible/AttributeHandler.ts +0 -23
  274. package/src/wrappers/invisible/Coder.ts +0 -65
  275. package/src/wrappers/invisible/ContentHandler.ts +0 -15
  276. package/src/wrappers/invisible/CoreHandler.ts +0 -17
  277. package/src/wrappers/invisible/InvisibleWrapper.ts +0 -59
  278. package/src/wrappers/invisible/ValueMemory.test.ts +0 -25
  279. package/src/wrappers/invisible/ValueMemory.ts +0 -16
  280. package/src/wrappers/text/AttributeHandler.test.ts +0 -118
  281. package/src/wrappers/text/AttributeHandler.ts +0 -25
  282. package/src/wrappers/text/Coder.test.ts +0 -298
  283. package/src/wrappers/text/Coder.ts +0 -202
  284. package/src/wrappers/text/ContentHandler.test.ts +0 -185
  285. package/src/wrappers/text/ContentHandler.ts +0 -21
  286. package/src/wrappers/text/CoreHandler.test.ts +0 -106
  287. package/src/wrappers/text/CoreHandler.ts +0 -45
  288. package/src/wrappers/text/TextWrapper.ts +0 -69
@@ -0,0 +1,175 @@
1
+ import {
2
+ CacheDescriptor,
3
+ CacheDescriptorInternal,
4
+ DevCredentials,
5
+ EventEmitterInstance,
6
+ FallbackNSTranslation,
7
+ } from '../../types';
8
+ import { decodeCacheKey } from '../Cache/helpers';
9
+ import { getFallbackArray, getFallbackFromStruct, unique } from './helpers';
10
+ import { initObserverOptions, ObserverOptions } from './initObserverOptions';
11
+ import { initState, Options } from './initState';
12
+
13
+ export const State = (
14
+ onLanguageChange: EventEmitterInstance<string>,
15
+ onPendingLanguageChange: EventEmitterInstance<string>,
16
+ onRunningChange: EventEmitterInstance<boolean>
17
+ ) => {
18
+ let state = initState();
19
+ let observerOptions = initObserverOptions();
20
+ let devCredentials: DevCredentials = undefined;
21
+
22
+ function init(options?: Partial<Options>) {
23
+ state = initState(options, state);
24
+ }
25
+
26
+ function isRunning() {
27
+ return state.isRunning;
28
+ }
29
+
30
+ function setRunning(value: boolean) {
31
+ if (state.isRunning !== value) {
32
+ state.isRunning = value;
33
+ onRunningChange.emit(value);
34
+ }
35
+ }
36
+
37
+ function isInitialLoading() {
38
+ return state.isInitialLoading;
39
+ }
40
+
41
+ function setInitialLoading(value: boolean) {
42
+ state.isInitialLoading = value;
43
+ }
44
+
45
+ function getLanguage() {
46
+ return state.language || state.initialOptions.language;
47
+ }
48
+
49
+ function setLanguage(language: string) {
50
+ if (state.language !== language) {
51
+ state.language = language;
52
+ onLanguageChange.emit(language);
53
+ }
54
+ }
55
+
56
+ function getPendingLanguage() {
57
+ return state.pendingLanguage || getLanguage();
58
+ }
59
+
60
+ function setPendingLanguage(language: string) {
61
+ if (state.pendingLanguage !== language) {
62
+ state.pendingLanguage = language;
63
+ onPendingLanguageChange.emit(language);
64
+ }
65
+ }
66
+
67
+ function getInitialOptions() {
68
+ return { ...state.initialOptions, ...devCredentials };
69
+ }
70
+
71
+ function addActiveNs(ns: FallbackNSTranslation) {
72
+ const namespaces = getFallbackArray(ns);
73
+ namespaces.forEach((namespace) => {
74
+ const value = state.activeNamespaces.get(namespace);
75
+ if (value !== undefined) {
76
+ state.activeNamespaces.set(namespace, value + 1);
77
+ } else {
78
+ state.activeNamespaces.set(namespace, 1);
79
+ }
80
+ });
81
+ }
82
+
83
+ function removeActiveNs(ns: FallbackNSTranslation) {
84
+ const namespaces = getFallbackArray(ns);
85
+ namespaces.forEach((namespace) => {
86
+ const value = state.activeNamespaces.get(namespace);
87
+ if (value !== undefined && value > 1) {
88
+ state.activeNamespaces.set(namespace, value - 1);
89
+ } else {
90
+ state.activeNamespaces.delete(namespace);
91
+ }
92
+ });
93
+ }
94
+
95
+ function getRequiredNamespaces() {
96
+ return unique([
97
+ ...(state.initialOptions.ns || [state.initialOptions.defaultNs]),
98
+ ...state.activeNamespaces.keys(),
99
+ ]);
100
+ }
101
+
102
+ function getFallbackLangs(lang?: string) {
103
+ const language = lang || getLanguage();
104
+ if (!language) {
105
+ return [];
106
+ }
107
+ return unique([
108
+ language,
109
+ ...getFallbackFromStruct(language, state.initialOptions.fallbackLanguage),
110
+ ]);
111
+ }
112
+
113
+ function getFallbackNamespaces() {
114
+ const defaultNs = state.initialOptions.defaultNs;
115
+ const fallbackNs = state.initialOptions.fallbackNs;
116
+ const fallbackNamespaces = typeof defaultNs === 'string' ? [defaultNs] : [];
117
+ return unique([...fallbackNamespaces, ...getFallbackArray(fallbackNs)]);
118
+ }
119
+
120
+ function getAvailableLanguages() {
121
+ if (state.initialOptions.availableLanguages) {
122
+ return state.initialOptions.availableLanguages;
123
+ } else if (state.initialOptions.staticData) {
124
+ const languagesFromStaticData = Object.keys(
125
+ state.initialOptions.staticData
126
+ ).map((key) => decodeCacheKey(key).language);
127
+ return Array.from(new Set(languagesFromStaticData));
128
+ }
129
+ }
130
+
131
+ function withDefaultNs(descriptor: CacheDescriptor): CacheDescriptorInternal {
132
+ return {
133
+ namespace:
134
+ descriptor.namespace === undefined
135
+ ? getInitialOptions().defaultNs
136
+ : descriptor.namespace,
137
+ language: descriptor.language,
138
+ };
139
+ }
140
+
141
+ function overrideCredentials(credentials: DevCredentials) {
142
+ devCredentials = credentials;
143
+ }
144
+
145
+ function setObserverOptions(options: Partial<ObserverOptions>) {
146
+ observerOptions = initObserverOptions(options);
147
+ }
148
+
149
+ function getObserverOptions() {
150
+ return observerOptions;
151
+ }
152
+
153
+ return Object.freeze({
154
+ init,
155
+ isRunning,
156
+ setRunning,
157
+ isInitialLoading,
158
+ setInitialLoading,
159
+ getLanguage,
160
+ setLanguage,
161
+ getPendingLanguage,
162
+ setPendingLanguage,
163
+ getInitialOptions,
164
+ addActiveNs,
165
+ removeActiveNs,
166
+ getRequiredNamespaces,
167
+ getFallbackLangs,
168
+ getFallbackNamespaces,
169
+ getAvailableLanguages,
170
+ withDefaultNs,
171
+ overrideCredentials,
172
+ setObserverOptions,
173
+ getObserverOptions,
174
+ });
175
+ };
@@ -0,0 +1,41 @@
1
+ import {
2
+ FallbackGeneral,
3
+ FallbackLanguage,
4
+ FallbackLanguageObject,
5
+ FallbackLanguageOption,
6
+ } from '../../types';
7
+
8
+ export function isObject(item: any) {
9
+ return typeof item === 'object' && !Array.isArray(item) && item !== null;
10
+ }
11
+
12
+ export function getFallback(value: FallbackGeneral): string[] | undefined {
13
+ if (typeof value === 'string') {
14
+ return [value];
15
+ }
16
+ if (Array.isArray(value)) {
17
+ return value;
18
+ }
19
+ return undefined;
20
+ }
21
+
22
+ export function getFallbackArray(value: FallbackGeneral): string[] {
23
+ return getFallback(value) || [];
24
+ }
25
+
26
+ export function getFallbackFromStruct(
27
+ language: string,
28
+ fallbackLanguage: FallbackLanguageOption
29
+ ) {
30
+ if (isObject(fallbackLanguage)) {
31
+ return getFallbackArray(
32
+ (fallbackLanguage as FallbackLanguageObject)?.[language]
33
+ );
34
+ } else {
35
+ return getFallbackArray(fallbackLanguage as FallbackLanguage);
36
+ }
37
+ }
38
+
39
+ export function unique<T>(arr: T[]) {
40
+ return Array.from(new Set(arr));
41
+ }
@@ -0,0 +1,38 @@
1
+ export type ObserverOptions = {
2
+ tagAttributes: Record<string, string[]>;
3
+ highlightKeys: ModifierKey[];
4
+ highlightColor: string;
5
+ highlightWidth: number;
6
+ targetElement?: HTMLElement;
7
+ restrictedElements: string[];
8
+ inputPrefix: string;
9
+ inputSuffix: string;
10
+ passToParent: (keyof HTMLElementTagNameMap)[] | ((node: Element) => boolean);
11
+ };
12
+
13
+ export type ModifierKey = 'Alt' | 'Control' | 'Shift' | 'Meta';
14
+
15
+ const defaultValues: ObserverOptions = {
16
+ tagAttributes: {
17
+ textarea: ['placeholder'],
18
+ input: ['value', 'placeholder'],
19
+ img: ['alt'],
20
+ '*': ['aria-label', 'title'],
21
+ },
22
+ restrictedElements: ['script', 'style'],
23
+ highlightKeys: ['Alt'] as ModifierKey[],
24
+ highlightColor: 'rgb(255, 0, 0)',
25
+ highlightWidth: 5,
26
+ inputPrefix: '%-%tolgee:',
27
+ inputSuffix: '%-%',
28
+ passToParent: ['option', 'optgroup'],
29
+ };
30
+
31
+ export const initObserverOptions = (
32
+ options?: Partial<ObserverOptions>
33
+ ): ObserverOptions => {
34
+ return {
35
+ ...defaultValues,
36
+ ...options,
37
+ };
38
+ };
@@ -0,0 +1,81 @@
1
+ import {
2
+ FallbackLanguageOption,
3
+ FallbackNS,
4
+ TreeTranslationsData,
5
+ } from '../../types';
6
+
7
+ export type Options = {
8
+ /**
9
+ * Initial language
10
+ */
11
+ language?: string;
12
+ apiUrl?: string;
13
+ apiKey?: string;
14
+ projectId?: number;
15
+ /**
16
+ * Used when auto detection is not available or is turned off
17
+ */
18
+ defaultLanguage?: string;
19
+ /**
20
+ * Languages which can be used for language detection
21
+ * and also limits which values can be stored
22
+ */
23
+ availableLanguages?: string[];
24
+ /**
25
+ * Language which is used when no translation is available for current one
26
+ */
27
+ fallbackLanguage?: FallbackLanguageOption;
28
+ /**
29
+ * Namespaces which should be always fetched
30
+ */
31
+ ns?: string[];
32
+ /**
33
+ * Namespaces to be used to find translation when no explicit namespace set.
34
+ */
35
+ fallbackNs?: FallbackNS;
36
+ /**
37
+ * Default namespace when no namespace defined (default: '')
38
+ */
39
+ defaultNs: string;
40
+ staticData?: {
41
+ [key: string]: TreeTranslationsData | (() => Promise<TreeTranslationsData>);
42
+ };
43
+ };
44
+
45
+ export type State = {
46
+ initialOptions: Options;
47
+ activeNamespaces: Map<string, number>;
48
+ language: string | undefined;
49
+ pendingLanguage: string | undefined;
50
+ isInitialLoading: boolean;
51
+ isRunning: boolean;
52
+ };
53
+
54
+ const defaultValues: Options = {
55
+ defaultNs: '',
56
+ };
57
+
58
+ export const initState = (
59
+ options?: Partial<Options>,
60
+ previousState?: State
61
+ ): State => {
62
+ const initialOptions = {
63
+ ...defaultValues,
64
+ ...previousState?.initialOptions,
65
+ ...options,
66
+ };
67
+
68
+ // remove extra '/' from url end
69
+ const apiUrl = initialOptions.apiUrl;
70
+ initialOptions.apiUrl = apiUrl ? apiUrl.replace(/\/+$/, '') : apiUrl;
71
+
72
+ return {
73
+ initialOptions,
74
+ activeNamespaces:
75
+ previousState?.activeNamespaces || new Map<string, number>(),
76
+ language: previousState?.language,
77
+ pendingLanguage: previousState?.language,
78
+ isInitialLoading: false,
79
+ isRunning: false,
80
+ };
81
+ };
@@ -0,0 +1,26 @@
1
+ export const ValueObserver = <T = any>(
2
+ initialValue: T,
3
+ valueGetter: () => T,
4
+ handler: (value: T) => void
5
+ ): ValueObserverInstance<T> => {
6
+ let previousValue: T = initialValue;
7
+ function init(value: T) {
8
+ previousValue = value;
9
+ }
10
+ function notify() {
11
+ const value = valueGetter();
12
+ if (previousValue !== value) {
13
+ handler(value);
14
+ }
15
+ previousValue = value;
16
+ }
17
+ return Object.freeze({
18
+ init,
19
+ notify,
20
+ });
21
+ };
22
+
23
+ export type ValueObserverInstance<T> = {
24
+ readonly init: (value: T) => void;
25
+ readonly notify: () => void;
26
+ };
@@ -0,0 +1,26 @@
1
+ export const ERROR_PARAM_EMPTY = 0,
2
+ ERROR_UNEXPECTED_CHAR = 1,
3
+ ERROR_UNEXPECTED_END = 2;
4
+
5
+ export type ErrorCode =
6
+ | typeof ERROR_PARAM_EMPTY
7
+ | typeof ERROR_UNEXPECTED_CHAR
8
+ | typeof ERROR_UNEXPECTED_END;
9
+
10
+ export class FormatError extends Error {
11
+ public readonly code: ErrorCode;
12
+ public readonly index: number;
13
+ constructor(code: ErrorCode, index: number, text: string) {
14
+ let error: string;
15
+ if (code === ERROR_PARAM_EMPTY) {
16
+ error = 'Empty parameter';
17
+ } else if (code === ERROR_UNEXPECTED_CHAR) {
18
+ error = 'Unexpected character';
19
+ } else {
20
+ error = 'Unexpected end';
21
+ }
22
+ super(`Tolgee parser: ${error} at ${index} in "${text}"`);
23
+ this.code = code;
24
+ this.index = index;
25
+ }
26
+ }
@@ -0,0 +1,13 @@
1
+ import { formatter } from './formatter';
2
+ import { FinalFormatterInterface, TolgeePlugin } from '../types';
3
+
4
+ export function FormatSimpleCreator(): FinalFormatterInterface {
5
+ return {
6
+ format: ({ translation, params }) => formatter(translation, params),
7
+ };
8
+ }
9
+
10
+ export const FormatSimple = (): TolgeePlugin => (tolgee, tools) => {
11
+ tools.setFinalFormatter(FormatSimpleCreator());
12
+ return tolgee;
13
+ };
@@ -0,0 +1,133 @@
1
+ import {
2
+ ErrorCode,
3
+ ERROR_PARAM_EMPTY,
4
+ ERROR_UNEXPECTED_CHAR,
5
+ ERROR_UNEXPECTED_END,
6
+ FormatError,
7
+ } from './FormatError';
8
+
9
+ function isWhitespace(ch: string) {
10
+ return /\s/.test(ch);
11
+ }
12
+
13
+ const STATE_TEXT = 0,
14
+ STATE_ESCAPE_MAYBE = 1,
15
+ STATE_ESCAPE = 2,
16
+ STATE_PARAM = 3,
17
+ STATE_PARAM_AFTER = 4;
18
+
19
+ type State =
20
+ | typeof STATE_TEXT
21
+ | typeof STATE_ESCAPE_MAYBE
22
+ | typeof STATE_ESCAPE
23
+ | typeof STATE_PARAM
24
+ | typeof STATE_PARAM_AFTER;
25
+
26
+ const END_STATES = new Set<State>([
27
+ STATE_ESCAPE,
28
+ STATE_ESCAPE_MAYBE,
29
+ STATE_TEXT,
30
+ ]);
31
+ const CHAR_ESCAPE = "'";
32
+ const ESCAPABLE = new Set(['{', '}', CHAR_ESCAPE]);
33
+
34
+ const isAllowedInParam = (char: string) => {
35
+ return /[0-9a-zA-Z_]/.test(char);
36
+ };
37
+
38
+ export function formatParser(translation: string) {
39
+ let state: State = STATE_TEXT;
40
+ let text = '';
41
+ let param = '';
42
+ let ch = '';
43
+ const texts: string[] = [];
44
+ const params: string[] = [];
45
+
46
+ let i = 0;
47
+
48
+ function parsingError(code: ErrorCode): never {
49
+ throw new FormatError(code, i, translation);
50
+ }
51
+
52
+ const addText = () => {
53
+ texts.push(text);
54
+ text = '';
55
+ };
56
+
57
+ const addParamChar = () => {
58
+ if (!isAllowedInParam(ch)) {
59
+ parsingError(ERROR_UNEXPECTED_CHAR);
60
+ }
61
+ param += ch;
62
+ };
63
+
64
+ const addParam = () => {
65
+ if (param === '') {
66
+ parsingError(ERROR_PARAM_EMPTY);
67
+ }
68
+ params.push(param);
69
+ param = '';
70
+ };
71
+
72
+ for (i = 0; i < translation.length; i++) {
73
+ ch = translation[i];
74
+ switch (state) {
75
+ case STATE_TEXT:
76
+ if (ch === CHAR_ESCAPE) {
77
+ text += ch;
78
+ state = STATE_ESCAPE_MAYBE;
79
+ } else if (ch === '{') {
80
+ addText();
81
+ state = STATE_PARAM;
82
+ } else {
83
+ text += ch;
84
+ state = STATE_TEXT;
85
+ }
86
+ break;
87
+
88
+ case STATE_ESCAPE_MAYBE:
89
+ if (ESCAPABLE.has(ch)) {
90
+ text = text.slice(0, -1) + ch;
91
+ state = STATE_ESCAPE;
92
+ } else {
93
+ text += ch;
94
+ state = STATE_TEXT;
95
+ }
96
+ break;
97
+ case STATE_ESCAPE:
98
+ if (ch === CHAR_ESCAPE) {
99
+ state = STATE_TEXT;
100
+ } else {
101
+ text += ch;
102
+ state = STATE_ESCAPE;
103
+ }
104
+ break;
105
+ case STATE_PARAM:
106
+ if (ch === '}') {
107
+ addParam();
108
+ state = STATE_TEXT;
109
+ } else if (!isWhitespace(ch)) {
110
+ addParamChar();
111
+ state = STATE_PARAM;
112
+ } else if (param !== '') {
113
+ addParam();
114
+ state = STATE_PARAM_AFTER;
115
+ }
116
+
117
+ break;
118
+ case STATE_PARAM_AFTER:
119
+ if (ch == '}') {
120
+ state = STATE_TEXT;
121
+ } else if (isWhitespace(ch)) {
122
+ state = STATE_PARAM_AFTER;
123
+ } else {
124
+ parsingError(ERROR_UNEXPECTED_CHAR);
125
+ }
126
+ }
127
+ }
128
+ if (!END_STATES.has(state)) {
129
+ parsingError(ERROR_UNEXPECTED_END);
130
+ }
131
+ addText();
132
+ return [texts, params];
133
+ }