@tolgee/core 4.9.2 → 4.9.3-rc.128edeb.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 +1275 -7024
- 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 +1404 -0
- package/dist/tolgee.esm.js.map +1 -0
- package/dist/tolgee.esm.min.mjs +1 -1
- package/dist/tolgee.esm.min.mjs.map +1 -1
- package/dist/tolgee.umd.js +1275 -7024
- 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 +22 -0
- package/lib/Controller/Cache/helpers.d.ts +4 -0
- package/lib/Controller/Controller.d.ts +110 -0
- package/lib/Controller/Events/EventEmitter.d.ts +6 -0
- package/lib/Controller/Events/EventEmitterSelective.d.ts +7 -0
- package/lib/Controller/Events/Events.d.ts +14 -0
- package/lib/Controller/Plugins/Plugins.d.ts +36 -0
- package/lib/Controller/State/State.d.ts +39 -0
- package/lib/Controller/State/helpers.d.ts +6 -0
- package/lib/Controller/State/initObserverOptions.d.ts +13 -0
- package/lib/Controller/State/initState.d.ts +47 -0
- package/lib/Controller/ValueObserver.d.ts +5 -0
- package/lib/FormatSimple/FormatError.d.ts +7 -0
- package/lib/FormatSimple/FormatSimple.d.ts +3 -0
- package/lib/FormatSimple/formatParser.d.ts +1 -0
- package/lib/FormatSimple/formatter.d.ts +2 -0
- package/lib/Tolgee.d.ts +2 -68
- package/lib/TranslateParams.d.ts +2 -0
- package/lib/{Constants/Global.d.ts → constants.d.ts} +1 -3
- package/lib/helpers.d.ts +3 -0
- package/lib/index.d.ts +4 -8
- package/lib/types.d.ts +244 -84
- package/package.json +21 -29
- package/src/Controller/Cache/Cache.ts +293 -0
- package/src/Controller/Cache/helpers.ts +37 -0
- package/src/Controller/Controller.ts +310 -0
- package/src/Controller/Events/EventEmitter.ts +30 -0
- package/src/Controller/Events/EventEmitterSelective.test.ts +125 -0
- package/src/Controller/Events/EventEmitterSelective.ts +188 -0
- package/src/Controller/Events/Events.ts +66 -0
- package/src/Controller/Plugins/Plugins.ts +315 -0
- package/src/Controller/State/State.ts +175 -0
- package/src/Controller/State/helpers.ts +41 -0
- package/src/Controller/State/initObserverOptions.ts +38 -0
- package/src/Controller/State/initState.ts +81 -0
- package/src/Controller/ValueObserver.ts +26 -0
- package/src/FormatSimple/FormatError.ts +26 -0
- package/src/FormatSimple/FormatSimple.ts +13 -0
- package/src/FormatSimple/formatParser.ts +133 -0
- package/src/FormatSimple/formatter.test.ts +190 -0
- package/src/FormatSimple/formatter.ts +19 -0
- package/src/Tolgee.ts +79 -330
- package/src/TranslateParams.test.ts +41 -0
- package/src/TranslateParams.ts +51 -0
- package/src/__test/backend.test.ts +48 -0
- package/src/__test/cache.test.ts +148 -0
- package/src/__test/client.test.ts +48 -0
- package/src/__test/events.test.ts +33 -0
- package/src/__test/format.simple.test.ts +26 -0
- package/src/__test/initialization.test.ts +85 -0
- package/src/__test/jest-setup.ts +2 -0
- package/src/__test/languageDetection.test.ts +129 -0
- package/src/__test/languageStorage.test.ts +145 -0
- package/src/__test/languages.test.ts +112 -0
- package/src/__test/loading.test.ts +39 -0
- package/src/__test/namespaces.test.ts +99 -0
- package/src/__test/namespacesFallback.test.ts +74 -0
- package/src/__test/plugins.test.ts +136 -0
- package/src/__test/testTools.ts +7 -0
- package/src/{Constants/Global.ts → constants.ts} +1 -6
- package/src/helpers.ts +17 -0
- package/src/index.ts +9 -8
- package/src/types.ts +338 -90
- package/README.md +0 -45
- package/dist/Constants/Global.d.ts +0 -6
- package/dist/Constants/ModifierKey.d.ts +0 -6
- package/dist/Errors/ApiHttpError.d.ts +0 -5
- package/dist/Observer.d.ts +0 -14
- package/dist/Observer.test.d.ts +0 -2
- package/dist/Properties.d.ts +0 -17
- package/dist/Properties.test.d.ts +0 -1
- package/dist/Tolgee.d.ts +0 -68
- package/dist/Tolgee.test.d.ts +0 -1
- package/dist/TolgeeConfig.d.ts +0 -69
- package/dist/TolgeeConfig.test.d.ts +0 -1
- package/dist/__integration/FormatterIcu.test.d.ts +0 -1
- package/dist/__integration/FormatterMissing.d.ts +0 -1
- package/dist/__integration/Tolgee.test.d.ts +0 -1
- package/dist/__integration/TolgeeInvisible.test.d.ts +0 -1
- package/dist/__integration/mockTranslations.d.ts +0 -7
- package/dist/__integration/testConfig.d.ts +0 -9
- package/dist/__testFixtures/classMock.d.ts +0 -3
- package/dist/__testFixtures/createElement.d.ts +0 -2
- package/dist/__testFixtures/createTestDom.d.ts +0 -9
- package/dist/__testFixtures/mocked.d.ts +0 -20
- package/dist/__testFixtures/setupAfterEnv.d.ts +0 -8
- package/dist/helpers/NodeHelper.d.ts +0 -14
- package/dist/helpers/TextHelper.d.ts +0 -5
- package/dist/helpers/TextHelper.test.d.ts +0 -1
- package/dist/helpers/commonTypes.d.ts +0 -2
- package/dist/helpers/encoderPolyfill.d.ts +0 -8
- package/dist/helpers/secret.d.ts +0 -6
- package/dist/helpers/secret.test.d.ts +0 -1
- package/dist/helpers/sleep.d.ts +0 -1
- package/dist/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
- package/dist/highlighter/HighlightFunctionsInitializer.test.d.ts +0 -1
- package/dist/highlighter/MouseEventHandler.d.ts +0 -29
- package/dist/highlighter/MouseEventHandler.test.d.ts +0 -1
- package/dist/highlighter/TranslationHighlighter.d.ts +0 -14
- package/dist/highlighter/TranslationHighlighter.test.d.ts +0 -1
- package/dist/index.d.ts +0 -10
- package/dist/internal.d.ts +0 -2
- package/dist/modules/IcuFormatter.d.ts +0 -2
- package/dist/modules/IcuFormatter.test.d.ts +0 -1
- package/dist/modules/index.d.ts +0 -1
- package/dist/services/ApiHttpService.d.ts +0 -15
- package/dist/services/CoreService.d.ts +0 -18
- package/dist/services/CoreService.test.d.ts +0 -1
- package/dist/services/DependencyService.d.ts +0 -39
- package/dist/services/DependencyService.test.d.ts +0 -1
- package/dist/services/ElementRegistrar.d.ts +0 -19
- package/dist/services/ElementRegistrar.test.d.ts +0 -1
- package/dist/services/EventEmitter.d.ts +0 -13
- package/dist/services/EventService.d.ts +0 -9
- package/dist/services/ModuleService.d.ts +0 -5
- package/dist/services/ScreenshotService.d.ts +0 -15
- package/dist/services/Subscription.d.ts +0 -5
- package/dist/services/TextService.d.ts +0 -14
- package/dist/services/TextService.test.d.ts +0 -1
- package/dist/services/TranslationService.d.ts +0 -75
- package/dist/services/TranslationService.test.d.ts +0 -1
- package/dist/services/__mocks__/CoreService.d.ts +0 -2
- package/dist/tolgee.esm.mjs +0 -7150
- package/dist/tolgee.esm.mjs.map +0 -1
- package/dist/toolsManager/Messages.d.ts +0 -8
- package/dist/toolsManager/Messages.test.d.ts +0 -1
- package/dist/toolsManager/PluginManager.d.ts +0 -21
- package/dist/toolsManager/PluginManager.test.d.ts +0 -1
- package/dist/types/DTOs.d.ts +0 -20
- package/dist/types/apiSchema.generated.d.ts +0 -6185
- package/dist/types.d.ts +0 -123
- package/dist/wrappers/AbstractWrapper.d.ts +0 -8
- package/dist/wrappers/NodeHandler.d.ts +0 -18
- package/dist/wrappers/WrappedHandler.d.ts +0 -8
- package/dist/wrappers/invisible/AttributeHandler.d.ts +0 -8
- package/dist/wrappers/invisible/Coder.d.ts +0 -7
- package/dist/wrappers/invisible/ContentHandler.d.ts +0 -6
- package/dist/wrappers/invisible/CoreHandler.d.ts +0 -10
- package/dist/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
- package/dist/wrappers/invisible/ValueMemory.d.ts +0 -5
- package/dist/wrappers/invisible/ValueMemory.test.d.ts +0 -1
- package/dist/wrappers/text/AttributeHandler.d.ts +0 -8
- package/dist/wrappers/text/AttributeHandler.test.d.ts +0 -1
- package/dist/wrappers/text/Coder.d.ts +0 -15
- package/dist/wrappers/text/Coder.test.d.ts +0 -1
- package/dist/wrappers/text/ContentHandler.d.ts +0 -8
- package/dist/wrappers/text/ContentHandler.test.d.ts +0 -1
- package/dist/wrappers/text/CoreHandler.d.ts +0 -17
- package/dist/wrappers/text/CoreHandler.test.d.ts +0 -1
- package/dist/wrappers/text/TextWrapper.d.ts +0 -20
- package/index.js +0 -7
- package/lib/Constants/ModifierKey.d.ts +0 -6
- package/lib/Errors/ApiHttpError.d.ts +0 -5
- package/lib/Observer.d.ts +0 -14
- package/lib/Properties.d.ts +0 -17
- package/lib/TolgeeConfig.d.ts +0 -69
- package/lib/helpers/NodeHelper.d.ts +0 -14
- package/lib/helpers/TextHelper.d.ts +0 -5
- package/lib/helpers/commonTypes.d.ts +0 -2
- package/lib/helpers/encoderPolyfill.d.ts +0 -8
- package/lib/helpers/secret.d.ts +0 -6
- package/lib/helpers/sleep.d.ts +0 -1
- package/lib/highlighter/HighlightFunctionsInitializer.d.ts +0 -10
- package/lib/highlighter/MouseEventHandler.d.ts +0 -29
- package/lib/highlighter/TranslationHighlighter.d.ts +0 -14
- package/lib/modules/IcuFormatter.d.ts +0 -2
- package/lib/modules/index.d.ts +0 -1
- package/lib/services/ApiHttpService.d.ts +0 -15
- package/lib/services/CoreService.d.ts +0 -18
- package/lib/services/DependencyService.d.ts +0 -39
- package/lib/services/ElementRegistrar.d.ts +0 -19
- package/lib/services/EventEmitter.d.ts +0 -13
- package/lib/services/EventService.d.ts +0 -9
- package/lib/services/ModuleService.d.ts +0 -5
- package/lib/services/ScreenshotService.d.ts +0 -15
- package/lib/services/Subscription.d.ts +0 -5
- package/lib/services/TextService.d.ts +0 -14
- package/lib/services/TranslationService.d.ts +0 -75
- package/lib/toolsManager/Messages.d.ts +0 -8
- package/lib/toolsManager/PluginManager.d.ts +0 -21
- package/lib/types/DTOs.d.ts +0 -20
- package/lib/types/apiSchema.generated.d.ts +0 -6185
- package/lib/wrappers/AbstractWrapper.d.ts +0 -8
- package/lib/wrappers/NodeHandler.d.ts +0 -18
- package/lib/wrappers/WrappedHandler.d.ts +0 -8
- package/lib/wrappers/invisible/AttributeHandler.d.ts +0 -8
- package/lib/wrappers/invisible/Coder.d.ts +0 -7
- package/lib/wrappers/invisible/ContentHandler.d.ts +0 -6
- package/lib/wrappers/invisible/CoreHandler.d.ts +0 -10
- package/lib/wrappers/invisible/InvisibleWrapper.d.ts +0 -18
- package/lib/wrappers/invisible/ValueMemory.d.ts +0 -5
- package/lib/wrappers/text/AttributeHandler.d.ts +0 -8
- package/lib/wrappers/text/Coder.d.ts +0 -15
- package/lib/wrappers/text/ContentHandler.d.ts +0 -8
- package/lib/wrappers/text/CoreHandler.d.ts +0 -17
- package/lib/wrappers/text/TextWrapper.d.ts +0 -20
- package/src/Constants/ModifierKey.ts +0 -6
- package/src/Errors/ApiHttpError.ts +0 -8
- package/src/Observer.test.ts +0 -119
- package/src/Observer.ts +0 -68
- package/src/Properties.test.ts +0 -150
- package/src/Properties.ts +0 -112
- package/src/Tolgee.test.ts +0 -473
- package/src/TolgeeConfig.test.ts +0 -21
- package/src/TolgeeConfig.ts +0 -134
- package/src/__integration/FormatterIcu.test.ts +0 -80
- package/src/__integration/FormatterMissing.ts +0 -54
- package/src/__integration/Tolgee.test.ts +0 -90
- package/src/__integration/TolgeeInvisible.test.ts +0 -145
- package/src/__integration/mockTranslations.ts +0 -6
- package/src/__integration/testConfig.ts +0 -16
- package/src/__testFixtures/classMock.ts +0 -11
- package/src/__testFixtures/createElement.ts +0 -43
- package/src/__testFixtures/createTestDom.ts +0 -26
- package/src/__testFixtures/mocked.ts +0 -25
- package/src/__testFixtures/setupAfterEnv.ts +0 -34
- package/src/helpers/NodeHelper.ts +0 -90
- package/src/helpers/TextHelper.test.ts +0 -62
- package/src/helpers/TextHelper.ts +0 -58
- package/src/helpers/commonTypes.ts +0 -8
- package/src/helpers/encoderPolyfill.ts +0 -96
- package/src/helpers/secret.test.ts +0 -61
- package/src/helpers/secret.ts +0 -68
- package/src/helpers/sleep.ts +0 -2
- package/src/highlighter/HighlightFunctionsInitializer.test.ts +0 -40
- package/src/highlighter/HighlightFunctionsInitializer.ts +0 -61
- package/src/highlighter/MouseEventHandler.test.ts +0 -151
- package/src/highlighter/MouseEventHandler.ts +0 -191
- package/src/highlighter/TranslationHighlighter.test.ts +0 -177
- package/src/highlighter/TranslationHighlighter.ts +0 -113
- package/src/internal.ts +0 -2
- package/src/modules/IcuFormatter.test.ts +0 -21
- package/src/modules/IcuFormatter.ts +0 -39
- package/src/modules/index.ts +0 -1
- package/src/services/ApiHttpService.ts +0 -85
- package/src/services/CoreService.test.ts +0 -141
- package/src/services/CoreService.ts +0 -76
- package/src/services/DependencyService.test.ts +0 -51
- package/src/services/DependencyService.ts +0 -116
- package/src/services/ElementRegistrar.test.ts +0 -131
- package/src/services/ElementRegistrar.ts +0 -108
- package/src/services/EventEmitter.ts +0 -52
- package/src/services/EventService.ts +0 -14
- package/src/services/ModuleService.ts +0 -14
- package/src/services/ScreenshotService.ts +0 -31
- package/src/services/Subscription.ts +0 -7
- package/src/services/TextService.test.ts +0 -88
- package/src/services/TextService.ts +0 -82
- package/src/services/TranslationService.test.ts +0 -358
- package/src/services/TranslationService.ts +0 -417
- package/src/services/__mocks__/CoreService.ts +0 -17
- package/src/toolsManager/Messages.test.ts +0 -79
- package/src/toolsManager/Messages.ts +0 -60
- package/src/toolsManager/PluginManager.test.ts +0 -108
- package/src/toolsManager/PluginManager.ts +0 -129
- package/src/types/DTOs.ts +0 -25
- package/src/types/apiSchema.generated.ts +0 -6208
- package/src/wrappers/AbstractWrapper.ts +0 -14
- package/src/wrappers/NodeHandler.ts +0 -143
- package/src/wrappers/WrappedHandler.ts +0 -28
- package/src/wrappers/invisible/AttributeHandler.ts +0 -23
- package/src/wrappers/invisible/Coder.ts +0 -65
- package/src/wrappers/invisible/ContentHandler.ts +0 -15
- package/src/wrappers/invisible/CoreHandler.ts +0 -17
- package/src/wrappers/invisible/InvisibleWrapper.ts +0 -59
- package/src/wrappers/invisible/ValueMemory.test.ts +0 -25
- package/src/wrappers/invisible/ValueMemory.ts +0 -16
- package/src/wrappers/text/AttributeHandler.test.ts +0 -118
- package/src/wrappers/text/AttributeHandler.ts +0 -25
- package/src/wrappers/text/Coder.test.ts +0 -298
- package/src/wrappers/text/Coder.ts +0 -202
- package/src/wrappers/text/ContentHandler.test.ts +0 -185
- package/src/wrappers/text/ContentHandler.ts +0 -21
- package/src/wrappers/text/CoreHandler.test.ts +0 -106
- package/src/wrappers/text/CoreHandler.ts +0 -45
- package/src/wrappers/text/TextWrapper.ts +0 -69
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CacheDescriptor,
|
|
3
|
+
CacheDescriptorInternal,
|
|
4
|
+
DevCredentials,
|
|
5
|
+
EventEmitterInstance,
|
|
6
|
+
FallbackNSTranslation,
|
|
7
|
+
} from '../../types';
|
|
8
|
+
import { decodeCacheKey } from '../Cache/helpers';
|
|
9
|
+
import { getFallbackArray, getFallbackFromStruct, unique } from './helpers';
|
|
10
|
+
import { initObserverOptions, ObserverOptions } from './initObserverOptions';
|
|
11
|
+
import { initState, Options } from './initState';
|
|
12
|
+
|
|
13
|
+
export const State = (
|
|
14
|
+
onLanguageChange: EventEmitterInstance<string>,
|
|
15
|
+
onPendingLanguageChange: EventEmitterInstance<string>,
|
|
16
|
+
onRunningChange: EventEmitterInstance<boolean>
|
|
17
|
+
) => {
|
|
18
|
+
let state = initState();
|
|
19
|
+
let observerOptions = initObserverOptions();
|
|
20
|
+
let devCredentials: DevCredentials = undefined;
|
|
21
|
+
|
|
22
|
+
function init(options?: Partial<Options>) {
|
|
23
|
+
state = initState(options, state);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isRunning() {
|
|
27
|
+
return state.isRunning;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function setRunning(value: boolean) {
|
|
31
|
+
if (state.isRunning !== value) {
|
|
32
|
+
state.isRunning = value;
|
|
33
|
+
onRunningChange.emit(value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function isInitialLoading() {
|
|
38
|
+
return state.isInitialLoading;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function setInitialLoading(value: boolean) {
|
|
42
|
+
state.isInitialLoading = value;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function getLanguage() {
|
|
46
|
+
return state.language || state.initialOptions.language;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function setLanguage(language: string) {
|
|
50
|
+
if (state.language !== language) {
|
|
51
|
+
state.language = language;
|
|
52
|
+
onLanguageChange.emit(language);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function getPendingLanguage() {
|
|
57
|
+
return state.pendingLanguage || getLanguage();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function setPendingLanguage(language: string) {
|
|
61
|
+
if (state.pendingLanguage !== language) {
|
|
62
|
+
state.pendingLanguage = language;
|
|
63
|
+
onPendingLanguageChange.emit(language);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function getInitialOptions() {
|
|
68
|
+
return { ...state.initialOptions, ...devCredentials };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function addActiveNs(ns: FallbackNSTranslation) {
|
|
72
|
+
const namespaces = getFallbackArray(ns);
|
|
73
|
+
namespaces.forEach((namespace) => {
|
|
74
|
+
const value = state.activeNamespaces.get(namespace);
|
|
75
|
+
if (value !== undefined) {
|
|
76
|
+
state.activeNamespaces.set(namespace, value + 1);
|
|
77
|
+
} else {
|
|
78
|
+
state.activeNamespaces.set(namespace, 1);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function removeActiveNs(ns: FallbackNSTranslation) {
|
|
84
|
+
const namespaces = getFallbackArray(ns);
|
|
85
|
+
namespaces.forEach((namespace) => {
|
|
86
|
+
const value = state.activeNamespaces.get(namespace);
|
|
87
|
+
if (value !== undefined && value > 1) {
|
|
88
|
+
state.activeNamespaces.set(namespace, value - 1);
|
|
89
|
+
} else {
|
|
90
|
+
state.activeNamespaces.delete(namespace);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function getRequiredNamespaces() {
|
|
96
|
+
return unique([
|
|
97
|
+
...(state.initialOptions.ns || [state.initialOptions.defaultNs]),
|
|
98
|
+
...state.activeNamespaces.keys(),
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function getFallbackLangs(lang?: string) {
|
|
103
|
+
const language = lang || getLanguage();
|
|
104
|
+
if (!language) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
return unique([
|
|
108
|
+
language,
|
|
109
|
+
...getFallbackFromStruct(language, state.initialOptions.fallbackLanguage),
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function getFallbackNamespaces() {
|
|
114
|
+
const defaultNs = state.initialOptions.defaultNs;
|
|
115
|
+
const fallbackNs = state.initialOptions.fallbackNs;
|
|
116
|
+
const fallbackNamespaces = typeof defaultNs === 'string' ? [defaultNs] : [];
|
|
117
|
+
return unique([...fallbackNamespaces, ...getFallbackArray(fallbackNs)]);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getAvailableLanguages() {
|
|
121
|
+
if (state.initialOptions.availableLanguages) {
|
|
122
|
+
return state.initialOptions.availableLanguages;
|
|
123
|
+
} else if (state.initialOptions.staticData) {
|
|
124
|
+
const languagesFromStaticData = Object.keys(
|
|
125
|
+
state.initialOptions.staticData
|
|
126
|
+
).map((key) => decodeCacheKey(key).language);
|
|
127
|
+
return Array.from(new Set(languagesFromStaticData));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function withDefaultNs(descriptor: CacheDescriptor): CacheDescriptorInternal {
|
|
132
|
+
return {
|
|
133
|
+
namespace:
|
|
134
|
+
descriptor.namespace === undefined
|
|
135
|
+
? getInitialOptions().defaultNs
|
|
136
|
+
: descriptor.namespace,
|
|
137
|
+
language: descriptor.language,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function overrideCredentials(credentials: DevCredentials) {
|
|
142
|
+
devCredentials = credentials;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function setObserverOptions(options: Partial<ObserverOptions>) {
|
|
146
|
+
observerOptions = initObserverOptions(options);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function getObserverOptions() {
|
|
150
|
+
return observerOptions;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return Object.freeze({
|
|
154
|
+
init,
|
|
155
|
+
isRunning,
|
|
156
|
+
setRunning,
|
|
157
|
+
isInitialLoading,
|
|
158
|
+
setInitialLoading,
|
|
159
|
+
getLanguage,
|
|
160
|
+
setLanguage,
|
|
161
|
+
getPendingLanguage,
|
|
162
|
+
setPendingLanguage,
|
|
163
|
+
getInitialOptions,
|
|
164
|
+
addActiveNs,
|
|
165
|
+
removeActiveNs,
|
|
166
|
+
getRequiredNamespaces,
|
|
167
|
+
getFallbackLangs,
|
|
168
|
+
getFallbackNamespaces,
|
|
169
|
+
getAvailableLanguages,
|
|
170
|
+
withDefaultNs,
|
|
171
|
+
overrideCredentials,
|
|
172
|
+
setObserverOptions,
|
|
173
|
+
getObserverOptions,
|
|
174
|
+
});
|
|
175
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FallbackGeneral,
|
|
3
|
+
FallbackLanguage,
|
|
4
|
+
FallbackLanguageObject,
|
|
5
|
+
FallbackLanguageOption,
|
|
6
|
+
} from '../../types';
|
|
7
|
+
|
|
8
|
+
export function isObject(item: any) {
|
|
9
|
+
return typeof item === 'object' && !Array.isArray(item) && item !== null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function getFallback(value: FallbackGeneral): string[] | undefined {
|
|
13
|
+
if (typeof value === 'string') {
|
|
14
|
+
return [value];
|
|
15
|
+
}
|
|
16
|
+
if (Array.isArray(value)) {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function getFallbackArray(value: FallbackGeneral): string[] {
|
|
23
|
+
return getFallback(value) || [];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function getFallbackFromStruct(
|
|
27
|
+
language: string,
|
|
28
|
+
fallbackLanguage: FallbackLanguageOption
|
|
29
|
+
) {
|
|
30
|
+
if (isObject(fallbackLanguage)) {
|
|
31
|
+
return getFallbackArray(
|
|
32
|
+
(fallbackLanguage as FallbackLanguageObject)?.[language]
|
|
33
|
+
);
|
|
34
|
+
} else {
|
|
35
|
+
return getFallbackArray(fallbackLanguage as FallbackLanguage);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function unique<T>(arr: T[]) {
|
|
40
|
+
return Array.from(new Set(arr));
|
|
41
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type ObserverOptions = {
|
|
2
|
+
tagAttributes: Record<string, string[]>;
|
|
3
|
+
highlightKeys: ModifierKey[];
|
|
4
|
+
highlightColor: string;
|
|
5
|
+
highlightWidth: number;
|
|
6
|
+
targetElement?: HTMLElement;
|
|
7
|
+
restrictedElements: string[];
|
|
8
|
+
inputPrefix: string;
|
|
9
|
+
inputSuffix: string;
|
|
10
|
+
passToParent: (keyof HTMLElementTagNameMap)[] | ((node: Element) => boolean);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type ModifierKey = 'Alt' | 'Control' | 'Shift' | 'Meta';
|
|
14
|
+
|
|
15
|
+
const defaultValues: ObserverOptions = {
|
|
16
|
+
tagAttributes: {
|
|
17
|
+
textarea: ['placeholder'],
|
|
18
|
+
input: ['value', 'placeholder'],
|
|
19
|
+
img: ['alt'],
|
|
20
|
+
'*': ['aria-label', 'title'],
|
|
21
|
+
},
|
|
22
|
+
restrictedElements: ['script', 'style'],
|
|
23
|
+
highlightKeys: ['Alt'] as ModifierKey[],
|
|
24
|
+
highlightColor: 'rgb(255, 0, 0)',
|
|
25
|
+
highlightWidth: 5,
|
|
26
|
+
inputPrefix: '%-%tolgee:',
|
|
27
|
+
inputSuffix: '%-%',
|
|
28
|
+
passToParent: ['option', 'optgroup'],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const initObserverOptions = (
|
|
32
|
+
options?: Partial<ObserverOptions>
|
|
33
|
+
): ObserverOptions => {
|
|
34
|
+
return {
|
|
35
|
+
...defaultValues,
|
|
36
|
+
...options,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FallbackLanguageOption,
|
|
3
|
+
FallbackNS,
|
|
4
|
+
TreeTranslationsData,
|
|
5
|
+
} from '../../types';
|
|
6
|
+
|
|
7
|
+
export type Options = {
|
|
8
|
+
/**
|
|
9
|
+
* Initial language
|
|
10
|
+
*/
|
|
11
|
+
language?: string;
|
|
12
|
+
apiUrl?: string;
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
projectId?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Used when auto detection is not available or is turned off
|
|
17
|
+
*/
|
|
18
|
+
defaultLanguage?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Languages which can be used for language detection
|
|
21
|
+
* and also limits which values can be stored
|
|
22
|
+
*/
|
|
23
|
+
availableLanguages?: string[];
|
|
24
|
+
/**
|
|
25
|
+
* Language which is used when no translation is available for current one
|
|
26
|
+
*/
|
|
27
|
+
fallbackLanguage?: FallbackLanguageOption;
|
|
28
|
+
/**
|
|
29
|
+
* Namespaces which should be always fetched
|
|
30
|
+
*/
|
|
31
|
+
ns?: string[];
|
|
32
|
+
/**
|
|
33
|
+
* Namespaces to be used to find translation when no explicit namespace set.
|
|
34
|
+
*/
|
|
35
|
+
fallbackNs?: FallbackNS;
|
|
36
|
+
/**
|
|
37
|
+
* Default namespace when no namespace defined (default: '')
|
|
38
|
+
*/
|
|
39
|
+
defaultNs: string;
|
|
40
|
+
staticData?: {
|
|
41
|
+
[key: string]: TreeTranslationsData | (() => Promise<TreeTranslationsData>);
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export type State = {
|
|
46
|
+
initialOptions: Options;
|
|
47
|
+
activeNamespaces: Map<string, number>;
|
|
48
|
+
language: string | undefined;
|
|
49
|
+
pendingLanguage: string | undefined;
|
|
50
|
+
isInitialLoading: boolean;
|
|
51
|
+
isRunning: boolean;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const defaultValues: Options = {
|
|
55
|
+
defaultNs: '',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const initState = (
|
|
59
|
+
options?: Partial<Options>,
|
|
60
|
+
previousState?: State
|
|
61
|
+
): State => {
|
|
62
|
+
const initialOptions = {
|
|
63
|
+
...defaultValues,
|
|
64
|
+
...previousState?.initialOptions,
|
|
65
|
+
...options,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// remove extra '/' from url end
|
|
69
|
+
const apiUrl = initialOptions.apiUrl;
|
|
70
|
+
initialOptions.apiUrl = apiUrl ? apiUrl.replace(/\/+$/, '') : apiUrl;
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
initialOptions,
|
|
74
|
+
activeNamespaces:
|
|
75
|
+
previousState?.activeNamespaces || new Map<string, number>(),
|
|
76
|
+
language: previousState?.language,
|
|
77
|
+
pendingLanguage: previousState?.language,
|
|
78
|
+
isInitialLoading: false,
|
|
79
|
+
isRunning: false,
|
|
80
|
+
};
|
|
81
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const ValueObserver = <T = any>(
|
|
2
|
+
initialValue: T,
|
|
3
|
+
valueGetter: () => T,
|
|
4
|
+
handler: (value: T) => void
|
|
5
|
+
): ValueObserverInstance<T> => {
|
|
6
|
+
let previousValue: T = initialValue;
|
|
7
|
+
function init(value: T) {
|
|
8
|
+
previousValue = value;
|
|
9
|
+
}
|
|
10
|
+
function notify() {
|
|
11
|
+
const value = valueGetter();
|
|
12
|
+
if (previousValue !== value) {
|
|
13
|
+
handler(value);
|
|
14
|
+
}
|
|
15
|
+
previousValue = value;
|
|
16
|
+
}
|
|
17
|
+
return Object.freeze({
|
|
18
|
+
init,
|
|
19
|
+
notify,
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type ValueObserverInstance<T> = {
|
|
24
|
+
readonly init: (value: T) => void;
|
|
25
|
+
readonly notify: () => void;
|
|
26
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const ERROR_PARAM_EMPTY = 0,
|
|
2
|
+
ERROR_UNEXPECTED_CHAR = 1,
|
|
3
|
+
ERROR_UNEXPECTED_END = 2;
|
|
4
|
+
|
|
5
|
+
export type ErrorCode =
|
|
6
|
+
| typeof ERROR_PARAM_EMPTY
|
|
7
|
+
| typeof ERROR_UNEXPECTED_CHAR
|
|
8
|
+
| typeof ERROR_UNEXPECTED_END;
|
|
9
|
+
|
|
10
|
+
export class FormatError extends Error {
|
|
11
|
+
public readonly code: ErrorCode;
|
|
12
|
+
public readonly index: number;
|
|
13
|
+
constructor(code: ErrorCode, index: number, text: string) {
|
|
14
|
+
let error: string;
|
|
15
|
+
if (code === ERROR_PARAM_EMPTY) {
|
|
16
|
+
error = 'Empty parameter';
|
|
17
|
+
} else if (code === ERROR_UNEXPECTED_CHAR) {
|
|
18
|
+
error = 'Unexpected character';
|
|
19
|
+
} else {
|
|
20
|
+
error = 'Unexpected end';
|
|
21
|
+
}
|
|
22
|
+
super(`Tolgee parser: ${error} at ${index} in "${text}"`);
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.index = index;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { formatter } from './formatter';
|
|
2
|
+
import { FinalFormatterInterface, TolgeePlugin } from '../types';
|
|
3
|
+
|
|
4
|
+
export function FormatSimpleCreator(): FinalFormatterInterface {
|
|
5
|
+
return {
|
|
6
|
+
format: ({ translation, params }) => formatter(translation, params),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const FormatSimple = (): TolgeePlugin => (tolgee, tools) => {
|
|
11
|
+
tools.setFinalFormatter(FormatSimpleCreator());
|
|
12
|
+
return tolgee;
|
|
13
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ErrorCode,
|
|
3
|
+
ERROR_PARAM_EMPTY,
|
|
4
|
+
ERROR_UNEXPECTED_CHAR,
|
|
5
|
+
ERROR_UNEXPECTED_END,
|
|
6
|
+
FormatError,
|
|
7
|
+
} from './FormatError';
|
|
8
|
+
|
|
9
|
+
function isWhitespace(ch: string) {
|
|
10
|
+
return /\s/.test(ch);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const STATE_TEXT = 0,
|
|
14
|
+
STATE_ESCAPE_MAYBE = 1,
|
|
15
|
+
STATE_ESCAPE = 2,
|
|
16
|
+
STATE_PARAM = 3,
|
|
17
|
+
STATE_PARAM_AFTER = 4;
|
|
18
|
+
|
|
19
|
+
type State =
|
|
20
|
+
| typeof STATE_TEXT
|
|
21
|
+
| typeof STATE_ESCAPE_MAYBE
|
|
22
|
+
| typeof STATE_ESCAPE
|
|
23
|
+
| typeof STATE_PARAM
|
|
24
|
+
| typeof STATE_PARAM_AFTER;
|
|
25
|
+
|
|
26
|
+
const END_STATES = new Set<State>([
|
|
27
|
+
STATE_ESCAPE,
|
|
28
|
+
STATE_ESCAPE_MAYBE,
|
|
29
|
+
STATE_TEXT,
|
|
30
|
+
]);
|
|
31
|
+
const CHAR_ESCAPE = "'";
|
|
32
|
+
const ESCAPABLE = new Set(['{', '}', CHAR_ESCAPE]);
|
|
33
|
+
|
|
34
|
+
const isAllowedInParam = (char: string) => {
|
|
35
|
+
return /[0-9a-zA-Z_]/.test(char);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export function formatParser(translation: string) {
|
|
39
|
+
let state: State = STATE_TEXT;
|
|
40
|
+
let text = '';
|
|
41
|
+
let param = '';
|
|
42
|
+
let ch = '';
|
|
43
|
+
const texts: string[] = [];
|
|
44
|
+
const params: string[] = [];
|
|
45
|
+
|
|
46
|
+
let i = 0;
|
|
47
|
+
|
|
48
|
+
function parsingError(code: ErrorCode): never {
|
|
49
|
+
throw new FormatError(code, i, translation);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const addText = () => {
|
|
53
|
+
texts.push(text);
|
|
54
|
+
text = '';
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const addParamChar = () => {
|
|
58
|
+
if (!isAllowedInParam(ch)) {
|
|
59
|
+
parsingError(ERROR_UNEXPECTED_CHAR);
|
|
60
|
+
}
|
|
61
|
+
param += ch;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const addParam = () => {
|
|
65
|
+
if (param === '') {
|
|
66
|
+
parsingError(ERROR_PARAM_EMPTY);
|
|
67
|
+
}
|
|
68
|
+
params.push(param);
|
|
69
|
+
param = '';
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
for (i = 0; i < translation.length; i++) {
|
|
73
|
+
ch = translation[i];
|
|
74
|
+
switch (state) {
|
|
75
|
+
case STATE_TEXT:
|
|
76
|
+
if (ch === CHAR_ESCAPE) {
|
|
77
|
+
text += ch;
|
|
78
|
+
state = STATE_ESCAPE_MAYBE;
|
|
79
|
+
} else if (ch === '{') {
|
|
80
|
+
addText();
|
|
81
|
+
state = STATE_PARAM;
|
|
82
|
+
} else {
|
|
83
|
+
text += ch;
|
|
84
|
+
state = STATE_TEXT;
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
|
|
88
|
+
case STATE_ESCAPE_MAYBE:
|
|
89
|
+
if (ESCAPABLE.has(ch)) {
|
|
90
|
+
text = text.slice(0, -1) + ch;
|
|
91
|
+
state = STATE_ESCAPE;
|
|
92
|
+
} else {
|
|
93
|
+
text += ch;
|
|
94
|
+
state = STATE_TEXT;
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
case STATE_ESCAPE:
|
|
98
|
+
if (ch === CHAR_ESCAPE) {
|
|
99
|
+
state = STATE_TEXT;
|
|
100
|
+
} else {
|
|
101
|
+
text += ch;
|
|
102
|
+
state = STATE_ESCAPE;
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
case STATE_PARAM:
|
|
106
|
+
if (ch === '}') {
|
|
107
|
+
addParam();
|
|
108
|
+
state = STATE_TEXT;
|
|
109
|
+
} else if (!isWhitespace(ch)) {
|
|
110
|
+
addParamChar();
|
|
111
|
+
state = STATE_PARAM;
|
|
112
|
+
} else if (param !== '') {
|
|
113
|
+
addParam();
|
|
114
|
+
state = STATE_PARAM_AFTER;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
break;
|
|
118
|
+
case STATE_PARAM_AFTER:
|
|
119
|
+
if (ch == '}') {
|
|
120
|
+
state = STATE_TEXT;
|
|
121
|
+
} else if (isWhitespace(ch)) {
|
|
122
|
+
state = STATE_PARAM_AFTER;
|
|
123
|
+
} else {
|
|
124
|
+
parsingError(ERROR_UNEXPECTED_CHAR);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (!END_STATES.has(state)) {
|
|
129
|
+
parsingError(ERROR_UNEXPECTED_END);
|
|
130
|
+
}
|
|
131
|
+
addText();
|
|
132
|
+
return [texts, params];
|
|
133
|
+
}
|