smart-auth-validator 1.2.1 → 1.3.2
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/LICENSE +21 -21
- package/README.md +59 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Muhammad Burhan Chughtai
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Muhammad Burhan Chughtai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
# smart-auth-validator
|
|
2
|
-
Smart, type-safe, zero-regex validation middleware for Node.js backends. Supports Fastify and Express out-of-the-box. Provides standard rules for email, password, name, phone, and more. Built for backend developers to avoid repetitive validation logic.
|
|
3
|
-
|
|
4
|
-
# Smart Auth Validator
|
|
5
|
-
|
|
6
|
-
[](https://www.npmjs.com/package/smart-auth-validator)
|
|
7
|
-
[](https://opensource.org/licenses/ISC)
|
|
8
|
-
|
|
9
|
-
**Smart Auth Validator** is a **type-safe, zero-regex authentication and form validation library** for **Fastify** and **Express**. It provides a **standardized, reusable validation system** for backend forms like registration, login, and profile updates without writing repetitive regex or validation logic.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Features
|
|
14
|
-
|
|
15
|
-
- Type-safe validation with **TypeScript**
|
|
16
|
-
- Supports **Fastify** and **Express** out of the box
|
|
17
|
-
- Standard rules for common fields: `email`, `password`, `name`, `phone`, etc.
|
|
18
|
-
- Returns structured **errors** for each field
|
|
19
|
-
- Minimal and lightweight
|
|
20
|
-
- Easy to extend with custom rules
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Installation
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
npm install smart-auth-validator
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Supported Fields
|
|
31
|
-
The library currently supports a wide array of built-in validation rules. You can validate these fields by simply passing their keys:
|
|
32
|
-
|
|
33
|
-
Category: Supported Fields
|
|
34
|
-
Identity "name, username, email, password"
|
|
35
|
-
Contact "phone, url"
|
|
36
|
-
Address "street, city, state, postalCode"
|
|
37
|
-
Finance "creditCard, cvv"
|
|
38
|
-
General "date, time, active (boolean)"
|
|
39
|
-
|
|
40
|
-
Simple Usage
|
|
41
|
-
To use Smart Auth Validator, simply define a schema with the fields you want to validate and pass your input data to the validate function.
|
|
42
|
-
|
|
43
|
-
Basic 3-Field Example
|
|
44
|
-
Even though the library supports 10+ fields, you can choose only the ones you need:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
1
|
+
# smart-auth-validator
|
|
2
|
+
Smart, type-safe, zero-regex validation middleware for Node.js backends. Supports Fastify and Express out-of-the-box. Provides standard rules for email, password, name, phone, and more. Built for backend developers to avoid repetitive validation logic.
|
|
3
|
+
|
|
4
|
+
# Smart Auth Validator
|
|
5
|
+
|
|
6
|
+
[](https://www.npmjs.com/package/smart-auth-validator)
|
|
7
|
+
[](https://opensource.org/licenses/ISC)
|
|
8
|
+
|
|
9
|
+
**Smart Auth Validator** is a **type-safe, zero-regex authentication and form validation library** for **Fastify** and **Express**. It provides a **standardized, reusable validation system** for backend forms like registration, login, and profile updates without writing repetitive regex or validation logic.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- Type-safe validation with **TypeScript**
|
|
16
|
+
- Supports **Fastify** and **Express** out of the box
|
|
17
|
+
- Standard rules for common fields: `email`, `password`, `name`, `phone`, etc.
|
|
18
|
+
- Returns structured **errors** for each field
|
|
19
|
+
- Minimal and lightweight
|
|
20
|
+
- Easy to extend with custom rules
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
bash
|
|
27
|
+
npm install smart-auth-validator
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Supported Fields
|
|
31
|
+
The library currently supports a wide array of built-in validation rules. You can validate these fields by simply passing their keys:
|
|
32
|
+
|
|
33
|
+
Category: Supported Fields
|
|
34
|
+
Identity "name, username, email, password"
|
|
35
|
+
Contact "phone, url"
|
|
36
|
+
Address "street, city, state, postalCode"
|
|
37
|
+
Finance "creditCard, cvv"
|
|
38
|
+
General "date, time, active (boolean)"
|
|
39
|
+
|
|
40
|
+
Simple Usage
|
|
41
|
+
To use Smart Auth Validator, simply define a schema with the fields you want to validate and pass your input data to the validate function.
|
|
42
|
+
|
|
43
|
+
Basic 3-Field Example
|
|
44
|
+
Even though the library supports 10+ fields, you can choose only the ones you need:
|
|
45
|
+

|
|
46
|
+
Error Response Format
|
|
47
|
+
If validation fails, you get a clean array explaining exactly what went wrong:
|
|
48
|
+
|
|
49
|
+
REQUIRED: Field is missing.
|
|
50
|
+
|
|
51
|
+
PATTERN: Invalid format (e.g., bad email).
|
|
52
|
+
|
|
53
|
+
MIN_LENGTH: Input is too short.
|
|
54
|
+
|
|
55
|
+
WEAK_PASSWORD: Password doesn't meet security standards.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
[](#link)
|
|
59
|
+
[](#link)
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/imageRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/constants/image.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":";;;AAEO,IAAM,YAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,+CAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,wCAAA;AAAA,IACZ,UAAA,EAAY,uCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,SAAA,GAAuB;AAAA,EAClC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,4BAAA;AAAA,EACP,SAAA,EAAW,CAAC,KAAA,KAAmB;AAC7B,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GACpB,MAAM,IAAA,EAAK,CAAE,aAAY,GACzB,KAAA;AAAA,EACN,CAAA;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,mCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACbO,IAAM,QAAA,GAAsB;AAAA,EACjC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,iBAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACT,QAAA,EAAU,kBAAA;AAAA,IACV,UAAA,EAAY,oCAAA;AAAA,IACZ,UAAA,EAAY,kCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,SAAA,GAAuB;AAAA,EAClC,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,0BAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,OAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,IAAA;AAAA;AAAA,EACL,KAAA,EAAO,0EAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,iBAAA;AAAA,IACV,UAAA,EAAY,iBAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,cAAA,GAA4B;AAAA,EACvC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,wBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,yBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACPO,IAAM,QAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,cAAA,GAA4B;AAAA,EACvC,KAAA,EAAO,aAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,gCAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,OAAA,GAAqB;AAAA,EAChC,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,iBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,SAAA,GAAuB;AAAA,EAClC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,eAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,mCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,QAAA,GAAsB;AAAA,EACjC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,eAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,UAAA,EAAY,kCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,UAAA,GAAwB;AAAA,EACnC,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,4BAAA;AAAA,IACV,UAAA,EAAY,qCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,YAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,iBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,wCAAA;AAAA,IACZ,UAAA,EAAY,sCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,QAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,6BAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,WAAA,GAAyB;AAAA,EACpC,KAAA,EAAO,gBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,SAAA,GAAuB;AAAA,EAClC,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,aAAA,EAAe,uBAAA;AAAA,IACf,eAAA,EAAiB,0BAAA;AAAA,IACjB,sBAAA,EAAwB;AAAA;AAE5B,CAAA;;;ACSO,IAAM,KAAA,GAAmC;AAAA,EAC9C,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,YAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,OAAA;AAAA,EACL,UAAA,EAAY,cAAA;AAAA,EACZ,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY,cAAA;AAAA,EACZ,GAAA,EAAK,OAAA;AAAA,EACL,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;;;ACjCO,IAAM,cAAA,GAGT;AAAA,EACF,QAAA,EAAU,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,CAAA,YAAA,CAAA;AAAA,EAE7B,cAAc,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,oBAAoB,KAAK,CAAA,CAAA;AAAA,EAE1D,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAClB,GAAG,KAAK,CAAA,kBAAA,EAAqB,MAAM,GAAG,CAAA,WAAA,CAAA;AAAA,EAExC,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAClB,GAAG,KAAK,CAAA,iBAAA,EAAoB,MAAM,GAAG,CAAA,WAAA,CAAA;AAAA,EAEvC,OAAA,EAAS,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,CAAA,kBAAA,CAAA;AAAA,EAE5B,eAAe,MACb,0EAAA;AAAA,EAEF,eAAe,MACb,kEAAA;AAAA,EAEF,aAAa,MACX,yCAAA;AAAA,EAEF,aAAA,EAAe,CAAC,KAAA,KACd,CAAA,EAAG,KAAK,CAAA,6BAAA,CAAA;AAAA,EAEV,iBAAiB,MACf,kCAAA;AAAA,EAEF,wBAAwB,MACtB;AACJ,CAAA;AAEO,SAAS,WAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GACJ,IAAA,EAAM,QAAA,GAAW,IAAI,CAAA,IACrB,eAAe,IAAI,CAAA,GAAI,KAAA,EAAO,IAAI,CAAA,IAClC,kBAAA;AAEF,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AAChC;;;AChDO,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA,EAC9C,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACDM,SAAS,SAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACwB;AAExB,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,UAAA,EAAY,IAAI,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,QAAA,EAAU;AAC3C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,eAAA,EAAiB,IAAI,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,OAAO,IAAI,GAAA,KAAQ,QAAA,SAAiB,WAAA,CAAY,KAAA,EAAO,iBAAiB,IAAI,CAAA;AAChF,IAAA,IAAI,IAAI,QAAA,IAAY,CAAC,yBAAyB,GAAA,CAAI,GAAA,CAAI,QAAkB,CAAA,EAAG;AACzE,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,wBAAA,EAA0B,IAAI,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAW,GAAA,CAAI,MAAA,GAAoB,IAAA,EAAM;AAC/C,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,iBAAA,EAAmB,IAAI,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,IAAI,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,KAAA,IAAS,CAAC,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,IAAA;AACT;;;ACzCO,SAAS,QAAA,CACd,QACA,IAAA,EAC8B;AAC9B,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,YAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACvC,IAAA,MAAM,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,IAAA,MAAM,IAAA,GACJ,OAAO,UAAA,KAAe,SAAA,GAClB,MAAM,KAAK,CAAA,GACV,KAAA,CAAM,KAAK,CAAA,IAAM,UAAA;AAExB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAc,CAAC,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,GAAe,KAAK,KAAgB,CAAA;AAExC,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,YAAA,KAAiB,MAAA,EAAW;AAChD,MAAA,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAEjD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAgB,CAAA,GAAI,YAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GACnB,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO,GACzB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AACvC","file":"index.cjs","sourcesContent":["import { FieldRule } from \"../types/schema\";\r\n\r\nexport const passwordRule: FieldRule = {\r\n min: 8,\r\n max: 128,\r\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\r\n messages: {\r\n REQUIRED: \"Password is required\",\r\n MIN_LENGTH: \"Password must be at least 8 characters\",\r\n MAX_LENGTH: \"Password must be under 128 characters\",\r\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const emailRule: FieldRule = {\r\n max: 50,\r\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n transform: (value: unknown) => {\r\n return typeof value === \"string\" \r\n ? value.trim().toLowerCase() \r\n : value;\r\n },\r\n messages: {\r\n REQUIRED: \"Email is required\",\r\n MAX_LENGTH: \"Email must be under 50 characters\",\r\n PATTERN: \"Invalid email format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const nameRule: FieldRule = {\r\n min: 2,\r\n max: 50,\r\n regex: /^[a-zA-Z\\s'-]+$/,\r\n messages: {\r\n REQUIRED: \"Name is required\",\r\n MIN_LENGTH: \"Name must be at least 2 characters\",\r\n MAX_LENGTH: \"Name must be under 50 characters\",\r\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const phoneRule: FieldRule = {\r\n regex: /^\\+?[1-9]\\d{10,14}$/,\r\n messages: {\r\n REQUIRED: \"Phone number is required\",\r\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const urlRule: FieldRule = {\r\n max: 2083, // typical max URL length\r\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\r\n messages: {\r\n REQUIRED: \"URL is required\",\r\n MAX_LENGTH: \"URL is too long\",\r\n PATTERN: \"Invalid URL format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const postalCodeRule: FieldRule = {\r\n max: 10,\r\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\r\n messages: {\r\n REQUIRED: \"Postal code is required\",\r\n PATTERN: \"Invalid postal code format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const dateRule: FieldRule = {\r\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n messages: {\r\n REQUIRED: \"Date is required\",\r\n PATTERN: \"Date must be in YYYY-MM-DD format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const creditCardRule: FieldRule = {\r\n regex: /^\\d{13,19}$/,\r\n messages: {\r\n REQUIRED: \"Credit card number is required\",\r\n PATTERN: \"Invalid credit card number\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cvvRule: FieldRule = {\r\n regex: /^\\d{3,4}$/,\r\n messages: {\r\n REQUIRED: \"CVV is required\",\r\n PATTERN: \"CVV must be 3 or 4 digits\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const stateRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"State is required\",\r\n MAX_LENGTH: \"State must be under 50 characters\",\r\n PATTERN: \"State can only contain letters and spaces\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cityRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"City is required\",\r\n MAX_LENGTH: \"City must be under 50 characters\",\r\n PATTERN: \"City can only contain letters and spaces\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const streetRule: FieldRule = {\r\n max: 100,\r\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\r\n messages: {\r\n REQUIRED: \"Street address is required\",\r\n MAX_LENGTH: \"Street must be under 100 characters\",\r\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const usernameRule: FieldRule = {\r\n min: 3,\r\n max: 30,\r\n regex: /^[a-zA-Z0-9_]+$/,\r\n messages: {\r\n REQUIRED: \"Username is required\",\r\n MIN_LENGTH: \"Username must be at least 3 characters\",\r\n MAX_LENGTH: \"Username must be under 30 characters\",\r\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const timeRule: FieldRule = {\r\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\r\n messages: {\r\n REQUIRED: \"Time is required\",\r\n PATTERN: \"Time must be in HH:MM 24-hour format\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const booleanRule: FieldRule = {\r\n regex: /^(true|false)$/,\r\n messages: {\r\n REQUIRED: \"Value is required\",\r\n PATTERN: \"Value must be true or false\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const imageRule: FieldRule = {\r\n messages: {\r\n REQUIRED: \"Image is required\",\r\n INVALID_IMAGE: \"Invalid image payload\",\r\n IMAGE_TOO_LARGE: \"Image size exceeds limit\",\r\n UNSUPPORTED_IMAGE_TYPE: \"Unsupported image format\"\r\n }\r\n};\r\n","import { passwordRule } from \"./password\";\r\nimport { emailRule } from \"./email\";\r\nimport { nameRule } from \"./name\";\r\nimport { FieldRule } from \"../types/schema\";\r\nimport { phoneRule } from \"./phone\";\r\nimport { urlRule } from \"./urlRule\";\r\nimport { postalCodeRule } from \"./postalCodeRule\";\r\nimport { dateRule } from \"./dateRule\";\r\nimport { creditCardRule } from \"./creditCardRule\";\r\nimport { cvvRule } from \"./cvvRule\";\r\nimport { stateRule } from \"./stateRule\";\r\nimport { cityRule } from \"./cityRule\";\r\nimport { streetRule } from \"./streetRule\";\r\nimport { usernameRule } from \"./usernameRule\";\r\nimport { timeRule } from \"./timeRule\";\r\nimport { booleanRule } from \"./booleanRule\";\r\nimport { imageRule } from \"./imageRule\";\r\n\r\nexport const RULES: Record<string, FieldRule> = {\r\n name: nameRule,\r\n email: emailRule,\r\n password: passwordRule,\r\n phone: phoneRule,\r\n url: urlRule,\r\n postalCode: postalCodeRule,\r\n date: dateRule,\r\n creditCard: creditCardRule,\r\n cvv: cvvRule,\r\n state: stateRule,\r\n city: cityRule,\r\n street: streetRule,\r\n username: usernameRule,\r\n time: timeRule,\r\n active: booleanRule,\r\n avatar: imageRule \r\n};\r\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\r\n\r\nexport const ERROR_MESSAGES: Record<\r\n ValidationErrorCode,\r\n (field: string, rule?: FieldRule) => string\r\n> = {\r\n REQUIRED: (field) => `${field} is required`,\r\n\r\n INVALID_TYPE: (field) => `${field} must be a valid ${field}`,\r\n\r\n MIN_LENGTH: (field, rule) =>\r\n `${field} must be at least ${rule?.min} characters`,\r\n\r\n MAX_LENGTH: (field, rule) =>\r\n `${field} must be maximum ${rule?.max} characters`,\r\n\r\n PATTERN: (field) => `${field} format is invalid`,\r\n\r\n WEAK_PASSWORD: () =>\r\n \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\r\n\r\n INVALID_PHONE: () =>\r\n \"Phone must be a valid international/local number (+923001234567)\",\r\n\r\n INVALID_URL: () =>\r\n \"URL must be valid (https://example.com)\",\r\n\r\n INVALID_IMAGE: (field) =>\r\n `${field} must be a valid image object`,\r\n\r\n IMAGE_TOO_LARGE: () =>\r\n \"Image size exceeds allowed limit\",\r\n\r\n UNSUPPORTED_IMAGE_TYPE: () =>\r\n \"Unsupported image format (jpeg, png, webp, avif only)\"\r\n};\r\n\r\nexport function createError(\r\n field: string,\r\n code: ValidationErrorCode,\r\n rule?: FieldRule\r\n): ValidationError {\r\n const message =\r\n rule?.messages?.[code] ||\r\n ERROR_MESSAGES[code]?.(field, rule) ||\r\n \"Validation error\";\r\n\r\n return { field, code, message };\r\n}\r\n","export const ALLOWED_IMAGE_MIME_TYPES = new Set([\r\n \"image/jpeg\",\r\n \"image/png\",\r\n \"image/webp\",\r\n \"image/avif\"\r\n]);\r\n","import type { FieldRule, ValidationError } from \"../types/schema\";\r\nimport { createError } from \"../core/error\";\r\nimport { ALLOWED_IMAGE_MIME_TYPES } from \"../constants/image\";\r\n\r\nexport function applyRule(\r\n field: string,\r\n value: unknown,\r\n rule: FieldRule\r\n): ValidationError | null {\r\n\r\n if (value == null) {\r\n return createError(field, \"REQUIRED\", rule);\r\n }\r\n\r\n if (field === \"image\" || field === \"avatar\") {\r\n if (typeof value !== \"object\" || Array.isArray(value)) {\r\n return createError(field, \"INVALID_IMAGE\", rule);\r\n }\r\n const img = value as Record<string, unknown>;\r\n if (typeof img.url !== \"string\") return createError(field, \"INVALID_IMAGE\", rule);\r\n if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType as string)) {\r\n return createError(field, \"UNSUPPORTED_IMAGE_TYPE\", rule);\r\n }\r\n if (img.sizeKB && (img.sizeKB as number) > 5120) {\r\n return createError(field, \"IMAGE_TOO_LARGE\", rule);\r\n }\r\n return null;\r\n }\r\n\r\n if (typeof value === \"boolean\") {\r\n return null;\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return createError(field, \"INVALID_TYPE\", rule);\r\n }\r\n\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n return createError(field, \"MIN_LENGTH\", rule);\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n return createError(field, \"MAX_LENGTH\", rule);\r\n }\r\n if (rule.regex && !rule.regex.test(value)) {\r\n if (field === \"password\") {\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n\r\n return null;\r\n}\r\n","import { RULES } from \"../rules\";\r\nimport { applyRule } from \"./rule-engine\";\r\nimport { createError } from \"../core/error\";\r\nimport type {\r\n FieldRule,\r\n ValidationError,\r\n ValidationResult,\r\n ValidationSchema\r\n} from \"../types/schema\";\r\n\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: ValidationSchema,\r\n data: T\r\n): ValidationResult<Partial<T>> {\r\n const errors: ValidationError[] = [];\r\n const validData: Partial<T> = {};\r\n\r\n for (const field of Object.keys(schema)) {\r\n const schemaRule = schema[field];\r\n const rule: FieldRule | undefined =\r\n typeof schemaRule === \"boolean\"\r\n ? RULES[field]\r\n : (RULES[field] ?? (schemaRule as FieldRule));\r\n\r\n if (!rule) {\r\n errors.push(createError(field, \"INVALID_TYPE\"));\r\n continue;\r\n }\r\n\r\n let currentValue = data[field as keyof T];\r\n\r\n if (rule.transform && currentValue !== undefined) {\r\n currentValue = rule.transform(currentValue) as T[keyof T];\r\n }\r\n\r\n const error = applyRule(field, currentValue, rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = currentValue;\r\n }\r\n }\r\n\r\n return errors.length > 0\r\n ? { success: false, errors }\r\n : { success: true, data: validData };\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/imageRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/constants/image.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import { FieldRule } from \"../types/schema\";\n\nexport const passwordRule: FieldRule = {\n min: 8,\n max: 128,\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\n messages: {\n REQUIRED: \"Password is required\",\n MIN_LENGTH: \"Password must be at least 8 characters\",\n MAX_LENGTH: \"Password must be under 128 characters\",\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const emailRule: FieldRule = {\n max: 50,\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n transform: (value: unknown) => {\n return typeof value === \"string\" \n ? value.trim().toLowerCase() \n : value;\n },\n messages: {\n REQUIRED: \"Email is required\",\n MAX_LENGTH: \"Email must be under 50 characters\",\n PATTERN: \"Invalid email format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const nameRule: FieldRule = {\n min: 2,\n max: 50,\n regex: /^[a-zA-Z\\s'-]+$/,\n messages: {\n REQUIRED: \"Name is required\",\n MIN_LENGTH: \"Name must be at least 2 characters\",\n MAX_LENGTH: \"Name must be under 50 characters\",\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const phoneRule: FieldRule = {\n regex: /^\\+?[1-9]\\d{10,14}$/,\n messages: {\n REQUIRED: \"Phone number is required\",\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const urlRule: FieldRule = {\n max: 2083, // typical max URL length\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\n messages: {\n REQUIRED: \"URL is required\",\n MAX_LENGTH: \"URL is too long\",\n PATTERN: \"Invalid URL format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const postalCodeRule: FieldRule = {\n max: 10,\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\n messages: {\n REQUIRED: \"Postal code is required\",\n PATTERN: \"Invalid postal code format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const dateRule: FieldRule = {\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\n messages: {\n REQUIRED: \"Date is required\",\n PATTERN: \"Date must be in YYYY-MM-DD format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const creditCardRule: FieldRule = {\n regex: /^\\d{13,19}$/,\n messages: {\n REQUIRED: \"Credit card number is required\",\n PATTERN: \"Invalid credit card number\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const cvvRule: FieldRule = {\n regex: /^\\d{3,4}$/,\n messages: {\n REQUIRED: \"CVV is required\",\n PATTERN: \"CVV must be 3 or 4 digits\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const stateRule: FieldRule = {\n max: 50,\n regex: /^[a-zA-Z\\s]+$/,\n messages: {\n REQUIRED: \"State is required\",\n MAX_LENGTH: \"State must be under 50 characters\",\n PATTERN: \"State can only contain letters and spaces\"\n }\n};\n","import { FieldRule } from \"../types/schema\";\n\nexport const cityRule: FieldRule = {\n max: 50,\n regex: /^[a-zA-Z\\s]+$/,\n messages: {\n REQUIRED: \"City is required\",\n MAX_LENGTH: \"City must be under 50 characters\",\n PATTERN: \"City can only contain letters and spaces\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const streetRule: FieldRule = {\n max: 100,\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\n messages: {\n REQUIRED: \"Street address is required\",\n MAX_LENGTH: \"Street must be under 100 characters\",\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const usernameRule: FieldRule = {\n min: 3,\n max: 30,\n regex: /^[a-zA-Z0-9_]+$/,\n messages: {\n REQUIRED: \"Username is required\",\n MIN_LENGTH: \"Username must be at least 3 characters\",\n MAX_LENGTH: \"Username must be under 30 characters\",\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const timeRule: FieldRule = {\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\n messages: {\n REQUIRED: \"Time is required\",\n PATTERN: \"Time must be in HH:MM 24-hour format\"\n }\n};\n","import { FieldRule } from \"../types/schema\";\n\nexport const booleanRule: FieldRule = {\n regex: /^(true|false)$/,\n messages: {\n REQUIRED: \"Value is required\",\n PATTERN: \"Value must be true or false\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const imageRule: FieldRule = {\n messages: {\n REQUIRED: \"Image is required\",\n INVALID_IMAGE: \"Invalid image payload\",\n IMAGE_TOO_LARGE: \"Image size exceeds limit\",\n UNSUPPORTED_IMAGE_TYPE: \"Unsupported image format\"\n }\n};\n","import { passwordRule } from \"./password\";\nimport { emailRule } from \"./email\";\nimport { nameRule } from \"./name\";\nimport { FieldRule } from \"../types/schema\";\nimport { phoneRule } from \"./phone\";\nimport { urlRule } from \"./urlRule\";\nimport { postalCodeRule } from \"./postalCodeRule\";\nimport { dateRule } from \"./dateRule\";\nimport { creditCardRule } from \"./creditCardRule\";\nimport { cvvRule } from \"./cvvRule\";\nimport { stateRule } from \"./stateRule\";\nimport { cityRule } from \"./cityRule\";\nimport { streetRule } from \"./streetRule\";\nimport { usernameRule } from \"./usernameRule\";\nimport { timeRule } from \"./timeRule\";\nimport { booleanRule } from \"./booleanRule\";\nimport { imageRule } from \"./imageRule\";\n\nexport const RULES: Record<string, FieldRule> = {\n name: nameRule,\n email: emailRule,\n password: passwordRule,\n phone: phoneRule,\n url: urlRule,\n postalCode: postalCodeRule,\n date: dateRule,\n creditCard: creditCardRule,\n cvv: cvvRule,\n state: stateRule,\n city: cityRule,\n street: streetRule,\n username: usernameRule,\n time: timeRule,\n active: booleanRule,\n avatar: imageRule \n};\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\n\nexport const ERROR_MESSAGES: Record<\n ValidationErrorCode,\n (field: string, rule?: FieldRule) => string\n> = {\n REQUIRED: (field) => `${field} is required`,\n\n INVALID_TYPE: (field) => `${field} must be a valid ${field}`,\n\n MIN_LENGTH: (field, rule) =>\n `${field} must be at least ${rule?.min} characters`,\n\n MAX_LENGTH: (field, rule) =>\n `${field} must be maximum ${rule?.max} characters`,\n\n PATTERN: (field) => `${field} format is invalid`,\n\n WEAK_PASSWORD: () =>\n \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\n\n INVALID_PHONE: () =>\n \"Phone must be a valid international/local number (+923001234567)\",\n\n INVALID_URL: () =>\n \"URL must be valid (https://example.com)\",\n\n INVALID_IMAGE: (field) =>\n `${field} must be a valid image object`,\n\n IMAGE_TOO_LARGE: () =>\n \"Image size exceeds allowed limit\",\n\n UNSUPPORTED_IMAGE_TYPE: () =>\n \"Unsupported image format (jpeg, png, webp, avif only)\"\n};\n\nexport function createError(\n field: string,\n code: ValidationErrorCode,\n rule?: FieldRule\n): ValidationError {\n const message =\n rule?.messages?.[code] ||\n ERROR_MESSAGES[code]?.(field, rule) ||\n \"Validation error\";\n\n return { field, code, message };\n}\n","export const ALLOWED_IMAGE_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/avif\"\n]);\n","import type { FieldRule, ValidationError } from \"../types/schema\";\nimport { createError } from \"../core/error\";\nimport { ALLOWED_IMAGE_MIME_TYPES } from \"../constants/image\";\n\nexport function applyRule(\n field: string,\n value: unknown,\n rule: FieldRule\n): ValidationError | null {\n\n if (value == null) {\n return createError(field, \"REQUIRED\", rule);\n }\n\n if (field === \"image\" || field === \"avatar\") {\n if (typeof value !== \"object\" || Array.isArray(value)) {\n return createError(field, \"INVALID_IMAGE\", rule);\n }\n const img = value as Record<string, unknown>;\n if (typeof img.url !== \"string\") return createError(field, \"INVALID_IMAGE\", rule);\n if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType as string)) {\n return createError(field, \"UNSUPPORTED_IMAGE_TYPE\", rule);\n }\n if (img.sizeKB && (img.sizeKB as number) > 5120) {\n return createError(field, \"IMAGE_TOO_LARGE\", rule);\n }\n return null;\n }\n\n if (typeof value === \"boolean\") {\n return null;\n }\n\n if (typeof value !== \"string\") {\n return createError(field, \"INVALID_TYPE\", rule);\n }\n\n if (rule.min !== undefined && value.length < rule.min) {\n return createError(field, \"MIN_LENGTH\", rule);\n }\n if (rule.max !== undefined && value.length > rule.max) {\n return createError(field, \"MAX_LENGTH\", rule);\n }\n if (rule.regex && !rule.regex.test(value)) {\n if (field === \"password\") {\n return createError(field, \"PATTERN\", rule);\n }\n return createError(field, \"PATTERN\", rule);\n }\n\n return null;\n}\n","import { RULES } from \"../rules\";\nimport { applyRule } from \"./rule-engine\";\nimport { createError } from \"../core/error\";\nimport type {\n FieldRule,\n ValidationError,\n ValidationResult,\n ValidationSchema\n} from \"../types/schema\";\n\nexport function validate<T extends Record<string, unknown>>(\n schema: ValidationSchema,\n data: T\n): ValidationResult<Partial<T>> {\n const errors: ValidationError[] = [];\n const validData: Partial<T> = {};\n\n for (const field of Object.keys(schema)) {\n const schemaRule = schema[field];\n const rule: FieldRule | undefined =\n typeof schemaRule === \"boolean\"\n ? RULES[field]\n : (RULES[field] ?? (schemaRule as FieldRule));\n\n if (!rule) {\n errors.push(createError(field, \"INVALID_TYPE\"));\n continue;\n }\n\n let currentValue = data[field as keyof T];\n\n if (rule.transform && currentValue !== undefined) {\n currentValue = rule.transform(currentValue) as T[keyof T];\n }\n\n const error = applyRule(field, currentValue, rule);\n\n if (error) {\n errors.push(error);\n } else {\n validData[field as keyof T] = currentValue;\n }\n }\n\n return errors.length > 0\n ? { success: false, errors }\n : { success: true, data: validData };\n}"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/imageRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/constants/image.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":";AAEO,IAAM,YAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,+CAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,wCAAA;AAAA,IACZ,UAAA,EAAY,uCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,SAAA,GAAuB;AAAA,EAClC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,4BAAA;AAAA,EACP,SAAA,EAAW,CAAC,KAAA,KAAmB;AAC7B,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GACpB,MAAM,IAAA,EAAK,CAAE,aAAY,GACzB,KAAA;AAAA,EACN,CAAA;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,mCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACbO,IAAM,QAAA,GAAsB;AAAA,EACjC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,iBAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACT,QAAA,EAAU,kBAAA;AAAA,IACV,UAAA,EAAY,oCAAA;AAAA,IACZ,UAAA,EAAY,kCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,SAAA,GAAuB;AAAA,EAClC,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,0BAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,OAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,IAAA;AAAA;AAAA,EACL,KAAA,EAAO,0EAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,iBAAA;AAAA,IACV,UAAA,EAAY,iBAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,cAAA,GAA4B;AAAA,EACvC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,wBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,yBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACPO,IAAM,QAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,cAAA,GAA4B;AAAA,EACvC,KAAA,EAAO,aAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,gCAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,OAAA,GAAqB;AAAA,EAChC,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,iBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,SAAA,GAAuB;AAAA,EAClC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,eAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,mCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,QAAA,GAAsB;AAAA,EACjC,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,eAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,UAAA,EAAY,kCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,UAAA,GAAwB;AAAA,EACnC,GAAA,EAAK,GAAA;AAAA,EACL,KAAA,EAAO,qBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,4BAAA;AAAA,IACV,UAAA,EAAY,qCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACRO,IAAM,YAAA,GAA0B;AAAA,EACrC,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,iBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,sBAAA;AAAA,IACV,UAAA,EAAY,wCAAA;AAAA,IACZ,UAAA,EAAY,sCAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACVO,IAAM,QAAA,GAAsB;AAAA,EACjC,KAAA,EAAO,6BAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,WAAA,GAAyB;AAAA,EACpC,KAAA,EAAO,gBAAA;AAAA,EACP,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;;;ACNO,IAAM,SAAA,GAAuB;AAAA,EAClC,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,mBAAA;AAAA,IACV,aAAA,EAAe,uBAAA;AAAA,IACf,eAAA,EAAiB,0BAAA;AAAA,IACjB,sBAAA,EAAwB;AAAA;AAE5B,CAAA;;;ACSO,IAAM,KAAA,GAAmC;AAAA,EAC9C,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,YAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,OAAA;AAAA,EACL,UAAA,EAAY,cAAA;AAAA,EACZ,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY,cAAA;AAAA,EACZ,GAAA,EAAK,OAAA;AAAA,EACL,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;;;ACjCO,IAAM,cAAA,GAGT;AAAA,EACF,QAAA,EAAU,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,CAAA,YAAA,CAAA;AAAA,EAE7B,cAAc,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,oBAAoB,KAAK,CAAA,CAAA;AAAA,EAE1D,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAClB,GAAG,KAAK,CAAA,kBAAA,EAAqB,MAAM,GAAG,CAAA,WAAA,CAAA;AAAA,EAExC,UAAA,EAAY,CAAC,KAAA,EAAO,IAAA,KAClB,GAAG,KAAK,CAAA,iBAAA,EAAoB,MAAM,GAAG,CAAA,WAAA,CAAA;AAAA,EAEvC,OAAA,EAAS,CAAC,KAAA,KAAU,CAAA,EAAG,KAAK,CAAA,kBAAA,CAAA;AAAA,EAE5B,eAAe,MACb,0EAAA;AAAA,EAEF,eAAe,MACb,kEAAA;AAAA,EAEF,aAAa,MACX,yCAAA;AAAA,EAEF,aAAA,EAAe,CAAC,KAAA,KACd,CAAA,EAAG,KAAK,CAAA,6BAAA,CAAA;AAAA,EAEV,iBAAiB,MACf,kCAAA;AAAA,EAEF,wBAAwB,MACtB;AACJ,CAAA;AAEO,SAAS,WAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GACJ,IAAA,EAAM,QAAA,GAAW,IAAI,CAAA,IACrB,eAAe,IAAI,CAAA,GAAI,KAAA,EAAO,IAAI,CAAA,IAClC,kBAAA;AAEF,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AAChC;;;AChDO,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA,EAC9C,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACDM,SAAS,SAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACwB;AAExB,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,UAAA,EAAY,IAAI,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,QAAA,EAAU;AAC3C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,eAAA,EAAiB,IAAI,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,OAAO,IAAI,GAAA,KAAQ,QAAA,SAAiB,WAAA,CAAY,KAAA,EAAO,iBAAiB,IAAI,CAAA;AAChF,IAAA,IAAI,IAAI,QAAA,IAAY,CAAC,yBAAyB,GAAA,CAAI,GAAA,CAAI,QAAkB,CAAA,EAAG;AACzE,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,wBAAA,EAA0B,IAAI,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAW,GAAA,CAAI,MAAA,GAAoB,IAAA,EAAM;AAC/C,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,iBAAA,EAAmB,IAAI,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,IAAI,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,KAAA,IAAS,CAAC,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,IAAA;AACT;;;ACzCO,SAAS,QAAA,CACd,QACA,IAAA,EAC8B;AAC9B,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,YAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACvC,IAAA,MAAM,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,IAAA,MAAM,IAAA,GACJ,OAAO,UAAA,KAAe,SAAA,GAClB,MAAM,KAAK,CAAA,GACV,KAAA,CAAM,KAAK,CAAA,IAAM,UAAA;AAExB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAc,CAAC,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,GAAe,KAAK,KAAgB,CAAA;AAExC,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,YAAA,KAAiB,MAAA,EAAW;AAChD,MAAA,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,YAAA,EAAc,IAAI,CAAA;AAEjD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAgB,CAAA,GAAI,YAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GACnB,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO,GACzB,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AACvC","file":"index.js","sourcesContent":["import { FieldRule } from \"../types/schema\";\r\n\r\nexport const passwordRule: FieldRule = {\r\n min: 8,\r\n max: 128,\r\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\r\n messages: {\r\n REQUIRED: \"Password is required\",\r\n MIN_LENGTH: \"Password must be at least 8 characters\",\r\n MAX_LENGTH: \"Password must be under 128 characters\",\r\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const emailRule: FieldRule = {\r\n max: 50,\r\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\r\n transform: (value: unknown) => {\r\n return typeof value === \"string\" \r\n ? value.trim().toLowerCase() \r\n : value;\r\n },\r\n messages: {\r\n REQUIRED: \"Email is required\",\r\n MAX_LENGTH: \"Email must be under 50 characters\",\r\n PATTERN: \"Invalid email format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const nameRule: FieldRule = {\r\n min: 2,\r\n max: 50,\r\n regex: /^[a-zA-Z\\s'-]+$/,\r\n messages: {\r\n REQUIRED: \"Name is required\",\r\n MIN_LENGTH: \"Name must be at least 2 characters\",\r\n MAX_LENGTH: \"Name must be under 50 characters\",\r\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const phoneRule: FieldRule = {\r\n regex: /^\\+?[1-9]\\d{10,14}$/,\r\n messages: {\r\n REQUIRED: \"Phone number is required\",\r\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const urlRule: FieldRule = {\r\n max: 2083, // typical max URL length\r\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\r\n messages: {\r\n REQUIRED: \"URL is required\",\r\n MAX_LENGTH: \"URL is too long\",\r\n PATTERN: \"Invalid URL format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const postalCodeRule: FieldRule = {\r\n max: 10,\r\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\r\n messages: {\r\n REQUIRED: \"Postal code is required\",\r\n PATTERN: \"Invalid postal code format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const dateRule: FieldRule = {\r\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\r\n messages: {\r\n REQUIRED: \"Date is required\",\r\n PATTERN: \"Date must be in YYYY-MM-DD format\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const creditCardRule: FieldRule = {\r\n regex: /^\\d{13,19}$/,\r\n messages: {\r\n REQUIRED: \"Credit card number is required\",\r\n PATTERN: \"Invalid credit card number\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cvvRule: FieldRule = {\r\n regex: /^\\d{3,4}$/,\r\n messages: {\r\n REQUIRED: \"CVV is required\",\r\n PATTERN: \"CVV must be 3 or 4 digits\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const stateRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"State is required\",\r\n MAX_LENGTH: \"State must be under 50 characters\",\r\n PATTERN: \"State can only contain letters and spaces\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const cityRule: FieldRule = {\r\n max: 50,\r\n regex: /^[a-zA-Z\\s]+$/,\r\n messages: {\r\n REQUIRED: \"City is required\",\r\n MAX_LENGTH: \"City must be under 50 characters\",\r\n PATTERN: \"City can only contain letters and spaces\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const streetRule: FieldRule = {\r\n max: 100,\r\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\r\n messages: {\r\n REQUIRED: \"Street address is required\",\r\n MAX_LENGTH: \"Street must be under 100 characters\",\r\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const usernameRule: FieldRule = {\r\n min: 3,\r\n max: 30,\r\n regex: /^[a-zA-Z0-9_]+$/,\r\n messages: {\r\n REQUIRED: \"Username is required\",\r\n MIN_LENGTH: \"Username must be at least 3 characters\",\r\n MAX_LENGTH: \"Username must be under 30 characters\",\r\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const timeRule: FieldRule = {\r\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\r\n messages: {\r\n REQUIRED: \"Time is required\",\r\n PATTERN: \"Time must be in HH:MM 24-hour format\"\r\n }\r\n};\r\n","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const booleanRule: FieldRule = {\r\n regex: /^(true|false)$/,\r\n messages: {\r\n REQUIRED: \"Value is required\",\r\n PATTERN: \"Value must be true or false\"\r\n }\r\n};","import { FieldRule } from \"../types/schema\";\r\n\r\nexport const imageRule: FieldRule = {\r\n messages: {\r\n REQUIRED: \"Image is required\",\r\n INVALID_IMAGE: \"Invalid image payload\",\r\n IMAGE_TOO_LARGE: \"Image size exceeds limit\",\r\n UNSUPPORTED_IMAGE_TYPE: \"Unsupported image format\"\r\n }\r\n};\r\n","import { passwordRule } from \"./password\";\r\nimport { emailRule } from \"./email\";\r\nimport { nameRule } from \"./name\";\r\nimport { FieldRule } from \"../types/schema\";\r\nimport { phoneRule } from \"./phone\";\r\nimport { urlRule } from \"./urlRule\";\r\nimport { postalCodeRule } from \"./postalCodeRule\";\r\nimport { dateRule } from \"./dateRule\";\r\nimport { creditCardRule } from \"./creditCardRule\";\r\nimport { cvvRule } from \"./cvvRule\";\r\nimport { stateRule } from \"./stateRule\";\r\nimport { cityRule } from \"./cityRule\";\r\nimport { streetRule } from \"./streetRule\";\r\nimport { usernameRule } from \"./usernameRule\";\r\nimport { timeRule } from \"./timeRule\";\r\nimport { booleanRule } from \"./booleanRule\";\r\nimport { imageRule } from \"./imageRule\";\r\n\r\nexport const RULES: Record<string, FieldRule> = {\r\n name: nameRule,\r\n email: emailRule,\r\n password: passwordRule,\r\n phone: phoneRule,\r\n url: urlRule,\r\n postalCode: postalCodeRule,\r\n date: dateRule,\r\n creditCard: creditCardRule,\r\n cvv: cvvRule,\r\n state: stateRule,\r\n city: cityRule,\r\n street: streetRule,\r\n username: usernameRule,\r\n time: timeRule,\r\n active: booleanRule,\r\n avatar: imageRule \r\n};\r\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\r\n\r\nexport const ERROR_MESSAGES: Record<\r\n ValidationErrorCode,\r\n (field: string, rule?: FieldRule) => string\r\n> = {\r\n REQUIRED: (field) => `${field} is required`,\r\n\r\n INVALID_TYPE: (field) => `${field} must be a valid ${field}`,\r\n\r\n MIN_LENGTH: (field, rule) =>\r\n `${field} must be at least ${rule?.min} characters`,\r\n\r\n MAX_LENGTH: (field, rule) =>\r\n `${field} must be maximum ${rule?.max} characters`,\r\n\r\n PATTERN: (field) => `${field} format is invalid`,\r\n\r\n WEAK_PASSWORD: () =>\r\n \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\r\n\r\n INVALID_PHONE: () =>\r\n \"Phone must be a valid international/local number (+923001234567)\",\r\n\r\n INVALID_URL: () =>\r\n \"URL must be valid (https://example.com)\",\r\n\r\n INVALID_IMAGE: (field) =>\r\n `${field} must be a valid image object`,\r\n\r\n IMAGE_TOO_LARGE: () =>\r\n \"Image size exceeds allowed limit\",\r\n\r\n UNSUPPORTED_IMAGE_TYPE: () =>\r\n \"Unsupported image format (jpeg, png, webp, avif only)\"\r\n};\r\n\r\nexport function createError(\r\n field: string,\r\n code: ValidationErrorCode,\r\n rule?: FieldRule\r\n): ValidationError {\r\n const message =\r\n rule?.messages?.[code] ||\r\n ERROR_MESSAGES[code]?.(field, rule) ||\r\n \"Validation error\";\r\n\r\n return { field, code, message };\r\n}\r\n","export const ALLOWED_IMAGE_MIME_TYPES = new Set([\r\n \"image/jpeg\",\r\n \"image/png\",\r\n \"image/webp\",\r\n \"image/avif\"\r\n]);\r\n","import type { FieldRule, ValidationError } from \"../types/schema\";\r\nimport { createError } from \"../core/error\";\r\nimport { ALLOWED_IMAGE_MIME_TYPES } from \"../constants/image\";\r\n\r\nexport function applyRule(\r\n field: string,\r\n value: unknown,\r\n rule: FieldRule\r\n): ValidationError | null {\r\n\r\n if (value == null) {\r\n return createError(field, \"REQUIRED\", rule);\r\n }\r\n\r\n if (field === \"image\" || field === \"avatar\") {\r\n if (typeof value !== \"object\" || Array.isArray(value)) {\r\n return createError(field, \"INVALID_IMAGE\", rule);\r\n }\r\n const img = value as Record<string, unknown>;\r\n if (typeof img.url !== \"string\") return createError(field, \"INVALID_IMAGE\", rule);\r\n if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType as string)) {\r\n return createError(field, \"UNSUPPORTED_IMAGE_TYPE\", rule);\r\n }\r\n if (img.sizeKB && (img.sizeKB as number) > 5120) {\r\n return createError(field, \"IMAGE_TOO_LARGE\", rule);\r\n }\r\n return null;\r\n }\r\n\r\n if (typeof value === \"boolean\") {\r\n return null;\r\n }\r\n\r\n if (typeof value !== \"string\") {\r\n return createError(field, \"INVALID_TYPE\", rule);\r\n }\r\n\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n return createError(field, \"MIN_LENGTH\", rule);\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n return createError(field, \"MAX_LENGTH\", rule);\r\n }\r\n if (rule.regex && !rule.regex.test(value)) {\r\n if (field === \"password\") {\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n return createError(field, \"PATTERN\", rule);\r\n }\r\n\r\n return null;\r\n}\r\n","import { RULES } from \"../rules\";\r\nimport { applyRule } from \"./rule-engine\";\r\nimport { createError } from \"../core/error\";\r\nimport type {\r\n FieldRule,\r\n ValidationError,\r\n ValidationResult,\r\n ValidationSchema\r\n} from \"../types/schema\";\r\n\r\nexport function validate<T extends Record<string, unknown>>(\r\n schema: ValidationSchema,\r\n data: T\r\n): ValidationResult<Partial<T>> {\r\n const errors: ValidationError[] = [];\r\n const validData: Partial<T> = {};\r\n\r\n for (const field of Object.keys(schema)) {\r\n const schemaRule = schema[field];\r\n const rule: FieldRule | undefined =\r\n typeof schemaRule === \"boolean\"\r\n ? RULES[field]\r\n : (RULES[field] ?? (schemaRule as FieldRule));\r\n\r\n if (!rule) {\r\n errors.push(createError(field, \"INVALID_TYPE\"));\r\n continue;\r\n }\r\n\r\n let currentValue = data[field as keyof T];\r\n\r\n if (rule.transform && currentValue !== undefined) {\r\n currentValue = rule.transform(currentValue) as T[keyof T];\r\n }\r\n\r\n const error = applyRule(field, currentValue, rule);\r\n\r\n if (error) {\r\n errors.push(error);\r\n } else {\r\n validData[field as keyof T] = currentValue;\r\n }\r\n }\r\n\r\n return errors.length > 0\r\n ? { success: false, errors }\r\n : { success: true, data: validData };\r\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/rules/password.ts","../src/rules/email.ts","../src/rules/name.ts","../src/rules/phone.ts","../src/rules/urlRule.ts","../src/rules/postalCodeRule.ts","../src/rules/dateRule.ts","../src/rules/creditCardRule.ts","../src/rules/cvvRule.ts","../src/rules/stateRule.ts","../src/rules/cityRule.ts","../src/rules/streetRule.ts","../src/rules/usernameRule.ts","../src/rules/timeRule.ts","../src/rules/booleanRule.ts","../src/rules/imageRule.ts","../src/rules/index.ts","../src/core/error.ts","../src/constants/image.ts","../src/core/rule-engine.ts","../src/core/validate.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { FieldRule } from \"../types/schema\";\n\nexport const passwordRule: FieldRule = {\n min: 8,\n max: 128,\n regex: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).+$/,\n messages: {\n REQUIRED: \"Password is required\",\n MIN_LENGTH: \"Password must be at least 8 characters\",\n MAX_LENGTH: \"Password must be under 128 characters\",\n PATTERN: \"Password must include uppercase, lowercase, number, and special character\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const emailRule: FieldRule = {\n max: 50,\n regex: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n transform: (value: unknown) => {\n return typeof value === \"string\" \n ? value.trim().toLowerCase() \n : value;\n },\n messages: {\n REQUIRED: \"Email is required\",\n MAX_LENGTH: \"Email must be under 50 characters\",\n PATTERN: \"Invalid email format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const nameRule: FieldRule = {\n min: 2,\n max: 50,\n regex: /^[a-zA-Z\\s'-]+$/,\n messages: {\n REQUIRED: \"Name is required\",\n MIN_LENGTH: \"Name must be at least 2 characters\",\n MAX_LENGTH: \"Name must be under 50 characters\",\n PATTERN: \"Name can only contain letters, spaces, apostrophes, or hyphens\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const phoneRule: FieldRule = {\n regex: /^\\+?[1-9]\\d{10,14}$/,\n messages: {\n REQUIRED: \"Phone number is required\",\n PATTERN: \"Phone number must be in international format (+countrycodexxxxxxxx)\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const urlRule: FieldRule = {\n max: 2083, // typical max URL length\n regex: /^(https?:\\/\\/)?([\\w-]+(\\.[\\w-]+)+)([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?$/,\n messages: {\n REQUIRED: \"URL is required\",\n MAX_LENGTH: \"URL is too long\",\n PATTERN: \"Invalid URL format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const postalCodeRule: FieldRule = {\n max: 10,\n regex: /^[A-Za-z0-9\\- ]{3,10}$/,\n messages: {\n REQUIRED: \"Postal code is required\",\n PATTERN: \"Invalid postal code format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const dateRule: FieldRule = {\n regex: /^\\d{4}-\\d{2}-\\d{2}$/,\n messages: {\n REQUIRED: \"Date is required\",\n PATTERN: \"Date must be in YYYY-MM-DD format\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const creditCardRule: FieldRule = {\n regex: /^\\d{13,19}$/,\n messages: {\n REQUIRED: \"Credit card number is required\",\n PATTERN: \"Invalid credit card number\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const cvvRule: FieldRule = {\n regex: /^\\d{3,4}$/,\n messages: {\n REQUIRED: \"CVV is required\",\n PATTERN: \"CVV must be 3 or 4 digits\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const stateRule: FieldRule = {\n max: 50,\n regex: /^[a-zA-Z\\s]+$/,\n messages: {\n REQUIRED: \"State is required\",\n MAX_LENGTH: \"State must be under 50 characters\",\n PATTERN: \"State can only contain letters and spaces\"\n }\n};\n","import { FieldRule } from \"../types/schema\";\n\nexport const cityRule: FieldRule = {\n max: 50,\n regex: /^[a-zA-Z\\s]+$/,\n messages: {\n REQUIRED: \"City is required\",\n MAX_LENGTH: \"City must be under 50 characters\",\n PATTERN: \"City can only contain letters and spaces\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const streetRule: FieldRule = {\n max: 100,\n regex: /^[a-zA-Z0-9\\s,.-]+$/,\n messages: {\n REQUIRED: \"Street address is required\",\n MAX_LENGTH: \"Street must be under 100 characters\",\n PATTERN: \"Street can contain letters, numbers, commas, dots, and hyphens\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const usernameRule: FieldRule = {\n min: 3,\n max: 30,\n regex: /^[a-zA-Z0-9_]+$/,\n messages: {\n REQUIRED: \"Username is required\",\n MIN_LENGTH: \"Username must be at least 3 characters\",\n MAX_LENGTH: \"Username must be under 30 characters\",\n PATTERN: \"Username can contain only letters, numbers, and underscores\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const timeRule: FieldRule = {\n regex: /^([01]\\d|2[0-3]):([0-5]\\d)$/,\n messages: {\n REQUIRED: \"Time is required\",\n PATTERN: \"Time must be in HH:MM 24-hour format\"\n }\n};\n","import { FieldRule } from \"../types/schema\";\n\nexport const booleanRule: FieldRule = {\n regex: /^(true|false)$/,\n messages: {\n REQUIRED: \"Value is required\",\n PATTERN: \"Value must be true or false\"\n }\n};","import { FieldRule } from \"../types/schema\";\n\nexport const imageRule: FieldRule = {\n messages: {\n REQUIRED: \"Image is required\",\n INVALID_IMAGE: \"Invalid image payload\",\n IMAGE_TOO_LARGE: \"Image size exceeds limit\",\n UNSUPPORTED_IMAGE_TYPE: \"Unsupported image format\"\n }\n};\n","import { passwordRule } from \"./password\";\nimport { emailRule } from \"./email\";\nimport { nameRule } from \"./name\";\nimport { FieldRule } from \"../types/schema\";\nimport { phoneRule } from \"./phone\";\nimport { urlRule } from \"./urlRule\";\nimport { postalCodeRule } from \"./postalCodeRule\";\nimport { dateRule } from \"./dateRule\";\nimport { creditCardRule } from \"./creditCardRule\";\nimport { cvvRule } from \"./cvvRule\";\nimport { stateRule } from \"./stateRule\";\nimport { cityRule } from \"./cityRule\";\nimport { streetRule } from \"./streetRule\";\nimport { usernameRule } from \"./usernameRule\";\nimport { timeRule } from \"./timeRule\";\nimport { booleanRule } from \"./booleanRule\";\nimport { imageRule } from \"./imageRule\";\n\nexport const RULES: Record<string, FieldRule> = {\n name: nameRule,\n email: emailRule,\n password: passwordRule,\n phone: phoneRule,\n url: urlRule,\n postalCode: postalCodeRule,\n date: dateRule,\n creditCard: creditCardRule,\n cvv: cvvRule,\n state: stateRule,\n city: cityRule,\n street: streetRule,\n username: usernameRule,\n time: timeRule,\n active: booleanRule,\n avatar: imageRule \n};\n","import type { FieldRule, ValidationError, ValidationErrorCode } from \"../types/schema\";\n\nexport const ERROR_MESSAGES: Record<\n ValidationErrorCode,\n (field: string, rule?: FieldRule) => string\n> = {\n REQUIRED: (field) => `${field} is required`,\n\n INVALID_TYPE: (field) => `${field} must be a valid ${field}`,\n\n MIN_LENGTH: (field, rule) =>\n `${field} must be at least ${rule?.min} characters`,\n\n MAX_LENGTH: (field, rule) =>\n `${field} must be maximum ${rule?.max} characters`,\n\n PATTERN: (field) => `${field} format is invalid`,\n\n WEAK_PASSWORD: () =>\n \"Password too weak (8+ chars, 1 upper, 1 lower, 1 number, 1 special char)\",\n\n INVALID_PHONE: () =>\n \"Phone must be a valid international/local number (+923001234567)\",\n\n INVALID_URL: () =>\n \"URL must be valid (https://example.com)\",\n\n INVALID_IMAGE: (field) =>\n `${field} must be a valid image object`,\n\n IMAGE_TOO_LARGE: () =>\n \"Image size exceeds allowed limit\",\n\n UNSUPPORTED_IMAGE_TYPE: () =>\n \"Unsupported image format (jpeg, png, webp, avif only)\"\n};\n\nexport function createError(\n field: string,\n code: ValidationErrorCode,\n rule?: FieldRule\n): ValidationError {\n const message =\n rule?.messages?.[code] ||\n ERROR_MESSAGES[code]?.(field, rule) ||\n \"Validation error\";\n\n return { field, code, message };\n}\n","export const ALLOWED_IMAGE_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/avif\"\n]);\n","import type { FieldRule, ValidationError } from \"../types/schema\";\nimport { createError } from \"../core/error\";\nimport { ALLOWED_IMAGE_MIME_TYPES } from \"../constants/image\";\n\nexport function applyRule(\n field: string,\n value: unknown,\n rule: FieldRule\n): ValidationError | null {\n\n if (value == null) {\n return createError(field, \"REQUIRED\", rule);\n }\n\n if (field === \"image\" || field === \"avatar\") {\n if (typeof value !== \"object\" || Array.isArray(value)) {\n return createError(field, \"INVALID_IMAGE\", rule);\n }\n const img = value as Record<string, unknown>;\n if (typeof img.url !== \"string\") return createError(field, \"INVALID_IMAGE\", rule);\n if (img.mimeType && !ALLOWED_IMAGE_MIME_TYPES.has(img.mimeType as string)) {\n return createError(field, \"UNSUPPORTED_IMAGE_TYPE\", rule);\n }\n if (img.sizeKB && (img.sizeKB as number) > 5120) {\n return createError(field, \"IMAGE_TOO_LARGE\", rule);\n }\n return null;\n }\n\n if (typeof value === \"boolean\") {\n return null;\n }\n\n if (typeof value !== \"string\") {\n return createError(field, \"INVALID_TYPE\", rule);\n }\n\n if (rule.min !== undefined && value.length < rule.min) {\n return createError(field, \"MIN_LENGTH\", rule);\n }\n if (rule.max !== undefined && value.length > rule.max) {\n return createError(field, \"MAX_LENGTH\", rule);\n }\n if (rule.regex && !rule.regex.test(value)) {\n if (field === \"password\") {\n return createError(field, \"PATTERN\", rule);\n }\n return createError(field, \"PATTERN\", rule);\n }\n\n return null;\n}\n","import { RULES } from \"../rules\";\nimport { applyRule } from \"./rule-engine\";\nimport { createError } from \"../core/error\";\nimport type {\n FieldRule,\n ValidationError,\n ValidationResult,\n ValidationSchema\n} from \"../types/schema\";\n\nexport function validate<T extends Record<string, unknown>>(\n schema: ValidationSchema,\n data: T\n): ValidationResult<Partial<T>> {\n const errors: ValidationError[] = [];\n const validData: Partial<T> = {};\n\n for (const field of Object.keys(schema)) {\n const schemaRule = schema[field];\n const rule: FieldRule | undefined =\n typeof schemaRule === \"boolean\"\n ? RULES[field]\n : (RULES[field] ?? (schemaRule as FieldRule));\n\n if (!rule) {\n errors.push(createError(field, \"INVALID_TYPE\"));\n continue;\n }\n\n let currentValue = data[field as keyof T];\n\n if (rule.transform && currentValue !== undefined) {\n currentValue = rule.transform(currentValue) as T[keyof T];\n }\n\n const error = applyRule(field, currentValue, rule);\n\n if (error) {\n errors.push(error);\n } else {\n validData[field as keyof T] = currentValue;\n }\n }\n\n return errors.length > 0\n ? { success: false, errors }\n : { success: true, data: validData };\n}"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "smart-auth-validator",
|
|
3
|
-
"version": "1.2
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "Zero-regex, type-safe authentication and form validation for Fastify and Express",
|
|
5
5
|
"author": "Muhammad Burhan Chughtai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,12 +45,12 @@
|
|
|
45
45
|
},
|
|
46
46
|
"repository": {
|
|
47
47
|
"type": "git",
|
|
48
|
-
"url": "git+https://github.com/
|
|
48
|
+
"url": "git+https://github.com/BurhanChughtai20/smart-auth-validator.git"
|
|
49
49
|
},
|
|
50
50
|
"bugs": {
|
|
51
|
-
"url": "https://github.com/
|
|
51
|
+
"url": "https://github.com/BurhanChughtai20/smart-auth-validator/issues"
|
|
52
52
|
},
|
|
53
|
-
"homepage": "https://github.com/
|
|
53
|
+
"homepage": "https://github.com/BurhanChughtai20/smart-auth-validator#readme",
|
|
54
54
|
"keywords": [
|
|
55
55
|
"auth",
|
|
56
56
|
"validation",
|