@digitaldefiance/i18n-lib 1.0.23 → 1.0.25

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.
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.I18n = void 0;
18
+ __exportStar(require("./active-context"), exports);
19
+ __exportStar(require("./context"), exports);
20
+ __exportStar(require("./context-manager"), exports);
21
+ __exportStar(require("./currency"), exports);
22
+ __exportStar(require("./currency-code"), exports);
23
+ __exportStar(require("./currency-format"), exports);
24
+ __exportStar(require("./enum-registry"), exports);
25
+ __exportStar(require("./i18n-engine"), exports);
26
+ __exportStar(require("./template"), exports);
27
+ __exportStar(require("./timezone"), exports);
28
+ __exportStar(require("./types"), exports);
29
+ __exportStar(require("./utils"), exports);
30
+ // Re-export for convenience
31
+ var i18n_engine_1 = require("./i18n-engine");
32
+ Object.defineProperty(exports, "I18n", { enumerable: true, get: function () { return i18n_engine_1.I18nEngine; } });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Template processing utilities for i18n
3
+ */
4
+ export type EnumKeys<T> = keyof T;
5
+ /**
6
+ * Recursive type to validate that all enum keys in the template string exist in the provided enum type
7
+ */
8
+ export type IsValidEnumTemplate<T extends string, TEnum> = T extends `${string}{{${string}.${infer Key}}}${infer Rest}` ? Key extends EnumKeys<TEnum> ? IsValidEnumTemplate<Rest, TEnum> : false : true;
9
+ /**
10
+ * Template function that processes {{EnumName.EnumKey}} patterns
11
+ */
12
+ export declare function createTemplateProcessor<TEnum extends Record<string, string>, TLanguage extends string>(enumObj: TEnum, translateFn: (key: TEnum[keyof TEnum], vars?: Record<string, string | number>, language?: TLanguage) => string, enumName: string): <T extends string>(str: IsValidEnumTemplate<T, TEnum> extends true ? T : never, language?: TLanguage, ...otherVars: Record<string, string | number>[]) => string;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTemplateProcessor = createTemplateProcessor;
4
+ /**
5
+ * Template function that processes {{EnumName.EnumKey}} patterns
6
+ */
7
+ function createTemplateProcessor(enumObj, translateFn, enumName) {
8
+ return function t(str, language, ...otherVars) {
9
+ let varIndex = 0;
10
+ const pattern = new RegExp(`\\{\\{${enumName}\\.(\\w+)\\}\\}`, 'g');
11
+ // First replace enum patterns
12
+ let result = str.replace(pattern, (match, enumKey) => {
13
+ const enumValue = enumObj[enumKey];
14
+ if (!enumValue) {
15
+ return match; // Return original if enum key not found
16
+ }
17
+ const needsVars = enumValue
18
+ .toLowerCase()
19
+ .endsWith('template');
20
+ const vars = needsVars ? otherVars[varIndex++] ?? {} : {};
21
+ return translateFn(enumValue, vars, language);
22
+ });
23
+ // Then replace any remaining variables from all otherVars
24
+ const allVars = otherVars.reduce((acc, vars) => ({ ...acc, ...vars }), {});
25
+ result = result.replace(/\{(\w+)\}/g, (match, varName) => {
26
+ return allVars[varName] !== undefined ? String(allVars[varName]) : match;
27
+ });
28
+ return result;
29
+ };
30
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Class representing a validated timezone.
3
+ */
4
+ export declare class Timezone {
5
+ private readonly _timezone;
6
+ constructor(timezone: string);
7
+ /**
8
+ * Gets the timezone value.
9
+ */
10
+ get value(): string;
11
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Timezone = void 0;
4
+ const utils_1 = require("./utils");
5
+ /**
6
+ * Class representing a validated timezone.
7
+ */
8
+ class Timezone {
9
+ constructor(timezone) {
10
+ if (!(0, utils_1.isValidTimezone)(timezone)) {
11
+ throw new Error(`Invalid timezone: ${timezone}`);
12
+ }
13
+ this._timezone = timezone;
14
+ }
15
+ /**
16
+ * Gets the timezone value.
17
+ */
18
+ get value() {
19
+ return this._timezone;
20
+ }
21
+ }
22
+ exports.Timezone = Timezone;
@@ -0,0 +1,78 @@
1
+ import { CurrencyCode } from './currency-code';
2
+ import { Timezone } from './timezone';
3
+ /**
4
+ * Standard language contexts
5
+ */
6
+ export type LanguageContext = 'admin' | 'user' | 'system' | 'api';
7
+ /**
8
+ * Default currency code
9
+ */
10
+ export declare const DefaultCurrencyCode: string;
11
+ /**
12
+ * Currency position type
13
+ */
14
+ export type CurrencyPosition = 'prefix' | 'postfix' | 'infix';
15
+ /**
16
+ * Custom language context type
17
+ */
18
+ export type CustomLanguageContext<T extends string = LanguageContext> = T;
19
+ /**
20
+ * Collection of localized strings for a specific language
21
+ */
22
+ export type StringsCollection<TStringKey extends string> = Partial<Record<TStringKey, string>>;
23
+ /**
24
+ * Mapping of languages to their respective string collections
25
+ */
26
+ export type MasterStringsCollection<TStringKey extends string, TLanguage extends string> = Partial<Record<TLanguage, StringsCollection<TStringKey>>>;
27
+ /**
28
+ * Mapping of language codes to their respective languages
29
+ */
30
+ export type LanguageCodeCollection<TLanguage extends string> = Partial<Record<TLanguage, string>>;
31
+ /**
32
+ * Mapping of enumeration values to their translations in multiple languages
33
+ */
34
+ export type EnumTranslationMap<TEnum extends string | number, TLanguage extends string> = Partial<Record<TLanguage, Partial<Record<TEnum, string>>>>;
35
+ /**
36
+ * I18n configuration interface
37
+ */
38
+ export interface I18nConfig<TStringKey extends string, TLanguage extends string, TConstants extends Record<string, any> = Record<string, any>, TTranslationContext extends string = LanguageContext> {
39
+ stringNames: TStringKey[];
40
+ strings: MasterStringsCollection<TStringKey, TLanguage>;
41
+ defaultLanguage: TLanguage;
42
+ defaultTranslationContext: TTranslationContext;
43
+ defaultCurrencyCode: CurrencyCode;
44
+ languageCodes: LanguageCodeCollection<TLanguage>;
45
+ languages: TLanguage[];
46
+ constants?: TConstants;
47
+ enumName?: string;
48
+ enumObj?: Record<string, TStringKey>;
49
+ timezone: Timezone;
50
+ adminTimezone: Timezone;
51
+ }
52
+ /**
53
+ * I18n context interface
54
+ */
55
+ export interface I18nContext<TLanguage extends string, TTranslationContext extends string = LanguageContext> {
56
+ language: TLanguage;
57
+ adminLanguage: TLanguage;
58
+ currencyCode: CurrencyCode;
59
+ currentContext: TTranslationContext;
60
+ timezone: Timezone;
61
+ adminTimezone: Timezone;
62
+ }
63
+ /**
64
+ * Generic translation type for any enumeration
65
+ */
66
+ export type EnumTranslation<T extends string | number> = {
67
+ [K in T]: string;
68
+ };
69
+ /**
70
+ * Generic language translation type for any enumeration
71
+ */
72
+ export type EnumLanguageTranslation<T extends string | number, TLanguage extends string = string> = Partial<{
73
+ [L in TLanguage]: EnumTranslation<T>;
74
+ }>;
75
+ /**
76
+ * Helper function to create typed translations for an enumeration
77
+ */
78
+ export declare function createTranslations<T extends string | number, TLanguage extends string>(translations: EnumLanguageTranslation<T, TLanguage>): EnumLanguageTranslation<T, TLanguage>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultCurrencyCode = void 0;
4
+ exports.createTranslations = createTranslations;
5
+ /**
6
+ * Default currency code
7
+ */
8
+ exports.DefaultCurrencyCode = 'USD';
9
+ /**
10
+ * Helper function to create typed translations for an enumeration
11
+ */
12
+ function createTranslations(translations) {
13
+ return translations;
14
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Replaces variables in a string with their corresponding values from vars or constants.
3
+ * @param str - The string containing variables to replace
4
+ * @param vars - An object mapping variable names to their replacement values
5
+ * @param constants - An object containing constant values for replacement
6
+ * @returns The string with variables replaced
7
+ */
8
+ export declare function replaceVariables(str: string, vars?: Record<string, string | number>, constants?: any): string;
9
+ /**
10
+ * Checks if a given key indicates a template string.
11
+ * @param key - The key to check
12
+ * @returns True if the key indicates a template, false otherwise
13
+ */
14
+ export declare function isTemplate(key: string): boolean;
15
+ /**
16
+ * Checks if a given timezone string is valid.
17
+ * @param timezone - The timezone string to validate
18
+ * @returns
19
+ */
20
+ export declare function isValidTimezone(timezone: string): boolean;
21
+ /**
22
+ * Converts parts to a single string key, joining with underscores.
23
+ * @param parts - The parts to join
24
+ * @returns The joined string key
25
+ */
26
+ export declare function toStringKey<TStringKey extends string>(...parts: (string)[]): TStringKey;
27
+ /**
28
+ * Converts an enum value to a string key by joining parts with underscores and appending the enum value.
29
+ * @param enumObj - The enum object
30
+ * @param value - The enum value
31
+ * @param parts - Additional parts to join
32
+ * @returns The constructed string key
33
+ */
34
+ export declare function toStringKeyFromEnum<TStringKey extends string, TEnum extends string>(value: TEnum[keyof TEnum], ...parts: (string)[]): TStringKey;
35
+ /**
36
+ * Builds a reason map from an enum object, mapping each enum value to a string key.
37
+ * @param enumObj - The enum object
38
+ * @param prefixes - Prefixes to prepend to each string key
39
+ * @returns The constructed reason map
40
+ */
41
+ export declare function buildReasonMap<TStringKey extends string, TEnum extends Record<string, string>>(enumObj: TEnum, ...prefixes: string[]): Record<string, TStringKey>;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.replaceVariables = replaceVariables;
7
+ exports.isTemplate = isTemplate;
8
+ exports.isValidTimezone = isValidTimezone;
9
+ exports.toStringKey = toStringKey;
10
+ exports.toStringKeyFromEnum = toStringKeyFromEnum;
11
+ exports.buildReasonMap = buildReasonMap;
12
+ const moment_timezone_1 = __importDefault(require("moment-timezone"));
13
+ /**
14
+ * Replaces variables in a string with their corresponding values from vars or constants.
15
+ * @param str - The string containing variables to replace
16
+ * @param vars - An object mapping variable names to their replacement values
17
+ * @param constants - An object containing constant values for replacement
18
+ * @returns The string with variables replaced
19
+ */
20
+ function replaceVariables(str, vars, constants) {
21
+ const variables = str.match(/\{(.+?)\}/g);
22
+ if (!variables)
23
+ return str;
24
+ let result = str;
25
+ for (const variable of variables) {
26
+ const varName = variable.slice(1, -1);
27
+ let replacement = '';
28
+ if (vars && varName in vars) {
29
+ replacement = String(vars[varName]);
30
+ }
31
+ else if (constants && varName in constants) {
32
+ replacement = String(constants[varName]);
33
+ }
34
+ if (replacement) {
35
+ result = result.replace(variable, replacement);
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Checks if a given key indicates a template string.
42
+ * @param key - The key to check
43
+ * @returns True if the key indicates a template, false otherwise
44
+ */
45
+ function isTemplate(key) {
46
+ return key.trim().toLowerCase().endsWith('template');
47
+ }
48
+ /**
49
+ * Checks if a given timezone string is valid.
50
+ * @param timezone - The timezone string to validate
51
+ * @returns
52
+ */
53
+ function isValidTimezone(timezone) {
54
+ return moment_timezone_1.default.tz.zone(timezone) !== null;
55
+ }
56
+ /**
57
+ * Converts parts to a single string key, joining with underscores.
58
+ * @param parts - The parts to join
59
+ * @returns The joined string key
60
+ */
61
+ function toStringKey(...parts) {
62
+ return parts.join('_');
63
+ }
64
+ /**
65
+ * Converts an enum value to a string key by joining parts with underscores and appending the enum value.
66
+ * @param enumObj - The enum object
67
+ * @param value - The enum value
68
+ * @param parts - Additional parts to join
69
+ * @returns The constructed string key
70
+ */
71
+ function toStringKeyFromEnum(value, ...parts) {
72
+ return parts.join('_') + '_' + String(value);
73
+ }
74
+ /**
75
+ * Builds a reason map from an enum object, mapping each enum value to a string key.
76
+ * @param enumObj - The enum object
77
+ * @param prefixes - Prefixes to prepend to each string key
78
+ * @returns The constructed reason map
79
+ */
80
+ function buildReasonMap(enumObj, ...prefixes) {
81
+ return Object.values(enumObj).reduce((map, value) => {
82
+ map[value] = toStringKeyFromEnum(value, ...prefixes);
83
+ return map;
84
+ }, {});
85
+ }
package/dist/utils.d.ts CHANGED
@@ -26,16 +26,16 @@ export declare function isValidTimezone(timezone: string): boolean;
26
26
  export declare function toStringKey<TStringKey extends string>(...parts: (string)[]): TStringKey;
27
27
  /**
28
28
  * Converts an enum value to a string key by joining parts with underscores and appending the enum value.
29
- * @param enumObj - The enum object
30
29
  * @param value - The enum value
31
30
  * @param parts - Additional parts to join
32
31
  * @returns The constructed string key
33
32
  */
34
- export declare function toStringKeyFromEnum<TStringKey extends string, TEnum extends string>(value: TEnum[keyof TEnum], ...parts: (string)[]): TStringKey;
33
+ export declare function toStringKeyFromEnum<TStringKey extends string>(value: string, ...parts: string[]): TStringKey;
35
34
  /**
36
35
  * Builds a reason map from an enum object, mapping each enum value to a string key.
37
36
  * @param enumObj - The enum object
38
37
  * @param prefixes - Prefixes to prepend to each string key
38
+ * @param templateKeys - Optional set of enum values that should have 'Template' suffix for template processing
39
39
  * @returns The constructed reason map
40
40
  */
41
- export declare function buildReasonMap<TStringKey extends string, TEnum extends Record<string, string>>(enumObj: TEnum, ...prefixes: string[]): Record<string, TStringKey>;
41
+ export declare function buildReasonMap<TEnum extends Record<string, string>, TStringKey extends string>(enumObj: TEnum, prefixes?: string[], templateKeys?: Set<TEnum[keyof TEnum]>): Record<TEnum[keyof TEnum], TStringKey>;
package/dist/utils.js CHANGED
@@ -63,23 +63,27 @@ function toStringKey(...parts) {
63
63
  }
64
64
  /**
65
65
  * Converts an enum value to a string key by joining parts with underscores and appending the enum value.
66
- * @param enumObj - The enum object
67
66
  * @param value - The enum value
68
67
  * @param parts - Additional parts to join
69
68
  * @returns The constructed string key
70
69
  */
71
70
  function toStringKeyFromEnum(value, ...parts) {
72
- return parts.join('_') + '_' + String(value);
71
+ const allParts = [...parts, value];
72
+ return allParts.join('_');
73
73
  }
74
74
  /**
75
75
  * Builds a reason map from an enum object, mapping each enum value to a string key.
76
76
  * @param enumObj - The enum object
77
77
  * @param prefixes - Prefixes to prepend to each string key
78
+ * @param templateKeys - Optional set of enum values that should have 'Template' suffix for template processing
78
79
  * @returns The constructed reason map
79
80
  */
80
- function buildReasonMap(enumObj, ...prefixes) {
81
- return Object.values(enumObj).reduce((map, value) => {
82
- map[value] = toStringKeyFromEnum(value, ...prefixes);
83
- return map;
84
- }, {});
81
+ function buildReasonMap(enumObj, prefixes = [], templateKeys) {
82
+ const map = {};
83
+ Object.values(enumObj).forEach(value => {
84
+ const baseKey = [...prefixes, value].join('_');
85
+ const finalKey = templateKeys?.has(value) ? baseKey + 'Template' : baseKey;
86
+ map[value] = finalKey;
87
+ });
88
+ return map;
85
89
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitaldefiance/i18n-lib",
3
- "version": "1.0.23",
3
+ "version": "1.0.25",
4
4
  "description": "Generic i18n library with enum translation support",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,22 +0,0 @@
1
- import { StringLanguage } from './enumerations/string-language';
2
- import { IActiveContext } from './interfaces/active-context';
3
- import { CurrencyCode } from './interfaces/currency-code';
4
- import { LanguageContext } from './shared-types';
5
- import { Timezone } from '@digitaldefiance/i18n-lib';
6
- export declare const GlobalActiveContext: IActiveContext;
7
- export declare function setUserLanguage(language: StringLanguage): void;
8
- export declare function setCurrencyCode(code: CurrencyCode): void;
9
- /**
10
- * Sets the admin language for console operations
11
- * @param language The language to set for admin operations
12
- */
13
- export declare function setAdminLanguage(language: StringLanguage): void;
14
- /**
15
- * Sets the language context for the current context
16
- * @param context The language context to set
17
- */
18
- export declare function setLanguageContext(context: LanguageContext): void;
19
- export declare function setSystemContext(): void;
20
- export declare function setApiContext(): void;
21
- export declare function setUserTimezone(tz: Timezone): void;
22
- export declare function setAdminTimezone(tz: Timezone): void;
@@ -1,73 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GlobalActiveContext = void 0;
4
- exports.setUserLanguage = setUserLanguage;
5
- exports.setCurrencyCode = setCurrencyCode;
6
- exports.setAdminLanguage = setAdminLanguage;
7
- exports.setLanguageContext = setLanguageContext;
8
- exports.setSystemContext = setSystemContext;
9
- exports.setApiContext = setApiContext;
10
- exports.setUserTimezone = setUserTimezone;
11
- exports.setAdminTimezone = setAdminTimezone;
12
- const currency_code_1 = require("./interfaces/currency-code");
13
- const shared_types_1 = require("./shared-types");
14
- const i18n_lib_1 = require("@digitaldefiance/i18n-lib");
15
- // Create the base context
16
- const baseContext = {
17
- /**
18
- * The language to use for translations in the user facing ui
19
- */
20
- language: shared_types_1.DefaultLanguage,
21
- /**
22
- * The language to use for console/admin logs
23
- */
24
- adminLanguage: shared_types_1.DefaultLanguage,
25
- currencyCode: new currency_code_1.CurrencyCode(shared_types_1.DefaultCurrencyCode),
26
- /**
27
- * The current default context for language translations
28
- */
29
- currentContext: 'user',
30
- /**
31
- * The timezone for the user facing UI
32
- */
33
- timezone: new i18n_lib_1.Timezone('UTC'),
34
- /**
35
- * The timezone for the admin console
36
- */
37
- adminTimezone: new i18n_lib_1.Timezone('UTC'),
38
- };
39
- // Export the context (can be proxied for change detection)
40
- exports.GlobalActiveContext = baseContext;
41
- function setUserLanguage(language) {
42
- exports.GlobalActiveContext.language = language;
43
- }
44
- function setCurrencyCode(code) {
45
- exports.GlobalActiveContext.currencyCode = code;
46
- }
47
- /**
48
- * Sets the admin language for console operations
49
- * @param language The language to set for admin operations
50
- */
51
- function setAdminLanguage(language) {
52
- exports.GlobalActiveContext.adminLanguage = language;
53
- }
54
- /**
55
- * Sets the language context for the current context
56
- * @param context The language context to set
57
- */
58
- function setLanguageContext(context) {
59
- exports.GlobalActiveContext.currentContext = context;
60
- }
61
- // Helper functions for new contexts
62
- function setSystemContext() {
63
- setLanguageContext('system');
64
- }
65
- function setApiContext() {
66
- setLanguageContext('api');
67
- }
68
- function setUserTimezone(tz) {
69
- exports.GlobalActiveContext.timezone = tz;
70
- }
71
- function setAdminTimezone(tz) {
72
- exports.GlobalActiveContext.adminTimezone = tz;
73
- }