From f9134bbadf81f4b9c175ebb8897ea98957e3d4a0 Mon Sep 17 00:00:00 2001 From: Haydn Paterson Date: Mon, 7 Oct 2024 12:08:27 +0900 Subject: [PATCH] Revision 0.33.15 (#1025) * Add Resolver for Default Date * Version * ChangeLog --- changelog/0.33.0.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- src/type/guard/value.ts | 7 +++++++ src/value/default/default.ts | 8 +++++++- src/value/guard/guard.ts | 7 +++++-- test/runtime/value/default/date.ts | 18 ++++++++++++++++++ 7 files changed, 42 insertions(+), 6 deletions(-) diff --git a/changelog/0.33.0.md b/changelog/0.33.0.md index 62359cffb..dbdff7da1 100644 --- a/changelog/0.33.0.md +++ b/changelog/0.33.0.md @@ -1,4 +1,6 @@ ### 0.33.0 +- [Revision 0.33.15](https://github.com/sinclairzx81/typebox/pull/1025) + - [1024](https://github.com/sinclairzx81/typebox/issues/1024) Fix to correctly resolve default Dates - [Revision 0.33.14](https://github.com/sinclairzx81/typebox/pull/1019) - [1019](https://github.com/sinclairzx81/typebox/pull/1019) Converting Large Numbers to BigInt - [Revision 0.33.13](https://github.com/sinclairzx81/typebox/pull/1011) diff --git a/package-lock.json b/package-lock.json index a5a68959f..0971b4634 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@sinclair/typebox", - "version": "0.33.14", + "version": "0.33.15", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sinclair/typebox", - "version": "0.33.14", + "version": "0.33.15", "license": "MIT", "devDependencies": { "@arethetypeswrong/cli": "^0.13.2", diff --git a/package.json b/package.json index 0e27a7a75..a217221c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sinclair/typebox", - "version": "0.33.14", + "version": "0.33.15", "description": "Json Schema Type Builder with Static Type Resolution for TypeScript", "keywords": [ "typescript", diff --git a/src/type/guard/value.ts b/src/type/guard/value.ts index e0f63974a..4e4f9d1e2 100644 --- a/src/type/guard/value.ts +++ b/src/type/guard/value.ts @@ -26,6 +26,13 @@ THE SOFTWARE. ---------------------------------------------------------------------------*/ +// -------------------------------------------------------------------------- +// PropertyKey +// -------------------------------------------------------------------------- +/** Returns true if this value has this property key */ +export function HasPropertyKey(value: Record, key: K): value is Record & { [_ in K]: unknown } { + return key in value +} // -------------------------------------------------------------------------- // Object Instances // -------------------------------------------------------------------------- diff --git a/src/value/default/default.ts b/src/value/default/default.ts index d12b40338..19b4b6496 100644 --- a/src/value/default/default.ts +++ b/src/value/default/default.ts @@ -44,7 +44,7 @@ import type { TUnion } from '../../type/union/index' // ------------------------------------------------------------------ // ValueGuard // ------------------------------------------------------------------ -import { IsFunction, IsObject, IsArray, IsUndefined, HasPropertyKey } from '../guard/index' +import { IsArray, IsDate, IsFunction, IsObject, IsUndefined, HasPropertyKey } from '../guard/index' // ------------------------------------------------------------------ // TypeGuard // ------------------------------------------------------------------ @@ -74,6 +74,10 @@ function FromArray(schema: TArray, references: TSchema[], value: unknown): any { } return defaulted } +function FromDate(schema: TArray, references: TSchema[], value: unknown): any { + // special case intercept for dates + return IsDate(value) ? value : ValueOrDefault(schema, value) +} function FromIntersect(schema: TIntersect, references: TSchema[], value: unknown): any { const defaulted = ValueOrDefault(schema, value) return schema.allOf.reduce((acc, schema) => { @@ -155,6 +159,8 @@ function Visit(schema: TSchema, references: TSchema[], value: unknown): any { switch (schema_[Kind]) { case 'Array': return FromArray(schema_, references_, value) + case 'Date': + return FromDate(schema_, references_, value) case 'Intersect': return FromIntersect(schema_, references_, value) case 'Object': diff --git a/src/value/guard/guard.ts b/src/value/guard/guard.ts index 942560b78..8d5fa25d0 100644 --- a/src/value/guard/guard.ts +++ b/src/value/guard/guard.ts @@ -139,12 +139,15 @@ export function IsBigUint64Array(value: unknown): value is BigUint64Array { return value instanceof globalThis.BigUint64Array } // -------------------------------------------------------------------------- -// Standard +// PropertyKey // -------------------------------------------------------------------------- /** Returns true if this value has this property key */ -export function HasPropertyKey(value: Record, key: K): value is ObjectType & Record { +export function HasPropertyKey(value: Record, key: K): value is Record & { [_ in K]: unknown } { return key in value } +// -------------------------------------------------------------------------- +// Standard +// -------------------------------------------------------------------------- /** Returns true of this value is an object type */ export function IsObject(value: unknown): value is ObjectType { return value !== null && typeof value === 'object' diff --git a/test/runtime/value/default/date.ts b/test/runtime/value/default/date.ts index 2522cf20d..72b95c0b4 100644 --- a/test/runtime/value/default/date.ts +++ b/test/runtime/value/default/date.ts @@ -13,4 +13,22 @@ describe('value/default/Date', () => { const R = Value.Default(T, null) Assert.IsEqual(R, null) }) + // ---------------------------------------------------------------- + // https://github.com/sinclairzx81/typebox/issues/1024 + // ---------------------------------------------------------------- + it('Should use value if Date is valid', () => { + const T = Type.Date({ default: new Date(1) }) + const R = Value.Default(T, new Date(2)) as Date + Assert.IsEqual(R.getTime(), 2) + }) + it('Should use default if Date is undefined', () => { + const T = Type.Date({ default: new Date(1) }) + const R = Value.Default(T, undefined) as Date + Assert.IsEqual(R.getTime(), 1) + }) + it('Should use value if Date is invalid', () => { + const T = Type.Date({ default: new Date(1) }) + const R = Value.Default(T, null) + Assert.IsEqual(R, null) + }) })