@nexim/sanitizer 1.1.1 → 1.1.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
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.3](https://github.com/the-nexim/nanolib/compare/@nexim/sanitizer@1.1.2...@nexim/sanitizer@1.1.3) (2025-11-22)
7
+
8
+ **Note:** Version bump only for package @nexim/sanitizer
9
+
10
+ ## [1.1.2](https://github.com/the-nexim/nanolib/compare/@nexim/sanitizer@1.1.1...@nexim/sanitizer@1.1.2) (2025-08-30)
11
+
12
+ **Note:** Version bump only for package @nexim/sanitizer
13
+
6
14
  ## [1.1.1](https://github.com/the-nexim/nanolib/compare/@nexim/sanitizer@1.1.0...@nexim/sanitizer@1.1.1) (2025-08-19)
7
15
 
8
16
  **Note:** Version bump only for package @nexim/sanitizer
package/dist/main.cjs CHANGED
@@ -1,96 +1,4 @@
1
- /* @nexim/sanitizer v1.1.1 */
2
- "use strict";
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
-
21
- // src/main.ts
22
- var main_exports = {};
23
- __export(main_exports, {
24
- sanitizeNumberStringToEnglish: () => sanitizeNumberStringToEnglish,
25
- sanitizeNumberToEnglish: () => sanitizeNumberToEnglish,
26
- sanitizePhoneNumber: () => sanitizePhoneNumber
27
- });
28
- module.exports = __toCommonJS(main_exports);
29
- var import_is_number = require("@alwatr/is-number");
30
- var import_logger = require("@alwatr/logger");
31
- var import_package_tracer = require("@alwatr/package-tracer");
32
- var import_unicode_digits = require("@alwatr/unicode-digits");
33
- __dev_mode__: import_package_tracer.packageTracer.add("@nexim/sanitizer", "1.1.1");
34
- var logger = (0, import_logger.createLogger)("@nexim/sanitizer");
35
- var unicodeDigits = new import_unicode_digits.UnicodeDigits("en");
36
- function sanitizeNumberToEnglish(number) {
37
- if (typeof number === "number") {
38
- return number;
39
- }
40
- if (typeof number === "string") {
41
- let str = number.trim();
42
- if (str === "") {
43
- logger.incident?.("sanitizeNumberToEnglish", "empty_string", { number });
44
- return null;
45
- }
46
- str = unicodeDigits.translate(str);
47
- if (!(0, import_is_number.isNumber)(str)) {
48
- logger.incident?.("sanitizeNumberToEnglish", "not_a_number", { number });
49
- return null;
50
- }
51
- return +str;
52
- }
53
- logger.incident?.("sanitizeNumberToEnglish", "invalid_input", { number });
54
- return null;
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
- }
76
- function sanitizePhoneNumber(input, countryCode = "98") {
77
- if (input == null) {
78
- logger.incident?.("sanitizePhoneNumber", "undefined_or_null_input", { input });
79
- return null;
80
- }
81
- const inputStr = typeof input === "string" ? input.trim() : String(input);
82
- if (inputStr === "") {
83
- logger.incident?.("sanitizePhoneNumber", "empty_input_string", { input });
84
- return null;
85
- }
86
- const englishDigits = unicodeDigits.translate(inputStr);
87
- const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, "");
88
- const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\+${countryCode}|${countryCode}|^0)`), "");
89
- const fullNumber = countryCode + cleanNumber;
90
- if (fullNumber.length !== countryCode.length + 10 || !(0, import_is_number.isNumber)(fullNumber)) {
91
- logger.incident?.("sanitizePhoneNumber", "invalid_full_number", { fullNumber });
92
- return null;
93
- }
94
- return +fullNumber;
95
- }
1
+ /** 📦 @nexim/sanitizer v1.1.3 */
2
+ __dev_mode__: console.debug("📦 @nexim/sanitizer v1.1.3");
3
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var main_exports={};__export(main_exports,{sanitizeNumberStringToEnglish:()=>sanitizeNumberStringToEnglish,sanitizeNumberToEnglish:()=>sanitizeNumberToEnglish,sanitizePhoneNumber:()=>sanitizePhoneNumber});module.exports=__toCommonJS(main_exports);var import_is_number=require("@alwatr/is-number");var import_logger=require("@alwatr/logger");var import_package_tracer=require("@alwatr/package-tracer");var import_unicode_digits=require("@alwatr/unicode-digits");__dev_mode__:import_package_tracer.packageTracer.add("@nexim/sanitizer","1.1.3");var logger=(0,import_logger.createLogger)("@nexim/sanitizer");var unicodeDigits=new import_unicode_digits.UnicodeDigits("en");function sanitizeNumberToEnglish(number){if(typeof number==="number"){return number}if(typeof number==="string"){let str=number.trim();if(str===""){logger.incident?.("sanitizeNumberToEnglish","empty_string",{number});return null}str=unicodeDigits.translate(str);if(!(0,import_is_number.isNumber)(str)){logger.incident?.("sanitizeNumberToEnglish","not_a_number",{number});return null}return+str}logger.incident?.("sanitizeNumberToEnglish","invalid_input",{number});return null}function sanitizeNumberStringToEnglish(number){if(typeof number==="number"){return String(number)}if(typeof number==="string"){let str=number.trim();if(str===""){logger.incident?.("sanitizeNumberStringToEnglish","empty_string",{number});return null}str=unicodeDigits.translate(str);if(!(0,import_is_number.isNumber)(str)){logger.incident?.("sanitizeNumberStringToEnglish","not_a_number",{number});return null}return str}logger.incident?.("sanitizeNumberStringToEnglish","invalid_input",{number});return null}function sanitizePhoneNumber(input,countryCode="98"){if(input==null){logger.incident?.("sanitizePhoneNumber","undefined_or_null_input",{input});return null}const inputStr=typeof input==="string"?input.trim():String(input);if(inputStr===""){logger.incident?.("sanitizePhoneNumber","empty_input_string",{input});return null}const englishDigits=unicodeDigits.translate(inputStr);const withoutSpecialChars=englishDigits.replace(/[ )(-]+/g,"");const cleanNumber=withoutSpecialChars.replace(new RegExp(`^(\\+${countryCode}|${countryCode}|^0)`),"");const fullNumber=countryCode+cleanNumber;if(fullNumber.length!==countryCode.length+10||!(0,import_is_number.isNumber)(fullNumber)){logger.incident?.("sanitizePhoneNumber","invalid_full_number",{fullNumber});return null}return+fullNumber}
96
4
  //# sourceMappingURL=main.cjs.map
package/dist/main.cjs.map CHANGED
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
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;",
5
+ "mappings": ";;qqBAAA,4QAAyB,6BACzB,kBAA6B,0BAC7B,0BAA8B,kCAC9B,0BAA8B,kCAE9B,aAAc,oCAAc,IAAI,mBAAkB,OAAmB,EAErE,IAAM,UAAS,4BAAa,kBAAgB,EAC5C,IAAM,cAAgB,IAAI,oCAAc,IAAI,EAkBrC,SAAS,wBAAwB,OAAgC,CAGtE,GAAI,OAAO,SAAW,SAAU,CAC9B,OAAO,MACT,CAEA,GAAI,OAAO,SAAW,SAAU,CAC9B,IAAI,IAAM,OAAO,KAAK,EACtB,GAAI,MAAQ,GAAI,CACd,OAAO,WAAW,0BAA2B,eAAgB,CAAE,MAAO,CAAC,EACvE,OAAO,IACT,CAEA,IAAM,cAAc,UAAU,GAAG,EACjC,GAAI,IAAC,2BAAS,GAAG,EAAG,CAClB,OAAO,WAAW,0BAA2B,eAAgB,CAAE,MAAO,CAAC,EACvE,OAAO,IACT,CAEA,MAAO,CAAC,GACV,CAEA,OAAO,WAAW,0BAA2B,gBAAiB,CAAE,MAAO,CAAC,EACxE,OAAO,IACT,CAkBO,SAAS,8BAA8B,OAAgC,CAG5E,GAAI,OAAO,SAAW,SAAU,CAC9B,OAAO,OAAO,MAAM,CACtB,CAEA,GAAI,OAAO,SAAW,SAAU,CAC9B,IAAI,IAAM,OAAO,KAAK,EACtB,GAAI,MAAQ,GAAI,CACd,OAAO,WAAW,gCAAiC,eAAgB,CAAE,MAAO,CAAC,EAC7E,OAAO,IACT,CAEA,IAAM,cAAc,UAAU,GAAG,EACjC,GAAI,IAAC,2BAAS,GAAG,EAAG,CAClB,OAAO,WAAW,gCAAiC,eAAgB,CAAE,MAAO,CAAC,EAC7E,OAAO,IACT,CAEA,OAAO,GACT,CAEA,OAAO,WAAW,gCAAiC,gBAAiB,CAAE,MAAO,CAAC,EAC9E,OAAO,IACT,CAkBO,SAAS,oBAAoB,MAAgB,YAAc,KAAqB,CAGrF,GAAI,OAAS,KAAM,CACjB,OAAO,WAAW,sBAAuB,0BAA2B,CAAE,KAAM,CAAC,EAC7E,OAAO,IACT,CAEA,MAAM,SAAW,OAAO,QAAU,SAAW,MAAM,KAAK,EAAI,OAAO,KAAK,EAExE,GAAI,WAAa,GAAI,CACnB,OAAO,WAAW,sBAAuB,qBAAsB,CAAE,KAAM,CAAC,EACxE,OAAO,IACT,CAEA,MAAM,cAAgB,cAAc,UAAU,QAAQ,EACtD,MAAM,oBAAsB,cAAc,QAAQ,WAAY,EAAE,EAChE,MAAM,YAAc,oBAAoB,QAAQ,IAAI,OAAO,QAAQ,WAAW,IAAI,WAAW,MAAM,EAAG,EAAE,EACxG,MAAM,WAAa,YAAc,YAEjC,GAAI,WAAW,SAAW,YAAY,OAAS,IAAM,IAAC,2BAAS,UAAU,EAAG,CAC1E,OAAO,WAAW,sBAAuB,sBAAuB,CAAE,UAAW,CAAC,EAC9E,OAAO,IACT,CAEA,MAAO,CAAC,UACV",
6
6
  "names": []
7
7
  }
package/dist/main.mjs CHANGED
@@ -1,76 +1,4 @@
1
- /* @nexim/sanitizer v1.1.1 */
2
-
3
- // src/main.ts
4
- import { isNumber } from "@alwatr/is-number";
5
- import { createLogger } from "@alwatr/logger";
6
- import { packageTracer } from "@alwatr/package-tracer";
7
- import { UnicodeDigits } from "@alwatr/unicode-digits";
8
- __dev_mode__: packageTracer.add("@nexim/sanitizer", "1.1.1");
9
- var logger = createLogger("@nexim/sanitizer");
10
- var unicodeDigits = new UnicodeDigits("en");
11
- function sanitizeNumberToEnglish(number) {
12
- if (typeof number === "number") {
13
- return number;
14
- }
15
- if (typeof number === "string") {
16
- let str = number.trim();
17
- if (str === "") {
18
- logger.incident?.("sanitizeNumberToEnglish", "empty_string", { number });
19
- return null;
20
- }
21
- str = unicodeDigits.translate(str);
22
- if (!isNumber(str)) {
23
- logger.incident?.("sanitizeNumberToEnglish", "not_a_number", { number });
24
- return null;
25
- }
26
- return +str;
27
- }
28
- logger.incident?.("sanitizeNumberToEnglish", "invalid_input", { number });
29
- return null;
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
- }
51
- function sanitizePhoneNumber(input, countryCode = "98") {
52
- if (input == null) {
53
- logger.incident?.("sanitizePhoneNumber", "undefined_or_null_input", { input });
54
- return null;
55
- }
56
- const inputStr = typeof input === "string" ? input.trim() : String(input);
57
- if (inputStr === "") {
58
- logger.incident?.("sanitizePhoneNumber", "empty_input_string", { input });
59
- return null;
60
- }
61
- const englishDigits = unicodeDigits.translate(inputStr);
62
- const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, "");
63
- const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\+${countryCode}|${countryCode}|^0)`), "");
64
- const fullNumber = countryCode + cleanNumber;
65
- if (fullNumber.length !== countryCode.length + 10 || !isNumber(fullNumber)) {
66
- logger.incident?.("sanitizePhoneNumber", "invalid_full_number", { fullNumber });
67
- return null;
68
- }
69
- return +fullNumber;
70
- }
71
- export {
72
- sanitizeNumberStringToEnglish,
73
- sanitizeNumberToEnglish,
74
- sanitizePhoneNumber
75
- };
1
+ /** 📦 @nexim/sanitizer v1.1.3 */
2
+ __dev_mode__: console.debug("📦 @nexim/sanitizer v1.1.3");
3
+ import{isNumber}from"@alwatr/is-number";import{createLogger}from"@alwatr/logger";import{packageTracer}from"@alwatr/package-tracer";import{UnicodeDigits}from"@alwatr/unicode-digits";__dev_mode__:packageTracer.add("@nexim/sanitizer","1.1.3");var logger=createLogger("@nexim/sanitizer");var unicodeDigits=new UnicodeDigits("en");function sanitizeNumberToEnglish(number){if(typeof number==="number"){return number}if(typeof number==="string"){let str=number.trim();if(str===""){logger.incident?.("sanitizeNumberToEnglish","empty_string",{number});return null}str=unicodeDigits.translate(str);if(!isNumber(str)){logger.incident?.("sanitizeNumberToEnglish","not_a_number",{number});return null}return+str}logger.incident?.("sanitizeNumberToEnglish","invalid_input",{number});return null}function sanitizeNumberStringToEnglish(number){if(typeof number==="number"){return String(number)}if(typeof number==="string"){let str=number.trim();if(str===""){logger.incident?.("sanitizeNumberStringToEnglish","empty_string",{number});return null}str=unicodeDigits.translate(str);if(!isNumber(str)){logger.incident?.("sanitizeNumberStringToEnglish","not_a_number",{number});return null}return str}logger.incident?.("sanitizeNumberStringToEnglish","invalid_input",{number});return null}function sanitizePhoneNumber(input,countryCode="98"){if(input==null){logger.incident?.("sanitizePhoneNumber","undefined_or_null_input",{input});return null}const inputStr=typeof input==="string"?input.trim():String(input);if(inputStr===""){logger.incident?.("sanitizePhoneNumber","empty_input_string",{input});return null}const englishDigits=unicodeDigits.translate(inputStr);const withoutSpecialChars=englishDigits.replace(/[ )(-]+/g,"");const cleanNumber=withoutSpecialChars.replace(new RegExp(`^(\\+${countryCode}|${countryCode}|^0)`),"");const fullNumber=countryCode+cleanNumber;if(fullNumber.length!==countryCode.length+10||!isNumber(fullNumber)){logger.incident?.("sanitizePhoneNumber","invalid_full_number",{fullNumber});return null}return+fullNumber}export{sanitizeNumberStringToEnglish,sanitizeNumberToEnglish,sanitizePhoneNumber};
76
4
  //# sourceMappingURL=main.mjs.map
package/dist/main.mjs.map CHANGED
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
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;",
5
+ "mappings": ";;AAAA,OAAS,aAAgB,oBACzB,OAAS,iBAAoB,iBAC7B,OAAS,kBAAqB,yBAC9B,OAAS,kBAAqB,yBAE9B,aAAc,cAAc,IAAI,mBAAkB,OAAmB,EAErE,IAAM,OAAS,aAAa,kBAAgB,EAC5C,IAAM,cAAgB,IAAI,cAAc,IAAI,EAkBrC,SAAS,wBAAwB,OAAgC,CAGtE,GAAI,OAAO,SAAW,SAAU,CAC9B,OAAO,MACT,CAEA,GAAI,OAAO,SAAW,SAAU,CAC9B,IAAI,IAAM,OAAO,KAAK,EACtB,GAAI,MAAQ,GAAI,CACd,OAAO,WAAW,0BAA2B,eAAgB,CAAE,MAAO,CAAC,EACvE,OAAO,IACT,CAEA,IAAM,cAAc,UAAU,GAAG,EACjC,GAAI,CAAC,SAAS,GAAG,EAAG,CAClB,OAAO,WAAW,0BAA2B,eAAgB,CAAE,MAAO,CAAC,EACvE,OAAO,IACT,CAEA,MAAO,CAAC,GACV,CAEA,OAAO,WAAW,0BAA2B,gBAAiB,CAAE,MAAO,CAAC,EACxE,OAAO,IACT,CAkBO,SAAS,8BAA8B,OAAgC,CAG5E,GAAI,OAAO,SAAW,SAAU,CAC9B,OAAO,OAAO,MAAM,CACtB,CAEA,GAAI,OAAO,SAAW,SAAU,CAC9B,IAAI,IAAM,OAAO,KAAK,EACtB,GAAI,MAAQ,GAAI,CACd,OAAO,WAAW,gCAAiC,eAAgB,CAAE,MAAO,CAAC,EAC7E,OAAO,IACT,CAEA,IAAM,cAAc,UAAU,GAAG,EACjC,GAAI,CAAC,SAAS,GAAG,EAAG,CAClB,OAAO,WAAW,gCAAiC,eAAgB,CAAE,MAAO,CAAC,EAC7E,OAAO,IACT,CAEA,OAAO,GACT,CAEA,OAAO,WAAW,gCAAiC,gBAAiB,CAAE,MAAO,CAAC,EAC9E,OAAO,IACT,CAkBO,SAAS,oBAAoB,MAAgB,YAAc,KAAqB,CAGrF,GAAI,OAAS,KAAM,CACjB,OAAO,WAAW,sBAAuB,0BAA2B,CAAE,KAAM,CAAC,EAC7E,OAAO,IACT,CAEA,MAAM,SAAW,OAAO,QAAU,SAAW,MAAM,KAAK,EAAI,OAAO,KAAK,EAExE,GAAI,WAAa,GAAI,CACnB,OAAO,WAAW,sBAAuB,qBAAsB,CAAE,KAAM,CAAC,EACxE,OAAO,IACT,CAEA,MAAM,cAAgB,cAAc,UAAU,QAAQ,EACtD,MAAM,oBAAsB,cAAc,QAAQ,WAAY,EAAE,EAChE,MAAM,YAAc,oBAAoB,QAAQ,IAAI,OAAO,QAAQ,WAAW,IAAI,WAAW,MAAM,EAAG,EAAE,EACxG,MAAM,WAAa,YAAc,YAEjC,GAAI,WAAW,SAAW,YAAY,OAAS,IAAM,CAAC,SAAS,UAAU,EAAG,CAC1E,OAAO,WAAW,sBAAuB,sBAAuB,CAAE,UAAW,CAAC,EAC9E,OAAO,IACT,CAEA,MAAO,CAAC,UACV",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexim/sanitizer",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "A collection of sanitization utilities for phone numbers and numeric inputs with TypeScript type safety.",
5
5
  "keywords": [
6
6
  "sanitizer",
@@ -44,19 +44,19 @@
44
44
  "watch": "wireit"
45
45
  },
46
46
  "dependencies": {
47
- "@alwatr/is-number": "^5.7.0",
48
- "@alwatr/logger": "^5.5.3",
49
- "@alwatr/package-tracer": "^5.5.3",
50
- "@alwatr/unicode-digits": "^5.5.3"
47
+ "@alwatr/is-number": "^5.7.21",
48
+ "@alwatr/logger": "^5.6.2",
49
+ "@alwatr/package-tracer": "^5.5.23",
50
+ "@alwatr/unicode-digits": "^5.5.24"
51
51
  },
52
52
  "devDependencies": {
53
- "@alwatr/nano-build": "^5.5.3",
53
+ "@alwatr/nano-build": "^6.3.9",
54
54
  "@nexim/typescript-config": "^2.0.1",
55
55
  "ava": "^6.4.1",
56
- "typedoc": "^0.28.10",
57
- "typedoc-plugin-markdown": "^4.8.1",
56
+ "typedoc": "^0.28.14",
57
+ "typedoc-plugin-markdown": "^4.9.0",
58
58
  "typedoc-plugin-no-inherit": "^1.6.1",
59
- "typescript": "^5.9.2",
59
+ "typescript": "^5.9.3",
60
60
  "wireit": "^0.14.12"
61
61
  },
62
62
  "publishConfig": {
@@ -109,5 +109,5 @@
109
109
  "command": "typedoc"
110
110
  }
111
111
  },
112
- "gitHead": "e67fe3938015270ff3bb71c5d76334faebc4c142"
112
+ "gitHead": "aa1bbda5f949163da8a2e11e658afe02aad75458"
113
113
  }