1import assert from "node:assert/strict"
2import * as v from "valibot"
3import { invalidData, validData, validDataWithExtras } from "./data.ts"
4
5const shape = {
6 number: v.number(),
7 negNumber: v.number(),
8 maxNumber: v.number(),
9 string: v.string(),
10 longString: v.string(),
11 boolean: v.boolean(),
12 deeplyNested: v.object({
13 foo: v.string(),
14 num: v.number(),
15 bool: v.boolean()
16 })
17}
18
19const parseSchema = v.object(shape)
20const guardSchema = v.looseObject({ ...shape, deeplyNested: v.looseObject(shape.deeplyNested.entries) })
21
22const parseCase = (input: unknown, invalid = false) => () => ({
23 run: invalid
24 ? () => {
25 try {
26 v.parse(parseSchema, input)
27 return false
28 } catch {
29 return true
30 }
31 }
32 : () => v.parse(parseSchema, input),
33 validate: invalid
34 ? (result: unknown) => assert.equal(result, true)
35 : (result: unknown) => assert.deepEqual(result, validData)
36})
37
38const guardCase = (input: unknown, expected: boolean) => () => ({
39 run: expected
40 ? () => {
41 if (!v.is(guardSchema, input)) throw new Error("Invalid")
42 return true
43 }
44 : () => v.is(guardSchema, input),
45 validate: (result: unknown) => assert.equal(result, expected)
46})
47
48export const parseValid = parseCase(validData)
49export const parseExtraValid = parseCase(validDataWithExtras)
50export const parseInvalid = parseCase(invalidData, true)
51export const isValid = guardCase(validData, true)
52export const isExtraValid = guardCase(validDataWithExtras, true)
53export const isInvalid = guardCase(invalidData, false)