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,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Guarden — Result<T, E> Monadic Error Handling
|
|
4
|
+
// ============================================================================
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ResultUtils = void 0;
|
|
7
|
+
exports.Ok = Ok;
|
|
8
|
+
exports.Err = Err;
|
|
9
|
+
// -- Internal implementations ------------------------------------------------
|
|
10
|
+
class OkResult {
|
|
11
|
+
value;
|
|
12
|
+
_tag = 'Ok';
|
|
13
|
+
constructor(value) {
|
|
14
|
+
this.value = value;
|
|
15
|
+
}
|
|
16
|
+
isOk() {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
isErr() {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
/** Transform the success value. */
|
|
23
|
+
map(fn) {
|
|
24
|
+
return new OkResult(fn(this.value));
|
|
25
|
+
}
|
|
26
|
+
/** Transform the error value (no-op for Ok). */
|
|
27
|
+
mapErr(_fn) {
|
|
28
|
+
return new OkResult(this.value);
|
|
29
|
+
}
|
|
30
|
+
/** Chain operations that return a Result (flatMap). */
|
|
31
|
+
andThen(fn) {
|
|
32
|
+
return fn(this.value);
|
|
33
|
+
}
|
|
34
|
+
/** Return this Result if Ok, otherwise return the other. */
|
|
35
|
+
orElse(_fn) {
|
|
36
|
+
return new OkResult(this.value);
|
|
37
|
+
}
|
|
38
|
+
/** Get the value, or throw if Err. */
|
|
39
|
+
unwrap() {
|
|
40
|
+
return this.value;
|
|
41
|
+
}
|
|
42
|
+
/** Get the value, or return a default. */
|
|
43
|
+
unwrapOr(_defaultValue) {
|
|
44
|
+
return this.value;
|
|
45
|
+
}
|
|
46
|
+
/** Get the value, or compute a default from the error. */
|
|
47
|
+
unwrapOrElse(_fn) {
|
|
48
|
+
return this.value;
|
|
49
|
+
}
|
|
50
|
+
/** Get the error, or throw if Ok. */
|
|
51
|
+
unwrapErr() {
|
|
52
|
+
throw new Error(`Called unwrapErr on Ok value: ${JSON.stringify(this.value)}`);
|
|
53
|
+
}
|
|
54
|
+
/** Pattern match on the Result. */
|
|
55
|
+
match(handlers) {
|
|
56
|
+
return handlers.ok(this.value);
|
|
57
|
+
}
|
|
58
|
+
/** Convert to an Option, discarding the error. */
|
|
59
|
+
ok() {
|
|
60
|
+
return this.value;
|
|
61
|
+
}
|
|
62
|
+
/** Convert to an Option of the error (returns undefined for Ok). */
|
|
63
|
+
err() {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
/** Apply a function to the value if Ok, used for side effects. */
|
|
67
|
+
tap(fn) {
|
|
68
|
+
fn(this.value);
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
/** Apply a function to the error if Err (no-op for Ok). */
|
|
72
|
+
tapErr(_fn) {
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
/** Convert to a JSON-friendly representation. */
|
|
76
|
+
toJSON() {
|
|
77
|
+
return { tag: 'Ok', value: this.value };
|
|
78
|
+
}
|
|
79
|
+
toString() {
|
|
80
|
+
return `Ok(${JSON.stringify(this.value)})`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
class ErrResult {
|
|
84
|
+
error;
|
|
85
|
+
_tag = 'Err';
|
|
86
|
+
constructor(error) {
|
|
87
|
+
this.error = error;
|
|
88
|
+
}
|
|
89
|
+
isOk() {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
isErr() {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
map(_fn) {
|
|
96
|
+
return new ErrResult(_fn);
|
|
97
|
+
}
|
|
98
|
+
mapErr(fn) {
|
|
99
|
+
return new ErrResult(fn(this.error));
|
|
100
|
+
}
|
|
101
|
+
andThen(_fn) {
|
|
102
|
+
return new ErrResult(this.error);
|
|
103
|
+
}
|
|
104
|
+
orElse(fn) {
|
|
105
|
+
return fn(this.error);
|
|
106
|
+
}
|
|
107
|
+
unwrap() {
|
|
108
|
+
throw new Error(`Called unwrap on Err value: ${JSON.stringify(this.error)}`);
|
|
109
|
+
}
|
|
110
|
+
unwrapOr(defaultValue) {
|
|
111
|
+
return defaultValue;
|
|
112
|
+
}
|
|
113
|
+
unwrapOrElse(fn) {
|
|
114
|
+
return fn(this.error);
|
|
115
|
+
}
|
|
116
|
+
unwrapErr() {
|
|
117
|
+
return this.error;
|
|
118
|
+
}
|
|
119
|
+
match(handlers) {
|
|
120
|
+
return handlers.err(this.error);
|
|
121
|
+
}
|
|
122
|
+
ok() {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
err() {
|
|
126
|
+
return this.error;
|
|
127
|
+
}
|
|
128
|
+
tap(_fn) {
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
tapErr(fn) {
|
|
132
|
+
fn(this.error);
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
toJSON() {
|
|
136
|
+
return { tag: 'Err', error: this.error };
|
|
137
|
+
}
|
|
138
|
+
toString() {
|
|
139
|
+
return `Err(${JSON.stringify(this.error)})`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// -- Public constructors -----------------------------------------------------
|
|
143
|
+
/**
|
|
144
|
+
* Create a successful Result.
|
|
145
|
+
*/
|
|
146
|
+
function Ok(value) {
|
|
147
|
+
return new OkResult(value);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create a failed Result.
|
|
151
|
+
*/
|
|
152
|
+
function Err(error) {
|
|
153
|
+
return new ErrResult(error);
|
|
154
|
+
}
|
|
155
|
+
// -- Static utilities --------------------------------------------------------
|
|
156
|
+
/**
|
|
157
|
+
* Result namespace with static utility methods.
|
|
158
|
+
*/
|
|
159
|
+
exports.ResultUtils = {
|
|
160
|
+
/**
|
|
161
|
+
* Wrap a function that may throw into a Result.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```ts
|
|
165
|
+
* const result = Result.from(() => JSON.parse(input));
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
from(fn) {
|
|
169
|
+
try {
|
|
170
|
+
return Ok(fn());
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
return Err(e instanceof Error ? e : new Error(String(e)));
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
/**
|
|
177
|
+
* Wrap a Promise into a ResultAsync.
|
|
178
|
+
*/
|
|
179
|
+
async fromPromise(promise) {
|
|
180
|
+
try {
|
|
181
|
+
const value = await promise;
|
|
182
|
+
return Ok(value);
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
return Err(e instanceof Error ? e : new Error(String(e)));
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
/**
|
|
189
|
+
* Collect an array of Results into a Result of an array.
|
|
190
|
+
* Returns the first Err encountered, or Ok with all values.
|
|
191
|
+
*/
|
|
192
|
+
all(results) {
|
|
193
|
+
const values = [];
|
|
194
|
+
for (const result of results) {
|
|
195
|
+
if (result.isErr())
|
|
196
|
+
return Err(result.unwrapErr());
|
|
197
|
+
values.push(result.unwrap());
|
|
198
|
+
}
|
|
199
|
+
return Ok(values);
|
|
200
|
+
},
|
|
201
|
+
/**
|
|
202
|
+
* Check if a value is a Result.
|
|
203
|
+
*/
|
|
204
|
+
isResult(value) {
|
|
205
|
+
return value instanceof OkResult || value instanceof ErrResult;
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../../src/result/result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Guarden — Type Coercion Utilities
|
|
4
|
+
// ============================================================================
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toNumber = toNumber;
|
|
7
|
+
exports.toString = toString;
|
|
8
|
+
exports.toBoolean = toBoolean;
|
|
9
|
+
exports.toDate = toDate;
|
|
10
|
+
exports.toArray = toArray;
|
|
11
|
+
exports.toInteger = toInteger;
|
|
12
|
+
const result_js_1 = require("../result/result.js");
|
|
13
|
+
const errors_js_1 = require("../utils/errors.js");
|
|
14
|
+
/**
|
|
15
|
+
* Coerce a value to a number.
|
|
16
|
+
* Handles strings, booleans, and Date objects.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* toNumber("42") // Ok(42)
|
|
21
|
+
* toNumber("abc") // Err(CoercionError)
|
|
22
|
+
* toNumber(true) // Ok(1)
|
|
23
|
+
* toNumber(null) // Err(CoercionError)
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function toNumber(value) {
|
|
27
|
+
if (typeof value === 'number') {
|
|
28
|
+
return Number.isNaN(value) ? (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'number')) : (0, result_js_1.Ok)(value);
|
|
29
|
+
}
|
|
30
|
+
if (typeof value === 'string') {
|
|
31
|
+
const trimmed = value.trim();
|
|
32
|
+
if (trimmed === '')
|
|
33
|
+
return (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'number'));
|
|
34
|
+
const n = Number(trimmed);
|
|
35
|
+
return Number.isNaN(n) ? (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'number')) : (0, result_js_1.Ok)(n);
|
|
36
|
+
}
|
|
37
|
+
if (typeof value === 'boolean')
|
|
38
|
+
return (0, result_js_1.Ok)(value ? 1 : 0);
|
|
39
|
+
if (value instanceof Date) {
|
|
40
|
+
const time = value.getTime();
|
|
41
|
+
return Number.isNaN(time) ? (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'number')) : (0, result_js_1.Ok)(time);
|
|
42
|
+
}
|
|
43
|
+
return (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'number'));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Coerce a value to a string.
|
|
47
|
+
* Handles numbers, booleans, null, undefined, and objects.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* toString(42) // "42"
|
|
52
|
+
* toString(null) // ""
|
|
53
|
+
* toString(undefined) // ""
|
|
54
|
+
* toString(true) // "true"
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
function toString(value) {
|
|
58
|
+
if (typeof value === 'string')
|
|
59
|
+
return value;
|
|
60
|
+
if (value === null || value === undefined)
|
|
61
|
+
return '';
|
|
62
|
+
if (typeof value === 'object') {
|
|
63
|
+
try {
|
|
64
|
+
return JSON.stringify(value);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return String(value);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return String(value);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Coerce a value to a boolean.
|
|
74
|
+
* Handles common truthy/falsy string representations.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* toBoolean("true") // true
|
|
79
|
+
* toBoolean("yes") // true
|
|
80
|
+
* toBoolean("1") // true
|
|
81
|
+
* toBoolean("false") // false
|
|
82
|
+
* toBoolean("no") // false
|
|
83
|
+
* toBoolean("0") // false
|
|
84
|
+
* toBoolean(1) // true
|
|
85
|
+
* toBoolean(0) // false
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
function toBoolean(value) {
|
|
89
|
+
if (typeof value === 'boolean')
|
|
90
|
+
return value;
|
|
91
|
+
if (typeof value === 'number')
|
|
92
|
+
return value !== 0;
|
|
93
|
+
if (typeof value === 'string') {
|
|
94
|
+
const lower = value.trim().toLowerCase();
|
|
95
|
+
return ['true', '1', 'yes', 'on', 'y'].includes(lower);
|
|
96
|
+
}
|
|
97
|
+
return Boolean(value);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Coerce a value to a Date.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* toDate("2024-01-15") // Ok(Date)
|
|
105
|
+
* toDate(1705276800000) // Ok(Date)
|
|
106
|
+
* toDate("not-a-date") // Err(CoercionError)
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
function toDate(value) {
|
|
110
|
+
if (value instanceof Date) {
|
|
111
|
+
return Number.isNaN(value.getTime())
|
|
112
|
+
? (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'Date'))
|
|
113
|
+
: (0, result_js_1.Ok)(value);
|
|
114
|
+
}
|
|
115
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
116
|
+
const date = new Date(value);
|
|
117
|
+
return Number.isNaN(date.getTime())
|
|
118
|
+
? (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'Date'))
|
|
119
|
+
: (0, result_js_1.Ok)(date);
|
|
120
|
+
}
|
|
121
|
+
return (0, result_js_1.Err)(new errors_js_1.CoercionError(value, 'Date'));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Wrap a non-array value in an array. Arrays are returned as-is.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```ts
|
|
128
|
+
* toArray(42) // [42]
|
|
129
|
+
* toArray([1, 2]) // [1, 2]
|
|
130
|
+
* toArray(null) // []
|
|
131
|
+
* toArray(undefined)// []
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
function toArray(value) {
|
|
135
|
+
if (value === null || value === undefined)
|
|
136
|
+
return [];
|
|
137
|
+
if (Array.isArray(value))
|
|
138
|
+
return value;
|
|
139
|
+
return [value];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Coerce a value to an integer.
|
|
143
|
+
*/
|
|
144
|
+
function toInteger(value) {
|
|
145
|
+
const numResult = toNumber(value);
|
|
146
|
+
if (numResult.isErr())
|
|
147
|
+
return numResult;
|
|
148
|
+
const n = numResult.unwrap();
|
|
149
|
+
return (0, result_js_1.Ok)(Math.trunc(n));
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=coerce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coerce.js","sourceRoot":"","sources":["../../../src/transform/coerce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.countOccurrences = exports.reverse = exports.padEnd = exports.padStart = exports.collapseWhitespace = exports.removeWhitespace = exports.slugify = exports.truncate = exports.unescapeHtml = exports.escapeHtml = exports.stripHtml = exports.snakeCase = exports.kebabCase = exports.camelCase = exports.titleCase = exports.capitalize = exports.uppercase = exports.lowercase = exports.trimEnd = exports.trimStart = exports.trim = exports.toInteger = exports.toArray = exports.toDate = exports.toBoolean = exports.toString = exports.toNumber = exports.flow = exports.pipe = void 0;
|
|
4
|
+
var pipe_js_1 = require("./pipe.js");
|
|
5
|
+
Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return pipe_js_1.pipe; } });
|
|
6
|
+
Object.defineProperty(exports, "flow", { enumerable: true, get: function () { return pipe_js_1.flow; } });
|
|
7
|
+
var coerce_js_1 = require("./coerce.js");
|
|
8
|
+
Object.defineProperty(exports, "toNumber", { enumerable: true, get: function () { return coerce_js_1.toNumber; } });
|
|
9
|
+
Object.defineProperty(exports, "toString", { enumerable: true, get: function () { return coerce_js_1.toString; } });
|
|
10
|
+
Object.defineProperty(exports, "toBoolean", { enumerable: true, get: function () { return coerce_js_1.toBoolean; } });
|
|
11
|
+
Object.defineProperty(exports, "toDate", { enumerable: true, get: function () { return coerce_js_1.toDate; } });
|
|
12
|
+
Object.defineProperty(exports, "toArray", { enumerable: true, get: function () { return coerce_js_1.toArray; } });
|
|
13
|
+
Object.defineProperty(exports, "toInteger", { enumerable: true, get: function () { return coerce_js_1.toInteger; } });
|
|
14
|
+
var sanitize_js_1 = require("./sanitize.js");
|
|
15
|
+
Object.defineProperty(exports, "trim", { enumerable: true, get: function () { return sanitize_js_1.trim; } });
|
|
16
|
+
Object.defineProperty(exports, "trimStart", { enumerable: true, get: function () { return sanitize_js_1.trimStart; } });
|
|
17
|
+
Object.defineProperty(exports, "trimEnd", { enumerable: true, get: function () { return sanitize_js_1.trimEnd; } });
|
|
18
|
+
Object.defineProperty(exports, "lowercase", { enumerable: true, get: function () { return sanitize_js_1.lowercase; } });
|
|
19
|
+
Object.defineProperty(exports, "uppercase", { enumerable: true, get: function () { return sanitize_js_1.uppercase; } });
|
|
20
|
+
Object.defineProperty(exports, "capitalize", { enumerable: true, get: function () { return sanitize_js_1.capitalize; } });
|
|
21
|
+
Object.defineProperty(exports, "titleCase", { enumerable: true, get: function () { return sanitize_js_1.titleCase; } });
|
|
22
|
+
Object.defineProperty(exports, "camelCase", { enumerable: true, get: function () { return sanitize_js_1.camelCase; } });
|
|
23
|
+
Object.defineProperty(exports, "kebabCase", { enumerable: true, get: function () { return sanitize_js_1.kebabCase; } });
|
|
24
|
+
Object.defineProperty(exports, "snakeCase", { enumerable: true, get: function () { return sanitize_js_1.snakeCase; } });
|
|
25
|
+
Object.defineProperty(exports, "stripHtml", { enumerable: true, get: function () { return sanitize_js_1.stripHtml; } });
|
|
26
|
+
Object.defineProperty(exports, "escapeHtml", { enumerable: true, get: function () { return sanitize_js_1.escapeHtml; } });
|
|
27
|
+
Object.defineProperty(exports, "unescapeHtml", { enumerable: true, get: function () { return sanitize_js_1.unescapeHtml; } });
|
|
28
|
+
Object.defineProperty(exports, "truncate", { enumerable: true, get: function () { return sanitize_js_1.truncate; } });
|
|
29
|
+
Object.defineProperty(exports, "slugify", { enumerable: true, get: function () { return sanitize_js_1.slugify; } });
|
|
30
|
+
Object.defineProperty(exports, "removeWhitespace", { enumerable: true, get: function () { return sanitize_js_1.removeWhitespace; } });
|
|
31
|
+
Object.defineProperty(exports, "collapseWhitespace", { enumerable: true, get: function () { return sanitize_js_1.collapseWhitespace; } });
|
|
32
|
+
Object.defineProperty(exports, "padStart", { enumerable: true, get: function () { return sanitize_js_1.padStart; } });
|
|
33
|
+
Object.defineProperty(exports, "padEnd", { enumerable: true, get: function () { return sanitize_js_1.padEnd; } });
|
|
34
|
+
Object.defineProperty(exports, "reverse", { enumerable: true, get: function () { return sanitize_js_1.reverse; } });
|
|
35
|
+
Object.defineProperty(exports, "countOccurrences", { enumerable: true, get: function () { return sanitize_js_1.countOccurrences; } });
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":";;;AAAA,qCAAuC;AAA9B,+FAAA,IAAI,OAAA;AAAE,+FAAA,IAAI,OAAA;AACnB,yCAAwF;AAA/E,qGAAA,QAAQ,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,mGAAA,MAAM,OAAA;AAAE,oGAAA,OAAO,OAAA;AAAE,sGAAA,SAAS,OAAA;AAClE,6CAsBuB;AArBrB,mGAAA,IAAI,OAAA;AACJ,wGAAA,SAAS,OAAA;AACT,sGAAA,OAAO,OAAA;AACP,wGAAA,SAAS,OAAA;AACT,wGAAA,SAAS,OAAA;AACT,yGAAA,UAAU,OAAA;AACV,wGAAA,SAAS,OAAA;AACT,wGAAA,SAAS,OAAA;AACT,wGAAA,SAAS,OAAA;AACT,wGAAA,SAAS,OAAA;AACT,wGAAA,SAAS,OAAA;AACT,yGAAA,UAAU,OAAA;AACV,2GAAA,YAAY,OAAA;AACZ,uGAAA,QAAQ,OAAA;AACR,sGAAA,OAAO,OAAA;AACP,+GAAA,gBAAgB,OAAA;AAChB,iHAAA,kBAAkB,OAAA;AAClB,uGAAA,QAAQ,OAAA;AACR,qGAAA,MAAM,OAAA;AACN,sGAAA,OAAO,OAAA;AACP,+GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Guarden — Type-Safe Pipe
|
|
4
|
+
// ============================================================================
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.pipe = pipe;
|
|
7
|
+
exports.flow = flow;
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
function pipe(value, ...fns) {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
11
|
+
return fns.reduce((acc, fn) => fn(acc), value);
|
|
12
|
+
}
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
function flow(...fns) {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
16
|
+
return (value) => fns.reduce((acc, fn) => fn(acc), value);
|
|
17
|
+
}
|
|
18
|
+
//# 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;;AAoF/E,oBAGC;AAoCD,oBAGC;AA3CD,8DAA8D;AAC9D,SAAgB,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,SAAgB,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,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// Guarden — String Sanitization Utilities
|
|
4
|
+
// ============================================================================
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.trim = trim;
|
|
7
|
+
exports.trimStart = trimStart;
|
|
8
|
+
exports.trimEnd = trimEnd;
|
|
9
|
+
exports.lowercase = lowercase;
|
|
10
|
+
exports.uppercase = uppercase;
|
|
11
|
+
exports.capitalize = capitalize;
|
|
12
|
+
exports.titleCase = titleCase;
|
|
13
|
+
exports.camelCase = camelCase;
|
|
14
|
+
exports.kebabCase = kebabCase;
|
|
15
|
+
exports.snakeCase = snakeCase;
|
|
16
|
+
exports.stripHtml = stripHtml;
|
|
17
|
+
exports.escapeHtml = escapeHtml;
|
|
18
|
+
exports.unescapeHtml = unescapeHtml;
|
|
19
|
+
exports.truncate = truncate;
|
|
20
|
+
exports.slugify = slugify;
|
|
21
|
+
exports.removeWhitespace = removeWhitespace;
|
|
22
|
+
exports.collapseWhitespace = collapseWhitespace;
|
|
23
|
+
exports.padStart = padStart;
|
|
24
|
+
exports.padEnd = padEnd;
|
|
25
|
+
exports.reverse = reverse;
|
|
26
|
+
exports.countOccurrences = countOccurrences;
|
|
27
|
+
/**
|
|
28
|
+
* Trim whitespace from both ends.
|
|
29
|
+
*/
|
|
30
|
+
function trim(value) {
|
|
31
|
+
return value.trim();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Trim whitespace from the start.
|
|
35
|
+
*/
|
|
36
|
+
function trimStart(value) {
|
|
37
|
+
return value.trimStart();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Trim whitespace from the end.
|
|
41
|
+
*/
|
|
42
|
+
function trimEnd(value) {
|
|
43
|
+
return value.trimEnd();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Convert to lowercase.
|
|
47
|
+
*/
|
|
48
|
+
function lowercase(value) {
|
|
49
|
+
return value.toLowerCase();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert to uppercase.
|
|
53
|
+
*/
|
|
54
|
+
function uppercase(value) {
|
|
55
|
+
return value.toUpperCase();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Capitalize the first letter.
|
|
59
|
+
*/
|
|
60
|
+
function capitalize(value) {
|
|
61
|
+
if (value.length === 0)
|
|
62
|
+
return value;
|
|
63
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Capitalize the first letter of each word.
|
|
67
|
+
*/
|
|
68
|
+
function titleCase(value) {
|
|
69
|
+
return value.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Convert to camelCase.
|
|
73
|
+
*/
|
|
74
|
+
function camelCase(value) {
|
|
75
|
+
return value
|
|
76
|
+
.replace(/[-_\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))
|
|
77
|
+
.replace(/^[A-Z]/, (c) => c.toLowerCase());
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Convert to kebab-case.
|
|
81
|
+
*/
|
|
82
|
+
function kebabCase(value) {
|
|
83
|
+
return value
|
|
84
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
85
|
+
.replace(/[\s_]+/g, '-')
|
|
86
|
+
.toLowerCase();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convert to snake_case.
|
|
90
|
+
*/
|
|
91
|
+
function snakeCase(value) {
|
|
92
|
+
return value
|
|
93
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
94
|
+
.replace(/[\s-]+/g, '_')
|
|
95
|
+
.toLowerCase();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Strip HTML tags from a string.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* stripHtml("<p>Hello <b>world</b></p>") // "Hello world"
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
function stripHtml(value) {
|
|
106
|
+
return value.replace(/<[^>]*>/g, '');
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Escape HTML special characters to prevent XSS.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* escapeHtml('<script>alert("xss")</script>')
|
|
114
|
+
* // '<script>alert("xss")</script>'
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
function escapeHtml(value) {
|
|
118
|
+
const escapeMap = {
|
|
119
|
+
'&': '&',
|
|
120
|
+
'<': '<',
|
|
121
|
+
'>': '>',
|
|
122
|
+
'"': '"',
|
|
123
|
+
"'": ''',
|
|
124
|
+
'`': '`',
|
|
125
|
+
};
|
|
126
|
+
return value.replace(/[&<>"'`]/g, (char) => escapeMap[char] ?? char);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Unescape HTML entities.
|
|
130
|
+
*/
|
|
131
|
+
function unescapeHtml(value) {
|
|
132
|
+
const unescapeMap = {
|
|
133
|
+
'&': '&',
|
|
134
|
+
'<': '<',
|
|
135
|
+
'>': '>',
|
|
136
|
+
'"': '"',
|
|
137
|
+
''': "'",
|
|
138
|
+
'`': '`',
|
|
139
|
+
};
|
|
140
|
+
return value.replace(/&(?:amp|lt|gt|quot|#x27|#x60);/g, (entity) => unescapeMap[entity] ?? entity);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Truncate a string to a maximum length.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```ts
|
|
147
|
+
* truncate("Hello, World!", 8) // "Hello..."
|
|
148
|
+
* truncate("Hello, World!", 8, "…") // "Hello, …"
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
function truncate(value, maxLength, suffix = '...') {
|
|
152
|
+
if (value.length <= maxLength)
|
|
153
|
+
return value;
|
|
154
|
+
return value.slice(0, maxLength - suffix.length) + suffix;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Convert a string to a URL-friendly slug.
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```ts
|
|
161
|
+
* slugify("Hello, World! 🌍") // "hello-world"
|
|
162
|
+
* slugify(" Foo BAR baz ") // "foo-bar-baz"
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
function slugify(value) {
|
|
166
|
+
return value
|
|
167
|
+
.normalize('NFD')
|
|
168
|
+
.replace(/[\u0300-\u036f]/g, '') // Remove diacritics
|
|
169
|
+
.toLowerCase()
|
|
170
|
+
.replace(/[^a-z0-9\s-]/g, '') // Remove non-alphanumeric
|
|
171
|
+
.replace(/[\s-]+/g, '-') // Replace spaces with hyphens
|
|
172
|
+
.replace(/^-+|-+$/g, ''); // Trim leading/trailing hyphens
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Remove all whitespace from a string.
|
|
176
|
+
*/
|
|
177
|
+
function removeWhitespace(value) {
|
|
178
|
+
return value.replace(/\s/g, '');
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Collapse multiple spaces into a single space.
|
|
182
|
+
*/
|
|
183
|
+
function collapseWhitespace(value) {
|
|
184
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Pad a string to a minimum length (left-pads by default).
|
|
188
|
+
*/
|
|
189
|
+
function padStart(value, length, fillChar = ' ') {
|
|
190
|
+
return value.padStart(length, fillChar);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Pad a string to a minimum length (right-pads).
|
|
194
|
+
*/
|
|
195
|
+
function padEnd(value, length, fillChar = ' ') {
|
|
196
|
+
return value.padEnd(length, fillChar);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Reverse a string (Unicode-aware).
|
|
200
|
+
*/
|
|
201
|
+
function reverse(value) {
|
|
202
|
+
return [...value].reverse().join('');
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Count occurrences of a substring.
|
|
206
|
+
*/
|
|
207
|
+
function countOccurrences(value, search) {
|
|
208
|
+
if (search.length === 0)
|
|
209
|
+
return 0;
|
|
210
|
+
let count = 0;
|
|
211
|
+
let pos = 0;
|
|
212
|
+
while ((pos = value.indexOf(search, pos)) !== -1) {
|
|
213
|
+
count++;
|
|
214
|
+
pos += search.length;
|
|
215
|
+
}
|
|
216
|
+
return count;
|
|
217
|
+
}
|
|
218
|
+
//# 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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"}
|