@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
package/dist/tolgee.esm.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
function isPromise(value) {
|
|
2
2
|
return Boolean(value && typeof value.then === 'function');
|
|
3
3
|
}
|
|
4
|
-
|
|
4
|
+
function valueOrPromise(value, callback) {
|
|
5
5
|
if (isPromise(value)) {
|
|
6
6
|
return Promise.resolve(value).then(callback);
|
|
7
7
|
}
|
|
8
8
|
else {
|
|
9
9
|
return callback(value);
|
|
10
10
|
}
|
|
11
|
-
}
|
|
12
|
-
|
|
11
|
+
}
|
|
12
|
+
function missingOptionError(option) {
|
|
13
|
+
return `Tolgee: You need to specify '${option}' option`;
|
|
14
|
+
}
|
|
13
15
|
function isObject(item) {
|
|
14
16
|
return typeof item === 'object' && !Array.isArray(item) && item !== null;
|
|
15
17
|
}
|
|
@@ -48,63 +50,32 @@ function getErrorMessage(error) {
|
|
|
48
50
|
}
|
|
49
51
|
}
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
function EventEmitter(isActive) {
|
|
52
54
|
let handlers = [];
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
};
|
|
55
|
+
return Object.freeze({
|
|
56
|
+
listen(handler) {
|
|
57
|
+
const handlerWrapper = (e) => {
|
|
58
|
+
handler(e);
|
|
59
|
+
};
|
|
60
|
+
handlers.push(handlerWrapper);
|
|
61
|
+
return {
|
|
62
|
+
unsubscribe() {
|
|
63
|
+
handlers = handlers.filter((i) => handlerWrapper !== i);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
emit(data) {
|
|
68
|
+
if (isActive()) {
|
|
69
|
+
handlers.forEach((handler) => handler({ value: data }));
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
71
74
|
|
|
72
|
-
|
|
75
|
+
function EventEmitterSelective(isActive, getFallbackNs, getDefaultNs) {
|
|
73
76
|
const listeners = new Set();
|
|
74
77
|
const partialListeners = new Set();
|
|
75
|
-
|
|
76
|
-
listeners.add(handler);
|
|
77
|
-
const result = {
|
|
78
|
-
unsubscribe: () => {
|
|
79
|
-
listeners.delete(handler);
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
return result;
|
|
83
|
-
};
|
|
84
|
-
const listenSome = (handler) => {
|
|
85
|
-
const handlerWrapper = {
|
|
86
|
-
fn: (e) => {
|
|
87
|
-
handler(e);
|
|
88
|
-
},
|
|
89
|
-
namespaces: new Set(),
|
|
90
|
-
};
|
|
91
|
-
partialListeners.add(handlerWrapper);
|
|
92
|
-
const result = {
|
|
93
|
-
unsubscribe: () => {
|
|
94
|
-
partialListeners.delete(handlerWrapper);
|
|
95
|
-
},
|
|
96
|
-
subscribeNs: (ns) => {
|
|
97
|
-
getFallbackArray(ns).forEach((val) => handlerWrapper.namespaces.add(val));
|
|
98
|
-
if (ns === undefined) {
|
|
99
|
-
// subscribing to default ns
|
|
100
|
-
handlerWrapper.namespaces.add(getDefaultNs());
|
|
101
|
-
}
|
|
102
|
-
return result;
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
return result;
|
|
106
|
-
};
|
|
107
|
-
const callHandlers = (ns) => {
|
|
78
|
+
function callHandlers(ns) {
|
|
108
79
|
// everything is implicitly subscribed to fallbacks
|
|
109
80
|
// as it can always fall through to it
|
|
110
81
|
const fallbackNamespaces = new Set(getFallbackNs());
|
|
@@ -115,10 +86,10 @@ const EventEmitterSelective = (isActive, getFallbackNs, getDefaultNs) => {
|
|
|
115
86
|
handler.fn({ value: undefined });
|
|
116
87
|
}
|
|
117
88
|
});
|
|
118
|
-
}
|
|
89
|
+
}
|
|
119
90
|
let queue = [];
|
|
120
91
|
// merge events in queue into one event
|
|
121
|
-
|
|
92
|
+
function solveQueue() {
|
|
122
93
|
if (queue.length === 0) {
|
|
123
94
|
return;
|
|
124
95
|
}
|
|
@@ -141,75 +112,97 @@ const EventEmitterSelective = (isActive, getFallbackNs, getDefaultNs) => {
|
|
|
141
112
|
? Array.from(namespaces.keys())
|
|
142
113
|
: undefined;
|
|
143
114
|
callHandlers(namespacesArray);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
115
|
+
}
|
|
116
|
+
return Object.freeze({
|
|
117
|
+
emit(ns, delayed) {
|
|
118
|
+
if (isActive()) {
|
|
119
|
+
queue.push(ns);
|
|
120
|
+
if (!delayed) {
|
|
121
|
+
solveQueue();
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
setTimeout(solveQueue, 0);
|
|
125
|
+
}
|
|
153
126
|
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
127
|
+
},
|
|
128
|
+
listen(handler) {
|
|
129
|
+
listeners.add(handler);
|
|
130
|
+
const result = {
|
|
131
|
+
unsubscribe: () => {
|
|
132
|
+
listeners.delete(handler);
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
return result;
|
|
136
|
+
},
|
|
137
|
+
listenSome(handler) {
|
|
138
|
+
const handlerWrapper = {
|
|
139
|
+
fn: (e) => {
|
|
140
|
+
handler(e);
|
|
141
|
+
},
|
|
142
|
+
namespaces: new Set(),
|
|
143
|
+
};
|
|
144
|
+
partialListeners.add(handlerWrapper);
|
|
145
|
+
const result = {
|
|
146
|
+
unsubscribe: () => {
|
|
147
|
+
partialListeners.delete(handlerWrapper);
|
|
148
|
+
},
|
|
149
|
+
subscribeNs: (ns) => {
|
|
150
|
+
getFallbackArray(ns).forEach((val) => handlerWrapper.namespaces.add(val));
|
|
151
|
+
if (ns === undefined) {
|
|
152
|
+
// subscribing to default ns
|
|
153
|
+
handlerWrapper.namespaces.add(getDefaultNs());
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
return result;
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
}
|
|
158
162
|
|
|
159
|
-
|
|
163
|
+
function Events(getFallbackNs, getDefaultNs) {
|
|
160
164
|
let emitterActive = true;
|
|
161
165
|
function isActive() {
|
|
162
166
|
return emitterActive;
|
|
163
167
|
}
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
};
|
|
197
|
-
function setEmitterActive(active) {
|
|
198
|
-
emitterActive = active;
|
|
199
|
-
}
|
|
200
|
-
return Object.freeze({
|
|
201
|
-
onPendingLanguageChange,
|
|
202
|
-
onLanguageChange,
|
|
203
|
-
onLoadingChange,
|
|
204
|
-
onFetchingChange,
|
|
205
|
-
onInitialLoaded,
|
|
206
|
-
onRunningChange,
|
|
207
|
-
onCacheChange,
|
|
208
|
-
onUpdate,
|
|
209
|
-
setEmitterActive,
|
|
210
|
-
on,
|
|
168
|
+
const self = Object.freeze({
|
|
169
|
+
onPendingLanguageChange: EventEmitter(isActive),
|
|
170
|
+
onLanguageChange: EventEmitter(isActive),
|
|
171
|
+
onLoadingChange: EventEmitter(isActive),
|
|
172
|
+
onFetchingChange: EventEmitter(isActive),
|
|
173
|
+
onInitialLoaded: EventEmitter(isActive),
|
|
174
|
+
onRunningChange: EventEmitter(isActive),
|
|
175
|
+
onCacheChange: EventEmitter(isActive),
|
|
176
|
+
onUpdate: EventEmitterSelective(isActive, getFallbackNs, getDefaultNs),
|
|
177
|
+
setEmitterActive(active) {
|
|
178
|
+
emitterActive = active;
|
|
179
|
+
},
|
|
180
|
+
on: ((event, handler) => {
|
|
181
|
+
switch (event) {
|
|
182
|
+
case 'pendingLanguage':
|
|
183
|
+
return self.onPendingLanguageChange.listen(handler);
|
|
184
|
+
case 'language':
|
|
185
|
+
return self.onLanguageChange.listen(handler);
|
|
186
|
+
case 'loading':
|
|
187
|
+
return self.onLoadingChange.listen(handler);
|
|
188
|
+
case 'fetching':
|
|
189
|
+
return self.onFetchingChange.listen(handler);
|
|
190
|
+
case 'initialLoad':
|
|
191
|
+
return self.onInitialLoaded.listen(handler);
|
|
192
|
+
case 'running':
|
|
193
|
+
return self.onRunningChange.listen(handler);
|
|
194
|
+
case 'cache':
|
|
195
|
+
return self.onCacheChange.listen(handler);
|
|
196
|
+
case 'update':
|
|
197
|
+
return self.onUpdate.listen(handler);
|
|
198
|
+
}
|
|
199
|
+
}),
|
|
211
200
|
});
|
|
212
|
-
|
|
201
|
+
self.onInitialLoaded.listen(() => self.onUpdate.emit());
|
|
202
|
+
self.onLanguageChange.listen(() => self.onUpdate.emit());
|
|
203
|
+
self.onCacheChange.listen(({ value }) => self.onUpdate.emit([value.namespace], true));
|
|
204
|
+
return self;
|
|
205
|
+
}
|
|
213
206
|
|
|
214
207
|
const flattenTranslations = (data) => {
|
|
215
208
|
const result = new Map();
|
|
@@ -243,29 +236,11 @@ const encodeCacheKey = ({ language, namespace, }) => {
|
|
|
243
236
|
}
|
|
244
237
|
};
|
|
245
238
|
|
|
246
|
-
|
|
239
|
+
function Cache(onCacheChange, backendGetRecord, backendGetDevRecord, withDefaultNs, isInitialLoading, fetchingObserver, loadingObserver) {
|
|
247
240
|
const asyncRequests = new Map();
|
|
248
241
|
const cache = new Map();
|
|
249
242
|
let staticData = {};
|
|
250
243
|
let version = 0;
|
|
251
|
-
function addStaticData(data) {
|
|
252
|
-
if (data) {
|
|
253
|
-
staticData = Object.assign(Object.assign({}, staticData), data);
|
|
254
|
-
Object.entries(data).forEach(([key, value]) => {
|
|
255
|
-
if (typeof value !== 'function') {
|
|
256
|
-
const descriptor = decodeCacheKey(key);
|
|
257
|
-
const existing = cache.get(key);
|
|
258
|
-
if (!existing || existing.version === 0) {
|
|
259
|
-
addRecordInternal(descriptor, value, 0);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
function invalidate() {
|
|
266
|
-
asyncRequests.clear();
|
|
267
|
-
version += 1;
|
|
268
|
-
}
|
|
269
244
|
function addRecordInternal(descriptor, data, recordVersion) {
|
|
270
245
|
const cacheKey = encodeCacheKey(descriptor);
|
|
271
246
|
cache.set(cacheKey, {
|
|
@@ -274,78 +249,6 @@ const Cache = (onCacheChange, backendGetRecord, backendGetDevRecord, withDefault
|
|
|
274
249
|
});
|
|
275
250
|
onCacheChange.emit(descriptor);
|
|
276
251
|
}
|
|
277
|
-
function addRecord(descriptor, data) {
|
|
278
|
-
addRecordInternal(descriptor, data, version);
|
|
279
|
-
}
|
|
280
|
-
function exists(descriptor, strict = false) {
|
|
281
|
-
const record = cache.get(encodeCacheKey(descriptor));
|
|
282
|
-
if (record && strict) {
|
|
283
|
-
return record.version === version;
|
|
284
|
-
}
|
|
285
|
-
return Boolean(record);
|
|
286
|
-
}
|
|
287
|
-
function getRecord(descriptor) {
|
|
288
|
-
var _a;
|
|
289
|
-
return (_a = cache.get(encodeCacheKey(withDefaultNs(descriptor)))) === null || _a === void 0 ? void 0 : _a.data;
|
|
290
|
-
}
|
|
291
|
-
function getTranslation(descriptor, key) {
|
|
292
|
-
var _a;
|
|
293
|
-
return (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
294
|
-
}
|
|
295
|
-
function getTranslationNs(namespaces, languages, key) {
|
|
296
|
-
var _a;
|
|
297
|
-
for (const namespace of namespaces) {
|
|
298
|
-
for (const language of languages) {
|
|
299
|
-
const value = (_a = cache
|
|
300
|
-
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
301
|
-
if (value !== undefined && value !== null) {
|
|
302
|
-
return [namespace];
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
return unique(namespaces);
|
|
307
|
-
}
|
|
308
|
-
function getTranslationFallback(namespaces, languages, key) {
|
|
309
|
-
var _a;
|
|
310
|
-
for (const namespace of namespaces) {
|
|
311
|
-
for (const language of languages) {
|
|
312
|
-
const value = (_a = cache
|
|
313
|
-
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
314
|
-
if (value !== undefined && value !== null) {
|
|
315
|
-
return value;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
return undefined;
|
|
320
|
-
}
|
|
321
|
-
function changeTranslation(descriptor, key, value) {
|
|
322
|
-
var _a;
|
|
323
|
-
const record = (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data;
|
|
324
|
-
record === null || record === void 0 ? void 0 : record.set(key, value);
|
|
325
|
-
onCacheChange.emit(Object.assign(Object.assign({}, descriptor), { key }));
|
|
326
|
-
}
|
|
327
|
-
function isFetching(ns) {
|
|
328
|
-
if (isInitialLoading()) {
|
|
329
|
-
return true;
|
|
330
|
-
}
|
|
331
|
-
if (ns === undefined) {
|
|
332
|
-
return asyncRequests.size > 0;
|
|
333
|
-
}
|
|
334
|
-
const namespaces = getFallbackArray(ns);
|
|
335
|
-
return Boolean(Array.from(asyncRequests.keys()).find((key) => namespaces.includes(decodeCacheKey(key).namespace)));
|
|
336
|
-
}
|
|
337
|
-
function isLoading(language, ns) {
|
|
338
|
-
const namespaces = getFallbackArray(ns);
|
|
339
|
-
return Boolean(isInitialLoading() ||
|
|
340
|
-
Array.from(asyncRequests.keys()).find((key) => {
|
|
341
|
-
const descriptor = decodeCacheKey(key);
|
|
342
|
-
return ((!namespaces.length || namespaces.includes(descriptor.namespace)) &&
|
|
343
|
-
!exists({
|
|
344
|
-
namespace: descriptor.namespace,
|
|
345
|
-
language: language,
|
|
346
|
-
}));
|
|
347
|
-
}));
|
|
348
|
-
}
|
|
349
252
|
/**
|
|
350
253
|
* Fetches production data
|
|
351
254
|
*/
|
|
@@ -378,73 +281,152 @@ const Cache = (onCacheChange, backendGetRecord, backendGetDevRecord, withDefault
|
|
|
378
281
|
}
|
|
379
282
|
return dataPromise;
|
|
380
283
|
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
284
|
+
const self = Object.freeze({
|
|
285
|
+
addStaticData(data) {
|
|
286
|
+
if (data) {
|
|
287
|
+
staticData = Object.assign(Object.assign({}, staticData), data);
|
|
288
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
289
|
+
if (typeof value !== 'function') {
|
|
290
|
+
const descriptor = decodeCacheKey(key);
|
|
291
|
+
const existing = cache.get(key);
|
|
292
|
+
if (!existing || existing.version === 0) {
|
|
293
|
+
addRecordInternal(descriptor, value, 0);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
invalidate() {
|
|
300
|
+
asyncRequests.clear();
|
|
301
|
+
version += 1;
|
|
302
|
+
},
|
|
303
|
+
addRecord(descriptor, data) {
|
|
304
|
+
addRecordInternal(descriptor, data, version);
|
|
305
|
+
},
|
|
306
|
+
exists(descriptor, strict = false) {
|
|
307
|
+
const record = cache.get(encodeCacheKey(descriptor));
|
|
308
|
+
if (record && strict) {
|
|
309
|
+
return record.version === version;
|
|
310
|
+
}
|
|
311
|
+
return Boolean(record);
|
|
312
|
+
},
|
|
313
|
+
getRecord(descriptor) {
|
|
314
|
+
var _a;
|
|
315
|
+
return (_a = cache.get(encodeCacheKey(withDefaultNs(descriptor)))) === null || _a === void 0 ? void 0 : _a.data;
|
|
316
|
+
},
|
|
317
|
+
getTranslation(descriptor, key) {
|
|
318
|
+
var _a;
|
|
319
|
+
return (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
320
|
+
},
|
|
321
|
+
getTranslationNs(namespaces, languages, key) {
|
|
322
|
+
var _a;
|
|
323
|
+
for (const namespace of namespaces) {
|
|
324
|
+
for (const language of languages) {
|
|
325
|
+
const value = (_a = cache
|
|
326
|
+
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
327
|
+
if (value !== undefined && value !== null) {
|
|
328
|
+
return [namespace];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return unique(namespaces);
|
|
333
|
+
},
|
|
334
|
+
getTranslationFallback(namespaces, languages, key) {
|
|
335
|
+
var _a;
|
|
336
|
+
for (const namespace of namespaces) {
|
|
337
|
+
for (const language of languages) {
|
|
338
|
+
const value = (_a = cache
|
|
339
|
+
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
340
|
+
if (value !== undefined && value !== null) {
|
|
341
|
+
return value;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return undefined;
|
|
346
|
+
},
|
|
347
|
+
changeTranslation(descriptor, key, value) {
|
|
348
|
+
var _a;
|
|
349
|
+
const record = (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data;
|
|
350
|
+
record === null || record === void 0 ? void 0 : record.set(key, value);
|
|
351
|
+
onCacheChange.emit(Object.assign(Object.assign({}, descriptor), { key }));
|
|
352
|
+
},
|
|
353
|
+
isFetching(ns) {
|
|
354
|
+
if (isInitialLoading()) {
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
if (ns === undefined) {
|
|
358
|
+
return asyncRequests.size > 0;
|
|
359
|
+
}
|
|
360
|
+
const namespaces = getFallbackArray(ns);
|
|
361
|
+
return Boolean(Array.from(asyncRequests.keys()).find((key) => namespaces.includes(decodeCacheKey(key).namespace)));
|
|
362
|
+
},
|
|
363
|
+
isLoading(language, ns) {
|
|
364
|
+
const namespaces = getFallbackArray(ns);
|
|
365
|
+
return Boolean(isInitialLoading() ||
|
|
366
|
+
Array.from(asyncRequests.keys()).find((key) => {
|
|
367
|
+
const descriptor = decodeCacheKey(key);
|
|
368
|
+
return ((!namespaces.length ||
|
|
369
|
+
namespaces.includes(descriptor.namespace)) &&
|
|
370
|
+
!self.exists({
|
|
371
|
+
namespace: descriptor.namespace,
|
|
372
|
+
language: language,
|
|
373
|
+
}));
|
|
374
|
+
}));
|
|
375
|
+
},
|
|
376
|
+
async loadRecords(descriptors, isDev) {
|
|
377
|
+
const withPromises = descriptors.map((descriptor) => {
|
|
378
|
+
const keyObject = withDefaultNs(descriptor);
|
|
379
|
+
const cacheKey = encodeCacheKey(keyObject);
|
|
380
|
+
const existingPromise = asyncRequests.get(cacheKey);
|
|
381
|
+
if (existingPromise) {
|
|
382
|
+
return {
|
|
383
|
+
new: false,
|
|
384
|
+
promise: existingPromise,
|
|
385
|
+
keyObject,
|
|
386
|
+
cacheKey,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
const dataPromise = fetchData(keyObject, isDev) || Promise.resolve(undefined);
|
|
390
|
+
asyncRequests.set(cacheKey, dataPromise);
|
|
387
391
|
return {
|
|
388
|
-
new:
|
|
389
|
-
promise:
|
|
392
|
+
new: true,
|
|
393
|
+
promise: dataPromise,
|
|
390
394
|
keyObject,
|
|
391
395
|
cacheKey,
|
|
392
396
|
};
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
promise
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
asyncRequests.delete(value.cacheKey);
|
|
412
|
-
const data = results[i];
|
|
413
|
-
if (data) {
|
|
414
|
-
addRecord(value.keyObject, data);
|
|
415
|
-
}
|
|
416
|
-
else if (!getRecord(value.keyObject)) {
|
|
417
|
-
// if no data exist, put empty object
|
|
418
|
-
addRecord(value.keyObject, {});
|
|
397
|
+
});
|
|
398
|
+
fetchingObserver.notify();
|
|
399
|
+
loadingObserver.notify();
|
|
400
|
+
const results = await Promise.all(withPromises.map((val) => val.promise));
|
|
401
|
+
withPromises.forEach((value, i) => {
|
|
402
|
+
const promiseChanged = asyncRequests.get(value.cacheKey) !== value.promise;
|
|
403
|
+
// if promise has changed in between, it means cache been invalidated or
|
|
404
|
+
// new data are being fetched
|
|
405
|
+
if (value.new && !promiseChanged) {
|
|
406
|
+
asyncRequests.delete(value.cacheKey);
|
|
407
|
+
const data = results[i];
|
|
408
|
+
if (data) {
|
|
409
|
+
self.addRecord(value.keyObject, data);
|
|
410
|
+
}
|
|
411
|
+
else if (!self.getRecord(value.keyObject)) {
|
|
412
|
+
// if no data exist, put empty object
|
|
413
|
+
self.addRecord(value.keyObject, {});
|
|
414
|
+
}
|
|
419
415
|
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
return Object.freeze({
|
|
433
|
-
addStaticData,
|
|
434
|
-
invalidate,
|
|
435
|
-
addRecord,
|
|
436
|
-
exists,
|
|
437
|
-
getRecord,
|
|
438
|
-
getTranslation,
|
|
439
|
-
getTranslationNs,
|
|
440
|
-
getTranslationFallback,
|
|
441
|
-
changeTranslation,
|
|
442
|
-
isFetching,
|
|
443
|
-
isLoading,
|
|
444
|
-
loadRecords,
|
|
445
|
-
getAllRecords,
|
|
416
|
+
});
|
|
417
|
+
fetchingObserver.notify();
|
|
418
|
+
loadingObserver.notify();
|
|
419
|
+
return withPromises.map((val) => self.getRecord(val.keyObject));
|
|
420
|
+
},
|
|
421
|
+
getAllRecords() {
|
|
422
|
+
const entries = Array.from(cache.entries());
|
|
423
|
+
return entries.map(([key, entry]) => {
|
|
424
|
+
return Object.assign(Object.assign({}, decodeCacheKey(key)), { data: entry.data });
|
|
425
|
+
});
|
|
426
|
+
},
|
|
446
427
|
});
|
|
447
|
-
|
|
428
|
+
return self;
|
|
429
|
+
}
|
|
448
430
|
|
|
449
431
|
/******************************************************************************
|
|
450
432
|
Copyright (c) Microsoft Corporation.
|
|
@@ -505,7 +487,7 @@ const combineOptions = (...states) => {
|
|
|
505
487
|
});
|
|
506
488
|
return result;
|
|
507
489
|
};
|
|
508
|
-
|
|
490
|
+
function initState(options, previousState) {
|
|
509
491
|
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options);
|
|
510
492
|
// remove extra '/' from url end
|
|
511
493
|
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl);
|
|
@@ -517,9 +499,9 @@ const initState = (options, previousState) => {
|
|
|
517
499
|
isInitialLoading: false,
|
|
518
500
|
isRunning: false,
|
|
519
501
|
};
|
|
520
|
-
}
|
|
502
|
+
}
|
|
521
503
|
|
|
522
|
-
|
|
504
|
+
function Plugins(getLanguage, getInitialOptions, getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation) {
|
|
523
505
|
const plugins = {
|
|
524
506
|
ui: undefined,
|
|
525
507
|
};
|
|
@@ -548,63 +530,44 @@ const Plugins = (getLanguage, getInitialOptions, getAvailableLanguages, getTrans
|
|
|
548
530
|
});
|
|
549
531
|
(_a = instances.ui) === null || _a === void 0 ? void 0 : _a.handleElementClick(withNs, event);
|
|
550
532
|
};
|
|
551
|
-
const stop = () => {
|
|
552
|
-
var _a;
|
|
553
|
-
instances.ui = undefined;
|
|
554
|
-
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.stop();
|
|
555
|
-
};
|
|
556
|
-
const highlight = (key, ns) => {
|
|
557
|
-
var _a, _b;
|
|
558
|
-
return ((_b = (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.highlight) === null || _b === void 0 ? void 0 : _b.call(_a, key, ns)) || { unhighlight() { } };
|
|
559
|
-
};
|
|
560
533
|
const findPositions = (key, ns) => {
|
|
561
534
|
var _a;
|
|
562
535
|
return ((_a = instances.observer) === null || _a === void 0 ? void 0 : _a.findPositions(key, ns)) || [];
|
|
563
536
|
};
|
|
564
|
-
|
|
537
|
+
function translate(props) {
|
|
565
538
|
const translation = getTranslation({
|
|
566
539
|
key: props.key,
|
|
567
540
|
ns: props.ns,
|
|
568
541
|
});
|
|
569
|
-
return formatTranslation(Object.assign(Object.assign({}, props), { translation, formatEnabled: true }));
|
|
570
|
-
}
|
|
571
|
-
|
|
542
|
+
return self.formatTranslation(Object.assign(Object.assign({}, props), { translation, formatEnabled: true }));
|
|
543
|
+
}
|
|
544
|
+
function setObserver(observer) {
|
|
572
545
|
instances.observer = observer === null || observer === void 0 ? void 0 : observer();
|
|
573
|
-
}
|
|
574
|
-
|
|
546
|
+
}
|
|
547
|
+
function hasObserver() {
|
|
575
548
|
return Boolean(instances.observer);
|
|
576
|
-
}
|
|
577
|
-
|
|
549
|
+
}
|
|
550
|
+
function addFormatter(formatter) {
|
|
578
551
|
if (formatter) {
|
|
579
552
|
instances.formatters.push(formatter);
|
|
580
553
|
}
|
|
581
|
-
}
|
|
582
|
-
|
|
554
|
+
}
|
|
555
|
+
function setFinalFormatter(formatter) {
|
|
583
556
|
instances.finalFormatter = formatter;
|
|
584
|
-
}
|
|
585
|
-
|
|
557
|
+
}
|
|
558
|
+
function setUi(ui) {
|
|
586
559
|
plugins.ui = ui;
|
|
587
|
-
}
|
|
588
|
-
|
|
560
|
+
}
|
|
561
|
+
function hasUi() {
|
|
589
562
|
return Boolean(plugins.ui);
|
|
590
|
-
}
|
|
591
|
-
|
|
563
|
+
}
|
|
564
|
+
function setLanguageStorage(storage) {
|
|
592
565
|
instances.languageStorage = storage;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
return instances.languageStorage;
|
|
596
|
-
};
|
|
597
|
-
const setStoredLanguage = (language) => {
|
|
598
|
-
var _a;
|
|
599
|
-
(_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.setLanguage(language);
|
|
600
|
-
};
|
|
601
|
-
const setLanguageDetector = (detector) => {
|
|
566
|
+
}
|
|
567
|
+
function setLanguageDetector(detector) {
|
|
602
568
|
instances.languageDetector = detector;
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
return instances.languageDetector;
|
|
606
|
-
};
|
|
607
|
-
const detectLanguage = () => {
|
|
569
|
+
}
|
|
570
|
+
function detectLanguage() {
|
|
608
571
|
if (!instances.languageDetector) {
|
|
609
572
|
return undefined;
|
|
610
573
|
}
|
|
@@ -612,86 +575,15 @@ const Plugins = (getLanguage, getInitialOptions, getAvailableLanguages, getTrans
|
|
|
612
575
|
return instances.languageDetector.getLanguage({
|
|
613
576
|
availableLanguages,
|
|
614
577
|
});
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
var _a;
|
|
618
|
-
const availableLanguages = getAvailableLanguages();
|
|
619
|
-
const languageOrPromise = (_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.getLanguage();
|
|
620
|
-
return valueOrPromise(languageOrPromise, (language) => {
|
|
621
|
-
if ((!availableLanguages || availableLanguages.includes(language)) &&
|
|
622
|
-
language) {
|
|
623
|
-
return language;
|
|
624
|
-
}
|
|
625
|
-
return detectLanguage();
|
|
626
|
-
});
|
|
627
|
-
};
|
|
628
|
-
const addBackend = (backend) => {
|
|
578
|
+
}
|
|
579
|
+
function addBackend(backend) {
|
|
629
580
|
if (backend) {
|
|
630
581
|
instances.backends.push(backend);
|
|
631
582
|
}
|
|
632
|
-
}
|
|
633
|
-
|
|
583
|
+
}
|
|
584
|
+
function setDevBackend(backend) {
|
|
634
585
|
instances.devBackend = backend;
|
|
635
|
-
}
|
|
636
|
-
const run = () => {
|
|
637
|
-
var _a, _b;
|
|
638
|
-
const { apiKey, apiUrl, projectId, observerOptions } = getInitialOptions();
|
|
639
|
-
instances.ui = (_a = plugins.ui) === null || _a === void 0 ? void 0 : _a.call(plugins, {
|
|
640
|
-
apiKey: apiKey,
|
|
641
|
-
apiUrl: apiUrl,
|
|
642
|
-
projectId,
|
|
643
|
-
highlight,
|
|
644
|
-
changeTranslation,
|
|
645
|
-
findPositions,
|
|
646
|
-
});
|
|
647
|
-
(_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({
|
|
648
|
-
mouseHighlight: true,
|
|
649
|
-
options: observerOptions,
|
|
650
|
-
translate,
|
|
651
|
-
onClick,
|
|
652
|
-
});
|
|
653
|
-
};
|
|
654
|
-
const getDevBackend = () => {
|
|
655
|
-
return instances.devBackend;
|
|
656
|
-
};
|
|
657
|
-
const getBackendDevRecord = ({ language, namespace }) => {
|
|
658
|
-
var _a;
|
|
659
|
-
const { apiKey, apiUrl, projectId } = getInitialOptions();
|
|
660
|
-
return (_a = instances.devBackend) === null || _a === void 0 ? void 0 : _a.getRecord({
|
|
661
|
-
apiKey,
|
|
662
|
-
apiUrl,
|
|
663
|
-
projectId,
|
|
664
|
-
language,
|
|
665
|
-
namespace,
|
|
666
|
-
});
|
|
667
|
-
};
|
|
668
|
-
const getBackendRecord = ({ language, namespace }) => {
|
|
669
|
-
for (const backend of instances.backends) {
|
|
670
|
-
const data = backend.getRecord({ language, namespace });
|
|
671
|
-
if (isPromise(data)) {
|
|
672
|
-
return data === null || data === void 0 ? void 0 : data.catch((e) => {
|
|
673
|
-
// eslint-disable-next-line no-console
|
|
674
|
-
console.error(e);
|
|
675
|
-
return {};
|
|
676
|
-
});
|
|
677
|
-
}
|
|
678
|
-
if (data !== undefined) {
|
|
679
|
-
return data;
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
return undefined;
|
|
683
|
-
};
|
|
684
|
-
const unwrap = (text) => {
|
|
685
|
-
var _a;
|
|
686
|
-
if (instances.observer) {
|
|
687
|
-
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.unwrap(text);
|
|
688
|
-
}
|
|
689
|
-
return { text, keys: [] };
|
|
690
|
-
};
|
|
691
|
-
const retranslate = () => {
|
|
692
|
-
var _a;
|
|
693
|
-
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.retranslate();
|
|
694
|
-
};
|
|
586
|
+
}
|
|
695
587
|
function addPlugin(tolgeeInstance, plugin) {
|
|
696
588
|
const pluginTools = Object.freeze({
|
|
697
589
|
setFinalFormatter,
|
|
@@ -707,252 +599,308 @@ const Plugins = (getLanguage, getInitialOptions, getAvailableLanguages, getTrans
|
|
|
707
599
|
});
|
|
708
600
|
plugin(tolgeeInstance, pluginTools);
|
|
709
601
|
}
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
602
|
+
const self = Object.freeze({
|
|
603
|
+
addPlugin,
|
|
604
|
+
run() {
|
|
605
|
+
var _a, _b;
|
|
606
|
+
const { apiKey, apiUrl, projectId, observerOptions } = getInitialOptions();
|
|
607
|
+
instances.ui = (_a = plugins.ui) === null || _a === void 0 ? void 0 : _a.call(plugins, {
|
|
608
|
+
apiKey: apiKey,
|
|
609
|
+
apiUrl: apiUrl,
|
|
610
|
+
projectId,
|
|
611
|
+
highlight: self.highlight,
|
|
612
|
+
changeTranslation,
|
|
613
|
+
findPositions,
|
|
614
|
+
});
|
|
615
|
+
(_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({
|
|
616
|
+
mouseHighlight: true,
|
|
617
|
+
options: observerOptions,
|
|
618
|
+
translate,
|
|
619
|
+
onClick,
|
|
620
|
+
});
|
|
621
|
+
},
|
|
622
|
+
stop() {
|
|
623
|
+
var _a;
|
|
624
|
+
instances.ui = undefined;
|
|
625
|
+
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.stop();
|
|
626
|
+
},
|
|
627
|
+
getLanguageStorage() {
|
|
628
|
+
return instances.languageStorage;
|
|
629
|
+
},
|
|
630
|
+
getInitialLanguage() {
|
|
631
|
+
var _a;
|
|
632
|
+
const availableLanguages = getAvailableLanguages();
|
|
633
|
+
const languageOrPromise = (_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.getLanguage();
|
|
634
|
+
return valueOrPromise(languageOrPromise, (language) => {
|
|
635
|
+
if ((!availableLanguages || availableLanguages.includes(language)) &&
|
|
636
|
+
language) {
|
|
637
|
+
return language;
|
|
638
|
+
}
|
|
639
|
+
return detectLanguage();
|
|
640
|
+
});
|
|
641
|
+
},
|
|
642
|
+
setStoredLanguage(language) {
|
|
643
|
+
var _a;
|
|
644
|
+
(_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.setLanguage(language);
|
|
645
|
+
},
|
|
646
|
+
getDevBackend() {
|
|
647
|
+
return instances.devBackend;
|
|
648
|
+
},
|
|
649
|
+
getBackendRecord: (({ language, namespace }) => {
|
|
650
|
+
for (const backend of instances.backends) {
|
|
651
|
+
const data = backend.getRecord({ language, namespace });
|
|
652
|
+
if (isPromise(data)) {
|
|
653
|
+
return data === null || data === void 0 ? void 0 : data.catch((e) => {
|
|
654
|
+
// eslint-disable-next-line no-console
|
|
655
|
+
console.error(e);
|
|
656
|
+
return {};
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
if (data !== undefined) {
|
|
660
|
+
return data;
|
|
661
|
+
}
|
|
727
662
|
}
|
|
728
|
-
return
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
663
|
+
return undefined;
|
|
664
|
+
}),
|
|
665
|
+
getBackendDevRecord: (({ language, namespace }) => {
|
|
666
|
+
var _a;
|
|
667
|
+
const { apiKey, apiUrl, projectId } = getInitialOptions();
|
|
668
|
+
return (_a = instances.devBackend) === null || _a === void 0 ? void 0 : _a.getRecord({
|
|
669
|
+
apiKey,
|
|
670
|
+
apiUrl,
|
|
671
|
+
projectId,
|
|
672
|
+
language,
|
|
673
|
+
namespace,
|
|
674
|
+
});
|
|
675
|
+
}),
|
|
676
|
+
getLanguageDetector() {
|
|
677
|
+
return instances.languageDetector;
|
|
678
|
+
},
|
|
679
|
+
retranslate() {
|
|
680
|
+
var _a;
|
|
681
|
+
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.retranslate();
|
|
682
|
+
},
|
|
683
|
+
highlight: ((key, ns) => {
|
|
684
|
+
var _a, _b;
|
|
685
|
+
return ((_b = (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.highlight) === null || _b === void 0 ? void 0 : _b.call(_a, key, ns)) || { unhighlight() { } };
|
|
686
|
+
}),
|
|
687
|
+
unwrap(text) {
|
|
688
|
+
var _a;
|
|
689
|
+
if (instances.observer) {
|
|
690
|
+
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.unwrap(text);
|
|
691
|
+
}
|
|
692
|
+
return { text, keys: [] };
|
|
693
|
+
},
|
|
694
|
+
wrap(params) {
|
|
695
|
+
var _a;
|
|
696
|
+
if (instances.observer) {
|
|
697
|
+
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.wrap(params);
|
|
698
|
+
}
|
|
699
|
+
return params.translation;
|
|
700
|
+
},
|
|
701
|
+
hasDevBackend() {
|
|
702
|
+
return Boolean(self.getDevBackend());
|
|
703
|
+
},
|
|
704
|
+
formatTranslation(_a) {
|
|
705
|
+
var _b;
|
|
706
|
+
var { formatEnabled } = _a, props = __rest(_a, ["formatEnabled"]);
|
|
707
|
+
const { key, translation, defaultValue, noWrap, params, orEmpty, ns } = props;
|
|
708
|
+
const formattableTranslation = translation || defaultValue;
|
|
709
|
+
let result = formattableTranslation || (orEmpty ? '' : key);
|
|
710
|
+
const language = getLanguage();
|
|
711
|
+
const isFormatEnabled = formatEnabled || !((_b = instances.observer) === null || _b === void 0 ? void 0 : _b.outputNotFormattable);
|
|
712
|
+
const wrap = (result) => {
|
|
713
|
+
if (instances.observer && !noWrap) {
|
|
714
|
+
return instances.observer.wrap({
|
|
715
|
+
key,
|
|
716
|
+
translation: result,
|
|
717
|
+
defaultValue,
|
|
718
|
+
params,
|
|
719
|
+
ns,
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
return result;
|
|
723
|
+
};
|
|
724
|
+
result = wrap(result);
|
|
725
|
+
try {
|
|
726
|
+
if (formattableTranslation && language && isFormatEnabled) {
|
|
727
|
+
for (const formatter of instances.formatters) {
|
|
728
|
+
result = formatter.format({
|
|
729
|
+
translation: result,
|
|
730
|
+
language,
|
|
731
|
+
params,
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
if (instances.finalFormatter &&
|
|
736
|
+
formattableTranslation &&
|
|
737
|
+
language &&
|
|
738
|
+
isFormatEnabled) {
|
|
739
|
+
result = instances.finalFormatter.format({
|
|
735
740
|
translation: result,
|
|
736
741
|
language,
|
|
737
742
|
params,
|
|
738
743
|
});
|
|
739
744
|
}
|
|
740
745
|
}
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
if (formatErrorType === 'string') {
|
|
759
|
-
result = onFormatError;
|
|
760
|
-
}
|
|
761
|
-
else if (formatErrorType === 'function') {
|
|
762
|
-
result = onFormatError(errorMessage, props);
|
|
763
|
-
}
|
|
764
|
-
else {
|
|
765
|
-
result = DEFAULT_FORMAT_ERROR;
|
|
746
|
+
catch (e) {
|
|
747
|
+
// eslint-disable-next-line no-console
|
|
748
|
+
console.error(e);
|
|
749
|
+
const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR;
|
|
750
|
+
const onFormatError = getInitialOptions().onFormatError;
|
|
751
|
+
const formatErrorType = typeof onFormatError;
|
|
752
|
+
if (formatErrorType === 'string') {
|
|
753
|
+
result = onFormatError;
|
|
754
|
+
}
|
|
755
|
+
else if (formatErrorType === 'function') {
|
|
756
|
+
result = onFormatError(errorMessage, props);
|
|
757
|
+
}
|
|
758
|
+
else {
|
|
759
|
+
result = DEFAULT_FORMAT_ERROR;
|
|
760
|
+
}
|
|
761
|
+
// wrap error message, so it's detectable
|
|
762
|
+
result = wrap(result);
|
|
766
763
|
}
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
}
|
|
770
|
-
return result;
|
|
771
|
-
}
|
|
772
|
-
function hasDevBackend() {
|
|
773
|
-
return Boolean(getDevBackend());
|
|
774
|
-
}
|
|
775
|
-
const wrap = (params) => {
|
|
776
|
-
var _a;
|
|
777
|
-
if (instances.observer) {
|
|
778
|
-
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.wrap(params);
|
|
779
|
-
}
|
|
780
|
-
return params.translation;
|
|
781
|
-
};
|
|
782
|
-
return Object.freeze({
|
|
783
|
-
addPlugin,
|
|
784
|
-
formatTranslation,
|
|
785
|
-
getDevBackend,
|
|
786
|
-
getBackendRecord,
|
|
787
|
-
getBackendDevRecord,
|
|
788
|
-
getLanguageDetector,
|
|
789
|
-
getLanguageStorage,
|
|
790
|
-
getInitialLanguage,
|
|
791
|
-
setStoredLanguage,
|
|
792
|
-
run,
|
|
793
|
-
stop,
|
|
794
|
-
retranslate,
|
|
795
|
-
highlight,
|
|
796
|
-
unwrap,
|
|
797
|
-
wrap,
|
|
798
|
-
hasDevBackend,
|
|
764
|
+
return result;
|
|
765
|
+
},
|
|
799
766
|
});
|
|
800
|
-
|
|
767
|
+
return self;
|
|
768
|
+
}
|
|
801
769
|
|
|
802
770
|
const ValueObserver = (initialValue, valueGetter, handler) => {
|
|
803
771
|
let previousValue = initialValue;
|
|
804
|
-
function init(value) {
|
|
805
|
-
previousValue = value;
|
|
806
|
-
}
|
|
807
|
-
function notify() {
|
|
808
|
-
const value = valueGetter();
|
|
809
|
-
if (previousValue !== value) {
|
|
810
|
-
handler(value);
|
|
811
|
-
}
|
|
812
|
-
previousValue = value;
|
|
813
|
-
}
|
|
814
772
|
return Object.freeze({
|
|
815
|
-
init
|
|
816
|
-
|
|
773
|
+
init(value) {
|
|
774
|
+
previousValue = value;
|
|
775
|
+
},
|
|
776
|
+
notify() {
|
|
777
|
+
const value = valueGetter();
|
|
778
|
+
if (previousValue !== value) {
|
|
779
|
+
handler(value);
|
|
780
|
+
}
|
|
781
|
+
previousValue = value;
|
|
782
|
+
},
|
|
817
783
|
});
|
|
818
784
|
};
|
|
819
785
|
|
|
820
|
-
|
|
786
|
+
function State(onLanguageChange, onPendingLanguageChange, onRunningChange) {
|
|
821
787
|
let state = initState();
|
|
822
788
|
let devCredentials = undefined;
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
state.isRunning
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
}
|
|
835
|
-
function isInitialLoading() {
|
|
836
|
-
return state.isInitialLoading;
|
|
837
|
-
}
|
|
838
|
-
function setInitialLoading(value) {
|
|
839
|
-
state.isInitialLoading = value;
|
|
840
|
-
}
|
|
841
|
-
function getLanguage() {
|
|
842
|
-
return state.language || state.initialOptions.language;
|
|
843
|
-
}
|
|
844
|
-
function setLanguage(language) {
|
|
845
|
-
if (state.language !== language) {
|
|
846
|
-
state.language = language;
|
|
847
|
-
onLanguageChange.emit(language);
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
function getPendingLanguage() {
|
|
851
|
-
return state.pendingLanguage || getLanguage();
|
|
852
|
-
}
|
|
853
|
-
function setPendingLanguage(language) {
|
|
854
|
-
if (state.pendingLanguage !== language) {
|
|
855
|
-
state.pendingLanguage = language;
|
|
856
|
-
onPendingLanguageChange.emit(language);
|
|
857
|
-
}
|
|
858
|
-
}
|
|
859
|
-
function getInitialOptions() {
|
|
860
|
-
return Object.assign(Object.assign({}, state.initialOptions), devCredentials);
|
|
861
|
-
}
|
|
862
|
-
function addActiveNs(ns) {
|
|
863
|
-
const namespaces = getFallbackArray(ns);
|
|
864
|
-
namespaces.forEach((namespace) => {
|
|
865
|
-
const value = state.activeNamespaces.get(namespace);
|
|
866
|
-
if (value !== undefined) {
|
|
867
|
-
state.activeNamespaces.set(namespace, value + 1);
|
|
789
|
+
const self = Object.freeze({
|
|
790
|
+
init(options) {
|
|
791
|
+
state = initState(options, state);
|
|
792
|
+
},
|
|
793
|
+
isRunning() {
|
|
794
|
+
return state.isRunning;
|
|
795
|
+
},
|
|
796
|
+
setRunning(value) {
|
|
797
|
+
if (state.isRunning !== value) {
|
|
798
|
+
state.isRunning = value;
|
|
799
|
+
onRunningChange.emit(value);
|
|
868
800
|
}
|
|
869
|
-
|
|
870
|
-
|
|
801
|
+
},
|
|
802
|
+
isInitialLoading() {
|
|
803
|
+
return state.isInitialLoading;
|
|
804
|
+
},
|
|
805
|
+
setInitialLoading(value) {
|
|
806
|
+
state.isInitialLoading = value;
|
|
807
|
+
},
|
|
808
|
+
getLanguage() {
|
|
809
|
+
return state.language || state.initialOptions.language;
|
|
810
|
+
},
|
|
811
|
+
setLanguage(language) {
|
|
812
|
+
if (state.language !== language) {
|
|
813
|
+
state.language = language;
|
|
814
|
+
onLanguageChange.emit(language);
|
|
871
815
|
}
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
816
|
+
},
|
|
817
|
+
getPendingLanguage() {
|
|
818
|
+
return state.pendingLanguage || self.getLanguage();
|
|
819
|
+
},
|
|
820
|
+
setPendingLanguage(language) {
|
|
821
|
+
if (state.pendingLanguage !== language) {
|
|
822
|
+
state.pendingLanguage = language;
|
|
823
|
+
onPendingLanguageChange.emit(language);
|
|
824
|
+
}
|
|
825
|
+
},
|
|
826
|
+
getInitialOptions() {
|
|
827
|
+
return Object.assign(Object.assign({}, state.initialOptions), devCredentials);
|
|
828
|
+
},
|
|
829
|
+
addActiveNs(ns) {
|
|
830
|
+
const namespaces = getFallbackArray(ns);
|
|
831
|
+
namespaces.forEach((namespace) => {
|
|
832
|
+
const value = state.activeNamespaces.get(namespace);
|
|
833
|
+
if (value !== undefined) {
|
|
834
|
+
state.activeNamespaces.set(namespace, value + 1);
|
|
835
|
+
}
|
|
836
|
+
else {
|
|
837
|
+
state.activeNamespaces.set(namespace, 1);
|
|
838
|
+
}
|
|
839
|
+
});
|
|
840
|
+
},
|
|
841
|
+
removeActiveNs(ns) {
|
|
842
|
+
const namespaces = getFallbackArray(ns);
|
|
843
|
+
namespaces.forEach((namespace) => {
|
|
844
|
+
const value = state.activeNamespaces.get(namespace);
|
|
845
|
+
if (value !== undefined && value > 1) {
|
|
846
|
+
state.activeNamespaces.set(namespace, value - 1);
|
|
847
|
+
}
|
|
848
|
+
else {
|
|
849
|
+
state.activeNamespaces.delete(namespace);
|
|
850
|
+
}
|
|
851
|
+
});
|
|
852
|
+
},
|
|
853
|
+
getRequiredNamespaces() {
|
|
854
|
+
return unique([
|
|
855
|
+
...(state.initialOptions.ns || [state.initialOptions.defaultNs]),
|
|
856
|
+
...getFallbackArray(state.initialOptions.fallbackNs),
|
|
857
|
+
...state.activeNamespaces.keys(),
|
|
858
|
+
]);
|
|
859
|
+
},
|
|
860
|
+
getFallbackLangs(lang) {
|
|
861
|
+
const language = lang || self.getLanguage();
|
|
862
|
+
if (!language) {
|
|
863
|
+
return [];
|
|
864
|
+
}
|
|
865
|
+
return unique([
|
|
866
|
+
language,
|
|
867
|
+
...getFallbackFromStruct(language, state.initialOptions.fallbackLanguage),
|
|
868
|
+
]);
|
|
869
|
+
},
|
|
870
|
+
getFallbackNs() {
|
|
871
|
+
return getFallbackArray(state.initialOptions.fallbackNs);
|
|
872
|
+
},
|
|
873
|
+
getDefaultNs(ns) {
|
|
874
|
+
return ns === undefined ? state.initialOptions.defaultNs : ns;
|
|
875
|
+
},
|
|
876
|
+
getAvailableLanguages() {
|
|
877
|
+
if (state.initialOptions.availableLanguages) {
|
|
878
|
+
return state.initialOptions.availableLanguages;
|
|
879
|
+
}
|
|
880
|
+
else if (state.initialOptions.staticData) {
|
|
881
|
+
const languagesFromStaticData = Object.keys(state.initialOptions.staticData).map((key) => decodeCacheKey(key).language);
|
|
882
|
+
return Array.from(new Set(languagesFromStaticData));
|
|
883
|
+
}
|
|
884
|
+
},
|
|
885
|
+
withDefaultNs(descriptor) {
|
|
886
|
+
return {
|
|
887
|
+
namespace: descriptor.namespace === undefined
|
|
888
|
+
? self.getInitialOptions().defaultNs
|
|
889
|
+
: descriptor.namespace,
|
|
890
|
+
language: descriptor.language,
|
|
891
|
+
};
|
|
892
|
+
},
|
|
893
|
+
overrideCredentials(credentials) {
|
|
894
|
+
if (credentials) {
|
|
895
|
+
devCredentials = Object.assign(Object.assign({}, credentials), { apiUrl: sanitizeUrl(credentials.apiUrl) });
|
|
880
896
|
}
|
|
881
897
|
else {
|
|
882
|
-
|
|
898
|
+
devCredentials = undefined;
|
|
883
899
|
}
|
|
884
|
-
}
|
|
885
|
-
}
|
|
886
|
-
function getRequiredNamespaces() {
|
|
887
|
-
return unique([
|
|
888
|
-
...(state.initialOptions.ns || [state.initialOptions.defaultNs]),
|
|
889
|
-
...getFallbackArray(state.initialOptions.fallbackNs),
|
|
890
|
-
...state.activeNamespaces.keys(),
|
|
891
|
-
]);
|
|
892
|
-
}
|
|
893
|
-
function getFallbackLangs(lang) {
|
|
894
|
-
const language = lang || getLanguage();
|
|
895
|
-
if (!language) {
|
|
896
|
-
return [];
|
|
897
|
-
}
|
|
898
|
-
return unique([
|
|
899
|
-
language,
|
|
900
|
-
...getFallbackFromStruct(language, state.initialOptions.fallbackLanguage),
|
|
901
|
-
]);
|
|
902
|
-
}
|
|
903
|
-
function getFallbackNs() {
|
|
904
|
-
return getFallbackArray(state.initialOptions.fallbackNs);
|
|
905
|
-
}
|
|
906
|
-
function getDefaultNs(ns) {
|
|
907
|
-
return ns === undefined ? state.initialOptions.defaultNs : ns;
|
|
908
|
-
}
|
|
909
|
-
function getAvailableLanguages() {
|
|
910
|
-
if (state.initialOptions.availableLanguages) {
|
|
911
|
-
return state.initialOptions.availableLanguages;
|
|
912
|
-
}
|
|
913
|
-
else if (state.initialOptions.staticData) {
|
|
914
|
-
const languagesFromStaticData = Object.keys(state.initialOptions.staticData).map((key) => decodeCacheKey(key).language);
|
|
915
|
-
return Array.from(new Set(languagesFromStaticData));
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
function withDefaultNs(descriptor) {
|
|
919
|
-
return {
|
|
920
|
-
namespace: descriptor.namespace === undefined
|
|
921
|
-
? getInitialOptions().defaultNs
|
|
922
|
-
: descriptor.namespace,
|
|
923
|
-
language: descriptor.language,
|
|
924
|
-
};
|
|
925
|
-
}
|
|
926
|
-
function overrideCredentials(credentials) {
|
|
927
|
-
if (credentials) {
|
|
928
|
-
devCredentials = Object.assign(Object.assign({}, credentials), { apiUrl: sanitizeUrl(credentials.apiUrl) });
|
|
929
|
-
}
|
|
930
|
-
else {
|
|
931
|
-
devCredentials = undefined;
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
return Object.freeze({
|
|
935
|
-
init,
|
|
936
|
-
isRunning,
|
|
937
|
-
setRunning,
|
|
938
|
-
isInitialLoading,
|
|
939
|
-
setInitialLoading,
|
|
940
|
-
getLanguage,
|
|
941
|
-
setLanguage,
|
|
942
|
-
getPendingLanguage,
|
|
943
|
-
setPendingLanguage,
|
|
944
|
-
getInitialOptions,
|
|
945
|
-
addActiveNs,
|
|
946
|
-
removeActiveNs,
|
|
947
|
-
getRequiredNamespaces,
|
|
948
|
-
getFallbackLangs,
|
|
949
|
-
getFallbackNs,
|
|
950
|
-
getDefaultNs,
|
|
951
|
-
getAvailableLanguages,
|
|
952
|
-
withDefaultNs,
|
|
953
|
-
overrideCredentials,
|
|
900
|
+
},
|
|
954
901
|
});
|
|
955
|
-
|
|
902
|
+
return self;
|
|
903
|
+
}
|
|
956
904
|
|
|
957
905
|
function parseCombinedOptions(_a) {
|
|
958
906
|
var { ns, noWrap, orEmpty, params, language } = _a, rest = __rest(_a, ["ns", "noWrap", "orEmpty", "params", "language"]);
|
|
@@ -986,10 +934,10 @@ const getTranslateProps = (keyOrProps, ...params) => {
|
|
|
986
934
|
return result;
|
|
987
935
|
};
|
|
988
936
|
|
|
989
|
-
|
|
937
|
+
function Controller({ options }) {
|
|
990
938
|
const events = Events(getFallbackNs, getDefaultNs);
|
|
991
939
|
const fetchingObserver = ValueObserver(false, () => cache.isFetching(), events.onFetchingChange.emit);
|
|
992
|
-
const loadingObserver = ValueObserver(false, () => isLoading(), events.onLoadingChange.emit);
|
|
940
|
+
const loadingObserver = ValueObserver(false, () => self.isLoading(), events.onLoadingChange.emit);
|
|
993
941
|
const state = State(events.onLanguageChange, events.onPendingLanguageChange, events.onRunningChange);
|
|
994
942
|
const pluginService = Plugins(state.getLanguage, state.getInitialOptions, state.getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation);
|
|
995
943
|
const cache = Cache(events.onCacheChange, pluginService.getBackendRecord, pluginService.getBackendDevRecord, state.withDefaultNs, state.isInitialLoading, fetchingObserver, loadingObserver);
|
|
@@ -1025,7 +973,7 @@ const Controller = ({ options }) => {
|
|
|
1025
973
|
const previousValue = cache.getTranslation(keyObject, key);
|
|
1026
974
|
cache.changeTranslation(keyObject, key, value);
|
|
1027
975
|
return {
|
|
1028
|
-
revert
|
|
976
|
+
revert() {
|
|
1029
977
|
cache.changeTranslation(keyObject, key, previousValue);
|
|
1030
978
|
},
|
|
1031
979
|
};
|
|
@@ -1034,20 +982,6 @@ const Controller = ({ options }) => {
|
|
|
1034
982
|
state.init(options);
|
|
1035
983
|
cache.addStaticData(state.getInitialOptions().staticData);
|
|
1036
984
|
}
|
|
1037
|
-
function isLoading(ns) {
|
|
1038
|
-
return cache.isLoading(state.getLanguage(), ns);
|
|
1039
|
-
}
|
|
1040
|
-
function isDev() {
|
|
1041
|
-
return Boolean(state.getInitialOptions().apiKey && state.getInitialOptions().apiUrl);
|
|
1042
|
-
}
|
|
1043
|
-
async function addActiveNs(ns, forget) {
|
|
1044
|
-
if (!forget) {
|
|
1045
|
-
state.addActiveNs(ns);
|
|
1046
|
-
}
|
|
1047
|
-
if (state.isRunning()) {
|
|
1048
|
-
await loadRequiredRecords(undefined, ns);
|
|
1049
|
-
}
|
|
1050
|
-
}
|
|
1051
985
|
function getRequiredRecords(lang, ns) {
|
|
1052
986
|
const languages = state.getFallbackLangs(lang);
|
|
1053
987
|
const namespaces = getRequiredNamespaces(ns);
|
|
@@ -1061,43 +995,10 @@ const Controller = ({ options }) => {
|
|
|
1061
995
|
});
|
|
1062
996
|
return result;
|
|
1063
997
|
}
|
|
1064
|
-
function isLoaded(ns) {
|
|
1065
|
-
const language = state.getLanguage();
|
|
1066
|
-
if (!language) {
|
|
1067
|
-
return false;
|
|
1068
|
-
}
|
|
1069
|
-
const languages = state.getFallbackLangs(language);
|
|
1070
|
-
const namespaces = getRequiredNamespaces(ns);
|
|
1071
|
-
const result = [];
|
|
1072
|
-
languages.forEach((language) => {
|
|
1073
|
-
namespaces.forEach((namespace) => {
|
|
1074
|
-
if (!cache.exists({ language, namespace })) {
|
|
1075
|
-
result.push({ language, namespace });
|
|
1076
|
-
}
|
|
1077
|
-
});
|
|
1078
|
-
});
|
|
1079
|
-
return result.length === 0;
|
|
1080
|
-
}
|
|
1081
998
|
function loadRequiredRecords(lang, ns) {
|
|
1082
999
|
const descriptors = getRequiredRecords(lang, ns);
|
|
1083
1000
|
if (descriptors.length) {
|
|
1084
|
-
return valueOrPromise(loadRecords(descriptors), () => { });
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
async function changeLanguage(language) {
|
|
1088
|
-
if (state.getPendingLanguage() === language &&
|
|
1089
|
-
state.getLanguage() === language) {
|
|
1090
|
-
return;
|
|
1091
|
-
}
|
|
1092
|
-
state.setPendingLanguage(language);
|
|
1093
|
-
if (state.isRunning()) {
|
|
1094
|
-
await loadRequiredRecords(language);
|
|
1095
|
-
}
|
|
1096
|
-
if (language === state.getPendingLanguage()) {
|
|
1097
|
-
// there might be parallel language change
|
|
1098
|
-
// we only want to apply latest
|
|
1099
|
-
state.setLanguage(language);
|
|
1100
|
-
pluginService.setStoredLanguage(language);
|
|
1001
|
+
return valueOrPromise(self.loadRecords(descriptors), () => { });
|
|
1101
1002
|
}
|
|
1102
1003
|
}
|
|
1103
1004
|
function getTranslationNs({ key, ns }) {
|
|
@@ -1145,13 +1046,7 @@ const Controller = ({ options }) => {
|
|
|
1145
1046
|
language && state.setLanguage(language);
|
|
1146
1047
|
});
|
|
1147
1048
|
}
|
|
1148
|
-
|
|
1149
|
-
return (await loadRecords([descriptor]))[0];
|
|
1150
|
-
}
|
|
1151
|
-
function loadRecords(descriptors) {
|
|
1152
|
-
return cache.loadRecords(descriptors, isDev());
|
|
1153
|
-
}
|
|
1154
|
-
const checkCorrectConfiguration = () => {
|
|
1049
|
+
function checkCorrectConfiguration() {
|
|
1155
1050
|
const languageComputable = pluginService.getLanguageDetector() || pluginService.getLanguageStorage();
|
|
1156
1051
|
if (languageComputable) {
|
|
1157
1052
|
const availableLanguages = state.getAvailableLanguages();
|
|
@@ -1167,59 +1062,98 @@ const Controller = ({ options }) => {
|
|
|
1167
1062
|
throw new Error(missingOptionError('language'));
|
|
1168
1063
|
}
|
|
1169
1064
|
}
|
|
1170
|
-
};
|
|
1171
|
-
function run() {
|
|
1172
|
-
let result = undefined;
|
|
1173
|
-
checkCorrectConfiguration();
|
|
1174
|
-
if (!state.isRunning()) {
|
|
1175
|
-
if (isDev()) {
|
|
1176
|
-
cache.invalidate();
|
|
1177
|
-
}
|
|
1178
|
-
state.setRunning(true);
|
|
1179
|
-
pluginService.run();
|
|
1180
|
-
result = loadInitial();
|
|
1181
|
-
}
|
|
1182
|
-
return Promise.resolve(result);
|
|
1183
|
-
}
|
|
1184
|
-
function stop() {
|
|
1185
|
-
if (state.isRunning()) {
|
|
1186
|
-
pluginService.stop();
|
|
1187
|
-
state.setRunning(false);
|
|
1188
|
-
}
|
|
1189
1065
|
}
|
|
1190
|
-
const
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
}
|
|
1066
|
+
const self = Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, events), state), pluginService), cache), { init: init, getTranslation: getTranslation, changeTranslation: changeTranslation, async changeLanguage(language) {
|
|
1067
|
+
if (state.getPendingLanguage() === language &&
|
|
1068
|
+
state.getLanguage() === language) {
|
|
1069
|
+
return;
|
|
1070
|
+
}
|
|
1071
|
+
state.setPendingLanguage(language);
|
|
1072
|
+
if (state.isRunning()) {
|
|
1073
|
+
await loadRequiredRecords(language);
|
|
1074
|
+
}
|
|
1075
|
+
if (language === state.getPendingLanguage()) {
|
|
1076
|
+
// there might be parallel language change
|
|
1077
|
+
// we only want to apply latest
|
|
1078
|
+
state.setLanguage(language);
|
|
1079
|
+
pluginService.setStoredLanguage(language);
|
|
1080
|
+
}
|
|
1081
|
+
},
|
|
1082
|
+
async addActiveNs(ns, forget) {
|
|
1083
|
+
if (!forget) {
|
|
1084
|
+
state.addActiveNs(ns);
|
|
1085
|
+
}
|
|
1086
|
+
if (state.isRunning()) {
|
|
1087
|
+
await loadRequiredRecords(undefined, ns);
|
|
1088
|
+
}
|
|
1089
|
+
},
|
|
1090
|
+
loadRecords(descriptors) {
|
|
1091
|
+
return cache.loadRecords(descriptors, self.isDev());
|
|
1092
|
+
},
|
|
1093
|
+
async loadRecord(descriptor) {
|
|
1094
|
+
return (await self.loadRecords([descriptor]))[0];
|
|
1095
|
+
},
|
|
1096
|
+
isLoading(ns) {
|
|
1097
|
+
return cache.isLoading(state.getLanguage(), ns);
|
|
1098
|
+
},
|
|
1099
|
+
isLoaded(ns) {
|
|
1100
|
+
const language = state.getLanguage();
|
|
1101
|
+
if (!language) {
|
|
1102
|
+
return false;
|
|
1103
|
+
}
|
|
1104
|
+
const languages = state.getFallbackLangs(language);
|
|
1105
|
+
const namespaces = getRequiredNamespaces(ns);
|
|
1106
|
+
const result = [];
|
|
1107
|
+
languages.forEach((language) => {
|
|
1108
|
+
namespaces.forEach((namespace) => {
|
|
1109
|
+
if (!cache.exists({ language, namespace })) {
|
|
1110
|
+
result.push({ language, namespace });
|
|
1111
|
+
}
|
|
1112
|
+
});
|
|
1113
|
+
});
|
|
1114
|
+
return result.length === 0;
|
|
1115
|
+
}, t: ((...args) => {
|
|
1116
|
+
// @ts-ignore
|
|
1117
|
+
const params = getTranslateProps(...args);
|
|
1118
|
+
const translation = getTranslation(params);
|
|
1119
|
+
return pluginService.formatTranslation(Object.assign(Object.assign({}, params), { translation }));
|
|
1120
|
+
}), isDev() {
|
|
1121
|
+
return Boolean(state.getInitialOptions().apiKey && state.getInitialOptions().apiUrl);
|
|
1122
|
+
},
|
|
1123
|
+
run() {
|
|
1124
|
+
let result = undefined;
|
|
1125
|
+
checkCorrectConfiguration();
|
|
1126
|
+
if (!state.isRunning()) {
|
|
1127
|
+
if (self.isDev()) {
|
|
1128
|
+
cache.invalidate();
|
|
1129
|
+
}
|
|
1130
|
+
state.setRunning(true);
|
|
1131
|
+
pluginService.run();
|
|
1132
|
+
result = loadInitial();
|
|
1133
|
+
}
|
|
1134
|
+
return Promise.resolve(result);
|
|
1135
|
+
},
|
|
1136
|
+
stop() {
|
|
1137
|
+
if (state.isRunning()) {
|
|
1138
|
+
pluginService.stop();
|
|
1139
|
+
state.setRunning(false);
|
|
1140
|
+
}
|
|
1141
|
+
} }));
|
|
1142
|
+
return self;
|
|
1143
|
+
}
|
|
1210
1144
|
|
|
1211
|
-
|
|
1145
|
+
function createTolgee(options) {
|
|
1212
1146
|
const controller = Controller({
|
|
1213
1147
|
options,
|
|
1214
1148
|
});
|
|
1215
1149
|
// restarts tolgee while applying callback
|
|
1216
|
-
|
|
1150
|
+
function withRestart(callback) {
|
|
1217
1151
|
const wasRunning = controller.isRunning();
|
|
1218
1152
|
wasRunning && controller.stop();
|
|
1219
1153
|
callback();
|
|
1220
1154
|
wasRunning && controller.run();
|
|
1221
|
-
}
|
|
1222
|
-
const
|
|
1155
|
+
}
|
|
1156
|
+
const self = Object.freeze({
|
|
1223
1157
|
/**
|
|
1224
1158
|
* Listen to tolgee events.
|
|
1225
1159
|
*/
|
|
@@ -1370,7 +1304,7 @@ const createTolgee = (options) => {
|
|
|
1370
1304
|
*/
|
|
1371
1305
|
addPlugin(plugin) {
|
|
1372
1306
|
if (plugin) {
|
|
1373
|
-
withRestart(() => controller.addPlugin(
|
|
1307
|
+
withRestart(() => controller.addPlugin(self, plugin));
|
|
1374
1308
|
}
|
|
1375
1309
|
},
|
|
1376
1310
|
/**
|
|
@@ -1385,8 +1319,8 @@ const createTolgee = (options) => {
|
|
|
1385
1319
|
}
|
|
1386
1320
|
},
|
|
1387
1321
|
});
|
|
1388
|
-
return
|
|
1389
|
-
}
|
|
1322
|
+
return self;
|
|
1323
|
+
}
|
|
1390
1324
|
/**
|
|
1391
1325
|
* Tolgee chainable constructor.
|
|
1392
1326
|
*
|