@hy_ong/zod-kit 0.2.3 → 0.2.4

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.
@@ -44,14 +44,14 @@ type ManyOfMessages = {
44
44
  * @property {Function} [transform] - Custom transformation function applied to each value
45
45
  * @property {Record<Locale, ManyOfMessages>} [i18n] - Custom error messages for different locales
46
46
  */
47
- type ManyOfOptions<IsRequired extends boolean = true, T extends string | number = string | number> = {
48
- values: T[];
49
- defaultValue?: IsRequired extends true ? T[] : T[] | null;
47
+ type ManyOfOptions<IsRequired extends boolean = true, V extends readonly (string | number)[] = readonly (string | number)[]> = {
48
+ values: V;
49
+ defaultValue?: IsRequired extends true ? V[number][] : V[number][] | null;
50
50
  min?: number;
51
51
  max?: number;
52
52
  allowDuplicates?: boolean;
53
53
  caseSensitive?: boolean;
54
- transform?: (value: T[]) => T[];
54
+ transform?: (value: V[number][]) => V[number][];
55
55
  i18n?: Partial<Record<Locale, Partial<ManyOfMessages>>>;
56
56
  };
57
57
  /**
@@ -60,7 +60,7 @@ type ManyOfOptions<IsRequired extends boolean = true, T extends string | number
60
60
  * @template IsRequired - Whether the field is required
61
61
  * @template T - The type of allowed values
62
62
  */
63
- type ManyOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodType<T[]> : ZodType<T[] | null>;
63
+ type ManyOfSchema<IsRequired extends boolean, V extends readonly (string | number)[]> = IsRequired extends true ? ZodType<V[number][]> : ZodType<V[number][] | null>;
64
64
  /**
65
65
  * Creates a Zod schema for multi-select validation that restricts values to a predefined set
66
66
  *
@@ -106,6 +106,6 @@ type ManyOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? Zod
106
106
  * itemsSchema.parse([1, 1, 2]) // ✓ [1, 1, 2]
107
107
  * ```
108
108
  */
109
- declare function manyOf<IsRequired extends boolean = false, T extends string | number = string | number>(required?: IsRequired, options?: Omit<ManyOfOptions<IsRequired, T>, "required">): ManyOfSchema<IsRequired, T>;
109
+ declare function manyOf<IsRequired extends boolean = false, const V extends readonly (string | number)[] = readonly (string | number)[]>(required?: IsRequired, options?: Omit<ManyOfOptions<IsRequired, V>, "required">): ManyOfSchema<IsRequired, V>;
110
110
 
111
111
  export { type ManyOfMessages, type ManyOfOptions, type ManyOfSchema, manyOf };
@@ -44,14 +44,14 @@ type ManyOfMessages = {
44
44
  * @property {Function} [transform] - Custom transformation function applied to each value
45
45
  * @property {Record<Locale, ManyOfMessages>} [i18n] - Custom error messages for different locales
46
46
  */
47
- type ManyOfOptions<IsRequired extends boolean = true, T extends string | number = string | number> = {
48
- values: T[];
49
- defaultValue?: IsRequired extends true ? T[] : T[] | null;
47
+ type ManyOfOptions<IsRequired extends boolean = true, V extends readonly (string | number)[] = readonly (string | number)[]> = {
48
+ values: V;
49
+ defaultValue?: IsRequired extends true ? V[number][] : V[number][] | null;
50
50
  min?: number;
51
51
  max?: number;
52
52
  allowDuplicates?: boolean;
53
53
  caseSensitive?: boolean;
54
- transform?: (value: T[]) => T[];
54
+ transform?: (value: V[number][]) => V[number][];
55
55
  i18n?: Partial<Record<Locale, Partial<ManyOfMessages>>>;
56
56
  };
57
57
  /**
@@ -60,7 +60,7 @@ type ManyOfOptions<IsRequired extends boolean = true, T extends string | number
60
60
  * @template IsRequired - Whether the field is required
61
61
  * @template T - The type of allowed values
62
62
  */
63
- type ManyOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodType<T[]> : ZodType<T[] | null>;
63
+ type ManyOfSchema<IsRequired extends boolean, V extends readonly (string | number)[]> = IsRequired extends true ? ZodType<V[number][]> : ZodType<V[number][] | null>;
64
64
  /**
65
65
  * Creates a Zod schema for multi-select validation that restricts values to a predefined set
66
66
  *
@@ -106,6 +106,6 @@ type ManyOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? Zod
106
106
  * itemsSchema.parse([1, 1, 2]) // ✓ [1, 1, 2]
107
107
  * ```
108
108
  */
109
- declare function manyOf<IsRequired extends boolean = false, T extends string | number = string | number>(required?: IsRequired, options?: Omit<ManyOfOptions<IsRequired, T>, "required">): ManyOfSchema<IsRequired, T>;
109
+ declare function manyOf<IsRequired extends boolean = false, const V extends readonly (string | number)[] = readonly (string | number)[]>(required?: IsRequired, options?: Omit<ManyOfOptions<IsRequired, V>, "required">): ManyOfSchema<IsRequired, V>;
110
110
 
111
111
  export { type ManyOfMessages, type ManyOfOptions, type ManyOfSchema, manyOf };
@@ -35,11 +35,11 @@ type OneOfMessages = {
35
35
  * @property {Function} [transform] - Custom transformation function applied after validation
36
36
  * @property {Record<Locale, OneOfMessages>} [i18n] - Custom error messages for different locales
37
37
  */
38
- type OneOfOptions<IsRequired extends boolean = true, T extends string | number = string | number> = {
39
- values: T[];
40
- defaultValue?: IsRequired extends true ? T : T | null;
38
+ type OneOfOptions<IsRequired extends boolean = true, V extends readonly (string | number)[] = readonly (string | number)[]> = {
39
+ values: V;
40
+ defaultValue?: IsRequired extends true ? V[number] : V[number] | null;
41
41
  caseSensitive?: boolean;
42
- transform?: (value: T) => T;
42
+ transform?: (value: V[number]) => V[number];
43
43
  i18n?: Partial<Record<Locale, Partial<OneOfMessages>>>;
44
44
  };
45
45
  /**
@@ -48,7 +48,7 @@ type OneOfOptions<IsRequired extends boolean = true, T extends string | number =
48
48
  * @template IsRequired - Whether the field is required
49
49
  * @template T - The type of allowed values
50
50
  */
51
- type OneOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodType<T> : ZodType<T | null>;
51
+ type OneOfSchema<IsRequired extends boolean, V extends readonly (string | number)[]> = IsRequired extends true ? ZodType<V[number]> : ZodType<V[number] | null>;
52
52
  /**
53
53
  * Creates a Zod schema for single-select validation that restricts values to a predefined set
54
54
  *
@@ -99,6 +99,6 @@ type OneOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodT
99
99
  * sizeSchema.parse("m") // ✓ "M"
100
100
  * ```
101
101
  */
102
- declare function oneOf<IsRequired extends boolean = false, T extends string | number = string | number>(required?: IsRequired, options?: Omit<OneOfOptions<IsRequired, T>, "required">): OneOfSchema<IsRequired, T>;
102
+ declare function oneOf<IsRequired extends boolean = false, const V extends readonly (string | number)[] = readonly (string | number)[]>(required?: IsRequired, options?: Omit<OneOfOptions<IsRequired, V>, "required">): OneOfSchema<IsRequired, V>;
103
103
 
104
104
  export { type OneOfMessages, type OneOfOptions, type OneOfSchema, oneOf };
@@ -35,11 +35,11 @@ type OneOfMessages = {
35
35
  * @property {Function} [transform] - Custom transformation function applied after validation
36
36
  * @property {Record<Locale, OneOfMessages>} [i18n] - Custom error messages for different locales
37
37
  */
38
- type OneOfOptions<IsRequired extends boolean = true, T extends string | number = string | number> = {
39
- values: T[];
40
- defaultValue?: IsRequired extends true ? T : T | null;
38
+ type OneOfOptions<IsRequired extends boolean = true, V extends readonly (string | number)[] = readonly (string | number)[]> = {
39
+ values: V;
40
+ defaultValue?: IsRequired extends true ? V[number] : V[number] | null;
41
41
  caseSensitive?: boolean;
42
- transform?: (value: T) => T;
42
+ transform?: (value: V[number]) => V[number];
43
43
  i18n?: Partial<Record<Locale, Partial<OneOfMessages>>>;
44
44
  };
45
45
  /**
@@ -48,7 +48,7 @@ type OneOfOptions<IsRequired extends boolean = true, T extends string | number =
48
48
  * @template IsRequired - Whether the field is required
49
49
  * @template T - The type of allowed values
50
50
  */
51
- type OneOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodType<T> : ZodType<T | null>;
51
+ type OneOfSchema<IsRequired extends boolean, V extends readonly (string | number)[]> = IsRequired extends true ? ZodType<V[number]> : ZodType<V[number] | null>;
52
52
  /**
53
53
  * Creates a Zod schema for single-select validation that restricts values to a predefined set
54
54
  *
@@ -99,6 +99,6 @@ type OneOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodT
99
99
  * sizeSchema.parse("m") // ✓ "M"
100
100
  * ```
101
101
  */
102
- declare function oneOf<IsRequired extends boolean = false, T extends string | number = string | number>(required?: IsRequired, options?: Omit<OneOfOptions<IsRequired, T>, "required">): OneOfSchema<IsRequired, T>;
102
+ declare function oneOf<IsRequired extends boolean = false, const V extends readonly (string | number)[] = readonly (string | number)[]>(required?: IsRequired, options?: Omit<OneOfOptions<IsRequired, V>, "required">): OneOfSchema<IsRequired, V>;
103
103
 
104
104
  export { type OneOfMessages, type OneOfOptions, type OneOfSchema, oneOf };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hy_ong/zod-kit",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "A comprehensive TypeScript library providing pre-built Zod validation schemas with full internationalization support for common data types and Taiwan-specific formats",
5
5
  "keywords": [
6
6
  "zod",
@@ -46,14 +46,14 @@ export type ManyOfMessages = {
46
46
  * @property {Function} [transform] - Custom transformation function applied to each value
47
47
  * @property {Record<Locale, ManyOfMessages>} [i18n] - Custom error messages for different locales
48
48
  */
49
- export type ManyOfOptions<IsRequired extends boolean = true, T extends string | number = string | number> = {
50
- values: T[]
51
- defaultValue?: IsRequired extends true ? T[] : T[] | null
49
+ export type ManyOfOptions<IsRequired extends boolean = true, V extends readonly (string | number)[] = readonly (string | number)[]> = {
50
+ values: V
51
+ defaultValue?: IsRequired extends true ? V[number][] : V[number][] | null
52
52
  min?: number
53
53
  max?: number
54
54
  allowDuplicates?: boolean
55
55
  caseSensitive?: boolean
56
- transform?: (value: T[]) => T[]
56
+ transform?: (value: V[number][]) => V[number][]
57
57
  i18n?: Partial<Record<Locale, Partial<ManyOfMessages>>>
58
58
  }
59
59
 
@@ -63,7 +63,7 @@ export type ManyOfOptions<IsRequired extends boolean = true, T extends string |
63
63
  * @template IsRequired - Whether the field is required
64
64
  * @template T - The type of allowed values
65
65
  */
66
- export type ManyOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodType<T[]> : ZodType<T[] | null>
66
+ export type ManyOfSchema<IsRequired extends boolean, V extends readonly (string | number)[]> = IsRequired extends true ? ZodType<V[number][]> : ZodType<V[number][] | null>
67
67
 
68
68
  /**
69
69
  * Creates a Zod schema for multi-select validation that restricts values to a predefined set
@@ -110,11 +110,11 @@ export type ManyOfSchema<IsRequired extends boolean, T> = IsRequired extends tru
110
110
  * itemsSchema.parse([1, 1, 2]) // ✓ [1, 1, 2]
111
111
  * ```
112
112
  */
113
- export function manyOf<IsRequired extends boolean = false, T extends string | number = string | number>(
113
+ export function manyOf<IsRequired extends boolean = false, const V extends readonly (string | number)[] = readonly (string | number)[]>(
114
114
  required?: IsRequired,
115
- options?: Omit<ManyOfOptions<IsRequired, T>, "required">,
116
- ): ManyOfSchema<IsRequired, T> {
117
- const { values = [] as unknown as T[], defaultValue = null, min, max, allowDuplicates = false, caseSensitive = true, transform, i18n } = options ?? {}
115
+ options?: Omit<ManyOfOptions<IsRequired, V>, "required">,
116
+ ): ManyOfSchema<IsRequired, V> {
117
+ const { values = [] as unknown as V, defaultValue = null, min, max, allowDuplicates = false, caseSensitive = true, transform, i18n } = options ?? {}
118
118
 
119
119
  const isRequired = required ?? (false as IsRequired)
120
120
 
@@ -135,7 +135,7 @@ export function manyOf<IsRequired extends boolean = false, T extends string | nu
135
135
  const hasNumbers = values.some((v) => typeof v === "number")
136
136
  if (hasNumbers && typeof item === "string" && !isNaN(Number(item)) && item.trim() !== "") {
137
137
  const numVal = Number(item)
138
- if ((values as number[]).includes(numVal)) return numVal
138
+ if ((values as readonly number[]).includes(numVal)) return numVal
139
139
  }
140
140
 
141
141
  // Case-insensitive normalization
@@ -178,7 +178,7 @@ export function manyOf<IsRequired extends boolean = false, T extends string | nu
178
178
 
179
179
  // Check each item is in the allowed values
180
180
  for (const item of val) {
181
- if (!values.includes(item as T)) {
181
+ if (!(values as readonly (string | number)[]).includes(item as V[number])) {
182
182
  ctx.addIssue({
183
183
  code: "custom",
184
184
  message: getMessage("invalid", { values: values.join(", ") }),
@@ -212,8 +212,8 @@ export function manyOf<IsRequired extends boolean = false, T extends string | nu
212
212
  })
213
213
  .transform((val) => {
214
214
  if (val === null || !Array.isArray(val) || !transform) return val
215
- return transform(val as T[])
215
+ return transform(val as V[number][])
216
216
  })
217
217
 
218
- return schema as unknown as ManyOfSchema<IsRequired, T>
218
+ return schema as unknown as ManyOfSchema<IsRequired, V>
219
219
  }
@@ -37,11 +37,11 @@ export type OneOfMessages = {
37
37
  * @property {Function} [transform] - Custom transformation function applied after validation
38
38
  * @property {Record<Locale, OneOfMessages>} [i18n] - Custom error messages for different locales
39
39
  */
40
- export type OneOfOptions<IsRequired extends boolean = true, T extends string | number = string | number> = {
41
- values: T[]
42
- defaultValue?: IsRequired extends true ? T : T | null
40
+ export type OneOfOptions<IsRequired extends boolean = true, V extends readonly (string | number)[] = readonly (string | number)[]> = {
41
+ values: V
42
+ defaultValue?: IsRequired extends true ? V[number] : V[number] | null
43
43
  caseSensitive?: boolean
44
- transform?: (value: T) => T
44
+ transform?: (value: V[number]) => V[number]
45
45
  i18n?: Partial<Record<Locale, Partial<OneOfMessages>>>
46
46
  }
47
47
 
@@ -51,7 +51,7 @@ export type OneOfOptions<IsRequired extends boolean = true, T extends string | n
51
51
  * @template IsRequired - Whether the field is required
52
52
  * @template T - The type of allowed values
53
53
  */
54
- export type OneOfSchema<IsRequired extends boolean, T> = IsRequired extends true ? ZodType<T> : ZodType<T | null>
54
+ export type OneOfSchema<IsRequired extends boolean, V extends readonly (string | number)[]> = IsRequired extends true ? ZodType<V[number]> : ZodType<V[number] | null>
55
55
 
56
56
  /**
57
57
  * Creates a Zod schema for single-select validation that restricts values to a predefined set
@@ -103,11 +103,11 @@ export type OneOfSchema<IsRequired extends boolean, T> = IsRequired extends true
103
103
  * sizeSchema.parse("m") // ✓ "M"
104
104
  * ```
105
105
  */
106
- export function oneOf<IsRequired extends boolean = false, T extends string | number = string | number>(
106
+ export function oneOf<IsRequired extends boolean = false, const V extends readonly (string | number)[] = readonly (string | number)[]>(
107
107
  required?: IsRequired,
108
- options?: Omit<OneOfOptions<IsRequired, T>, "required">,
109
- ): OneOfSchema<IsRequired, T> {
110
- const { values = [] as unknown as T[], defaultValue = null, caseSensitive = true, transform, i18n } = options ?? {}
108
+ options?: Omit<OneOfOptions<IsRequired, V>, "required">,
109
+ ): OneOfSchema<IsRequired, V> {
110
+ const { values = [] as unknown as V, defaultValue = null, caseSensitive = true, transform, i18n } = options ?? {}
111
111
 
112
112
  const isRequired = required ?? (false as IsRequired)
113
113
 
@@ -132,7 +132,7 @@ export function oneOf<IsRequired extends boolean = false, T extends string | num
132
132
  const hasNumbers = values.some((v) => typeof v === "number")
133
133
  if (hasNumbers && typeof val === "string" && !isNaN(Number(val)) && val.trim() !== "") {
134
134
  const numVal = Number(val)
135
- if ((values as number[]).includes(numVal)) return numVal
135
+ if ((values as readonly number[]).includes(numVal)) return numVal
136
136
  }
137
137
 
138
138
  // Case-insensitive normalization for string values
@@ -156,7 +156,7 @@ export function oneOf<IsRequired extends boolean = false, T extends string | num
156
156
  return
157
157
  }
158
158
 
159
- if (!values.includes(val as T)) {
159
+ if (!(values as readonly (string | number)[]).includes(val as V[number])) {
160
160
  ctx.addIssue({
161
161
  code: "custom",
162
162
  message: getMessage("invalid", { values: values.join(", ") }),
@@ -165,8 +165,8 @@ export function oneOf<IsRequired extends boolean = false, T extends string | num
165
165
  })
166
166
  .transform((val) => {
167
167
  if (val === null || !transform) return val
168
- return transform(val as T)
168
+ return transform(val as V[number])
169
169
  })
170
170
 
171
- return schema as unknown as OneOfSchema<IsRequired, T>
171
+ return schema as unknown as OneOfSchema<IsRequired, V>
172
172
  }