persian-number-input 4.3.4 → 4.5.1

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 (45) hide show
  1. package/README.fa.md +231 -227
  2. package/README.md +198 -221
  3. package/dist/components/PersianNumberInput.d.ts +1 -1
  4. package/dist/components/PersianNumberInput.d.ts.map +1 -1
  5. package/dist/components/PersianNumberInput.js +22 -17
  6. package/dist/components/PersianNumberInput.js.map +1 -1
  7. package/dist/components/PersianNumberInput.test.js +24 -6
  8. package/dist/components/PersianNumberInput.test.js.map +1 -1
  9. package/dist/hooks/useCursorManager.d.ts +4 -0
  10. package/dist/hooks/useCursorManager.d.ts.map +1 -0
  11. package/dist/hooks/useCursorManager.js +19 -0
  12. package/dist/hooks/useCursorManager.js.map +1 -0
  13. package/dist/hooks/useNumberFormatter.d.ts +18 -0
  14. package/dist/hooks/useNumberFormatter.d.ts.map +1 -0
  15. package/dist/hooks/useNumberFormatter.js +29 -0
  16. package/dist/hooks/useNumberFormatter.js.map +1 -0
  17. package/dist/hooks/useNumberValidation.d.ts +11 -0
  18. package/dist/hooks/useNumberValidation.d.ts.map +1 -0
  19. package/dist/hooks/useNumberValidation.js +22 -0
  20. package/dist/hooks/useNumberValidation.js.map +1 -0
  21. package/dist/hooks/useNumericInputEvents.d.ts +18 -0
  22. package/dist/hooks/useNumericInputEvents.d.ts.map +1 -0
  23. package/dist/hooks/useNumericInputEvents.js +39 -0
  24. package/dist/hooks/useNumericInputEvents.js.map +1 -0
  25. package/dist/hooks/usePersianNumberInput.d.ts +7 -2
  26. package/dist/hooks/usePersianNumberInput.d.ts.map +1 -1
  27. package/dist/hooks/usePersianNumberInput.js +66 -63
  28. package/dist/hooks/usePersianNumberInput.js.map +1 -1
  29. package/dist/test-utils.d.ts +7 -0
  30. package/dist/test-utils.d.ts.map +1 -0
  31. package/dist/test-utils.js +27 -0
  32. package/dist/test-utils.js.map +1 -0
  33. package/dist/utils/digitUtils.d.ts +4 -0
  34. package/dist/utils/digitUtils.d.ts.map +1 -1
  35. package/dist/utils/digitUtils.js +44 -17
  36. package/dist/utils/digitUtils.js.map +1 -1
  37. package/dist/utils/keyFilter.d.ts +16 -0
  38. package/dist/utils/keyFilter.d.ts.map +1 -0
  39. package/dist/utils/keyFilter.js +31 -0
  40. package/dist/utils/keyFilter.js.map +1 -0
  41. package/dist/utils/validation.d.ts +22 -0
  42. package/dist/utils/validation.d.ts.map +1 -0
  43. package/dist/utils/validation.js +85 -0
  44. package/dist/utils/validation.js.map +1 -0
  45. package/package.json +15 -4
@@ -1,92 +1,95 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.usePersianNumberInput = void 0;
7
4
  const react_1 = require("react");
8
- const decimal_js_1 = __importDefault(require("decimal.js"));
9
5
  const transformNumber_1 = require("../utils/transformNumber");
10
6
  const digitUtils_1 = require("../utils/digitUtils");
7
+ const keyFilter_1 = require("../utils/keyFilter");
8
+ const useCursorManager_1 = require("./useCursorManager");
9
+ const useNumberFormatter_1 = require("./useNumberFormatter");
10
+ const useNumberValidation_1 = require("./useNumberValidation");
11
+ const useNumericInputEvents_1 = require("./useNumericInputEvents");
11
12
  const usePersianNumberInput = (props = {}) => {
12
- const { initialValue, separatorCount = 3, separatorChar = ",", decimalChar, suffix, locale = "fa", showZero = false, onValueChange, min, max, maxDecimals, onBlur: externalOnBlur, } = props;
13
+ const { initialValue, separatorCount = 3, separatorChar = ",", decimalChar, suffix, locale = "fa", showZero = false, onValueChange, min, max, maxDecimals, onChange: externalOnChange, onBlur: externalOnBlur, onKeyDown: externalOnKeyDown, onPaste: externalOnPaste, } = props;
13
14
  const [rawValue, setRawValue] = (0, react_1.useState)(() => (0, digitUtils_1.sanitizeNumericInput)(initialValue, maxDecimals, decimalChar));
15
+ const [isInvalid, setIsInvalid] = (0, react_1.useState)(false);
16
+ (0, react_1.useEffect)(() => {
17
+ setRawValue((0, digitUtils_1.sanitizeNumericInput)(initialValue, maxDecimals, decimalChar));
18
+ setIsInvalid(false);
19
+ }, [initialValue, maxDecimals, decimalChar]);
14
20
  const inputRef = (0, react_1.useRef)(null);
15
- const selectionRef = (0, react_1.useRef)(null);
16
- (0, react_1.useLayoutEffect)(() => {
17
- if (inputRef.current && selectionRef.current !== null) {
18
- inputRef.current.setSelectionRange(selectionRef.current, selectionRef.current);
19
- }
21
+ const rawValueLen = rawValue ? rawValue.length : 0;
22
+ const { setCursor } = (0, useCursorManager_1.useCursorManager)(inputRef, rawValueLen);
23
+ const { displayValue, transformOpts } = (0, useNumberFormatter_1.useNumberFormatter)(rawValue ?? "", {
24
+ separatorCount,
25
+ separatorChar,
26
+ decimalChar,
27
+ suffix,
28
+ locale,
29
+ showZero,
30
+ maxDecimals,
31
+ });
32
+ const { validateOnChange, validateOnBlur } = (0, useNumberValidation_1.useNumberValidation)({
33
+ min,
34
+ max,
20
35
  });
21
36
  const updateValue = (0, react_1.useCallback)((nextRaw) => {
22
- if (nextRaw !== "" && nextRaw !== ".") {
23
- try {
24
- const num = new decimal_js_1.default(nextRaw);
25
- if (max !== undefined && num.gt(max))
26
- return;
27
- }
28
- catch (_a) {
29
- return;
30
- }
31
- }
37
+ const valid = validateOnChange(nextRaw);
38
+ setIsInvalid(!valid);
32
39
  setRawValue(nextRaw);
33
- onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(nextRaw);
34
- }, [max, onValueChange]);
40
+ if (valid) {
41
+ onValueChange?.(nextRaw);
42
+ }
43
+ }, [validateOnChange, onValueChange]);
44
+ const keyFilter = (0, keyFilter_1.createNumericKeyFilter)();
45
+ const { onKeyDown, onPaste } = (0, useNumericInputEvents_1.useNumericInputEvents)({
46
+ keyFilter,
47
+ suffix,
48
+ rawValue: rawValue ?? "",
49
+ maxDecimals,
50
+ decimalChar,
51
+ updateValue,
52
+ onKeyDown: externalOnKeyDown,
53
+ onPaste: externalOnPaste,
54
+ });
35
55
  const onChange = (event) => {
36
56
  const input = event.target;
37
57
  const value = input.value;
38
58
  const sanitized = (0, digitUtils_1.sanitizeNumericInput)(value, maxDecimals, decimalChar);
39
- const prevFormatted = (0, transformNumber_1.transformNumber)(rawValue, {
40
- separatorCount,
41
- separatorChar,
42
- decimalChar,
43
- suffix,
44
- locale,
45
- showZero,
46
- });
47
- const nextFormatted = (0, transformNumber_1.transformNumber)(sanitized, {
48
- separatorCount,
49
- separatorChar,
50
- decimalChar,
51
- suffix,
52
- locale,
53
- showZero,
54
- });
55
- let cursor = input.selectionStart || 0;
56
- const diff = nextFormatted.length - prevFormatted.length;
57
- selectionRef.current = cursor + diff;
58
- updateValue(sanitized);
59
+ if (sanitized !== rawValue) {
60
+ const valid = validateOnChange(sanitized);
61
+ setIsInvalid(!valid);
62
+ const prevFormatted = (0, transformNumber_1.transformNumber)(rawValue, transformOpts);
63
+ const nextFormatted = (0, transformNumber_1.transformNumber)(sanitized, transformOpts);
64
+ let cursor = input.selectionStart || 0;
65
+ const diff = nextFormatted.length - prevFormatted.length;
66
+ setCursor(cursor + diff);
67
+ setRawValue(sanitized);
68
+ if (valid) {
69
+ onValueChange?.(sanitized);
70
+ }
71
+ }
72
+ externalOnChange?.(event);
59
73
  };
60
74
  const onBlur = (0, react_1.useCallback)((event) => {
61
- if (rawValue && rawValue !== ".") {
62
- try {
63
- const num = new decimal_js_1.default(rawValue);
64
- if (min !== undefined && num.lt(min)) {
65
- const minStr = String(min);
66
- setRawValue(minStr);
67
- onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(minStr);
68
- }
69
- }
70
- catch (_a) { }
75
+ const result = validateOnBlur(rawValue ?? "");
76
+ if (!result.valid && result.correctedValue !== undefined) {
77
+ setRawValue(result.correctedValue);
78
+ onValueChange?.(result.correctedValue);
71
79
  }
72
- externalOnBlur === null || externalOnBlur === void 0 ? void 0 : externalOnBlur(event);
73
- }, [rawValue, min, onValueChange, externalOnBlur]);
74
- const displayValue = (0, transformNumber_1.transformNumber)(rawValue, {
75
- separatorCount,
76
- separatorChar,
77
- decimalChar,
78
- suffix,
79
- locale,
80
- showZero,
81
- maxDecimals,
82
- });
80
+ setIsInvalid(false);
81
+ externalOnBlur?.(event);
82
+ }, [rawValue, validateOnBlur, onValueChange, externalOnBlur]);
83
83
  return {
84
84
  value: displayValue,
85
85
  onChange,
86
+ onKeyDown,
87
+ onPaste,
86
88
  onBlur,
87
89
  rawValue,
88
90
  inputRef,
89
91
  setRawValue: updateValue,
92
+ isInvalid,
90
93
  };
91
94
  };
92
95
  exports.usePersianNumberInput = usePersianNumberInput;
@@ -1 +1 @@
1
- {"version":3,"file":"usePersianNumberInput.js","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usePersianNumberInput.js","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ChangeEvent, FocusEvent } from "react";
2
+ export declare function createChangeEvent(overrides?: {
3
+ value?: string;
4
+ selectionStart?: number;
5
+ }): ChangeEvent<HTMLInputElement>;
6
+ export declare function createFocusEvent(): FocusEvent<HTMLInputElement>;
7
+ //# sourceMappingURL=test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAErD,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,WAAW,CAAC,gBAAgB,CAAC,CAa/B;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAQ/D"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createChangeEvent = createChangeEvent;
4
+ exports.createFocusEvent = createFocusEvent;
5
+ function createChangeEvent(overrides = {}) {
6
+ const value = overrides.value ?? "";
7
+ const target = {
8
+ value,
9
+ selectionStart: overrides.selectionStart ?? value.length,
10
+ };
11
+ return {
12
+ target,
13
+ currentTarget: target,
14
+ bubbles: true,
15
+ cancelable: true,
16
+ };
17
+ }
18
+ function createFocusEvent() {
19
+ const target = {};
20
+ return {
21
+ target,
22
+ currentTarget: target,
23
+ bubbles: true,
24
+ cancelable: true,
25
+ };
26
+ }
27
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":";;AAEA,8CAeC;AAED,4CAQC;AAzBD,SAAgB,iBAAiB,CAC/B,YAAyD,EAAE;IAE3D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG;QACb,KAAK;QACL,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,KAAK,CAAC,MAAM;KACrC,CAAC;IAEtB,OAAO;QACL,MAAM;QACN,aAAa,EAAE,MAAM;QACrB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;KAC2B,CAAC;AAChD,CAAC;AAED,SAAgB,gBAAgB;IAC9B,MAAM,MAAM,GAAG,EAAsB,CAAC;IACtC,OAAO;QACL,MAAM;QACN,aAAa,EAAE,MAAM;QACrB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;KAC0B,CAAC;AAC/C,CAAC"}
@@ -5,6 +5,10 @@ export declare const convertToEnglishDigits: (str: string, decimalChar?: string)
5
5
  export declare const toLocalizedDigits: (numStr: string, locale: string) => string;
6
6
  export declare const localizeDecimalSeparator: (numStr: string, locale: string, customDecimalChar?: string) => string;
7
7
  export declare const groupDigits: (numStr: string, separatorCount: number, separatorChar?: string) => string;
8
+ export declare const stripNonNumeric: (str: string) => string;
9
+ export declare const normalizeDecimals: (str: string) => string;
10
+ export declare const stripLeadingZeros: (str: string) => string;
11
+ export declare const applyDecimalPrecision: (str: string, maxDecimals?: number) => string;
8
12
  export declare const sanitizeNumericInput: (value: string | number | null | undefined, maxDecimals?: number, decimalChar?: string) => string;
9
13
  export declare const roundToDecimals: (value: string, maxDecimals?: number) => string;
10
14
  //# sourceMappingURL=digitUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"digitUtils.d.ts","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAG9C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGtD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,cAAc,MAAM,KAAG,MAWnE,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAbE,MAAM,gBAAgB,MAAM,KAAG,MAaf,CAAC;AAEtD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,MAIlE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,oBAAoB,MAAM,KACzB,MAIF,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,gBAAgB,MAAM,EACtB,sBAAmB,KAClB,MAIF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,cAAc,MAAM,EACpB,cAAc,MAAM,KACnB,MA0BF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,OAAO,MAAM,EACb,cAAc,MAAM,KACnB,MAIF,CAAC"}
1
+ {"version":3,"file":"digitUtils.d.ts","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAG9C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGtD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,cAAc,MAAM,KAAG,MAWnE,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAbE,MAAM,gBAAgB,MAAM,KAAG,MAaf,CAAC;AAEtD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,MAIlE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,oBAAoB,MAAM,KACzB,MAIF,CAAC;AAIF,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,EACd,gBAAgB,MAAM,EACtB,sBAAmB,KAClB,MASF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MACjB,CAAC;AAE9B,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,MAO/C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,MACV,CAAC;AAEvC,eAAO,MAAM,qBAAqB,GAChC,KAAK,MAAM,EACX,cAAc,MAAM,KACnB,MAMF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,cAAc,MAAM,EACpB,cAAc,MAAM,KACnB,MA2BF,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,OAAO,MAAM,EACb,cAAc,MAAM,KACnB,MAIF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.roundToDecimals = exports.sanitizeNumericInput = exports.groupDigits = exports.localizeDecimalSeparator = exports.toLocalizedDigits = exports.convertToEnglishDigits = exports.toEnglishDigits = exports.decimalSeparatorMap = exports.digitsMap = void 0;
3
+ exports.roundToDecimals = exports.sanitizeNumericInput = exports.applyDecimalPrecision = exports.stripLeadingZeros = exports.normalizeDecimals = exports.stripNonNumeric = exports.groupDigits = exports.localizeDecimalSeparator = exports.toLocalizedDigits = exports.convertToEnglishDigits = exports.toEnglishDigits = exports.decimalSeparatorMap = exports.digitsMap = void 0;
4
4
  const LOCAL_DIGITS_MAP = {
5
5
  "۰": "0",
6
6
  "۱": "1",
@@ -36,7 +36,7 @@ exports.decimalSeparatorMap = {
36
36
  const toEnglishDigits = (str, decimalChar) => {
37
37
  let result = str.replace(/[۰-۹٠-٩٫\/]/g, (match) => LOCAL_DIGITS_MAP[match] || match);
38
38
  if (decimalChar && decimalChar !== "." && result.includes(decimalChar)) {
39
- result = result.split(decimalChar).join(".");
39
+ result = result.replaceAll(decimalChar, ".");
40
40
  }
41
41
  return result;
42
42
  };
@@ -55,32 +55,59 @@ const localizeDecimalSeparator = (numStr, locale, customDecimalChar) => {
55
55
  return numStr.replace(".", separator);
56
56
  };
57
57
  exports.localizeDecimalSeparator = localizeDecimalSeparator;
58
+ const groupDigitsRegexCache = new Map();
58
59
  const groupDigits = (numStr, separatorCount, separatorChar = ",") => {
59
60
  if (!numStr || separatorCount <= 0)
60
61
  return numStr;
61
- const regex = new RegExp(`\\B(?=(\\d{${separatorCount}})+(?!\\d))`, "g");
62
+ const cacheKey = `${separatorCount}:${separatorChar}`;
63
+ let regex = groupDigitsRegexCache.get(cacheKey);
64
+ if (!regex) {
65
+ regex = new RegExp(`\\B(?=(\\d{${separatorCount}})+(?!\\d))`, "g");
66
+ groupDigitsRegexCache.set(cacheKey, regex);
67
+ }
62
68
  return numStr.replace(regex, separatorChar);
63
69
  };
64
70
  exports.groupDigits = groupDigits;
71
+ const stripNonNumeric = (str) => str.replace(/[^0-9.]/g, "");
72
+ exports.stripNonNumeric = stripNonNumeric;
73
+ const normalizeDecimals = (str) => {
74
+ const firstDot = str.indexOf(".");
75
+ if (firstDot !== -1) {
76
+ const secondDot = str.indexOf(".", firstDot + 1);
77
+ if (secondDot !== -1)
78
+ str = str.slice(0, secondDot);
79
+ }
80
+ return str;
81
+ };
82
+ exports.normalizeDecimals = normalizeDecimals;
83
+ const stripLeadingZeros = (str) => str.replace(/^(-?)0+(?!$|\.)/, "$1");
84
+ exports.stripLeadingZeros = stripLeadingZeros;
85
+ const applyDecimalPrecision = (str, maxDecimals) => {
86
+ if (!str.includes(".") || maxDecimals === undefined)
87
+ return str;
88
+ const [intPart, fracPart] = str.split(".");
89
+ const truncatedFrac = maxDecimals > 0 ? fracPart.slice(0, maxDecimals) : "";
90
+ return truncatedFrac ? `${intPart}.${truncatedFrac}` : intPart;
91
+ };
92
+ exports.applyDecimalPrecision = applyDecimalPrecision;
65
93
  const sanitizeNumericInput = (value, maxDecimals, decimalChar) => {
66
94
  if (value === null || value === undefined)
67
95
  return "";
68
96
  let str = (0, exports.toEnglishDigits)(String(value), decimalChar);
69
- str = str.replace(/[^0-9.]/g, "");
70
- const parts = str.split(".");
71
- if (parts.length > 2) {
72
- str = parts[0] + "." + parts.slice(1).join("");
97
+ const isNegative = str.startsWith("-");
98
+ str = (0, exports.stripNonNumeric)(str);
99
+ str = (0, exports.normalizeDecimals)(str);
100
+ if (isNegative && str) {
101
+ str = "-" + str;
102
+ }
103
+ str = (0, exports.stripLeadingZeros)(str);
104
+ if (str.includes(".") && maxDecimals !== undefined) {
105
+ str = (0, exports.applyDecimalPrecision)(str, maxDecimals);
73
106
  }
74
- str = str.replace(/^0+(?!$|\.)/, "");
75
- if (str.includes(".")) {
76
- const [intPart, fracPart] = str.split(".");
77
- if (maxDecimals !== undefined) {
78
- const truncatedFrac = maxDecimals > 0 ? fracPart.slice(0, maxDecimals) : "";
79
- str = truncatedFrac ? `${intPart}.${truncatedFrac}` : intPart;
80
- if (maxDecimals > 0 && String(value).endsWith(decimalChar || ".")) {
81
- str = str.includes(".") ? str : `${str}.`;
82
- }
83
- }
107
+ if (maxDecimals !== undefined &&
108
+ maxDecimals > 0 &&
109
+ String(value).endsWith(decimalChar || ".")) {
110
+ str = str.includes(".") ? str : `${str}.`;
84
111
  }
85
112
  return str;
86
113
  };
@@ -1 +1 @@
1
- {"version":3,"file":"digitUtils.js","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"digitUtils.js","sourceRoot":"","sources":["../../src/utils/digitUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface KeyFilterEvent {
2
+ key: string;
3
+ ctrlKey: boolean;
4
+ metaKey: boolean;
5
+ altKey: boolean;
6
+ }
7
+ export interface KeyFilterRule {
8
+ pattern?: RegExp;
9
+ key?: string;
10
+ description?: string;
11
+ }
12
+ export type KeyFilter = (e: KeyFilterEvent) => boolean;
13
+ export declare const createKeyFilter: (rules: KeyFilterRule[]) => KeyFilter;
14
+ export declare const DEFAULT_NUMERIC_RULES: KeyFilterRule[];
15
+ export declare const createNumericKeyFilter: (extraRules?: KeyFilterRule[]) => KeyFilter;
16
+ //# sourceMappingURL=keyFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyFilter.d.ts","sourceRoot":"","sources":["../../src/utils/keyFilter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC;AAEvD,eAAO,MAAM,eAAe,GAAI,OAAO,aAAa,EAAE,KAAG,SASxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAAa,EAUhD,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,aAAY,aAAa,EAAO,KAC/B,SACyD,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNumericKeyFilter = exports.DEFAULT_NUMERIC_RULES = exports.createKeyFilter = void 0;
4
+ const createKeyFilter = (rules) => {
5
+ return (e) => {
6
+ if (e.ctrlKey || e.metaKey || e.altKey)
7
+ return true;
8
+ for (const rule of rules) {
9
+ if (rule.key && e.key === rule.key)
10
+ return true;
11
+ if (rule.pattern?.test(e.key))
12
+ return true;
13
+ }
14
+ return false;
15
+ };
16
+ };
17
+ exports.createKeyFilter = createKeyFilter;
18
+ exports.DEFAULT_NUMERIC_RULES = [
19
+ { key: "Backspace" },
20
+ { key: "Delete" },
21
+ { key: "Tab" },
22
+ { key: "Enter" },
23
+ { key: "Home" },
24
+ { key: "End" },
25
+ { pattern: /^Arrow/ },
26
+ { pattern: /^[0-9.\-]$/ },
27
+ { pattern: /^[\u0660-\u0669\u06F0-\u06F9]$/ },
28
+ ];
29
+ const createNumericKeyFilter = (extraRules = []) => (0, exports.createKeyFilter)([...exports.DEFAULT_NUMERIC_RULES, ...extraRules]);
30
+ exports.createNumericKeyFilter = createNumericKeyFilter;
31
+ //# sourceMappingURL=keyFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyFilter.js","sourceRoot":"","sources":["../../src/utils/keyFilter.ts"],"names":[],"mappings":";;;AAeO,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAa,EAAE;IACnE,OAAO,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YAChD,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,eAAe,mBAS1B;AAEW,QAAA,qBAAqB,GAAoB;IACpD,EAAE,GAAG,EAAE,WAAW,EAAE;IACpB,EAAE,GAAG,EAAE,QAAQ,EAAE;IACjB,EAAE,GAAG,EAAE,KAAK,EAAE;IACd,EAAE,GAAG,EAAE,OAAO,EAAE;IAChB,EAAE,GAAG,EAAE,MAAM,EAAE;IACf,EAAE,GAAG,EAAE,KAAK,EAAE;IACd,EAAE,OAAO,EAAE,QAAQ,EAAE;IACrB,EAAE,OAAO,EAAE,YAAY,EAAE;IACzB,EAAE,OAAO,EAAE,gCAAgC,EAAE;CAC9C,CAAC;AAEK,MAAM,sBAAsB,GAAG,CACpC,aAA8B,EAAE,EACrB,EAAE,CACb,IAAA,uBAAe,EAAC,CAAC,GAAG,6BAAqB,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;AAHhD,QAAA,sBAAsB,0BAG0B"}
@@ -0,0 +1,22 @@
1
+ export declare enum ValidationTiming {
2
+ OnChange = "onChange",
3
+ OnBlur = "onBlur"
4
+ }
5
+ export interface ValidationContext {
6
+ min?: number;
7
+ max?: number;
8
+ }
9
+ export interface ValidationResult {
10
+ valid: boolean;
11
+ correctedValue?: string;
12
+ }
13
+ export interface ValidationRule {
14
+ timing: ValidationTiming;
15
+ validate: (rawValue: string, context: ValidationContext) => ValidationResult;
16
+ }
17
+ export declare const createMaxRule: (max?: number, timing?: ValidationTiming) => ValidationRule;
18
+ export declare const createMinRule: (min?: number) => ValidationRule;
19
+ export declare const createValidationEngine: (rules: ValidationRule[]) => {
20
+ validate: (timing: ValidationTiming, rawValue: string) => ValidationResult;
21
+ };
22
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC1B,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,CACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,KACvB,gBAAgB,CAAC;CACvB;AAqCD,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EACZ,SAAQ,gBAA4C,KACnD,cAeD,CAAC;AAEH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,cAY3C,CAAC;AAEH,eAAO,MAAM,sBAAsB,GAAI,OAAO,cAAc,EAAE;uBACzC,gBAAgB,YAAY,MAAM,KAAG,gBAAgB;CASxE,CAAC"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createValidationEngine = exports.createMinRule = exports.createMaxRule = exports.ValidationTiming = void 0;
4
+ var ValidationTiming;
5
+ (function (ValidationTiming) {
6
+ ValidationTiming["OnChange"] = "onChange";
7
+ ValidationTiming["OnBlur"] = "onBlur";
8
+ })(ValidationTiming || (exports.ValidationTiming = ValidationTiming = {}));
9
+ function compareNumericStrings(a, b) {
10
+ const aNeg = a.startsWith("-");
11
+ const bNeg = b.startsWith("-");
12
+ if (aNeg && !bNeg)
13
+ return -1;
14
+ if (!aNeg && bNeg)
15
+ return 1;
16
+ const absA = aNeg ? a.slice(1) : a;
17
+ const absB = bNeg ? b.slice(1) : b;
18
+ const [aInt = "0", aFrac = ""] = absA.split(".");
19
+ const [bInt = "0", bFrac = ""] = absB.split(".");
20
+ if (aInt.length !== bInt.length) {
21
+ const cmp = aInt.length < bInt.length ? -1 : 1;
22
+ return aNeg ? -cmp : cmp;
23
+ }
24
+ for (let i = 0; i < aInt.length; i++) {
25
+ if (aInt[i] < bInt[i])
26
+ return aNeg ? 1 : -1;
27
+ if (aInt[i] > bInt[i])
28
+ return aNeg ? -1 : 1;
29
+ }
30
+ const maxFracLen = Math.max(aFrac.length, bFrac.length);
31
+ const paddedA = aFrac.padEnd(maxFracLen, "0");
32
+ const paddedB = bFrac.padEnd(maxFracLen, "0");
33
+ for (let i = 0; i < maxFracLen; i++) {
34
+ if (paddedA[i] < paddedB[i])
35
+ return aNeg ? 1 : -1;
36
+ if (paddedA[i] > paddedB[i])
37
+ return aNeg ? -1 : 1;
38
+ }
39
+ return 0;
40
+ }
41
+ const createMaxRule = (max, timing = ValidationTiming.OnChange) => ({
42
+ timing,
43
+ validate: (rawValue) => {
44
+ if (rawValue === "" || rawValue === "." || max === undefined) {
45
+ return { valid: true };
46
+ }
47
+ const maxStr = String(max);
48
+ if (compareNumericStrings(rawValue, maxStr) > 0) {
49
+ if (timing === ValidationTiming.OnBlur) {
50
+ return { valid: false, correctedValue: maxStr };
51
+ }
52
+ return { valid: false };
53
+ }
54
+ return { valid: true };
55
+ },
56
+ });
57
+ exports.createMaxRule = createMaxRule;
58
+ const createMinRule = (min) => ({
59
+ timing: ValidationTiming.OnBlur,
60
+ validate: (rawValue) => {
61
+ if (!rawValue || rawValue === "." || min === undefined) {
62
+ return { valid: true };
63
+ }
64
+ const minStr = String(min);
65
+ if (compareNumericStrings(rawValue, minStr) < 0) {
66
+ return { valid: false, correctedValue: minStr };
67
+ }
68
+ return { valid: true };
69
+ },
70
+ });
71
+ exports.createMinRule = createMinRule;
72
+ const createValidationEngine = (rules) => ({
73
+ validate: (timing, rawValue) => {
74
+ for (const rule of rules) {
75
+ if (rule.timing === timing) {
76
+ const result = rule.validate(rawValue, {});
77
+ if (!result.valid)
78
+ return result;
79
+ }
80
+ }
81
+ return { valid: true };
82
+ },
83
+ });
84
+ exports.createValidationEngine = createValidationEngine;
85
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":";;;AAAA,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,yCAAqB,CAAA;IACrB,qCAAiB,CAAA;AACnB,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAoBD,SAAS,qBAAqB,CAAC,CAAS,EAAE,CAAS;IACjD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAEM,MAAM,aAAa,GAAG,CAC3B,GAAY,EACZ,SAA2B,gBAAgB,CAAC,QAAQ,EACpC,EAAE,CAAC,CAAC;IACpB,MAAM;IACN,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;QAC7B,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,GAAG,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBACvC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;YAClD,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;CACF,CAAC,CAAC;AAlBU,QAAA,aAAa,iBAkBvB;AAEI,MAAM,aAAa,GAAG,CAAC,GAAY,EAAkB,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,gBAAgB,CAAC,MAAM;IAC/B,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;QAC7B,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACvD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;CACF,CAAC,CAAC;AAZU,QAAA,aAAa,iBAYvB;AAEI,MAAM,sBAAsB,GAAG,CAAC,KAAuB,EAAE,EAAE,CAAC,CAAC;IAClE,QAAQ,EAAE,CAAC,MAAwB,EAAE,QAAgB,EAAoB,EAAE;QACzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,KAAK;oBAAE,OAAO,MAAM,CAAC;YACnC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;CACF,CAAC,CAAC;AAVU,QAAA,sBAAsB,0BAUhC"}
package/package.json CHANGED
@@ -1,11 +1,24 @@
1
1
  {
2
2
  "name": "persian-number-input",
3
- "version": "4.3.4",
3
+ "version": "4.5.1",
4
4
  "description": "React component for Persian, Indic, or English localized number input with customizable digit grouping",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "typings": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
9
22
  "sideEffects": false,
10
23
  "files": [
11
24
  "dist"
@@ -48,7 +61,5 @@
48
61
  "typescript": "^5.9.3",
49
62
  "vitest": "^4.1.6"
50
63
  },
51
- "dependencies": {
52
- "decimal.js": "^10.6.0"
53
- }
64
+ "dependencies": {}
54
65
  }