@naturalcycles/js-lib 15.24.0 → 15.25.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.
@@ -47,7 +47,7 @@ export interface JsonSchemaNot<T = unknown> extends JsonSchemaAny<T> {
47
47
  export interface JsonSchemaConst<T = unknown> extends JsonSchemaAny<T> {
48
48
  const: T;
49
49
  }
50
- export interface JsonSchemaString extends JsonSchemaAny<string> {
50
+ export interface JsonSchemaString<T extends string = string> extends JsonSchemaAny<T> {
51
51
  type: 'string';
52
52
  pattern?: string;
53
53
  minLength?: number;
@@ -60,7 +60,7 @@ export interface JsonSchemaString extends JsonSchemaAny<string> {
60
60
  */
61
61
  transform?: ('trim' | 'toLowerCase' | 'toUpperCase')[];
62
62
  }
63
- export interface JsonSchemaNumber extends JsonSchemaAny<number> {
63
+ export interface JsonSchemaNumber<T extends number = number> extends JsonSchemaAny<T> {
64
64
  type: 'number' | 'integer';
65
65
  format?: string;
66
66
  multipleOf?: number;
@@ -1,13 +1,13 @@
1
- import type { AnyObject, BaseDBEntity } from '../types.js';
1
+ import type { AnyObject, BaseDBEntity, IsoDate, UnixTimestamp } from '../types.js';
2
2
  import type { JsonSchema, JsonSchemaAllOf, JsonSchemaAny, JsonSchemaArray, JsonSchemaBoolean, JsonSchemaConst, JsonSchemaEnum, JsonSchemaNull, JsonSchemaNumber, JsonSchemaObject, JsonSchemaOneOf, JsonSchemaRef, JsonSchemaString, JsonSchemaTuple } from './jsonSchema.model.js';
3
3
  export interface JsonSchemaBuilder<T = unknown> {
4
4
  build: () => JsonSchema<T>;
5
5
  }
6
6
  /**
7
7
  * Fluent (chainable) API to manually create Json Schemas.
8
- * Inspired by Joi
8
+ * Inspired by Joi and Zod.
9
9
  */
10
- export declare const jsonSchema: {
10
+ export declare const j: {
11
11
  any<T = unknown>(): JsonSchemaAnyBuilder<T, JsonSchemaAny<T>>;
12
12
  const<T = unknown>(value: T): JsonSchemaAnyBuilder<T, JsonSchemaConst<T>>;
13
13
  null(): JsonSchemaAnyBuilder<null, JsonSchemaNull>;
@@ -15,14 +15,14 @@ export declare const jsonSchema: {
15
15
  enum<T = unknown>(enumValues: T[]): JsonSchemaAnyBuilder<T, JsonSchemaEnum<T>>;
16
16
  boolean(): JsonSchemaAnyBuilder<boolean, JsonSchemaBoolean>;
17
17
  buffer(): JsonSchemaAnyBuilder<Buffer<ArrayBufferLike>, JsonSchemaAny<Buffer<ArrayBufferLike>>>;
18
- number(): JsonSchemaNumberBuilder;
19
- integer(): JsonSchemaNumberBuilder;
20
- unixTimestamp(): JsonSchemaNumberBuilder;
21
- unixTimestamp2000(): JsonSchemaNumberBuilder;
22
- string(): JsonSchemaStringBuilder;
23
- dateString(): JsonSchemaStringBuilder;
24
- object<T extends AnyObject>(props: { [k in keyof T]: JsonSchemaAnyBuilder<T[k]>; }): JsonSchemaObjectBuilder<T>;
25
- rootObject<T extends AnyObject>(props: { [k in keyof T]: JsonSchemaAnyBuilder<T[k]>; }): JsonSchemaObjectBuilder<T>;
18
+ number<T extends number = number>(): JsonSchemaNumberBuilder<T>;
19
+ integer<T extends number = number>(): JsonSchemaNumberBuilder<T>;
20
+ unixTimestamp(): JsonSchemaNumberBuilder<UnixTimestamp>;
21
+ unixTimestamp2000(): JsonSchemaNumberBuilder<UnixTimestamp>;
22
+ string<T extends string = string>(): JsonSchemaStringBuilder<T>;
23
+ isoDate(): JsonSchemaStringBuilder<IsoDate>;
24
+ object<T extends AnyObject>(props: { [K in keyof T]: JsonSchemaAnyBuilder<T[K]>; }): JsonSchemaObjectBuilder<T>;
25
+ rootObject<T extends AnyObject>(props: { [K in keyof T]: JsonSchemaAnyBuilder<T[K]>; }): JsonSchemaObjectBuilder<T>;
26
26
  array<ITEM = unknown>(itemSchema: JsonSchemaAnyBuilder<ITEM>): JsonSchemaArrayBuilder<ITEM>;
27
27
  tuple<T extends any[] = unknown[]>(items: JsonSchemaAnyBuilder[]): JsonSchemaTupleBuilder<T>;
28
28
  oneOf<T = unknown>(items: JsonSchemaAnyBuilder[]): JsonSchemaAnyBuilder<T, JsonSchemaOneOf<T>>;
@@ -54,7 +54,7 @@ export declare class JsonSchemaAnyBuilder<T = unknown, SCHEMA_TYPE extends JsonS
54
54
  build(): SCHEMA_TYPE;
55
55
  clone(): JsonSchemaAnyBuilder<T, SCHEMA_TYPE>;
56
56
  }
57
- export declare class JsonSchemaNumberBuilder extends JsonSchemaAnyBuilder<number, JsonSchemaNumber> {
57
+ export declare class JsonSchemaNumberBuilder<T extends number = number> extends JsonSchemaAnyBuilder<T, JsonSchemaNumber<T>> {
58
58
  constructor();
59
59
  integer(): this;
60
60
  multipleOf(multipleOf: number): this;
@@ -78,7 +78,7 @@ export declare class JsonSchemaNumberBuilder extends JsonSchemaAnyBuilder<number
78
78
  utcOffset: () => this;
79
79
  utcOffsetHours: () => this;
80
80
  }
81
- export declare class JsonSchemaStringBuilder extends JsonSchemaAnyBuilder<string, JsonSchemaString> {
81
+ export declare class JsonSchemaStringBuilder<T extends string = string> extends JsonSchemaAnyBuilder<T, JsonSchemaString<T>> {
82
82
  constructor();
83
83
  pattern(pattern: string): this;
84
84
  min(minLength: number): this;
@@ -86,7 +86,7 @@ export declare class JsonSchemaStringBuilder extends JsonSchemaAnyBuilder<string
86
86
  length(minLength: number, maxLength: number): this;
87
87
  format(format: string): this;
88
88
  email: () => this;
89
- date: () => this;
89
+ isoDate: () => this;
90
90
  url: () => this;
91
91
  ipv4: () => this;
92
92
  ipv6: () => this;
@@ -5,9 +5,9 @@ import { JSON_SCHEMA_ORDER } from './jsonSchema.cnst.js';
5
5
  import { mergeJsonSchemaObjects } from './jsonSchema.util.js';
6
6
  /**
7
7
  * Fluent (chainable) API to manually create Json Schemas.
8
- * Inspired by Joi
8
+ * Inspired by Joi and Zod.
9
9
  */
10
- export const jsonSchema = {
10
+ export const j = {
11
11
  any() {
12
12
  return new JsonSchemaAnyBuilder({});
13
13
  },
@@ -56,8 +56,8 @@ export const jsonSchema = {
56
56
  string() {
57
57
  return new JsonSchemaStringBuilder();
58
58
  },
59
- dateString() {
60
- return new JsonSchemaStringBuilder().date();
59
+ isoDate() {
60
+ return new JsonSchemaStringBuilder().isoDate();
61
61
  },
62
62
  // email: () => new JsonSchemaStringBuilder().email(),
63
63
  // complex types
@@ -204,10 +204,10 @@ export class JsonSchemaNumberBuilder extends JsonSchemaAnyBuilder {
204
204
  int64 = () => this.format('int64');
205
205
  float = () => this.format('float');
206
206
  double = () => this.format('double');
207
- unixTimestamp = () => this.format('unixTimestamp');
208
- unixTimestamp2000 = () => this.format('unixTimestamp2000');
209
- unixTimestampMillis = () => this.format('unixTimestampMillis');
210
- unixTimestampMillis2000 = () => this.format('unixTimestampMillis2000');
207
+ unixTimestamp = () => this.format('unixTimestamp').description('UnixTimestamp');
208
+ unixTimestamp2000 = () => this.format('unixTimestamp2000').description('UnixTimestamp2000');
209
+ unixTimestampMillis = () => this.format('unixTimestampMillis').description('UnixTimestampMillis');
210
+ unixTimestampMillis2000 = () => this.format('unixTimestampMillis2000').description('UnixTimestampMillis2000');
211
211
  utcOffset = () => this.format('utcOffset');
212
212
  utcOffsetHours = () => this.format('utcOffsetHours');
213
213
  }
@@ -238,7 +238,7 @@ export class JsonSchemaStringBuilder extends JsonSchemaAnyBuilder {
238
238
  return this;
239
239
  }
240
240
  email = () => this.format('email');
241
- date = () => this.format('date');
241
+ isoDate = () => this.format('date').description('IsoDate'); // todo: make it custom isoDate instead
242
242
  url = () => this.format('url');
243
243
  ipv4 = () => this.format('ipv4');
244
244
  ipv6 = () => this.format('ipv6');
@@ -1,6 +1,6 @@
1
- import { jsonSchema } from './jsonSchemaBuilder.js';
2
- export const baseDBEntityJsonSchema = jsonSchema.object({
3
- id: jsonSchema.string(),
4
- created: jsonSchema.unixTimestamp2000(),
5
- updated: jsonSchema.unixTimestamp2000(),
1
+ import { j } from './jsonSchemaBuilder.js';
2
+ export const baseDBEntityJsonSchema = j.object({
3
+ id: j.string(),
4
+ created: j.unixTimestamp2000(),
5
+ updated: j.unixTimestamp2000(),
6
6
  });
@@ -1,7 +1,7 @@
1
1
  import type { ZodString } from 'zod';
2
2
  import { z } from 'zod';
3
3
  import type { IANATimezone, IsoDate, UnixTimestamp, UnixTimestampMillis } from '../types.js';
4
- type ZodBranded<T, B> = T & Record<'_zod', Record<'output', number & B>>;
4
+ type ZodBranded<T, B> = T & Record<'_zod', Record<'output', B>>;
5
5
  export type ZodBrandedString<B> = ZodBranded<z.ZodString, B>;
6
6
  export type ZodBrandedInt<B> = ZodBranded<z.ZodInt, B>;
7
7
  export type ZodBrandedNumber<B> = ZodBranded<z.ZodNumber, B>;
@@ -44,8 +44,8 @@ function isoDate() {
44
44
  .string()
45
45
  .refine(v => {
46
46
  return /^\d{4}-\d{2}-\d{2}$/.test(v);
47
- }, 'Must be an IsoDateString')
48
- .describe('IsoDateString');
47
+ }, 'Must be a YYYY-MM-DD string')
48
+ .describe('IsoDate');
49
49
  }
50
50
  function email() {
51
51
  return z.email().describe('Email');
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/js-lib",
3
3
  "type": "module",
4
- "version": "15.24.0",
4
+ "version": "15.25.0",
5
5
  "dependencies": {
6
6
  "tslib": "^2",
7
7
  "zod": "^4"
@@ -80,7 +80,7 @@ export interface JsonSchemaConst<T = unknown> extends JsonSchemaAny<T> {
80
80
  const: T // literal type
81
81
  }
82
82
 
83
- export interface JsonSchemaString extends JsonSchemaAny<string> {
83
+ export interface JsonSchemaString<T extends string = string> extends JsonSchemaAny<T> {
84
84
  type: 'string'
85
85
  pattern?: string
86
86
  minLength?: number
@@ -96,7 +96,7 @@ export interface JsonSchemaString extends JsonSchemaAny<string> {
96
96
  transform?: ('trim' | 'toLowerCase' | 'toUpperCase')[]
97
97
  }
98
98
 
99
- export interface JsonSchemaNumber extends JsonSchemaAny<number> {
99
+ export interface JsonSchemaNumber<T extends number = number> extends JsonSchemaAny<T> {
100
100
  type: 'number' | 'integer'
101
101
  format?: string
102
102
  multipleOf?: number
@@ -1,7 +1,7 @@
1
1
  import { _uniq } from '../array/array.util.js'
2
2
  import { _deepCopy } from '../object/object.util.js'
3
3
  import { _sortObject } from '../object/sortObject.js'
4
- import type { AnyObject, BaseDBEntity } from '../types.js'
4
+ import type { AnyObject, BaseDBEntity, IsoDate, UnixTimestamp } from '../types.js'
5
5
  import { JSON_SCHEMA_ORDER } from './jsonSchema.cnst.js'
6
6
  import type {
7
7
  JsonSchema,
@@ -29,9 +29,9 @@ export interface JsonSchemaBuilder<T = unknown> {
29
29
 
30
30
  /**
31
31
  * Fluent (chainable) API to manually create Json Schemas.
32
- * Inspired by Joi
32
+ * Inspired by Joi and Zod.
33
33
  */
34
- export const jsonSchema = {
34
+ export const j = {
35
35
  any<T = unknown>() {
36
36
  return new JsonSchemaAnyBuilder<T, JsonSchemaAny<T>>({})
37
37
  },
@@ -65,34 +65,34 @@ export const jsonSchema = {
65
65
  },
66
66
 
67
67
  // number types
68
- number() {
69
- return new JsonSchemaNumberBuilder()
68
+ number<T extends number = number>() {
69
+ return new JsonSchemaNumberBuilder<T>()
70
70
  },
71
- integer() {
72
- return new JsonSchemaNumberBuilder().integer()
71
+ integer<T extends number = number>() {
72
+ return new JsonSchemaNumberBuilder<T>().integer()
73
73
  },
74
74
  unixTimestamp() {
75
- return new JsonSchemaNumberBuilder().unixTimestamp()
75
+ return new JsonSchemaNumberBuilder<UnixTimestamp>().unixTimestamp()
76
76
  },
77
77
  unixTimestamp2000() {
78
- return new JsonSchemaNumberBuilder().unixTimestamp2000()
78
+ return new JsonSchemaNumberBuilder<UnixTimestamp>().unixTimestamp2000()
79
79
  },
80
80
  // string types
81
- string() {
82
- return new JsonSchemaStringBuilder()
81
+ string<T extends string = string>() {
82
+ return new JsonSchemaStringBuilder<T>()
83
83
  },
84
- dateString() {
85
- return new JsonSchemaStringBuilder().date()
84
+ isoDate() {
85
+ return new JsonSchemaStringBuilder<IsoDate>().isoDate()
86
86
  },
87
87
  // email: () => new JsonSchemaStringBuilder().email(),
88
88
  // complex types
89
89
  object<T extends AnyObject>(props: {
90
- [k in keyof T]: JsonSchemaAnyBuilder<T[k]>
90
+ [K in keyof T]: JsonSchemaAnyBuilder<T[K]>
91
91
  }) {
92
92
  return new JsonSchemaObjectBuilder<T>().addProperties(props)
93
93
  },
94
94
  rootObject<T extends AnyObject>(props: {
95
- [k in keyof T]: JsonSchemaAnyBuilder<T[k]>
95
+ [K in keyof T]: JsonSchemaAnyBuilder<T[K]>
96
96
  }) {
97
97
  return new JsonSchemaObjectBuilder<T>().addProperties(props).$schemaDraft7()
98
98
  },
@@ -203,7 +203,10 @@ export class JsonSchemaAnyBuilder<T = unknown, SCHEMA_TYPE extends JsonSchema<T>
203
203
  }
204
204
  }
205
205
 
206
- export class JsonSchemaNumberBuilder extends JsonSchemaAnyBuilder<number, JsonSchemaNumber> {
206
+ export class JsonSchemaNumberBuilder<T extends number = number> extends JsonSchemaAnyBuilder<
207
+ T,
208
+ JsonSchemaNumber<T>
209
+ > {
207
210
  constructor() {
208
211
  super({
209
212
  type: 'number',
@@ -257,15 +260,22 @@ export class JsonSchemaNumberBuilder extends JsonSchemaAnyBuilder<number, JsonSc
257
260
  int64 = (): this => this.format('int64')
258
261
  float = (): this => this.format('float')
259
262
  double = (): this => this.format('double')
260
- unixTimestamp = (): this => this.format('unixTimestamp')
261
- unixTimestamp2000 = (): this => this.format('unixTimestamp2000')
262
- unixTimestampMillis = (): this => this.format('unixTimestampMillis')
263
- unixTimestampMillis2000 = (): this => this.format('unixTimestampMillis2000')
263
+ unixTimestamp = (): this => this.format('unixTimestamp').description('UnixTimestamp')
264
+ unixTimestamp2000 = (): this => this.format('unixTimestamp2000').description('UnixTimestamp2000')
265
+ unixTimestampMillis = (): this =>
266
+ this.format('unixTimestampMillis').description('UnixTimestampMillis')
267
+
268
+ unixTimestampMillis2000 = (): this =>
269
+ this.format('unixTimestampMillis2000').description('UnixTimestampMillis2000')
270
+
264
271
  utcOffset = (): this => this.format('utcOffset')
265
272
  utcOffsetHours = (): this => this.format('utcOffsetHours')
266
273
  }
267
274
 
268
- export class JsonSchemaStringBuilder extends JsonSchemaAnyBuilder<string, JsonSchemaString> {
275
+ export class JsonSchemaStringBuilder<T extends string = string> extends JsonSchemaAnyBuilder<
276
+ T,
277
+ JsonSchemaString<T>
278
+ > {
269
279
  constructor() {
270
280
  super({
271
281
  type: 'string',
@@ -298,7 +308,7 @@ export class JsonSchemaStringBuilder extends JsonSchemaAnyBuilder<string, JsonSc
298
308
  }
299
309
 
300
310
  email = (): this => this.format('email')
301
- date = (): this => this.format('date')
311
+ isoDate = (): this => this.format('date').description('IsoDate') // todo: make it custom isoDate instead
302
312
  url = (): this => this.format('url')
303
313
  ipv4 = (): this => this.format('ipv4')
304
314
  ipv6 = (): this => this.format('ipv6')
@@ -1,8 +1,8 @@
1
1
  import type { BaseDBEntity } from '../types.js'
2
- import { jsonSchema } from './jsonSchemaBuilder.js'
2
+ import { j } from './jsonSchemaBuilder.js'
3
3
 
4
- export const baseDBEntityJsonSchema = jsonSchema.object<BaseDBEntity>({
5
- id: jsonSchema.string(),
6
- created: jsonSchema.unixTimestamp2000(),
7
- updated: jsonSchema.unixTimestamp2000(),
4
+ export const baseDBEntityJsonSchema = j.object<BaseDBEntity>({
5
+ id: j.string(),
6
+ created: j.unixTimestamp2000(),
7
+ updated: j.unixTimestamp2000(),
8
8
  })
@@ -2,7 +2,7 @@ import type { ZodString } from 'zod'
2
2
  import { z } from 'zod'
3
3
  import type { IANATimezone, IsoDate, UnixTimestamp, UnixTimestampMillis } from '../types.js'
4
4
 
5
- type ZodBranded<T, B> = T & Record<'_zod', Record<'output', number & B>>
5
+ type ZodBranded<T, B> = T & Record<'_zod', Record<'output', B>>
6
6
  export type ZodBrandedString<B> = ZodBranded<z.ZodString, B>
7
7
  export type ZodBrandedInt<B> = ZodBranded<z.ZodInt, B>
8
8
  export type ZodBrandedNumber<B> = ZodBranded<z.ZodNumber, B>
@@ -58,8 +58,8 @@ function isoDate(): ZodBrandedString<IsoDate> {
58
58
  .string()
59
59
  .refine(v => {
60
60
  return /^\d{4}-\d{2}-\d{2}$/.test(v)
61
- }, 'Must be an IsoDateString')
62
- .describe('IsoDateString') as ZodBrandedString<IsoDate>
61
+ }, 'Must be a YYYY-MM-DD string')
62
+ .describe('IsoDate') as ZodBrandedString<IsoDate>
63
63
  }
64
64
 
65
65
  function email(): z.ZodEmail {