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 @@
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
+ * // '&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'
92
+ * ```
93
+ */
94
+ export function escapeHtml(value) {
95
+ const escapeMap = {
96
+ '&': '&amp;',
97
+ '<': '&lt;',
98
+ '>': '&gt;',
99
+ '"': '&quot;',
100
+ "'": '&#x27;',
101
+ '`': '&#x60;',
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
+ '&amp;': '&',
111
+ '&lt;': '<',
112
+ '&gt;': '>',
113
+ '&quot;': '"',
114
+ '&#x27;': "'",
115
+ '&#x60;': '`',
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,5 @@
1
+ // ============================================================================
2
+ // Guarden — Shared TypeScript Utility Types
3
+ // ============================================================================
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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,3 @@
1
+ export { assert, assertDefined, assertNonNull, assertType, assertTruthy, } from './assertions.js';
2
+ export { invariant, unreachable } from './invariant.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { createEnv, envString, envNumber, envBoolean, envEnum, EnvField, } from './schema.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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