@nexim/sanitizer 1.0.0 → 1.1.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/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.1.0](https://github.com/the-nexim/nanolib/compare/@nexim/sanitizer@1.0.0...@nexim/sanitizer@1.1.0) (2025-06-18)
7
+
8
+ ### Features
9
+
10
+ * **sanitizer:** add sanitize number string to english to prevent remove first zero ([13446d8](https://github.com/the-nexim/nanolib/commit/13446d852252342bccd9d62cfe5d56cc33a87514)) by @njfamirm
11
+
6
12
  ## 1.0.0 (2025-06-18)
7
13
 
8
14
  ### Features
package/dist/main.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /* @nexim/sanitizer v1.0.0 */
1
+ /* @nexim/sanitizer v1.1.0 */
2
2
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  // src/main.ts
22
22
  var main_exports = {};
23
23
  __export(main_exports, {
24
+ sanitizeNumberStringToEnglish: () => sanitizeNumberStringToEnglish,
24
25
  sanitizeNumberToEnglish: () => sanitizeNumberToEnglish,
25
26
  sanitizePhoneNumber: () => sanitizePhoneNumber
26
27
  });
@@ -29,7 +30,7 @@ var import_is_number = require("@alwatr/is-number");
29
30
  var import_logger = require("@alwatr/logger");
30
31
  var import_package_tracer = require("@alwatr/package-tracer");
31
32
  var import_unicode_digits = require("@alwatr/unicode-digits");
32
- __dev_mode__: import_package_tracer.packageTracer.add("@nexim/sanitizer", "1.0.0");
33
+ __dev_mode__: import_package_tracer.packageTracer.add("@nexim/sanitizer", "1.1.0");
33
34
  var logger = (0, import_logger.createLogger)("@nexim/sanitizer");
34
35
  var unicodeDigits = new import_unicode_digits.UnicodeDigits("en");
35
36
  function sanitizeNumberToEnglish(number) {
@@ -52,6 +53,26 @@ function sanitizeNumberToEnglish(number) {
52
53
  logger.incident?.("sanitizeNumberToEnglish", "invalid_input", { number });
53
54
  return null;
54
55
  }
56
+ function sanitizeNumberStringToEnglish(number) {
57
+ if (typeof number === "number") {
58
+ return String(number);
59
+ }
60
+ if (typeof number === "string") {
61
+ let str = number.trim();
62
+ if (str === "") {
63
+ logger.incident?.("sanitizeNumberStringToEnglish", "empty_string", { number });
64
+ return null;
65
+ }
66
+ str = unicodeDigits.translate(str);
67
+ if (!(0, import_is_number.isNumber)(str)) {
68
+ logger.incident?.("sanitizeNumberStringToEnglish", "not_a_number", { number });
69
+ return null;
70
+ }
71
+ return str;
72
+ }
73
+ logger.incident?.("sanitizeNumberStringToEnglish", "invalid_input", { number });
74
+ return null;
75
+ }
55
76
  function sanitizePhoneNumber(input, countryCode = "98") {
56
77
  if (input == null) {
57
78
  logger.incident?.("sanitizePhoneNumber", "undefined_or_null_input", { input });
package/dist/main.cjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["import { isNumber } from '@alwatr/is-number';\nimport { createLogger } from '@alwatr/logger';\nimport { packageTracer } from '@alwatr/package-tracer';\nimport { UnicodeDigits } from '@alwatr/unicode-digits';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = createLogger(__package_name__);\nconst unicodeDigits = new UnicodeDigits('en');\n\n/**\n * Sanitizes a number to English format. If input is already a number, returns it as-is.\n * If input is a string, converts Unicode digits to English and validates it's a valid number.\n *\n * @param number - The input to sanitize (number or string)\n * @returns The sanitized number or string, or null if invalid\n *\n * @example\n * ```ts\n * sanitizeNumberToEnglish(123); // returns 123\n * sanitizeNumberToEnglish('۱۲۳'); // returns '123'\n * sanitizeNumberToEnglish('abc'); // returns null\n * ```\n */\nexport function sanitizeNumberToEnglish(number: number): number;\nexport function sanitizeNumberToEnglish(number: unknown): number | null {\n // logger.logMethodArgs?.('sanitizeNumberToEnglish', { number });\n\n if (typeof number === 'number') {\n return number;\n }\n\n if (typeof number === 'string') {\n let str = number.trim();\n if (str === '') {\n logger.incident?.('sanitizeNumberToEnglish', 'empty_string', { number });\n return null;\n }\n\n str = unicodeDigits.translate(str);\n if (!isNumber(str)) {\n logger.incident?.('sanitizeNumberToEnglish', 'not_a_number', { number });\n return null;\n }\n\n return +str;\n }\n\n logger.incident?.('sanitizeNumberToEnglish', 'invalid_input', { number });\n return null;\n}\n\n/**\n * Sanitizes a phone number by converting Unicode digits, removing special characters,\n * and standardizing the format with country code.\n *\n * @param input - The phone number input to sanitize\n * @param countryCode - The country code to apply (default: '98' for Iran)\n * @returns The sanitized phone number as a number, or null if invalid\n *\n * @example\n * ```ts\n * sanitizePhoneNumber('09123456789'); // returns 989123456789\n * sanitizePhoneNumber('+98 912 345 6789'); // returns 989123456789\n * sanitizePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹'); // returns 989123456789\n * sanitizePhoneNumber('invalid'); // returns null\n * ```\n */\nexport function sanitizePhoneNumber(input: unknown, countryCode = '98'): number | null {\n // logger.logMethodArgs?.('sanitizePhoneNumber', { input, countryCode });\n\n if (input == null) {\n logger.incident?.('sanitizePhoneNumber', 'undefined_or_null_input', { input });\n return null;\n }\n\n const inputStr = typeof input === 'string' ? input.trim() : String(input);\n\n if (inputStr === '') {\n logger.incident?.('sanitizePhoneNumber', 'empty_input_string', { input });\n return null;\n }\n\n const englishDigits = unicodeDigits.translate(inputStr);\n const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, '');\n const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\\\+${countryCode}|${countryCode}|^0)`), '');\n const fullNumber = countryCode + cleanNumber;\n\n if (fullNumber.length !== countryCode.length + 10 || !isNumber(fullNumber)) {\n logger.incident?.('sanitizePhoneNumber', 'invalid_full_number', { fullNumber });\n return null;\n }\n\n return +fullNumber;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAyB;AACzB,oBAA6B;AAC7B,4BAA8B;AAC9B,4BAA8B;AAE9B,aAAc,qCAAc,IAAI,oBAAkB,OAAmB;AAErE,IAAM,aAAS,4BAAa,kBAAgB;AAC5C,IAAM,gBAAgB,IAAI,oCAAc,IAAI;AAiBrC,SAAS,wBAAwB,QAAgC;AAGtE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,MAAM,OAAO,KAAK;AACtB,QAAI,QAAQ,IAAI;AACd,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,UAAU,GAAG;AACjC,QAAI,KAAC,2BAAS,GAAG,GAAG;AAClB,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,2BAA2B,iBAAiB,EAAE,OAAO,CAAC;AACxE,SAAO;AACT;AAkBO,SAAS,oBAAoB,OAAgB,cAAc,MAAqB;AAGrF,MAAI,SAAS,MAAM;AACjB,WAAO,WAAW,uBAAuB,2BAA2B,EAAE,MAAM,CAAC;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,OAAO,KAAK;AAExE,MAAI,aAAa,IAAI;AACnB,WAAO,WAAW,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,cAAc,UAAU,QAAQ;AACtD,QAAM,sBAAsB,cAAc,QAAQ,YAAY,EAAE;AAChE,QAAM,cAAc,oBAAoB,QAAQ,IAAI,OAAO,QAAQ,WAAW,IAAI,WAAW,MAAM,GAAG,EAAE;AACxG,QAAM,aAAa,cAAc;AAEjC,MAAI,WAAW,WAAW,YAAY,SAAS,MAAM,KAAC,2BAAS,UAAU,GAAG;AAC1E,WAAO,WAAW,uBAAuB,uBAAuB,EAAE,WAAW,CAAC;AAC9E,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;",
4
+ "sourcesContent": ["import { isNumber } from '@alwatr/is-number';\nimport { createLogger } from '@alwatr/logger';\nimport { packageTracer } from '@alwatr/package-tracer';\nimport { UnicodeDigits } from '@alwatr/unicode-digits';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = createLogger(__package_name__);\nconst unicodeDigits = new UnicodeDigits('en');\n\n/**\n * Sanitizes a number to English format. If input is already a number, returns it as-is.\n * If input is a string, converts Unicode digits to English and validates it's a valid number.\n *\n * @param number - The input to sanitize (number or string)\n * @returns The sanitized number or string, or null if invalid\n *\n * @example\n * ```ts\n * sanitizeNumberToEnglish(123); // returns 123\n * sanitizeNumberToEnglish('۱۲۳'); // returns '123'\n * sanitizeNumberToEnglish('abc'); // returns null\n * ```\n */\nexport function sanitizeNumberToEnglish(number: number): number;\nexport function sanitizeNumberToEnglish<T>(number: T): number | null;\nexport function sanitizeNumberToEnglish(number: unknown): number | null {\n // logger.logMethodArgs?.('sanitizeNumberToEnglish', { number });\n\n if (typeof number === 'number') {\n return number;\n }\n\n if (typeof number === 'string') {\n let str = number.trim();\n if (str === '') {\n logger.incident?.('sanitizeNumberToEnglish', 'empty_string', { number });\n return null;\n }\n\n str = unicodeDigits.translate(str);\n if (!isNumber(str)) {\n logger.incident?.('sanitizeNumberToEnglish', 'not_a_number', { number });\n return null;\n }\n\n return +str;\n }\n\n logger.incident?.('sanitizeNumberToEnglish', 'invalid_input', { number });\n return null;\n}\n\n/**\n * Sanitizes a number to English string format, preserving leading zeros.\n * If input is a string, converts Unicode digits to English and validates it's a valid number.\n * If input is already a number, converts it to string.\n *\n * @param number - The input to sanitize (number or string)\n * @returns The sanitized number as string, or null if invalid\n *\n * @example\n * ```ts\n * sanitizeNumberStringToEnglish(123); // returns '123'\n * sanitizeNumberStringToEnglish('۰۱۲۳'); // returns '0123' (preserves leading zero)\n * sanitizeNumberStringToEnglish('abc'); // returns null\n * ```\n */\nexport function sanitizeNumberStringToEnglish<T>(number: T): string | null;\nexport function sanitizeNumberStringToEnglish(number: unknown): string | null {\n // logger.logMethodArgs?.('sanitizeNumberStringToEnglish', { number });\n\n if (typeof number === 'number') {\n return String(number);\n }\n\n if (typeof number === 'string') {\n let str = number.trim();\n if (str === '') {\n logger.incident?.('sanitizeNumberStringToEnglish', 'empty_string', { number });\n return null;\n }\n\n str = unicodeDigits.translate(str);\n if (!isNumber(str)) {\n logger.incident?.('sanitizeNumberStringToEnglish', 'not_a_number', { number });\n return null;\n }\n\n return str; // Return string to preserve leading zeros\n }\n\n logger.incident?.('sanitizeNumberStringToEnglish', 'invalid_input', { number });\n return null;\n}\n\n/**\n * Sanitizes a phone number by converting Unicode digits, removing special characters,\n * and standardizing the format with country code.\n *\n * @param input - The phone number input to sanitize\n * @param countryCode - The country code to apply (default: '98' for Iran)\n * @returns The sanitized phone number as a number, or null if invalid\n *\n * @example\n * ```ts\n * sanitizePhoneNumber('09123456789'); // returns 989123456789\n * sanitizePhoneNumber('+98 912 345 6789'); // returns 989123456789\n * sanitizePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹'); // returns 989123456789\n * sanitizePhoneNumber('invalid'); // returns null\n * ```\n */\nexport function sanitizePhoneNumber(input: unknown, countryCode = '98'): number | null {\n // logger.logMethodArgs?.('sanitizePhoneNumber', { input, countryCode });\n\n if (input == null) {\n logger.incident?.('sanitizePhoneNumber', 'undefined_or_null_input', { input });\n return null;\n }\n\n const inputStr = typeof input === 'string' ? input.trim() : String(input);\n\n if (inputStr === '') {\n logger.incident?.('sanitizePhoneNumber', 'empty_input_string', { input });\n return null;\n }\n\n const englishDigits = unicodeDigits.translate(inputStr);\n const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, '');\n const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\\\+${countryCode}|${countryCode}|^0)`), '');\n const fullNumber = countryCode + cleanNumber;\n\n if (fullNumber.length !== countryCode.length + 10 || !isNumber(fullNumber)) {\n logger.incident?.('sanitizePhoneNumber', 'invalid_full_number', { fullNumber });\n return null;\n }\n\n return +fullNumber;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAyB;AACzB,oBAA6B;AAC7B,4BAA8B;AAC9B,4BAA8B;AAE9B,aAAc,qCAAc,IAAI,oBAAkB,OAAmB;AAErE,IAAM,aAAS,4BAAa,kBAAgB;AAC5C,IAAM,gBAAgB,IAAI,oCAAc,IAAI;AAkBrC,SAAS,wBAAwB,QAAgC;AAGtE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,MAAM,OAAO,KAAK;AACtB,QAAI,QAAQ,IAAI;AACd,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,UAAU,GAAG;AACjC,QAAI,KAAC,2BAAS,GAAG,GAAG;AAClB,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,2BAA2B,iBAAiB,EAAE,OAAO,CAAC;AACxE,SAAO;AACT;AAkBO,SAAS,8BAA8B,QAAgC;AAG5E,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,MAAM;AAAA,EACtB;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,MAAM,OAAO,KAAK;AACtB,QAAI,QAAQ,IAAI;AACd,aAAO,WAAW,iCAAiC,gBAAgB,EAAE,OAAO,CAAC;AAC7E,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,UAAU,GAAG;AACjC,QAAI,KAAC,2BAAS,GAAG,GAAG;AAClB,aAAO,WAAW,iCAAiC,gBAAgB,EAAE,OAAO,CAAC;AAC7E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,iCAAiC,iBAAiB,EAAE,OAAO,CAAC;AAC9E,SAAO;AACT;AAkBO,SAAS,oBAAoB,OAAgB,cAAc,MAAqB;AAGrF,MAAI,SAAS,MAAM;AACjB,WAAO,WAAW,uBAAuB,2BAA2B,EAAE,MAAM,CAAC;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,OAAO,KAAK;AAExE,MAAI,aAAa,IAAI;AACnB,WAAO,WAAW,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,cAAc,UAAU,QAAQ;AACtD,QAAM,sBAAsB,cAAc,QAAQ,YAAY,EAAE;AAChE,QAAM,cAAc,oBAAoB,QAAQ,IAAI,OAAO,QAAQ,WAAW,IAAI,WAAW,MAAM,GAAG,EAAE;AACxG,QAAM,aAAa,cAAc;AAEjC,MAAI,WAAW,WAAW,YAAY,SAAS,MAAM,KAAC,2BAAS,UAAU,GAAG;AAC1E,WAAO,WAAW,uBAAuB,uBAAuB,EAAE,WAAW,CAAC;AAC9E,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;",
6
6
  "names": []
7
7
  }
package/dist/main.d.ts CHANGED
@@ -13,6 +13,23 @@
13
13
  * ```
14
14
  */
15
15
  export declare function sanitizeNumberToEnglish(number: number): number;
16
+ export declare function sanitizeNumberToEnglish<T>(number: T): number | null;
17
+ /**
18
+ * Sanitizes a number to English string format, preserving leading zeros.
19
+ * If input is a string, converts Unicode digits to English and validates it's a valid number.
20
+ * If input is already a number, converts it to string.
21
+ *
22
+ * @param number - The input to sanitize (number or string)
23
+ * @returns The sanitized number as string, or null if invalid
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * sanitizeNumberStringToEnglish(123); // returns '123'
28
+ * sanitizeNumberStringToEnglish('۰۱۲۳'); // returns '0123' (preserves leading zero)
29
+ * sanitizeNumberStringToEnglish('abc'); // returns null
30
+ * ```
31
+ */
32
+ export declare function sanitizeNumberStringToEnglish<T>(number: T): string | null;
16
33
  /**
17
34
  * Sanitizes a phone number by converting Unicode digits, removing special characters,
18
35
  * and standardizing the format with country code.
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;AA4BhE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,SAAO,GAAG,MAAM,GAAG,IAAI,CA0BrF"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;AAChE,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AA4BrE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AA4B3E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,SAAO,GAAG,MAAM,GAAG,IAAI,CA0BrF"}
package/dist/main.mjs CHANGED
@@ -1,11 +1,11 @@
1
- /* @nexim/sanitizer v1.0.0 */
1
+ /* @nexim/sanitizer v1.1.0 */
2
2
 
3
3
  // src/main.ts
4
4
  import { isNumber } from "@alwatr/is-number";
5
5
  import { createLogger } from "@alwatr/logger";
6
6
  import { packageTracer } from "@alwatr/package-tracer";
7
7
  import { UnicodeDigits } from "@alwatr/unicode-digits";
8
- __dev_mode__: packageTracer.add("@nexim/sanitizer", "1.0.0");
8
+ __dev_mode__: packageTracer.add("@nexim/sanitizer", "1.1.0");
9
9
  var logger = createLogger("@nexim/sanitizer");
10
10
  var unicodeDigits = new UnicodeDigits("en");
11
11
  function sanitizeNumberToEnglish(number) {
@@ -28,6 +28,26 @@ function sanitizeNumberToEnglish(number) {
28
28
  logger.incident?.("sanitizeNumberToEnglish", "invalid_input", { number });
29
29
  return null;
30
30
  }
31
+ function sanitizeNumberStringToEnglish(number) {
32
+ if (typeof number === "number") {
33
+ return String(number);
34
+ }
35
+ if (typeof number === "string") {
36
+ let str = number.trim();
37
+ if (str === "") {
38
+ logger.incident?.("sanitizeNumberStringToEnglish", "empty_string", { number });
39
+ return null;
40
+ }
41
+ str = unicodeDigits.translate(str);
42
+ if (!isNumber(str)) {
43
+ logger.incident?.("sanitizeNumberStringToEnglish", "not_a_number", { number });
44
+ return null;
45
+ }
46
+ return str;
47
+ }
48
+ logger.incident?.("sanitizeNumberStringToEnglish", "invalid_input", { number });
49
+ return null;
50
+ }
31
51
  function sanitizePhoneNumber(input, countryCode = "98") {
32
52
  if (input == null) {
33
53
  logger.incident?.("sanitizePhoneNumber", "undefined_or_null_input", { input });
@@ -49,6 +69,7 @@ function sanitizePhoneNumber(input, countryCode = "98") {
49
69
  return +fullNumber;
50
70
  }
51
71
  export {
72
+ sanitizeNumberStringToEnglish,
52
73
  sanitizeNumberToEnglish,
53
74
  sanitizePhoneNumber
54
75
  };
package/dist/main.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["import { isNumber } from '@alwatr/is-number';\nimport { createLogger } from '@alwatr/logger';\nimport { packageTracer } from '@alwatr/package-tracer';\nimport { UnicodeDigits } from '@alwatr/unicode-digits';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = createLogger(__package_name__);\nconst unicodeDigits = new UnicodeDigits('en');\n\n/**\n * Sanitizes a number to English format. If input is already a number, returns it as-is.\n * If input is a string, converts Unicode digits to English and validates it's a valid number.\n *\n * @param number - The input to sanitize (number or string)\n * @returns The sanitized number or string, or null if invalid\n *\n * @example\n * ```ts\n * sanitizeNumberToEnglish(123); // returns 123\n * sanitizeNumberToEnglish('۱۲۳'); // returns '123'\n * sanitizeNumberToEnglish('abc'); // returns null\n * ```\n */\nexport function sanitizeNumberToEnglish(number: number): number;\nexport function sanitizeNumberToEnglish(number: unknown): number | null {\n // logger.logMethodArgs?.('sanitizeNumberToEnglish', { number });\n\n if (typeof number === 'number') {\n return number;\n }\n\n if (typeof number === 'string') {\n let str = number.trim();\n if (str === '') {\n logger.incident?.('sanitizeNumberToEnglish', 'empty_string', { number });\n return null;\n }\n\n str = unicodeDigits.translate(str);\n if (!isNumber(str)) {\n logger.incident?.('sanitizeNumberToEnglish', 'not_a_number', { number });\n return null;\n }\n\n return +str;\n }\n\n logger.incident?.('sanitizeNumberToEnglish', 'invalid_input', { number });\n return null;\n}\n\n/**\n * Sanitizes a phone number by converting Unicode digits, removing special characters,\n * and standardizing the format with country code.\n *\n * @param input - The phone number input to sanitize\n * @param countryCode - The country code to apply (default: '98' for Iran)\n * @returns The sanitized phone number as a number, or null if invalid\n *\n * @example\n * ```ts\n * sanitizePhoneNumber('09123456789'); // returns 989123456789\n * sanitizePhoneNumber('+98 912 345 6789'); // returns 989123456789\n * sanitizePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹'); // returns 989123456789\n * sanitizePhoneNumber('invalid'); // returns null\n * ```\n */\nexport function sanitizePhoneNumber(input: unknown, countryCode = '98'): number | null {\n // logger.logMethodArgs?.('sanitizePhoneNumber', { input, countryCode });\n\n if (input == null) {\n logger.incident?.('sanitizePhoneNumber', 'undefined_or_null_input', { input });\n return null;\n }\n\n const inputStr = typeof input === 'string' ? input.trim() : String(input);\n\n if (inputStr === '') {\n logger.incident?.('sanitizePhoneNumber', 'empty_input_string', { input });\n return null;\n }\n\n const englishDigits = unicodeDigits.translate(inputStr);\n const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, '');\n const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\\\+${countryCode}|${countryCode}|^0)`), '');\n const fullNumber = countryCode + cleanNumber;\n\n if (fullNumber.length !== countryCode.length + 10 || !isNumber(fullNumber)) {\n logger.incident?.('sanitizePhoneNumber', 'invalid_full_number', { fullNumber });\n return null;\n }\n\n return +fullNumber;\n}\n"],
5
- "mappings": ";;;AAAA,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAE9B,aAAc,eAAc,IAAI,oBAAkB,OAAmB;AAErE,IAAM,SAAS,aAAa,kBAAgB;AAC5C,IAAM,gBAAgB,IAAI,cAAc,IAAI;AAiBrC,SAAS,wBAAwB,QAAgC;AAGtE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,MAAM,OAAO,KAAK;AACtB,QAAI,QAAQ,IAAI;AACd,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,UAAU,GAAG;AACjC,QAAI,CAAC,SAAS,GAAG,GAAG;AAClB,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,2BAA2B,iBAAiB,EAAE,OAAO,CAAC;AACxE,SAAO;AACT;AAkBO,SAAS,oBAAoB,OAAgB,cAAc,MAAqB;AAGrF,MAAI,SAAS,MAAM;AACjB,WAAO,WAAW,uBAAuB,2BAA2B,EAAE,MAAM,CAAC;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,OAAO,KAAK;AAExE,MAAI,aAAa,IAAI;AACnB,WAAO,WAAW,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,cAAc,UAAU,QAAQ;AACtD,QAAM,sBAAsB,cAAc,QAAQ,YAAY,EAAE;AAChE,QAAM,cAAc,oBAAoB,QAAQ,IAAI,OAAO,QAAQ,WAAW,IAAI,WAAW,MAAM,GAAG,EAAE;AACxG,QAAM,aAAa,cAAc;AAEjC,MAAI,WAAW,WAAW,YAAY,SAAS,MAAM,CAAC,SAAS,UAAU,GAAG;AAC1E,WAAO,WAAW,uBAAuB,uBAAuB,EAAE,WAAW,CAAC;AAC9E,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;",
4
+ "sourcesContent": ["import { isNumber } from '@alwatr/is-number';\nimport { createLogger } from '@alwatr/logger';\nimport { packageTracer } from '@alwatr/package-tracer';\nimport { UnicodeDigits } from '@alwatr/unicode-digits';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nconst logger = createLogger(__package_name__);\nconst unicodeDigits = new UnicodeDigits('en');\n\n/**\n * Sanitizes a number to English format. If input is already a number, returns it as-is.\n * If input is a string, converts Unicode digits to English and validates it's a valid number.\n *\n * @param number - The input to sanitize (number or string)\n * @returns The sanitized number or string, or null if invalid\n *\n * @example\n * ```ts\n * sanitizeNumberToEnglish(123); // returns 123\n * sanitizeNumberToEnglish('۱۲۳'); // returns '123'\n * sanitizeNumberToEnglish('abc'); // returns null\n * ```\n */\nexport function sanitizeNumberToEnglish(number: number): number;\nexport function sanitizeNumberToEnglish<T>(number: T): number | null;\nexport function sanitizeNumberToEnglish(number: unknown): number | null {\n // logger.logMethodArgs?.('sanitizeNumberToEnglish', { number });\n\n if (typeof number === 'number') {\n return number;\n }\n\n if (typeof number === 'string') {\n let str = number.trim();\n if (str === '') {\n logger.incident?.('sanitizeNumberToEnglish', 'empty_string', { number });\n return null;\n }\n\n str = unicodeDigits.translate(str);\n if (!isNumber(str)) {\n logger.incident?.('sanitizeNumberToEnglish', 'not_a_number', { number });\n return null;\n }\n\n return +str;\n }\n\n logger.incident?.('sanitizeNumberToEnglish', 'invalid_input', { number });\n return null;\n}\n\n/**\n * Sanitizes a number to English string format, preserving leading zeros.\n * If input is a string, converts Unicode digits to English and validates it's a valid number.\n * If input is already a number, converts it to string.\n *\n * @param number - The input to sanitize (number or string)\n * @returns The sanitized number as string, or null if invalid\n *\n * @example\n * ```ts\n * sanitizeNumberStringToEnglish(123); // returns '123'\n * sanitizeNumberStringToEnglish('۰۱۲۳'); // returns '0123' (preserves leading zero)\n * sanitizeNumberStringToEnglish('abc'); // returns null\n * ```\n */\nexport function sanitizeNumberStringToEnglish<T>(number: T): string | null;\nexport function sanitizeNumberStringToEnglish(number: unknown): string | null {\n // logger.logMethodArgs?.('sanitizeNumberStringToEnglish', { number });\n\n if (typeof number === 'number') {\n return String(number);\n }\n\n if (typeof number === 'string') {\n let str = number.trim();\n if (str === '') {\n logger.incident?.('sanitizeNumberStringToEnglish', 'empty_string', { number });\n return null;\n }\n\n str = unicodeDigits.translate(str);\n if (!isNumber(str)) {\n logger.incident?.('sanitizeNumberStringToEnglish', 'not_a_number', { number });\n return null;\n }\n\n return str; // Return string to preserve leading zeros\n }\n\n logger.incident?.('sanitizeNumberStringToEnglish', 'invalid_input', { number });\n return null;\n}\n\n/**\n * Sanitizes a phone number by converting Unicode digits, removing special characters,\n * and standardizing the format with country code.\n *\n * @param input - The phone number input to sanitize\n * @param countryCode - The country code to apply (default: '98' for Iran)\n * @returns The sanitized phone number as a number, or null if invalid\n *\n * @example\n * ```ts\n * sanitizePhoneNumber('09123456789'); // returns 989123456789\n * sanitizePhoneNumber('+98 912 345 6789'); // returns 989123456789\n * sanitizePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹'); // returns 989123456789\n * sanitizePhoneNumber('invalid'); // returns null\n * ```\n */\nexport function sanitizePhoneNumber(input: unknown, countryCode = '98'): number | null {\n // logger.logMethodArgs?.('sanitizePhoneNumber', { input, countryCode });\n\n if (input == null) {\n logger.incident?.('sanitizePhoneNumber', 'undefined_or_null_input', { input });\n return null;\n }\n\n const inputStr = typeof input === 'string' ? input.trim() : String(input);\n\n if (inputStr === '') {\n logger.incident?.('sanitizePhoneNumber', 'empty_input_string', { input });\n return null;\n }\n\n const englishDigits = unicodeDigits.translate(inputStr);\n const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, '');\n const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\\\+${countryCode}|${countryCode}|^0)`), '');\n const fullNumber = countryCode + cleanNumber;\n\n if (fullNumber.length !== countryCode.length + 10 || !isNumber(fullNumber)) {\n logger.incident?.('sanitizePhoneNumber', 'invalid_full_number', { fullNumber });\n return null;\n }\n\n return +fullNumber;\n}\n"],
5
+ "mappings": ";;;AAAA,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAE9B,aAAc,eAAc,IAAI,oBAAkB,OAAmB;AAErE,IAAM,SAAS,aAAa,kBAAgB;AAC5C,IAAM,gBAAgB,IAAI,cAAc,IAAI;AAkBrC,SAAS,wBAAwB,QAAgC;AAGtE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,MAAM,OAAO,KAAK;AACtB,QAAI,QAAQ,IAAI;AACd,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,UAAU,GAAG;AACjC,QAAI,CAAC,SAAS,GAAG,GAAG;AAClB,aAAO,WAAW,2BAA2B,gBAAgB,EAAE,OAAO,CAAC;AACvE,aAAO;AAAA,IACT;AAEA,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,2BAA2B,iBAAiB,EAAE,OAAO,CAAC;AACxE,SAAO;AACT;AAkBO,SAAS,8BAA8B,QAAgC;AAG5E,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,MAAM;AAAA,EACtB;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,MAAM,OAAO,KAAK;AACtB,QAAI,QAAQ,IAAI;AACd,aAAO,WAAW,iCAAiC,gBAAgB,EAAE,OAAO,CAAC;AAC7E,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,UAAU,GAAG;AACjC,QAAI,CAAC,SAAS,GAAG,GAAG;AAClB,aAAO,WAAW,iCAAiC,gBAAgB,EAAE,OAAO,CAAC;AAC7E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,iCAAiC,iBAAiB,EAAE,OAAO,CAAC;AAC9E,SAAO;AACT;AAkBO,SAAS,oBAAoB,OAAgB,cAAc,MAAqB;AAGrF,MAAI,SAAS,MAAM;AACjB,WAAO,WAAW,uBAAuB,2BAA2B,EAAE,MAAM,CAAC;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,OAAO,KAAK;AAExE,MAAI,aAAa,IAAI;AACnB,WAAO,WAAW,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,cAAc,UAAU,QAAQ;AACtD,QAAM,sBAAsB,cAAc,QAAQ,YAAY,EAAE;AAChE,QAAM,cAAc,oBAAoB,QAAQ,IAAI,OAAO,QAAQ,WAAW,IAAI,WAAW,MAAM,GAAG,EAAE;AACxG,QAAM,aAAa,cAAc;AAEjC,MAAI,WAAW,WAAW,YAAY,SAAS,MAAM,CAAC,SAAS,UAAU,GAAG;AAC1E,WAAO,WAAW,uBAAuB,uBAAuB,EAAE,WAAW,CAAC;AAC9E,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;",
6
6
  "names": []
7
7
  }
package/docs/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  ## Functions
4
4
 
5
- | Function | Description |
6
- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
7
- | [sanitizeNumberToEnglish](functions/sanitizeNumberToEnglish.md) | Sanitizes a number to English format. If input is already a number, returns it as-is. If input is a string, converts Unicode digits to English and validates it's a valid number. |
8
- | [sanitizePhoneNumber](functions/sanitizePhoneNumber.md) | Sanitizes a phone number by converting Unicode digits, removing special characters, and standardizing the format with country code. |
5
+ | Function | Description |
6
+ | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
7
+ | [sanitizeNumberStringToEnglish](functions/sanitizeNumberStringToEnglish.md) | Sanitizes a number to English string format, preserving leading zeros. If input is a string, converts Unicode digits to English and validates it's a valid number. If input is already a number, converts it to string. |
8
+ | [sanitizeNumberToEnglish](functions/sanitizeNumberToEnglish.md) | Sanitizes a number to English format. If input is already a number, returns it as-is. If input is a string, converts Unicode digits to English and validates it's a valid number. |
9
+ | [sanitizePhoneNumber](functions/sanitizePhoneNumber.md) | Sanitizes a phone number by converting Unicode digits, removing special characters, and standardizing the format with country code. |
@@ -0,0 +1,35 @@
1
+ [@nexim/sanitizer](../README.md) / sanitizeNumberStringToEnglish
2
+
3
+ # Function: sanitizeNumberStringToEnglish()
4
+
5
+ > **sanitizeNumberStringToEnglish**\<`T`\>(`number`: `T`): `null` \| `string`
6
+
7
+ Sanitizes a number to English string format, preserving leading zeros.
8
+ If input is a string, converts Unicode digits to English and validates it's a valid number.
9
+ If input is already a number, converts it to string.
10
+
11
+ ## Type Parameters
12
+
13
+ | Type Parameter |
14
+ | -------------- |
15
+ | `T` |
16
+
17
+ ## Parameters
18
+
19
+ | Parameter | Type | Description |
20
+ | --------- | ---- | ---------------------------------------- |
21
+ | `number` | `T` | The input to sanitize (number or string) |
22
+
23
+ ## Returns
24
+
25
+ `null` \| `string`
26
+
27
+ The sanitized number as string, or null if invalid
28
+
29
+ ## Example
30
+
31
+ ```ts
32
+ sanitizeNumberStringToEnglish(123); // returns '123'
33
+ sanitizeNumberStringToEnglish('۰۱۲۳'); // returns '0123' (preserves leading zero)
34
+ sanitizeNumberStringToEnglish('abc'); // returns null
35
+ ```
@@ -2,24 +2,59 @@
2
2
 
3
3
  # Function: sanitizeNumberToEnglish()
4
4
 
5
+ ## Call Signature
6
+
5
7
  > **sanitizeNumberToEnglish**(`number`: `number`): `number`
6
8
 
7
9
  Sanitizes a number to English format. If input is already a number, returns it as-is.
8
10
  If input is a string, converts Unicode digits to English and validates it's a valid number.
9
11
 
10
- ## Parameters
12
+ ### Parameters
11
13
 
12
14
  | Parameter | Type | Description |
13
15
  | --------- | -------- | ---------------------------------------- |
14
16
  | `number` | `number` | The input to sanitize (number or string) |
15
17
 
16
- ## Returns
18
+ ### Returns
17
19
 
18
20
  `number`
19
21
 
20
22
  The sanitized number or string, or null if invalid
21
23
 
22
- ## Example
24
+ ### Example
25
+
26
+ ```ts
27
+ sanitizeNumberToEnglish(123); // returns 123
28
+ sanitizeNumberToEnglish('۱۲۳'); // returns '123'
29
+ sanitizeNumberToEnglish('abc'); // returns null
30
+ ```
31
+
32
+ ## Call Signature
33
+
34
+ > **sanitizeNumberToEnglish**\<`T`\>(`number`: `T`): `null` \| `number`
35
+
36
+ Sanitizes a number to English format. If input is already a number, returns it as-is.
37
+ If input is a string, converts Unicode digits to English and validates it's a valid number.
38
+
39
+ ### Type Parameters
40
+
41
+ | Type Parameter |
42
+ | -------------- |
43
+ | `T` |
44
+
45
+ ### Parameters
46
+
47
+ | Parameter | Type | Description |
48
+ | --------- | ---- | ---------------------------------------- |
49
+ | `number` | `T` | The input to sanitize (number or string) |
50
+
51
+ ### Returns
52
+
53
+ `null` \| `number`
54
+
55
+ The sanitized number or string, or null if invalid
56
+
57
+ ### Example
23
58
 
24
59
  ```ts
25
60
  sanitizeNumberToEnglish(123); // returns 123
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexim/sanitizer",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A collection of sanitization utilities for phone numbers and numeric inputs with TypeScript type safety.",
5
5
  "keywords": [
6
6
  "sanitizer",
@@ -109,5 +109,5 @@
109
109
  "command": "typedoc"
110
110
  }
111
111
  },
112
- "gitHead": "0310d2636f626d479b6e925167ebc361468232c7"
112
+ "gitHead": "b98c4af4c1d206ce778413fa9061f85c8748ac58"
113
113
  }