@naturalcycles/js-lib 15.24.1 → 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.
- package/dist/json-schema/jsonSchema.model.d.ts +2 -2
- package/dist/json-schema/jsonSchemaBuilder.d.ts +14 -14
- package/dist/json-schema/jsonSchemaBuilder.js +9 -9
- package/dist/json-schema/jsonSchemas.js +5 -5
- package/dist/zod/zod.shared.schemas.js +2 -2
- package/package.json +1 -1
- package/src/json-schema/jsonSchema.model.ts +2 -2
- package/src/json-schema/jsonSchemaBuilder.ts +32 -22
- package/src/json-schema/jsonSchemas.ts +5 -5
- package/src/zod/zod.shared.schemas.ts +2 -2
|
@@ -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<
|
|
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<
|
|
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
|
|
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
|
-
|
|
24
|
-
object<T extends AnyObject>(props: { [
|
|
25
|
-
rootObject<T extends AnyObject>(props: { [
|
|
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<
|
|
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<
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
60
|
-
return new JsonSchemaStringBuilder().
|
|
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
|
-
|
|
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 {
|
|
2
|
-
export const baseDBEntityJsonSchema =
|
|
3
|
-
id:
|
|
4
|
-
created:
|
|
5
|
-
updated:
|
|
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
|
});
|
|
@@ -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
|
|
48
|
-
.describe('
|
|
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
|
@@ -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<
|
|
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<
|
|
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
|
|
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
|
-
|
|
85
|
-
return new JsonSchemaStringBuilder().
|
|
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
|
-
[
|
|
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
|
-
[
|
|
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
|
|
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 =>
|
|
263
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
2
|
+
import { j } from './jsonSchemaBuilder.js'
|
|
3
3
|
|
|
4
|
-
export const baseDBEntityJsonSchema =
|
|
5
|
-
id:
|
|
6
|
-
created:
|
|
7
|
-
updated:
|
|
4
|
+
export const baseDBEntityJsonSchema = j.object<BaseDBEntity>({
|
|
5
|
+
id: j.string(),
|
|
6
|
+
created: j.unixTimestamp2000(),
|
|
7
|
+
updated: j.unixTimestamp2000(),
|
|
8
8
|
})
|
|
@@ -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
|
|
62
|
-
.describe('
|
|
61
|
+
}, 'Must be a YYYY-MM-DD string')
|
|
62
|
+
.describe('IsoDate') as ZodBrandedString<IsoDate>
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
function email(): z.ZodEmail {
|