@tolgee/core 5.8.0 → 5.8.2

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 (39) hide show
  1. package/dist/tolgee.cjs.js +650 -716
  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 +650 -716
  6. package/dist/tolgee.esm.js.map +1 -1
  7. package/dist/tolgee.esm.min.js +1 -1
  8. package/dist/tolgee.esm.min.js.map +1 -1
  9. package/dist/tolgee.esm.min.mjs +1 -1
  10. package/dist/tolgee.esm.min.mjs.map +1 -1
  11. package/dist/tolgee.esm.mjs +650 -716
  12. package/dist/tolgee.esm.mjs.map +1 -1
  13. package/dist/tolgee.umd.js +650 -716
  14. package/dist/tolgee.umd.js.map +1 -1
  15. package/dist/tolgee.umd.min.js +1 -1
  16. package/dist/tolgee.umd.min.js.map +1 -1
  17. package/lib/Controller/Cache/Cache.d.ts +14 -14
  18. package/lib/Controller/Controller.d.ts +23 -23
  19. package/lib/Controller/Events/EventEmitter.d.ts +1 -1
  20. package/lib/Controller/Events/EventEmitterSelective.d.ts +1 -1
  21. package/lib/Controller/Events/Events.d.ts +2 -2
  22. package/lib/Controller/Plugins/Plugins.d.ts +17 -17
  23. package/lib/Controller/State/State.d.ts +20 -20
  24. package/lib/Controller/State/initState.d.ts +1 -1
  25. package/lib/TolgeeCore.d.ts +2 -2
  26. package/lib/helpers.d.ts +2 -2
  27. package/package.json +2 -2
  28. package/src/Controller/Cache/Cache.ts +175 -193
  29. package/src/Controller/Controller.ts +105 -114
  30. package/src/Controller/Events/EventEmitter.ts +21 -22
  31. package/src/Controller/Events/EventEmitterSelective.ts +59 -58
  32. package/src/Controller/Events/Events.ts +41 -52
  33. package/src/Controller/Plugins/Plugins.ts +206 -219
  34. package/src/Controller/State/State.ts +135 -152
  35. package/src/Controller/State/initState.ts +3 -3
  36. package/src/Controller/ValueObserver.ts +11 -12
  37. package/src/TolgeeCore.ts +7 -7
  38. package/src/__test/cache.test.ts +3 -2
  39. package/src/helpers.ts +6 -5
@@ -25,14 +25,14 @@ import {
25
25
  } from '../../types';
26
26
  import { DEFAULT_FORMAT_ERROR } from '../State/initState';
27
27
 
28
- export const Plugins = (
28
+ export function Plugins(
29
29
  getLanguage: () => string | undefined,
30
30
  getInitialOptions: () => TolgeeOptionsInternal,
31
31
  getAvailableLanguages: () => string[] | undefined,
32
32
  getTranslationNs: (props: KeyAndNamespacesInternal) => string[],
33
33
  getTranslation: (props: KeyAndNamespacesInternal) => string | undefined,
34
34
  changeTranslation: ChangeTranslationInterface
35
- ) => {
35
+ ) {
36
36
  const plugins = {
37
37
  ui: undefined as UiMiddleware | undefined,
38
38
  };
@@ -65,80 +65,59 @@ export const Plugins = (
65
65
  instances.ui?.handleElementClick(withNs, event);
66
66
  };
67
67
 
68
- const stop = () => {
69
- instances.ui = undefined;
70
- instances.observer?.stop();
71
- };
72
-
73
- const highlight: HighlightInterface = (key, ns) => {
74
- return instances.observer?.highlight?.(key, ns) || { unhighlight() {} };
75
- };
76
-
77
68
  const findPositions: FindPositionsInterface = (key, ns) => {
78
69
  return instances.observer?.findPositions(key, ns) || [];
79
70
  };
80
71
 
81
- const translate = (props: TranslatePropsInternal) => {
72
+ function translate(props: TranslatePropsInternal) {
82
73
  const translation = getTranslation({
83
74
  key: props.key,
84
75
  ns: props.ns,
85
76
  });
86
- return formatTranslation({ ...props, translation, formatEnabled: true });
87
- };
77
+ return self.formatTranslation({
78
+ ...props,
79
+ translation,
80
+ formatEnabled: true,
81
+ });
82
+ }
88
83
 
89
- const setObserver = (observer: ObserverMiddleware | undefined) => {
84
+ function setObserver(observer: ObserverMiddleware | undefined) {
90
85
  instances.observer = observer?.();
91
- };
86
+ }
92
87
 
93
- const hasObserver = () => {
88
+ function hasObserver() {
94
89
  return Boolean(instances.observer);
95
- };
90
+ }
96
91
 
97
- const addFormatter = (formatter: FormatterMiddleware | undefined) => {
92
+ function addFormatter(formatter: FormatterMiddleware | undefined) {
98
93
  if (formatter) {
99
94
  instances.formatters.push(formatter);
100
95
  }
101
- };
96
+ }
102
97
 
103
- const setFinalFormatter = (
104
- formatter: FinalFormatterMiddleware | undefined
105
- ) => {
98
+ function setFinalFormatter(formatter: FinalFormatterMiddleware | undefined) {
106
99
  instances.finalFormatter = formatter;
107
- };
100
+ }
108
101
 
109
- const setUi = (ui: UiMiddleware | undefined) => {
102
+ function setUi(ui: UiMiddleware | undefined) {
110
103
  plugins.ui = ui as UiMiddleware;
111
- };
104
+ }
112
105
 
113
- const hasUi = () => {
106
+ function hasUi() {
114
107
  return Boolean(plugins.ui);
115
- };
108
+ }
116
109
 
117
- const setLanguageStorage = (
118
- storage: LanguageStorageMiddleware | undefined
119
- ) => {
110
+ function setLanguageStorage(storage: LanguageStorageMiddleware | undefined) {
120
111
  instances.languageStorage = storage;
121
- };
122
-
123
- const getLanguageStorage = () => {
124
- return instances.languageStorage;
125
- };
126
-
127
- const setStoredLanguage = (language: string) => {
128
- instances.languageStorage?.setLanguage(language);
129
- };
112
+ }
130
113
 
131
- const setLanguageDetector = (
114
+ function setLanguageDetector(
132
115
  detector: LanguageDetectorMiddleware | undefined
133
- ) => {
116
+ ) {
134
117
  instances.languageDetector = detector;
135
- };
136
-
137
- const getLanguageDetector = () => {
138
- return instances.languageDetector;
139
- };
118
+ }
140
119
 
141
- const detectLanguage = () => {
120
+ function detectLanguage() {
142
121
  if (!instances.languageDetector) {
143
122
  return undefined;
144
123
  }
@@ -148,94 +127,17 @@ export const Plugins = (
148
127
  return instances.languageDetector.getLanguage({
149
128
  availableLanguages,
150
129
  });
151
- };
152
-
153
- const getInitialLanguage = () => {
154
- const availableLanguages = getAvailableLanguages();
155
- const languageOrPromise = instances.languageStorage?.getLanguage();
156
-
157
- return valueOrPromise(languageOrPromise, (language) => {
158
- if (
159
- (!availableLanguages || availableLanguages.includes(language!)) &&
160
- language
161
- ) {
162
- return language;
163
- }
164
- return detectLanguage();
165
- });
166
- };
130
+ }
167
131
 
168
- const addBackend = (backend: BackendMiddleware | undefined) => {
132
+ function addBackend(backend: BackendMiddleware | undefined) {
169
133
  if (backend) {
170
134
  instances.backends.push(backend);
171
135
  }
172
- };
136
+ }
173
137
 
174
- const setDevBackend = (backend: BackendDevMiddleware | undefined) => {
138
+ function setDevBackend(backend: BackendDevMiddleware | undefined) {
175
139
  instances.devBackend = backend;
176
- };
177
-
178
- const run = () => {
179
- const { apiKey, apiUrl, projectId, observerOptions } = getInitialOptions();
180
- instances.ui = plugins.ui?.({
181
- apiKey: apiKey!,
182
- apiUrl: apiUrl!,
183
- projectId,
184
- highlight,
185
- changeTranslation,
186
- findPositions,
187
- });
188
-
189
- instances.observer?.run({
190
- mouseHighlight: true,
191
- options: observerOptions,
192
- translate,
193
- onClick,
194
- });
195
- };
196
-
197
- const getDevBackend = () => {
198
- return instances.devBackend;
199
- };
200
-
201
- const getBackendDevRecord: BackendGetRecord = ({ language, namespace }) => {
202
- const { apiKey, apiUrl, projectId } = getInitialOptions();
203
- return instances.devBackend?.getRecord({
204
- apiKey,
205
- apiUrl,
206
- projectId,
207
- language,
208
- namespace,
209
- });
210
- };
211
-
212
- const getBackendRecord: BackendGetRecord = ({ language, namespace }) => {
213
- for (const backend of instances.backends) {
214
- const data = backend.getRecord({ language, namespace });
215
- if (isPromise(data)) {
216
- return data?.catch((e) => {
217
- // eslint-disable-next-line no-console
218
- console.error(e);
219
- return {};
220
- });
221
- }
222
- if (data !== undefined) {
223
- return data;
224
- }
225
- }
226
- return undefined;
227
- };
228
-
229
- const unwrap = (text: string): Unwrapped => {
230
- if (instances.observer) {
231
- return instances.observer?.unwrap(text);
232
- }
233
- return { text, keys: [] };
234
- };
235
-
236
- const retranslate = () => {
237
- instances.observer?.retranslate();
238
- };
140
+ }
239
141
 
240
142
  function addPlugin(tolgeeInstance: TolgeeInstance, plugin: TolgeePlugin) {
241
143
  const pluginTools = Object.freeze({
@@ -253,104 +155,189 @@ export const Plugins = (
253
155
  plugin(tolgeeInstance, pluginTools);
254
156
  }
255
157
 
256
- function formatTranslation({
257
- formatEnabled,
258
- ...props
259
- }: TranslatePropsInternal & { formatEnabled?: boolean }) {
260
- const { key, translation, defaultValue, noWrap, params, orEmpty, ns } =
261
- props;
262
- const formattableTranslation = translation || defaultValue;
263
- let result = formattableTranslation || (orEmpty ? '' : key);
264
-
265
- const language = getLanguage();
266
- const isFormatEnabled =
267
- formatEnabled || !instances.observer?.outputNotFormattable;
268
-
269
- const wrap = (result: string) => {
270
- if (instances.observer && !noWrap) {
271
- return instances.observer.wrap({
272
- key,
273
- translation: result,
274
- defaultValue,
275
- params,
276
- ns,
277
- });
158
+ const self = Object.freeze({
159
+ addPlugin,
160
+
161
+ run() {
162
+ const { apiKey, apiUrl, projectId, observerOptions } =
163
+ getInitialOptions();
164
+ instances.ui = plugins.ui?.({
165
+ apiKey: apiKey!,
166
+ apiUrl: apiUrl!,
167
+ projectId,
168
+ highlight: self.highlight,
169
+ changeTranslation,
170
+ findPositions,
171
+ });
172
+
173
+ instances.observer?.run({
174
+ mouseHighlight: true,
175
+ options: observerOptions,
176
+ translate,
177
+ onClick,
178
+ });
179
+ },
180
+
181
+ stop() {
182
+ instances.ui = undefined;
183
+ instances.observer?.stop();
184
+ },
185
+
186
+ getLanguageStorage() {
187
+ return instances.languageStorage;
188
+ },
189
+
190
+ getInitialLanguage() {
191
+ const availableLanguages = getAvailableLanguages();
192
+ const languageOrPromise = instances.languageStorage?.getLanguage();
193
+
194
+ return valueOrPromise(languageOrPromise, (language) => {
195
+ if (
196
+ (!availableLanguages || availableLanguages.includes(language!)) &&
197
+ language
198
+ ) {
199
+ return language;
200
+ }
201
+ return detectLanguage();
202
+ });
203
+ },
204
+
205
+ setStoredLanguage(language: string) {
206
+ instances.languageStorage?.setLanguage(language);
207
+ },
208
+
209
+ getDevBackend() {
210
+ return instances.devBackend;
211
+ },
212
+
213
+ getBackendRecord: (({ language, namespace }) => {
214
+ for (const backend of instances.backends) {
215
+ const data = backend.getRecord({ language, namespace });
216
+ if (isPromise(data)) {
217
+ return data?.catch((e) => {
218
+ // eslint-disable-next-line no-console
219
+ console.error(e);
220
+ return {};
221
+ });
222
+ }
223
+ if (data !== undefined) {
224
+ return data;
225
+ }
278
226
  }
279
- return result;
280
- };
227
+ return undefined;
228
+ }) as BackendGetRecord,
229
+
230
+ getBackendDevRecord: (({ language, namespace }) => {
231
+ const { apiKey, apiUrl, projectId } = getInitialOptions();
232
+ return instances.devBackend?.getRecord({
233
+ apiKey,
234
+ apiUrl,
235
+ projectId,
236
+ language,
237
+ namespace,
238
+ });
239
+ }) as BackendGetRecord,
240
+
241
+ getLanguageDetector() {
242
+ return instances.languageDetector;
243
+ },
244
+
245
+ retranslate() {
246
+ instances.observer?.retranslate();
247
+ },
248
+
249
+ highlight: ((key, ns) => {
250
+ return instances.observer?.highlight?.(key, ns) || { unhighlight() {} };
251
+ }) as HighlightInterface,
252
+
253
+ unwrap(text: string): Unwrapped {
254
+ if (instances.observer) {
255
+ return instances.observer?.unwrap(text);
256
+ }
257
+ return { text, keys: [] };
258
+ },
281
259
 
282
- result = wrap(result);
283
- try {
284
- if (formattableTranslation && language && isFormatEnabled) {
285
- for (const formatter of instances.formatters) {
286
- result = formatter.format({
260
+ wrap(params: WrapperWrapProps) {
261
+ if (instances.observer) {
262
+ return instances.observer?.wrap(params);
263
+ }
264
+ return params.translation;
265
+ },
266
+
267
+ hasDevBackend() {
268
+ return Boolean(self.getDevBackend());
269
+ },
270
+
271
+ formatTranslation({
272
+ formatEnabled,
273
+ ...props
274
+ }: TranslatePropsInternal & { formatEnabled?: boolean }) {
275
+ const { key, translation, defaultValue, noWrap, params, orEmpty, ns } =
276
+ props;
277
+ const formattableTranslation = translation || defaultValue;
278
+ let result = formattableTranslation || (orEmpty ? '' : key);
279
+
280
+ const language = getLanguage();
281
+ const isFormatEnabled =
282
+ formatEnabled || !instances.observer?.outputNotFormattable;
283
+
284
+ const wrap = (result: string) => {
285
+ if (instances.observer && !noWrap) {
286
+ return instances.observer.wrap({
287
+ key,
288
+ translation: result,
289
+ defaultValue,
290
+ params,
291
+ ns,
292
+ });
293
+ }
294
+ return result;
295
+ };
296
+
297
+ result = wrap(result);
298
+ try {
299
+ if (formattableTranslation && language && isFormatEnabled) {
300
+ for (const formatter of instances.formatters) {
301
+ result = formatter.format({
302
+ translation: result,
303
+ language,
304
+ params,
305
+ });
306
+ }
307
+ }
308
+ if (
309
+ instances.finalFormatter &&
310
+ formattableTranslation &&
311
+ language &&
312
+ isFormatEnabled
313
+ ) {
314
+ result = instances.finalFormatter.format({
287
315
  translation: result,
288
316
  language,
289
317
  params,
290
318
  });
291
319
  }
320
+ } catch (e: any) {
321
+ // eslint-disable-next-line no-console
322
+ console.error(e);
323
+ const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR;
324
+ const onFormatError = getInitialOptions().onFormatError;
325
+ const formatErrorType = typeof onFormatError;
326
+ if (formatErrorType === 'string') {
327
+ result = onFormatError as string;
328
+ } else if (formatErrorType === 'function') {
329
+ result = (onFormatError as FormatErrorHandler)(errorMessage, props);
330
+ } else {
331
+ result = DEFAULT_FORMAT_ERROR;
332
+ }
333
+ // wrap error message, so it's detectable
334
+ result = wrap(result);
292
335
  }
293
- if (
294
- instances.finalFormatter &&
295
- formattableTranslation &&
296
- language &&
297
- isFormatEnabled
298
- ) {
299
- result = instances.finalFormatter.format({
300
- translation: result,
301
- language,
302
- params,
303
- });
304
- }
305
- } catch (e: any) {
306
- // eslint-disable-next-line no-console
307
- console.error(e);
308
- const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR;
309
- const onFormatError = getInitialOptions().onFormatError;
310
- const formatErrorType = typeof onFormatError;
311
- if (formatErrorType === 'string') {
312
- result = onFormatError as string;
313
- } else if (formatErrorType === 'function') {
314
- result = (onFormatError as FormatErrorHandler)(errorMessage, props);
315
- } else {
316
- result = DEFAULT_FORMAT_ERROR;
317
- }
318
- // wrap error message, so it's detectable
319
- result = wrap(result);
320
- }
321
-
322
- return result;
323
- }
324
-
325
- function hasDevBackend() {
326
- return Boolean(getDevBackend());
327
- }
328
336
 
329
- const wrap = (params: WrapperWrapProps) => {
330
- if (instances.observer) {
331
- return instances.observer?.wrap(params);
332
- }
333
- return params.translation;
334
- };
335
-
336
- return Object.freeze({
337
- addPlugin,
338
- formatTranslation,
339
- getDevBackend,
340
- getBackendRecord,
341
- getBackendDevRecord,
342
- getLanguageDetector,
343
- getLanguageStorage,
344
- getInitialLanguage,
345
- setStoredLanguage,
346
- run,
347
- stop,
348
- retranslate,
349
- highlight,
350
- unwrap,
351
- wrap,
352
- hasDevBackend,
337
+ return result;
338
+ },
353
339
  });
354
- };
340
+ return self;
341
+ }
355
342
 
356
343
  export type PluginsInstance = ReturnType<typeof Plugins>;