@tolgee/core 5.33.2 → 5.33.3-prerelease.2efc0e6b.0

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 (56) hide show
  1. package/dist/tolgee.cjs.js +227 -186
  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 +227 -186
  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 +227 -186
  12. package/dist/tolgee.esm.mjs.map +1 -1
  13. package/dist/tolgee.umd.js +227 -186
  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 +8 -12
  18. package/lib/Controller/Cache/helpers.d.ts +3 -2
  19. package/lib/Controller/Controller.d.ts +57 -26
  20. package/lib/Controller/Events/EventEmitter.d.ts +5 -5
  21. package/lib/Controller/Events/EventEmitterCombined.d.ts +6 -0
  22. package/lib/Controller/Events/Events.d.ts +39 -12
  23. package/lib/Controller/State/State.d.ts +10 -4
  24. package/lib/Controller/State/initState.d.ts +29 -7
  25. package/lib/TolgeeCore.d.ts +25 -28
  26. package/lib/helpers.d.ts +2 -2
  27. package/lib/types/cache.d.ts +19 -1
  28. package/lib/types/events.d.ts +24 -23
  29. package/lib/types/index.d.ts +1 -1
  30. package/package.json +2 -2
  31. package/src/Controller/Cache/Cache.test.ts +189 -0
  32. package/src/Controller/Cache/Cache.ts +118 -57
  33. package/src/Controller/Cache/helpers.ts +12 -3
  34. package/src/Controller/Controller.ts +81 -27
  35. package/src/Controller/Events/EventEmitter.ts +23 -15
  36. package/src/Controller/Events/EventEmitterCombined.ts +55 -0
  37. package/src/Controller/Events/Events.ts +31 -23
  38. package/src/Controller/Plugins/Plugins.ts +5 -0
  39. package/src/Controller/State/State.ts +26 -6
  40. package/src/Controller/State/initState.ts +35 -7
  41. package/src/TolgeeCore.ts +14 -17
  42. package/src/__test/cache.test.ts +2 -26
  43. package/src/__test/client.test.ts +3 -3
  44. package/src/__test/events.test.ts +40 -13
  45. package/src/__test/load.matrix.test.ts +123 -0
  46. package/src/__test/load.required.test.ts +71 -0
  47. package/src/__test/namespaces.required.test.ts +52 -0
  48. package/src/__test/options.test.ts +1 -1
  49. package/src/__test/testTools.ts +39 -0
  50. package/src/helpers.ts +2 -1
  51. package/src/types/cache.ts +24 -1
  52. package/src/types/events.ts +33 -24
  53. package/src/types/index.ts +1 -0
  54. package/lib/Controller/Events/EventEmitterSelective.d.ts +0 -7
  55. package/src/Controller/Events/EventEmitterSelective.test.ts +0 -110
  56. package/src/Controller/Events/EventEmitterSelective.ts +0 -133
@@ -1,16 +1,20 @@
1
1
  import { EventEmitter } from './EventEmitter';
2
- import { EventEmitterSelective } from './EventEmitterSelective';
3
2
  import {
4
- CacheDescriptorWithKey,
5
- TolgeeError,
3
+ CacheEvent,
4
+ FetchingEvent,
5
+ InitialLoadEvent,
6
+ LanguageEvent,
7
+ LoadingEvent,
8
+ PendingLanguageEvent,
9
+ PermanentChangeEvent,
10
+ RunningEvent,
6
11
  TolgeeOn,
7
- TranslationDescriptor,
12
+ UpdateEvent,
13
+ ErrorEvent,
8
14
  } from '../../types';
15
+ import { EventEmitterCombined } from './EventEmitterCombined';
9
16
 
10
- export function Events(
11
- getFallbackNs: () => string[],
12
- getDefaultNs: () => string
13
- ) {
17
+ export function Events() {
14
18
  let emitterActive = true;
15
19
 
16
20
  function isActive() {
@@ -18,16 +22,22 @@ export function Events(
18
22
  }
19
23
 
20
24
  const self = Object.freeze({
21
- onPendingLanguageChange: EventEmitter<string>(isActive),
22
- onLanguageChange: EventEmitter<string>(isActive),
23
- onLoadingChange: EventEmitter<boolean>(isActive),
24
- onFetchingChange: EventEmitter<boolean>(isActive),
25
- onInitialLoaded: EventEmitter<void>(isActive),
26
- onRunningChange: EventEmitter<boolean>(isActive),
27
- onCacheChange: EventEmitter<CacheDescriptorWithKey>(isActive),
28
- onUpdate: EventEmitterSelective(isActive, getFallbackNs, getDefaultNs),
29
- onPermanentChange: EventEmitter<TranslationDescriptor>(isActive),
30
- onError: EventEmitter<TolgeeError>(isActive),
25
+ onPendingLanguageChange: EventEmitter<PendingLanguageEvent>(
26
+ 'pendingLanguage',
27
+ isActive
28
+ ),
29
+ onLanguageChange: EventEmitter<LanguageEvent>('language', isActive),
30
+ onLoadingChange: EventEmitter<LoadingEvent>('loading', isActive),
31
+ onFetchingChange: EventEmitter<FetchingEvent>('fetching', isActive),
32
+ onInitialLoaded: EventEmitter<InitialLoadEvent>('initialLoad', isActive),
33
+ onRunningChange: EventEmitter<RunningEvent>('running', isActive),
34
+ onCacheChange: EventEmitter<CacheEvent>('cache', isActive),
35
+ onPermanentChange: EventEmitter<PermanentChangeEvent>(
36
+ 'permanentChange',
37
+ isActive
38
+ ),
39
+ onError: EventEmitter<ErrorEvent>('error', isActive),
40
+ onUpdate: EventEmitterCombined<UpdateEvent>(isActive),
31
41
  setEmitterActive(active: boolean) {
32
42
  emitterActive = active;
33
43
  },
@@ -57,11 +67,9 @@ export function Events(
57
67
  }) as TolgeeOn,
58
68
  });
59
69
 
60
- self.onInitialLoaded.listen(() => self.onUpdate.emit());
61
- self.onLanguageChange.listen(() => self.onUpdate.emit());
62
- self.onCacheChange.listen(({ value }) =>
63
- self.onUpdate.emit([value.namespace], true)
64
- );
70
+ self.onInitialLoaded.listen((e) => self.onUpdate.emit(e, false));
71
+ self.onLanguageChange.listen((e) => self.onUpdate.emit(e, false));
72
+ self.onCacheChange.listen((e) => self.onUpdate.emit(e, true));
65
73
 
66
74
  return self;
67
75
  }
@@ -267,6 +267,11 @@ export function Plugins(
267
267
 
268
268
  getBackendDevRecord: (async ({ language, namespace }) => {
269
269
  const { apiKey, apiUrl, projectId, filterTag } = getInitialOptions();
270
+
271
+ if (!apiKey || !apiUrl || !self.hasDevBackend()) {
272
+ return undefined;
273
+ }
274
+
270
275
  return instances.devBackend?.getRecord({
271
276
  apiKey,
272
277
  apiUrl,
@@ -2,8 +2,11 @@ import {
2
2
  CacheDescriptor,
3
3
  CacheDescriptorInternal,
4
4
  DevCredentials,
5
+ LanguageEvent,
5
6
  NsFallback,
6
7
  NsType,
8
+ PendingLanguageEvent,
9
+ RunningEvent,
7
10
  } from '../../types';
8
11
 
9
12
  import { decodeCacheKey } from '../Cache/helpers';
@@ -17,9 +20,9 @@ import {
17
20
  import { initState, TolgeeOptions } from './initState';
18
21
 
19
22
  export function State(
20
- onLanguageChange: EventEmitterInstance<string>,
21
- onPendingLanguageChange: EventEmitterInstance<string>,
22
- onRunningChange: EventEmitterInstance<boolean>
23
+ onLanguageChange: EventEmitterInstance<LanguageEvent>,
24
+ onPendingLanguageChange: EventEmitterInstance<PendingLanguageEvent>,
25
+ onRunningChange: EventEmitterInstance<RunningEvent>
23
26
  ) {
24
27
  let state = initState();
25
28
  let devCredentials: DevCredentials = undefined;
@@ -44,6 +47,10 @@ export function State(
44
47
  return state.isInitialLoading;
45
48
  },
46
49
 
50
+ isCacheDisabled() {
51
+ return state.initialOptions.disableCache;
52
+ },
53
+
47
54
  setInitialLoading(value: boolean) {
48
55
  state.isInitialLoading = value;
49
56
  },
@@ -99,7 +106,8 @@ export function State(
99
106
  },
100
107
  getRequiredNamespaces() {
101
108
  return unique([
102
- ...(state.initialOptions.ns || [state.initialOptions.defaultNs]),
109
+ self.getDefaultNs(),
110
+ ...(state.initialOptions.ns || []),
103
111
  ...getFallbackArray(state.initialOptions.fallbackNs),
104
112
  ...state.activeNamespaces.keys(),
105
113
  ]);
@@ -123,8 +131,16 @@ export function State(
123
131
  return getFallbackArray(state.initialOptions.fallbackNs);
124
132
  },
125
133
 
134
+ getNs() {
135
+ return state.initialOptions.ns?.length
136
+ ? state.initialOptions.ns
137
+ : [state.initialOptions.defaultNs ?? ''];
138
+ },
139
+
126
140
  getDefaultNs(ns?: NsType) {
127
- return ns === undefined ? state.initialOptions.defaultNs : ns;
141
+ return ns === undefined
142
+ ? state.initialOptions.defaultNs ?? state.initialOptions.ns?.[0] ?? ''
143
+ : ns;
128
144
  },
129
145
 
130
146
  getAvailableLanguages() {
@@ -138,11 +154,15 @@ export function State(
138
154
  }
139
155
  },
140
156
 
157
+ getAvailableNs() {
158
+ return state.initialOptions.availableNs;
159
+ },
160
+
141
161
  withDefaultNs(descriptor: CacheDescriptor): CacheDescriptorInternal {
142
162
  return {
143
163
  namespace:
144
164
  descriptor.namespace === undefined
145
- ? self.getInitialOptions().defaultNs
165
+ ? self.getDefaultNs()
146
166
  : descriptor.namespace,
147
167
  language: descriptor.language,
148
168
  };
@@ -5,6 +5,7 @@ import {
5
5
  OnFormatError,
6
6
  FetchFn,
7
7
  MissingTranslationHandler,
8
+ CachePublicRecord,
8
9
  } from '../../types';
9
10
  import { createFetchFunction, sanitizeUrl } from '../../helpers';
10
11
  import {
@@ -23,6 +24,8 @@ export type TolgeeStaticData = {
23
24
  [key: string]: TreeTranslationsData | (() => Promise<TreeTranslationsData>);
24
25
  };
25
26
 
27
+ export type TolgeeStaticDataProp = TolgeeStaticData | CachePublicRecord[];
28
+
26
29
  export type TolgeeOptionsInternal = {
27
30
  /**
28
31
  * Initial language
@@ -50,8 +53,8 @@ export type TolgeeOptionsInternal = {
50
53
  defaultLanguage?: string;
51
54
 
52
55
  /**
53
- * Languages which can be used for language detection
54
- * and also limits which values can be stored
56
+ * Specify all available languages. Required for language detection or loading all languages at once (loadMatrix).
57
+ * It also limits which values can be stored. Is derrived from `staticData` keys if not provided.
55
58
  */
56
59
  availableLanguages?: string[];
57
60
 
@@ -61,7 +64,7 @@ export type TolgeeOptionsInternal = {
61
64
  fallbackLanguage?: FallbackLanguageOption;
62
65
 
63
66
  /**
64
- * Namespaces which should be always fetched
67
+ * Namespaces which should be always fetched (default: [defaultNs] or [''])
65
68
  */
66
69
  ns?: string[];
67
70
 
@@ -71,9 +74,14 @@ export type TolgeeOptionsInternal = {
71
74
  fallbackNs?: FallbackGeneral;
72
75
 
73
76
  /**
74
- * Default namespace when no namespace defined (default: '')
77
+ * Default namespace when no namespace defined (default: first from `ns`)
78
+ */
79
+ defaultNs?: string;
80
+
81
+ /**
82
+ * Specify all available namespaces. Required for loading all namespaces at once (loadMatrix).
75
83
  */
76
- defaultNs: string;
84
+ availableNs?: string[];
77
85
 
78
86
  /**
79
87
  * These data go directly to cache or you can specify async
@@ -85,8 +93,17 @@ export type TolgeeOptionsInternal = {
85
93
  * 'language:namespace': <translations | async function>
86
94
  * }
87
95
  * ```
96
+ *
97
+ * You can also pass list of `CachePublicRecord`, which is in format:
98
+ *
99
+ * {
100
+ * 'language': <locale>,
101
+ * 'namespace': <namespace>
102
+ * 'data': <translations>
103
+ * }
104
+ *
88
105
  */
89
- staticData?: TolgeeStaticData;
106
+ staticData?: TolgeeStaticDataProp;
90
107
 
91
108
  /**
92
109
  * Switches between invisible and text observer. (Default: invisible)
@@ -124,6 +141,16 @@ export type TolgeeOptionsInternal = {
124
141
  * Use only keys tagged with one of the listed tags
125
142
  */
126
143
  filterTag?: string[];
144
+
145
+ /**
146
+ * automatically load required records on `run` and `changeLanguage` (default: true)
147
+ */
148
+ autoLoadRequiredData: boolean;
149
+
150
+ /**
151
+ * no internal cache is being held inside tolgee
152
+ */
153
+ disableCache: boolean;
127
154
  };
128
155
 
129
156
  export type TolgeeOptions = Partial<
@@ -142,13 +169,14 @@ export type State = {
142
169
  };
143
170
 
144
171
  const defaultValues: TolgeeOptionsInternal = {
145
- defaultNs: '',
146
172
  observerOptions: defaultObserverOptions,
147
173
  observerType: 'invisible',
148
174
  onFormatError: DEFAULT_FORMAT_ERROR,
149
175
  apiUrl: DEFAULT_API_URL,
176
+ autoLoadRequiredData: true,
150
177
  fetch: createFetchFunction(),
151
178
  onTranslationMissing: DEFAULT_MISSING_TRANSLATION,
179
+ disableCache: false,
152
180
  };
153
181
 
154
182
  export const combineOptions = <T extends TolgeeOptions>(
package/src/TolgeeCore.ts CHANGED
@@ -35,21 +35,6 @@ function createTolgee(options: TolgeeOptions) {
35
35
  */
36
36
  on: controller.on,
37
37
 
38
- /**
39
- * Listen for specific namespaces changes.
40
- *
41
- * ```
42
- * const sub = tolgee.onUpdate(handler)
43
- *
44
- * // subscribe to selected namespace
45
- * sub.subscribeNs(['common'])
46
- *
47
- * // unsubscribe
48
- * sub.unsubscribe()
49
- * ```
50
- */
51
- onNsUpdate: controller.onUpdate.listenSome,
52
-
53
38
  /**
54
39
  * Turn off/on events emitting. Is on by default.
55
40
  */
@@ -94,6 +79,18 @@ function createTolgee(options: TolgeeOptions) {
94
79
  */
95
80
  removeActiveNs: controller.removeActiveNs,
96
81
 
82
+ /**
83
+ * Load records which would be loaded by `run` function
84
+ *
85
+ * You can provide language if not previously set on tolgee instance
86
+ */
87
+ loadRequired: controller.loadRequired,
88
+
89
+ /**
90
+ * Load records in matrix (languages x namespaces)
91
+ */
92
+ loadMatrix: controller.loadMatrix,
93
+
97
94
  /**
98
95
  * Manually load multiple records from `Backend` (or `DevBackend` when in dev mode)
99
96
  *
@@ -128,9 +125,9 @@ function createTolgee(options: TolgeeOptions) {
128
125
  isLoaded: controller.isLoaded,
129
126
 
130
127
  /**
131
- * Returns records needed for instance to be `loaded`
128
+ * Returns descriptors of records needed for instance to be `loaded`
132
129
  */
133
- getRequiredRecords: controller.getRequiredRecords,
130
+ getRequiredDescriptors: controller.getRequiredDescriptors,
134
131
 
135
132
  /**
136
133
  * @return `true` if tolgee is loading initial data (triggered by `run`).
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable no-console */
2
2
  import { TolgeeCore, TolgeeInstance } from '../TolgeeCore';
3
- import { TolgeePlugin, TreeTranslationsData } from '../types';
4
- import { resolvablePromise } from './testTools';
3
+ import { TreeTranslationsData } from '../types';
4
+ import { DevToolsPlugin, DevToolsThrow, resolvablePromise } from './testTools';
5
5
 
6
6
  function waitForInitialLoad(tolgee: TolgeeInstance) {
7
7
  return new Promise<void>((resolve) => {
@@ -12,30 +12,6 @@ function waitForInitialLoad(tolgee: TolgeeInstance) {
12
12
  });
13
13
  }
14
14
 
15
- const DevToolsPlugin =
16
- (postfix = ''): TolgeePlugin =>
17
- (tolgee, tools) => {
18
- tolgee.updateOptions({ apiKey: 'test', apiUrl: 'test' });
19
- tools.setDevBackend({
20
- getRecord({ language, namespace }) {
21
- return Promise.resolve({
22
- test: { sub: `${language}.${namespace || 'default'}${postfix}` },
23
- });
24
- },
25
- });
26
- return tolgee;
27
- };
28
-
29
- const DevToolsThrow = (): TolgeePlugin => (tolgee, tools) => {
30
- tolgee.updateOptions({ apiKey: 'test', apiUrl: 'test' });
31
- tools.setDevBackend({
32
- getRecord() {
33
- return Promise.reject();
34
- },
35
- });
36
- return tolgee;
37
- };
38
-
39
15
  describe('cache', () => {
40
16
  let tolgee: TolgeeInstance;
41
17
 
@@ -28,14 +28,14 @@ describe('using tolgee as client', () => {
28
28
  });
29
29
  expect(promiseEnTest).toBeCalledTimes(1);
30
30
  expect(promiseEnCommon).not.toBeCalled();
31
- expect(enTest).toEqual(new Map([['test', 'Test']]));
31
+ expect(enTest).toEqual({ test: 'Test' });
32
32
 
33
33
  const enCommon = await tolgee.loadRecord({
34
34
  language: 'en',
35
35
  namespace: 'common',
36
36
  });
37
37
  expect(promiseEnCommon).toBeCalledTimes(1);
38
- expect(enCommon).toEqual(new Map([['cancel', 'Cancel']]));
38
+ expect(enCommon).toEqual({ cancel: 'Cancel' });
39
39
 
40
40
  const esTest = await tolgee.loadRecord({
41
41
  language: 'es',
@@ -43,6 +43,6 @@ describe('using tolgee as client', () => {
43
43
  });
44
44
  expect(promiseEsTest).toBeCalledTimes(1);
45
45
  expect(promiseEsCommon).not.toBeCalled();
46
- expect(esTest).toEqual(new Map([['test', 'Testa']]));
46
+ expect(esTest).toEqual({ test: 'Testa' });
47
47
  });
48
48
  });
@@ -6,29 +6,56 @@ describe('events', () => {
6
6
  const handler = jest.fn((lang) => {});
7
7
  tolgee.on('language', handler);
8
8
  await tolgee.changeLanguage('es');
9
- expect(handler).toHaveBeenCalledWith({ value: 'es' });
9
+ expect(handler).toHaveBeenCalledWith({ type: 'language', value: 'es' });
10
10
  });
11
11
 
12
- it('correctly emits translation change listeners', async () => {
12
+ it('emits pendingLanguage event correctly', async () => {
13
13
  const tolgee = TolgeeCore().init({
14
14
  language: 'en',
15
15
  staticData: {
16
- en: { hello: 'World', language: 'English' },
17
- es: { hello: 'Mundo', language: 'Spanish' },
16
+ en: () => Promise.resolve().then(() => ({ test: 'Test' })),
17
+ es: () => Promise.resolve().then(() => ({ test: 'El Test' })),
18
18
  },
19
19
  });
20
- const helloHandler = jest.fn(() => {});
21
- const languageHandler = jest.fn(() => {});
22
-
23
- tolgee.onNsUpdate(helloHandler);
24
- tolgee.onNsUpdate(languageHandler);
20
+ await tolgee.run();
21
+ const languageHandler = jest.fn();
22
+ const pendingLanguageHandler = jest.fn();
23
+ tolgee.on('language', languageHandler);
24
+ tolgee.on('pendingLanguage', pendingLanguageHandler);
25
+ const promise = tolgee.changeLanguage('es');
26
+ expect(pendingLanguageHandler).toHaveBeenCalledTimes(1);
27
+ expect(languageHandler).toHaveBeenCalledTimes(0);
28
+ await promise;
29
+ expect(pendingLanguageHandler).toHaveBeenCalledTimes(1);
30
+ expect(languageHandler).toHaveBeenCalledTimes(1);
31
+ });
25
32
 
26
- tolgee.changeTranslation({ language: 'es' }, 'hello', 'Světe');
33
+ it('groups cache events with language change event', async () => {
34
+ const tolgee = TolgeeCore().init({ language: 'en' });
35
+ const handler = jest.fn((e) => {});
36
+ tolgee.on('update', handler);
37
+ tolgee.addStaticData({ en: { test: 'Test' } });
27
38
  tolgee.changeLanguage('es');
39
+ expect(handler).toHaveBeenCalledWith([
40
+ { type: 'cache', value: { language: 'en', namespace: '' } },
41
+ { type: 'language', value: 'es' },
42
+ ]);
43
+ });
28
44
 
29
- await Promise.resolve();
30
- expect(helloHandler).toHaveBeenCalledTimes(1);
31
- expect(languageHandler).toHaveBeenCalledTimes(1);
45
+ it('groups cache events with initialLoad event', async () => {
46
+ const tolgee = TolgeeCore().init({
47
+ language: 'en',
48
+ staticData: {
49
+ en: () => Promise.resolve({ test: 'Test' }),
50
+ },
51
+ });
52
+ const handler = jest.fn((e) => {});
53
+ tolgee.on('update', handler);
54
+ await tolgee.run();
55
+ expect(handler).toHaveBeenCalledWith([
56
+ { type: 'cache', value: { language: 'en', namespace: '' } },
57
+ { type: 'initialLoad', value: undefined },
58
+ ]);
32
59
  });
33
60
 
34
61
  it('stop emitting when turned off', async () => {
@@ -0,0 +1,123 @@
1
+ import { TolgeeCore } from '../TolgeeCore';
2
+ import { TolgeeInstance } from '../types';
3
+ import { BackendPlugin, DevToolsPlugin } from './testTools';
4
+
5
+ describe('load required', () => {
6
+ let tolgee: TolgeeInstance;
7
+
8
+ beforeEach(async () => {
9
+ tolgee = TolgeeCore()
10
+ .use(DevToolsPlugin('.dev'))
11
+ .use(BackendPlugin('.prod'))
12
+ .init({
13
+ language: 'en',
14
+ apiKey: 'test',
15
+ apiUrl: 'test',
16
+ });
17
+ });
18
+
19
+ it('loads english and empty ns', async () => {
20
+ const records = await tolgee.loadMatrix({
21
+ languages: ['en'],
22
+ namespaces: [''],
23
+ });
24
+ expect(records).toEqual([
25
+ {
26
+ cacheKey: 'en',
27
+ data: { 'test.sub': 'en.default.dev' },
28
+ language: 'en',
29
+ namespace: '',
30
+ },
31
+ ]);
32
+ });
33
+
34
+ it('loads english and empty ns', async () => {
35
+ const records = await tolgee.loadMatrix({
36
+ languages: ['en'],
37
+ namespaces: [''],
38
+ });
39
+ expect(records).toEqual([
40
+ {
41
+ cacheKey: 'en',
42
+ data: { 'test.sub': 'en.default.dev' },
43
+ language: 'en',
44
+ namespace: '',
45
+ },
46
+ ]);
47
+ });
48
+
49
+ it('fails to load all namespaces when no availableNs specified', async () => {
50
+ const promise = tolgee.loadMatrix({
51
+ languages: ['en'],
52
+ namespaces: 'all',
53
+ });
54
+
55
+ expect(() => promise).rejects.toThrow(
56
+ "Tolgee: You need to specify 'availableNs' option"
57
+ );
58
+ });
59
+
60
+ it('fails to load all languages when no availableLanguages specified', async () => {
61
+ const promise = tolgee.loadMatrix({
62
+ languages: 'all',
63
+ namespaces: [''],
64
+ });
65
+
66
+ expect(() => promise).rejects.toThrow(
67
+ "Tolgee: You need to specify 'availableLanguages' option"
68
+ );
69
+ });
70
+
71
+ it('loads all dev', async () => {
72
+ tolgee.updateOptions({
73
+ availableLanguages: ['en'],
74
+ availableNs: ['', 'test'],
75
+ });
76
+ const result = await tolgee.loadMatrix({
77
+ languages: 'all',
78
+ namespaces: 'all',
79
+ });
80
+
81
+ expect(result).toEqual([
82
+ {
83
+ cacheKey: 'en',
84
+ data: { 'test.sub': 'en.default.dev' },
85
+ language: 'en',
86
+ namespace: '',
87
+ },
88
+ {
89
+ cacheKey: 'en:test',
90
+ data: { 'test.sub': 'en.test.dev' },
91
+ language: 'en',
92
+ namespace: 'test',
93
+ },
94
+ ]);
95
+ });
96
+
97
+ it('loads all prod', async () => {
98
+ tolgee.updateOptions({
99
+ availableLanguages: ['en'],
100
+ availableNs: ['', 'test'],
101
+ });
102
+ const result = await tolgee.loadMatrix({
103
+ languages: 'all',
104
+ namespaces: 'all',
105
+ noDev: true,
106
+ });
107
+
108
+ expect(result).toEqual([
109
+ {
110
+ cacheKey: 'en',
111
+ data: { 'test.sub': 'en.default.prod' },
112
+ language: 'en',
113
+ namespace: '',
114
+ },
115
+ {
116
+ cacheKey: 'en:test',
117
+ data: { 'test.sub': 'en.test.prod' },
118
+ language: 'en',
119
+ namespace: 'test',
120
+ },
121
+ ]);
122
+ });
123
+ });
@@ -0,0 +1,71 @@
1
+ import { TolgeeCore } from '../TolgeeCore';
2
+ import { TolgeeInstance } from '../types';
3
+ import { BackendPlugin, DevToolsPlugin } from './testTools';
4
+
5
+ describe('load required', () => {
6
+ let tolgee: TolgeeInstance;
7
+
8
+ beforeEach(async () => {
9
+ tolgee = TolgeeCore()
10
+ .use(DevToolsPlugin('.dev'))
11
+ .use(BackendPlugin('.prod'))
12
+ .init({
13
+ language: 'en',
14
+ apiKey: 'test',
15
+ apiUrl: 'test',
16
+ });
17
+ });
18
+
19
+ it('loads required records', async () => {
20
+ const records = await tolgee.loadRequired();
21
+ expect(records).toEqual([
22
+ {
23
+ cacheKey: 'en',
24
+ data: { 'test.sub': 'en.default.dev' },
25
+ language: 'en',
26
+ namespace: '',
27
+ },
28
+ ]);
29
+ });
30
+
31
+ it('loads required records when language is passed through parameter', async () => {
32
+ tolgee.updateOptions({ language: undefined });
33
+ const noRecords = await tolgee.loadRequired();
34
+ expect(noRecords).toEqual([]);
35
+ const records = await tolgee.loadRequired({ language: 'en' });
36
+ expect(records).toEqual([
37
+ {
38
+ cacheKey: 'en',
39
+ data: { 'test.sub': 'en.default.dev' },
40
+ language: 'en',
41
+ namespace: '',
42
+ },
43
+ ]);
44
+ });
45
+
46
+ it('loads records with namespaces', async () => {
47
+ tolgee.updateOptions({ defaultNs: 'namespace' });
48
+ const records = await tolgee.loadRequired();
49
+ expect(records).toEqual([
50
+ {
51
+ cacheKey: 'en:namespace',
52
+ data: { 'test.sub': 'en.namespace.dev' },
53
+ language: 'en',
54
+ namespace: 'namespace',
55
+ },
56
+ ]);
57
+ });
58
+
59
+ it('loads records production', async () => {
60
+ tolgee.updateOptions();
61
+ const records = await tolgee.loadRequired({ noDev: true });
62
+ expect(records).toEqual([
63
+ {
64
+ cacheKey: 'en',
65
+ data: { 'test.sub': 'en.default.prod' },
66
+ language: 'en',
67
+ namespace: '',
68
+ },
69
+ ]);
70
+ });
71
+ });