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