zod-joda 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,18 +4,12 @@
4
4
  [![codecov](https://codecov.io/gh/DASPRiD/zod-joda/branch/main/graph/badge.svg?token=I960P1I5FR)](https://codecov.io/gh/DASPRiD/zod-joda)
5
5
 
6
6
  This library adds additional types for [Zod](https://github.com/colinhacks/zod/) to parse and validate dates, times and durations as
7
- [js-joda](https://github.com/js-joda/js-joda) types. This library has support for both `zod` and `@zod/mini`.
7
+ [js-joda](https://github.com/js-joda/js-joda) types. This library has support for both `zod` v4 and `zod/v4/mini`.
8
8
 
9
9
  ## Installation
10
10
 
11
11
  ```bash
12
- npm install zod-joda @js-joda/core
13
-
14
- # a) Install zod peer dependency for full zod support
15
- npm install zod
16
-
17
- # b) Install zod mini for size optimized results
18
- npm install @zod/mini
12
+ npm install zod-joda @js-joda/core zod
19
13
  ```
20
14
 
21
15
  ## Quick Start
@@ -27,7 +21,7 @@ method:
27
21
  import {zj} from 'zod-joda';
28
22
  ```
29
23
 
30
- For `@zod/mini`, import from the mini sub-path:
24
+ For `zod/v4/mini`, import from the mini sub-path:
31
25
 
32
26
  ```typescript
33
27
  import {zj} from 'zod-joda/mini';
package/dist/core.d.ts CHANGED
@@ -2,8 +2,7 @@ import { DateTimeFormatter, Duration, LocalDate, LocalDateTime, LocalTime, Zoned
2
2
  export type CoreParams = {
3
3
  error?: string;
4
4
  };
5
- export type TransformConstructorConfig<T, P extends CoreParams> = {
6
- isInstance: (input: unknown) => input is T;
5
+ export type TransformConfig<T, P extends CoreParams> = {
7
6
  parse: (input: string, params?: P) => T;
8
7
  invalidMessage: string;
9
8
  schemaFormat: string;
@@ -12,8 +11,8 @@ export type TransformConstructorConfig<T, P extends CoreParams> = {
12
11
  export type TemporalParams = CoreParams & {
13
12
  dateTimeFormatter?: DateTimeFormatter;
14
13
  };
15
- export declare const durationConfig: TransformConstructorConfig<Duration, CoreParams>;
16
- export declare const localDateConfig: TransformConstructorConfig<LocalDate, TemporalParams>;
17
- export declare const localDateTimeConfig: TransformConstructorConfig<LocalDateTime, TemporalParams>;
18
- export declare const localTimeConfig: TransformConstructorConfig<LocalTime, TemporalParams>;
19
- export declare const zonedDateTimeConfig: TransformConstructorConfig<ZonedDateTime, TemporalParams>;
14
+ export declare const durationConfig: TransformConfig<Duration, CoreParams>;
15
+ export declare const localDateConfig: TransformConfig<LocalDate, TemporalParams>;
16
+ export declare const localDateTimeConfig: TransformConfig<LocalDateTime, TemporalParams>;
17
+ export declare const localTimeConfig: TransformConfig<LocalTime, TemporalParams>;
18
+ export declare const zonedDateTimeConfig: TransformConfig<ZonedDateTime, TemporalParams>;
package/dist/core.js CHANGED
@@ -1,34 +1,29 @@
1
- import { DateTimeFormatter, Duration, LocalDate, LocalDateTime, LocalTime, ZoneId, ZonedDateTime, } from "@js-joda/core";
1
+ import { DateTimeFormatter, Duration, LocalDate, LocalDateTime, LocalTime, ZonedDateTime, ZoneId, } from "@js-joda/core";
2
2
  export const durationConfig = {
3
- isInstance: (input) => input instanceof Duration,
4
3
  parse: (input) => Duration.parse(input),
5
4
  invalidMessage: "Invalid duration",
6
5
  schemaFormat: "duration",
7
6
  example: () => "PT1H",
8
7
  };
9
8
  export const localDateConfig = {
10
- isInstance: (input) => input instanceof LocalDate,
11
9
  parse: (input, params) => LocalDate.parse(input, params?.dateTimeFormatter),
12
10
  invalidMessage: "Invalid local date",
13
11
  schemaFormat: "date",
14
12
  example: (params) => LocalDate.of(2020, 1, 1).format(params?.dateTimeFormatter ?? DateTimeFormatter.ISO_LOCAL_DATE),
15
13
  };
16
14
  export const localDateTimeConfig = {
17
- isInstance: (input) => input instanceof LocalDateTime,
18
15
  parse: (input, params) => LocalDateTime.parse(input, params?.dateTimeFormatter),
19
16
  invalidMessage: "Invalid local date time",
20
17
  schemaFormat: "local-date-time",
21
18
  example: (params) => LocalDateTime.of(2020, 1, 1, 14, 0, 0, 0).format(params?.dateTimeFormatter ?? DateTimeFormatter.ISO_LOCAL_DATE_TIME),
22
19
  };
23
20
  export const localTimeConfig = {
24
- isInstance: (input) => input instanceof LocalTime,
25
21
  parse: (input, params) => LocalTime.parse(input, params?.dateTimeFormatter),
26
22
  invalidMessage: "Invalid local time",
27
23
  schemaFormat: "time",
28
24
  example: (params) => LocalTime.of(14, 0, 0, 0).format(params?.dateTimeFormatter ?? DateTimeFormatter.ISO_LOCAL_TIME),
29
25
  };
30
26
  export const zonedDateTimeConfig = {
31
- isInstance: (input) => input instanceof ZonedDateTime,
32
27
  parse: (input, params) => ZonedDateTime.parse(input, params?.dateTimeFormatter),
33
28
  invalidMessage: "Invalid zoned date time",
34
29
  schemaFormat: "date-time",
package/dist/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  import { type ZodType } from "zod/v4";
2
2
  import { type CoreParams } from "./core.js";
3
- export declare const duration: (params?: CoreParams | undefined) => ZodType<import("@js-joda/core").Duration, string | import("@js-joda/core").Duration, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").Duration, string | import("@js-joda/core").Duration>>;
4
- export declare const localDate: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDate, string | import("@js-joda/core").LocalDate, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDate, string | import("@js-joda/core").LocalDate>>;
5
- export declare const localDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDateTime, string | import("@js-joda/core").LocalDateTime, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDateTime, string | import("@js-joda/core").LocalDateTime>>;
6
- export declare const localTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalTime, string | import("@js-joda/core").LocalTime, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalTime, string | import("@js-joda/core").LocalTime>>;
7
- export declare const zonedDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").ZonedDateTime, string | import("@js-joda/core").ZonedDateTime, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").ZonedDateTime, string | import("@js-joda/core").ZonedDateTime>>;
3
+ export declare const duration: (params?: CoreParams | undefined) => ZodType<import("@js-joda/core").Duration, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").Duration, unknown>>;
4
+ export declare const localDate: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDate, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDate, unknown>>;
5
+ export declare const localDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDateTime, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDateTime, unknown>>;
6
+ export declare const localTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalTime, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalTime, unknown>>;
7
+ export declare const zonedDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").ZonedDateTime, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").ZonedDateTime, unknown>>;
8
8
  export declare const zj: {
9
- duration: (params?: CoreParams | undefined) => ZodType<import("@js-joda/core").Duration, string | import("@js-joda/core").Duration, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").Duration, string | import("@js-joda/core").Duration>>;
10
- localDate: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDate, string | import("@js-joda/core").LocalDate, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDate, string | import("@js-joda/core").LocalDate>>;
11
- localDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDateTime, string | import("@js-joda/core").LocalDateTime, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDateTime, string | import("@js-joda/core").LocalDateTime>>;
12
- localTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalTime, string | import("@js-joda/core").LocalTime, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalTime, string | import("@js-joda/core").LocalTime>>;
13
- zonedDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").ZonedDateTime, string | import("@js-joda/core").ZonedDateTime, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").ZonedDateTime, string | import("@js-joda/core").ZonedDateTime>>;
9
+ duration: (params?: CoreParams | undefined) => ZodType<import("@js-joda/core").Duration, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").Duration, unknown>>;
10
+ localDate: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDate, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDate, unknown>>;
11
+ localDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalDateTime, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalDateTime, unknown>>;
12
+ localTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").LocalTime, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").LocalTime, unknown>>;
13
+ zonedDateTime: (params?: import("./core.js").TemporalParams | undefined) => ZodType<import("@js-joda/core").ZonedDateTime, unknown, import("zod/v4/core").$ZodTypeInternals<import("@js-joda/core").ZonedDateTime, unknown>>;
14
14
  };
15
15
  export default zj;
package/dist/index.js CHANGED
@@ -1,31 +1,24 @@
1
- import { transform } from "zod/v4";
1
+ import { string } from "zod/v4";
2
2
  import { durationConfig, localDateConfig, localDateTimeConfig, localTimeConfig, zonedDateTimeConfig, } from "./core.js";
3
- const createParseConstructor = ({ isInstance, parse, invalidMessage, schemaFormat, example, }) => (params) => {
4
- const instance = transform((input, context) => {
5
- if (isInstance(input)) {
6
- return input;
3
+ const createParseConstructor = ({ parse, invalidMessage, schemaFormat, example, }) => (params) => {
4
+ const inputSchema = string().meta({ example: example(params) });
5
+ inputSchema._zod.toJSONSchema = () => ({
6
+ format: schemaFormat,
7
+ type: "string",
8
+ });
9
+ return inputSchema.transform((value, context) => {
10
+ try {
11
+ return parse(value, params);
7
12
  }
8
- if (typeof input === "string") {
9
- try {
10
- return parse(input, params);
11
- }
12
- catch {
13
- // Noop
14
- }
13
+ catch {
14
+ context.issues.push({
15
+ code: "custom",
16
+ message: params?.error ?? invalidMessage,
17
+ input: context.value,
18
+ });
19
+ return undefined;
15
20
  }
16
- context.issues.push({
17
- code: "custom",
18
- message: params?.error ?? invalidMessage,
19
- input: context.value,
20
- });
21
- return undefined;
22
- });
23
- instance._zod.toJSONSchema = () => ({
24
- type: "string",
25
- format: schemaFormat,
26
- example: example(params),
27
21
  });
28
- return instance;
29
22
  };
30
23
  export const duration = createParseConstructor(durationConfig);
31
24
  export const localDate = createParseConstructor(localDateConfig);
package/dist/mini.js CHANGED
@@ -1,31 +1,24 @@
1
- import { transform } from "zod/v4/mini";
1
+ import { globalRegistry, pipe, string, transform } from "zod/v4/mini";
2
2
  import { durationConfig, localDateConfig, localDateTimeConfig, localTimeConfig, zonedDateTimeConfig, } from "./core.js";
3
- const createParseConstructor = ({ isInstance, parse, invalidMessage, schemaFormat, example, }) => (params) => {
4
- const instance = transform((input, context) => {
5
- if (isInstance(input)) {
6
- return input;
7
- }
8
- if (typeof input === "string") {
9
- try {
10
- return parse(input, params);
11
- }
12
- catch {
13
- // Noop
14
- }
15
- }
16
- context.issues.push({
17
- code: "custom",
18
- message: params?.error ?? invalidMessage,
19
- input: context.value,
20
- });
21
- return undefined;
22
- });
23
- instance._zod.toJSONSchema = () => ({
24
- type: "string",
3
+ const createParseConstructor = ({ parse, invalidMessage, schemaFormat, example, }) => (params) => {
4
+ const inputSchema = string().register(globalRegistry, { example: example(params) });
5
+ inputSchema._zod.toJSONSchema = () => ({
25
6
  format: schemaFormat,
26
- example: example(params),
7
+ type: "string",
27
8
  });
28
- return instance;
9
+ return pipe(inputSchema, transform((value, context) => {
10
+ try {
11
+ return parse(value, params);
12
+ }
13
+ catch {
14
+ context.issues.push({
15
+ code: "custom",
16
+ message: params?.error ?? invalidMessage,
17
+ input: context.value,
18
+ });
19
+ return undefined;
20
+ }
21
+ }));
29
22
  };
30
23
  export const duration = createParseConstructor(durationConfig);
31
24
  export const localDate = createParseConstructor(localDateConfig);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zod-joda",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "JS-Joda integration for Zod validation library",
5
5
  "author": "Ben Scholzen 'DASPRiD'",
6
6
  "keywords": [
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@js-joda/core": "^3.2.0 || ^4.0.0 || ^5.0.0",
48
- "zod": "^3.25.56"
48
+ "zod": "^3.25.56 || ^4.0.0"
49
49
  },
50
50
  "peerDependenciesMeta": {
51
51
  "@zod/mini": {
@@ -56,17 +56,17 @@
56
56
  }
57
57
  },
58
58
  "devDependencies": {
59
- "@biomejs/biome": "^1.9.4",
59
+ "@biomejs/biome": "^2.1.3",
60
60
  "@commitlint/cli": "^19.8.1",
61
61
  "@commitlint/config-conventional": "^19.8.1",
62
62
  "@js-joda/core": "^5.6.5",
63
63
  "@tsconfig/node22": "^22.0.2",
64
- "@types/node": "^22.15.30",
64
+ "@types/node": "^24.1.0",
65
65
  "c8": "^10.1.3",
66
- "lefthook": "^1.11.13",
67
- "tsx": "^4.19.4",
66
+ "lefthook": "^1.12.2",
67
+ "tsx": "^4.20.3",
68
68
  "typescript": "^5.8.3",
69
- "zod": "^3.25.56"
69
+ "zod": "^4.0.14"
70
70
  },
71
71
  "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
72
72
  }