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