@digitaldefiance/i18n-lib 3.0.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +145 -0
  2. package/package.json +1 -1
  3. package/src/core/i18n-engine.d.ts.map +1 -1
  4. package/src/core/i18n-engine.js +18 -7
  5. package/src/core/i18n-engine.js.map +1 -1
  6. package/src/icu/ast.d.ts +48 -0
  7. package/src/icu/ast.d.ts.map +1 -0
  8. package/src/icu/ast.js +16 -0
  9. package/src/icu/ast.js.map +1 -0
  10. package/src/icu/compiler.d.ts +16 -0
  11. package/src/icu/compiler.d.ts.map +1 -0
  12. package/src/icu/compiler.js +81 -0
  13. package/src/icu/compiler.js.map +1 -0
  14. package/src/icu/formatter-registry.d.ts +10 -0
  15. package/src/icu/formatter-registry.d.ts.map +1 -0
  16. package/src/icu/formatter-registry.js +34 -0
  17. package/src/icu/formatter-registry.js.map +1 -0
  18. package/src/icu/formatters/base-formatter.d.ts +8 -0
  19. package/src/icu/formatters/base-formatter.d.ts.map +1 -0
  20. package/src/icu/formatters/base-formatter.js +3 -0
  21. package/src/icu/formatters/base-formatter.js.map +1 -0
  22. package/src/icu/formatters/date-formatter.d.ts +5 -0
  23. package/src/icu/formatters/date-formatter.d.ts.map +1 -0
  24. package/src/icu/formatters/date-formatter.js +31 -0
  25. package/src/icu/formatters/date-formatter.js.map +1 -0
  26. package/src/icu/formatters/number-formatter.d.ts +5 -0
  27. package/src/icu/formatters/number-formatter.d.ts.map +1 -0
  28. package/src/icu/formatters/number-formatter.js +30 -0
  29. package/src/icu/formatters/number-formatter.js.map +1 -0
  30. package/src/icu/formatters/plural-formatter.d.ts +5 -0
  31. package/src/icu/formatters/plural-formatter.d.ts.map +1 -0
  32. package/src/icu/formatters/plural-formatter.js +15 -0
  33. package/src/icu/formatters/plural-formatter.js.map +1 -0
  34. package/src/icu/formatters/select-formatter.d.ts +5 -0
  35. package/src/icu/formatters/select-formatter.d.ts.map +1 -0
  36. package/src/icu/formatters/select-formatter.js +10 -0
  37. package/src/icu/formatters/select-formatter.js.map +1 -0
  38. package/src/icu/formatters/selectordinal-formatter.d.ts +5 -0
  39. package/src/icu/formatters/selectordinal-formatter.d.ts.map +1 -0
  40. package/src/icu/formatters/selectordinal-formatter.js +22 -0
  41. package/src/icu/formatters/selectordinal-formatter.js.map +1 -0
  42. package/src/icu/formatters/time-formatter.d.ts +5 -0
  43. package/src/icu/formatters/time-formatter.d.ts.map +1 -0
  44. package/src/icu/formatters/time-formatter.js +31 -0
  45. package/src/icu/formatters/time-formatter.js.map +1 -0
  46. package/src/icu/helpers.d.ts +9 -0
  47. package/src/icu/helpers.d.ts.map +1 -0
  48. package/src/icu/helpers.js +31 -0
  49. package/src/icu/helpers.js.map +1 -0
  50. package/src/icu/parser.d.ts +31 -0
  51. package/src/icu/parser.d.ts.map +1 -0
  52. package/src/icu/parser.js +203 -0
  53. package/src/icu/parser.js.map +1 -0
  54. package/src/icu/runtime.d.ts +10 -0
  55. package/src/icu/runtime.d.ts.map +1 -0
  56. package/src/icu/runtime.js +33 -0
  57. package/src/icu/runtime.js.map +1 -0
  58. package/src/icu/tokenizer.d.ts +37 -0
  59. package/src/icu/tokenizer.d.ts.map +1 -0
  60. package/src/icu/tokenizer.js +187 -0
  61. package/src/icu/tokenizer.js.map +1 -0
  62. package/src/icu/validator.d.ts +11 -0
  63. package/src/icu/validator.d.ts.map +1 -0
  64. package/src/icu/validator.js +140 -0
  65. package/src/icu/validator.js.map +1 -0
  66. package/src/template.d.ts.map +1 -1
  67. package/src/template.js +12 -3
  68. package/src/template.js.map +1 -1
  69. package/src/utils/html-escape.d.ts +8 -0
  70. package/src/utils/html-escape.d.ts.map +1 -0
  71. package/src/utils/html-escape.js +33 -0
  72. package/src/utils/html-escape.js.map +1 -0
  73. package/src/utils/index.d.ts +7 -0
  74. package/src/utils/index.d.ts.map +1 -1
  75. package/src/utils/index.js +7 -0
  76. package/src/utils/index.js.map +1 -1
  77. package/src/utils/lru-cache.d.ts +13 -0
  78. package/src/utils/lru-cache.d.ts.map +1 -0
  79. package/src/utils/lru-cache.js +44 -0
  80. package/src/utils/lru-cache.js.map +1 -0
  81. package/src/utils/safe-object.d.ts +9 -0
  82. package/src/utils/safe-object.d.ts.map +1 -0
  83. package/src/utils/safe-object.js +44 -0
  84. package/src/utils/safe-object.js.map +1 -0
  85. package/src/utils/string-utils.d.ts +4 -1
  86. package/src/utils/string-utils.d.ts.map +1 -1
  87. package/src/utils/string-utils.js +5 -5
  88. package/src/utils/string-utils.js.map +1 -1
  89. package/src/utils/validation.d.ts +15 -0
  90. package/src/utils/validation.d.ts.map +1 -0
  91. package/src/utils/validation.js +44 -0
  92. package/src/utils/validation.js.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/string-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC9B,MAAM,CA2BR;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C"}
1
+ {"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/string-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,CAyBR;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C"}
@@ -5,6 +5,7 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.replaceVariables = replaceVariables;
7
7
  exports.isTemplate = isTemplate;
8
+ const html_escape_1 = require("./html-escape");
8
9
  /**
9
10
  * Extract the actual value from an object that might be a wrapper (CurrencyCode, Timezone, etc.)
10
11
  */
@@ -15,7 +16,7 @@ function extractValue(value) {
15
16
  }
16
17
  return value;
17
18
  }
18
- function replaceVariables(str, vars, constants) {
19
+ function replaceVariables(str, vars, constants, options) {
19
20
  if (typeof str !== 'string') {
20
21
  str = String(str);
21
22
  }
@@ -28,13 +29,12 @@ function replaceVariables(str, vars, constants) {
28
29
  let replacement = '';
29
30
  if (vars && varName in vars) {
30
31
  const value = extractValue(vars[varName]);
31
- replacement = String(value);
32
+ replacement = (0, html_escape_1.safeStringify)(value, options);
33
+ result = result.replace(variable, replacement);
32
34
  }
33
35
  else if (constants && varName in constants) {
34
36
  const value = extractValue(constants[varName]);
35
- replacement = String(value);
36
- }
37
- if (replacement) {
37
+ replacement = (0, html_escape_1.safeStringify)(value, options);
38
38
  result = result.replace(variable, replacement);
39
39
  }
40
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"string-utils.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/string-utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,4CA+BC;AAED,gCAEC;AA9CD;;GAEG;AACH,SAAS,YAAY,CAAC,KAAU;IAC9B,wEAAwE;IACxE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAChG,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,gBAAgB,CAC9B,GAAW,EACX,IAA0B,EAC1B,SAA+B;IAE/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS;QAAE,OAAO,GAAG,CAAC;IAE3B,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"string-utils.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/string-utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAmBH,4CA8BC;AAED,gCAEC;AAnDD,+CAA0D;AAE1D;;GAEG;AACH,SAAS,YAAY,CAAC,KAAU;IAC9B,wEAAwE;IACxE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAChG,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAMD,SAAgB,gBAAgB,CAC9B,GAAW,EACX,IAA0B,EAC1B,SAA+B,EAC/B,OAAiC;IAEjC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS;QAAE,OAAO,GAAG,CAAC;IAE3B,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,WAAW,GAAG,IAAA,2BAAa,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,WAAW,GAAG,IAAA,2BAAa,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Input validation utilities
3
+ */
4
+ export declare const LIMITS: {
5
+ readonly MAX_TEMPLATE_LENGTH: 10000;
6
+ readonly MAX_KEY_LENGTH: 200;
7
+ readonly MAX_COMPONENT_ID_LENGTH: 100;
8
+ readonly MAX_LANGUAGE_CODE_LENGTH: 10;
9
+ readonly MAX_NESTING_DEPTH: 10;
10
+ };
11
+ export declare function validateTemplateLength(template: string): void;
12
+ export declare function validateKeyLength(key: string): void;
13
+ export declare function validateComponentId(componentId: string): void;
14
+ export declare function validateLanguageCode(language: string): void;
15
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC;AAEX,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAI7D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAO7D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAO3D"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * Input validation utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LIMITS = void 0;
7
+ exports.validateTemplateLength = validateTemplateLength;
8
+ exports.validateKeyLength = validateKeyLength;
9
+ exports.validateComponentId = validateComponentId;
10
+ exports.validateLanguageCode = validateLanguageCode;
11
+ exports.LIMITS = {
12
+ MAX_TEMPLATE_LENGTH: 10000,
13
+ MAX_KEY_LENGTH: 200,
14
+ MAX_COMPONENT_ID_LENGTH: 100,
15
+ MAX_LANGUAGE_CODE_LENGTH: 10,
16
+ MAX_NESTING_DEPTH: 10,
17
+ };
18
+ function validateTemplateLength(template) {
19
+ if (template.length > exports.LIMITS.MAX_TEMPLATE_LENGTH) {
20
+ throw new Error(`Template exceeds maximum length of ${exports.LIMITS.MAX_TEMPLATE_LENGTH}`);
21
+ }
22
+ }
23
+ function validateKeyLength(key) {
24
+ if (key.length > exports.LIMITS.MAX_KEY_LENGTH) {
25
+ throw new Error(`Key exceeds maximum length of ${exports.LIMITS.MAX_KEY_LENGTH}`);
26
+ }
27
+ }
28
+ function validateComponentId(componentId) {
29
+ if (componentId.length > exports.LIMITS.MAX_COMPONENT_ID_LENGTH) {
30
+ throw new Error(`Component ID exceeds maximum length of ${exports.LIMITS.MAX_COMPONENT_ID_LENGTH}`);
31
+ }
32
+ if (!/^[a-zA-Z0-9_-]+$/.test(componentId)) {
33
+ throw new Error('Component ID contains invalid characters');
34
+ }
35
+ }
36
+ function validateLanguageCode(language) {
37
+ if (language.length > exports.LIMITS.MAX_LANGUAGE_CODE_LENGTH) {
38
+ throw new Error(`Language code exceeds maximum length of ${exports.LIMITS.MAX_LANGUAGE_CODE_LENGTH}`);
39
+ }
40
+ if (!/^[a-z]{2}(-[A-Z]{2})?$/.test(language)) {
41
+ throw new Error('Invalid language code format');
42
+ }
43
+ }
44
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-i18n-lib/src/utils/validation.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAUH,wDAIC;AAED,8CAIC;AAED,kDAOC;AAED,oDAOC;AApCY,QAAA,MAAM,GAAG;IACpB,mBAAmB,EAAE,KAAK;IAC1B,cAAc,EAAE,GAAG;IACnB,uBAAuB,EAAE,GAAG;IAC5B,wBAAwB,EAAE,EAAE;IAC5B,iBAAiB,EAAE,EAAE;CACb,CAAC;AAEX,SAAgB,sBAAsB,CAAC,QAAgB;IACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,cAAM,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,sCAAsC,cAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,IAAI,GAAG,CAAC,MAAM,GAAG,cAAM,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,iCAAiC,cAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,WAAmB;IACrD,IAAI,WAAW,CAAC,MAAM,GAAG,cAAM,CAAC,uBAAuB,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,0CAA0C,cAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,QAAgB;IACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,cAAM,CAAC,wBAAwB,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,2CAA2C,cAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}