Types complete for link query

main
Jackson Morgan 4 months ago
parent 92b0fd4827
commit b95b8568d3
  1. 37
      packages/connected/src/types/linkQuery/LinkQuery.ts

@ -5,8 +5,7 @@
import type { LdoBase, LdSet, ShapeType } from "@ldo/ldo"; import type { LdoBase, LdSet, ShapeType } from "@ldo/ldo";
import { ProfileShapeType } from "packages/ldo/test/profileData"; import { ProfileShapeType } from "packages/ldo/test/profileData";
import { SolidProfileShape } from "packages/ldo/test/profileData"; import type { SolidProfileShape } from "packages/ldo/test/profileData";
import { PostShShapeType } from "packages/solid-react/test/.ldo/post.shapeTypes";
/** /**
* Link Query Input * Link Query Input
@ -15,13 +14,13 @@ export type LQInputObject<Type> = Partial<{
[key in keyof Type]: LQInput<Type[key]>; [key in keyof Type]: LQInput<Type[key]>;
}>; }>;
export type LQInputSubArray<Type> = Type extends object export type LQInputSubSet<Type> = Type extends object
? LQInputObject<Type> ? LQInputObject<Type>
: true; : true;
export type LQInput<Type> = Type extends LdSet<infer ArraySubType> export type LQInput<Type> = Type extends LdSet<infer SetSubType>
? LQInputSubArray<ArraySubType> ? LQInputSubSet<SetSubType>
: LQInputSubArray<Type>; : LQInputSubSet<Type>;
/** /**
* Link Query Input Default * Link Query Input Default
@ -43,31 +42,26 @@ export type LQReturnObject<Type, Input extends LQInputObject<Type>> = {
? never ? never
: key]: Input[key] extends LQInput<Type[key]> : key]: Input[key] extends LQInput<Type[key]>
? undefined extends Type[key] ? undefined extends Type[key]
? LQReturnRecursive<Type[key], Input[key]> | undefined ? LQReturn<Type[key], Input[key]> | undefined
: LQReturnRecursive<Type[key], Input[key]> : LQReturn<Type[key], Input[key]>
: never; : never;
}; };
export type LQReturnSubArray<Type, Input> = Input extends LQInputSubArray<Input> export type LQReturnSubSet<Type, Input> = Input extends LQInputSubSet<Type>
? Type extends object ? Input extends LQInputObject<Type>
? LQReturnObject<Type, Input> ? LQReturnObject<Type, Input>
: Type : Type
: never; : never;
export type LQReturnRecursive< export type LQReturn<
Type, Type,
Input extends LQInput<Type>, Input extends LQInput<Type>,
> = NonNullable<Type> extends LdSet<infer ArraySubType> > = NonNullable<Type> extends LdSet<infer SetSubType>
? LdSet<LQReturnSubArray<ArraySubType, Input>> ? LdSet<LQReturnSubSet<SetSubType, Input>>
: LQReturnSubArray<Type, Input>; : LQReturnSubSet<Type, Input>;
export type LQReturn<Type, Input extends LQInput<Type>> = LQReturnRecursive<
Type,
Input
>;
type ExpandDeep<T> = T extends LdSet<infer U> type ExpandDeep<T> = T extends LdSet<infer U>
? LdSet<ExpandDeep<U>> // recursively expand arrays ? LdSet<ExpandDeep<U>> // recursively expand sets
: T extends object : T extends object
? { [K in keyof T]: ExpandDeep<T[K]> } // recursively expand objects ? { [K in keyof T]: ExpandDeep<T[K]> } // recursively expand objects
: T; // base case (primitive types) : T; // base case (primitive types)
@ -79,10 +73,9 @@ function sampleFunction<Type extends LdoBase, Input extends LQInput<Type>>(
throw new Error("NotImplemented"); throw new Error("NotImplemented");
} }
type other = ExpandDeep<LQInput<SolidProfileShape>>;
const value = sampleFunction(ProfileShapeType, { const value = sampleFunction(ProfileShapeType, {
hasTelephone: { type: { "@id": true }, value: true }, hasTelephone: { type: { "@id": true }, value: true },
name: true,
}); });
value; value;

Loading…
Cancel
Save