@naturalcycles/nodejs-lib 15.77.0 → 15.77.1

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.
@@ -248,15 +248,13 @@ export declare class JsonSchemaObjectBuilder<IN extends AnyObject, OUT extends A
248
248
  * When set, the validation will not strip away properties that are not specified explicitly in the schema.
249
249
  */
250
250
  allowAdditionalProperties(): this;
251
- extend<P extends Record<string, JsonSchemaAnyBuilder<any, any, any>>>(props: P): JsonSchemaObjectBuilder<IN & {
252
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt> ? IsOpt extends true ? never : K : never]: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never;
253
- } & {
254
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt> ? IsOpt extends true ? K : never : never]?: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never;
255
- }, OUT & {
251
+ extend<P extends Record<string, JsonSchemaAnyBuilder<any, any, any>>>(props: P): JsonSchemaObjectBuilder<RelaxIndexSignature<IN & {
252
+ [K in keyof P]?: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never;
253
+ }>, AllowExtraKeys<RelaxIndexSignature<OUT & {
256
254
  [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt> ? IsOpt extends true ? never : K : never]: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never;
257
255
  } & {
258
256
  [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt> ? IsOpt extends true ? K : never : never]?: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never;
259
- }, false>;
257
+ }>>, false>;
260
258
  /**
261
259
  * Concatenates another schema to the current schema.
262
260
  *
@@ -279,15 +277,15 @@ export declare class JsonSchemaObjectBuilder<IN extends AnyObject, OUT extends A
279
277
  /**
280
278
  * Extends the current schema with `id`, `created` and `updated` according to NC DB conventions.
281
279
  */
282
- dbEntity(): JsonSchemaObjectBuilder<IN & {
280
+ dbEntity(): JsonSchemaObjectBuilder<RelaxIndexSignature<IN & {
281
+ id?: string | undefined;
282
+ created?: any;
283
+ updated?: any;
284
+ }>, AllowExtraKeys<RelaxIndexSignature<OUT & {
283
285
  id: string;
284
286
  created: any;
285
287
  updated: any;
286
- } & {}, OUT & {
287
- id: string;
288
- created: any;
289
- updated: any;
290
- } & {}, false>;
288
+ } & {}>>, false>;
291
289
  minProperties(minProperties: number): this;
292
290
  maxProperties(maxProperties: number): this;
293
291
  exclusiveProperties(propNames: readonly (keyof IN & string)[]): this;
@@ -455,7 +453,22 @@ declare function withEnumKeys<const T extends readonly (string | number)[] | Str
455
453
  type Expand<T> = {
456
454
  [K in keyof T]: T[K];
457
455
  };
458
- type ExactMatch<A, B> = (<T>() => T extends Expand<A> ? 1 : 2) extends <T>() => T extends Expand<B> ? 1 : 2 ? (<T>() => T extends Expand<B> ? 1 : 2) extends <T>() => T extends Expand<A> ? 1 : 2 ? true : false : false;
456
+ type StripIndexSignatureDeep<T> = T extends readonly unknown[] ? T : T extends Record<string, any> ? {
457
+ [K in keyof T as string extends K ? never : number extends K ? never : symbol extends K ? never : K]: StripIndexSignatureDeep<T[K]>;
458
+ } : T;
459
+ type RelaxIndexSignature<T> = T extends readonly unknown[] ? T : T extends AnyObject ? string extends keyof T ? any : {
460
+ [K in keyof T]: RelaxIndexSignature<T[K]>;
461
+ } : T;
462
+ declare const allowExtraKeysSymbol: unique symbol;
463
+ type AllowExtraKeys<T> = T & {
464
+ readonly [allowExtraKeysSymbol]?: true;
465
+ };
466
+ type HasAllowExtraKeys<T> = T extends {
467
+ readonly [allowExtraKeysSymbol]?: true;
468
+ } ? true : false;
469
+ type IsAssignableRelaxed<A, B> = [RelaxIndexSignature<A>] extends [B] ? true : false;
470
+ type ExactMatchBase<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? (<T>() => T extends B ? 1 : 2) extends <T>() => T extends A ? 1 : 2 ? true : false : false;
471
+ type ExactMatch<A, B> = HasAllowExtraKeys<B> extends true ? IsAssignableRelaxed<B, A> : ExactMatchBase<Expand<A>, Expand<B>> extends true ? true : ExactMatchBase<Expand<StripIndexSignatureDeep<A>>, Expand<StripIndexSignatureDeep<B>>>;
459
472
  type BuilderOutUnion<B extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
460
473
  [K in keyof B]: B[K] extends JsonSchemaAnyBuilder<any, infer O, any> ? O : never;
461
474
  }[number];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/nodejs-lib",
3
3
  "type": "module",
4
- "version": "15.77.0",
4
+ "version": "15.77.1",
5
5
  "dependencies": {
6
6
  "@naturalcycles/js-lib": "^15",
7
7
  "@types/js-yaml": "^4",
@@ -869,36 +869,30 @@ export class JsonSchemaObjectBuilder<
869
869
  extend<P extends Record<string, JsonSchemaAnyBuilder<any, any, any>>>(
870
870
  props: P,
871
871
  ): JsonSchemaObjectBuilder<
872
- IN & {
873
- // required keys
874
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
875
- ? IsOpt extends true
876
- ? never
877
- : K
878
- : never]: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never
879
- } & {
880
- // optional keys
881
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
882
- ? IsOpt extends true
883
- ? K
884
- : never
885
- : never]?: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never
886
- },
887
- OUT & {
888
- // required keys
889
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
890
- ? IsOpt extends true
891
- ? never
892
- : K
893
- : never]: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
894
- } & {
895
- // optional keys
896
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
897
- ? IsOpt extends true
898
- ? K
899
- : never
900
- : never]?: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
901
- },
872
+ RelaxIndexSignature<
873
+ IN & {
874
+ [K in keyof P]?: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never
875
+ }
876
+ >,
877
+ AllowExtraKeys<
878
+ RelaxIndexSignature<
879
+ OUT & {
880
+ // required keys
881
+ [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
882
+ ? IsOpt extends true
883
+ ? never
884
+ : K
885
+ : never]: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
886
+ } & {
887
+ // optional keys
888
+ [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
889
+ ? IsOpt extends true
890
+ ? K
891
+ : never
892
+ : never]?: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
893
+ }
894
+ >
895
+ >,
902
896
  false
903
897
  > {
904
898
  const newBuilder = new JsonSchemaObjectBuilder()
@@ -1445,13 +1439,50 @@ function withEnumKeys<
1445
1439
 
1446
1440
  type Expand<T> = { [K in keyof T]: T[K] }
1447
1441
 
1448
- type ExactMatch<A, B> =
1449
- (<T>() => T extends Expand<A> ? 1 : 2) extends <T>() => T extends Expand<B> ? 1 : 2
1450
- ? (<T>() => T extends Expand<B> ? 1 : 2) extends <T>() => T extends Expand<A> ? 1 : 2
1442
+ type StripIndexSignatureDeep<T> = T extends readonly unknown[]
1443
+ ? T
1444
+ : T extends Record<string, any>
1445
+ ? {
1446
+ [K in keyof T as string extends K
1447
+ ? never
1448
+ : number extends K
1449
+ ? never
1450
+ : symbol extends K
1451
+ ? never
1452
+ : K]: StripIndexSignatureDeep<T[K]>
1453
+ }
1454
+ : T
1455
+
1456
+ type RelaxIndexSignature<T> = T extends readonly unknown[]
1457
+ ? T
1458
+ : T extends AnyObject
1459
+ ? string extends keyof T
1460
+ ? any
1461
+ : { [K in keyof T]: RelaxIndexSignature<T[K]> }
1462
+ : T
1463
+
1464
+ declare const allowExtraKeysSymbol: unique symbol
1465
+
1466
+ type AllowExtraKeys<T> = T & { readonly [allowExtraKeysSymbol]?: true }
1467
+
1468
+ type HasAllowExtraKeys<T> = T extends { readonly [allowExtraKeysSymbol]?: true } ? true : false
1469
+
1470
+ type IsAssignableRelaxed<A, B> = [RelaxIndexSignature<A>] extends [B] ? true : false
1471
+
1472
+ type ExactMatchBase<A, B> =
1473
+ (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2
1474
+ ? (<T>() => T extends B ? 1 : 2) extends <T>() => T extends A ? 1 : 2
1451
1475
  ? true
1452
1476
  : false
1453
1477
  : false
1454
1478
 
1479
+ type ExactMatch<A, B> =
1480
+ HasAllowExtraKeys<B> extends true
1481
+ ? IsAssignableRelaxed<B, A>
1482
+ : ExactMatchBase<Expand<A>, Expand<B>> extends true
1483
+ ? true
1484
+ : ExactMatchBase<Expand<StripIndexSignatureDeep<A>>, Expand<StripIndexSignatureDeep<B>>>
1485
+
1455
1486
  type BuilderOutUnion<B extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
1456
1487
  [K in keyof B]: B[K] extends JsonSchemaAnyBuilder<any, infer O, any> ? O : never
1457
1488
  }[number]