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.
Files changed (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/dist/cjs/assert/assertions.js +82 -0
  4. package/dist/cjs/assert/assertions.js.map +1 -0
  5. package/dist/cjs/assert/index.js +13 -0
  6. package/dist/cjs/assert/index.js.map +1 -0
  7. package/dist/cjs/assert/invariant.js +43 -0
  8. package/dist/cjs/assert/invariant.js.map +1 -0
  9. package/dist/cjs/env/index.js +11 -0
  10. package/dist/cjs/env/index.js.map +1 -0
  11. package/dist/cjs/env/schema.js +313 -0
  12. package/dist/cjs/env/schema.js.map +1 -0
  13. package/dist/cjs/guards/advanced.js +190 -0
  14. package/dist/cjs/guards/advanced.js.map +1 -0
  15. package/dist/cjs/guards/combinators.js +195 -0
  16. package/dist/cjs/guards/combinators.js.map +1 -0
  17. package/dist/cjs/guards/index.js +68 -0
  18. package/dist/cjs/guards/index.js.map +1 -0
  19. package/dist/cjs/guards/primitives.js +123 -0
  20. package/dist/cjs/guards/primitives.js.map +1 -0
  21. package/dist/cjs/guards/structures.js +113 -0
  22. package/dist/cjs/guards/structures.js.map +1 -0
  23. package/dist/cjs/index.js +135 -0
  24. package/dist/cjs/index.js.map +1 -0
  25. package/dist/cjs/result/async.js +132 -0
  26. package/dist/cjs/result/async.js.map +1 -0
  27. package/dist/cjs/result/index.js +15 -0
  28. package/dist/cjs/result/index.js.map +1 -0
  29. package/dist/cjs/result/option.js +175 -0
  30. package/dist/cjs/result/option.js.map +1 -0
  31. package/dist/cjs/result/result.js +208 -0
  32. package/dist/cjs/result/result.js.map +1 -0
  33. package/dist/cjs/transform/coerce.js +151 -0
  34. package/dist/cjs/transform/coerce.js.map +1 -0
  35. package/dist/cjs/transform/index.js +36 -0
  36. package/dist/cjs/transform/index.js.map +1 -0
  37. package/dist/cjs/transform/pipe.js +18 -0
  38. package/dist/cjs/transform/pipe.js.map +1 -0
  39. package/dist/cjs/transform/sanitize.js +218 -0
  40. package/dist/cjs/transform/sanitize.js.map +1 -0
  41. package/dist/cjs/utils/errors.js +94 -0
  42. package/dist/cjs/utils/errors.js.map +1 -0
  43. package/dist/cjs/utils/types.js +6 -0
  44. package/dist/cjs/utils/types.js.map +1 -0
  45. package/dist/esm/assert/assertions.js +75 -0
  46. package/dist/esm/assert/assertions.js.map +1 -0
  47. package/dist/esm/assert/index.js +3 -0
  48. package/dist/esm/assert/index.js.map +1 -0
  49. package/dist/esm/assert/invariant.js +39 -0
  50. package/dist/esm/assert/invariant.js.map +1 -0
  51. package/dist/esm/env/index.js +2 -0
  52. package/dist/esm/env/index.js.map +1 -0
  53. package/dist/esm/env/schema.js +304 -0
  54. package/dist/esm/env/schema.js.map +1 -0
  55. package/dist/esm/guards/advanced.js +170 -0
  56. package/dist/esm/guards/advanced.js.map +1 -0
  57. package/dist/esm/guards/combinators.js +182 -0
  58. package/dist/esm/guards/combinators.js.map +1 -0
  59. package/dist/esm/guards/index.js +8 -0
  60. package/dist/esm/guards/index.js.map +1 -0
  61. package/dist/esm/guards/primitives.js +108 -0
  62. package/dist/esm/guards/primitives.js.map +1 -0
  63. package/dist/esm/guards/structures.js +97 -0
  64. package/dist/esm/guards/structures.js.map +1 -0
  65. package/dist/esm/index.js +17 -0
  66. package/dist/esm/index.js.map +1 -0
  67. package/dist/esm/result/async.js +127 -0
  68. package/dist/esm/result/async.js.map +1 -0
  69. package/dist/esm/result/index.js +4 -0
  70. package/dist/esm/result/index.js.map +1 -0
  71. package/dist/esm/result/option.js +170 -0
  72. package/dist/esm/result/option.js.map +1 -0
  73. package/dist/esm/result/result.js +203 -0
  74. package/dist/esm/result/result.js.map +1 -0
  75. package/dist/esm/transform/coerce.js +143 -0
  76. package/dist/esm/transform/coerce.js.map +1 -0
  77. package/dist/esm/transform/index.js +4 -0
  78. package/dist/esm/transform/index.js.map +1 -0
  79. package/dist/esm/transform/pipe.js +14 -0
  80. package/dist/esm/transform/pipe.js.map +1 -0
  81. package/dist/esm/transform/sanitize.js +195 -0
  82. package/dist/esm/transform/sanitize.js.map +1 -0
  83. package/dist/esm/utils/errors.js +84 -0
  84. package/dist/esm/utils/errors.js.map +1 -0
  85. package/dist/esm/utils/types.js +5 -0
  86. package/dist/esm/utils/types.js.map +1 -0
  87. package/dist/types/assert/assertions.d.ts +52 -0
  88. package/dist/types/assert/assertions.d.ts.map +1 -0
  89. package/dist/types/assert/index.d.ts +3 -0
  90. package/dist/types/assert/index.d.ts.map +1 -0
  91. package/dist/types/assert/invariant.d.ts +29 -0
  92. package/dist/types/assert/invariant.d.ts.map +1 -0
  93. package/dist/types/env/index.d.ts +2 -0
  94. package/dist/types/env/index.d.ts.map +1 -0
  95. package/dist/types/env/schema.d.ts +131 -0
  96. package/dist/types/env/schema.d.ts.map +1 -0
  97. package/dist/types/guards/advanced.d.ts +101 -0
  98. package/dist/types/guards/advanced.d.ts.map +1 -0
  99. package/dist/types/guards/combinators.d.ts +120 -0
  100. package/dist/types/guards/combinators.d.ts.map +1 -0
  101. package/dist/types/guards/index.d.ts +5 -0
  102. package/dist/types/guards/index.d.ts.map +1 -0
  103. package/dist/types/guards/primitives.d.ts +75 -0
  104. package/dist/types/guards/primitives.d.ts.map +1 -0
  105. package/dist/types/guards/structures.d.ts +58 -0
  106. package/dist/types/guards/structures.d.ts.map +1 -0
  107. package/dist/types/index.d.ts +8 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/result/async.d.ts +72 -0
  110. package/dist/types/result/async.d.ts.map +1 -0
  111. package/dist/types/result/index.d.ts +4 -0
  112. package/dist/types/result/index.d.ts.map +1 -0
  113. package/dist/types/result/option.d.ts +106 -0
  114. package/dist/types/result/option.d.ts.map +1 -0
  115. package/dist/types/result/result.d.ts +126 -0
  116. package/dist/types/result/result.d.ts.map +1 -0
  117. package/dist/types/transform/coerce.d.ts +73 -0
  118. package/dist/types/transform/coerce.d.ts.map +1 -0
  119. package/dist/types/transform/index.d.ts +4 -0
  120. package/dist/types/transform/index.d.ts.map +1 -0
  121. package/dist/types/transform/pipe.d.ts +44 -0
  122. package/dist/types/transform/pipe.d.ts.map +1 -0
  123. package/dist/types/transform/sanitize.d.ts +108 -0
  124. package/dist/types/transform/sanitize.d.ts.map +1 -0
  125. package/dist/types/utils/errors.d.ts +51 -0
  126. package/dist/types/utils/errors.d.ts.map +1 -0
  127. package/dist/types/utils/types.d.ts +29 -0
  128. package/dist/types/utils/types.d.ts.map +1 -0
  129. 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
+ * // '&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'
115
+ * ```
116
+ */
117
+ function escapeHtml(value) {
118
+ const escapeMap = {
119
+ '&': '&amp;',
120
+ '<': '&lt;',
121
+ '>': '&gt;',
122
+ '"': '&quot;',
123
+ "'": '&#x27;',
124
+ '`': '&#x60;',
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
+ '&amp;': '&',
134
+ '&lt;': '<',
135
+ '&gt;': '>',
136
+ '&quot;': '"',
137
+ '&#x27;': "'",
138
+ '&#x60;': '`',
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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"}