@zajno/common 2.6.2 → 2.6.3

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.
@@ -4,46 +4,70 @@ exports.LocalizationManager = void 0;
4
4
  const event_js_1 = require("../observing/event.js");
5
5
  class LocalizationManager {
6
6
  _dataSource;
7
- _currentLocale = null;
7
+ // initial value is intentionally a nonsense to be updated on first useLocale call
8
+ _currentLocale = '';
8
9
  _currentStrings = null;
9
- _defaultStrings;
10
- _dependents = [];
11
10
  _localeUpdatedEvent = new event_js_1.Event();
12
- constructor(_dataSource, initialLocale, defaultLocale = null) {
11
+ _firstInit;
12
+ constructor(_dataSource, locale, fallbackStrings = null) {
13
13
  this._dataSource = _dataSource;
14
- this._defaultStrings = this.getStrings(defaultLocale || initialLocale);
15
- this.useLocale(initialLocale);
14
+ this._currentStrings = fallbackStrings;
15
+ this._firstInit = this.useLocale(locale);
16
16
  }
17
17
  get Locale() { return this._currentLocale; }
18
18
  get Current() { return this._currentStrings; }
19
+ get firstInitialized() { return this._firstInit; }
19
20
  get localeUpdated() { return this._localeUpdatedEvent.expose(); }
21
+ /**
22
+ * Updates locale synchronously, and then loads corresponding strings from datasource.
23
+ * If loader for the locale is sync, this method updates instantly and returns resolved Promise.
24
+ * Otherwise, strings will be updated asynchronously.
25
+ */
20
26
  useLocale(locale) {
21
- this._currentLocale = locale;
22
- this._currentStrings = this.getStrings(this._currentLocale) || this._defaultStrings;
23
- this.updateDependencies();
24
- this._localeUpdatedEvent.trigger(this._currentLocale);
25
- return this;
26
- }
27
- useDependency(dep, remove = false) {
28
- const i = this._dependents.indexOf(dep);
29
- if (i < 0 && !remove) {
30
- this._dependents.push(dep);
31
- this.updateDependencies();
27
+ if (locale === this._currentLocale) {
28
+ return Promise.resolve();
32
29
  }
33
- else if (i >= 0 && remove) {
34
- this._dependents.splice(i, 1);
30
+ const prevLocale = this._currentLocale;
31
+ const loader = this._dataSource[locale];
32
+ if (!loader) {
33
+ // just for throwing the same error
34
+ return this.doUpdateStrings(locale, null);
35
35
  }
36
- return this;
37
- }
38
- updateDependencies() {
39
- const { _currentLocale: locale, _currentStrings: strings } = this;
40
- if (!strings || !locale) {
41
- return;
36
+ // set locale immediately so it won't be updated twice in case instant second call
37
+ this._currentLocale = locale;
38
+ // revert locale in case of error
39
+ const tryRevert = () => {
40
+ if (this._currentLocale === locale) {
41
+ this._currentLocale = prevLocale;
42
+ }
43
+ };
44
+ if (typeof loader !== 'function') {
45
+ return this.doUpdateStrings(locale, loader, tryRevert);
42
46
  }
43
- this._dependents.forEach(d => d.updateLocale(strings, locale));
47
+ // async part is separated to make the method synchronous
48
+ return (async () => {
49
+ let result = null;
50
+ try {
51
+ result = await loader();
52
+ }
53
+ catch (e) {
54
+ tryRevert();
55
+ throw new Error(`LocalizationManager: Failed to load localization data for locale "${locale}"`, { cause: e });
56
+ }
57
+ await this.doUpdateStrings(locale, result, tryRevert);
58
+ })();
44
59
  }
45
- getStrings(locale) {
46
- return this._dataSource[locale];
60
+ doUpdateStrings(locale, strings, revert) {
61
+ if (!strings) {
62
+ revert?.();
63
+ return Promise.reject(new Error(`LocalizationManager: No localization data for locale "${locale}"`));
64
+ }
65
+ this._currentStrings = strings;
66
+ this._localeUpdatedEvent.trigger({
67
+ locale: this._currentLocale,
68
+ strings: this._currentStrings,
69
+ });
70
+ return Promise.resolve();
47
71
  }
48
72
  }
49
73
  exports.LocalizationManager = LocalizationManager;
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizationManager.js","sourceRoot":"","sources":["../../../src/localization/LocalizationManager.ts"],"names":[],"mappings":";;;AAEA,oDAA8C;AAE9C,MAAa,mBAAmB;IAUP;IATb,cAAc,GAAuB,IAAI,CAAC;IAC1C,eAAe,GAAoB,IAAI,CAAC;IAE/B,eAAe,CAAW;IAC1B,WAAW,GAAqD,EAAE,CAAC;IAEnE,mBAAmB,GAAG,IAAI,gBAAK,EAAe,CAAC;IAEhE,YACqB,WAA2C,EAC5D,aAA0B,EAC1B,gBAAoC,IAAI;QAFvB,gBAAW,GAAX,WAAW,CAAgC;QAI5D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,aAAa,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACnD,IAAW,OAAO,KAAK,OAAO,IAAI,CAAC,eAAgB,CAAC,CAAC,CAAC;IACtD,IAAW,aAAa,KAAK,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEjE,SAAS,CAAC,MAAmB;QAChC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC;QACpF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,aAAa,CAAC,GAAmD,EAAE,MAAM,GAAG,KAAK;QACpF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,kBAAkB;QACtB,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAClE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,UAAU,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACJ;AArDD,kDAqDC"}
1
+ {"version":3,"file":"LocalizationManager.js","sourceRoot":"","sources":["../../../src/localization/LocalizationManager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedValidationErrors.js","sourceRoot":"","sources":["../../../src/localization/LocalizedValidationErrors.ts"],"names":[],"mappings":";;;AAQA,MAAa,yBAAyB;IAKL;IAFrB,QAAQ,GAA4C,IAAI,CAAC;IAEjE,YAA6B,OAAmD;QAAnD,YAAO,GAAP,OAAO,CAA4C;IAAI,CAAC;IAErF,IAAW,MAAM;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,YAAY,CAAC,OAAiB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;AAlBD,8DAkBC"}
1
+ {"version":3,"file":"LocalizedValidationErrors.js","sourceRoot":"","sources":["../../../src/localization/LocalizedValidationErrors.ts"],"names":[],"mappings":";;;AAOA,MAAa,yBAAyB;IAKL;IAFrB,QAAQ,GAA4C,IAAI,CAAC;IAEjE,YAA6B,OAAmD;QAAnD,YAAO,GAAP,OAAO,CAA4C;IAAI,CAAC;IAErF,IAAW,MAAM;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,YAAY,CAAC,OAAiB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;AAlBD,8DAkBC"}
@@ -1,46 +1,70 @@
1
1
  import { Event } from '../observing/event.js';
2
2
  export class LocalizationManager {
3
3
  _dataSource;
4
- _currentLocale = null;
4
+ // initial value is intentionally a nonsense to be updated on first useLocale call
5
+ _currentLocale = '';
5
6
  _currentStrings = null;
6
- _defaultStrings;
7
- _dependents = [];
8
7
  _localeUpdatedEvent = new Event();
9
- constructor(_dataSource, initialLocale, defaultLocale = null) {
8
+ _firstInit;
9
+ constructor(_dataSource, locale, fallbackStrings = null) {
10
10
  this._dataSource = _dataSource;
11
- this._defaultStrings = this.getStrings(defaultLocale || initialLocale);
12
- this.useLocale(initialLocale);
11
+ this._currentStrings = fallbackStrings;
12
+ this._firstInit = this.useLocale(locale);
13
13
  }
14
14
  get Locale() { return this._currentLocale; }
15
15
  get Current() { return this._currentStrings; }
16
+ get firstInitialized() { return this._firstInit; }
16
17
  get localeUpdated() { return this._localeUpdatedEvent.expose(); }
18
+ /**
19
+ * Updates locale synchronously, and then loads corresponding strings from datasource.
20
+ * If loader for the locale is sync, this method updates instantly and returns resolved Promise.
21
+ * Otherwise, strings will be updated asynchronously.
22
+ */
17
23
  useLocale(locale) {
18
- this._currentLocale = locale;
19
- this._currentStrings = this.getStrings(this._currentLocale) || this._defaultStrings;
20
- this.updateDependencies();
21
- this._localeUpdatedEvent.trigger(this._currentLocale);
22
- return this;
23
- }
24
- useDependency(dep, remove = false) {
25
- const i = this._dependents.indexOf(dep);
26
- if (i < 0 && !remove) {
27
- this._dependents.push(dep);
28
- this.updateDependencies();
24
+ if (locale === this._currentLocale) {
25
+ return Promise.resolve();
29
26
  }
30
- else if (i >= 0 && remove) {
31
- this._dependents.splice(i, 1);
27
+ const prevLocale = this._currentLocale;
28
+ const loader = this._dataSource[locale];
29
+ if (!loader) {
30
+ // just for throwing the same error
31
+ return this.doUpdateStrings(locale, null);
32
32
  }
33
- return this;
34
- }
35
- updateDependencies() {
36
- const { _currentLocale: locale, _currentStrings: strings } = this;
37
- if (!strings || !locale) {
38
- return;
33
+ // set locale immediately so it won't be updated twice in case instant second call
34
+ this._currentLocale = locale;
35
+ // revert locale in case of error
36
+ const tryRevert = () => {
37
+ if (this._currentLocale === locale) {
38
+ this._currentLocale = prevLocale;
39
+ }
40
+ };
41
+ if (typeof loader !== 'function') {
42
+ return this.doUpdateStrings(locale, loader, tryRevert);
39
43
  }
40
- this._dependents.forEach(d => d.updateLocale(strings, locale));
44
+ // async part is separated to make the method synchronous
45
+ return (async () => {
46
+ let result = null;
47
+ try {
48
+ result = await loader();
49
+ }
50
+ catch (e) {
51
+ tryRevert();
52
+ throw new Error(`LocalizationManager: Failed to load localization data for locale "${locale}"`, { cause: e });
53
+ }
54
+ await this.doUpdateStrings(locale, result, tryRevert);
55
+ })();
41
56
  }
42
- getStrings(locale) {
43
- return this._dataSource[locale];
57
+ doUpdateStrings(locale, strings, revert) {
58
+ if (!strings) {
59
+ revert?.();
60
+ return Promise.reject(new Error(`LocalizationManager: No localization data for locale "${locale}"`));
61
+ }
62
+ this._currentStrings = strings;
63
+ this._localeUpdatedEvent.trigger({
64
+ locale: this._currentLocale,
65
+ strings: this._currentStrings,
66
+ });
67
+ return Promise.resolve();
44
68
  }
45
69
  }
46
70
  //# sourceMappingURL=LocalizationManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizationManager.js","sourceRoot":"","sources":["../../../src/localization/LocalizationManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,MAAM,OAAO,mBAAmB;IAUP;IATb,cAAc,GAAuB,IAAI,CAAC;IAC1C,eAAe,GAAoB,IAAI,CAAC;IAE/B,eAAe,CAAW;IAC1B,WAAW,GAAqD,EAAE,CAAC;IAEnE,mBAAmB,GAAG,IAAI,KAAK,EAAe,CAAC;IAEhE,YACqB,WAA2C,EAC5D,aAA0B,EAC1B,gBAAoC,IAAI;QAFvB,gBAAW,GAAX,WAAW,CAAgC;QAI5D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,aAAa,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IAED,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACnD,IAAW,OAAO,KAAK,OAAO,IAAI,CAAC,eAAgB,CAAC,CAAC,CAAC;IACtD,IAAW,aAAa,KAAK,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEjE,SAAS,CAAC,MAAmB;QAChC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC;QACpF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,aAAa,CAAC,GAAmD,EAAE,MAAM,GAAG,KAAK;QACpF,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,kBAAkB;QACtB,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAClE,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,UAAU,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACJ"}
1
+ {"version":3,"file":"LocalizationManager.js","sourceRoot":"","sources":["../../../src/localization/LocalizationManager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedValidationErrors.js","sourceRoot":"","sources":["../../../src/localization/LocalizedValidationErrors.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,yBAAyB;IAKL;IAFrB,QAAQ,GAA4C,IAAI,CAAC;IAEjE,YAA6B,OAAmD;QAAnD,YAAO,GAAP,OAAO,CAA4C;IAAI,CAAC;IAErF,IAAW,MAAM;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,YAAY,CAAC,OAAiB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ"}
1
+ {"version":3,"file":"LocalizedValidationErrors.js","sourceRoot":"","sources":["../../../src/localization/LocalizedValidationErrors.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,yBAAyB;IAKL;IAFrB,QAAQ,GAA4C,IAAI,CAAC;IAEjE,YAA6B,OAAmD;QAAnD,YAAO,GAAP,OAAO,CAA4C;IAAI,CAAC;IAErF,IAAW,MAAM;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,YAAY,CAAC,OAAiB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zajno/common",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "description": "Zajno's re-usable utilities for JS/TS projects",
5
5
  "private": false,
6
6
  "type": "module",
@@ -1,20 +1,21 @@
1
- import type { ILocalization, ILocalizationDependency } from './abstractions.js';
1
+ import type { ILocalization, LocaleStrings, StringsDataSource } from './abstractions.js';
2
2
  import type { AnyObject } from '../types/misc.js';
3
3
  export declare class LocalizationManager<TLocaleType extends string, TStrings extends AnyObject> implements ILocalization<TStrings> {
4
4
  private readonly _dataSource;
5
5
  private _currentLocale;
6
6
  private _currentStrings;
7
- private readonly _defaultStrings;
8
- private readonly _dependents;
9
7
  private readonly _localeUpdatedEvent;
10
- constructor(_dataSource: {
11
- [locale: string]: TStrings;
12
- }, initialLocale: TLocaleType, defaultLocale?: TLocaleType | null);
13
- get Locale(): TLocaleType | null;
8
+ private readonly _firstInit;
9
+ constructor(_dataSource: StringsDataSource<TLocaleType, TStrings>, locale: TLocaleType, fallbackStrings?: TStrings | null);
10
+ get Locale(): TLocaleType;
14
11
  get Current(): TStrings;
15
- get localeUpdated(): import("../observing/event.js").IEvent<TLocaleType>;
16
- useLocale(locale: TLocaleType): this;
17
- useDependency(dep: ILocalizationDependency<TStrings, TLocaleType>, remove?: boolean): this;
18
- private updateDependencies;
19
- private getStrings;
12
+ get firstInitialized(): Promise<void>;
13
+ get localeUpdated(): import("../observing/event.js").IEvent<LocaleStrings<TLocaleType, TStrings>>;
14
+ /**
15
+ * Updates locale synchronously, and then loads corresponding strings from datasource.
16
+ * If loader for the locale is sync, this method updates instantly and returns resolved Promise.
17
+ * Otherwise, strings will be updated asynchronously.
18
+ */
19
+ useLocale(locale: TLocaleType): Promise<void>;
20
+ protected doUpdateStrings(locale: TLocaleType, strings: TStrings | null, revert?: () => void): Promise<void>;
20
21
  }
@@ -1,6 +1,6 @@
1
- import { IErrorsLocalization, ILocalizationDependency, ValidationErrorsFactory } from './abstractions.js';
1
+ import { IErrorsLocalization, ValidationErrorsFactory } from './abstractions.js';
2
2
  import type { AnyObject } from '../types/misc.js';
3
- export declare class LocalizedValidationErrors<TStrings extends AnyObject, TErrors extends string | number> implements IErrorsLocalization<TErrors>, ILocalizationDependency<TStrings> {
3
+ export declare class LocalizedValidationErrors<TStrings extends AnyObject, TErrors extends string | number> implements IErrorsLocalization<TErrors> {
4
4
  private readonly factory;
5
5
  private _strings;
6
6
  constructor(factory: ValidationErrorsFactory<TStrings, TErrors>);
@@ -5,8 +5,11 @@ export interface ILocalization<TStrings extends AnyObject> {
5
5
  export interface IErrorsLocalization<TErrors extends string | number> {
6
6
  readonly Errors: ValidationErrorsStrings<TErrors>;
7
7
  }
8
- export interface ILocalizationDependency<TStrings extends AnyObject, TLocale extends string = any> {
9
- updateLocale(strings: TStrings, locale?: TLocale): void;
10
- }
8
+ export type StringsLoader<TStrings> = TStrings | (() => Promise<TStrings>);
9
+ export type StringsDataSource<TLocale extends string, TStrings extends AnyObject> = Record<TLocale, StringsLoader<TStrings>>;
10
+ export type LocaleStrings<TLocale extends string, TStrings extends AnyObject> = {
11
+ locale: TLocale;
12
+ strings: TStrings;
13
+ };
11
14
  export type ValidationErrorsStrings<T extends string | number> = Partial<Record<T, string>>;
12
15
  export type ValidationErrorsFactory<TStrings extends AnyObject, TErrors extends string | number> = (strings: TStrings) => ValidationErrorsStrings<TErrors>;