diff --git a/packages/core/src/types/Errors.type.ts b/packages/core/src/types/Errors.type.ts index a5d5ab16a..d453f3990 100644 --- a/packages/core/src/types/Errors.type.ts +++ b/packages/core/src/types/Errors.type.ts @@ -1,3 +1,8 @@ import { EvaluatedStrategy } from "./EvaluatedStrategy"; +import { $ } from "./namespace/Utility.ns"; -export type Errors = Partial>; +export type Errors = EvaluatedStrategy< + T, + string[], + $.TArgGet<"partial">["enabled"] +>; diff --git a/packages/core/src/types/EvaluatedStrategy.ts b/packages/core/src/types/EvaluatedStrategy.ts index d2b97d625..fd3f38bf4 100644 --- a/packages/core/src/types/EvaluatedStrategy.ts +++ b/packages/core/src/types/EvaluatedStrategy.ts @@ -3,7 +3,11 @@ import { Strategy } from "./namespace/Strategy.ns"; import { $ } from "./namespace/Utility.ns"; // prettier-ignore -export type FieldStrategy, TStrat> = +export type FieldStrategy< + TActual, + TKey extends $.Keys, TStrat, + TPartial extends $.TArg<"partial"> = "disabled" +> = true extends Condition.isPrimitive ?Strategy.Primitive @@ -12,22 +16,43 @@ export type FieldStrategy, TStrat> = ?Strategy.Function :true extends Condition.isArray - ?Strategy.Array + ?Strategy.Array :true extends Condition.isObject - ?Strategy.Object + ?Strategy.Object :never; -export type StrategyOptional = { - [TKey in $.WritableKeys]?: FieldStrategy; +export type StrategyOptional< + TActual, + TPartial extends $.TArg<"partial"> = "disabled" +> = { + [TKey in $.WritableKeys]?: FieldStrategy< + TActual, + TKey, + $._, + TPartial + >; }; -export type StrategyMandatory = { - [TKey in $.Keys]-?: FieldStrategy; +export type StrategyMandatory< + TActual, + TStrat, + TPartial extends $.TArg<"partial"> = "disabled" +> = { + [TKey in $.WritableKeys]-?: FieldStrategy< + TActual, + TKey, + TStrat, + TPartial + >; }; // prettier-ignore -export type EvaluatedStrategy = true extends Condition.isUndefined - ? $.ExcludeNever> - : $.ExcludeNever>; +export type EvaluatedStrategy = "disabled"> = true extends Condition.isUndefined + ? TPartial extends $.TArgGet<"partial">["enabled"] + ? Partial<$.ExcludeNever>> + : $.ExcludeNever> + : TPartial extends $.TArgGet<"partial">["enabled"] + ? Partial<$.ExcludeNever>> + : $.ExcludeNever>; diff --git a/packages/core/src/types/namespace/Strategy.ns.ts b/packages/core/src/types/namespace/Strategy.ns.ts index 436f1b762..1ef9c8af0 100644 --- a/packages/core/src/types/namespace/Strategy.ns.ts +++ b/packages/core/src/types/namespace/Strategy.ns.ts @@ -1,5 +1,6 @@ import { EvaluatedStrategy } from "../EvaluatedStrategy"; import { Condition } from "./Condition.ns"; +import { $ } from "./Utility.ns"; export type DeducedArray = { node: TParent; @@ -11,25 +12,34 @@ type _PrimitiveStrategy = ? NonNullable : TReplacer; -type _ObjectStrategy = EvaluatedStrategy< - NonNullable, - TReplacer ->; +type _ObjectStrategy< + TActual, + TReplacer, + TPartial extends $.TArg<"partial"> = "disabled" +> = EvaluatedStrategy, TReplacer, TPartial>; // prettier-ignore -type _ArrayStrategy = TActual extends (infer U)[] +type _ArrayStrategy = "disabled"> = TActual extends (infer U)[] ? true extends Condition.isPrimitive ? true extends Condition.isUndefined ? TActual : DeducedArray : true extends Condition.isUndefined - ? EvaluatedStrategy[] - : DeducedArray, TReplacer> + ? EvaluatedStrategy[] + : DeducedArray, TReplacer> : never; export namespace Strategy { export type Function = never; export type Primitive = _PrimitiveStrategy; - export type Object = _ObjectStrategy; - export type Array = _ArrayStrategy; + export type Array< + T, + R, + TPartial extends $.TArg<"partial"> = "disabled" + > = _ArrayStrategy; + export type Object< + T, + R, + TPartial extends $.TArg<"partial"> = "disabled" + > = _ObjectStrategy; } diff --git a/packages/core/src/types/namespace/Utility.ns.ts b/packages/core/src/types/namespace/Utility.ns.ts index dd7543076..d80185e56 100644 --- a/packages/core/src/types/namespace/Utility.ns.ts +++ b/packages/core/src/types/namespace/Utility.ns.ts @@ -47,4 +47,13 @@ export namespace $ { export type Values = T[$.Keys]; export type WritableKeys = _WritableKeys; export type _ = undefined; + export type TArgGet = TypeParams[TParamKey]; + export type TArg = $.Values>; } + +type TypeParams = { + partial: { + disabled: "disabled"; + enabled: "enabled"; + }; +}; diff --git a/packages/react/src/hooks/useValidation/index.ts b/packages/react/src/hooks/useValidation/index.ts index e31e94255..5eb483c64 100644 --- a/packages/react/src/hooks/useValidation/index.ts +++ b/packages/react/src/hooks/useValidation/index.ts @@ -33,8 +33,7 @@ export default function useValidation( ): ns.UseValidationReturn { const defaultValue = config?.defaultValue; const groups = config?.groups ?? []; - // prettier-ignore - const poc = useEntityProcessor(model, {groups, defaultValue}); + const poc = useEntityProcessor(model, { groups, defaultValue }); const initialForm = defaultValue ?? poc.noArgsInstance; const [form, setForm] = useState(initialForm as TBody); const [details, setDetails] = useState({} as DetailedErrors);