@naturalcycles/nodejs-lib 15.78.1 → 15.79.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.
@@ -65,6 +65,7 @@ export declare const j: {
65
65
  and(): {
66
66
  silentBob: () => never;
67
67
  };
68
+ literal<const V extends string | number | boolean | null>(v: V): JsonSchemaEnumBuilder<V, V, false>;
68
69
  };
69
70
  export declare class JsonSchemaTerminal<IN, OUT, Opt> {
70
71
  protected schema: JsonSchema;
@@ -248,13 +249,13 @@ export declare class JsonSchemaObjectBuilder<IN extends AnyObject, OUT extends A
248
249
  * When set, the validation will not strip away properties that are not specified explicitly in the schema.
249
250
  */
250
251
  allowAdditionalProperties(): this;
251
- extend<P extends Record<string, JsonSchemaAnyBuilder<any, any, any>>>(props: P): JsonSchemaObjectBuilder<RelaxIndexSignature<Override<IN, {
252
+ extend<P extends Record<string, JsonSchemaAnyBuilder<any, any, any>>>(props: P): JsonSchemaObjectBuilder<RelaxIndexSignature<OptionalDbEntityFields<Override<IN, {
252
253
  [K in keyof P]?: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never;
253
- }>>, AllowExtraKeys<RelaxIndexSignature<Override<OUT, {
254
+ }>>>, Override<OUT, {
254
255
  [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;
255
256
  } & {
256
257
  [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;
257
- }>>>, false>;
258
+ }>, false>;
258
259
  /**
259
260
  * Concatenates another schema to the current schema.
260
261
  *
@@ -277,15 +278,15 @@ export declare class JsonSchemaObjectBuilder<IN extends AnyObject, OUT extends A
277
278
  /**
278
279
  * Extends the current schema with `id`, `created` and `updated` according to NC DB conventions.
279
280
  */
280
- dbEntity(): JsonSchemaObjectBuilder<RelaxIndexSignature<Override<IN, {
281
+ dbEntity(): JsonSchemaObjectBuilder<RelaxIndexSignature<OptionalDbEntityFields<Override<IN, {
281
282
  id?: string | undefined;
282
283
  created?: any;
283
284
  updated?: any;
284
- }>>, AllowExtraKeys<RelaxIndexSignature<Override<OUT, {
285
+ }>>>, Override<OUT, {
285
286
  id: string;
286
287
  created: any;
287
288
  updated: any;
288
- } & {}>>>, false>;
289
+ } & {}>, false>;
289
290
  minProperties(minProperties: number): this;
290
291
  maxProperties(maxProperties: number): this;
291
292
  exclusiveProperties(propNames: readonly (keyof IN & string)[]): this;
@@ -421,7 +422,7 @@ declare function object<IN extends AnyObject>(props: {
421
422
  }): JsonSchemaObjectBuilder<IN, IN, false>;
422
423
  declare function objectInfer<P extends Record<string, JsonSchemaAnyBuilder<any, any, any>>>(props: P): JsonSchemaObjectInferringBuilder<P, false>;
423
424
  declare function objectDbEntity(props: AnyObject): never;
424
- declare function objectDbEntity<IN extends BaseDBEntity & AnyObject, EXTRA_KEYS extends Exclude<keyof IN, keyof BaseDBEntity> = Exclude<keyof IN, keyof BaseDBEntity>>(props: {
425
+ declare function objectDbEntity<IN extends BaseDBEntity, EXTRA_KEYS extends Exclude<keyof IN, keyof BaseDBEntity> = Exclude<keyof IN, keyof BaseDBEntity>>(props: {
425
426
  [K in EXTRA_KEYS]-?: BuilderFor<IN[K]>;
426
427
  } & (ExactMatch<IN['id'], BaseDBEntity['id']> extends true ? {
427
428
  id?: BuilderFor<BaseDBEntity['id']>;
@@ -456,18 +457,17 @@ type Expand<T> = {
456
457
  type StripIndexSignatureDeep<T> = T extends readonly unknown[] ? T : T extends Record<string, any> ? {
457
458
  [K in keyof T as string extends K ? never : number extends K ? never : symbol extends K ? never : K]: StripIndexSignatureDeep<T[K]>;
458
459
  } : T;
459
- type RelaxIndexSignature<T> = T extends readonly unknown[] ? T : T extends AnyObject ? string extends keyof T ? any : {
460
+ type RelaxIndexSignature<T> = T extends readonly unknown[] ? T : T extends AnyObject ? {
460
461
  [K in keyof T]: RelaxIndexSignature<T[K]>;
461
462
  } : T;
462
463
  type Override<T, U> = Omit<T, keyof U> & U;
463
464
  declare const allowExtraKeysSymbol: unique symbol;
464
- type AllowExtraKeys<T> = T & {
465
- readonly [allowExtraKeysSymbol]?: true;
466
- };
467
465
  type HasAllowExtraKeys<T> = T extends {
468
466
  readonly [allowExtraKeysSymbol]?: true;
469
467
  } ? true : false;
470
- type IsAssignableRelaxed<A, B> = [RelaxIndexSignature<A>] extends [B] ? true : false;
468
+ type IsAny<T> = 0 extends 1 & T ? true : false;
469
+ type IsAssignableRelaxed<A, B> = IsAny<RelaxIndexSignature<A>> extends true ? true : [RelaxIndexSignature<A>] extends [B] ? true : false;
470
+ type OptionalDbEntityFields<T> = T extends BaseDBEntity ? Omit<T, keyof BaseDBEntity> & Partial<Pick<T, keyof BaseDBEntity>> : T;
471
471
  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;
472
472
  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>>>;
473
473
  type BuilderOutUnion<B extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
@@ -138,6 +138,14 @@ export const j = {
138
138
  },
139
139
  };
140
140
  },
141
+ literal(v) {
142
+ let baseType = 'other';
143
+ if (typeof v === 'string')
144
+ baseType = 'string';
145
+ if (typeof v === 'number')
146
+ baseType = 'number';
147
+ return new JsonSchemaEnumBuilder([v], baseType);
148
+ },
141
149
  };
142
150
  const TS_2500 = 16725225600; // 2500-01-01
143
151
  const TS_2500_MILLIS = TS_2500 * 1000;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/nodejs-lib",
3
3
  "type": "module",
4
- "version": "15.78.1",
4
+ "version": "15.79.0",
5
5
  "dependencies": {
6
6
  "@naturalcycles/js-lib": "^15",
7
7
  "@types/js-yaml": "^4",
@@ -223,6 +223,13 @@ export const j = {
223
223
  },
224
224
  }
225
225
  },
226
+
227
+ literal<const V extends string | number | boolean | null>(v: V) {
228
+ let baseType: EnumBaseType = 'other'
229
+ if (typeof v === 'string') baseType = 'string'
230
+ if (typeof v === 'number') baseType = 'number'
231
+ return new JsonSchemaEnumBuilder<V>([v], baseType)
232
+ },
226
233
  }
227
234
 
228
235
  const TS_2500 = 16725225600 // 2500-01-01
@@ -870,35 +877,33 @@ export class JsonSchemaObjectBuilder<
870
877
  props: P,
871
878
  ): JsonSchemaObjectBuilder<
872
879
  RelaxIndexSignature<
873
- Override<
874
- IN,
875
- {
876
- [K in keyof P]?: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never
877
- }
878
- >
879
- >,
880
- AllowExtraKeys<
881
- RelaxIndexSignature<
880
+ OptionalDbEntityFields<
882
881
  Override<
883
- OUT,
882
+ IN,
884
883
  {
885
- // required keys
886
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
887
- ? IsOpt extends true
888
- ? never
889
- : K
890
- : never]: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
891
- } & {
892
- // optional keys
893
- [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
894
- ? IsOpt extends true
895
- ? K
896
- : never
897
- : never]?: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
884
+ [K in keyof P]?: P[K] extends JsonSchemaAnyBuilder<infer IN2, any, any> ? IN2 : never
898
885
  }
899
886
  >
900
887
  >
901
888
  >,
889
+ Override<
890
+ OUT,
891
+ {
892
+ // required keys
893
+ [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
894
+ ? IsOpt extends true
895
+ ? never
896
+ : K
897
+ : never]: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
898
+ } & {
899
+ // optional keys
900
+ [K in keyof P as P[K] extends JsonSchemaAnyBuilder<any, any, infer IsOpt>
901
+ ? IsOpt extends true
902
+ ? K
903
+ : never
904
+ : never]?: P[K] extends JsonSchemaAnyBuilder<any, infer OUT2, any> ? OUT2 : never
905
+ }
906
+ >,
902
907
  false
903
908
  > {
904
909
  const newBuilder = new JsonSchemaObjectBuilder()
@@ -1299,7 +1304,7 @@ function objectInfer<P extends Record<string, JsonSchemaAnyBuilder<any, any, any
1299
1304
 
1300
1305
  function objectDbEntity(props: AnyObject): never
1301
1306
  function objectDbEntity<
1302
- IN extends BaseDBEntity & AnyObject,
1307
+ IN extends BaseDBEntity,
1303
1308
  EXTRA_KEYS extends Exclude<keyof IN, keyof BaseDBEntity> = Exclude<keyof IN, keyof BaseDBEntity>,
1304
1309
  >(
1305
1310
  props: {
@@ -1462,20 +1467,27 @@ type StripIndexSignatureDeep<T> = T extends readonly unknown[]
1462
1467
  type RelaxIndexSignature<T> = T extends readonly unknown[]
1463
1468
  ? T
1464
1469
  : T extends AnyObject
1465
- ? string extends keyof T
1466
- ? any
1467
- : { [K in keyof T]: RelaxIndexSignature<T[K]> }
1470
+ ? { [K in keyof T]: RelaxIndexSignature<T[K]> }
1468
1471
  : T
1469
1472
 
1470
1473
  type Override<T, U> = Omit<T, keyof U> & U
1471
1474
 
1472
1475
  declare const allowExtraKeysSymbol: unique symbol
1473
1476
 
1474
- type AllowExtraKeys<T> = T & { readonly [allowExtraKeysSymbol]?: true }
1475
-
1476
1477
  type HasAllowExtraKeys<T> = T extends { readonly [allowExtraKeysSymbol]?: true } ? true : false
1477
1478
 
1478
- type IsAssignableRelaxed<A, B> = [RelaxIndexSignature<A>] extends [B] ? true : false
1479
+ type IsAny<T> = 0 extends 1 & T ? true : false
1480
+
1481
+ type IsAssignableRelaxed<A, B> =
1482
+ IsAny<RelaxIndexSignature<A>> extends true
1483
+ ? true
1484
+ : [RelaxIndexSignature<A>] extends [B]
1485
+ ? true
1486
+ : false
1487
+
1488
+ type OptionalDbEntityFields<T> = T extends BaseDBEntity
1489
+ ? Omit<T, keyof BaseDBEntity> & Partial<Pick<T, keyof BaseDBEntity>>
1490
+ : T
1479
1491
 
1480
1492
  type ExactMatchBase<A, B> =
1481
1493
  (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2