guarden 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +370 -0
- package/dist/cjs/assert/assertions.js +82 -0
- package/dist/cjs/assert/assertions.js.map +1 -0
- package/dist/cjs/assert/index.js +13 -0
- package/dist/cjs/assert/index.js.map +1 -0
- package/dist/cjs/assert/invariant.js +43 -0
- package/dist/cjs/assert/invariant.js.map +1 -0
- package/dist/cjs/env/index.js +11 -0
- package/dist/cjs/env/index.js.map +1 -0
- package/dist/cjs/env/schema.js +313 -0
- package/dist/cjs/env/schema.js.map +1 -0
- package/dist/cjs/guards/advanced.js +190 -0
- package/dist/cjs/guards/advanced.js.map +1 -0
- package/dist/cjs/guards/combinators.js +195 -0
- package/dist/cjs/guards/combinators.js.map +1 -0
- package/dist/cjs/guards/index.js +68 -0
- package/dist/cjs/guards/index.js.map +1 -0
- package/dist/cjs/guards/primitives.js +123 -0
- package/dist/cjs/guards/primitives.js.map +1 -0
- package/dist/cjs/guards/structures.js +113 -0
- package/dist/cjs/guards/structures.js.map +1 -0
- package/dist/cjs/index.js +135 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/result/async.js +132 -0
- package/dist/cjs/result/async.js.map +1 -0
- package/dist/cjs/result/index.js +15 -0
- package/dist/cjs/result/index.js.map +1 -0
- package/dist/cjs/result/option.js +175 -0
- package/dist/cjs/result/option.js.map +1 -0
- package/dist/cjs/result/result.js +208 -0
- package/dist/cjs/result/result.js.map +1 -0
- package/dist/cjs/transform/coerce.js +151 -0
- package/dist/cjs/transform/coerce.js.map +1 -0
- package/dist/cjs/transform/index.js +36 -0
- package/dist/cjs/transform/index.js.map +1 -0
- package/dist/cjs/transform/pipe.js +18 -0
- package/dist/cjs/transform/pipe.js.map +1 -0
- package/dist/cjs/transform/sanitize.js +218 -0
- package/dist/cjs/transform/sanitize.js.map +1 -0
- package/dist/cjs/utils/errors.js +94 -0
- package/dist/cjs/utils/errors.js.map +1 -0
- package/dist/cjs/utils/types.js +6 -0
- package/dist/cjs/utils/types.js.map +1 -0
- package/dist/esm/assert/assertions.js +75 -0
- package/dist/esm/assert/assertions.js.map +1 -0
- package/dist/esm/assert/index.js +3 -0
- package/dist/esm/assert/index.js.map +1 -0
- package/dist/esm/assert/invariant.js +39 -0
- package/dist/esm/assert/invariant.js.map +1 -0
- package/dist/esm/env/index.js +2 -0
- package/dist/esm/env/index.js.map +1 -0
- package/dist/esm/env/schema.js +304 -0
- package/dist/esm/env/schema.js.map +1 -0
- package/dist/esm/guards/advanced.js +170 -0
- package/dist/esm/guards/advanced.js.map +1 -0
- package/dist/esm/guards/combinators.js +182 -0
- package/dist/esm/guards/combinators.js.map +1 -0
- package/dist/esm/guards/index.js +8 -0
- package/dist/esm/guards/index.js.map +1 -0
- package/dist/esm/guards/primitives.js +108 -0
- package/dist/esm/guards/primitives.js.map +1 -0
- package/dist/esm/guards/structures.js +97 -0
- package/dist/esm/guards/structures.js.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/result/async.js +127 -0
- package/dist/esm/result/async.js.map +1 -0
- package/dist/esm/result/index.js +4 -0
- package/dist/esm/result/index.js.map +1 -0
- package/dist/esm/result/option.js +170 -0
- package/dist/esm/result/option.js.map +1 -0
- package/dist/esm/result/result.js +203 -0
- package/dist/esm/result/result.js.map +1 -0
- package/dist/esm/transform/coerce.js +143 -0
- package/dist/esm/transform/coerce.js.map +1 -0
- package/dist/esm/transform/index.js +4 -0
- package/dist/esm/transform/index.js.map +1 -0
- package/dist/esm/transform/pipe.js +14 -0
- package/dist/esm/transform/pipe.js.map +1 -0
- package/dist/esm/transform/sanitize.js +195 -0
- package/dist/esm/transform/sanitize.js.map +1 -0
- package/dist/esm/utils/errors.js +84 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/types.js +5 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/types/assert/assertions.d.ts +52 -0
- package/dist/types/assert/assertions.d.ts.map +1 -0
- package/dist/types/assert/index.d.ts +3 -0
- package/dist/types/assert/index.d.ts.map +1 -0
- package/dist/types/assert/invariant.d.ts +29 -0
- package/dist/types/assert/invariant.d.ts.map +1 -0
- package/dist/types/env/index.d.ts +2 -0
- package/dist/types/env/index.d.ts.map +1 -0
- package/dist/types/env/schema.d.ts +131 -0
- package/dist/types/env/schema.d.ts.map +1 -0
- package/dist/types/guards/advanced.d.ts +101 -0
- package/dist/types/guards/advanced.d.ts.map +1 -0
- package/dist/types/guards/combinators.d.ts +120 -0
- package/dist/types/guards/combinators.d.ts.map +1 -0
- package/dist/types/guards/index.d.ts +5 -0
- package/dist/types/guards/index.d.ts.map +1 -0
- package/dist/types/guards/primitives.d.ts +75 -0
- package/dist/types/guards/primitives.d.ts.map +1 -0
- package/dist/types/guards/structures.d.ts +58 -0
- package/dist/types/guards/structures.d.ts.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/result/async.d.ts +72 -0
- package/dist/types/result/async.d.ts.map +1 -0
- package/dist/types/result/index.d.ts +4 -0
- package/dist/types/result/index.d.ts.map +1 -0
- package/dist/types/result/option.d.ts +106 -0
- package/dist/types/result/option.d.ts.map +1 -0
- package/dist/types/result/result.d.ts +126 -0
- package/dist/types/result/result.d.ts.map +1 -0
- package/dist/types/transform/coerce.d.ts +73 -0
- package/dist/types/transform/coerce.d.ts.map +1 -0
- package/dist/types/transform/index.d.ts +4 -0
- package/dist/types/transform/index.d.ts.map +1 -0
- package/dist/types/transform/pipe.d.ts +44 -0
- package/dist/types/transform/pipe.d.ts.map +1 -0
- package/dist/types/transform/sanitize.d.ts +108 -0
- package/dist/types/transform/sanitize.d.ts.map +1 -0
- package/dist/types/utils/errors.d.ts +51 -0
- package/dist/types/utils/errors.d.ts.map +1 -0
- package/dist/types/utils/types.d.ts +29 -0
- package/dist/types/utils/types.d.ts.map +1 -0
- package/package.json +144 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Advanced Type Guards
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// -- String guards ----------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Check if a value is a non-empty string.
|
|
7
|
+
*/
|
|
8
|
+
export function isNonEmptyString(value) {
|
|
9
|
+
return typeof value === 'string' && value.length > 0;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if a value is a string matching an email pattern.
|
|
13
|
+
*/
|
|
14
|
+
export function isEmail(value) {
|
|
15
|
+
if (typeof value !== 'string')
|
|
16
|
+
return false;
|
|
17
|
+
// RFC 5322 simplified pattern
|
|
18
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a value is a valid URL string.
|
|
22
|
+
*/
|
|
23
|
+
export function isURL(value) {
|
|
24
|
+
if (typeof value !== 'string')
|
|
25
|
+
return false;
|
|
26
|
+
try {
|
|
27
|
+
new URL(value);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a value is a valid UUID (v1-v5).
|
|
36
|
+
*/
|
|
37
|
+
export function isUUID(value) {
|
|
38
|
+
if (typeof value !== 'string')
|
|
39
|
+
return false;
|
|
40
|
+
return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if a value is a valid ISO 8601 date string.
|
|
44
|
+
*/
|
|
45
|
+
export function isISO8601(value) {
|
|
46
|
+
if (typeof value !== 'string')
|
|
47
|
+
return false;
|
|
48
|
+
const date = new Date(value);
|
|
49
|
+
return !Number.isNaN(date.getTime()) && /^\d{4}-\d{2}-\d{2}/.test(value);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if a value is a valid JSON string.
|
|
53
|
+
*/
|
|
54
|
+
export function isJSONString(value) {
|
|
55
|
+
if (typeof value !== 'string')
|
|
56
|
+
return false;
|
|
57
|
+
try {
|
|
58
|
+
JSON.parse(value);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if a value is a string matching a hex color (#fff or #ffffff).
|
|
67
|
+
*/
|
|
68
|
+
export function isHexColor(value) {
|
|
69
|
+
if (typeof value !== 'string')
|
|
70
|
+
return false;
|
|
71
|
+
return /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(value);
|
|
72
|
+
}
|
|
73
|
+
// -- Number guards ----------------------------------------------------------
|
|
74
|
+
/**
|
|
75
|
+
* Check if a value is a positive number (> 0).
|
|
76
|
+
*/
|
|
77
|
+
export function isPositiveNumber(value) {
|
|
78
|
+
return typeof value === 'number' && !Number.isNaN(value) && value > 0;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Check if a value is a negative number (< 0).
|
|
82
|
+
*/
|
|
83
|
+
export function isNegativeNumber(value) {
|
|
84
|
+
return typeof value === 'number' && !Number.isNaN(value) && value < 0;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if a value is an integer.
|
|
88
|
+
*/
|
|
89
|
+
export function isInteger(value) {
|
|
90
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if a value is a safe integer (within Number.MAX_SAFE_INTEGER bounds).
|
|
94
|
+
*/
|
|
95
|
+
export function isSafeInteger(value) {
|
|
96
|
+
return typeof value === 'number' && Number.isSafeInteger(value);
|
|
97
|
+
}
|
|
98
|
+
// -- Array guards -----------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Check if a value is a non-empty array.
|
|
101
|
+
*/
|
|
102
|
+
export function isNonEmptyArray(value) {
|
|
103
|
+
return Array.isArray(value) && value.length > 0;
|
|
104
|
+
}
|
|
105
|
+
// -- Factory guards ---------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Create a guard that checks if a number is within a range [min, max].
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const isPercent = isInRange(0, 100);
|
|
112
|
+
* isPercent(50) // true
|
|
113
|
+
* isPercent(150) // false
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export function isInRange(min, max) {
|
|
117
|
+
return (value) => typeof value === 'number' && !Number.isNaN(value) && value >= min && value <= max;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a guard that checks if a value is one of the specified values.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* const isDirection = isOneOf(['up', 'down', 'left', 'right'] as const);
|
|
125
|
+
* if (isDirection(input)) {
|
|
126
|
+
* // input is 'up' | 'down' | 'left' | 'right'
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export function isOneOf(values) {
|
|
131
|
+
const valueSet = new Set(values);
|
|
132
|
+
return (value) => valueSet.has(value);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create a guard that checks if a string matches a pattern.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```ts
|
|
139
|
+
* const isSlug = isMatch(/^[a-z0-9-]+$/);
|
|
140
|
+
* isSlug("hello-world") // true
|
|
141
|
+
* isSlug("Hello World") // false
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export function isMatch(pattern) {
|
|
145
|
+
return (value) => typeof value === 'string' && pattern.test(value);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create a guard that checks if a string has a minimum length.
|
|
149
|
+
*/
|
|
150
|
+
export function isMinLength(min) {
|
|
151
|
+
return (value) => typeof value === 'string' && value.length >= min;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Create a guard that checks if a string has a maximum length.
|
|
155
|
+
*/
|
|
156
|
+
export function isMaxLength(max) {
|
|
157
|
+
return (value) => typeof value === 'string' && value.length <= max;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if a value is an instance of a given class.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```ts
|
|
164
|
+
* const isMyError = isInstanceOf(TypeError);
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
export function isInstanceOf(constructor) {
|
|
168
|
+
return (value) => value instanceof constructor;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=advanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced.js","sourceRoot":"","sources":["../../../src/guards/advanced.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAI/E,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,8BAA8B;IAC9B,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,4EAA4E,CAAC,IAAI,CACtF,KAAK,CACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,6CAA6C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAc;IAEd,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW;IAChD,OAAO,CAAC,KAAc,EAAmB,EAAE,CACzC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC;AACtF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,OAAO,CACrB,MAAS;IAET,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAU,MAAM,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAc,EAAsB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,KAAc,EAAmB,EAAE,CACzC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,CAAC,KAAc,EAAmB,EAAE,CACzC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,CAAC,KAAc,EAAmB,EAAE,CACzC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,WAA0C;IAE1C,OAAO,CAAC,KAAc,EAAc,EAAE,CAAC,KAAK,YAAY,WAAW,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Guard Combinators
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Combine two guards with AND logic (intersection).
|
|
6
|
+
* Value must satisfy both guards.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const isPositiveInteger = and(isInteger, isPositiveNumber);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export function and(guardA, guardB) {
|
|
14
|
+
return (value) => guardA(value) && guardB(value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Combine two guards with OR logic (union).
|
|
18
|
+
* Value must satisfy at least one guard.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const isStringOrNumber = or(isString, isNumber);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function or(guardA, guardB) {
|
|
26
|
+
return (value) => guardA(value) || guardB(value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Negate a guard.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const isNotNull = not(isNull);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function not(guard) {
|
|
37
|
+
return (value) => !guard(value);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create a guard that validates an object shape.
|
|
41
|
+
* Each property is validated by its corresponding guard.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const isUser = shape({
|
|
46
|
+
* name: isString,
|
|
47
|
+
* age: isNumber,
|
|
48
|
+
* email: isEmail,
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* if (isUser(data)) {
|
|
52
|
+
* data.name; // string
|
|
53
|
+
* data.age; // number
|
|
54
|
+
* data.email; // string
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export function shape(schema) {
|
|
59
|
+
return (value) => {
|
|
60
|
+
if (typeof value !== 'object' || value === null)
|
|
61
|
+
return false;
|
|
62
|
+
const obj = value;
|
|
63
|
+
for (const key in schema) {
|
|
64
|
+
if (!Object.prototype.hasOwnProperty.call(schema, key))
|
|
65
|
+
continue;
|
|
66
|
+
if (!schema[key](obj[key]))
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a guard that validates a tuple.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const isCoord = tuple(isNumber, isNumber);
|
|
78
|
+
* if (isCoord(data)) {
|
|
79
|
+
* const [x, y] = data; // [number, number]
|
|
80
|
+
* }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export function tuple(...guards) {
|
|
84
|
+
return (value) => {
|
|
85
|
+
if (!Array.isArray(value))
|
|
86
|
+
return false;
|
|
87
|
+
if (value.length !== guards.length)
|
|
88
|
+
return false;
|
|
89
|
+
return guards.every((guard, i) => guard(value[i]));
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a guard that validates each element of an array.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* const isStringArray = arrayOf(isString);
|
|
98
|
+
* if (isStringArray(data)) {
|
|
99
|
+
* data.forEach(s => s.toUpperCase()); // string[]
|
|
100
|
+
* }
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export function arrayOf(guard) {
|
|
104
|
+
return (value) => {
|
|
105
|
+
if (!Array.isArray(value))
|
|
106
|
+
return false;
|
|
107
|
+
return value.every((item) => guard(item));
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a guard that validates Map entries.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* const isStringNumberMap = mapOf(isString, isNumber);
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export function mapOf(keyGuard, valueGuard) {
|
|
119
|
+
return (value) => {
|
|
120
|
+
if (!(value instanceof Map))
|
|
121
|
+
return false;
|
|
122
|
+
for (const [k, v] of value) {
|
|
123
|
+
if (!keyGuard(k) || !valueGuard(v))
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a guard that validates Record (object) entries.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* const isScoreBoard = recordOf(isString, isNumber);
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
export function recordOf(valueGuard) {
|
|
138
|
+
return (value) => {
|
|
139
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
140
|
+
return false;
|
|
141
|
+
const obj = value;
|
|
142
|
+
for (const key in obj) {
|
|
143
|
+
if (!Object.prototype.hasOwnProperty.call(obj, key))
|
|
144
|
+
continue;
|
|
145
|
+
if (!valueGuard(obj[key]))
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create a guard with a custom refinement predicate.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```ts
|
|
156
|
+
* const isEvenNumber = refine(isNumber, (n) => n % 2 === 0);
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
export function refine(guard, predicate) {
|
|
160
|
+
return (value) => guard(value) && predicate(value);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create an optional guard — allows undefined in addition to the guarded type.
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* const isOptionalString = optional(isString);
|
|
168
|
+
* isOptionalString(undefined) // true
|
|
169
|
+
* isOptionalString("hello") // true
|
|
170
|
+
* isOptionalString(42) // false
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export function optional(guard) {
|
|
174
|
+
return (value) => value === undefined || guard(value);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Create a nullable guard — allows null in addition to the guarded type.
|
|
178
|
+
*/
|
|
179
|
+
export function nullable(guard) {
|
|
180
|
+
return (value) => value === null || guard(value);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=combinators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combinators.js","sourceRoot":"","sources":["../../../src/guards/combinators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Guards Module Barrel Export
|
|
3
|
+
// ============================================================================
|
|
4
|
+
export { isString, isNumber, isNumberIncludingNaN, isFiniteNumber, isBoolean, isBigInt, isSymbol, isNull, isUndefined, isNullish, isNonNullish, isFunction, isPrimitive, } from './primitives.js';
|
|
5
|
+
export { isArray, isObject, isPlainObject, isMap, isSet, isWeakMap, isWeakSet, isDate, isValidDate, isRegExp, isError, isPromise, isArrayBuffer, isTypedArray, } from './structures.js';
|
|
6
|
+
export { isNonEmptyString, isEmail, isURL, isUUID, isISO8601, isJSONString, isHexColor, isPositiveNumber, isNegativeNumber, isInteger, isSafeInteger, isNonEmptyArray, isInRange, isOneOf, isMatch, isMinLength, isMaxLength, isInstanceOf, } from './advanced.js';
|
|
7
|
+
export { and, or, not, shape, tuple, arrayOf, mapOf, recordOf, refine, optional, nullable, } from './combinators.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/guards/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,OAAO,EACP,QAAQ,EACR,aAAa,EACb,KAAK,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,MAAM,EACN,WAAW,EACX,QAAQ,EACR,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,eAAe,EACf,SAAS,EACT,OAAO,EACP,OAAO,EACP,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,GAAG,EACH,EAAE,EACF,GAAG,EACH,KAAK,EACL,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Primitive Type Guards
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Check if a value is a string.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const val: unknown = "hello";
|
|
10
|
+
* if (isString(val)) {
|
|
11
|
+
* val.toUpperCase(); // TypeScript knows val is string
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export function isString(value) {
|
|
16
|
+
return typeof value === 'string';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if a value is a number (excludes NaN by default).
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* isNumber(42) // true
|
|
24
|
+
* isNumber(NaN) // false
|
|
25
|
+
* isNumber("42") // false
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function isNumber(value) {
|
|
29
|
+
return typeof value === 'number' && !Number.isNaN(value);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if a value is a number, including NaN.
|
|
33
|
+
*/
|
|
34
|
+
export function isNumberIncludingNaN(value) {
|
|
35
|
+
return typeof value === 'number';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if a value is a finite number (excludes NaN and Infinity).
|
|
39
|
+
*/
|
|
40
|
+
export function isFiniteNumber(value) {
|
|
41
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if a value is a boolean.
|
|
45
|
+
*/
|
|
46
|
+
export function isBoolean(value) {
|
|
47
|
+
return typeof value === 'boolean';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if a value is a bigint.
|
|
51
|
+
*/
|
|
52
|
+
export function isBigInt(value) {
|
|
53
|
+
return typeof value === 'bigint';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check if a value is a symbol.
|
|
57
|
+
*/
|
|
58
|
+
export function isSymbol(value) {
|
|
59
|
+
return typeof value === 'symbol';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if a value is null.
|
|
63
|
+
*/
|
|
64
|
+
export function isNull(value) {
|
|
65
|
+
return value === null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if a value is undefined.
|
|
69
|
+
*/
|
|
70
|
+
export function isUndefined(value) {
|
|
71
|
+
return value === undefined;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a value is null or undefined.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* if (!isNullish(val)) {
|
|
79
|
+
* // val is narrowed to exclude null | undefined
|
|
80
|
+
* }
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export function isNullish(value) {
|
|
84
|
+
return value === null || value === undefined;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if a value is NOT null and NOT undefined.
|
|
88
|
+
*/
|
|
89
|
+
export function isNonNullish(value) {
|
|
90
|
+
return value !== null && value !== undefined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if a value is a function.
|
|
94
|
+
*/
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
96
|
+
export function isFunction(value) {
|
|
97
|
+
return typeof value === 'function';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if a value is a primitive type.
|
|
101
|
+
*/
|
|
102
|
+
export function isPrimitive(value) {
|
|
103
|
+
if (value === null || value === undefined)
|
|
104
|
+
return true;
|
|
105
|
+
const t = typeof value;
|
|
106
|
+
return t === 'string' || t === 'number' || t === 'boolean' || t === 'bigint' || t === 'symbol';
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/guards/primitives.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,KAAK,SAAS,CAAC;AAC7B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAI,KAAQ;IACtC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAAc;IAEd,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,CAAC,GAAG,OAAO,KAAK,CAAC;IACvB,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,CAAC;AACjG,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Structure Type Guards
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Check if a value is an array.
|
|
6
|
+
*/
|
|
7
|
+
export function isArray(value) {
|
|
8
|
+
return Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if a value is an object (excludes null and arrays).
|
|
12
|
+
*/
|
|
13
|
+
export function isObject(value) {
|
|
14
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if a value is a plain object (created by `{}` or `Object.create(null)`).
|
|
18
|
+
* Excludes class instances, arrays, and other special objects.
|
|
19
|
+
*/
|
|
20
|
+
export function isPlainObject(value) {
|
|
21
|
+
if (typeof value !== 'object' || value === null)
|
|
22
|
+
return false;
|
|
23
|
+
const proto = Object.getPrototypeOf(value);
|
|
24
|
+
return proto === Object.prototype || proto === null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if a value is a Map.
|
|
28
|
+
*/
|
|
29
|
+
export function isMap(value) {
|
|
30
|
+
return value instanceof Map;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a value is a Set.
|
|
34
|
+
*/
|
|
35
|
+
export function isSet(value) {
|
|
36
|
+
return value instanceof Set;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a value is a WeakMap.
|
|
40
|
+
*/
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
42
|
+
export function isWeakMap(value) {
|
|
43
|
+
return value instanceof WeakMap;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if a value is a WeakSet.
|
|
47
|
+
*/
|
|
48
|
+
export function isWeakSet(value) {
|
|
49
|
+
return value instanceof WeakSet;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if a value is a Date instance.
|
|
53
|
+
*/
|
|
54
|
+
export function isDate(value) {
|
|
55
|
+
return value instanceof Date;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if a value is a valid Date (not Invalid Date).
|
|
59
|
+
*/
|
|
60
|
+
export function isValidDate(value) {
|
|
61
|
+
return value instanceof Date && !Number.isNaN(value.getTime());
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if a value is a RegExp.
|
|
65
|
+
*/
|
|
66
|
+
export function isRegExp(value) {
|
|
67
|
+
return value instanceof RegExp;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if a value is an Error instance.
|
|
71
|
+
*/
|
|
72
|
+
export function isError(value) {
|
|
73
|
+
return value instanceof Error;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a value is a Promise.
|
|
77
|
+
*/
|
|
78
|
+
export function isPromise(value) {
|
|
79
|
+
return (value instanceof Promise ||
|
|
80
|
+
(typeof value === 'object' &&
|
|
81
|
+
value !== null &&
|
|
82
|
+
'then' in value &&
|
|
83
|
+
typeof value['then'] === 'function'));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a value is an ArrayBuffer.
|
|
87
|
+
*/
|
|
88
|
+
export function isArrayBuffer(value) {
|
|
89
|
+
return value instanceof ArrayBuffer;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if a value is a typed array (Uint8Array, Float32Array, etc.).
|
|
93
|
+
*/
|
|
94
|
+
export function isTypedArray(value) {
|
|
95
|
+
return ArrayBuffer.isView(value) && !(value instanceof DataView);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=structures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structures.js","sourceRoot":"","sources":["../../../src/guards/structures.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAY,CAAC;IACtD,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,GAAG,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,GAAG,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,sEAAsE;AACtE,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,YAAY,OAAO,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,KAAK,YAAY,OAAO,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,KAAK,YAAY,IAAI,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,YAAY,MAAM,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,CACL,KAAK,YAAY,OAAO;QACxB,CAAC,OAAO,KAAK,KAAK,QAAQ;YACxB,KAAK,KAAK,IAAI;YACd,MAAM,IAAI,KAAK;YACf,OAAQ,KAAiC,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,CACpE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,WAAW,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAc;IAWd,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Main Entry Point
|
|
3
|
+
// TypeScript-First Runtime Safety Toolkit
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// Guards
|
|
6
|
+
export { isString, isNumber, isNumberIncludingNaN, isFiniteNumber, isBoolean, isBigInt, isSymbol, isNull, isUndefined, isNullish, isNonNullish, isFunction, isPrimitive, isArray, isObject, isPlainObject, isMap, isSet, isWeakMap, isWeakSet, isDate, isValidDate, isRegExp, isError, isPromise, isArrayBuffer, isTypedArray, isNonEmptyString, isEmail, isURL, isUUID, isISO8601, isJSONString, isHexColor, isPositiveNumber, isNegativeNumber, isInteger, isSafeInteger, isNonEmptyArray, isInRange, isOneOf, isMatch, isMinLength, isMaxLength, isInstanceOf, and, or, not, shape, tuple, arrayOf, mapOf, recordOf, refine, optional, nullable, } from './guards/index.js';
|
|
7
|
+
// Assert
|
|
8
|
+
export { assert, assertDefined, assertNonNull, assertType, assertTruthy, invariant, unreachable, } from './assert/index.js';
|
|
9
|
+
// Result & Option
|
|
10
|
+
export { Ok, Err, ResultUtils, Some, None, OptionUtils, ResultAsync, OptionAsync, } from './result/index.js';
|
|
11
|
+
// Transform
|
|
12
|
+
export { pipe, flow, toNumber, toString, toBoolean, toDate, toArray, toInteger, trim, trimStart, trimEnd, lowercase, uppercase, capitalize, titleCase, camelCase, kebabCase, snakeCase, stripHtml, escapeHtml, unescapeHtml, truncate, slugify, removeWhitespace, collapseWhitespace, padStart, padEnd, reverse, countOccurrences, } from './transform/index.js';
|
|
13
|
+
// Env
|
|
14
|
+
export { createEnv, envString, envNumber, envBoolean, envEnum, EnvField, } from './env/index.js';
|
|
15
|
+
// Errors
|
|
16
|
+
export { GuardenError, AssertionError, InvariantError, CoercionError, EnvValidationError, EnvConfigError, UnreachableError, } from './utils/errors.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6BAA6B;AAC7B,0CAA0C;AAC1C,+EAA+E;AAE/E,SAAS;AACT,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,OAAO,EACP,QAAQ,EACR,aAAa,EACb,KAAK,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,MAAM,EACN,WAAW,EACX,QAAQ,EACR,OAAO,EACP,SAAS,EACT,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,SAAS,EACT,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,eAAe,EACf,SAAS,EACT,OAAO,EACP,OAAO,EACP,WAAW,EACX,WAAW,EACX,YAAY,EACZ,GAAG,EACH,EAAE,EACF,GAAG,EACH,KAAK,EACL,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAE3B,SAAS;AACT,OAAO,EACL,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,SAAS,EACT,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,kBAAkB;AAClB,OAAO,EACL,EAAE,EACF,GAAG,EACH,WAAW,EAEX,IAAI,EACJ,IAAI,EACJ,WAAW,EAEX,WAAW,EACX,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,SAAS,EACT,IAAI,EACJ,SAAS,EACT,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,EACR,MAAM,EACN,OAAO,EACP,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM;AACN,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,QAAQ,GACT,MAAM,gBAAgB,CAAC;AAExB,SAAS;AACT,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAC"}
|