typetify 0.1.1

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 (185) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +327 -0
  3. package/dist/async/index.d.mts +152 -0
  4. package/dist/async/index.d.ts +152 -0
  5. package/dist/async/index.js +49 -0
  6. package/dist/async/index.js.map +1 -0
  7. package/dist/async/index.mjs +4 -0
  8. package/dist/async/index.mjs.map +1 -0
  9. package/dist/chunk-2LJ6NZ6K.js +108 -0
  10. package/dist/chunk-2LJ6NZ6K.js.map +1 -0
  11. package/dist/chunk-44Y5JSGU.js +145 -0
  12. package/dist/chunk-44Y5JSGU.js.map +1 -0
  13. package/dist/chunk-4NXETABV.mjs +116 -0
  14. package/dist/chunk-4NXETABV.mjs.map +1 -0
  15. package/dist/chunk-6ZBTL74K.js +129 -0
  16. package/dist/chunk-6ZBTL74K.js.map +1 -0
  17. package/dist/chunk-CN3GYRJN.mjs +137 -0
  18. package/dist/chunk-CN3GYRJN.mjs.map +1 -0
  19. package/dist/chunk-CNTE6ZVH.js +359 -0
  20. package/dist/chunk-CNTE6ZVH.js.map +1 -0
  21. package/dist/chunk-DBENOSTA.js +156 -0
  22. package/dist/chunk-DBENOSTA.js.map +1 -0
  23. package/dist/chunk-DWIG5GF2.js +135 -0
  24. package/dist/chunk-DWIG5GF2.js.map +1 -0
  25. package/dist/chunk-EAUTTWTQ.mjs +231 -0
  26. package/dist/chunk-EAUTTWTQ.mjs.map +1 -0
  27. package/dist/chunk-FXWYPHA3.mjs +13 -0
  28. package/dist/chunk-FXWYPHA3.mjs.map +1 -0
  29. package/dist/chunk-GS3PP67B.js +200 -0
  30. package/dist/chunk-GS3PP67B.js.map +1 -0
  31. package/dist/chunk-J5LGTIGS.mjs +9 -0
  32. package/dist/chunk-J5LGTIGS.mjs.map +1 -0
  33. package/dist/chunk-JAOGY4JO.mjs +1007 -0
  34. package/dist/chunk-JAOGY4JO.mjs.map +1 -0
  35. package/dist/chunk-JB6UXRKD.mjs +97 -0
  36. package/dist/chunk-JB6UXRKD.mjs.map +1 -0
  37. package/dist/chunk-JQHUBZ4M.js +88 -0
  38. package/dist/chunk-JQHUBZ4M.js.map +1 -0
  39. package/dist/chunk-L3M7LGKL.mjs +128 -0
  40. package/dist/chunk-L3M7LGKL.mjs.map +1 -0
  41. package/dist/chunk-LT7JK7RJ.js +87 -0
  42. package/dist/chunk-LT7JK7RJ.js.map +1 -0
  43. package/dist/chunk-OEJK37LO.mjs +328 -0
  44. package/dist/chunk-OEJK37LO.mjs.map +1 -0
  45. package/dist/chunk-OPVES6W2.js +16 -0
  46. package/dist/chunk-OPVES6W2.js.map +1 -0
  47. package/dist/chunk-OWNUKWXV.js +291 -0
  48. package/dist/chunk-OWNUKWXV.js.map +1 -0
  49. package/dist/chunk-PQTXSQ4P.js +369 -0
  50. package/dist/chunk-PQTXSQ4P.js.map +1 -0
  51. package/dist/chunk-PZ5AY32C.js +11 -0
  52. package/dist/chunk-PZ5AY32C.js.map +1 -0
  53. package/dist/chunk-QFR7DVAJ.mjs +63 -0
  54. package/dist/chunk-QFR7DVAJ.mjs.map +1 -0
  55. package/dist/chunk-SGQNLTRK.js +73 -0
  56. package/dist/chunk-SGQNLTRK.js.map +1 -0
  57. package/dist/chunk-SIA5BSVY.js +1054 -0
  58. package/dist/chunk-SIA5BSVY.js.map +1 -0
  59. package/dist/chunk-SRDWUHDY.mjs +188 -0
  60. package/dist/chunk-SRDWUHDY.mjs.map +1 -0
  61. package/dist/chunk-TXU7NTT4.js +249 -0
  62. package/dist/chunk-TXU7NTT4.js.map +1 -0
  63. package/dist/chunk-TZEWREAC.mjs +277 -0
  64. package/dist/chunk-TZEWREAC.mjs.map +1 -0
  65. package/dist/chunk-V6CWFDIJ.mjs +123 -0
  66. package/dist/chunk-V6CWFDIJ.mjs.map +1 -0
  67. package/dist/chunk-YBJC5WMX.mjs +341 -0
  68. package/dist/chunk-YBJC5WMX.mjs.map +1 -0
  69. package/dist/chunk-YOPAXITF.mjs +75 -0
  70. package/dist/chunk-YOPAXITF.mjs.map +1 -0
  71. package/dist/chunk-ZE4FDBRI.mjs +79 -0
  72. package/dist/chunk-ZE4FDBRI.mjs.map +1 -0
  73. package/dist/collection/index.d.mts +291 -0
  74. package/dist/collection/index.d.ts +291 -0
  75. package/dist/collection/index.js +125 -0
  76. package/dist/collection/index.js.map +1 -0
  77. package/dist/collection/index.mjs +4 -0
  78. package/dist/collection/index.mjs.map +1 -0
  79. package/dist/core/index.d.mts +85 -0
  80. package/dist/core/index.d.ts +85 -0
  81. package/dist/core/index.js +41 -0
  82. package/dist/core/index.js.map +1 -0
  83. package/dist/core/index.mjs +4 -0
  84. package/dist/core/index.mjs.map +1 -0
  85. package/dist/decorator/index.d.mts +165 -0
  86. package/dist/decorator/index.d.ts +165 -0
  87. package/dist/decorator/index.js +57 -0
  88. package/dist/decorator/index.js.map +1 -0
  89. package/dist/decorator/index.mjs +4 -0
  90. package/dist/decorator/index.mjs.map +1 -0
  91. package/dist/dx/index.d.mts +125 -0
  92. package/dist/dx/index.d.ts +125 -0
  93. package/dist/dx/index.js +53 -0
  94. package/dist/dx/index.js.map +1 -0
  95. package/dist/dx/index.mjs +4 -0
  96. package/dist/dx/index.mjs.map +1 -0
  97. package/dist/flow/index.d.mts +165 -0
  98. package/dist/flow/index.d.ts +165 -0
  99. package/dist/flow/index.js +50 -0
  100. package/dist/flow/index.js.map +1 -0
  101. package/dist/flow/index.mjs +5 -0
  102. package/dist/flow/index.mjs.map +1 -0
  103. package/dist/fn/index.d.mts +77 -0
  104. package/dist/fn/index.d.ts +77 -0
  105. package/dist/fn/index.js +37 -0
  106. package/dist/fn/index.js.map +1 -0
  107. package/dist/fn/index.mjs +4 -0
  108. package/dist/fn/index.mjs.map +1 -0
  109. package/dist/guards/index.d.mts +165 -0
  110. package/dist/guards/index.d.ts +165 -0
  111. package/dist/guards/index.js +69 -0
  112. package/dist/guards/index.js.map +1 -0
  113. package/dist/guards/index.mjs +4 -0
  114. package/dist/guards/index.mjs.map +1 -0
  115. package/dist/index.d.mts +228 -0
  116. package/dist/index.d.ts +228 -0
  117. package/dist/index.js +775 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/index.mjs +51 -0
  120. package/dist/index.mjs.map +1 -0
  121. package/dist/input/index.d.mts +185 -0
  122. package/dist/input/index.d.ts +185 -0
  123. package/dist/input/index.js +74 -0
  124. package/dist/input/index.js.map +1 -0
  125. package/dist/input/index.mjs +5 -0
  126. package/dist/input/index.mjs.map +1 -0
  127. package/dist/iterator/index.d.mts +209 -0
  128. package/dist/iterator/index.d.ts +209 -0
  129. package/dist/iterator/index.js +522 -0
  130. package/dist/iterator/index.js.map +1 -0
  131. package/dist/iterator/index.mjs +502 -0
  132. package/dist/iterator/index.mjs.map +1 -0
  133. package/dist/logic/index.d.mts +531 -0
  134. package/dist/logic/index.d.ts +531 -0
  135. package/dist/logic/index.js +416 -0
  136. package/dist/logic/index.js.map +1 -0
  137. package/dist/logic/index.mjs +367 -0
  138. package/dist/logic/index.mjs.map +1 -0
  139. package/dist/math/index.d.mts +86 -0
  140. package/dist/math/index.d.ts +86 -0
  141. package/dist/math/index.js +45 -0
  142. package/dist/math/index.js.map +1 -0
  143. package/dist/math/index.mjs +4 -0
  144. package/dist/math/index.mjs.map +1 -0
  145. package/dist/narrowing/index.d.mts +429 -0
  146. package/dist/narrowing/index.d.ts +429 -0
  147. package/dist/narrowing/index.js +220 -0
  148. package/dist/narrowing/index.js.map +1 -0
  149. package/dist/narrowing/index.mjs +186 -0
  150. package/dist/narrowing/index.mjs.map +1 -0
  151. package/dist/object/index.d.mts +327 -0
  152. package/dist/object/index.d.ts +327 -0
  153. package/dist/object/index.js +113 -0
  154. package/dist/object/index.js.map +1 -0
  155. package/dist/object/index.mjs +4 -0
  156. package/dist/object/index.mjs.map +1 -0
  157. package/dist/result/index.d.mts +201 -0
  158. package/dist/result/index.d.ts +201 -0
  159. package/dist/result/index.js +86 -0
  160. package/dist/result/index.js.map +1 -0
  161. package/dist/result/index.mjs +5 -0
  162. package/dist/result/index.mjs.map +1 -0
  163. package/dist/schema/index.d.mts +216 -0
  164. package/dist/schema/index.d.ts +216 -0
  165. package/dist/schema/index.js +410 -0
  166. package/dist/schema/index.js.map +1 -0
  167. package/dist/schema/index.mjs +384 -0
  168. package/dist/schema/index.mjs.map +1 -0
  169. package/dist/string/index.d.mts +102 -0
  170. package/dist/string/index.d.ts +102 -0
  171. package/dist/string/index.js +49 -0
  172. package/dist/string/index.js.map +1 -0
  173. package/dist/string/index.mjs +4 -0
  174. package/dist/string/index.mjs.map +1 -0
  175. package/dist/typed/index.d.mts +1962 -0
  176. package/dist/typed/index.d.ts +1962 -0
  177. package/dist/typed/index.js +193 -0
  178. package/dist/typed/index.js.map +1 -0
  179. package/dist/typed/index.mjs +4 -0
  180. package/dist/typed/index.mjs.map +1 -0
  181. package/dist/types-Db0vauC3.d.mts +258 -0
  182. package/dist/types-Db0vauC3.d.ts +258 -0
  183. package/dist/types-VsDp2t8s.d.mts +30 -0
  184. package/dist/types-VsDp2t8s.d.ts +30 -0
  185. package/package.json +157 -0
@@ -0,0 +1,384 @@
1
+ import { err, ok } from '../chunk-FXWYPHA3.mjs';
2
+ import '../chunk-J5LGTIGS.mjs';
3
+
4
+ // src/schema/base.ts
5
+ function createSchema(tag, validate2) {
6
+ const schema = {
7
+ _type: void 0,
8
+ _tag: tag,
9
+ _validate: validate2,
10
+ parse(value) {
11
+ const result = this._validate(value, []);
12
+ if (result.ok) {
13
+ return result.value;
14
+ }
15
+ const errors = result.error;
16
+ const message = errors.map(
17
+ (e) => e.path.length > 0 ? `${e.path.join(".")}: ${e.message}` : e.message
18
+ ).join("; ");
19
+ throw new TypeError(`Validation failed: ${message}`);
20
+ },
21
+ safeParse(value) {
22
+ return this._validate(value, []);
23
+ },
24
+ is(value) {
25
+ return this._validate(value, []).ok;
26
+ },
27
+ optional() {
28
+ return createSchema(
29
+ `${tag} | undefined`,
30
+ (value, path) => {
31
+ if (value === void 0) {
32
+ return ok(void 0);
33
+ }
34
+ return validate2(value, path);
35
+ }
36
+ );
37
+ },
38
+ nullable() {
39
+ return createSchema(
40
+ `${tag} | null`,
41
+ (value, path) => {
42
+ if (value === null) {
43
+ return ok(null);
44
+ }
45
+ return validate2(value, path);
46
+ }
47
+ );
48
+ },
49
+ default(defaultValue) {
50
+ return createSchema(
51
+ tag,
52
+ (value, path) => {
53
+ if (value === void 0) {
54
+ return ok(defaultValue);
55
+ }
56
+ return validate2(value, path);
57
+ }
58
+ );
59
+ },
60
+ transform(fn) {
61
+ return createSchema(
62
+ `transform(${tag})`,
63
+ (value, path) => {
64
+ const result = validate2(value, path);
65
+ if (!result.ok) {
66
+ return result;
67
+ }
68
+ try {
69
+ return ok(fn(result.value));
70
+ } catch (e) {
71
+ return err([{
72
+ path,
73
+ message: e instanceof Error ? e.message : "Transform failed",
74
+ expected: "valid transformation",
75
+ received: String(value)
76
+ }]);
77
+ }
78
+ }
79
+ );
80
+ },
81
+ refine(predicate, message = "Refinement failed") {
82
+ return createSchema(
83
+ `refine(${tag})`,
84
+ (value, path) => {
85
+ const result = validate2(value, path);
86
+ if (!result.ok) {
87
+ return result;
88
+ }
89
+ if (!predicate(result.value)) {
90
+ return err([{
91
+ path,
92
+ message,
93
+ expected: "value passing refinement",
94
+ received: String(value)
95
+ }]);
96
+ }
97
+ return result;
98
+ }
99
+ );
100
+ }
101
+ };
102
+ return schema;
103
+ }
104
+ function validationError(path, message, expected, received) {
105
+ return {
106
+ path,
107
+ message,
108
+ expected,
109
+ received: typeof received === "object" ? JSON.stringify(received)?.slice(0, 50) ?? "object" : String(received)
110
+ };
111
+ }
112
+
113
+ // src/schema/schemas.ts
114
+ function string() {
115
+ return createSchema("string", (value, path) => {
116
+ if (typeof value === "string") {
117
+ return ok(value);
118
+ }
119
+ return err([validationError(path, "Expected string", "string", value)]);
120
+ });
121
+ }
122
+ function number() {
123
+ return createSchema("number", (value, path) => {
124
+ if (typeof value === "number" && !Number.isNaN(value)) {
125
+ return ok(value);
126
+ }
127
+ return err([validationError(path, "Expected number", "number", value)]);
128
+ });
129
+ }
130
+ function boolean() {
131
+ return createSchema("boolean", (value, path) => {
132
+ if (typeof value === "boolean") {
133
+ return ok(value);
134
+ }
135
+ return err([validationError(path, "Expected boolean", "boolean", value)]);
136
+ });
137
+ }
138
+ function literal(expected) {
139
+ return createSchema(`literal(${JSON.stringify(expected)})`, (value, path) => {
140
+ if (value === expected) {
141
+ return ok(expected);
142
+ }
143
+ return err([validationError(path, `Expected ${JSON.stringify(expected)}`, String(expected), value)]);
144
+ });
145
+ }
146
+ function array(itemSchema) {
147
+ const impl = itemSchema;
148
+ return createSchema(`array(${impl._tag})`, (value, path) => {
149
+ if (!Array.isArray(value)) {
150
+ return err([validationError(path, "Expected array", "array", value)]);
151
+ }
152
+ const results = [];
153
+ const errors = [];
154
+ for (let i = 0; i < value.length; i++) {
155
+ const result = impl._validate(value[i], [...path, i]);
156
+ if (result.ok) {
157
+ results.push(result.value);
158
+ } else {
159
+ errors.push(...result.error);
160
+ }
161
+ }
162
+ if (errors.length > 0) {
163
+ return err(errors);
164
+ }
165
+ return ok(results);
166
+ });
167
+ }
168
+ function object(shape) {
169
+ const shapeEntries = Object.entries(shape);
170
+ const tag = `object({ ${shapeEntries.map(([k, v]) => `${k}: ${v._tag}`).join(", ")} })`;
171
+ return createSchema(tag, (value, path) => {
172
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
173
+ return err([validationError(path, "Expected object", "object", value)]);
174
+ }
175
+ const obj = value;
176
+ const result = {};
177
+ const errors = [];
178
+ for (const [key, schema] of shapeEntries) {
179
+ const fieldResult = schema._validate(obj[key], [...path, key]);
180
+ if (fieldResult.ok) {
181
+ result[key] = fieldResult.value;
182
+ } else {
183
+ errors.push(...fieldResult.error);
184
+ }
185
+ }
186
+ if (errors.length > 0) {
187
+ return err(errors);
188
+ }
189
+ return ok(result);
190
+ });
191
+ }
192
+ function optional(schema) {
193
+ return schema.optional();
194
+ }
195
+ function nullable(schema) {
196
+ return schema.nullable();
197
+ }
198
+ function union(schemas) {
199
+ const impls = schemas;
200
+ const tag = `union(${impls.map((s) => s._tag).join(" | ")})`;
201
+ return createSchema(tag, (value, path) => {
202
+ for (const schema of impls) {
203
+ const result = schema._validate(value, path);
204
+ if (result.ok) {
205
+ return ok(result.value);
206
+ }
207
+ }
208
+ return err([validationError(
209
+ path,
210
+ `Expected one of: ${impls.map((s) => s._tag).join(", ")}`,
211
+ tag,
212
+ value
213
+ )]);
214
+ });
215
+ }
216
+ function intersection(schemaA, schemaB) {
217
+ const implA = schemaA;
218
+ const implB = schemaB;
219
+ const tag = `intersection(${implA._tag} & ${implB._tag})`;
220
+ return createSchema(tag, (value, path) => {
221
+ const resultA = implA._validate(value, path);
222
+ if (!resultA.ok) {
223
+ return resultA;
224
+ }
225
+ const resultB = implB._validate(value, path);
226
+ if (!resultB.ok) {
227
+ return resultB;
228
+ }
229
+ return ok({ ...resultA.value, ...resultB.value });
230
+ });
231
+ }
232
+ function record(valueSchema) {
233
+ const impl = valueSchema;
234
+ const tag = `record(${impl._tag})`;
235
+ return createSchema(tag, (value, path) => {
236
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
237
+ return err([validationError(path, "Expected object", "object", value)]);
238
+ }
239
+ const obj = value;
240
+ const result = {};
241
+ const errors = [];
242
+ for (const [key, val] of Object.entries(obj)) {
243
+ const fieldResult = impl._validate(val, [...path, key]);
244
+ if (fieldResult.ok) {
245
+ result[key] = fieldResult.value;
246
+ } else {
247
+ errors.push(...fieldResult.error);
248
+ }
249
+ }
250
+ if (errors.length > 0) {
251
+ return err(errors);
252
+ }
253
+ return ok(result);
254
+ });
255
+ }
256
+ function tuple(schemas) {
257
+ const impls = schemas;
258
+ const tag = `tuple([${impls.map((s) => s._tag).join(", ")}])`;
259
+ return createSchema(tag, (value, path) => {
260
+ if (!Array.isArray(value)) {
261
+ return err([validationError(path, "Expected array", "array", value)]);
262
+ }
263
+ if (value.length !== impls.length) {
264
+ return err([validationError(
265
+ path,
266
+ `Expected tuple of length ${impls.length}`,
267
+ `[${impls.map((s) => s._tag).join(", ")}]`,
268
+ value
269
+ )]);
270
+ }
271
+ const results = [];
272
+ const errors = [];
273
+ for (let i = 0; i < impls.length; i++) {
274
+ const result = impls[i]._validate(value[i], [...path, i]);
275
+ if (result.ok) {
276
+ results.push(result.value);
277
+ } else {
278
+ errors.push(...result.error);
279
+ }
280
+ }
281
+ if (errors.length > 0) {
282
+ return err(errors);
283
+ }
284
+ return ok(results);
285
+ });
286
+ }
287
+ function unknown() {
288
+ return createSchema("unknown", (value) => ok(value));
289
+ }
290
+ function any() {
291
+ return createSchema("any", (value) => ok(value));
292
+ }
293
+ function date() {
294
+ return createSchema("date", (value, path) => {
295
+ if (value instanceof Date && !Number.isNaN(value.getTime())) {
296
+ return ok(value);
297
+ }
298
+ if (typeof value === "string") {
299
+ const parsed = new Date(value);
300
+ if (!Number.isNaN(parsed.getTime())) {
301
+ return ok(parsed);
302
+ }
303
+ }
304
+ return err([validationError(path, "Expected valid date", "Date", value)]);
305
+ });
306
+ }
307
+ function email() {
308
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
309
+ return createSchema("email", (value, path) => {
310
+ if (typeof value !== "string") {
311
+ return err([validationError(path, "Expected string", "string", value)]);
312
+ }
313
+ if (!emailRegex.test(value)) {
314
+ return err([validationError(path, "Expected valid email", "email", value)]);
315
+ }
316
+ return ok(value);
317
+ });
318
+ }
319
+ function url() {
320
+ return createSchema("url", (value, path) => {
321
+ if (typeof value !== "string") {
322
+ return err([validationError(path, "Expected string", "string", value)]);
323
+ }
324
+ try {
325
+ new URL(value);
326
+ return ok(value);
327
+ } catch {
328
+ return err([validationError(path, "Expected valid URL", "url", value)]);
329
+ }
330
+ });
331
+ }
332
+ function uuid() {
333
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
334
+ return createSchema("uuid", (value, path) => {
335
+ if (typeof value !== "string") {
336
+ return err([validationError(path, "Expected string", "string", value)]);
337
+ }
338
+ if (!uuidRegex.test(value)) {
339
+ return err([validationError(path, "Expected valid UUID", "uuid", value)]);
340
+ }
341
+ return ok(value);
342
+ });
343
+ }
344
+
345
+ // src/schema/parse.ts
346
+ function parse(schema, value) {
347
+ return schema.parse(value);
348
+ }
349
+ function safeParse(schema, value) {
350
+ return schema.safeParse(value);
351
+ }
352
+ function validate(schema, value) {
353
+ const result = schema.safeParse(value);
354
+ return result.ok ? [] : result.error;
355
+ }
356
+ function is(schema, value) {
357
+ return schema.is(value);
358
+ }
359
+ function parseJson(schema, json) {
360
+ try {
361
+ const parsed = JSON.parse(json);
362
+ return safeParse(schema, parsed);
363
+ } catch (e) {
364
+ return {
365
+ ok: false,
366
+ error: [{
367
+ path: [],
368
+ message: e instanceof Error ? e.message : "Invalid JSON",
369
+ expected: "valid JSON",
370
+ received: json.slice(0, 50)
371
+ }]
372
+ };
373
+ }
374
+ }
375
+ function createGuard(schema) {
376
+ return (value) => schema.is(value);
377
+ }
378
+ function createParser(schema) {
379
+ return (value) => parse(schema, value);
380
+ }
381
+
382
+ export { any as anySchema, array, boolean, createGuard, createParser, date, email, intersection, is, literal, nullable, number, object, optional, parse, parseJson, record, safeParse, string, tuple, union, unknown as unknownSchema, url, uuid, validate };
383
+ //# sourceMappingURL=index.mjs.map
384
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schema/base.ts","../../src/schema/schemas.ts","../../src/schema/parse.ts"],"names":["validate"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Base schema implementation\n */\n\nimport type { Schema, SchemaImpl, ValidationResult, ValidationError } from './types'\nimport { ok } from '../result/ok'\nimport { err } from '../result/err'\n\nexport function createSchema<T>(\n tag: string,\n validate: (value: unknown, path: (string | number)[]) => ValidationResult<T>\n): SchemaImpl<T> {\n const schema: SchemaImpl<T> = {\n _type: undefined as unknown as T,\n _tag: tag,\n \n _validate: validate,\n \n parse(value: unknown): T {\n const result = this._validate(value, [])\n if (result.ok) {\n return result.value\n }\n const errors = result.error\n const message = errors.map(e => \n e.path.length > 0 \n ? `${e.path.join('.')}: ${e.message}`\n : e.message\n ).join('; ')\n throw new TypeError(`Validation failed: ${message}`)\n },\n \n safeParse(value: unknown): ValidationResult<T> {\n return this._validate(value, [])\n },\n \n is(value: unknown): value is T {\n return this._validate(value, []).ok\n },\n \n optional(): Schema<T | undefined> {\n return createSchema<T | undefined>(\n `${tag} | undefined`,\n (value, path) => {\n if (value === undefined) {\n return ok(undefined)\n }\n return validate(value, path) as ValidationResult<T | undefined>\n }\n )\n },\n \n nullable(): Schema<T | null> {\n return createSchema<T | null>(\n `${tag} | null`,\n (value, path) => {\n if (value === null) {\n return ok(null)\n }\n return validate(value, path) as ValidationResult<T | null>\n }\n )\n },\n \n default(defaultValue: T): Schema<T> {\n return createSchema<T>(\n tag,\n (value, path) => {\n if (value === undefined) {\n return ok(defaultValue)\n }\n return validate(value, path)\n }\n )\n },\n \n transform<U>(fn: (value: T) => U): Schema<U> {\n return createSchema<U>(\n `transform(${tag})`,\n (value, path) => {\n const result = validate(value, path)\n if (!result.ok) {\n return result as ValidationResult<U>\n }\n try {\n return ok(fn(result.value))\n } catch (e) {\n return err([{\n path,\n message: e instanceof Error ? e.message : 'Transform failed',\n expected: 'valid transformation',\n received: String(value),\n }])\n }\n }\n )\n },\n \n refine(predicate: (value: T) => boolean, message = 'Refinement failed'): Schema<T> {\n return createSchema<T>(\n `refine(${tag})`,\n (value, path) => {\n const result = validate(value, path)\n if (!result.ok) {\n return result\n }\n if (!predicate(result.value)) {\n return err([{\n path,\n message,\n expected: 'value passing refinement',\n received: String(value),\n }])\n }\n return result\n }\n )\n },\n }\n \n return schema\n}\n\nexport function validationError(\n path: (string | number)[],\n message: string,\n expected: string,\n received: unknown\n): ValidationError {\n return {\n path,\n message,\n expected,\n received: typeof received === 'object' \n ? JSON.stringify(received)?.slice(0, 50) ?? 'object'\n : String(received),\n }\n}\n","/**\n * Schema definitions for common types\n */\n\nimport type { Schema, SchemaImpl, ValidationResult } from './types'\nimport { createSchema, validationError } from './base'\nimport { ok } from '../result/ok'\nimport { err } from '../result/err'\n\n/**\n * String schema\n */\nexport function string(): Schema<string> {\n return createSchema<string>('string', (value, path) => {\n if (typeof value === 'string') {\n return ok(value)\n }\n return err([validationError(path, 'Expected string', 'string', value)])\n })\n}\n\n/**\n * Number schema (excludes NaN)\n */\nexport function number(): Schema<number> {\n return createSchema<number>('number', (value, path) => {\n if (typeof value === 'number' && !Number.isNaN(value)) {\n return ok(value)\n }\n return err([validationError(path, 'Expected number', 'number', value)])\n })\n}\n\n/**\n * Boolean schema\n */\nexport function boolean(): Schema<boolean> {\n return createSchema<boolean>('boolean', (value, path) => {\n if (typeof value === 'boolean') {\n return ok(value)\n }\n return err([validationError(path, 'Expected boolean', 'boolean', value)])\n })\n}\n\n/**\n * Literal schema for exact values\n */\nexport function literal<T extends string | number | boolean>(expected: T): Schema<T> {\n return createSchema<T>(`literal(${JSON.stringify(expected)})`, (value, path) => {\n if (value === expected) {\n return ok(expected)\n }\n return err([validationError(path, `Expected ${JSON.stringify(expected)}`, String(expected), value)])\n })\n}\n\n/**\n * Array schema\n */\nexport function array<T>(itemSchema: Schema<T>): Schema<T[]> {\n const impl = itemSchema as SchemaImpl<T>\n return createSchema<T[]>(`array(${impl._tag})`, (value, path) => {\n if (!Array.isArray(value)) {\n return err([validationError(path, 'Expected array', 'array', value)])\n }\n \n const results: T[] = []\n const errors: Array<{ path: (string | number)[]; message: string; expected: string; received: string }> = []\n \n for (let i = 0; i < value.length; i++) {\n const result = impl._validate(value[i], [...path, i])\n if (result.ok) {\n results.push(result.value)\n } else {\n errors.push(...result.error)\n }\n }\n \n if (errors.length > 0) {\n return err(errors)\n }\n \n return ok(results)\n })\n}\n\n/**\n * Object schema with shape definition\n */\nexport function object<T extends Record<string, Schema<unknown>>>(\n shape: T\n): Schema<{ [K in keyof T]: T[K] extends Schema<infer U> ? U : never }> {\n type Output = { [K in keyof T]: T[K] extends Schema<infer U> ? U : never }\n \n const shapeEntries = Object.entries(shape) as [string, SchemaImpl<unknown>][]\n const tag = `object({ ${shapeEntries.map(([k, v]) => `${k}: ${v._tag}`).join(', ')} })`\n \n return createSchema<Output>(tag, (value, path) => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return err([validationError(path, 'Expected object', 'object', value)])\n }\n \n const obj = value as Record<string, unknown>\n const result: Record<string, unknown> = {}\n const errors: Array<{ path: (string | number)[]; message: string; expected: string; received: string }> = []\n \n for (const [key, schema] of shapeEntries) {\n const fieldResult = schema._validate(obj[key], [...path, key])\n if (fieldResult.ok) {\n result[key] = fieldResult.value\n } else {\n errors.push(...fieldResult.error)\n }\n }\n \n if (errors.length > 0) {\n return err(errors)\n }\n \n return ok(result as Output)\n })\n}\n\n/**\n * Optional schema wrapper\n */\nexport function optional<T>(schema: Schema<T>): Schema<T | undefined> {\n return (schema as SchemaImpl<T>).optional()\n}\n\n/**\n * Nullable schema wrapper\n */\nexport function nullable<T>(schema: Schema<T>): Schema<T | null> {\n return (schema as SchemaImpl<T>).nullable()\n}\n\n/**\n * Union schema (oneOf)\n */\nexport function union<T extends readonly Schema<unknown>[]>(\n schemas: T\n): Schema<T[number] extends Schema<infer U> ? U : never> {\n type Output = T[number] extends Schema<infer U> ? U : never\n \n const impls = schemas as unknown as readonly SchemaImpl<unknown>[]\n const tag = `union(${impls.map(s => s._tag).join(' | ')})`\n \n return createSchema<Output>(tag, (value, path) => {\n for (const schema of impls) {\n const result = schema._validate(value, path)\n if (result.ok) {\n return ok(result.value as Output)\n }\n }\n \n return err([validationError(\n path, \n `Expected one of: ${impls.map(s => s._tag).join(', ')}`,\n tag,\n value\n )])\n })\n}\n\n/**\n * Intersection schema (allOf)\n */\nexport function intersection<A, B>(\n schemaA: Schema<A>,\n schemaB: Schema<B>\n): Schema<A & B> {\n const implA = schemaA as SchemaImpl<A>\n const implB = schemaB as SchemaImpl<B>\n const tag = `intersection(${implA._tag} & ${implB._tag})`\n \n return createSchema<A & B>(tag, (value, path) => {\n const resultA = implA._validate(value, path)\n if (!resultA.ok) {\n return resultA as ValidationResult<A & B>\n }\n \n const resultB = implB._validate(value, path)\n if (!resultB.ok) {\n return resultB as ValidationResult<A & B>\n }\n \n return ok({ ...resultA.value, ...resultB.value } as A & B)\n })\n}\n\n/**\n * Record schema (dictionary)\n */\nexport function record<V>(valueSchema: Schema<V>): Schema<Record<string, V>> {\n const impl = valueSchema as SchemaImpl<V>\n const tag = `record(${impl._tag})`\n \n return createSchema<Record<string, V>>(tag, (value, path) => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return err([validationError(path, 'Expected object', 'object', value)])\n }\n \n const obj = value as Record<string, unknown>\n const result: Record<string, V> = {}\n const errors: Array<{ path: (string | number)[]; message: string; expected: string; received: string }> = []\n \n for (const [key, val] of Object.entries(obj)) {\n const fieldResult = impl._validate(val, [...path, key])\n if (fieldResult.ok) {\n result[key] = fieldResult.value\n } else {\n errors.push(...fieldResult.error)\n }\n }\n \n if (errors.length > 0) {\n return err(errors)\n }\n \n return ok(result)\n })\n}\n\n/**\n * Tuple schema\n */\nexport function tuple<T extends readonly Schema<unknown>[]>(\n schemas: T\n): Schema<{ [K in keyof T]: T[K] extends Schema<infer U> ? U : never }> {\n type Output = { [K in keyof T]: T[K] extends Schema<infer U> ? U : never }\n \n const impls = schemas as unknown as readonly SchemaImpl<unknown>[]\n const tag = `tuple([${impls.map(s => s._tag).join(', ')}])`\n \n return createSchema<Output>(tag, (value, path) => {\n if (!Array.isArray(value)) {\n return err([validationError(path, 'Expected array', 'array', value)])\n }\n \n if (value.length !== impls.length) {\n return err([validationError(\n path, \n `Expected tuple of length ${impls.length}`,\n `[${impls.map(s => s._tag).join(', ')}]`,\n value\n )])\n }\n \n const results: unknown[] = []\n const errors: Array<{ path: (string | number)[]; message: string; expected: string; received: string }> = []\n \n for (let i = 0; i < impls.length; i++) {\n const result = impls[i]!._validate(value[i], [...path, i])\n if (result.ok) {\n results.push(result.value)\n } else {\n errors.push(...result.error)\n }\n }\n \n if (errors.length > 0) {\n return err(errors)\n }\n \n return ok(results as unknown as Output)\n })\n}\n\n/**\n * Unknown schema (accepts anything)\n */\nexport function unknown(): Schema<unknown> {\n return createSchema<unknown>('unknown', (value) => ok(value))\n}\n\n/**\n * Any schema (accepts anything, typed as any)\n */\nexport function any(): Schema<any> {\n return createSchema<any>('any', (value) => ok(value))\n}\n\n/**\n * Date schema (validates Date objects or ISO strings)\n */\nexport function date(): Schema<Date> {\n return createSchema<Date>('date', (value, path) => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) {\n return ok(value)\n }\n \n if (typeof value === 'string') {\n const parsed = new Date(value)\n if (!Number.isNaN(parsed.getTime())) {\n return ok(parsed)\n }\n }\n \n return err([validationError(path, 'Expected valid date', 'Date', value)])\n })\n}\n\n/**\n * Email schema (string with email format)\n */\nexport function email(): Schema<string> {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n \n return createSchema<string>('email', (value, path) => {\n if (typeof value !== 'string') {\n return err([validationError(path, 'Expected string', 'string', value)])\n }\n \n if (!emailRegex.test(value)) {\n return err([validationError(path, 'Expected valid email', 'email', value)])\n }\n \n return ok(value)\n })\n}\n\n/**\n * URL schema (string with URL format)\n */\nexport function url(): Schema<string> {\n return createSchema<string>('url', (value, path) => {\n if (typeof value !== 'string') {\n return err([validationError(path, 'Expected string', 'string', value)])\n }\n \n try {\n new URL(value)\n return ok(value)\n } catch {\n return err([validationError(path, 'Expected valid URL', 'url', value)])\n }\n })\n}\n\n/**\n * UUID schema (string with UUID format)\n */\nexport function uuid(): Schema<string> {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n \n return createSchema<string>('uuid', (value, path) => {\n if (typeof value !== 'string') {\n return err([validationError(path, 'Expected string', 'string', value)])\n }\n \n if (!uuidRegex.test(value)) {\n return err([validationError(path, 'Expected valid UUID', 'uuid', value)])\n }\n \n return ok(value)\n })\n}\n","/**\n * Parsing utilities for schemas\n */\n\nimport type { Schema, ValidationResult, Infer } from './types'\n\n/**\n * Parse a value with a schema, throwing on validation failure.\n * \n * @example\n * const UserSchema = object({\n * id: number(),\n * name: string(),\n * email: email()\n * })\n * \n * const user = parse(UserSchema, jsonData)\n * // Type: { id: number; name: string; email: string }\n * // Throws if validation fails\n */\nexport function parse<S extends Schema<unknown>>(\n schema: S,\n value: unknown\n): Infer<S> {\n return schema.parse(value) as Infer<S>\n}\n\n/**\n * Safely parse a value with a schema, returning a Result.\n * \n * @example\n * const result = safeParse(UserSchema, jsonData)\n * if (result.ok) {\n * console.log(result.value.name)\n * } else {\n * console.error(result.error)\n * }\n */\nexport function safeParse<S extends Schema<unknown>>(\n schema: S,\n value: unknown\n): ValidationResult<Infer<S>> {\n return schema.safeParse(value) as ValidationResult<Infer<S>>\n}\n\n/**\n * Validate a value against a schema, returning validation errors.\n * \n * @example\n * const errors = validate(UserSchema, jsonData)\n * if (errors.length === 0) {\n * // Valid\n * } else {\n * errors.forEach(e => console.error(`${e.path.join('.')}: ${e.message}`))\n * }\n */\nexport function validate<S extends Schema<unknown>>(\n schema: S,\n value: unknown\n): Array<{ path: (string | number)[]; message: string; expected: string; received: string }> {\n const result = schema.safeParse(value)\n return result.ok ? [] : result.error\n}\n\n/**\n * Type guard using a schema.\n * \n * @example\n * if (is(UserSchema, data)) {\n * // data is User\n * console.log(data.name)\n * }\n */\nexport function is<S extends Schema<unknown>>(\n schema: S,\n value: unknown\n): value is Infer<S> {\n return schema.is(value)\n}\n\n/**\n * Parse JSON string with schema validation.\n * Solves the \"JSON.parse returns any\" problem completely.\n * \n * @example\n * const UserSchema = object({\n * id: number(),\n * name: string()\n * })\n * \n * const result = parseJson(UserSchema, '{\"id\": 1, \"name\": \"John\"}')\n * if (result.ok) {\n * // result.value is { id: number; name: string }\n * }\n */\nexport function parseJson<S extends Schema<unknown>>(\n schema: S,\n json: string\n): ValidationResult<Infer<S>> {\n try {\n const parsed = JSON.parse(json)\n return safeParse(schema, parsed)\n } catch (e) {\n return {\n ok: false,\n error: [{\n path: [],\n message: e instanceof Error ? e.message : 'Invalid JSON',\n expected: 'valid JSON',\n received: json.slice(0, 50),\n }],\n }\n }\n}\n\n/**\n * Create a type guard function from a schema.\n * \n * @example\n * const isUser = createGuard(UserSchema)\n * \n * const users = items.filter(isUser)\n * // Type: User[]\n */\nexport function createGuard<S extends Schema<unknown>>(\n schema: S\n): (value: unknown) => value is Infer<S> {\n return (value: unknown): value is Infer<S> => schema.is(value)\n}\n\n/**\n * Create a parser function from a schema.\n * \n * @example\n * const parseUser = createParser(UserSchema)\n * \n * const user = parseUser(data)\n * // Throws if invalid\n */\nexport function createParser<S extends Schema<unknown>>(\n schema: S\n): (value: unknown) => Infer<S> {\n return (value: unknown) => parse(schema, value)\n}\n"]}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Capitalizes the first letter of a string.
3
+ * Returns the string with proper TypeScript literal type.
4
+ *
5
+ * @example
6
+ * capitalize('hello') // 'Hello'
7
+ * capitalize('WORLD') // 'WORLD'
8
+ */
9
+ declare function capitalize<T extends string>(str: T): Capitalize<T>;
10
+
11
+ /**
12
+ * Uncapitalizes the first letter of a string.
13
+ * Returns the string with proper TypeScript literal type.
14
+ *
15
+ * @example
16
+ * uncapitalize('Hello') // 'hello'
17
+ * uncapitalize('WORLD') // 'wORLD'
18
+ */
19
+ declare function uncapitalize<T extends string>(str: T): Uncapitalize<T>;
20
+
21
+ /**
22
+ * Converts a string to camelCase.
23
+ *
24
+ * @example
25
+ * camelCase('hello world') // 'helloWorld'
26
+ * camelCase('foo-bar') // 'fooBar'
27
+ * camelCase('FooBar') // 'fooBar'
28
+ */
29
+ declare function camelCase(str: string): string;
30
+
31
+ /**
32
+ * Converts a string to kebab-case.
33
+ *
34
+ * @example
35
+ * kebabCase('helloWorld') // 'hello-world'
36
+ * kebabCase('foo_bar') // 'foo-bar'
37
+ * kebabCase('FooBar') // 'foo-bar'
38
+ */
39
+ declare function kebabCase(str: string): string;
40
+
41
+ /**
42
+ * Converts a string to snake_case.
43
+ *
44
+ * @example
45
+ * snakeCase('helloWorld') // 'hello_world'
46
+ * snakeCase('foo-bar') // 'foo_bar'
47
+ * snakeCase('FooBar') // 'foo_bar'
48
+ */
49
+ declare function snakeCase(str: string): string;
50
+
51
+ /**
52
+ * Converts a string to PascalCase.
53
+ *
54
+ * @example
55
+ * pascalCase('hello world') // 'HelloWorld'
56
+ * pascalCase('foo-bar') // 'FooBar'
57
+ * pascalCase('fooBar') // 'FooBar'
58
+ */
59
+ declare function pascalCase(str: string): string;
60
+
61
+ /**
62
+ * Truncates a string to a specified length, adding a suffix if truncated.
63
+ *
64
+ * @example
65
+ * truncate('Hello World', 5) // 'Hello...'
66
+ * truncate('Hello World', 5, '…') // 'Hello…'
67
+ * truncate('Hi', 10) // 'Hi'
68
+ */
69
+ declare function truncate(str: string, length: number, suffix?: string): string;
70
+
71
+ /**
72
+ * Converts a string to a URL-friendly slug.
73
+ *
74
+ * @example
75
+ * slugify('Hello World!') // 'hello-world'
76
+ * slugify('Café Résumé') // 'cafe-resume'
77
+ * slugify(' Multiple Spaces ') // 'multiple-spaces'
78
+ */
79
+ declare function slugify(str: string): string;
80
+
81
+ /**
82
+ * Simple template string interpolation.
83
+ * Replaces {{key}} with values from the vars object.
84
+ *
85
+ * @example
86
+ * template('Hello {{name}}!', { name: 'World' }) // 'Hello World!'
87
+ * template('{{a}} + {{b}} = {{c}}', { a: 1, b: 2, c: 3 }) // '1 + 2 = 3'
88
+ */
89
+ declare function template(str: string, vars: Record<string, unknown>): string;
90
+
91
+ /**
92
+ * Splits a string into an array of words.
93
+ * Handles camelCase, PascalCase, snake_case, kebab-case, and spaces.
94
+ *
95
+ * @example
96
+ * words('helloWorld') // ['hello', 'World']
97
+ * words('foo-bar_baz') // ['foo', 'bar', 'baz']
98
+ * words('Hello World') // ['Hello', 'World']
99
+ */
100
+ declare function words(str: string): string[];
101
+
102
+ export { camelCase, capitalize, kebabCase, pascalCase, slugify, snakeCase, template, truncate, uncapitalize, words };
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Capitalizes the first letter of a string.
3
+ * Returns the string with proper TypeScript literal type.
4
+ *
5
+ * @example
6
+ * capitalize('hello') // 'Hello'
7
+ * capitalize('WORLD') // 'WORLD'
8
+ */
9
+ declare function capitalize<T extends string>(str: T): Capitalize<T>;
10
+
11
+ /**
12
+ * Uncapitalizes the first letter of a string.
13
+ * Returns the string with proper TypeScript literal type.
14
+ *
15
+ * @example
16
+ * uncapitalize('Hello') // 'hello'
17
+ * uncapitalize('WORLD') // 'wORLD'
18
+ */
19
+ declare function uncapitalize<T extends string>(str: T): Uncapitalize<T>;
20
+
21
+ /**
22
+ * Converts a string to camelCase.
23
+ *
24
+ * @example
25
+ * camelCase('hello world') // 'helloWorld'
26
+ * camelCase('foo-bar') // 'fooBar'
27
+ * camelCase('FooBar') // 'fooBar'
28
+ */
29
+ declare function camelCase(str: string): string;
30
+
31
+ /**
32
+ * Converts a string to kebab-case.
33
+ *
34
+ * @example
35
+ * kebabCase('helloWorld') // 'hello-world'
36
+ * kebabCase('foo_bar') // 'foo-bar'
37
+ * kebabCase('FooBar') // 'foo-bar'
38
+ */
39
+ declare function kebabCase(str: string): string;
40
+
41
+ /**
42
+ * Converts a string to snake_case.
43
+ *
44
+ * @example
45
+ * snakeCase('helloWorld') // 'hello_world'
46
+ * snakeCase('foo-bar') // 'foo_bar'
47
+ * snakeCase('FooBar') // 'foo_bar'
48
+ */
49
+ declare function snakeCase(str: string): string;
50
+
51
+ /**
52
+ * Converts a string to PascalCase.
53
+ *
54
+ * @example
55
+ * pascalCase('hello world') // 'HelloWorld'
56
+ * pascalCase('foo-bar') // 'FooBar'
57
+ * pascalCase('fooBar') // 'FooBar'
58
+ */
59
+ declare function pascalCase(str: string): string;
60
+
61
+ /**
62
+ * Truncates a string to a specified length, adding a suffix if truncated.
63
+ *
64
+ * @example
65
+ * truncate('Hello World', 5) // 'Hello...'
66
+ * truncate('Hello World', 5, '…') // 'Hello…'
67
+ * truncate('Hi', 10) // 'Hi'
68
+ */
69
+ declare function truncate(str: string, length: number, suffix?: string): string;
70
+
71
+ /**
72
+ * Converts a string to a URL-friendly slug.
73
+ *
74
+ * @example
75
+ * slugify('Hello World!') // 'hello-world'
76
+ * slugify('Café Résumé') // 'cafe-resume'
77
+ * slugify(' Multiple Spaces ') // 'multiple-spaces'
78
+ */
79
+ declare function slugify(str: string): string;
80
+
81
+ /**
82
+ * Simple template string interpolation.
83
+ * Replaces {{key}} with values from the vars object.
84
+ *
85
+ * @example
86
+ * template('Hello {{name}}!', { name: 'World' }) // 'Hello World!'
87
+ * template('{{a}} + {{b}} = {{c}}', { a: 1, b: 2, c: 3 }) // '1 + 2 = 3'
88
+ */
89
+ declare function template(str: string, vars: Record<string, unknown>): string;
90
+
91
+ /**
92
+ * Splits a string into an array of words.
93
+ * Handles camelCase, PascalCase, snake_case, kebab-case, and spaces.
94
+ *
95
+ * @example
96
+ * words('helloWorld') // ['hello', 'World']
97
+ * words('foo-bar_baz') // ['foo', 'bar', 'baz']
98
+ * words('Hello World') // ['Hello', 'World']
99
+ */
100
+ declare function words(str: string): string[];
101
+
102
+ export { camelCase, capitalize, kebabCase, pascalCase, slugify, snakeCase, template, truncate, uncapitalize, words };