@naturalcycles/nodejs-lib 15.61.0 → 15.62.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.
|
@@ -235,11 +235,32 @@ export declare class JsonSchemaObjectBuilder<IN extends AnyObject, OUT extends A
|
|
|
235
235
|
* When set, the validation will not strip away properties that are not specified explicitly in the schema.
|
|
236
236
|
*/
|
|
237
237
|
allowAdditionalProperties(): this;
|
|
238
|
-
extend
|
|
238
|
+
extend(props: AnyObject): never;
|
|
239
|
+
extend<IN2 extends AnyObject>(props: {
|
|
240
|
+
[K in keyof Required<IN2>]-?: JsonSchemaAnyBuilder<any, IN2[K], any>;
|
|
241
|
+
}): JsonSchemaObjectBuilder<IN & IN2, OUT & IN2, false>;
|
|
242
|
+
/**
|
|
243
|
+
* Concatenates another schema to the current schema.
|
|
244
|
+
*
|
|
245
|
+
* It expects a type to be passed in as a generic, and this type should be the expected final type.
|
|
246
|
+
*
|
|
247
|
+
* ```ts
|
|
248
|
+
* interface Foo { foo: string }
|
|
249
|
+
* const fooSchema = j.object<Foo>({ foo: j.string() })
|
|
250
|
+
*
|
|
251
|
+
* interface Bar { bar: number }
|
|
252
|
+
* const barSchema = j.object<Bar>({ bar: j.number() })
|
|
253
|
+
*
|
|
254
|
+
* interface Shu { foo: string, bar: number }
|
|
255
|
+
* const shuSchema = fooSchema.concat<Shu>(barSchema)
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
concat(other: any): never;
|
|
259
|
+
concat<FINAL extends AnyObject>(other: JsonSchemaObjectBuilder<any, any, any>): JsonSchemaObjectBuilder<FINAL, FINAL, false>;
|
|
239
260
|
/**
|
|
240
261
|
* Extends the current schema with `id`, `created` and `updated` according to NC DB conventions.
|
|
241
262
|
*/
|
|
242
|
-
dbEntity():
|
|
263
|
+
dbEntity(): never;
|
|
243
264
|
minProperties(minProperties: number): this;
|
|
244
265
|
maxProperties(maxProperties: number): this;
|
|
245
266
|
}
|
|
@@ -396,10 +417,10 @@ declare function withEnumKeys<const T extends readonly (string | number)[] | Str
|
|
|
396
417
|
} : {
|
|
397
418
|
[P in K]: SchemaOut<S>;
|
|
398
419
|
}, false>;
|
|
399
|
-
type Expand<T> =
|
|
400
|
-
[K in keyof
|
|
401
|
-
}
|
|
402
|
-
type ExactMatch<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
|
|
420
|
+
type Expand<T> = {
|
|
421
|
+
[K in keyof T]: T[K];
|
|
422
|
+
};
|
|
423
|
+
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;
|
|
403
424
|
type BuilderOutUnion<B extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
|
|
404
425
|
[K in keyof B]: B[K] extends JsonSchemaAnyBuilder<any, infer O, any> ? O : never;
|
|
405
426
|
}[number];
|
|
@@ -586,9 +586,18 @@ export class JsonSchemaObjectBuilder extends JsonSchemaAnyBuilder {
|
|
|
586
586
|
return this.cloneAndUpdateSchema({ additionalProperties: true });
|
|
587
587
|
}
|
|
588
588
|
extend(props) {
|
|
589
|
-
const clone = this.
|
|
589
|
+
const clone = this.clone();
|
|
590
590
|
const incomingSchemaBuilder = new JsonSchemaObjectBuilder(props);
|
|
591
591
|
mergeJsonSchemaObjects(clone.schema, incomingSchemaBuilder.schema);
|
|
592
|
+
// The incoming object is type-safe because `extend<Foo>()` expects a passed in type that matches the passed in props,
|
|
593
|
+
// but maybe the current schema was created differently, so that's what decides the typecheckedness.
|
|
594
|
+
const hasIsOfTypeCheck = this.schema.hasIsOfTypeCheck;
|
|
595
|
+
_objectAssign(clone.schema, { hasIsOfTypeCheck });
|
|
596
|
+
return clone;
|
|
597
|
+
}
|
|
598
|
+
concat(other) {
|
|
599
|
+
const clone = this.clone();
|
|
600
|
+
mergeJsonSchemaObjects(clone.schema, other.schema);
|
|
592
601
|
return clone;
|
|
593
602
|
}
|
|
594
603
|
/**
|
|
@@ -646,6 +655,10 @@ export class JsonSchemaObjectInferringBuilder extends JsonSchemaAnyBuilder {
|
|
|
646
655
|
_objectAssign(newBuilder.schema, _deepCopy(this.schema));
|
|
647
656
|
const incomingSchemaBuilder = new JsonSchemaObjectInferringBuilder(props);
|
|
648
657
|
mergeJsonSchemaObjects(newBuilder.schema, incomingSchemaBuilder.schema);
|
|
658
|
+
// This extend function is not type-safe as it is inferring,
|
|
659
|
+
// so even if the base schema was already type-checked,
|
|
660
|
+
// the new schema loses that quality.
|
|
661
|
+
_objectAssign(newBuilder.schema, { hasIsOfTypeCheck: false });
|
|
649
662
|
return newBuilder;
|
|
650
663
|
}
|
|
651
664
|
/**
|
package/package.json
CHANGED
|
@@ -828,18 +828,49 @@ export class JsonSchemaObjectBuilder<
|
|
|
828
828
|
return this.cloneAndUpdateSchema({ additionalProperties: true })
|
|
829
829
|
}
|
|
830
830
|
|
|
831
|
-
extend
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
831
|
+
extend(props: AnyObject): never
|
|
832
|
+
extend<IN2 extends AnyObject>(props: {
|
|
833
|
+
[K in keyof Required<IN2>]-?: JsonSchemaAnyBuilder<any, IN2[K], any>
|
|
834
|
+
}): JsonSchemaObjectBuilder<IN & IN2, OUT & IN2, false>
|
|
835
|
+
extend<IN2 extends AnyObject>(props: {
|
|
836
|
+
[key in keyof IN2]: JsonSchemaAnyBuilder<any, IN2[key], any>
|
|
837
|
+
}): JsonSchemaObjectBuilder<IN & IN2, OUT & IN2, false> {
|
|
838
|
+
const clone = this.clone()
|
|
839
839
|
|
|
840
840
|
const incomingSchemaBuilder = new JsonSchemaObjectBuilder<IN2, IN2, false>(props)
|
|
841
841
|
mergeJsonSchemaObjects(clone.schema as any, incomingSchemaBuilder.schema as any)
|
|
842
842
|
|
|
843
|
+
// The incoming object is type-safe because `extend<Foo>()` expects a passed in type that matches the passed in props,
|
|
844
|
+
// but maybe the current schema was created differently, so that's what decides the typecheckedness.
|
|
845
|
+
const hasIsOfTypeCheck = this.schema.hasIsOfTypeCheck
|
|
846
|
+
_objectAssign(clone.schema, { hasIsOfTypeCheck })
|
|
847
|
+
|
|
848
|
+
return clone as unknown as JsonSchemaObjectBuilder<IN & IN2, OUT & IN2, false>
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/**
|
|
852
|
+
* Concatenates another schema to the current schema.
|
|
853
|
+
*
|
|
854
|
+
* It expects a type to be passed in as a generic, and this type should be the expected final type.
|
|
855
|
+
*
|
|
856
|
+
* ```ts
|
|
857
|
+
* interface Foo { foo: string }
|
|
858
|
+
* const fooSchema = j.object<Foo>({ foo: j.string() })
|
|
859
|
+
*
|
|
860
|
+
* interface Bar { bar: number }
|
|
861
|
+
* const barSchema = j.object<Bar>({ bar: j.number() })
|
|
862
|
+
*
|
|
863
|
+
* interface Shu { foo: string, bar: number }
|
|
864
|
+
* const shuSchema = fooSchema.concat<Shu>(barSchema)
|
|
865
|
+
* ```
|
|
866
|
+
*/
|
|
867
|
+
concat(other: any): never
|
|
868
|
+
concat<FINAL extends AnyObject>(
|
|
869
|
+
other: JsonSchemaObjectBuilder<any, any, any>,
|
|
870
|
+
): JsonSchemaObjectBuilder<FINAL, FINAL, false>
|
|
871
|
+
concat(other: any): any {
|
|
872
|
+
const clone = this.clone()
|
|
873
|
+
mergeJsonSchemaObjects(clone.schema as any, other.schema)
|
|
843
874
|
return clone
|
|
844
875
|
}
|
|
845
876
|
|
|
@@ -963,6 +994,11 @@ export class JsonSchemaObjectInferringBuilder<
|
|
|
963
994
|
const incomingSchemaBuilder = new JsonSchemaObjectInferringBuilder<NEW_PROPS, false>(props)
|
|
964
995
|
mergeJsonSchemaObjects(newBuilder.schema as any, incomingSchemaBuilder.schema as any)
|
|
965
996
|
|
|
997
|
+
// This extend function is not type-safe as it is inferring,
|
|
998
|
+
// so even if the base schema was already type-checked,
|
|
999
|
+
// the new schema loses that quality.
|
|
1000
|
+
_objectAssign(newBuilder.schema, { hasIsOfTypeCheck: false })
|
|
1001
|
+
|
|
966
1002
|
return newBuilder as JsonSchemaObjectInferringBuilder<
|
|
967
1003
|
{
|
|
968
1004
|
[K in keyof PROPS | keyof NEW_PROPS]: K extends keyof NEW_PROPS
|
|
@@ -1311,10 +1347,14 @@ function withEnumKeys<
|
|
|
1311
1347
|
>(props, { hasIsOfTypeCheck: false })
|
|
1312
1348
|
}
|
|
1313
1349
|
|
|
1314
|
-
type Expand<T> =
|
|
1350
|
+
type Expand<T> = { [K in keyof T]: T[K] }
|
|
1315
1351
|
|
|
1316
1352
|
type ExactMatch<A, B> =
|
|
1317
|
-
(<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2
|
|
1353
|
+
(<T>() => T extends Expand<A> ? 1 : 2) extends <T>() => T extends Expand<B> ? 1 : 2
|
|
1354
|
+
? (<T>() => T extends Expand<B> ? 1 : 2) extends <T>() => T extends Expand<A> ? 1 : 2
|
|
1355
|
+
? true
|
|
1356
|
+
: false
|
|
1357
|
+
: false
|
|
1318
1358
|
|
|
1319
1359
|
type BuilderOutUnion<B extends readonly JsonSchemaAnyBuilder<any, any, any>[]> = {
|
|
1320
1360
|
[K in keyof B]: B[K] extends JsonSchemaAnyBuilder<any, infer O, any> ? O : never
|