@jfdevelops/multi-step-form-core 1.0.0-alpha.11

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.
@@ -0,0 +1,295 @@
1
+ import { StorageConfig } from '../storage';
2
+ import { CasingType, Constrain, DeepKeys, DefaultCasing, DefaultFieldType, Expand, FieldType, objectHelpers } from '../utils';
3
+ import { path } from '../utils/path';
4
+ import { AnyValidator, DefaultValidator, ResolveValidatorOutput } from '../utils/validator';
5
+ export interface NameTransformCasingOptions<TCasing extends CasingType> {
6
+ /**
7
+ * How the `name` should be transformed for the `label`.
8
+ *
9
+ * If omitted, the default will be whatever is set during {@linkcode MultiStepFormSchema} initialization.
10
+ */
11
+ nameTransformCasing?: Constrain<TCasing, CasingType>;
12
+ }
13
+ export interface StepFieldOptions<Type extends FieldType, Casing extends CasingType, DefaultValue> extends NameTransformCasingOptions<Casing> {
14
+ defaultValue: DefaultValue;
15
+ /**
16
+ * The type of the field.
17
+ *
18
+ * @default 'string'
19
+ */
20
+ type?: Type;
21
+ /**
22
+ * The text for the label.
23
+ *
24
+ * If omitted, it will default to the specified casing.
25
+ *
26
+ * If `false`, `label` will be `undefined`, meaning there won't
27
+ * be a label for this field.
28
+ */
29
+ label?: string | false;
30
+ }
31
+ export type AnyStepFieldOption = StepFieldOptions<FieldType, CasingType, unknown>;
32
+ export type AnyStepField = Record<string, AnyStepFieldOption>;
33
+ export interface StepOptions<Casing extends CasingType = CasingType, TStepField extends AnyStepField = AnyStepField, FieldValidator = unknown> extends NameTransformCasingOptions<Casing> {
34
+ title: string;
35
+ description?: string;
36
+ fields: TStepField;
37
+ /**
38
+ * Validator for the fields.
39
+ */
40
+ validateFields?: Constrain<FieldValidator, AnyValidator, DefaultValidator>;
41
+ }
42
+ export type Step<TCasing extends CasingType = CasingType, step extends number = number, options extends StepOptions<TCasing, AnyStepField, unknown> = StepOptions<TCasing, AnyStepField, unknown>> = Record<ValidStepKey<step>, options>;
43
+ export type AnyStep = Step<any, any, any>;
44
+ export type GetFieldsForStep<Steps extends InferStepOptions<any>, Key extends keyof Steps> = Steps[Key] extends {
45
+ fields: infer fields extends AnyStepField;
46
+ } ? fields : never;
47
+ export type GetDefaultCasingTransformation<Step extends InferStepOptions<any>, Key extends keyof Step, TDefault extends CasingType = DefaultCasing> = Step[Key] extends {
48
+ nameTransformCasing: infer casing extends CasingType;
49
+ } ? casing : TDefault;
50
+ export type SetDefault<T, Defaults> = {
51
+ [K in keyof T]-?: K extends keyof Defaults ? undefined extends T[K] ? Exclude<T[K], undefined> | Defaults[K] : T[K] : T[K];
52
+ } & {
53
+ [K in Exclude<keyof Defaults, keyof T>]-?: Defaults[K];
54
+ };
55
+ export type ResolvedFields<TInferredSteps extends InferStepOptions<any>, TKey extends keyof TInferredSteps, TFields extends GetFieldsForStep<TInferredSteps, TKey> = GetFieldsForStep<TInferredSteps, TKey>> = {
56
+ [name in keyof TFields]: Expand<SetDefault<TFields[name], {
57
+ type: DefaultFieldType;
58
+ nameTransformCasing: GetDefaultCasingTransformation<TInferredSteps, TKey>;
59
+ label: string;
60
+ }>>;
61
+ };
62
+ export type ResolvedStepBuilder<TStep extends Step, TDefaultCasing extends CasingType = DefaultCasing, TInferredSteps extends InferStepOptions<TStep> = InferStepOptions<TStep>> = Expand<{
63
+ [stepKey in keyof TInferredSteps]: Expand<SetDefault<Omit<TInferredSteps[stepKey], 'fields' | 'validateFields'>, {
64
+ type: DefaultFieldType;
65
+ nameTransformCasing: GetDefaultCasingTransformation<TInferredSteps, stepKey, TDefaultCasing>;
66
+ }> & {
67
+ fields: Expand<ResolvedFields<TInferredSteps, stepKey>>;
68
+ }>;
69
+ }>;
70
+ export type Updater<TInput, TOutput = TInput> = TOutput | ((input: TInput) => TOutput);
71
+ export declare namespace UpdateFn {
72
+ export type resolvedStep<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TTargetStep extends ValidStepKey<TStepNumbers>> = Expand<StrippedResolvedStep<TResolvedStep[TTargetStep], true>>;
73
+ type resolveAllPropertyPath<TCurrentStep extends AnyResolvedStep, TField extends chosenFields<TCurrentStep>> = TField extends HelperFnChosenSteps.defaultStringOption ? Relaxed<TCurrentStep> : never;
74
+ type resolveTuplePropertyPath<TCurrentStep extends AnyResolvedStep, TField extends chosenFields<TCurrentStep>, TDeepKeys extends DeepKeys<TCurrentStep> = DeepKeys<TCurrentStep>> = TField extends HelperFnChosenSteps.tupleNotation<TDeepKeys> ? TField[number] extends DeepKeys<Relaxed<TCurrentStep>> ? path.pickBy<Relaxed<TCurrentStep>, TField[number]> : never : never;
75
+ type resolveObjectPropertyPath<TCurrentStep extends AnyResolvedStep, TField extends chosenFields<TCurrentStep>, TDeepKeys extends DeepKeys<TCurrentStep> = DeepKeys<TCurrentStep>> = TField extends path.generateObjectConfig<TField> ? path.objectToPath<TField> extends TDeepKeys ? path.objectToPath<TField> extends DeepKeys<Relaxed<TCurrentStep>> ? path.pickBy<Relaxed<TCurrentStep>, path.objectToPath<TField>> : never : never : never;
76
+ type resolvePathType<TCurrentStep extends AnyResolvedStep, TField extends chosenFields<TCurrentStep>> = TField extends HelperFnChosenSteps.defaultStringOption ? 'all' : TField extends Array<infer _> ? 'tuple' : objectHelpers.isObject<TField> extends true ? 'object' : never;
77
+ type resolvePathMap<TCurrentStep extends AnyResolvedStep, TField extends chosenFields<TCurrentStep>> = {
78
+ all: resolveAllPropertyPath<TCurrentStep, TField>;
79
+ tuple: resolveTuplePropertyPath<TCurrentStep, TField>;
80
+ object: resolveObjectPropertyPath<TCurrentStep, TField>;
81
+ };
82
+ export type resolvedFieldValue<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TTargetStep extends ValidStepKey<TStepNumbers>, TField extends chosenFields<TCurrentStep>, TCurrentStep extends resolvedStep<TResolvedStep, TStepNumbers, TTargetStep> = resolvedStep<TResolvedStep, TStepNumbers, TTargetStep>, TType extends resolvePathType<TCurrentStep, TField> = resolvePathType<TCurrentStep, TField>> = resolvePathMap<TCurrentStep, TField>[TType];
83
+ export type chosenFields<TCurrentStep extends AnyResolvedStep> = HelperFnChosenSteps.defaultStringOption | HelperFnChosenSteps.tupleNotation<DeepKeys<TCurrentStep>> | path.generateObjectConfig<TCurrentStep>;
84
+ export type options<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TTargetStep extends ValidStepKey<TStepNumbers>, TField extends chosenFields<TCurrentStep>, TAdditionalCtx extends Record<string, unknown>, TCurrentStep extends resolvedStep<TResolvedStep, TStepNumbers, TTargetStep> = resolvedStep<TResolvedStep, TStepNumbers, TTargetStep>> = CtxDataSelector<TResolvedStep, TStepNumbers, [
85
+ TTargetStep
86
+ ], TAdditionalCtx> & {
87
+ /**
88
+ * The step to update.
89
+ */
90
+ targetStep: TTargetStep;
91
+ /**
92
+ * The specific fields to update.
93
+ *
94
+ * Optionally provide a value to narrow the results of the `ctx` in the
95
+ * updater `fn`.
96
+ */
97
+ fields?: TField;
98
+ /**
99
+ * Enables verbose debug logging for this update operation.
100
+ * Set to `true` to output helpful information for troubleshooting.
101
+ */
102
+ debug?: boolean;
103
+ updater: Updater<Expand<HelperFnInputBase<TResolvedStep, TStepNumbers, [
104
+ TTargetStep
105
+ ], never, TAdditionalCtx>>, resolvedFieldValue<TResolvedStep, TStepNumbers, TTargetStep, TField, TCurrentStep>>;
106
+ };
107
+ export type availableFields<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TTargetStep extends ValidStepKey<TStepNumbers>> = HelperFnChosenSteps.build<DeepKeys<resolvedStep<TResolvedStep, TStepNumbers, TTargetStep>>>;
108
+ export type general<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>> = <targetStep extends ValidStepKey<TStepNumbers>, field extends chosenFields<resolvedStep<TResolvedStep, TStepNumbers, targetStep>> = 'all', additionalCtx extends Record<string, unknown> = {}>(options: options<TResolvedStep, TStepNumbers, targetStep, field, additionalCtx>) => void;
109
+ export type stepSpecific<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TTargetStep extends ValidStepKey<TStepNumbers>> = <field extends chosenFields<resolvedStep<TResolvedStep, TStepNumbers, TTargetStep>> = 'all', additionalCtx extends Record<string, unknown> = {}>(options: Omit<options<TResolvedStep, TStepNumbers, TTargetStep, field, additionalCtx>, 'targetStep'>) => void;
110
+ export {};
111
+ }
112
+ export type StepSpecificHelperFn<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TTargetStep extends TStepNumbers> = {
113
+ /**
114
+ * Create a helper function with validated input.
115
+ */
116
+ <validator, additionalCtx extends Record<string, unknown>, response>(options: Omit<CreateHelperFunctionOptionsWithValidator<TResolvedStep, TStepNumbers, [
117
+ ValidStepKey<TTargetStep>
118
+ ], validator, additionalCtx>, 'stepData'>, fn: HelperFnWithValidator<TResolvedStep, TStepNumbers, [
119
+ ValidStepKey<TTargetStep>
120
+ ], validator, additionalCtx, response>): CreatedHelperFnWithInput<validator, response>;
121
+ /**
122
+ * Create a helper function without input.
123
+ */
124
+ <additionalCtx extends Record<string, unknown>, response>(fn: HelperFnWithoutValidator<TResolvedStep, TStepNumbers, [
125
+ ValidStepKey<TTargetStep>
126
+ ], additionalCtx, response>): CreatedHelperFnWithoutInput<response>;
127
+ /**
128
+ * Create a helper function without input.
129
+ */
130
+ <response>(fn: HelperFnWithoutValidator<TResolvedStep, TStepNumbers, [
131
+ ValidStepKey<TTargetStep>
132
+ ], {}, response>): CreatedHelperFnWithoutInput<response>;
133
+ };
134
+ export type GeneralHelperFn<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>> = {
135
+ /**
136
+ * Create a helper function with validated input.
137
+ */
138
+ <const chosenSteps extends HelperFnChosenSteps<TResolvedStep, TStepNumbers>, validator, additionalCtx extends Record<string, unknown>, response>(options: CreateHelperFunctionOptionsWithValidator<TResolvedStep, TStepNumbers, chosenSteps, validator, additionalCtx>, fn: HelperFnWithValidator<TResolvedStep, TStepNumbers, chosenSteps, validator, additionalCtx, response>): CreatedHelperFnWithInput<validator, response>;
139
+ /**
140
+ * Create a helper function without input.
141
+ */
142
+ <const chosenSteps extends HelperFnChosenSteps<TResolvedStep, TStepNumbers>, additionalCtx extends Record<string, unknown>, response>(options: CreateHelperFunctionOptionsWithoutValidator<TResolvedStep, TStepNumbers, chosenSteps> & CreateHelperFunctionOptionsWithCustomCtxOptions<TResolvedStep, TStepNumbers, chosenSteps, additionalCtx>, fn: HelperFnWithoutValidator<TResolvedStep, TStepNumbers, chosenSteps, additionalCtx, response>): CreatedHelperFnWithoutInput<response>;
143
+ };
144
+ export type CreateStepHelperFn<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TTargetStep extends TStepNumbers = TStepNumbers, TForSpecificStep extends boolean = false> = TForSpecificStep extends true ? StepSpecificHelperFn<TResolvedStep, TStepNumbers, TTargetStep> : GeneralHelperFn<TResolvedStep, TStepNumbers>;
145
+ export type StepSpecificHelperFns<TResolvedStep extends AnyResolvedStep, TKey extends keyof TResolvedStep> = {
146
+ /**
147
+ * A helper function to create a reusable function for the current step.
148
+ */
149
+ createHelperFn: CreateStepHelperFn<TResolvedStep, StepNumbers<TResolvedStep>, ExtractStepFromKey<Constrain<TKey, string>>, true>;
150
+ } & (TKey extends ValidStepKey<StepNumbers<TResolvedStep>> ? {
151
+ /**
152
+ * A helper function to updated the current step's data.
153
+ */
154
+ update: UpdateFn.stepSpecific<TResolvedStep, StepNumbers<TResolvedStep>, TKey>;
155
+ } : {});
156
+ export type ResolvedStep<TStep extends Step<TDefaultCasing>, TDefaultCasing extends CasingType = DefaultCasing, TResolvedStep extends ResolvedStepBuilder<TStep, TDefaultCasing> = ResolvedStepBuilder<TStep, TDefaultCasing>, TAdditionalStepProps extends object = {}> = TAdditionalStepProps & {
157
+ [stepKey in keyof TResolvedStep]: TResolvedStep[stepKey] & StepSpecificHelperFns<TResolvedStep, stepKey>;
158
+ };
159
+ export type StrippedResolvedStep<T extends AnyResolvedStep, TStringUpdate extends boolean = false> = {
160
+ [_ in keyof T as T[_] extends Function ? _ extends 'update' ? TStringUpdate extends true ? never : _ : never : _]: T[_];
161
+ };
162
+ export type AnyResolvedStep = ResolvedStep<any, any, any>;
163
+ export type ValidStepKey<N extends number = number> = `step${N}`;
164
+ export type ExtractStepFromKey<T> = T extends string ? T extends ValidStepKey<infer N> ? N : never : never;
165
+ export type InferStepOptions<T> = T extends {
166
+ [K in keyof T extends ValidStepKey ? keyof T : never]: StepOptions<infer _casing extends CasingType, infer _stepField extends AnyStepField, infer _fieldValidator>;
167
+ } ? T : Exclude<keyof T, ValidStepKey>;
168
+ export type Range = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
169
+ export type ClampTo0to10<N extends number> = N extends Range ? N : number extends N ? never : `${N}` extends `-${string}` ? 0 : 10;
170
+ export type Tuple<N extends number, R extends any[] = []> = R['length'] extends N ? R : Tuple<N, [...R, any]>;
171
+ export type GreaterThan<A extends Range, B extends Range> = Tuple<A> extends [
172
+ ...Tuple<B>,
173
+ ...infer _
174
+ ] ? Tuple<B> extends [...Tuple<A>, ...infer _] ? false : true : false;
175
+ export type Max<T extends number[]> = T extends [
176
+ infer A extends number,
177
+ ...infer Rest extends number[]
178
+ ] ? Rest['length'] extends 0 ? ClampTo0to10<A> : Max<Rest> extends infer M extends Range ? GreaterThan<ClampTo0to10<A>, M> extends true ? ClampTo0to10<A> : M : never : never;
179
+ export type Min<T extends number[]> = T extends [
180
+ infer A extends number,
181
+ ...infer Rest extends number[]
182
+ ] ? Rest['length'] extends 0 ? ClampTo0to10<A> : Min<Rest> extends infer M extends Range ? GreaterThan<ClampTo0to10<A>, M> extends true ? M : ClampTo0to10<A> : never : never;
183
+ export type UnionToTuple<T> = ((T extends any ? (t: T) => T : never) extends infer U ? (U extends any ? (u: U) => any : never) extends (v: infer V) => any ? V : never : never) extends (_: any) => infer W ? [...UnionToTuple<Exclude<T, W>>, W] : [];
184
+ export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = {
185
+ [K in Keys]-?: Required<Pick<T, K>> & Partial<Omit<T, K>>;
186
+ }[Keys];
187
+ export type LastStep<T extends AnyResolvedStep> = keyof T extends ValidStepKey ? Max<Constrain<UnionToTuple<ExtractStepFromKey<Constrain<keyof T, string>>>, number[]>> : never;
188
+ export type FirstStep<T extends AnyResolvedStep> = keyof T extends ValidStepKey ? Min<Constrain<UnionToTuple<ExtractStepFromKey<Constrain<keyof T, string>>>, number[]>> : never;
189
+ export type GetCurrentStep<T extends AnyResolvedStep, S extends ExtractStepFromKey<Constrain<keyof T, string>>> = ValidStepKey<S> extends Constrain<keyof T, string> ? T[ValidStepKey<S>] : never;
190
+ export type StepData<T extends AnyResolvedStep, Step extends ExtractStepFromKey<Constrain<keyof T, string>>> = {
191
+ /**
192
+ * The step number.
193
+ */
194
+ step: Step;
195
+ /**
196
+ * The step data.
197
+ */
198
+ data: GetCurrentStep<T, Step>;
199
+ };
200
+ export type StepNumbers<TResolvedStep extends AnyResolvedStep> = ExtractStepFromKey<Constrain<keyof TResolvedStep, string>>;
201
+ type WidenSpecial<T> = T extends CasingType ? CasingType : T extends FieldType ? FieldType : T;
202
+ export type Relaxed<T> = T extends (infer U)[] ? Relaxed<U>[] : T extends (...args: any[]) => any ? T : T extends object ? {
203
+ [K in keyof T]: Relaxed<T[K]>;
204
+ } : WidenSpecial<T>;
205
+ export declare namespace HelperFnChosenSteps {
206
+ type defaultStringOption = 'all';
207
+ type stringOption<T extends string> = defaultStringOption | T;
208
+ type tupleNotation<T extends string> = [T, ...T[]];
209
+ type objectNotation<T extends string> = RequireAtLeastOne<{
210
+ [_ in T]: true;
211
+ }>;
212
+ type build<TValue extends string, TStringOptions = defaultStringOption> = TStringOptions | tupleNotation<TValue> | objectNotation<TValue>;
213
+ type main<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>> = build<ValidStepKey<TSteps>>;
214
+ type extractStepNumber<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps> = HelperFnChosenSteps<TResolvedStep, TSteps>> = TChosenSteps extends tupleNotation<ValidStepKey<TSteps>> ? keyof {
215
+ [step in TChosenSteps[number] as ExtractStepFromKey<step>]: step;
216
+ } : TChosenSteps extends objectNotation<ValidStepKey<TSteps>> ? ExtractStepFromKey<keyof TChosenSteps> : TSteps;
217
+ type resolve<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = TChosenSteps extends 'all' ? keyof TResolvedStep : TChosenSteps extends tupleNotation<ValidStepKey<TSteps>> ? TChosenSteps[number] : TChosenSteps extends objectNotation<ValidStepKey<TSteps>> ? keyof TChosenSteps : never;
218
+ const CATCH_ALL_MESSAGE = "The chosen steps must either be set to on of the following: \"all\", an array of steps ([\"step1\", \"step2\", ...]), or an object containing the steps to chose ({ step1: true, step2: true, ...})";
219
+ function isAll(value: unknown): value is defaultStringOption;
220
+ function isTuple<T extends number>(value: unknown, validValues?: Array<unknown>): value is tupleNotation<ValidStepKey<T>>;
221
+ function isObject<T extends number>(value: unknown, validKeys?: Array<unknown>): value is objectNotation<ValidStepKey<T>>;
222
+ }
223
+ export type HelperFnChosenSteps<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>> = HelperFnChosenSteps.main<TResolvedStep, TSteps>;
224
+ export type CreateHelperFunctionOptionsBase<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = {
225
+ /**
226
+ * The step data to use for the function. It can either be an array with the **available**
227
+ * step numbers or `'all'`.
228
+ *
229
+ * - If set to `'all'`, data from **all** the steps will be available.
230
+ * - If an array of the **available** step numbers is provided, only data from those steps will be available.
231
+ */
232
+ stepData: TChosenSteps;
233
+ };
234
+ export type CreateHelperFunctionOptionsWithoutValidator<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TStepNumbers>> = CreateHelperFunctionOptionsBase<TResolvedStep, TStepNumbers, TChosenSteps>;
235
+ export interface CtxDataSelector<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TStepNumbers>, TAdditionalCtx extends Record<string, unknown>> {
236
+ /**
237
+ * A function to select the data that will be available in the `fn`'s ctx.
238
+ * @param input The available input to create the context with.
239
+ * @returns The created ctx.
240
+ */
241
+ ctxData?: (input: Pick<HelperFnInputBase<TResolvedStep, TStepNumbers, 'all', HelperFnChosenSteps.resolve<TResolvedStep, TStepNumbers, TChosenSteps>>, 'ctx'>) => TAdditionalCtx;
242
+ }
243
+ export type CreateHelperFunctionOptionsWithCustomCtxOptions<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TStepNumbers>, TAdditionalCtx extends Record<string, unknown>> = CreateHelperFunctionOptionsBase<TResolvedStep, TStepNumbers, TChosenSteps> & CtxDataSelector<TResolvedStep, TStepNumbers, TChosenSteps, TAdditionalCtx>;
244
+ export type CreateHelperFunctionOptionsWithValidator<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TStepNumbers>, TValidator, TAdditionalCtx extends Record<string, unknown>> = CreateHelperFunctionOptionsBase<TResolvedStep, TStepNumbers, TChosenSteps> & CreateHelperFunctionOptionsWithCustomCtxOptions<TResolvedStep, TStepNumbers, TChosenSteps, TAdditionalCtx> & {
245
+ /**
246
+ * A validator used to validate the params.
247
+ */
248
+ validator: Constrain<TValidator, AnyValidator, DefaultValidator>;
249
+ };
250
+ export type CreatedHelperFnInput<T> = {
251
+ data: Expand<ResolveValidatorOutput<T>>;
252
+ };
253
+ export type CreatedHelperFnWithInput<TValidator, TResponse> = (input: CreatedHelperFnInput<TValidator>) => TResponse;
254
+ export type CreatedHelperFnWithoutInput<TResponse> = () => TResponse;
255
+ type isString<T> = T extends string ? T : never;
256
+ export type HelperFnCtx<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TOmitSteps extends HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps> = never> = TChosenSteps extends 'all' ? Expand<Omit<{
257
+ [key in TSteps as `step${key}`]: StrippedResolvedStep<GetCurrentStep<TResolvedStep, key>>;
258
+ }, isString<TOmitSteps>>> : TChosenSteps extends object ? keyof TChosenSteps extends ValidStepKey<TSteps> ? Expand<Omit<{
259
+ -readonly [key in keyof TChosenSteps]: StrippedResolvedStep<GetCurrentStep<TResolvedStep, ExtractStepFromKey<key>>>;
260
+ }, isString<TOmitSteps>>> : TChosenSteps extends ValidStepKey<TSteps>[] ? Expand<Omit<{
261
+ [key in TChosenSteps[number]]: StrippedResolvedStep<GetCurrentStep<TResolvedStep, ExtractStepFromKey<key>>>;
262
+ }, isString<TOmitSteps>>> : never : never;
263
+ export type helperFnUpdateFn<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TSteps extends ValidStepKey<TStepNumbers>> = {
264
+ [step in TSteps]: UpdateFn.stepSpecific<TResolvedStep, TStepNumbers, step>;
265
+ };
266
+ export type HelperFnUpdateFn<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = UpdateFn.general<TResolvedStep, TSteps> & (TChosenSteps extends HelperFnChosenSteps.defaultStringOption ? helperFnUpdateFn<TResolvedStep, TSteps, ValidStepKey<TSteps>> : TChosenSteps extends HelperFnChosenSteps.tupleNotation<ValidStepKey<TSteps>> ? helperFnUpdateFn<TResolvedStep, TSteps, TChosenSteps[number]> : TChosenSteps extends HelperFnChosenSteps.objectNotation<ValidStepKey<TSteps>> ? {
267
+ [step in keyof TChosenSteps]: step extends ValidStepKey<TSteps> ? helperFnUpdateFn<TResolvedStep, TSteps, step>[step] : {};
268
+ } : {});
269
+ export interface HelperFnInputBase<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TOmitSteps extends HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps> = never, TAdditionalCtx extends Record<string, unknown> = {}> {
270
+ /**
271
+ * The multi-step form step context.
272
+ */
273
+ ctx: Expand<HelperFnCtx<TResolvedStep, TSteps, TChosenSteps, TOmitSteps> & TAdditionalCtx>;
274
+ /**
275
+ * A function to update parts of the multi-step form schema.
276
+ */
277
+ update: HelperFnUpdateFn<TResolvedStep, TSteps, TChosenSteps>;
278
+ }
279
+ export type HelperFnInputWithValidator<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TValidator, TAdditionalCtx extends Record<string, unknown>> = HelperFnInputBase<TResolvedStep, TSteps, TChosenSteps, never, TAdditionalCtx> & {
280
+ data: ResolveValidatorOutput<TValidator>;
281
+ };
282
+ export type HelperFnInputWithoutValidator<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TAdditionalCtx extends Record<string, unknown>> = HelperFnInputBase<TResolvedStep, TSteps, TChosenSteps, never, TAdditionalCtx>;
283
+ export type HelperFnWithValidator<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TValidator, TAdditionalCtx extends Record<string, unknown>, Response> = (input: HelperFnInputWithValidator<TResolvedStep, TSteps, TChosenSteps, TValidator, TAdditionalCtx>) => Response;
284
+ export type HelperFnWithoutValidator<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TAdditionalCtx extends Record<string, unknown>, Response> = (input: HelperFnInputWithoutValidator<TResolvedStep, TSteps, TChosenSteps, TAdditionalCtx>) => Response;
285
+ export interface MultiStepFormSchemaStepConfig<TStep extends Step<TCasing>, TCasing extends CasingType, TStorageKey extends string> extends NameTransformCasingOptions<TCasing> {
286
+ /**
287
+ * The steps that this multi step form will include.
288
+ */
289
+ steps: InferStepOptions<TStep>;
290
+ /**
291
+ * The options for the storage module.
292
+ */
293
+ storage?: Omit<StorageConfig<any, TStorageKey>, 'data'>;
294
+ }
295
+ export {};
@@ -0,0 +1,21 @@
1
+ import { AnyResolvedStep, GetCurrentStep, HelperFnChosenSteps, HelperFnCtx, StepNumbers, Updater } from './types';
2
+ export type GetStepOptions<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TStepNumber extends TStepNumbers> = {
3
+ step: TStepNumber;
4
+ };
5
+ /**
6
+ * Gets the step number from an input string.
7
+ * @param input The input to extract the step number from.
8
+ * @returns The extracted step number.
9
+ */
10
+ export declare function extractNumber(input: string): number;
11
+ /**
12
+ * A factory function to get the data of a specific step.
13
+ * @param resolvedStepValues The resolved step values.
14
+ * @returns A function to get specific step data from a target step.
15
+ */
16
+ export declare function getStep<resolvedStep extends AnyResolvedStep, stepNumbers extends StepNumbers<resolvedStep>>(resolvedStepValues: resolvedStep): <stepNumber extends stepNumbers>(options: GetStepOptions<resolvedStep, stepNumbers, stepNumber>) => {
17
+ step: stepNumber;
18
+ data: GetCurrentStep<resolvedStep, stepNumber>;
19
+ };
20
+ export declare function createCtx<TResolvedStep extends AnyResolvedStep, TStepNumbers extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TStepNumbers>>(values: TResolvedStep, stepData: TChosenSteps): HelperFnCtx<TResolvedStep, TStepNumbers, TChosenSteps, never>;
21
+ export declare function functionalUpdate<TInput, TOutput>(updater: Updater<TInput, TOutput>, input: TInput): TOutput;
@@ -0,0 +1,28 @@
1
+ import { Updater } from './steps/types';
2
+ export type DefaultStorageKey = typeof DEFAULT_STORAGE_KEY;
3
+ export type StorageConfig<TData, TKey extends string> = {
4
+ key: TKey;
5
+ data: TData;
6
+ store?: Storage;
7
+ /**
8
+ * An extra option to throw an error when {@linkcode window} is `undefined`
9
+ * @default false
10
+ */
11
+ throwWhenUndefined?: boolean;
12
+ };
13
+ export declare const DEFAULT_STORAGE_KEY = "MultiStepForm";
14
+ export declare class MultiStepFormStorage<data, key extends string = DefaultStorageKey> {
15
+ readonly key: key;
16
+ readonly store: Storage;
17
+ readonly data: data;
18
+ private readonly log;
19
+ private readonly shouldRunActions;
20
+ private readonly throwWhenUndefined;
21
+ constructor(config: StorageConfig<data, key>);
22
+ private throwOnEmptyStore;
23
+ private resolveValue;
24
+ hasKey(): boolean;
25
+ get(): data | undefined;
26
+ remove(): void;
27
+ add(value: Updater<data>): void;
28
+ }
@@ -0,0 +1,10 @@
1
+ export declare abstract class Subscribable<TListener extends Function> {
2
+ protected listeners: Set<TListener>;
3
+ constructor();
4
+ subscribe(listener: TListener): () => void;
5
+ hasListeners(): boolean;
6
+ protected onSubscribe(): void;
7
+ protected onUnsubscribe(): void;
8
+ protected abstract notify(): void;
9
+ abstract getSnapshot(): this;
10
+ }