From c6ff4a9d2547b25c18afceff7f839283908df182 Mon Sep 17 00:00:00 2001 From: "P. Reis" Date: Fri, 1 Nov 2024 23:07:51 -0300 Subject: [PATCH] feat: add sizesSchema --- src/schema.test.ts | 11 ++++++++++- src/schema.ts | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/schema.test.ts b/src/schema.test.ts index c6b577de..66809c53 100644 --- a/src/schema.test.ts +++ b/src/schema.test.ts @@ -1,6 +1,6 @@ import { assertEquals } from '@std/assert'; -import { percentageSchema } from '@/schema.ts'; +import { percentageSchema, sizesSchema } from '@/schema.ts'; Deno.test('Value is any percentage from 1 to 100', () => { assertEquals(percentageSchema.safeParse('latvia' as unknown).success, false); @@ -20,3 +20,12 @@ Deno.test('Value is any percentage from 1 to 100', () => { assertEquals(percentageSchema.safeParse('1e1').success, true); }); + +Deno.test('Size or sizes has correct format', () => { + assertEquals(sizesSchema.safeParse('orphan' as unknown).success, false); + assertEquals(sizesSchema.safeParse('0000x 20x20' as unknown).success, false); + assertEquals(sizesSchema.safeParse('0000x10 20X20 1x22' as unknown).success, false); + assertEquals(sizesSchema.safeParse('1000x10 20X20 1x22' as unknown).success, true); + assertEquals(sizesSchema.safeParse('3333X6666 1x22 f' as unknown).success, false); + assertEquals(sizesSchema.safeParse('11xxxxxxx0 20X20 1x22' as unknown).success, false); +}); diff --git a/src/schema.ts b/src/schema.ts index a9dd56e3..23e2938d 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -65,6 +65,9 @@ const localeSchema = z.string().transform((val, ctx) => { } }); +/** White-space separated list of sizes, each in the format x or with "X" in upper case. */ +const sizesSchema = z.string().regex(/^(?:[1-9]\d{0,3}[xX][1-9]\d{0,3})(?:\s+[1-9]\d{0,3}[xX][1-9]\d{0,3})*$/); + export { booleanParamSchema, decode64Schema, @@ -75,4 +78,5 @@ export { localeSchema, percentageSchema, safeUrlSchema, + sizesSchema, };