@naturalcycles/js-lib 15.3.0 → 15.4.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.
@@ -1,6 +1,4 @@
1
1
  export * from './zod.shared.schemas.js';
2
2
  export * from './zod.util.js';
3
- import type { ZodIssue } from 'zod';
4
- import { z, ZodError, ZodSchema } from 'zod';
5
- export { z, ZodError, ZodSchema };
6
- export type { ZodIssue };
3
+ import { z, ZodType } from 'zod/v4';
4
+ export { z, ZodType };
package/dist/zod/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './zod.shared.schemas.js';
2
2
  export * from './zod.util.js';
3
- import { z, ZodError, ZodSchema } from 'zod';
4
- export { z, ZodError, ZodSchema };
3
+ import { z, ZodType } from 'zod/v4';
4
+ export { z, ZodType };
@@ -1,4 +1,4 @@
1
- import { z } from 'zod';
1
+ import { z } from 'zod/v4';
2
2
  export declare const TS_2500 = 16725225600;
3
3
  export declare const TS_2000 = 946684800;
4
4
  export declare const zUnixTimestamp: z.ZodNumber;
@@ -6,8 +6,8 @@ export declare const zUnixTimestamp2000: z.ZodNumber;
6
6
  export declare const zUnixTimestampMillis: z.ZodNumber;
7
7
  export declare const zUnixTimestampMillis2000: z.ZodNumber;
8
8
  export declare const zSemVer: z.ZodString;
9
- export declare const zIsoDateString: z.ZodEffects<z.ZodString, string, string>;
10
- export declare const zEmail: z.ZodEffects<z.ZodString, string, string>;
9
+ export declare const zIsoDateString: z.ZodString;
10
+ export declare const zEmail: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
11
11
  export declare const BASE62_REGEX: RegExp;
12
12
  export declare const BASE64_REGEX: RegExp;
13
13
  export declare const BASE64URL_REGEX: RegExp;
@@ -28,12 +28,4 @@ export declare const zBaseDBEntity: z.ZodObject<{
28
28
  id: z.ZodString;
29
29
  created: z.ZodOptional<z.ZodNumber>;
30
30
  updated: z.ZodOptional<z.ZodNumber>;
31
- }, "strip", z.ZodTypeAny, {
32
- id: string;
33
- created?: number | undefined;
34
- updated?: number | undefined;
35
- }, {
36
- id: string;
37
- created?: number | undefined;
38
- updated?: number | undefined;
39
- }>;
31
+ }, z.core.$strip>;
@@ -1,4 +1,4 @@
1
- import { z } from 'zod';
1
+ import { z } from 'zod/v4';
2
2
  export const TS_2500 = 16725225600; // 2500-01-01
3
3
  export const TS_2000 = 946684800; // 2000-01-01
4
4
  export const zUnixTimestamp = z
@@ -38,7 +38,7 @@ export const zIsoDateString = z
38
38
  export const zEmail = z
39
39
  .string()
40
40
  .trim()
41
- .email()
41
+ .email() // keeping as-is, so trim happens before email validation
42
42
  .transform(s => s.toLowerCase())
43
43
  .describe('Email');
44
44
  export const BASE62_REGEX = /^[a-zA-Z0-9]+$/;
@@ -1,21 +1,21 @@
1
- import { ZodError, type ZodIssue, type ZodSchema } from 'zod';
1
+ import type { ZodError, ZodType } from 'zod/v4';
2
+ import type { ErrorData } from '../error/error.model.js';
3
+ import { AppError } from '../error/error.util.js';
2
4
  export interface ZodErrorResult<T> {
3
5
  success: false;
4
6
  data?: T;
5
- error: ZodValidationError<T>;
7
+ error: ZodValidationError;
6
8
  }
7
9
  export interface ZodSuccessResult<T> {
8
10
  success: true;
9
11
  data: T;
10
- error?: ZodValidationError<T>;
12
+ error?: ZodValidationError;
11
13
  }
12
- export declare function zIsValid<T>(value: T, schema: ZodSchema<T>): boolean;
13
- export declare function zValidate<T>(value: T, schema: ZodSchema<T>): T;
14
- export declare function zSafeValidate<T>(value: T, schema: ZodSchema<T>): ZodSuccessResult<T> | ZodErrorResult<T>;
15
- export declare class ZodValidationError<T> extends ZodError<T> {
16
- value: T;
17
- schema: ZodSchema<T>;
18
- constructor(issues: ZodIssue[], value: T, schema: ZodSchema<T>);
19
- get message(): string;
20
- annotate(): string;
14
+ export declare function zIsValid<T>(value: T, schema: ZodType<T>): boolean;
15
+ export declare function zValidate<T>(value: T, schema: ZodType<T>): T;
16
+ export declare function zSafeValidate<T>(value: T, schema: ZodType<T>): ZodSuccessResult<T> | ZodErrorResult<T>;
17
+ export interface ZodValidationErrorData extends ErrorData {
18
+ }
19
+ export declare class ZodValidationError extends AppError<ZodValidationErrorData> {
20
+ constructor(zodError: ZodError, value: any, schema: ZodType);
21
21
  }
@@ -1,4 +1,4 @@
1
- import { ZodError } from 'zod';
1
+ import { AppError } from '../error/error.util.js';
2
2
  import { _stringify } from '../string/stringify.js';
3
3
  export function zIsValid(value, schema) {
4
4
  const { success } = schema.safeParse(value);
@@ -18,37 +18,32 @@ export function zSafeValidate(value, schema) {
18
18
  }
19
19
  return {
20
20
  success: false,
21
- error: new ZodValidationError(r.error.issues, value, schema),
21
+ error: new ZodValidationError(r.error, value, schema),
22
22
  };
23
23
  }
24
- export class ZodValidationError extends ZodError {
25
- value;
26
- schema;
27
- constructor(issues, value, schema) {
28
- super(issues);
29
- this.value = value;
30
- this.schema = schema;
24
+ export class ZodValidationError extends AppError {
25
+ constructor(zodError, value, schema) {
26
+ const message = createZodErrorMessage(zodError, schema, value);
27
+ // const message = z.prettifyError(zodError) // todo: consider adopting it instead
28
+ super(message, {}, { name: 'ZodValidationError' });
31
29
  }
32
- get message() {
33
- return this.annotate();
34
- }
35
- annotate() {
36
- let objectTitle = this.schema.description;
37
- if (typeof this.value === 'object' && this.value) {
38
- const objectName = this.schema.description || this.value.constructor?.name;
39
- const objectId = this.value['id'];
40
- objectTitle = [objectName, objectId].filter(Boolean).join('.');
41
- }
42
- objectTitle ||= 'data';
43
- return [
44
- `Invalid ${objectTitle}`,
45
- '',
46
- 'Input:',
47
- _stringify(this.value),
48
- this.issues.length > 1 ? `\n${this.issues.length} issues:` : '',
49
- ...this.issues.slice(0, 100).map(i => {
50
- return [i.path.join('.'), i.message].filter(Boolean).join(': ');
51
- }),
52
- ].join('\n');
30
+ }
31
+ function createZodErrorMessage(err, schema, value) {
32
+ let objectTitle = schema.description;
33
+ if (typeof value === 'object' && value) {
34
+ const objectName = schema.description || value.constructor?.name;
35
+ const objectId = value['id'];
36
+ objectTitle = [objectName, objectId].filter(Boolean).join('.');
53
37
  }
38
+ objectTitle ||= 'data';
39
+ return [
40
+ `Invalid ${objectTitle}`,
41
+ '',
42
+ 'Input:',
43
+ _stringify(value),
44
+ err.issues.length > 1 ? `\n${err.issues.length} issues:` : '',
45
+ ...err.issues.slice(0, 100).map(i => {
46
+ return [i.path.join('.'), i.message].filter(Boolean).join(': ');
47
+ }),
48
+ ].join('\n');
54
49
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/js-lib",
3
3
  "type": "module",
4
- "version": "15.3.0",
4
+ "version": "15.4.0",
5
5
  "dependencies": {
6
6
  "tslib": "^2",
7
7
  "zod": "^3"
package/src/zod/index.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  export * from './zod.shared.schemas.js'
2
2
  export * from './zod.util.js'
3
- import type { ZodIssue } from 'zod'
4
- import { z, ZodError, ZodSchema } from 'zod'
3
+ import { z, ZodType } from 'zod/v4'
5
4
 
6
- export { z, ZodError, ZodSchema }
7
- export type { ZodIssue }
5
+ export { z, ZodType }
@@ -1,4 +1,4 @@
1
- import { z } from 'zod'
1
+ import { z } from 'zod/v4'
2
2
 
3
3
  export const TS_2500 = 16725225600 // 2500-01-01
4
4
  export const TS_2000 = 946684800 // 2000-01-01
@@ -43,7 +43,7 @@ export const zIsoDateString = z
43
43
  export const zEmail = z
44
44
  .string()
45
45
  .trim()
46
- .email()
46
+ .email() // keeping as-is, so trim happens before email validation
47
47
  .transform(s => s.toLowerCase())
48
48
  .describe('Email')
49
49
 
@@ -1,24 +1,26 @@
1
- import { ZodError, type ZodIssue, type ZodSchema } from 'zod'
1
+ import type { ZodError, ZodType } from 'zod/v4'
2
+ import type { ErrorData } from '../error/error.model.js'
3
+ import { AppError } from '../error/error.util.js'
2
4
  import { _stringify } from '../string/stringify.js'
3
5
 
4
6
  export interface ZodErrorResult<T> {
5
7
  success: false
6
8
  data?: T
7
- error: ZodValidationError<T>
9
+ error: ZodValidationError
8
10
  }
9
11
 
10
12
  export interface ZodSuccessResult<T> {
11
13
  success: true
12
14
  data: T
13
- error?: ZodValidationError<T>
15
+ error?: ZodValidationError
14
16
  }
15
17
 
16
- export function zIsValid<T>(value: T, schema: ZodSchema<T>): boolean {
18
+ export function zIsValid<T>(value: T, schema: ZodType<T>): boolean {
17
19
  const { success } = schema.safeParse(value)
18
20
  return success
19
21
  }
20
22
 
21
- export function zValidate<T>(value: T, schema: ZodSchema<T>): T {
23
+ export function zValidate<T>(value: T, schema: ZodType<T>): T {
22
24
  const r = zSafeValidate(value, schema)
23
25
  if (r.success) {
24
26
  return r.data
@@ -29,7 +31,7 @@ export function zValidate<T>(value: T, schema: ZodSchema<T>): T {
29
31
 
30
32
  export function zSafeValidate<T>(
31
33
  value: T,
32
- schema: ZodSchema<T>,
34
+ schema: ZodType<T>,
33
35
  // objectName?: string,
34
36
  ): ZodSuccessResult<T> | ZodErrorResult<T> {
35
37
  const r = schema.safeParse(value)
@@ -39,43 +41,51 @@ export function zSafeValidate<T>(
39
41
 
40
42
  return {
41
43
  success: false,
42
- error: new ZodValidationError<T>(r.error.issues, value, schema),
44
+ error: new ZodValidationError(r.error, value, schema),
43
45
  }
44
46
  }
45
47
 
46
- export class ZodValidationError<T> extends ZodError<T> {
47
- constructor(
48
- issues: ZodIssue[],
49
- public value: T,
50
- public schema: ZodSchema<T>,
51
- ) {
52
- super(issues)
53
- }
48
+ export interface ZodValidationErrorData extends ErrorData {
49
+ // issues: $ZodIssue[]
50
+ // joiValidationObjectName?: string
51
+ // joiValidationObjectId?: string
52
+ /**
53
+ * Error "annotation" is stripped in Error.message.
54
+ * This field contains the "full" annotation.
55
+ *
56
+ * This field is non-enumerable, won't be printed or included in JSON by default,
57
+ * but still accessible programmatically (via `err.data.annotation`) when needed!
58
+ */
59
+ // annotation?: string
60
+ }
54
61
 
55
- override get message(): string {
56
- return this.annotate()
62
+ export class ZodValidationError extends AppError<ZodValidationErrorData> {
63
+ constructor(zodError: ZodError, value: any, schema: ZodType) {
64
+ const message = createZodErrorMessage(zodError, schema, value)
65
+ // const message = z.prettifyError(zodError) // todo: consider adopting it instead
66
+ super(message, {}, { name: 'ZodValidationError' })
57
67
  }
68
+ }
58
69
 
59
- annotate(): string {
60
- let objectTitle = this.schema.description
70
+ function createZodErrorMessage<T>(err: ZodError<T>, schema: ZodType<T>, value: T): string {
71
+ let objectTitle = schema.description
61
72
 
62
- if (typeof this.value === 'object' && this.value) {
63
- const objectName = this.schema.description || this.value.constructor?.name
64
- const objectId = (this.value as any)['id'] as string
65
- objectTitle = [objectName, objectId].filter(Boolean).join('.')
66
- }
73
+ if (typeof value === 'object' && value) {
74
+ const objectName = schema.description || value.constructor?.name
75
+ const objectId = (value as any)['id'] as string
76
+ objectTitle = [objectName, objectId].filter(Boolean).join('.')
77
+ }
67
78
 
68
- objectTitle ||= 'data'
79
+ objectTitle ||= 'data'
69
80
 
70
- return [
71
- `Invalid ${objectTitle}`,
72
- '',
73
- 'Input:',
74
- _stringify(this.value),
75
- this.issues.length > 1 ? `\n${this.issues.length} issues:` : '',
76
- ...this.issues.slice(0, 100).map(i => {
77
- return [i.path.join('.'), i.message].filter(Boolean).join(': ')
78
- }),
79
- ].join('\n')
80
- }
81
+ return [
82
+ `Invalid ${objectTitle}`,
83
+ '',
84
+ 'Input:',
85
+ _stringify(value),
86
+ err.issues.length > 1 ? `\n${err.issues.length} issues:` : '',
87
+ ...err.issues.slice(0, 100).map(i => {
88
+ return [i.path.join('.'), i.message].filter(Boolean).join(': ')
89
+ }),
90
+ ].join('\n')
81
91
  }