diff --git a/packages/api/src/api/keyval.ts b/packages/api/src/api/keyval.ts index 792a265ecc..577dc6dd01 100644 --- a/packages/api/src/api/keyval.ts +++ b/packages/api/src/api/keyval.ts @@ -1,10 +1,5 @@ import type { Head, Tail } from "./tuple"; -/** - * Lookup path for nested data structures. - */ -export type Path = PropertyKey | PropertyKey[]; - /** * Extracts from A all keys which have values assignable to type B. */ diff --git a/packages/api/src/api/path.ts b/packages/api/src/api/path.ts new file mode 100644 index 0000000000..553b8085a2 --- /dev/null +++ b/packages/api/src/api/path.ts @@ -0,0 +1,217 @@ +import { NumOrString } from "./prim"; +import type { + Keys, + Keys1, + Keys2, + Keys3, + Keys4, + Keys5, + Keys6, + Keys7, + Val1, + Val2, + Val3, + Val4, + Val5, + Val6, + Val7, + Val8, +} from "./keyval"; + +/** + * Lookup path for nested data structures. + */ +export type Path = PropertyKey | PropertyKey[]; + +export type Path0 = readonly []; + +export type Path1 = A extends Keys ? readonly [A] : never; + +export type Path2 = A extends Keys + ? B extends Keys1 + ? readonly [A, B] + : never + : never; + +export type Path3 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? readonly [A, B, C] + : never + : never + : never; + +export type Path4 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? readonly [A, B, C, D] + : never + : never + : never + : never; + +export type Path5 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? readonly [A, B, C, D, E] + : never + : never + : never + : never + : never; + +export type Path6 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? F extends Keys5 + ? readonly [A, B, C, D, E, F] + : never + : never + : never + : never + : never + : never; + +export type Path7 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? F extends Keys5 + ? G extends Keys6 + ? readonly [A, B, C, D, E, F, G] + : never + : never + : never + : never + : never + : never + : never; + +export type Path8 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? F extends Keys5 + ? G extends Keys6 + ? H extends Keys7 + ? readonly [A, B, C, D, E, F, G, H] + : never + : never + : never + : never + : never + : never + : never + : never; + +// prettier-ignore +export type DeepPath = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? F extends Keys5 + ? G extends Keys6 + ? H extends Keys7 + ? readonly [A, B, C, D, E, F, G, H, ...NumOrString[]] + : never + : never + : never + : never + : never + : never + : never + : never; + +export type PathVal1 = A extends Keys ? Val1 : never; + +export type PathVal2 = A extends Keys + ? B extends Keys1 + ? Val2 + : never + : never; + +export type PathVal3 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? Val3 + : never + : never + : never; + +export type PathVal4 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? Val4 + : never + : never + : never + : never; + +export type PathVal5 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? Val5 + : never + : never + : never + : never + : never; + +export type PathVal6 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? F extends Keys5 + ? Val6 + : never + : never + : never + : never + : never + : never; + +export type PathVal7 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? F extends Keys5 + ? G extends Keys6 + ? Val7 + : never + : never + : never + : never + : never + : never + : never; + +export type PathVal8 = A extends Keys + ? B extends Keys1 + ? C extends Keys2 + ? D extends Keys3 + ? E extends Keys4 + ? F extends Keys5 + ? G extends Keys6 + ? H extends Keys7 + ? Val8 + : never + : never + : never + : never + : never + : never + : never + : never; diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 79dd57b117..c0f69230db 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -24,6 +24,7 @@ export * from "./api/logger"; export * from "./api/meta"; export * from "./api/null"; export * from "./api/object"; +export * from "./api/path"; export * from "./api/predicate"; export * from "./api/prim"; export * from "./api/range";