@strictly/define 0.0.22 → 0.0.23
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/.out/transformers/flatteners/flatten_type_to.js +1 -1
- package/.out/transformers/flatteners/flatten_value_to.js +9 -9
- package/.out/transformers/flatteners/json_path.d.ts +1 -1
- package/.out/transformers/flatteners/json_path.js +2 -2
- package/.out/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.js +2 -2
- package/.out/transformers/flatteners/specs/flatten_type_to.tests.js +2 -2
- package/.out/transformers/flatteners/specs/flatten_value_to.tests.js +2 -2
- package/.out/transformers/flatteners/specs/json_paths.tests.js +2 -2
- package/.out/transformers/flatteners/specs/value_path_to_type_path.tests.js +82 -8
- package/.out/transformers/flatteners/value_path_to_type_path.js +26 -25
- package/.out/tsconfig.tsbuildinfo +1 -1
- package/.out/types/flattened_types_of_type.d.ts +11 -11
- package/.out/types/flattened_types_of_validating_type.d.ts +11 -11
- package/.out/types/paths_of_type.d.ts +7 -7
- package/.out/types/value_to_type_paths_of_type.d.ts +7 -7
- package/.turbo/turbo-build.log +8 -8
- package/.turbo/turbo-check-types.log +1 -1
- package/.turbo/turbo-release$colon$exports.log +1 -1
- package/dist/index.cjs +52 -40
- package/dist/index.d.cts +37 -37
- package/dist/index.d.ts +37 -37
- package/dist/index.js +52 -40
- package/package.json +1 -1
- package/transformers/flatteners/flatten_type_to.ts +2 -2
- package/transformers/flatteners/flatten_value_to.ts +8 -12
- package/transformers/flatteners/json_path.ts +3 -3
- package/transformers/flatteners/specs/flatten_json_value_to_type_paths_of.tests.ts +2 -2
- package/transformers/flatteners/specs/flatten_type_to.tests.ts +2 -2
- package/transformers/flatteners/specs/flatten_value_to.tests.ts +2 -2
- package/transformers/flatteners/specs/json_paths.tests.ts +3 -3
- package/transformers/flatteners/specs/value_path_to_type_path.tests.ts +92 -8
- package/transformers/flatteners/value_path_to_type_path.ts +37 -23
- package/types/flattened_types_of_type.ts +7 -18
- package/types/flattened_types_of_validating_type.ts +7 -19
- package/types/paths_of_type.ts +16 -22
- package/types/specs/flattened_types_of_type.tests.ts +6 -6
- package/types/specs/paths_of_type.tests.ts +2 -2
- package/types/specs/value_to_type_paths_of_type.tests.ts +4 -4
- package/types/value_to_type_paths_of_type.ts +5 -12
package/dist/index.d.ts
CHANGED
|
@@ -152,24 +152,24 @@ type Depths = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
|
|
|
152
152
|
|
|
153
153
|
type PathOf<Prefix extends string, Accessor extends string | number | symbol, SegmentOverride extends string | null = null> = SegmentOverride extends string ? `${Prefix}.${SegmentOverride}` : Accessor extends string | number ? `${Prefix}.${Accessor}` : never;
|
|
154
154
|
|
|
155
|
-
type FlattenedTypesOfType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf$1<T['definition'], SegmentOverride, Path,
|
|
156
|
-
type InternalFlattenedTypeDefsOf$1<T extends TypeDef, SegmentOverride extends string | null, Path extends string,
|
|
155
|
+
type FlattenedTypesOfType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf$1<T['definition'], SegmentOverride, Path, Depth>;
|
|
156
|
+
type InternalFlattenedTypeDefsOf$1<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = {
|
|
157
157
|
readonly [K in Path]: Type<T>;
|
|
158
|
-
} & InternalFlattenedTypeDefsOfChildren$1<T, SegmentOverride, Path,
|
|
159
|
-
type InternalFlattenedTypeDefsOfChildren$1<T extends TypeDef, SegmentOverride extends string | null, Path extends string,
|
|
158
|
+
} & InternalFlattenedTypeDefsOfChildren$1<T, SegmentOverride, Path, Depth>;
|
|
159
|
+
type InternalFlattenedTypeDefsOfChildren$1<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedTypeDefsOfLiteralChildren$1 : T extends ListTypeDef ? InternalFlattenedTypeDefsOfListChildren$1<T, SegmentOverride, Path, NextDepth> : T extends RecordTypeDef ? InternalFlattenedTypeDefsOfRecordChildren$1<T, SegmentOverride, Path, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedTypeDefsOfObjectChildren$1<T, SegmentOverride, Path, NextDepth> : T extends UnionTypeDef ? InternalFlattenedTypeDefsOfUnionChildren$1<T, SegmentOverride, Path, NextDepth> : never;
|
|
160
160
|
type InternalFlattenedTypeDefsOfLiteralChildren$1 = {};
|
|
161
|
-
type InternalFlattenedTypeDefsOfListChildren$1<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf$1<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>,
|
|
162
|
-
type InternalFlattenedTypeDefsOfRecordChildren$1<T extends RecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf$1<T['valueTypeDef'], SegmentOverride, PathOf<Path, T['keyPrototype'], SegmentOverride>,
|
|
163
|
-
type InternalFlattenedTypeDefsOfObjectChildren$1<T extends ObjectTypeDef, SegmentOverride extends string | null, Path extends string,
|
|
161
|
+
type InternalFlattenedTypeDefsOfListChildren$1<T extends ListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf$1<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>, Depth>;
|
|
162
|
+
type InternalFlattenedTypeDefsOfRecordChildren$1<T extends RecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf$1<T['valueTypeDef'], SegmentOverride, PathOf<Path, T['keyPrototype'], SegmentOverride>, Depth>;
|
|
163
|
+
type InternalFlattenedTypeDefsOfObjectChildren$1<T extends ObjectTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
|
|
164
164
|
readonly [K in keyof Fields]-?: undefined extends Fields[K] ? InternalFlattenedTypeDefsOf$1<UnionTypeDef<null, {
|
|
165
165
|
readonly '0': Exclude<Fields[K], undefined>;
|
|
166
166
|
readonly '1': LiteralTypeDef<undefined>;
|
|
167
|
-
}>, SegmentOverride, PathOf<Path,
|
|
167
|
+
}>, SegmentOverride, PathOf<Path, K, null>, Depth> : InternalFlattenedTypeDefsOf$1<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<Path, K, null>, Depth>;
|
|
168
168
|
}[keyof Fields]> : never : never;
|
|
169
|
-
type InternalFlattenedTypeDefsOfUnionChildren$1<T extends UnionTypeDef, SegmentOverride extends string | null, Path extends string,
|
|
170
|
-
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren$1<Unions[K], SegmentOverride, Path,
|
|
169
|
+
type InternalFlattenedTypeDefsOfUnionChildren$1<T extends UnionTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
|
|
170
|
+
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren$1<Unions[K], SegmentOverride, Path, Depth>;
|
|
171
171
|
}[keyof Unions]> : UnionToIntersection<{
|
|
172
|
-
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren$1<Unions[K], SegmentOverride,
|
|
172
|
+
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren$1<Unions[K], SegmentOverride, `${Path}:${K}`, Depth>;
|
|
173
173
|
}[keyof Unions]> : never : never;
|
|
174
174
|
|
|
175
175
|
type FlattenedValuesOfType<T extends Type, SegmentOverride extends string | null = null, Flattened extends Readonly<Record<string, Type>> = FlattenedTypesOfType<T, SegmentOverride>> = {
|
|
@@ -271,24 +271,24 @@ type ValidatingUnionTypeDef<E = any, C = any, D extends string | null = string |
|
|
|
271
271
|
readonly readonly: boolean;
|
|
272
272
|
};
|
|
273
273
|
|
|
274
|
-
type FlattenedTypesOfValidatingType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path,
|
|
275
|
-
type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string,
|
|
274
|
+
type FlattenedTypesOfValidatingType<T extends Type, SegmentOverride extends string | null, Path extends string = '$', Depth extends number = StartingDepth> = InternalFlattenedTypeDefsOf<T['definition'], SegmentOverride, Path, Depth>;
|
|
275
|
+
type InternalFlattenedTypeDefsOf<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = {
|
|
276
276
|
readonly [K in Path]: Type<T>;
|
|
277
|
-
} & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path,
|
|
278
|
-
type InternalFlattenedTypeDefsOfChildren<T extends TypeDef, SegmentOverride extends string | null, Path extends string,
|
|
277
|
+
} & InternalFlattenedTypeDefsOfChildren<T, SegmentOverride, Path, Depth>;
|
|
278
|
+
type InternalFlattenedTypeDefsOfChildren<T extends TypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends ValidatingLiteralTypeDef ? InternalFlattenedTypeDefsOfLiteralChildren : T extends ValidatingListTypeDef ? InternalFlattenedTypeDefsOfListChildren<T, SegmentOverride, Path, NextDepth> : T extends ValidatingRecordTypeDef ? InternalFlattenedTypeDefsOfRecordChildren<T, SegmentOverride, Path, NextDepth> : T extends ValidatingObjectTypeDef ? InternalFlattenedTypeDefsOfObjectChildren<T, SegmentOverride, Path, NextDepth> : T extends ValidatingUnionTypeDef ? InternalFlattenedTypeDefsOfUnionChildren<T, SegmentOverride, Path, NextDepth> : never;
|
|
279
279
|
type InternalFlattenedTypeDefsOfLiteralChildren = {};
|
|
280
|
-
type InternalFlattenedTypeDefsOfListChildren<T extends ValidatingListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>,
|
|
281
|
-
type InternalFlattenedTypeDefsOfRecordChildren<T extends ValidatingRecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['valueTypeDef'], SegmentOverride, PathOf<Path, T['keyPrototype'], SegmentOverride>,
|
|
282
|
-
type InternalFlattenedTypeDefsOfObjectChildren<T extends ValidatingObjectTypeDef, SegmentOverride extends string | null, Path extends string,
|
|
280
|
+
type InternalFlattenedTypeDefsOfListChildren<T extends ValidatingListTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['elements'], SegmentOverride, PathOf<Path, number, SegmentOverride>, Depth>;
|
|
281
|
+
type InternalFlattenedTypeDefsOfRecordChildren<T extends ValidatingRecordTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = InternalFlattenedTypeDefsOf<T['valueTypeDef'], SegmentOverride, PathOf<Path, T['keyPrototype'], SegmentOverride>, Depth>;
|
|
282
|
+
type InternalFlattenedTypeDefsOfObjectChildren<T extends ValidatingObjectTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = T extends ValidatingObjectTypeDef<infer _E, infer _C, infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
|
|
283
283
|
readonly [K in keyof Fields]-?: undefined extends Fields[K] ? InternalFlattenedTypeDefsOf<ValidatingUnionTypeDef<ErrorOfValidatingTypeDef<Exclude<Fields[K], undefined>>, ContextOfValidatingTypeDef<Exclude<Fields[K], undefined>>, null, {
|
|
284
284
|
readonly '0': Exclude<Fields[K], undefined>;
|
|
285
285
|
readonly '1': ValidatingLiteralTypeDef<undefined>;
|
|
286
|
-
}>, SegmentOverride, PathOf<Path,
|
|
286
|
+
}>, SegmentOverride, PathOf<Path, K, null>, Depth> : InternalFlattenedTypeDefsOf<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<Path, K, null>, Depth>;
|
|
287
287
|
}[keyof Fields]> : never : never;
|
|
288
|
-
type InternalFlattenedTypeDefsOfUnionChildren<T extends ValidatingUnionTypeDef, SegmentOverride extends string | null, Path extends string,
|
|
289
|
-
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path,
|
|
288
|
+
type InternalFlattenedTypeDefsOfUnionChildren<T extends ValidatingUnionTypeDef, SegmentOverride extends string | null, Path extends string, Depth extends number> = T extends ValidatingUnionTypeDef<infer _E, infer _C, infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
|
|
289
|
+
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, Path, Depth>;
|
|
290
290
|
}[keyof Unions]> : UnionToIntersection<{
|
|
291
|
-
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride,
|
|
291
|
+
readonly [K in keyof Unions]: InternalFlattenedTypeDefsOfChildren<Unions[K], SegmentOverride, `${Path}:${K}`, Depth>;
|
|
292
292
|
}[keyof Unions]> : never : never;
|
|
293
293
|
|
|
294
294
|
type ValidatorOfValidatingType<T extends ValidatingTypeDef, ValuePath extends string> = T extends ValidatingTypeDef<infer E, infer C> ? Validator<ValueOfTypeDef<ReadonlyOfTypeDef<T>>, E, ValuePath, C> : never;
|
|
@@ -301,7 +301,7 @@ declare function flattenValidatorsOfValidatingType<T extends ValidatingType, Typ
|
|
|
301
301
|
declare function flattenValuesOfType<T extends Type>(typeDef: Type, value: ValueOfType<T>): Record<string, any>;
|
|
302
302
|
|
|
303
303
|
declare function jsonPath<Prefix extends string, Segment extends number | string>(prefix: Prefix, segment: Segment): `${Prefix}.${Segment}`;
|
|
304
|
-
declare function jsonPath<Prefix extends string, Segment extends number | string, Qualifier extends string>(prefix: Prefix, segment: Segment, qualifier: Qualifier): `${Prefix}
|
|
304
|
+
declare function jsonPath<Prefix extends string, Segment extends number | string, Qualifier extends string>(prefix: Prefix, segment: Segment, qualifier: Qualifier): `${Prefix}${Qualifier}.${Segment}`;
|
|
305
305
|
declare function jsonPathPop<Path extends string>(path: Path): [string, string] | null;
|
|
306
306
|
declare function jsonPathPrefix<Prefix extends string, Path extends string>(prefix: Prefix, path: Path): Path extends StringConcatOf<'$', infer ToMount> ? `${Prefix}${ToMount}` : never;
|
|
307
307
|
declare function jsonPathUnprefix<Prefix extends string, Path extends string>(prefix: Prefix, path: Path): Path extends StringConcatOf<Prefix, infer ToUnmount> ? `$${ToUnmount}` : never;
|
|
@@ -489,33 +489,33 @@ declare function union<D extends null>(): UnionTypeDefBuilder<never, {}, D, {}>;
|
|
|
489
489
|
declare function union<D extends string>(discriminator: D): UnionTypeDefBuilder<never, {}, D, {}>;
|
|
490
490
|
|
|
491
491
|
type PathsOfType<T extends Type, SegmentOverride extends string | null = null, Prefix extends string = '$'> = InternalJsonPathsOf<T['definition'], Prefix, SegmentOverride, StartingDepth>;
|
|
492
|
-
type InternalJsonPathsOf<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number, NextDepth extends number = Depths[Depth]> = InternalJsonPathsOfChildren<F, Prefix, SegmentOverride,
|
|
493
|
-
type InternalJsonPathsOfChildren<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null,
|
|
492
|
+
type InternalJsonPathsOf<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number, NextDepth extends number = Depths[Depth]> = InternalJsonPathsOfChildren<F, Prefix, SegmentOverride, NextDepth> | Prefix;
|
|
493
|
+
type InternalJsonPathsOfChildren<F extends TypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = Depth extends -1 ? never : F extends LiteralTypeDef ? InternalJsonPathsOfLiteralChildren : F extends ListTypeDef ? InternalJsonPathsOfListChildren<F, Prefix, SegmentOverride, Depth> : F extends RecordTypeDef ? InternalJsonPathsOfRecordChildren<F, Prefix, SegmentOverride, Depth> : F extends ObjectTypeDef ? InternalJsonPathsOfObjectChildren<F, Prefix, SegmentOverride, Depth> : F extends UnionTypeDef ? InternalJsonPathsOfUnionChildren<F, Prefix, SegmentOverride, Depth> : never;
|
|
494
494
|
type InternalJsonPathsOfLiteralChildren = never;
|
|
495
495
|
type InternalJsonPathsOfListChildren<F extends ListTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['elements'], PathOf<Prefix, number, SegmentOverride>, SegmentOverride, Depth>;
|
|
496
496
|
type InternalJsonPathsOfRecordChildren<F extends RecordTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = InternalJsonPathsOf<F['valueTypeDef'], PathOf<Prefix, F['keyPrototype'], SegmentOverride>, SegmentOverride, Depth>;
|
|
497
|
-
type InternalJsonPathsOfObjectChildren<F extends ObjectTypeDef, Prefix extends string, SegmentOverride extends string | null,
|
|
498
|
-
[K in keyof Fields]: InternalJsonPathsOf<Fields[K], PathOf<Prefix,
|
|
499
|
-
}[keyof Fields] : never
|
|
500
|
-
type InternalJsonPathsOfUnionChildren<F extends UnionTypeDef, Prefix extends string, SegmentOverride extends string | null,
|
|
501
|
-
readonly [K in keyof Unions]: InternalJsonPathsOfChildren<Unions[K],
|
|
497
|
+
type InternalJsonPathsOfObjectChildren<F extends ObjectTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = F extends ObjectTypeDef<infer Fields> ? {
|
|
498
|
+
[K in keyof Fields]: InternalJsonPathsOf<Fields[K], PathOf<Prefix, K, null>, SegmentOverride, Depth>;
|
|
499
|
+
}[keyof Fields] : never;
|
|
500
|
+
type InternalJsonPathsOfUnionChildren<F extends UnionTypeDef, Prefix extends string, SegmentOverride extends string | null, Depth extends number> = F extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? {
|
|
501
|
+
readonly [K in keyof Unions]: InternalJsonPathsOfChildren<Unions[K], D extends null ? Prefix : `${Prefix}:${K}`, SegmentOverride, Depth>;
|
|
502
502
|
}[keyof Unions] : never : never;
|
|
503
503
|
|
|
504
504
|
type ValueToTypePathsOfType<T extends StrictType, SegmentOverride extends string = '*', Path extends string = '$'> = SimplifyDeep<InternalFlattenedTypePathsOf<T['definition'], SegmentOverride, Path, Path, StartingDepth>>;
|
|
505
505
|
type InternalFlattenedTypePathsOf<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = {
|
|
506
506
|
readonly [K in ValuePath]: TypePath;
|
|
507
|
-
} & InternalFlattenedTypePathsOfChildren<T, SegmentOverride, ValuePath, TypePath,
|
|
508
|
-
type InternalFlattenedTypePathsOfChildren<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string,
|
|
507
|
+
} & InternalFlattenedTypePathsOfChildren<T, SegmentOverride, ValuePath, TypePath, Depth>;
|
|
508
|
+
type InternalFlattenedTypePathsOfChildren<T extends TypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number, NextDepth extends number = Depths[Depth]> = NextDepth extends -1 ? never : T extends LiteralTypeDef ? InternalFlattenedTypePathsOfLiteralChildren : T extends ListTypeDef ? InternalFlattenedTypePathsOfListChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends RecordTypeDef ? InternalFlattenedTypePathsOfRecordChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends ObjectTypeDef ? InternalFlattenedTypePathsOfObjectChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : T extends UnionTypeDef ? InternalFlattenedTypePathsOfUnionChildren<T, SegmentOverride, ValuePath, TypePath, NextDepth> : never;
|
|
509
509
|
type InternalFlattenedTypePathsOfLiteralChildren = {};
|
|
510
510
|
type InternalFlattenedTypePathsOfListChildren<T extends ListTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedTypePathsOf<T['elements'], SegmentOverride, PathOf<ValuePath, number>, PathOf<TypePath, number, SegmentOverride>, Depth>;
|
|
511
511
|
type InternalFlattenedTypePathsOfRecordChildren<T extends RecordTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = InternalFlattenedTypePathsOf<T['valueTypeDef'], SegmentOverride, PathOf<ValuePath, T['keyPrototype']>, PathOf<TypePath, T['keyPrototype'], SegmentOverride>, Depth>;
|
|
512
|
-
type InternalFlattenedTypePathsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string,
|
|
513
|
-
readonly [K in keyof Fields]-?: InternalFlattenedTypePathsOf<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<ValuePath,
|
|
512
|
+
type InternalFlattenedTypePathsOfObjectChildren<T extends ObjectTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = T extends ObjectTypeDef<infer Fields> ? keyof Fields extends string ? UnionToIntersection<{
|
|
513
|
+
readonly [K in keyof Fields]-?: InternalFlattenedTypePathsOf<Exclude<Fields[K], undefined>, SegmentOverride, PathOf<ValuePath, K>, PathOf<TypePath, K>, Depth>;
|
|
514
514
|
}[keyof Fields]> : never : never;
|
|
515
|
-
type InternalFlattenedTypePathsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string,
|
|
516
|
-
readonly [K in keyof Unions]: InternalFlattenedTypePathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath,
|
|
515
|
+
type InternalFlattenedTypePathsOfUnionChildren<T extends UnionTypeDef, SegmentOverride extends string, ValuePath extends string, TypePath extends string, Depth extends number> = T extends UnionTypeDef<infer D, infer Unions> ? keyof Unions extends string ? D extends null ? UnionToIntersection<{
|
|
516
|
+
readonly [K in keyof Unions]: InternalFlattenedTypePathsOfChildren<Unions[K], SegmentOverride, ValuePath, TypePath, Depth>;
|
|
517
517
|
}[keyof Unions]> : UnionToIntersection<{
|
|
518
|
-
readonly [K in keyof Unions]: InternalFlattenedTypePathsOfChildren<Unions[K], SegmentOverride, ValuePath
|
|
518
|
+
readonly [K in keyof Unions]: InternalFlattenedTypePathsOfChildren<Unions[K], SegmentOverride, `${ValuePath}:${K}`, `${TypePath}:${K}`, Depth>;
|
|
519
519
|
}[keyof Unions]> : never : never;
|
|
520
520
|
|
|
521
521
|
type ValueTypesOfDiscriminatedUnion<U extends UnionTypeDef> = U extends UnionTypeDef<infer D, infer Unions> ? D extends string ? {
|
package/dist/index.js
CHANGED
|
@@ -190,8 +190,8 @@ import {
|
|
|
190
190
|
assertState
|
|
191
191
|
} from "@strictly/base";
|
|
192
192
|
function jsonPath(prefix, segment, qualifier) {
|
|
193
|
-
const s = `.${
|
|
194
|
-
return `${prefix}${s}`;
|
|
193
|
+
const s = `.${segment}`;
|
|
194
|
+
return `${prefix}${qualifier != null ? qualifier : ""}${s}`;
|
|
195
195
|
}
|
|
196
196
|
function jsonPathPop(path) {
|
|
197
197
|
const parts = path.split(".");
|
|
@@ -229,11 +229,11 @@ function flattenValueTo({ definition }, v, setter, mapper2) {
|
|
|
229
229
|
function internalFlattenValue(valuePath, typePath, typeDef, v, setter, mapper2, r) {
|
|
230
230
|
r[valuePath] = mapper2(typeDef, v, setter, typePath, valuePath);
|
|
231
231
|
if (v !== void 0) {
|
|
232
|
-
return internalFlattenValueChildren(valuePath, typePath,
|
|
232
|
+
return internalFlattenValueChildren(valuePath, typePath, typeDef, v, mapper2, r);
|
|
233
233
|
}
|
|
234
234
|
return r;
|
|
235
235
|
}
|
|
236
|
-
function internalFlattenValueChildren(valuePath, typePath,
|
|
236
|
+
function internalFlattenValueChildren(valuePath, typePath, typeDef, v, mapper2, r) {
|
|
237
237
|
switch (typeDef.type) {
|
|
238
238
|
case 1 /* Literal */:
|
|
239
239
|
return r;
|
|
@@ -242,9 +242,9 @@ function internalFlattenValueChildren(valuePath, typePath, qualifier, typeDef, v
|
|
|
242
242
|
case 3 /* Record */:
|
|
243
243
|
return internalFlattenRecordChildren(valuePath, typePath, typeDef, v, mapper2, r);
|
|
244
244
|
case 4 /* Object */:
|
|
245
|
-
return internalFlattenObjectChildren(valuePath, typePath,
|
|
245
|
+
return internalFlattenObjectChildren(valuePath, typePath, typeDef, v, mapper2, r);
|
|
246
246
|
case 5 /* Union */:
|
|
247
|
-
return internalFlattenUnionChildren(valuePath, typePath,
|
|
247
|
+
return internalFlattenUnionChildren(valuePath, typePath, typeDef, v, mapper2, r);
|
|
248
248
|
default:
|
|
249
249
|
throw new UnreachableError2(typeDef);
|
|
250
250
|
}
|
|
@@ -285,14 +285,14 @@ function internalFlattenRecordChildren(valuePath, typePath, { valueTypeDef }, v,
|
|
|
285
285
|
r
|
|
286
286
|
);
|
|
287
287
|
}
|
|
288
|
-
function internalFlattenObjectChildren(valuePath, typePath,
|
|
288
|
+
function internalFlattenObjectChildren(valuePath, typePath, { fields }, v, mapper2, r) {
|
|
289
289
|
return reduce2(
|
|
290
290
|
fields,
|
|
291
291
|
function(r2, k, fieldTypeDef) {
|
|
292
292
|
const fieldValue = v[k];
|
|
293
293
|
return internalFlattenValue(
|
|
294
|
-
jsonPath(valuePath, k
|
|
295
|
-
jsonPath(typePath, k
|
|
294
|
+
jsonPath(valuePath, k),
|
|
295
|
+
jsonPath(typePath, k),
|
|
296
296
|
fieldTypeDef,
|
|
297
297
|
fieldValue,
|
|
298
298
|
(value) => {
|
|
@@ -305,13 +305,12 @@ function internalFlattenObjectChildren(valuePath, typePath, qualifier, { fields
|
|
|
305
305
|
r
|
|
306
306
|
);
|
|
307
307
|
}
|
|
308
|
-
function internalFlattenUnionChildren(valuePath, typePath,
|
|
308
|
+
function internalFlattenUnionChildren(valuePath, typePath, typeDef, v, mapper2, r) {
|
|
309
309
|
const childTypeDef = getUnionTypeDef(typeDef, v);
|
|
310
|
-
const
|
|
310
|
+
const qualifier = typeDef.discriminator != null ? `:${v[typeDef.discriminator]}` : "";
|
|
311
311
|
return internalFlattenValueChildren(
|
|
312
|
-
valuePath
|
|
313
|
-
typePath
|
|
314
|
-
newQualifier,
|
|
312
|
+
`${valuePath}${qualifier}`,
|
|
313
|
+
`${typePath}${qualifier}`,
|
|
315
314
|
childTypeDef,
|
|
316
315
|
v,
|
|
317
316
|
mapper2,
|
|
@@ -478,8 +477,8 @@ function internalFlattenUnionTypeDefChildren(path, qualifier, {
|
|
|
478
477
|
unions,
|
|
479
478
|
function(acc, key, typeDef) {
|
|
480
479
|
return internalFlattenTypeDefChildren(
|
|
481
|
-
path,
|
|
482
|
-
|
|
480
|
+
discriminator != null ? `${path}:${qualifier}` : path,
|
|
481
|
+
key,
|
|
483
482
|
typeDef,
|
|
484
483
|
acc
|
|
485
484
|
);
|
|
@@ -544,25 +543,36 @@ import {
|
|
|
544
543
|
} from "@strictly/base";
|
|
545
544
|
function valuePathToTypePath({ definition: typeDef }, valuePath, allowMissingPaths = false) {
|
|
546
545
|
const valueSteps = valuePath.split(/\.|\[/g);
|
|
547
|
-
|
|
546
|
+
const parts = valueSteps[0].split(":");
|
|
547
|
+
const [
|
|
548
|
+
first,
|
|
549
|
+
...qualifiers
|
|
550
|
+
] = parts;
|
|
551
|
+
assertEqual2(first, "$");
|
|
548
552
|
const typeSteps = internalJsonValuePathToTypePath(
|
|
549
553
|
typeDef,
|
|
554
|
+
qualifiers,
|
|
550
555
|
valueSteps.slice(1),
|
|
551
556
|
allowMissingPaths,
|
|
552
557
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
553
558
|
valuePath
|
|
554
559
|
);
|
|
555
|
-
typeSteps.unshift(
|
|
560
|
+
typeSteps.unshift(valueSteps[0]);
|
|
556
561
|
return typeSteps.join(".");
|
|
557
562
|
}
|
|
558
|
-
function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths, originalValuePath) {
|
|
563
|
+
function internalJsonValuePathToTypePath(typeDef, qualifiers, valueSteps, allowMissingPaths, originalValuePath) {
|
|
559
564
|
if (valueSteps.length === 0) {
|
|
560
565
|
return [];
|
|
561
566
|
}
|
|
562
567
|
const [
|
|
563
|
-
|
|
568
|
+
nextValueStepAndQualifiersString,
|
|
564
569
|
...remainingValueSteps
|
|
565
570
|
] = valueSteps;
|
|
571
|
+
const nextValueStepAndQualifiers = nextValueStepAndQualifiersString.split(":");
|
|
572
|
+
const [
|
|
573
|
+
valueStep,
|
|
574
|
+
...nextQualifiers
|
|
575
|
+
] = nextValueStepAndQualifiers;
|
|
566
576
|
switch (typeDef.type) {
|
|
567
577
|
case 1 /* Literal */:
|
|
568
578
|
if (allowMissingPaths) {
|
|
@@ -571,14 +581,18 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
|
|
|
571
581
|
throw new PreconditionFailedError(
|
|
572
582
|
"literal should terminate path {} ({})",
|
|
573
583
|
originalValuePath,
|
|
574
|
-
|
|
584
|
+
nextValueStepAndQualifiersString
|
|
575
585
|
);
|
|
576
586
|
}
|
|
577
587
|
case 2 /* List */:
|
|
578
588
|
return [
|
|
579
|
-
|
|
589
|
+
[
|
|
590
|
+
"*",
|
|
591
|
+
...nextQualifiers
|
|
592
|
+
].join(":"),
|
|
580
593
|
...internalJsonValuePathToTypePath(
|
|
581
594
|
typeDef.elements,
|
|
595
|
+
nextQualifiers,
|
|
582
596
|
remainingValueSteps,
|
|
583
597
|
allowMissingPaths,
|
|
584
598
|
originalValuePath
|
|
@@ -586,9 +600,13 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
|
|
|
586
600
|
];
|
|
587
601
|
case 3 /* Record */:
|
|
588
602
|
return [
|
|
589
|
-
|
|
603
|
+
[
|
|
604
|
+
"*",
|
|
605
|
+
...nextQualifiers
|
|
606
|
+
].join(":"),
|
|
590
607
|
...internalJsonValuePathToTypePath(
|
|
591
608
|
typeDef.valueTypeDef,
|
|
609
|
+
nextQualifiers,
|
|
592
610
|
remainingValueSteps,
|
|
593
611
|
allowMissingPaths,
|
|
594
612
|
originalValuePath
|
|
@@ -603,9 +621,10 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
|
|
|
603
621
|
assertExists(typeDef.fields[valueStep], "missing field in {} ({})", originalValuePath, valueStep);
|
|
604
622
|
}
|
|
605
623
|
return [
|
|
606
|
-
|
|
624
|
+
nextValueStepAndQualifiersString,
|
|
607
625
|
...internalJsonValuePathToTypePath(
|
|
608
626
|
typeDef.fields[valueStep],
|
|
627
|
+
nextQualifiers,
|
|
609
628
|
remainingValueSteps,
|
|
610
629
|
allowMissingPaths,
|
|
611
630
|
originalValuePath
|
|
@@ -627,6 +646,7 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
|
|
|
627
646
|
assertExists(union2, "expected a complex union {}", originalValuePath);
|
|
628
647
|
return internalJsonValuePathToTypePath(
|
|
629
648
|
union2,
|
|
649
|
+
nextQualifiers,
|
|
630
650
|
valueSteps,
|
|
631
651
|
allowMissingPaths,
|
|
632
652
|
originalValuePath
|
|
@@ -635,8 +655,7 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
|
|
|
635
655
|
return [];
|
|
636
656
|
}
|
|
637
657
|
} else {
|
|
638
|
-
|
|
639
|
-
if (qualifierIndex < 0) {
|
|
658
|
+
if (qualifiers.length === 0) {
|
|
640
659
|
if (allowMissingPaths) {
|
|
641
660
|
return valueSteps;
|
|
642
661
|
} else {
|
|
@@ -647,25 +666,18 @@ function internalJsonValuePathToTypePath(typeDef, valueSteps, allowMissingPaths,
|
|
|
647
666
|
);
|
|
648
667
|
}
|
|
649
668
|
}
|
|
650
|
-
const qualifier = valueStep.substring(0, qualifierIndex);
|
|
651
|
-
const remainder = valueStep.substring(qualifierIndex + 1);
|
|
652
|
-
const union2 = assertExistsAndReturn(typeDef.unions[qualifier], "missing union {}", qualifier);
|
|
653
669
|
const [
|
|
654
|
-
|
|
655
|
-
...
|
|
656
|
-
] =
|
|
670
|
+
qualifier,
|
|
671
|
+
...remainingQualifiers
|
|
672
|
+
] = qualifiers;
|
|
673
|
+
const union2 = assertExistsAndReturn(typeDef.unions[qualifier], "missing union {}", qualifier);
|
|
674
|
+
return internalJsonValuePathToTypePath(
|
|
657
675
|
union2,
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
...remainingValueSteps
|
|
661
|
-
],
|
|
676
|
+
remainingQualifiers,
|
|
677
|
+
valueSteps,
|
|
662
678
|
allowMissingPaths,
|
|
663
679
|
originalValuePath
|
|
664
680
|
);
|
|
665
|
-
return [
|
|
666
|
-
`${qualifier}:${typeStep}`,
|
|
667
|
-
...remainingTypeSteps
|
|
668
|
-
];
|
|
669
681
|
}
|
|
670
682
|
default:
|
|
671
683
|
throw new UnreachableError5(typeDef);
|
package/package.json
CHANGED
|
@@ -116,8 +116,8 @@ function internalFlattenUnionTypeDefChildren(
|
|
|
116
116
|
unions,
|
|
117
117
|
function (acc, key, typeDef: StrictTypeDef) {
|
|
118
118
|
return internalFlattenTypeDefChildren(
|
|
119
|
-
path,
|
|
120
|
-
|
|
119
|
+
discriminator != null ? `${path}:${qualifier}` : path,
|
|
120
|
+
key,
|
|
121
121
|
typeDef,
|
|
122
122
|
acc,
|
|
123
123
|
)
|
|
@@ -68,7 +68,7 @@ function internalFlattenValue<M>(
|
|
|
68
68
|
// assume undefined means the field is optional and not populated
|
|
69
69
|
// TODO: actually capture if field is optional in typedef (or in builder for creating validator)
|
|
70
70
|
if (v !== undefined) {
|
|
71
|
-
return internalFlattenValueChildren(valuePath, typePath,
|
|
71
|
+
return internalFlattenValueChildren(valuePath, typePath, typeDef, v, mapper, r)
|
|
72
72
|
}
|
|
73
73
|
return r
|
|
74
74
|
}
|
|
@@ -76,7 +76,6 @@ function internalFlattenValue<M>(
|
|
|
76
76
|
function internalFlattenValueChildren<M>(
|
|
77
77
|
valuePath: string,
|
|
78
78
|
typePath: string,
|
|
79
|
-
qualifier: string,
|
|
80
79
|
typeDef: StrictTypeDef,
|
|
81
80
|
v: AnyValueType,
|
|
82
81
|
mapper: Mapper<M>,
|
|
@@ -91,9 +90,9 @@ function internalFlattenValueChildren<M>(
|
|
|
91
90
|
case TypeDefType.Record:
|
|
92
91
|
return internalFlattenRecordChildren(valuePath, typePath, typeDef, v, mapper, r)
|
|
93
92
|
case TypeDefType.Object:
|
|
94
|
-
return internalFlattenObjectChildren(valuePath, typePath,
|
|
93
|
+
return internalFlattenObjectChildren(valuePath, typePath, typeDef, v, mapper, r)
|
|
95
94
|
case TypeDefType.Union:
|
|
96
|
-
return internalFlattenUnionChildren(valuePath, typePath,
|
|
95
|
+
return internalFlattenUnionChildren(valuePath, typePath, typeDef, v, mapper, r)
|
|
97
96
|
default:
|
|
98
97
|
throw new UnreachableError(typeDef)
|
|
99
98
|
}
|
|
@@ -154,7 +153,6 @@ function internalFlattenRecordChildren<M>(
|
|
|
154
153
|
function internalFlattenObjectChildren<M>(
|
|
155
154
|
valuePath: string,
|
|
156
155
|
typePath: string,
|
|
157
|
-
qualifier: string,
|
|
158
156
|
{ fields }: StrictObjectTypeDef,
|
|
159
157
|
v: Record<string, AnyValueType>,
|
|
160
158
|
mapper: Mapper<M>,
|
|
@@ -165,8 +163,8 @@ function internalFlattenObjectChildren<M>(
|
|
|
165
163
|
function (r, k, fieldTypeDef) {
|
|
166
164
|
const fieldValue = v[k]
|
|
167
165
|
return internalFlattenValue(
|
|
168
|
-
jsonPath(valuePath, k
|
|
169
|
-
jsonPath(typePath, k
|
|
166
|
+
jsonPath(valuePath, k),
|
|
167
|
+
jsonPath(typePath, k),
|
|
170
168
|
fieldTypeDef,
|
|
171
169
|
fieldValue,
|
|
172
170
|
(value: AnyValueType) => {
|
|
@@ -183,18 +181,16 @@ function internalFlattenObjectChildren<M>(
|
|
|
183
181
|
function internalFlattenUnionChildren<M>(
|
|
184
182
|
valuePath: string,
|
|
185
183
|
typePath: string,
|
|
186
|
-
qualifier: string,
|
|
187
184
|
typeDef: StrictUnionTypeDef,
|
|
188
185
|
v: AnyValueType,
|
|
189
186
|
mapper: Mapper<M>,
|
|
190
187
|
r: Record<string, M>,
|
|
191
188
|
): AnyValueType {
|
|
192
189
|
const childTypeDef = getUnionTypeDef(typeDef, v)
|
|
193
|
-
const
|
|
190
|
+
const qualifier = typeDef.discriminator != null ? `:${v[typeDef.discriminator]}` : ''
|
|
194
191
|
return internalFlattenValueChildren(
|
|
195
|
-
valuePath
|
|
196
|
-
typePath
|
|
197
|
-
newQualifier,
|
|
192
|
+
`${valuePath}${qualifier}`,
|
|
193
|
+
`${typePath}${qualifier}`,
|
|
198
194
|
childTypeDef,
|
|
199
195
|
v,
|
|
200
196
|
mapper,
|
|
@@ -12,15 +12,15 @@ export function jsonPath<
|
|
|
12
12
|
Prefix extends string,
|
|
13
13
|
Segment extends number | string,
|
|
14
14
|
Qualifier extends string,
|
|
15
|
-
>(prefix: Prefix, segment: Segment, qualifier: Qualifier): `${Prefix}
|
|
15
|
+
>(prefix: Prefix, segment: Segment, qualifier: Qualifier): `${Prefix}${Qualifier}.${Segment}`
|
|
16
16
|
export function jsonPath<
|
|
17
17
|
Prefix extends string,
|
|
18
18
|
Segment extends number | string,
|
|
19
19
|
Qualifier extends string = '',
|
|
20
20
|
>(prefix: Prefix, segment: Segment, qualifier?: Qualifier) {
|
|
21
|
-
const s = `.${
|
|
21
|
+
const s = `.${segment}`
|
|
22
22
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
23
|
-
return `${prefix}${s}` as `${Prefix}
|
|
23
|
+
return `${prefix}${qualifier ?? ''}${s}` as `${Prefix}${Qualifier}.${Segment}`
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
// TODO type safety
|
|
@@ -106,8 +106,8 @@ describe('flattenJsonValueToTypePathsOf', function () {
|
|
|
106
106
|
it('equals expected value', function () {
|
|
107
107
|
expect(flattened).toEqual({
|
|
108
108
|
$: '$',
|
|
109
|
-
'
|
|
110
|
-
'
|
|
109
|
+
'$:x.a': '$:x.a',
|
|
110
|
+
'$:x.b': '$:x.b',
|
|
111
111
|
})
|
|
112
112
|
})
|
|
113
113
|
})
|
|
@@ -135,8 +135,8 @@ describe('flattenTypeDefTo', function () {
|
|
|
135
135
|
it('equals expected type', function () {
|
|
136
136
|
expect(flattened).toEqual({
|
|
137
137
|
$: TypeDefType.Union,
|
|
138
|
-
'
|
|
139
|
-
'
|
|
138
|
+
'$:a.a': TypeDefType.Literal,
|
|
139
|
+
'$:b.b': TypeDefType.Literal,
|
|
140
140
|
})
|
|
141
141
|
})
|
|
142
142
|
|
|
@@ -329,7 +329,7 @@ describe('flattenValueTo', function () {
|
|
|
329
329
|
it('equals expected type', function () {
|
|
330
330
|
expect(flattened).toEqual({
|
|
331
331
|
$: '{"d":"1","a":2}',
|
|
332
|
-
['
|
|
332
|
+
['$:1.a']: '2',
|
|
333
333
|
})
|
|
334
334
|
})
|
|
335
335
|
})
|
|
@@ -357,7 +357,7 @@ describe('flattenValueTo', function () {
|
|
|
357
357
|
})
|
|
358
358
|
|
|
359
359
|
it('sets an internal value', function () {
|
|
360
|
-
flattened['
|
|
360
|
+
flattened['$:1.a'](1)
|
|
361
361
|
|
|
362
362
|
expect(u).toEqual({
|
|
363
363
|
d: '1',
|
|
@@ -31,14 +31,14 @@ describe('json_paths', () => {
|
|
|
31
31
|
})
|
|
32
32
|
|
|
33
33
|
describe('qualified', () => {
|
|
34
|
-
const path = jsonPath('$', 'x', 'y
|
|
34
|
+
const path = jsonPath('$', 'x', ':y')
|
|
35
35
|
|
|
36
36
|
it('has the expected type', () => {
|
|
37
|
-
expectTypeOf(path).toEqualTypeOf<'
|
|
37
|
+
expectTypeOf(path).toEqualTypeOf<'$:y.x'>()
|
|
38
38
|
})
|
|
39
39
|
|
|
40
40
|
it('has the expected value', () => {
|
|
41
|
-
expect(path).toEqual('
|
|
41
|
+
expect(path).toEqual('$:y.x')
|
|
42
42
|
})
|
|
43
43
|
})
|
|
44
44
|
})
|