Skip to content

Commit 6681f10

Browse files
committed
feat: add support for Temporal.Instant
1 parent c5452d4 commit 6681f10

4 files changed

Lines changed: 71 additions & 0 deletions

File tree

src/core.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ export const zonedDateTimeConfig: TransformConfig<Temporal.ZonedDateTime> = {
6868
example: "2020-01-01T14:00:00+01:00[Europe/Berlin]",
6969
};
7070

71+
export const instantConfig: TransformConfig<Temporal.Instant> = {
72+
parse: (input) => Temporal.Instant.from(input),
73+
encode: (input) => input.toString(),
74+
instanceType: Temporal.Instant,
75+
invalidMessage: "Invalid instant",
76+
schemaFormat: "date-time",
77+
example: "2020-01-01T14:00:00Z",
78+
};
79+
7180
export const plainYearMonthConfig: TransformConfig<Temporal.PlainYearMonth> = {
7281
parse: (input) => Temporal.PlainYearMonth.from(input),
7382
encode: (input) => input.toString(),

src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { z } from "zod/v4";
22
import {
33
type CoreParams,
44
durationConfig,
5+
instantConfig,
56
offsetDateTimeConfig,
67
plainDateConfig,
78
plainDateTimeConfig,
@@ -58,6 +59,7 @@ export const plainDate = createCodecConstructor(plainDateConfig);
5859
export const plainDateTime = createCodecConstructor(plainDateTimeConfig);
5960
export const plainTime = createCodecConstructor(plainTimeConfig);
6061
export const offsetDateTime = createCodecConstructor(offsetDateTimeConfig);
62+
export const instant = createCodecConstructor(instantConfig);
6163
export const zonedDateTime = createCodecConstructor(zonedDateTimeConfig);
6264
export const plainYearMonth = createCodecConstructor(plainYearMonthConfig);
6365
export const plainMonthDay = createCodecConstructor(plainMonthDayConfig);
@@ -68,6 +70,7 @@ export const zt = {
6870
plainDateTime,
6971
plainTime,
7072
offsetDateTime,
73+
instant,
7174
zonedDateTime,
7275
plainYearMonth,
7376
plainMonthDay,

src/mini.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { z } from "zod/v4/mini";
22
import {
33
type CoreParams,
44
durationConfig,
5+
instantConfig,
56
offsetDateTimeConfig,
67
plainDateConfig,
78
plainDateTimeConfig,
@@ -58,6 +59,7 @@ export const plainDate = createCodecConstructor(plainDateConfig);
5859
export const plainDateTime = createCodecConstructor(plainDateTimeConfig);
5960
export const plainTime = createCodecConstructor(plainTimeConfig);
6061
export const offsetDateTime = createCodecConstructor(offsetDateTimeConfig);
62+
export const instant = createCodecConstructor(instantConfig);
6163
export const zonedDateTime = createCodecConstructor(zonedDateTimeConfig);
6264
export const plainYearMonth = createCodecConstructor(plainYearMonthConfig);
6365
export const plainMonthDay = createCodecConstructor(plainMonthDayConfig);
@@ -68,6 +70,7 @@ export const zt = {
6870
plainDateTime,
6971
plainTime,
7072
offsetDateTime,
73+
instant,
7174
zonedDateTime,
7275
plainYearMonth,
7376
plainMonthDay,

test/Instant.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import assert from "node:assert/strict";
2+
import { it } from "node:test";
3+
import { toJSONSchema } from "zod/v4/core";
4+
import { describeMatrix } from "./matrix.js";
5+
6+
describeMatrix("OffsetDateTime", (zt, z) => {
7+
it("should allow ISO offset date time value", () => {
8+
const schema = zt.instant();
9+
const instant = Temporal.Instant.from("2021-01-01T20:00:00Z");
10+
const result = schema.parse("2021-01-01T20:00:00Z");
11+
assert(result.equals(instant));
12+
});
13+
14+
it("should report invalid date", () => {
15+
const schema = zt.instant();
16+
assert.throws(() => schema.parse("foo"));
17+
});
18+
19+
it("should report invalid type", () => {
20+
const schema = zt.instant();
21+
assert.throws(() => schema.parse(1));
22+
});
23+
24+
it("should allow error override", () => {
25+
const schema = zt.instant({ error: "whoops" });
26+
const result = schema.safeParse("a");
27+
assert(!result.success);
28+
assert.deepEqual(result.error.issues[0].message, "whoops");
29+
});
30+
31+
it("should create a standard JSON schema", () => {
32+
const schema = zt.instant();
33+
const jsonSchema = toJSONSchema(schema, { io: "input" });
34+
assert.partialDeepStrictEqual(jsonSchema, {
35+
type: "string",
36+
format: "date-time",
37+
example: "2020-01-01T14:00:00Z",
38+
});
39+
});
40+
41+
it("should encode to ISO offset date time", () => {
42+
const schema = zt.instant();
43+
const result = z.encode(schema, Temporal.Instant.from("2021-01-01T20:00:00Z"));
44+
assert.equal(result, "2021-01-01T20:00:00Z");
45+
});
46+
47+
it("should preserve JSON schema over refine", () => {
48+
const schema = zt.instant().check(z.refine(() => true));
49+
const jsonSchema = toJSONSchema(schema, { io: "input" });
50+
assert.partialDeepStrictEqual(jsonSchema, {
51+
type: "string",
52+
format: "date-time",
53+
example: "2020-01-01T14:00:00Z",
54+
});
55+
});
56+
});

0 commit comments

Comments
 (0)