@tolgee/core 5.8.0 → 5.8.2

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