@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.
Files changed (39) hide show
  1. package/dist/tolgee.cjs.js +650 -716
  2. package/dist/tolgee.cjs.js.map +1 -1
  3. package/dist/tolgee.cjs.min.js +1 -1
  4. package/dist/tolgee.cjs.min.js.map +1 -1
  5. package/dist/tolgee.esm.js +650 -716
  6. package/dist/tolgee.esm.js.map +1 -1
  7. package/dist/tolgee.esm.min.js +1 -1
  8. package/dist/tolgee.esm.min.js.map +1 -1
  9. package/dist/tolgee.esm.min.mjs +1 -1
  10. package/dist/tolgee.esm.min.mjs.map +1 -1
  11. package/dist/tolgee.esm.mjs +650 -716
  12. package/dist/tolgee.esm.mjs.map +1 -1
  13. package/dist/tolgee.umd.js +650 -716
  14. package/dist/tolgee.umd.js.map +1 -1
  15. package/dist/tolgee.umd.min.js +1 -1
  16. package/dist/tolgee.umd.min.js.map +1 -1
  17. package/lib/Controller/Cache/Cache.d.ts +14 -14
  18. package/lib/Controller/Controller.d.ts +23 -23
  19. package/lib/Controller/Events/EventEmitter.d.ts +1 -1
  20. package/lib/Controller/Events/EventEmitterSelective.d.ts +1 -1
  21. package/lib/Controller/Events/Events.d.ts +2 -2
  22. package/lib/Controller/Plugins/Plugins.d.ts +17 -17
  23. package/lib/Controller/State/State.d.ts +20 -20
  24. package/lib/Controller/State/initState.d.ts +1 -1
  25. package/lib/TolgeeCore.d.ts +2 -2
  26. package/lib/helpers.d.ts +2 -2
  27. package/package.json +2 -2
  28. package/src/Controller/Cache/Cache.ts +175 -193
  29. package/src/Controller/Controller.ts +105 -114
  30. package/src/Controller/Events/EventEmitter.ts +21 -22
  31. package/src/Controller/Events/EventEmitterSelective.ts +59 -58
  32. package/src/Controller/Events/Events.ts +41 -52
  33. package/src/Controller/Plugins/Plugins.ts +206 -219
  34. package/src/Controller/State/State.ts +135 -152
  35. package/src/Controller/State/initState.ts +3 -3
  36. package/src/Controller/ValueObserver.ts +11 -12
  37. package/src/TolgeeCore.ts +7 -7
  38. package/src/__test/cache.test.ts +3 -2
  39. package/src/helpers.ts +6 -5
@@ -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
- const valueOrPromise = (value, callback) => {
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
- const missingOptionError = (option) => `Tolgee: You need to specify '${option}' option`;
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
- const EventEmitter = (isActive) => {
57
+ function EventEmitter(isActive) {
56
58
  let handlers = [];
57
- const listen = (handler) => {
58
- const handlerWrapper = (e) => {
59
- handler(e);
60
- };
61
- handlers.push(handlerWrapper);
62
- return {
63
- unsubscribe: () => {
64
- handlers = handlers.filter((i) => handlerWrapper !== i);
65
- },
66
- };
67
- };
68
- const emit = (data) => {
69
- if (isActive()) {
70
- handlers.forEach((handler) => handler({ value: data }));
71
- }
72
- };
73
- return Object.freeze({ listen, emit });
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
- const EventEmitterSelective = (isActive, getFallbackNs, getDefaultNs) => {
79
+ function EventEmitterSelective(isActive, getFallbackNs, getDefaultNs) {
77
80
  const listeners = new Set();
78
81
  const partialListeners = new Set();
79
- const listen = (handler) => {
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
- const solveQueue = () => {
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
- const emit = (ns, delayed) => {
150
- if (isActive()) {
151
- queue.push(ns);
152
- if (!delayed) {
153
- solveQueue();
154
- }
155
- else {
156
- setTimeout(solveQueue, 0);
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
- return Object.freeze({ listenSome, listen, emit });
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
- const Events = (getFallbackNs, getDefaultNs) => {
167
+ function Events(getFallbackNs, getDefaultNs) {
164
168
  let emitterActive = true;
165
169
  function isActive() {
166
170
  return emitterActive;
167
171
  }
168
- const onPendingLanguageChange = EventEmitter(isActive);
169
- const onLanguageChange = EventEmitter(isActive);
170
- const onLoadingChange = EventEmitter(isActive);
171
- const onFetchingChange = EventEmitter(isActive);
172
- const onInitialLoaded = EventEmitter(isActive);
173
- const onRunningChange = EventEmitter(isActive);
174
- const onCacheChange = EventEmitter(isActive);
175
- const onUpdate = EventEmitterSelective(isActive, getFallbackNs, getDefaultNs);
176
- onInitialLoaded.listen(() => onUpdate.emit());
177
- onLanguageChange.listen(() => onUpdate.emit());
178
- onCacheChange.listen(({ value }) => {
179
- onUpdate.emit([value.namespace], true);
180
- });
181
- const on = (event, handler) => {
182
- switch (event) {
183
- case 'pendingLanguage':
184
- return onPendingLanguageChange.listen(handler);
185
- case 'language':
186
- return onLanguageChange.listen(handler);
187
- case 'loading':
188
- return onLoadingChange.listen(handler);
189
- case 'fetching':
190
- return onFetchingChange.listen(handler);
191
- case 'initialLoad':
192
- return onInitialLoaded.listen(handler);
193
- case 'running':
194
- return onRunningChange.listen(handler);
195
- case 'cache':
196
- return onCacheChange.listen(handler);
197
- case 'update':
198
- return onUpdate.listen(handler);
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
- const Cache = (onCacheChange, backendGetRecord, backendGetDevRecord, withDefaultNs, isInitialLoading, fetchingObserver, loadingObserver) => {
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
- async function loadRecords(descriptors, isDev) {
386
- const withPromises = descriptors.map((descriptor) => {
387
- const keyObject = withDefaultNs(descriptor);
388
- const cacheKey = encodeCacheKey(keyObject);
389
- const existingPromise = asyncRequests.get(cacheKey);
390
- if (existingPromise) {
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: false,
393
- promise: existingPromise,
396
+ new: true,
397
+ promise: dataPromise,
394
398
  keyObject,
395
399
  cacheKey,
396
400
  };
397
- }
398
- const dataPromise = fetchData(keyObject, isDev) || Promise.resolve(undefined);
399
- asyncRequests.set(cacheKey, dataPromise);
400
- return {
401
- new: true,
402
- promise: dataPromise,
403
- keyObject,
404
- cacheKey,
405
- };
406
- });
407
- fetchingObserver.notify();
408
- loadingObserver.notify();
409
- const results = await Promise.all(withPromises.map((val) => val.promise));
410
- withPromises.forEach((value, i) => {
411
- const promiseChanged = asyncRequests.get(value.cacheKey) !== value.promise;
412
- // if promise has changed in between, it means cache been invalidated or
413
- // new data are being fetched
414
- if (value.new && !promiseChanged) {
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
- fetchingObserver.notify();
427
- loadingObserver.notify();
428
- return withPromises.map((val) => getRecord(val.keyObject));
429
- }
430
- function getAllRecords() {
431
- const entries = Array.from(cache.entries());
432
- return entries.map(([key, entry]) => {
433
- return Object.assign(Object.assign({}, decodeCacheKey(key)), { data: entry.data });
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
- const initState = (options, previousState) => {
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
- const Plugins = (getLanguage, getInitialOptions, getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation) => {
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
- const translate = (props) => {
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
- const setObserver = (observer) => {
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
- const hasObserver = () => {
550
+ }
551
+ function hasObserver() {
579
552
  return Boolean(instances.observer);
580
- };
581
- const addFormatter = (formatter) => {
553
+ }
554
+ function addFormatter(formatter) {
582
555
  if (formatter) {
583
556
  instances.formatters.push(formatter);
584
557
  }
585
- };
586
- const setFinalFormatter = (formatter) => {
558
+ }
559
+ function setFinalFormatter(formatter) {
587
560
  instances.finalFormatter = formatter;
588
- };
589
- const setUi = (ui) => {
561
+ }
562
+ function setUi(ui) {
590
563
  plugins.ui = ui;
591
- };
592
- const hasUi = () => {
564
+ }
565
+ function hasUi() {
593
566
  return Boolean(plugins.ui);
594
- };
595
- const setLanguageStorage = (storage) => {
567
+ }
568
+ function setLanguageStorage(storage) {
596
569
  instances.languageStorage = storage;
597
- };
598
- const getLanguageStorage = () => {
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
- const getLanguageDetector = () => {
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
- const getInitialLanguage = () => {
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
- const setDevBackend = (backend) => {
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
- function formatTranslation(_a) {
715
- var _b;
716
- var { formatEnabled } = _a, props = __rest(_a, ["formatEnabled"]);
717
- const { key, translation, defaultValue, noWrap, params, orEmpty, ns } = props;
718
- const formattableTranslation = translation || defaultValue;
719
- let result = formattableTranslation || (orEmpty ? '' : key);
720
- const language = getLanguage();
721
- const isFormatEnabled = formatEnabled || !((_b = instances.observer) === null || _b === void 0 ? void 0 : _b.outputNotFormattable);
722
- const wrap = (result) => {
723
- if (instances.observer && !noWrap) {
724
- return instances.observer.wrap({
725
- key,
726
- translation: result,
727
- defaultValue,
728
- params,
729
- ns,
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 result;
733
- };
734
- result = wrap(result);
735
- try {
736
- if (formattableTranslation && language && isFormatEnabled) {
737
- for (const formatter of instances.formatters) {
738
- result = formatter.format({
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
- if (instances.finalFormatter &&
746
- formattableTranslation &&
747
- language &&
748
- isFormatEnabled) {
749
- result = instances.finalFormatter.format({
750
- translation: result,
751
- language,
752
- params,
753
- });
754
- }
755
- }
756
- catch (e) {
757
- // eslint-disable-next-line no-console
758
- console.error(e);
759
- const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR;
760
- const onFormatError = getInitialOptions().onFormatError;
761
- const formatErrorType = typeof onFormatError;
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
- // wrap error message, so it's detectable
772
- result = wrap(result);
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
- notify,
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
- const State = (onLanguageChange, onPendingLanguageChange, onRunningChange) => {
790
+ function State(onLanguageChange, onPendingLanguageChange, onRunningChange) {
825
791
  let state = initState();
826
792
  let devCredentials = undefined;
827
- function init(options) {
828
- state = initState(options, state);
829
- }
830
- function isRunning() {
831
- return state.isRunning;
832
- }
833
- function setRunning(value) {
834
- if (state.isRunning !== value) {
835
- state.isRunning = value;
836
- onRunningChange.emit(value);
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
- else {
874
- state.activeNamespaces.set(namespace, 1);
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
- function removeActiveNs(ns) {
879
- const namespaces = getFallbackArray(ns);
880
- namespaces.forEach((namespace) => {
881
- const value = state.activeNamespaces.get(namespace);
882
- if (value !== undefined && value > 1) {
883
- state.activeNamespaces.set(namespace, value - 1);
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
- state.activeNamespaces.delete(namespace);
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
- const Controller = ({ options }) => {
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
- async function loadRecord(descriptor) {
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 t = (...args) => {
1195
- // @ts-ignore
1196
- const params = getTranslateProps(...args);
1197
- const translation = getTranslation(params);
1198
- return pluginService.formatTranslation(Object.assign(Object.assign({}, params), { translation }));
1199
- };
1200
- return Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, events), state), pluginService), cache), { init,
1201
- changeLanguage,
1202
- getTranslation,
1203
- changeTranslation,
1204
- addActiveNs,
1205
- loadRecords,
1206
- loadRecord,
1207
- isLoading,
1208
- isLoaded,
1209
- t,
1210
- isDev,
1211
- run,
1212
- stop }));
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
- const createTolgee = (options) => {
1149
+ function createTolgee(options) {
1216
1150
  const controller = Controller({
1217
1151
  options,
1218
1152
  });
1219
1153
  // restarts tolgee while applying callback
1220
- const withRestart = (callback) => {
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 tolgee = Object.freeze({
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(tolgee, plugin));
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 tolgee;
1393
- };
1326
+ return self;
1327
+ }
1394
1328
  /**
1395
1329
  * Tolgee chainable constructor.
1396
1330
  *