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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EACL,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,eAAe,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Type-Safe Pipe
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
export function pipe(value, ...fns) {
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
7
|
+
return fns.reduce((acc, fn) => fn(acc), value);
|
|
8
|
+
}
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
export function flow(...fns) {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
12
|
+
return (value) => fns.reduce((acc, fn) => fn(acc), value);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=pipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipe.js","sourceRoot":"","sources":["../../../src/transform/pipe.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAmF/E,8DAA8D;AAC9D,MAAM,UAAU,IAAI,CAAC,KAAU,EAAE,GAAG,GAA0B;IAC5D,+DAA+D;IAC/D,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAmCD,8DAA8D;AAC9D,MAAM,UAAU,IAAI,CAAC,GAAG,GAA0B;IAChD,+DAA+D;IAC/D,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — String Sanitization Utilities
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Trim whitespace from both ends.
|
|
6
|
+
*/
|
|
7
|
+
export function trim(value) {
|
|
8
|
+
return value.trim();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Trim whitespace from the start.
|
|
12
|
+
*/
|
|
13
|
+
export function trimStart(value) {
|
|
14
|
+
return value.trimStart();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Trim whitespace from the end.
|
|
18
|
+
*/
|
|
19
|
+
export function trimEnd(value) {
|
|
20
|
+
return value.trimEnd();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Convert to lowercase.
|
|
24
|
+
*/
|
|
25
|
+
export function lowercase(value) {
|
|
26
|
+
return value.toLowerCase();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Convert to uppercase.
|
|
30
|
+
*/
|
|
31
|
+
export function uppercase(value) {
|
|
32
|
+
return value.toUpperCase();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Capitalize the first letter.
|
|
36
|
+
*/
|
|
37
|
+
export function capitalize(value) {
|
|
38
|
+
if (value.length === 0)
|
|
39
|
+
return value;
|
|
40
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Capitalize the first letter of each word.
|
|
44
|
+
*/
|
|
45
|
+
export function titleCase(value) {
|
|
46
|
+
return value.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert to camelCase.
|
|
50
|
+
*/
|
|
51
|
+
export function camelCase(value) {
|
|
52
|
+
return value
|
|
53
|
+
.replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))
|
|
54
|
+
.replace(/^[A-Z]/, (c) => c.toLowerCase());
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Convert to kebab-case.
|
|
58
|
+
*/
|
|
59
|
+
export function kebabCase(value) {
|
|
60
|
+
return value
|
|
61
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
62
|
+
.replace(/[\s_]+/g, '-')
|
|
63
|
+
.toLowerCase();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Convert to snake_case.
|
|
67
|
+
*/
|
|
68
|
+
export function snakeCase(value) {
|
|
69
|
+
return value
|
|
70
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
71
|
+
.replace(/[\s-]+/g, '_')
|
|
72
|
+
.toLowerCase();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Strip HTML tags from a string.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* stripHtml("<p>Hello <b>world</b></p>") // "Hello world"
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export function stripHtml(value) {
|
|
83
|
+
return value.replace(/<[^>]*>/g, '');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Escape HTML special characters to prevent XSS.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* escapeHtml('<script>alert("xss")</script>')
|
|
91
|
+
* // '<script>alert("xss")</script>'
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export function escapeHtml(value) {
|
|
95
|
+
const escapeMap = {
|
|
96
|
+
'&': '&',
|
|
97
|
+
'<': '<',
|
|
98
|
+
'>': '>',
|
|
99
|
+
'"': '"',
|
|
100
|
+
"'": ''',
|
|
101
|
+
'`': '`',
|
|
102
|
+
};
|
|
103
|
+
return value.replace(/[&<>"'`]/g, (char) => escapeMap[char] ?? char);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Unescape HTML entities.
|
|
107
|
+
*/
|
|
108
|
+
export function unescapeHtml(value) {
|
|
109
|
+
const unescapeMap = {
|
|
110
|
+
'&': '&',
|
|
111
|
+
'<': '<',
|
|
112
|
+
'>': '>',
|
|
113
|
+
'"': '"',
|
|
114
|
+
''': "'",
|
|
115
|
+
'`': '`',
|
|
116
|
+
};
|
|
117
|
+
return value.replace(/&(?:amp|lt|gt|quot|#x27|#x60);/g, (entity) => unescapeMap[entity] ?? entity);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Truncate a string to a maximum length.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* truncate("Hello, World!", 8) // "Hello..."
|
|
125
|
+
* truncate("Hello, World!", 8, "…") // "Hello, …"
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export function truncate(value, maxLength, suffix = '...') {
|
|
129
|
+
if (value.length <= maxLength)
|
|
130
|
+
return value;
|
|
131
|
+
return value.slice(0, maxLength - suffix.length) + suffix;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Convert a string to a URL-friendly slug.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* slugify("Hello, World! 🌍") // "hello-world"
|
|
139
|
+
* slugify(" Foo BAR baz ") // "foo-bar-baz"
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export function slugify(value) {
|
|
143
|
+
return value
|
|
144
|
+
.normalize('NFD')
|
|
145
|
+
.replace(/[\u0300-\u036f]/g, '') // Remove diacritics
|
|
146
|
+
.toLowerCase()
|
|
147
|
+
.replace(/[^a-z0-9\s-]/g, '') // Remove non-alphanumeric
|
|
148
|
+
.replace(/[\s-]+/g, '-') // Replace spaces with hyphens
|
|
149
|
+
.replace(/^-+|-+$/g, ''); // Trim leading/trailing hyphens
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Remove all whitespace from a string.
|
|
153
|
+
*/
|
|
154
|
+
export function removeWhitespace(value) {
|
|
155
|
+
return value.replace(/\s/g, '');
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Collapse multiple spaces into a single space.
|
|
159
|
+
*/
|
|
160
|
+
export function collapseWhitespace(value) {
|
|
161
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Pad a string to a minimum length (left-pads by default).
|
|
165
|
+
*/
|
|
166
|
+
export function padStart(value, length, fillChar = ' ') {
|
|
167
|
+
return value.padStart(length, fillChar);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Pad a string to a minimum length (right-pads).
|
|
171
|
+
*/
|
|
172
|
+
export function padEnd(value, length, fillChar = ' ') {
|
|
173
|
+
return value.padEnd(length, fillChar);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Reverse a string (Unicode-aware).
|
|
177
|
+
*/
|
|
178
|
+
export function reverse(value) {
|
|
179
|
+
return [...value].reverse().join('');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Count occurrences of a substring.
|
|
183
|
+
*/
|
|
184
|
+
export function countOccurrences(value, search) {
|
|
185
|
+
if (search.length === 0)
|
|
186
|
+
return 0;
|
|
187
|
+
let count = 0;
|
|
188
|
+
let pos = 0;
|
|
189
|
+
while ((pos = value.indexOf(search, pos)) !== -1) {
|
|
190
|
+
count++;
|
|
191
|
+
pos += search.length;
|
|
192
|
+
}
|
|
193
|
+
return count;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/transform/sanitize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Guarden — Custom Error Classes
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for all Guarden errors.
|
|
6
|
+
* Provides clean stack traces and error identification.
|
|
7
|
+
*/
|
|
8
|
+
export class GuardenError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(message, code) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'GuardenError';
|
|
13
|
+
this.code = code;
|
|
14
|
+
// Fix prototype chain for instanceof checks
|
|
15
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when a runtime assertion fails.
|
|
20
|
+
*/
|
|
21
|
+
export class AssertionError extends GuardenError {
|
|
22
|
+
constructor(message) {
|
|
23
|
+
super(message, 'ERR_ASSERTION');
|
|
24
|
+
this.name = 'AssertionError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Thrown when an invariant is violated.
|
|
29
|
+
* Indicates a bug in the program logic.
|
|
30
|
+
*/
|
|
31
|
+
export class InvariantError extends GuardenError {
|
|
32
|
+
constructor(message) {
|
|
33
|
+
super(`Invariant violation: ${message}`, 'ERR_INVARIANT');
|
|
34
|
+
this.name = 'InvariantError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Thrown when type coercion fails.
|
|
39
|
+
*/
|
|
40
|
+
export class CoercionError extends GuardenError {
|
|
41
|
+
originalValue;
|
|
42
|
+
targetType;
|
|
43
|
+
constructor(value, targetType) {
|
|
44
|
+
super(`Cannot coerce ${typeof value} (${String(value)}) to ${targetType}`, 'ERR_COERCION');
|
|
45
|
+
this.name = 'CoercionError';
|
|
46
|
+
this.originalValue = value;
|
|
47
|
+
this.targetType = targetType;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Thrown when environment variable validation fails.
|
|
52
|
+
*/
|
|
53
|
+
export class EnvValidationError extends GuardenError {
|
|
54
|
+
variableName;
|
|
55
|
+
errors;
|
|
56
|
+
constructor(variableName, errors) {
|
|
57
|
+
super(`Environment variable "${variableName}" validation failed:\n - ${errors.join('\n - ')}`, 'ERR_ENV_VALIDATION');
|
|
58
|
+
this.name = 'EnvValidationError';
|
|
59
|
+
this.variableName = variableName;
|
|
60
|
+
this.errors = errors;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Thrown when multiple environment variables fail validation.
|
|
65
|
+
*/
|
|
66
|
+
export class EnvConfigError extends GuardenError {
|
|
67
|
+
validationErrors;
|
|
68
|
+
constructor(errors) {
|
|
69
|
+
const summary = errors.map((e) => ` ${e.variableName}: ${e.errors.join(', ')}`).join('\n');
|
|
70
|
+
super(`Environment configuration is invalid:\n${summary}`, 'ERR_ENV_CONFIG');
|
|
71
|
+
this.name = 'EnvConfigError';
|
|
72
|
+
this.validationErrors = errors;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Thrown when code reaches a state that should be unreachable.
|
|
77
|
+
*/
|
|
78
|
+
export class UnreachableError extends GuardenError {
|
|
79
|
+
constructor(value) {
|
|
80
|
+
super(`Unreachable code reached with value: ${JSON.stringify(value)}`, 'ERR_UNREACHABLE');
|
|
81
|
+
this.name = 'UnreachableError';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,IAAI,CAAS;IAE7B,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,4CAA4C;QAC5C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,wBAAwB,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7B,aAAa,CAAU;IACvB,UAAU,CAAS;IAEnC,YAAY,KAAc,EAAE,UAAkB;QAC5C,KAAK,CACH,iBAAiB,OAAO,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,QAAQ,UAAU,EAAE,EACnE,cAAc,CACf,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClC,YAAY,CAAS;IACrB,MAAM,CAAW;IAEjC,YAAY,YAAoB,EAAE,MAAgB;QAChD,KAAK,CACH,yBAAyB,YAAY,6BAA6B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EACzF,oBAAoB,CACrB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9B,gBAAgB,CAAuB;IAEvD,YAAY,MAA4B;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5F,KAAK,CAAC,0CAA0C,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD,YAAY,KAAY;QACtB,KAAK,CACH,wCAAwC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAC/D,iBAAiB,CAClB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Guard } from '../utils/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Assert that a condition is true. Throws `AssertionError` if false.
|
|
4
|
+
* Narrows the condition to `true` in the subsequent code.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* assert(user !== null, 'User must exist');
|
|
9
|
+
* user.name; // OK — TypeScript knows user is not null
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare function assert(condition: unknown, message?: string): asserts condition;
|
|
13
|
+
/**
|
|
14
|
+
* Assert that a value is defined (not undefined).
|
|
15
|
+
* Narrows away `undefined`.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const val: string | undefined = getConfig('key');
|
|
20
|
+
* assertDefined(val, 'Config key is required');
|
|
21
|
+
* val.toUpperCase(); // OK
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function assertDefined<T>(value: T, message?: string): asserts value is Exclude<T, undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* Assert that a value is not null and not undefined.
|
|
27
|
+
* Narrows away `null | undefined`.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* assertNonNull(result);
|
|
32
|
+
* result.doSomething(); // OK
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function assertNonNull<T>(value: T, message?: string): asserts value is NonNullable<T>;
|
|
36
|
+
/**
|
|
37
|
+
* Assert that a value passes a type guard.
|
|
38
|
+
* Narrows to the guarded type.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* assertType(input, isString, 'Expected string input');
|
|
43
|
+
* input.toUpperCase(); // OK — narrowed to string
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function assertType<T>(value: unknown, guard: Guard<T>, message?: string): asserts value is T;
|
|
47
|
+
/**
|
|
48
|
+
* Assert that a value is truthy.
|
|
49
|
+
* Narrows away falsy values (false, 0, '', null, undefined, NaN).
|
|
50
|
+
*/
|
|
51
|
+
export declare function assertTruthy<T>(value: T, message?: string): asserts value is NonNullable<T>;
|
|
52
|
+
//# sourceMappingURL=assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../../src/assert/assertions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAI9E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAIxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAMjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,CAAC,CAMpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAMjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assert/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assert an invariant condition. Throws `InvariantError` if violated.
|
|
3
|
+
* Use this for conditions that indicate a bug in your code if broken.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* invariant(items.length > 0, 'items should never be empty at this point');
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export declare function invariant(condition: unknown, message: string): asserts condition;
|
|
11
|
+
/**
|
|
12
|
+
* Mark code as unreachable. Useful for exhaustive switch/if checks.
|
|
13
|
+
* Throws `UnreachableError` at runtime if reached.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* type Direction = 'up' | 'down';
|
|
18
|
+
*
|
|
19
|
+
* function move(dir: Direction) {
|
|
20
|
+
* switch (dir) {
|
|
21
|
+
* case 'up': return goUp();
|
|
22
|
+
* case 'down': return goDown();
|
|
23
|
+
* default: unreachable(dir); // TypeScript error if case missing
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function unreachable(value: never): never;
|
|
29
|
+
//# sourceMappingURL=invariant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariant.d.ts","sourceRoot":"","sources":["../../../src/assert/invariant.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAIhF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/env/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,QAAQ,GACT,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
type EnvValue = string | number | boolean;
|
|
2
|
+
interface EnvFieldConfig<T extends EnvValue> {
|
|
3
|
+
type: 'string' | 'number' | 'boolean' | 'enum';
|
|
4
|
+
required: boolean;
|
|
5
|
+
defaultValue?: T;
|
|
6
|
+
validators: Array<(value: T) => string | null>;
|
|
7
|
+
transformer: (raw: string) => T;
|
|
8
|
+
enumValues?: readonly string[];
|
|
9
|
+
}
|
|
10
|
+
type InferEnvType<T> = T extends EnvField<infer U> ? U : never;
|
|
11
|
+
type EnvSchema = Record<string, EnvField<EnvValue>>;
|
|
12
|
+
type InferEnv<T extends EnvSchema> = {
|
|
13
|
+
[K in keyof T]: InferEnvType<T[K]>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* A builder for defining environment variable validation rules.
|
|
17
|
+
*/
|
|
18
|
+
export declare class EnvField<T extends EnvValue> {
|
|
19
|
+
/** @internal */
|
|
20
|
+
_config: EnvFieldConfig<T>;
|
|
21
|
+
constructor(config: EnvFieldConfig<T>);
|
|
22
|
+
/** Mark the field as required (default). */
|
|
23
|
+
required(): EnvField<T>;
|
|
24
|
+
/** Mark the field as optional with a default value. */
|
|
25
|
+
default(value: T): EnvField<T>;
|
|
26
|
+
/** Add a custom validation rule. */
|
|
27
|
+
validate(fn: (value: T) => string | null): EnvField<T>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Define a string environment variable.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* const env = createEnv({
|
|
35
|
+
* DATABASE_URL: envString().url().required(),
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function envString(): StringEnvField;
|
|
40
|
+
declare class StringEnvField extends EnvField<string> {
|
|
41
|
+
/** Validate that the string is a valid URL. */
|
|
42
|
+
url(): StringEnvField;
|
|
43
|
+
/** Validate minimum length. */
|
|
44
|
+
minLength(min: number): StringEnvField;
|
|
45
|
+
/** Validate that the string matches a pattern. */
|
|
46
|
+
matches(pattern: RegExp): StringEnvField;
|
|
47
|
+
/** Set a default value. */
|
|
48
|
+
default(value: string): StringEnvField;
|
|
49
|
+
/** Mark as required. */
|
|
50
|
+
required(): StringEnvField;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Define a numeric environment variable.
|
|
54
|
+
* Automatically coerces the string value to a number.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const env = createEnv({
|
|
59
|
+
* PORT: envNumber().port().default(3000),
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function envNumber(): NumberEnvField;
|
|
64
|
+
declare class NumberEnvField extends EnvField<number> {
|
|
65
|
+
/** Validate that the number is a valid port (1-65535). */
|
|
66
|
+
port(): NumberEnvField;
|
|
67
|
+
/** Validate minimum value. */
|
|
68
|
+
min(min: number): NumberEnvField;
|
|
69
|
+
/** Validate maximum value. */
|
|
70
|
+
max(max: number): NumberEnvField;
|
|
71
|
+
/** Set a default value. */
|
|
72
|
+
default(value: number): NumberEnvField;
|
|
73
|
+
/** Mark as required. */
|
|
74
|
+
required(): NumberEnvField;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Define a boolean environment variable.
|
|
78
|
+
* Recognizes: "true", "1", "yes", "on" as true.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* const env = createEnv({
|
|
83
|
+
* DEBUG: envBoolean().default(false),
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function envBoolean(): BooleanEnvField;
|
|
88
|
+
declare class BooleanEnvField extends EnvField<boolean> {
|
|
89
|
+
/** Set a default value. */
|
|
90
|
+
default(value: boolean): BooleanEnvField;
|
|
91
|
+
/** Mark as required. */
|
|
92
|
+
required(): BooleanEnvField;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Define an enum environment variable.
|
|
96
|
+
* Value must be one of the specified options.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const env = createEnv({
|
|
101
|
+
* NODE_ENV: envEnum(['development', 'production', 'test'] as const),
|
|
102
|
+
* });
|
|
103
|
+
* // env.NODE_ENV is 'development' | 'production' | 'test'
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare function envEnum<T extends readonly string[]>(values: T): EnvField<T[number]>;
|
|
107
|
+
/**
|
|
108
|
+
* Validate and type-safe environment variables.
|
|
109
|
+
* Throws `EnvConfigError` at startup if validation fails.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* import { createEnv, envString, envNumber, envBoolean, envEnum } from 'guarden/env';
|
|
114
|
+
*
|
|
115
|
+
* export const env = createEnv({
|
|
116
|
+
* DATABASE_URL: envString().url().required(),
|
|
117
|
+
* PORT: envNumber().port().default(3000),
|
|
118
|
+
* DEBUG: envBoolean().default(false),
|
|
119
|
+
* NODE_ENV: envEnum(['development', 'production', 'test']),
|
|
120
|
+
* });
|
|
121
|
+
*
|
|
122
|
+
* // Fully typed!
|
|
123
|
+
* env.DATABASE_URL // string
|
|
124
|
+
* env.PORT // number
|
|
125
|
+
* env.DEBUG // boolean
|
|
126
|
+
* env.NODE_ENV // 'development' | 'production' | 'test'
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export declare function createEnv<T extends EnvSchema>(schema: T, source?: Record<string, string | undefined>): InferEnv<T>;
|
|
130
|
+
export {};
|
|
131
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/env/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { Guard } from '../utils/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check if a value is a non-empty string.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isNonEmptyString(value: unknown): value is string;
|
|
6
|
+
/**
|
|
7
|
+
* Check if a value is a string matching an email pattern.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isEmail(value: unknown): value is string;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a value is a valid URL string.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isURL(value: unknown): value is string;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a value is a valid UUID (v1-v5).
|
|
16
|
+
*/
|
|
17
|
+
export declare function isUUID(value: unknown): value is string;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a value is a valid ISO 8601 date string.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isISO8601(value: unknown): value is string;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a value is a valid JSON string.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isJSONString(value: unknown): value is string;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a value is a string matching a hex color (#fff or #ffffff).
|
|
28
|
+
*/
|
|
29
|
+
export declare function isHexColor(value: unknown): value is string;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a value is a positive number (> 0).
|
|
32
|
+
*/
|
|
33
|
+
export declare function isPositiveNumber(value: unknown): value is number;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a value is a negative number (< 0).
|
|
36
|
+
*/
|
|
37
|
+
export declare function isNegativeNumber(value: unknown): value is number;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a value is an integer.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isInteger(value: unknown): value is number;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a value is a safe integer (within Number.MAX_SAFE_INTEGER bounds).
|
|
44
|
+
*/
|
|
45
|
+
export declare function isSafeInteger(value: unknown): value is number;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a value is a non-empty array.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isNonEmptyArray<T = unknown>(value: unknown): value is [T, ...T[]];
|
|
50
|
+
/**
|
|
51
|
+
* Create a guard that checks if a number is within a range [min, max].
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* const isPercent = isInRange(0, 100);
|
|
56
|
+
* isPercent(50) // true
|
|
57
|
+
* isPercent(150) // false
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function isInRange(min: number, max: number): Guard<number>;
|
|
61
|
+
/**
|
|
62
|
+
* Create a guard that checks if a value is one of the specified values.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* const isDirection = isOneOf(['up', 'down', 'left', 'right'] as const);
|
|
67
|
+
* if (isDirection(input)) {
|
|
68
|
+
* // input is 'up' | 'down' | 'left' | 'right'
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare function isOneOf<T extends readonly unknown[]>(values: T): Guard<T[number]>;
|
|
73
|
+
/**
|
|
74
|
+
* Create a guard that checks if a string matches a pattern.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* const isSlug = isMatch(/^[a-z0-9-]+$/);
|
|
79
|
+
* isSlug("hello-world") // true
|
|
80
|
+
* isSlug("Hello World") // false
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function isMatch(pattern: RegExp): Guard<string>;
|
|
84
|
+
/**
|
|
85
|
+
* Create a guard that checks if a string has a minimum length.
|
|
86
|
+
*/
|
|
87
|
+
export declare function isMinLength(min: number): Guard<string>;
|
|
88
|
+
/**
|
|
89
|
+
* Create a guard that checks if a string has a maximum length.
|
|
90
|
+
*/
|
|
91
|
+
export declare function isMaxLength(max: number): Guard<string>;
|
|
92
|
+
/**
|
|
93
|
+
* Check if a value is an instance of a given class.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* const isMyError = isInstanceOf(TypeError);
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export declare function isInstanceOf<T>(constructor: new (...args: unknown[]) => T): Guard<T>;
|
|
101
|
+
//# sourceMappingURL=advanced.d.ts.map
|