@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.
- package/dist/tolgee.cjs.js +227 -186
- package/dist/tolgee.cjs.js.map +1 -1
- package/dist/tolgee.cjs.min.js +1 -1
- package/dist/tolgee.cjs.min.js.map +1 -1
- package/dist/tolgee.esm.js +227 -186
- package/dist/tolgee.esm.js.map +1 -1
- package/dist/tolgee.esm.min.js +1 -1
- package/dist/tolgee.esm.min.js.map +1 -1
- package/dist/tolgee.esm.min.mjs +1 -1
- package/dist/tolgee.esm.min.mjs.map +1 -1
- package/dist/tolgee.esm.mjs +227 -186
- package/dist/tolgee.esm.mjs.map +1 -1
- package/dist/tolgee.umd.js +227 -186
- package/dist/tolgee.umd.js.map +1 -1
- package/dist/tolgee.umd.min.js +1 -1
- package/dist/tolgee.umd.min.js.map +1 -1
- package/lib/Controller/Cache/Cache.d.ts +8 -12
- package/lib/Controller/Cache/helpers.d.ts +3 -2
- package/lib/Controller/Controller.d.ts +57 -26
- package/lib/Controller/Events/EventEmitter.d.ts +5 -5
- package/lib/Controller/Events/EventEmitterCombined.d.ts +6 -0
- package/lib/Controller/Events/Events.d.ts +39 -12
- package/lib/Controller/State/State.d.ts +10 -4
- package/lib/Controller/State/initState.d.ts +29 -7
- package/lib/TolgeeCore.d.ts +25 -28
- package/lib/helpers.d.ts +2 -2
- package/lib/types/cache.d.ts +19 -1
- package/lib/types/events.d.ts +24 -23
- package/lib/types/index.d.ts +1 -1
- package/package.json +2 -2
- package/src/Controller/Cache/Cache.test.ts +189 -0
- package/src/Controller/Cache/Cache.ts +118 -57
- package/src/Controller/Cache/helpers.ts +12 -3
- package/src/Controller/Controller.ts +81 -27
- package/src/Controller/Events/EventEmitter.ts +23 -15
- package/src/Controller/Events/EventEmitterCombined.ts +55 -0
- package/src/Controller/Events/Events.ts +31 -23
- package/src/Controller/Plugins/Plugins.ts +5 -0
- package/src/Controller/State/State.ts +26 -6
- package/src/Controller/State/initState.ts +35 -7
- package/src/TolgeeCore.ts +14 -17
- package/src/__test/cache.test.ts +2 -26
- package/src/__test/client.test.ts +3 -3
- package/src/__test/events.test.ts +40 -13
- package/src/__test/load.matrix.test.ts +123 -0
- package/src/__test/load.required.test.ts +71 -0
- package/src/__test/namespaces.required.test.ts +52 -0
- package/src/__test/options.test.ts +1 -1
- package/src/__test/testTools.ts +39 -0
- package/src/helpers.ts +2 -1
- package/src/types/cache.ts +24 -1
- package/src/types/events.ts +33 -24
- package/src/types/index.ts +1 -0
- package/lib/Controller/Events/EventEmitterSelective.d.ts +0 -7
- package/src/Controller/Events/EventEmitterSelective.test.ts +0 -110
- 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
|
-
|
|
5
|
-
|
|
3
|
+
CacheEvent,
|
|
4
|
+
FetchingEvent,
|
|
5
|
+
InitialLoadEvent,
|
|
6
|
+
LanguageEvent,
|
|
7
|
+
LoadingEvent,
|
|
8
|
+
PendingLanguageEvent,
|
|
9
|
+
PermanentChangeEvent,
|
|
10
|
+
RunningEvent,
|
|
6
11
|
TolgeeOn,
|
|
7
|
-
|
|
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<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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((
|
|
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<
|
|
21
|
-
onPendingLanguageChange: EventEmitterInstance<
|
|
22
|
-
onRunningChange: EventEmitterInstance<
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
54
|
-
*
|
|
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
|
-
|
|
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?:
|
|
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
|
-
|
|
130
|
+
getRequiredDescriptors: controller.getRequiredDescriptors,
|
|
134
131
|
|
|
135
132
|
/**
|
|
136
133
|
* @return `true` if tolgee is loading initial data (triggered by `run`).
|
package/src/__test/cache.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-console */
|
|
2
2
|
import { TolgeeCore, TolgeeInstance } from '../TolgeeCore';
|
|
3
|
-
import {
|
|
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(
|
|
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(
|
|
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(
|
|
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('
|
|
12
|
+
it('emits pendingLanguage event correctly', async () => {
|
|
13
13
|
const tolgee = TolgeeCore().init({
|
|
14
14
|
language: 'en',
|
|
15
15
|
staticData: {
|
|
16
|
-
en:
|
|
17
|
-
es: {
|
|
16
|
+
en: () => Promise.resolve().then(() => ({ test: 'Test' })),
|
|
17
|
+
es: () => Promise.resolve().then(() => ({ test: 'El Test' })),
|
|
18
18
|
},
|
|
19
19
|
});
|
|
20
|
-
|
|
21
|
-
const languageHandler = jest.fn(
|
|
22
|
-
|
|
23
|
-
tolgee.
|
|
24
|
-
tolgee.
|
|
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
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
+
});
|