@naturalcycles/nodejs-lib 15.64.0 → 15.65.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.
@@ -75,7 +75,7 @@ export class AjvSchema {
75
75
  */
76
76
  static createFromZod(schema) {
77
77
  const jsonSchema = z.toJSONSchema(schema, {
78
- target: 'draft-7',
78
+ target: 'draft-2020-12',
79
79
  });
80
80
  return AjvSchema.create(jsonSchema);
81
81
  }
@@ -1,4 +1,4 @@
1
- import { Ajv, type Options } from 'ajv';
1
+ import { Ajv2020, type Options } from 'ajv/dist/2020.js';
2
2
  /**
3
3
  * Return cached instance of Ajv with default (recommended) options.
4
4
  *
@@ -27,4 +27,4 @@ export declare const getCoercingAjv: any;
27
27
  *
28
28
  * https://ajv.js.org/options.html
29
29
  */
30
- export declare function createAjv(opt?: Options): Ajv;
30
+ export declare function createAjv(opt?: Options): Ajv2020;
@@ -1,7 +1,7 @@
1
1
  import { _isBetween, _lazyValue } from '@naturalcycles/js-lib';
2
2
  import { Set2 } from '@naturalcycles/js-lib/object';
3
3
  import { _substringAfterLast } from '@naturalcycles/js-lib/string';
4
- import { Ajv } from 'ajv';
4
+ import { Ajv2020 } from 'ajv/dist/2020.js';
5
5
  import { validTLDs } from '../tlds.js';
6
6
  /* eslint-disable @typescript-eslint/prefer-string-starts-ends-with */
7
7
  // oxlint-disable unicorn/prefer-code-point
@@ -52,7 +52,7 @@ export const getCoercingAjv = _lazyValue(() => createAjv(AJV_MUTATING_COERCING_O
52
52
  * https://ajv.js.org/options.html
53
53
  */
54
54
  export function createAjv(opt) {
55
- const ajv = new Ajv({
55
+ const ajv = new Ajv2020({
56
56
  ...AJV_OPTIONS,
57
57
  ...opt,
58
58
  });
@@ -45,6 +45,7 @@ export declare const j: {
45
45
  withRegexKeys: typeof withRegexKeys;
46
46
  };
47
47
  array<IN, OUT, Opt>(itemSchema: JsonSchemaAnyBuilder<IN, OUT, Opt>): JsonSchemaArrayBuilder<IN, OUT, Opt>;
48
+ tuple<const S extends JsonSchemaAnyBuilder<any, any, any>[]>(items: S): JsonSchemaTupleBuilder<S>;
48
49
  set<IN, OUT, Opt>(itemSchema: JsonSchemaAnyBuilder<IN, OUT, Opt>): JsonSchemaSet2Builder<IN, OUT, Opt>;
49
50
  buffer(): JsonSchemaBufferBuilder;
50
51
  enum<const T extends readonly (string | number | boolean | null)[] | StringEnum | NumberEnum>(input: T, opt?: JsonBuilderRuleOpt): JsonSchemaEnumBuilder<T extends readonly (infer U)[] ? U : T extends StringEnum ? T[keyof T] : T extends NumberEnum ? T[keyof T] : never>;
@@ -331,6 +332,10 @@ export declare class JsonSchemaEnumBuilder<IN extends string | number | boolean
331
332
  constructor(enumValues: readonly IN[], baseType: EnumBaseType, opt?: JsonBuilderRuleOpt);
332
333
  branded<B extends IN>(): JsonSchemaEnumBuilder<B | IN, B, Opt>;
333
334
  }
335
+ export declare class JsonSchemaTupleBuilder<ITEMS extends JsonSchemaAnyBuilder<any, any, any>[]> extends JsonSchemaAnyBuilder<TupleIn<ITEMS>, TupleOut<ITEMS>, false> {
336
+ private readonly _items;
337
+ constructor(items: ITEMS);
338
+ }
334
339
  type EnumBaseType = 'string' | 'number' | 'other';
335
340
  export interface JsonSchema<IN = unknown, OUT = IN> {
336
341
  readonly in?: IN;
@@ -344,6 +349,7 @@ export interface JsonSchema<IN = unknown, OUT = IN> {
344
349
  writeOnly?: boolean;
345
350
  type?: string | string[];
346
351
  items?: JsonSchema;
352
+ prefixItems?: JsonSchema[];
347
353
  properties?: {
348
354
  [K in keyof IN & keyof OUT]: JsonSchema<IN[K], OUT[K]>;
349
355
  };
@@ -460,4 +466,10 @@ type EnumKeyUnion<T> = T extends readonly (infer U)[] ? U : T extends StringEnum
460
466
  type SchemaIn<S> = S extends JsonSchemaAnyBuilder<infer IN, any, any> ? IN : never;
461
467
  type SchemaOut<S> = S extends JsonSchemaAnyBuilder<any, infer OUT, any> ? OUT : never;
462
468
  type SchemaOpt<S> = S extends JsonSchemaAnyBuilder<any, any, infer Opt> ? (Opt extends true ? true : false) : false;
469
+ type TupleIn<T extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
470
+ [K in keyof T]: T[K] extends JsonSchemaAnyBuilder<infer I, any, any> ? I : never;
471
+ };
472
+ type TupleOut<T extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
473
+ [K in keyof T]: T[K] extends JsonSchemaAnyBuilder<any, infer O, any> ? O : never;
474
+ };
463
475
  export {};
@@ -71,6 +71,9 @@ export const j = {
71
71
  array(itemSchema) {
72
72
  return new JsonSchemaArrayBuilder(itemSchema);
73
73
  },
74
+ tuple(items) {
75
+ return new JsonSchemaTupleBuilder(items);
76
+ },
74
77
  set(itemSchema) {
75
78
  return new JsonSchemaSet2Builder(itemSchema);
76
79
  },
@@ -754,6 +757,18 @@ export class JsonSchemaEnumBuilder extends JsonSchemaAnyBuilder {
754
757
  return this;
755
758
  }
756
759
  }
760
+ export class JsonSchemaTupleBuilder extends JsonSchemaAnyBuilder {
761
+ _items;
762
+ constructor(items) {
763
+ super({
764
+ type: 'array',
765
+ prefixItems: items.map(i => i.build()),
766
+ minItems: items.length,
767
+ maxItems: items.length,
768
+ });
769
+ this._items = items;
770
+ }
771
+ }
757
772
  function object(props) {
758
773
  return new JsonSchemaObjectBuilder(props);
759
774
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/nodejs-lib",
3
3
  "type": "module",
4
- "version": "15.64.0",
4
+ "version": "15.65.0",
5
5
  "dependencies": {
6
6
  "@naturalcycles/js-lib": "^15",
7
7
  "@types/js-yaml": "^4",
@@ -100,7 +100,7 @@ export class AjvSchema<IN = unknown, OUT = IN> {
100
100
  schema: T,
101
101
  ): AjvSchema<T['_input'], T['_output']> {
102
102
  const jsonSchema = z.toJSONSchema(schema, {
103
- target: 'draft-7',
103
+ target: 'draft-2020-12',
104
104
  }) as unknown as JsonSchema<T['_input'], T['_output']>
105
105
 
106
106
  return AjvSchema.create(jsonSchema)
@@ -2,7 +2,7 @@ import { _isBetween, _lazyValue } from '@naturalcycles/js-lib'
2
2
  import { Set2 } from '@naturalcycles/js-lib/object'
3
3
  import { _substringAfterLast } from '@naturalcycles/js-lib/string'
4
4
  import type { AnyObject } from '@naturalcycles/js-lib/types'
5
- import { Ajv, type Options, type ValidateFunction } from 'ajv'
5
+ import { Ajv2020, type Options, type ValidateFunction } from 'ajv/dist/2020.js'
6
6
  import { validTLDs } from '../tlds.js'
7
7
  import type {
8
8
  JsonSchemaIsoDateOptions,
@@ -65,8 +65,8 @@ export const getCoercingAjv = _lazyValue(() => createAjv(AJV_MUTATING_COERCING_O
65
65
  *
66
66
  * https://ajv.js.org/options.html
67
67
  */
68
- export function createAjv(opt?: Options): Ajv {
69
- const ajv = new Ajv({
68
+ export function createAjv(opt?: Options): Ajv2020 {
69
+ const ajv = new Ajv2020({
70
70
  ...AJV_OPTIONS,
71
71
  ...opt,
72
72
  })
@@ -126,6 +126,12 @@ export const j = {
126
126
  return new JsonSchemaArrayBuilder(itemSchema)
127
127
  },
128
128
 
129
+ tuple<const S extends JsonSchemaAnyBuilder<any, any, any>[]>(
130
+ items: S,
131
+ ): JsonSchemaTupleBuilder<S> {
132
+ return new JsonSchemaTupleBuilder<S>(items)
133
+ },
134
+
129
135
  set<IN, OUT, Opt>(
130
136
  itemSchema: JsonSchemaAnyBuilder<IN, OUT, Opt>,
131
137
  ): JsonSchemaSet2Builder<IN, OUT, Opt> {
@@ -1139,6 +1145,23 @@ export class JsonSchemaEnumBuilder<
1139
1145
  }
1140
1146
  }
1141
1147
 
1148
+ export class JsonSchemaTupleBuilder<
1149
+ ITEMS extends JsonSchemaAnyBuilder<any, any, any>[],
1150
+ > extends JsonSchemaAnyBuilder<TupleIn<ITEMS>, TupleOut<ITEMS>, false> {
1151
+ private readonly _items: ITEMS
1152
+
1153
+ constructor(items: ITEMS) {
1154
+ super({
1155
+ type: 'array',
1156
+ prefixItems: items.map(i => i.build()),
1157
+ minItems: items.length,
1158
+ maxItems: items.length,
1159
+ })
1160
+
1161
+ this._items = items
1162
+ }
1163
+ }
1164
+
1142
1165
  type EnumBaseType = 'string' | 'number' | 'other'
1143
1166
 
1144
1167
  export interface JsonSchema<IN = unknown, OUT = IN> {
@@ -1156,6 +1179,7 @@ export interface JsonSchema<IN = unknown, OUT = IN> {
1156
1179
 
1157
1180
  type?: string | string[]
1158
1181
  items?: JsonSchema
1182
+ prefixItems?: JsonSchema[]
1159
1183
  properties?: {
1160
1184
  [K in keyof IN & keyof OUT]: JsonSchema<IN[K], OUT[K]>
1161
1185
  }
@@ -1421,3 +1445,11 @@ type SchemaIn<S> = S extends JsonSchemaAnyBuilder<infer IN, any, any> ? IN : nev
1421
1445
  type SchemaOut<S> = S extends JsonSchemaAnyBuilder<any, infer OUT, any> ? OUT : never
1422
1446
  type SchemaOpt<S> =
1423
1447
  S extends JsonSchemaAnyBuilder<any, any, infer Opt> ? (Opt extends true ? true : false) : false
1448
+
1449
+ type TupleIn<T extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
1450
+ [K in keyof T]: T[K] extends JsonSchemaAnyBuilder<infer I, any, any> ? I : never
1451
+ }
1452
+
1453
+ type TupleOut<T extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
1454
+ [K in keyof T]: T[K] extends JsonSchemaAnyBuilder<any, infer O, any> ? O : never
1455
+ }