@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.
- package/dist/tolgee.cjs.js +650 -716
- package/dist/tolgee.cjs.js.map +1 -1
- package/dist/tolgee.cjs.min.js +1 -1
- package/dist/tolgee.cjs.min.js.map +1 -1
- package/dist/tolgee.esm.js +650 -716
- package/dist/tolgee.esm.js.map +1 -1
- package/dist/tolgee.esm.min.js +1 -1
- package/dist/tolgee.esm.min.js.map +1 -1
- package/dist/tolgee.esm.min.mjs +1 -1
- package/dist/tolgee.esm.min.mjs.map +1 -1
- package/dist/tolgee.esm.mjs +650 -716
- package/dist/tolgee.esm.mjs.map +1 -1
- package/dist/tolgee.umd.js +650 -716
- package/dist/tolgee.umd.js.map +1 -1
- package/dist/tolgee.umd.min.js +1 -1
- package/dist/tolgee.umd.min.js.map +1 -1
- package/lib/Controller/Cache/Cache.d.ts +14 -14
- package/lib/Controller/Controller.d.ts +23 -23
- package/lib/Controller/Events/EventEmitter.d.ts +1 -1
- package/lib/Controller/Events/EventEmitterSelective.d.ts +1 -1
- package/lib/Controller/Events/Events.d.ts +2 -2
- package/lib/Controller/Plugins/Plugins.d.ts +17 -17
- package/lib/Controller/State/State.d.ts +20 -20
- package/lib/Controller/State/initState.d.ts +1 -1
- package/lib/TolgeeCore.d.ts +2 -2
- package/lib/helpers.d.ts +2 -2
- package/package.json +2 -2
- package/src/Controller/Cache/Cache.ts +175 -193
- package/src/Controller/Controller.ts +105 -114
- package/src/Controller/Events/EventEmitter.ts +21 -22
- package/src/Controller/Events/EventEmitterSelective.ts +59 -58
- package/src/Controller/Events/Events.ts +41 -52
- package/src/Controller/Plugins/Plugins.ts +206 -219
- package/src/Controller/State/State.ts +135 -152
- package/src/Controller/State/initState.ts +3 -3
- package/src/Controller/ValueObserver.ts +11 -12
- package/src/TolgeeCore.ts +7 -7
- package/src/__test/cache.test.ts +3 -2
- 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
|
|
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
|
-
|
|
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({
|
|
87
|
-
|
|
77
|
+
return self.formatTranslation({
|
|
78
|
+
...props,
|
|
79
|
+
translation,
|
|
80
|
+
formatEnabled: true,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
88
83
|
|
|
89
|
-
|
|
84
|
+
function setObserver(observer: ObserverMiddleware | undefined) {
|
|
90
85
|
instances.observer = observer?.();
|
|
91
|
-
}
|
|
86
|
+
}
|
|
92
87
|
|
|
93
|
-
|
|
88
|
+
function hasObserver() {
|
|
94
89
|
return Boolean(instances.observer);
|
|
95
|
-
}
|
|
90
|
+
}
|
|
96
91
|
|
|
97
|
-
|
|
92
|
+
function addFormatter(formatter: FormatterMiddleware | undefined) {
|
|
98
93
|
if (formatter) {
|
|
99
94
|
instances.formatters.push(formatter);
|
|
100
95
|
}
|
|
101
|
-
}
|
|
96
|
+
}
|
|
102
97
|
|
|
103
|
-
|
|
104
|
-
formatter: FinalFormatterMiddleware | undefined
|
|
105
|
-
) => {
|
|
98
|
+
function setFinalFormatter(formatter: FinalFormatterMiddleware | undefined) {
|
|
106
99
|
instances.finalFormatter = formatter;
|
|
107
|
-
}
|
|
100
|
+
}
|
|
108
101
|
|
|
109
|
-
|
|
102
|
+
function setUi(ui: UiMiddleware | undefined) {
|
|
110
103
|
plugins.ui = ui as UiMiddleware;
|
|
111
|
-
}
|
|
104
|
+
}
|
|
112
105
|
|
|
113
|
-
|
|
106
|
+
function hasUi() {
|
|
114
107
|
return Boolean(plugins.ui);
|
|
115
|
-
}
|
|
108
|
+
}
|
|
116
109
|
|
|
117
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
132
|
+
function addBackend(backend: BackendMiddleware | undefined) {
|
|
169
133
|
if (backend) {
|
|
170
134
|
instances.backends.push(backend);
|
|
171
135
|
}
|
|
172
|
-
}
|
|
136
|
+
}
|
|
173
137
|
|
|
174
|
-
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
-
|
|
330
|
-
|
|
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>;
|