From 06a4263c587e9dbbd1a2cc82204befacb7466274 Mon Sep 17 00:00:00 2001 From: Alec Larson <1925840+aleclarson@users.noreply.github.com> Date: Sat, 9 Mar 2024 00:25:18 -0500 Subject: [PATCH] fix: respect Optional in Transform.Encode/Decode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a Transform is optional and the value is undefined, let‘s avoid calling the Encode/Decode callbacks at all so they don‘t have to be responsible for how undefined values are handled (well, when Optional is used at least). --- src/value/transform/decode.ts | 10 ++++++++-- src/value/transform/encode.ts | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/value/transform/decode.ts b/src/value/transform/decode.ts index 3169293a..a71f4025 100644 --- a/src/value/transform/decode.ts +++ b/src/value/transform/decode.ts @@ -52,7 +52,7 @@ import { IsStandardObject, IsArray, IsValueType } from '../guard/index' // ------------------------------------------------------------------ // TypeGuard // ------------------------------------------------------------------ -import { IsTransform, IsSchema } from '../../type/guard/type' +import { IsTransform, IsSchema, IsOptional } from '../../type/guard/type' // ------------------------------------------------------------------ // Errors // ------------------------------------------------------------------ @@ -73,7 +73,13 @@ export class TransformDecodeError extends TypeBoxError { // prettier-ignore function Default(schema: TSchema, value: any) { try { - return IsTransform(schema) ? schema[TransformKind].Decode(value) : value + if (IsTransform(schema)) { + if (IsOptional(schema) && value === undefined) { + return undefined + } + return schema[TransformKind].Decode(value) + } + return value } catch (error) { throw new TransformDecodeError(schema, value, error) } diff --git a/src/value/transform/encode.ts b/src/value/transform/encode.ts index 695a7ea7..dc699a06 100644 --- a/src/value/transform/encode.ts +++ b/src/value/transform/encode.ts @@ -52,7 +52,7 @@ import { IsStandardObject, IsArray, IsValueType } from '../guard/index' // ------------------------------------------------------------------ // TypeGuard // ------------------------------------------------------------------ -import { IsTransform, IsSchema } from '../../type/guard/type' +import { IsTransform, IsSchema, IsOptional } from '../../type/guard/type' // ------------------------------------------------------------------ // Errors // ------------------------------------------------------------------ @@ -72,7 +72,13 @@ export class TransformEncodeError extends TypeBoxError { // prettier-ignore function Default(schema: TSchema, value: any) { try { - return IsTransform(schema) ? schema[TransformKind].Encode(value) : value + if (IsTransform(schema)) { + if (IsOptional(schema) && value === undefined) { + return undefined + } + return schema[TransformKind].Encode(value) + } + return value } catch (error) { throw new TransformEncodeError(schema, value, error) }