From 5f6cdaf7d5b55839953684169657047b37ad678d Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 15 Feb 2025 16:37:33 -0600 Subject: [PATCH] config: refactor schemas into a separate file --- packages/config/DittoConfig.ts | 12 +----------- packages/config/utils/schema.test.ts | 17 +++++++++++++++++ packages/config/utils/schema.ts | 11 +++++++++++ 3 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 packages/config/utils/schema.test.ts create mode 100644 packages/config/utils/schema.ts diff --git a/packages/config/DittoConfig.ts b/packages/config/DittoConfig.ts index 2aee123f..b11ca681 100644 --- a/packages/config/DittoConfig.ts +++ b/packages/config/DittoConfig.ts @@ -1,11 +1,11 @@ import os from 'node:os'; import ISO6391, { type LanguageCode } from 'iso-639-1'; import { getPublicKey, nip19 } from 'nostr-tools'; -import { z } from 'zod'; import { decodeBase64 } from '@std/encoding/base64'; import { encodeBase64Url } from '@std/encoding/base64url'; import { getEcdsaPublicKey } from './utils/crypto.ts'; +import { optionalBooleanSchema, optionalNumberSchema } from './utils/schema.ts'; /** Ditto application-wide configuration. */ export class DittoConfig { @@ -462,16 +462,6 @@ export class DittoConfig { } } -const optionalBooleanSchema = z - .enum(['true', 'false']) - .optional() - .transform((value) => value !== undefined ? value === 'true' : undefined); - -const optionalNumberSchema = z - .string() - .optional() - .transform((value) => value !== undefined ? Number(value) : undefined); - function mergePaths(base: string, path: string) { const url = new URL( path.startsWith('/') ? path : new URL(path).pathname, diff --git a/packages/config/utils/schema.test.ts b/packages/config/utils/schema.test.ts new file mode 100644 index 00000000..9a52efe0 --- /dev/null +++ b/packages/config/utils/schema.test.ts @@ -0,0 +1,17 @@ +import { assertEquals, assertThrows } from '@std/assert'; + +import { optionalBooleanSchema, optionalNumberSchema } from './schema.ts'; + +Deno.test('optionalBooleanSchema', () => { + assertEquals(optionalBooleanSchema.parse('true'), true); + assertEquals(optionalBooleanSchema.parse('false'), false); + assertEquals(optionalBooleanSchema.parse(undefined), undefined); + + assertThrows(() => optionalBooleanSchema.parse('invalid')); +}); + +Deno.test('optionalNumberSchema', () => { + assertEquals(optionalNumberSchema.parse('123'), 123); + assertEquals(optionalNumberSchema.parse('invalid'), NaN); // maybe this should throw? + assertEquals(optionalNumberSchema.parse(undefined), undefined); +}); diff --git a/packages/config/utils/schema.ts b/packages/config/utils/schema.ts new file mode 100644 index 00000000..dcd1f85e --- /dev/null +++ b/packages/config/utils/schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +export const optionalBooleanSchema = z + .enum(['true', 'false']) + .optional() + .transform((value) => value !== undefined ? value === 'true' : undefined); + +export const optionalNumberSchema = z + .string() + .optional() + .transform((value) => value !== undefined ? Number(value) : undefined);