@jfdevelops/react-multi-step-form 1.0.0-alpha.3 → 1.0.0-alpha.30
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/dist/create-context.cjs +92 -0
- package/dist/create-context.cjs.map +1 -0
- package/dist/create-context.d.cts +154 -0
- package/dist/create-context.d.mts +154 -0
- package/dist/create-context.mjs +92 -0
- package/dist/create-context.mjs.map +1 -0
- package/dist/field.cjs +41 -0
- package/dist/field.cjs.map +1 -0
- package/dist/field.d.cts +68 -0
- package/dist/field.d.mts +68 -0
- package/dist/field.mjs +36 -0
- package/dist/field.mjs.map +1 -0
- package/dist/form-config.cjs +32 -0
- package/dist/form-config.cjs.map +1 -0
- package/dist/form-config.d.cts +160 -0
- package/dist/form-config.d.mts +160 -0
- package/dist/form-config.mjs +27 -0
- package/dist/form-config.mjs.map +1 -0
- package/dist/hooks/use-multi-step-form-data.cjs +41 -0
- package/dist/hooks/use-multi-step-form-data.cjs.map +1 -0
- package/dist/hooks/use-multi-step-form-data.d.cts +28 -0
- package/dist/hooks/use-multi-step-form-data.d.mts +28 -0
- package/dist/hooks/use-multi-step-form-data.mjs +39 -0
- package/dist/hooks/use-multi-step-form-data.mjs.map +1 -0
- package/dist/hooks/use-selector.cjs +64 -0
- package/dist/hooks/use-selector.cjs.map +1 -0
- package/dist/hooks/use-selector.d.cts +92 -0
- package/dist/hooks/use-selector.d.mts +92 -0
- package/dist/hooks/use-selector.mjs +64 -0
- package/dist/hooks/use-selector.mjs.map +1 -0
- package/dist/index.cjs +16 -43
- package/dist/index.d.cts +5 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +5 -1415
- package/dist/schema.cjs +45 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.cts +34 -0
- package/dist/schema.d.mts +34 -0
- package/dist/schema.mjs +44 -0
- package/dist/schema.mjs.map +1 -0
- package/dist/selector.cjs +53 -0
- package/dist/selector.cjs.map +1 -0
- package/dist/selector.d.cts +56 -0
- package/dist/selector.d.mts +56 -0
- package/dist/selector.mjs +48 -0
- package/dist/selector.mjs.map +1 -0
- package/dist/step-schema.cjs +244 -0
- package/dist/step-schema.cjs.map +1 -0
- package/dist/step-schema.d.cts +164 -0
- package/dist/step-schema.d.mts +164 -0
- package/dist/step-schema.mjs +237 -0
- package/dist/step-schema.mjs.map +1 -0
- package/dist/utils.cjs +34 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.mjs +33 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +15 -11
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/types/create-context.d.ts +0 -156
- package/dist/types/field.d.ts +0 -22
- package/dist/types/form-config.d.ts +0 -161
- package/dist/types/hooks/use-multi-step-form-data.d.ts +0 -26
- package/dist/types/index.d.ts +0 -4
- package/dist/types/schema.d.ts +0 -29
- package/dist/types/step-schema.d.ts +0 -134
- package/dist/types/utils.d.ts +0 -0
package/dist/field.d.cts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { SelectorFn } from "./hooks/use-selector.cjs";
|
|
2
|
+
import { AnyResolvedStep, Expand, HelperFnChosenSteps, HelperFnCtx, Override, StepNumbers, UpdateFn, Updater, fields } from "@jfdevelops/multi-step-form-core";
|
|
3
|
+
import * as react0 from "react";
|
|
4
|
+
import { ReactNode } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/field.d.ts
|
|
7
|
+
declare namespace field {
|
|
8
|
+
type sharedProps<TField extends string> = {
|
|
9
|
+
/**
|
|
10
|
+
* The name of the field.
|
|
11
|
+
*/
|
|
12
|
+
name: TField;
|
|
13
|
+
};
|
|
14
|
+
type getDeep<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = fields.getDeep<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>>;
|
|
15
|
+
type resolveDeepPath<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>> = fields.resolveDeepPath<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>, TField>;
|
|
16
|
+
type get<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = fields.get<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>>;
|
|
17
|
+
export type onInputChangeOptions<TStrict extends boolean, TPartial extends boolean> = UpdateFn.ModeOptions<{
|
|
18
|
+
strict: TStrict;
|
|
19
|
+
partial: TPartial;
|
|
20
|
+
}> & UpdateFn.DebugOptions;
|
|
21
|
+
export type childrenProps<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>, TValue extends resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField> = resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField>> = sharedProps<TField> & Override<get<TResolvedStep, TSteps, TChosenSteps>[fields.parentOf<TField>], 'defaultValue', TValue> & {
|
|
22
|
+
/**
|
|
23
|
+
* A useful wrapper around `update` to update the specific field.
|
|
24
|
+
* @param value The new value for the field.
|
|
25
|
+
* @param options The options for the update operation.
|
|
26
|
+
*/
|
|
27
|
+
onInputChange: <strict extends boolean = true, partial extends boolean = false>(value: Updater<UpdateFn.resolvedUpdaterReturnType<TValue, {
|
|
28
|
+
strict: strict;
|
|
29
|
+
partial: partial;
|
|
30
|
+
}, {}>>, options?: onInputChangeOptions<strict, partial>) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Resets the field's value to the original value that was
|
|
33
|
+
* defined in the config.
|
|
34
|
+
*/
|
|
35
|
+
reset: (options?: UpdateFn.DebugOptions) => void;
|
|
36
|
+
};
|
|
37
|
+
export type childrenPropsWithSelected<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>, TSelected> = childrenProps<TResolvedStep, TSteps, TChosenSteps, TField> & {
|
|
38
|
+
selected: {
|
|
39
|
+
/**
|
|
40
|
+
* The result of the `selectorFn`.
|
|
41
|
+
*/
|
|
42
|
+
value: TSelected;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export type props<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>, TSelected> = sharedProps<TField> & {
|
|
46
|
+
selectorFn?: SelectorFn<TResolvedStep, TSteps, TChosenSteps, TSelected>;
|
|
47
|
+
children: (props: [TSelected] extends [never] ? childrenProps<TResolvedStep, TSteps, TChosenSteps, TField> : childrenPropsWithSelected<TResolvedStep, TSteps, TChosenSteps, TField, TSelected>) => ReactNode;
|
|
48
|
+
};
|
|
49
|
+
export type component<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = <field$1 extends fields.getDeep<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>>, selected = never>(props: props<TResolvedStep, TSteps, TChosenSteps, field$1, selected>) => ReactNode;
|
|
50
|
+
export type createOptions<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = {
|
|
51
|
+
propsCreator: <TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>>(name: TField) => field$1.childrenProps<TResolvedStep, TSteps, TChosenSteps, TField>;
|
|
52
|
+
subscribe?: (listener: () => void) => () => void;
|
|
53
|
+
getValue?: <TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>>(name: TField) => resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField>;
|
|
54
|
+
selectorCtx: Expand<HelperFnCtx<TResolvedStep, TSteps, TChosenSteps>>;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Create a field.
|
|
58
|
+
* @param propsCreator
|
|
59
|
+
* @param subscribe - Optional subscription function for reactivity
|
|
60
|
+
* @param getValue - Optional function to get the current field value reactively
|
|
61
|
+
* @returns
|
|
62
|
+
*/
|
|
63
|
+
export function create<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>>(options: createOptions<TResolvedStep, TSteps, TChosenSteps>): react0.MemoExoticComponent<component<TResolvedStep, TSteps, TChosenSteps>>;
|
|
64
|
+
export {};
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { field };
|
|
68
|
+
//# sourceMappingURL=field.d.cts.map
|
package/dist/field.d.mts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { SelectorFn } from "./hooks/use-selector.mjs";
|
|
2
|
+
import { AnyResolvedStep, Expand, HelperFnChosenSteps, HelperFnCtx, Override, StepNumbers, UpdateFn, Updater, fields } from "@jfdevelops/multi-step-form-core";
|
|
3
|
+
import * as react0 from "react";
|
|
4
|
+
import { ReactNode } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/field.d.ts
|
|
7
|
+
declare namespace field {
|
|
8
|
+
type sharedProps<TField extends string> = {
|
|
9
|
+
/**
|
|
10
|
+
* The name of the field.
|
|
11
|
+
*/
|
|
12
|
+
name: TField;
|
|
13
|
+
};
|
|
14
|
+
type getDeep<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = fields.getDeep<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>>;
|
|
15
|
+
type resolveDeepPath<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>> = fields.resolveDeepPath<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>, TField>;
|
|
16
|
+
type get<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = fields.get<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>>;
|
|
17
|
+
export type onInputChangeOptions<TStrict extends boolean, TPartial extends boolean> = UpdateFn.ModeOptions<{
|
|
18
|
+
strict: TStrict;
|
|
19
|
+
partial: TPartial;
|
|
20
|
+
}> & UpdateFn.DebugOptions;
|
|
21
|
+
export type childrenProps<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>, TValue extends resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField> = resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField>> = sharedProps<TField> & Override<get<TResolvedStep, TSteps, TChosenSteps>[fields.parentOf<TField>], 'defaultValue', TValue> & {
|
|
22
|
+
/**
|
|
23
|
+
* A useful wrapper around `update` to update the specific field.
|
|
24
|
+
* @param value The new value for the field.
|
|
25
|
+
* @param options The options for the update operation.
|
|
26
|
+
*/
|
|
27
|
+
onInputChange: <strict extends boolean = true, partial extends boolean = false>(value: Updater<UpdateFn.resolvedUpdaterReturnType<TValue, {
|
|
28
|
+
strict: strict;
|
|
29
|
+
partial: partial;
|
|
30
|
+
}, {}>>, options?: onInputChangeOptions<strict, partial>) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Resets the field's value to the original value that was
|
|
33
|
+
* defined in the config.
|
|
34
|
+
*/
|
|
35
|
+
reset: (options?: UpdateFn.DebugOptions) => void;
|
|
36
|
+
};
|
|
37
|
+
export type childrenPropsWithSelected<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>, TSelected> = childrenProps<TResolvedStep, TSteps, TChosenSteps, TField> & {
|
|
38
|
+
selected: {
|
|
39
|
+
/**
|
|
40
|
+
* The result of the `selectorFn`.
|
|
41
|
+
*/
|
|
42
|
+
value: TSelected;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
export type props<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>, TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>, TSelected> = sharedProps<TField> & {
|
|
46
|
+
selectorFn?: SelectorFn<TResolvedStep, TSteps, TChosenSteps, TSelected>;
|
|
47
|
+
children: (props: [TSelected] extends [never] ? childrenProps<TResolvedStep, TSteps, TChosenSteps, TField> : childrenPropsWithSelected<TResolvedStep, TSteps, TChosenSteps, TField, TSelected>) => ReactNode;
|
|
48
|
+
};
|
|
49
|
+
export type component<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = <field$1 extends fields.getDeep<TResolvedStep, HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>>, selected = never>(props: props<TResolvedStep, TSteps, TChosenSteps, field$1, selected>) => ReactNode;
|
|
50
|
+
export type createOptions<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>> = {
|
|
51
|
+
propsCreator: <TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>>(name: TField) => field$1.childrenProps<TResolvedStep, TSteps, TChosenSteps, TField>;
|
|
52
|
+
subscribe?: (listener: () => void) => () => void;
|
|
53
|
+
getValue?: <TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>>(name: TField) => resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField>;
|
|
54
|
+
selectorCtx: Expand<HelperFnCtx<TResolvedStep, TSteps, TChosenSteps>>;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Create a field.
|
|
58
|
+
* @param propsCreator
|
|
59
|
+
* @param subscribe - Optional subscription function for reactivity
|
|
60
|
+
* @param getValue - Optional function to get the current field value reactively
|
|
61
|
+
* @returns
|
|
62
|
+
*/
|
|
63
|
+
export function create<TResolvedStep extends AnyResolvedStep, TSteps extends StepNumbers<TResolvedStep>, TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>>(options: createOptions<TResolvedStep, TSteps, TChosenSteps>): react0.MemoExoticComponent<component<TResolvedStep, TSteps, TChosenSteps>>;
|
|
64
|
+
export {};
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { field };
|
|
68
|
+
//# sourceMappingURL=field.d.mts.map
|
package/dist/field.mjs
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { selector } from "./selector.mjs";
|
|
2
|
+
import { memo, useSyncExternalStore } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/field.tsx
|
|
6
|
+
let field;
|
|
7
|
+
(function(_field) {
|
|
8
|
+
function create(options) {
|
|
9
|
+
const { propsCreator, subscribe, getValue, selectorCtx } = options;
|
|
10
|
+
const Field = (props) => {
|
|
11
|
+
const { name, children, selectorFn } = props;
|
|
12
|
+
const subscribeFn = subscribe || (() => () => {});
|
|
13
|
+
const getValueFn = getValue || (() => void 0);
|
|
14
|
+
const currentValue = useSyncExternalStore(subscribeFn, () => getValueFn(name), () => getValueFn(name));
|
|
15
|
+
let createdProps = propsCreator(name);
|
|
16
|
+
if (getValue) createdProps = {
|
|
17
|
+
...createdProps,
|
|
18
|
+
defaultValue: currentValue
|
|
19
|
+
};
|
|
20
|
+
if (selectorFn) return /* @__PURE__ */ jsx(selector.create(() => selectorCtx, subscribeFn), {
|
|
21
|
+
selector: selectorFn,
|
|
22
|
+
children: (value) => children({
|
|
23
|
+
...createdProps,
|
|
24
|
+
selected: { value }
|
|
25
|
+
})
|
|
26
|
+
});
|
|
27
|
+
return children(createdProps);
|
|
28
|
+
};
|
|
29
|
+
return memo(Field);
|
|
30
|
+
}
|
|
31
|
+
_field.create = create;
|
|
32
|
+
})(field || (field = {}));
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { field };
|
|
36
|
+
//# sourceMappingURL=field.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.mjs","names":["Field: field.component<TResolvedStep, TSteps, TChosenSteps>"],"sources":["../src/field.tsx"],"sourcesContent":["import type {\n AnyResolvedStep,\n Expand,\n fields,\n HelperFnChosenSteps,\n HelperFnCtx,\n Override,\n StepNumbers,\n UpdateFn,\n Updater,\n} from '@jfdevelops/multi-step-form-core';\nimport type { ReactNode } from 'react';\nimport { memo, useSyncExternalStore } from 'react';\nimport type { SelectorFn } from './hooks/use-selector';\nimport { selector } from './selector';\n\nexport namespace field {\n type sharedProps<TField extends string> = {\n /**\n * The name of the field.\n */\n name: TField;\n };\n\n // aliases for types in `fields` namespace\n type getDeep<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>\n > = fields.getDeep<\n TResolvedStep,\n HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>\n >;\n type resolveDeepPath<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>,\n TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>\n > = fields.resolveDeepPath<\n TResolvedStep,\n HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>,\n TField\n >;\n type get<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>\n > = fields.get<\n TResolvedStep,\n HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>\n >;\n export type onInputChangeOptions<\n TStrict extends boolean,\n TPartial extends boolean\n > = UpdateFn.ModeOptions<{\n strict: TStrict;\n partial: TPartial;\n }> &\n UpdateFn.DebugOptions;\n\n export type childrenProps<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>,\n TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>,\n TValue extends resolveDeepPath<\n TResolvedStep,\n TSteps,\n TChosenSteps,\n TField\n > = resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField>\n > = sharedProps<TField> &\n Override<\n get<TResolvedStep, TSteps, TChosenSteps>[fields.parentOf<TField>],\n 'defaultValue',\n TValue\n > & {\n /**\n * A useful wrapper around `update` to update the specific field.\n * @param value The new value for the field.\n * @param options The options for the update operation.\n */\n onInputChange: <\n strict extends boolean = true,\n partial extends boolean = false\n >(\n value: Updater<\n UpdateFn.resolvedUpdaterReturnType<\n TValue,\n { strict: strict; partial: partial },\n {}\n >\n >,\n options?: onInputChangeOptions<strict, partial>\n ) => void;\n /**\n * Resets the field's value to the original value that was\n * defined in the config.\n */\n reset: (options?: UpdateFn.DebugOptions) => void;\n };\n\n export type childrenPropsWithSelected<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>,\n TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>,\n TSelected\n > = childrenProps<TResolvedStep, TSteps, TChosenSteps, TField> & {\n selected: {\n /**\n * The result of the `selectorFn`.\n */\n value: TSelected;\n };\n };\n export type props<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>,\n TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>,\n TSelected\n > = sharedProps<TField> & {\n selectorFn?: SelectorFn<TResolvedStep, TSteps, TChosenSteps, TSelected>;\n children: (\n props: [TSelected] extends [never]\n ? childrenProps<TResolvedStep, TSteps, TChosenSteps, TField>\n : childrenPropsWithSelected<\n TResolvedStep,\n TSteps,\n TChosenSteps,\n TField,\n TSelected\n >\n ) => ReactNode;\n };\n export type component<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>\n > = <\n field extends fields.getDeep<\n TResolvedStep,\n HelperFnChosenSteps.resolve<TResolvedStep, TSteps, TChosenSteps>\n >,\n selected = never\n >(\n props: props<TResolvedStep, TSteps, TChosenSteps, field, selected>\n ) => ReactNode;\n\n export type createOptions<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>\n > = {\n propsCreator: <TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>>(\n name: TField\n ) => field.childrenProps<TResolvedStep, TSteps, TChosenSteps, TField>;\n subscribe?: (listener: () => void) => () => void;\n getValue?: <TField extends getDeep<TResolvedStep, TSteps, TChosenSteps>>(\n name: TField\n ) => resolveDeepPath<TResolvedStep, TSteps, TChosenSteps, TField>;\n selectorCtx: Expand<HelperFnCtx<TResolvedStep, TSteps, TChosenSteps>>;\n };\n\n /**\n * Create a field.\n * @param propsCreator\n * @param subscribe - Optional subscription function for reactivity\n * @param getValue - Optional function to get the current field value reactively\n * @returns\n */\n export function create<\n TResolvedStep extends AnyResolvedStep,\n TSteps extends StepNumbers<TResolvedStep>,\n TChosenSteps extends HelperFnChosenSteps<TResolvedStep, TSteps>\n >(options: createOptions<TResolvedStep, TSteps, TChosenSteps>) {\n const { propsCreator, subscribe, getValue, selectorCtx } = options;\n\n const Field: field.component<TResolvedStep, TSteps, TChosenSteps> = (\n props\n ) => {\n const { name, children, selectorFn } = props;\n\n // Always call the hook, but use no-op functions if subscribe/getValue aren't provided\n const subscribeFn = subscribe || (() => () => { });\n const getValueFn = getValue || (() => undefined);\n\n // Subscribe to changes to trigger rerenders\n const currentValue = useSyncExternalStore(\n subscribeFn,\n () => getValueFn(name),\n () => getValueFn(name)\n );\n\n let createdProps = propsCreator(name);\n\n // If getValue is provided, override defaultValue with the reactive value\n if (getValue) {\n createdProps = {\n ...createdProps,\n defaultValue: currentValue,\n } as typeof createdProps;\n }\n\n if (selectorFn) {\n const Selector = selector.create<TResolvedStep, TSteps, TChosenSteps>(\n () => selectorCtx,\n subscribeFn\n );\n\n return (\n <Selector selector={selectorFn}>\n {(value) =>\n children({\n ...createdProps,\n selected: { value: value as never },\n })\n }\n </Selector>\n );\n }\n\n return children(createdProps as never);\n };\n\n return memo(Field);\n }\n}"],"mappings":";;;;;;;CA4KS,SAAS,OAId,SAA6D;EAC7D,MAAM,EAAE,cAAc,WAAW,UAAU,gBAAgB;EAE3D,MAAMA,SACJ,UACG;GACH,MAAM,EAAE,MAAM,UAAU,eAAe;GAGvC,MAAM,cAAc,0BAA0B;GAC9C,MAAM,aAAa,mBAAmB;GAGtC,MAAM,eAAe,qBACnB,mBACM,WAAW,KAAK,QAChB,WAAW,KAAK,CACvB;GAED,IAAI,eAAe,aAAa,KAAK;AAGrC,OAAI,SACF,gBAAe;IACb,GAAG;IACH,cAAc;IACf;AAGH,OAAI,WAMF,QACE,oBANe,SAAS,aAClB,aACN,YACD;IAGW,UAAU;eAChB,UACA,SAAS;KACP,GAAG;KACH,UAAU,EAAS,OAAgB;KACpC,CAAC;KAEK;AAIf,UAAO,SAAS,aAAsB;;AAGxC,SAAO,KAAK,MAAM"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
2
|
+
|
|
3
|
+
//#region src/form-config.tsx
|
|
4
|
+
let MultiStepFormSchemaConfig;
|
|
5
|
+
(function(_MultiStepFormSchemaConfig) {
|
|
6
|
+
_MultiStepFormSchemaConfig.DEFAULT_FORM_ALIAS = "Form";
|
|
7
|
+
function isFormAvailable(target, enabledFor) {
|
|
8
|
+
if (Array.isArray(target)) {
|
|
9
|
+
if (enabledFor === "all") return true;
|
|
10
|
+
if (typeof enabledFor === "object" && !Array.isArray(enabledFor)) return Object.keys(enabledFor).some((key) => target.includes(key));
|
|
11
|
+
if (Array.isArray(enabledFor)) return enabledFor.some((key) => target.includes(key));
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
_MultiStepFormSchemaConfig.isFormAvailable = isFormAvailable;
|
|
16
|
+
function createDefaultForm(id) {
|
|
17
|
+
return (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("form", {
|
|
18
|
+
id,
|
|
19
|
+
...props
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
_MultiStepFormSchemaConfig.createDefaultForm = createDefaultForm;
|
|
23
|
+
})(MultiStepFormSchemaConfig || (MultiStepFormSchemaConfig = {}));
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
Object.defineProperty(exports, 'MultiStepFormSchemaConfig', {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function () {
|
|
29
|
+
return MultiStepFormSchemaConfig;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=form-config.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-config.cjs","names":[],"sources":["../src/form-config.tsx"],"sourcesContent":["import type {\n Expand,\n HelperFnChosenSteps,\n StepNumbers,\n ValidStepKey,\n} from '@jfdevelops/multi-step-form-core';\nimport type { ComponentPropsWithRef, JSX } from 'react';\nimport type {\n AnyResolvedStep,\n CreatedMultiStepFormComponent,\n} from './step-schema';\n\nexport namespace MultiStepFormSchemaConfig {\n export const DEFAULT_FORM_ALIAS = 'Form';\n export type defaultEnabledFor = HelperFnChosenSteps.defaultStringOption;\n export type defaultFormAlias = typeof DEFAULT_FORM_ALIAS;\n export type formEnabledFor<TResolvedStep extends AnyResolvedStep> =\n HelperFnChosenSteps<TResolvedStep, StepNumbers<TResolvedStep>>;\n type strippedResolvedSteps<T extends AnyResolvedStep> = {\n [_ in keyof T]: Expand<Omit<T[_], 'createComponent' | 'createHelperFn'>>;\n };\n export type AvailableStepForForm<\n TResolvedStep extends AnyResolvedStep,\n TEnabledFor extends formEnabledFor<TResolvedStep>\n > = TEnabledFor extends defaultEnabledFor\n ? strippedResolvedSteps<TResolvedStep>\n : TEnabledFor extends [\n ValidStepKey<StepNumbers<TResolvedStep>>,\n ...ValidStepKey<StepNumbers<TResolvedStep>>[]\n ]\n ? TEnabledFor[number] extends keyof TResolvedStep\n ? Pick<strippedResolvedSteps<TResolvedStep>, TEnabledFor[number]>\n : never\n : keyof TEnabledFor extends keyof TResolvedStep\n ? Expand<\n Pick<\n strippedResolvedSteps<TResolvedStep>,\n Extract<keyof TResolvedStep, keyof TEnabledFor>\n >\n >\n : never;\n export type formCtx<TAlias extends string, TProps> = {\n [_ in TAlias]: CreatedMultiStepFormComponent<TProps>;\n };\n export type renderFnData<\n TResolvedStep extends AnyResolvedStep,\n TEnabledFor extends formEnabledFor<TResolvedStep>\n > = {\n /**\n * The id for the form, either a custom one or the default one.\n */\n id: string;\n /**\n * The chosen steps that are available.\n */\n steps: Expand<AvailableStepForForm<TResolvedStep, TEnabledFor>>;\n };\n\n /**\n * The configuration options for the `form` option.\n */\n export interface FormConfig<\n TResolvedStep extends AnyResolvedStep,\n TAlias extends string,\n TFormEnabledFor extends formEnabledFor<TResolvedStep>,\n TCustomFormProps extends object\n > {\n /**\n * The `id` for the form component.\n *\n * If there is no value provided, the default id will the **current step key**.\n *\n * @default `${currentStep}`\n */\n id?: string;\n /**\n * The \"name\" of the form component.\n * @default 'Form'\n * @example\n * ```tsx\n * const schema = createMultiStepFormSchema({\n * steps: {\n * step1: {\n * title: 'Step 1',\n * fields: {\n * firstName: {\n * defaultValue: ''\n * }\n * }\n * },\n * form: {\n * alias: 'MyCustomForm',\n * render() {\n * // return custom form component here\n * }\n * }\n * }\n * })\n *\n * const Step1 = schema.stepSchema.step1.createComponent(\n * ({ ctx, MyCustomForm }, props: { children: ReactNode }) =>\n * // Notice how the form is available with its alias\n * <MyCustomFormName>{children}</MyCustomFormName>\n * )\n * ```\n */\n alias?: TAlias;\n /**\n * If the form component should be accessible for each step when calling `createComponent`.\n *\n * If no value is given, the form will be accessible for all the steps.\n */\n enabledForSteps?: TFormEnabledFor;\n /**\n *\n * @param data The data that is available for creating the custom form.\n * @param props Props that can be used for the custom form.\n * @returns An {@see JSX.Element} that is the custom form.\n * @example\n * ### With custom props\n * ```tsx\n * type CustomProps = {\n * title: string;\n * description?: string;\n * children: ReactNode;\n * };\n *\n * const schema = createMultiStepFormSchema({\n * steps: {\n * step1: {\n * title: 'Step 1',\n * fields: {\n * firstName: {\n * defaultValue: ''\n * }\n * }\n * },\n * form: {\n * alias: 'MyCustomForm',\n * render(data, props: CustomProps) {\n * return (\n * <div>\n * <h1>{props.title}</h1>\n * <p>{props.description}</p>\n * <form>{props.children}</form>\n * </div>\n * );\n * }\n * }\n * }\n * })\n * ```\n * ### Without custom props\n * ```tsx\n * const schema = createMultiStepFormSchema({\n * steps: {\n * step1: {\n * title: 'Step 1',\n * fields: {\n * firstName: {\n * defaultValue: ''\n * }\n * }\n * },\n * form: {\n * alias: 'MyCustomForm',\n * render(data, props) {\n * // The default type for `props` will be `ComponentPropsWithRef<'form'>`\n * // return custom form component here\n * }\n * }\n * }\n * })\n * ```\n */\n render: (\n data: renderFnData<TResolvedStep, TFormEnabledFor>,\n props: TCustomFormProps\n ) => JSX.Element;\n }\n\n export interface Form<\n TResolvedStep extends AnyResolvedStep,\n TAlias extends string,\n TFormEnabledFor extends formEnabledFor<TResolvedStep>,\n TCustomFormProps extends object\n > {\n form?: FormConfig<TResolvedStep, TAlias, TFormEnabledFor, TCustomFormProps>;\n }\n\n /**\n * Compares {@linkcode enabledFor} to the {@linkcode target} to determine if the form\n * should be available.\n * @param target The target steps the form _should_ be available for.\n * @param enabledFor The steps that the form _is_ enabled for.\n * @returns A boolean representing if the form should be available.\n */\n // Note: the implementation is specific to `MultiStepFormStepSchema.createComponentForStep`\n // because the `target` will always be an `Array` in `MultiStepFormStepSchema.createComponentForStep`.\n // TODO add validation to keys\n export function isFormAvailable<\n TResolvedStep extends AnyResolvedStep,\n TTarget extends HelperFnChosenSteps<\n TResolvedStep,\n StepNumbers<TResolvedStep>\n >,\n TEnabledFor extends formEnabledFor<TResolvedStep>\n >(target: TTarget, enabledFor: TEnabledFor) {\n if (Array.isArray(target)) {\n if (enabledFor === 'all') {\n return true;\n }\n\n if (typeof enabledFor === 'object' && !Array.isArray(enabledFor)) {\n return Object.keys(enabledFor).some((key) =>\n target.includes(key as `step${StepNumbers<TResolvedStep>}`)\n );\n }\n\n if (Array.isArray(enabledFor)) {\n return enabledFor.some((key) => target.includes(key));\n }\n }\n\n return false;\n }\n\n /**\n * Creates a form component with a default id.\n * @param id The default id for the form.\n * @returns A form component with a default {@linkcode id}.\n */\n export function createDefaultForm(id: string) {\n return (props: Omit<ComponentPropsWithRef<'form'>, 'id'>) => (\n <form id={id} {...props} />\n );\n }\n}\n"],"mappings":";;;;;iDAaoC;CA2L3B,SAAS,gBAOd,QAAiB,YAAyB;AAC1C,MAAI,MAAM,QAAQ,OAAO,EAAE;AACzB,OAAI,eAAe,MACjB,QAAO;AAGT,OAAI,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,WAAW,CAC9D,QAAO,OAAO,KAAK,WAAW,CAAC,MAAM,QACnC,OAAO,SAAS,IAA2C,CAC5D;AAGH,OAAI,MAAM,QAAQ,WAAW,CAC3B,QAAO,WAAW,MAAM,QAAQ,OAAO,SAAS,IAAI,CAAC;;AAIzD,SAAO;;;CAQF,SAAS,kBAAkB,IAAY;AAC5C,UAAQ,UACN,2CAAC;GAAS;GAAI,GAAI;IAAS"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { AnyResolvedStep as AnyResolvedStep$1, CreatedMultiStepFormComponent } from "./step-schema.cjs";
|
|
2
|
+
import { Expand, HelperFnChosenSteps, StepNumbers, ValidStepKey } from "@jfdevelops/multi-step-form-core";
|
|
3
|
+
import { ComponentPropsWithRef, JSX } from "react";
|
|
4
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
5
|
+
|
|
6
|
+
//#region src/form-config.d.ts
|
|
7
|
+
declare namespace MultiStepFormSchemaConfig {
|
|
8
|
+
export const DEFAULT_FORM_ALIAS = "Form";
|
|
9
|
+
export type defaultEnabledFor = HelperFnChosenSteps.defaultStringOption;
|
|
10
|
+
export type defaultFormAlias = typeof DEFAULT_FORM_ALIAS;
|
|
11
|
+
export type formEnabledFor<TResolvedStep extends AnyResolvedStep$1> = HelperFnChosenSteps<TResolvedStep, StepNumbers<TResolvedStep>>;
|
|
12
|
+
type strippedResolvedSteps<T extends AnyResolvedStep$1> = { [_ in keyof T]: Expand<Omit<T[_], 'createComponent' | 'createHelperFn'>> };
|
|
13
|
+
export type AvailableStepForForm<TResolvedStep extends AnyResolvedStep$1, TEnabledFor extends formEnabledFor<TResolvedStep>> = TEnabledFor extends defaultEnabledFor ? strippedResolvedSteps<TResolvedStep> : TEnabledFor extends [ValidStepKey<StepNumbers<TResolvedStep>>, ...ValidStepKey<StepNumbers<TResolvedStep>>[]] ? TEnabledFor[number] extends keyof TResolvedStep ? Pick<strippedResolvedSteps<TResolvedStep>, TEnabledFor[number]> : never : keyof TEnabledFor extends keyof TResolvedStep ? Expand<Pick<strippedResolvedSteps<TResolvedStep>, Extract<keyof TResolvedStep, keyof TEnabledFor>>> : never;
|
|
14
|
+
export type formCtx<TAlias extends string, TProps> = { [_ in TAlias]: CreatedMultiStepFormComponent<TProps> };
|
|
15
|
+
export type renderFnData<TResolvedStep extends AnyResolvedStep$1, TEnabledFor extends formEnabledFor<TResolvedStep>> = {
|
|
16
|
+
/**
|
|
17
|
+
* The id for the form, either a custom one or the default one.
|
|
18
|
+
*/
|
|
19
|
+
id: string;
|
|
20
|
+
/**
|
|
21
|
+
* The chosen steps that are available.
|
|
22
|
+
*/
|
|
23
|
+
steps: Expand<AvailableStepForForm<TResolvedStep, TEnabledFor>>;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* The configuration options for the `form` option.
|
|
27
|
+
*/
|
|
28
|
+
export interface FormConfig<TResolvedStep extends AnyResolvedStep$1, TAlias extends string, TFormEnabledFor extends formEnabledFor<TResolvedStep>, TCustomFormProps extends object> {
|
|
29
|
+
/**
|
|
30
|
+
* The `id` for the form component.
|
|
31
|
+
*
|
|
32
|
+
* If there is no value provided, the default id will the **current step key**.
|
|
33
|
+
*
|
|
34
|
+
* @default `${currentStep}`
|
|
35
|
+
*/
|
|
36
|
+
id?: string;
|
|
37
|
+
/**
|
|
38
|
+
* The "name" of the form component.
|
|
39
|
+
* @default 'Form'
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const schema = createMultiStepFormSchema({
|
|
43
|
+
* steps: {
|
|
44
|
+
* step1: {
|
|
45
|
+
* title: 'Step 1',
|
|
46
|
+
* fields: {
|
|
47
|
+
* firstName: {
|
|
48
|
+
* defaultValue: ''
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
* },
|
|
52
|
+
* form: {
|
|
53
|
+
* alias: 'MyCustomForm',
|
|
54
|
+
* render() {
|
|
55
|
+
* // return custom form component here
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* }
|
|
59
|
+
* })
|
|
60
|
+
*
|
|
61
|
+
* const Step1 = schema.stepSchema.step1.createComponent(
|
|
62
|
+
* ({ ctx, MyCustomForm }, props: { children: ReactNode }) =>
|
|
63
|
+
* // Notice how the form is available with its alias
|
|
64
|
+
* <MyCustomFormName>{children}</MyCustomFormName>
|
|
65
|
+
* )
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
alias?: TAlias;
|
|
69
|
+
/**
|
|
70
|
+
* If the form component should be accessible for each step when calling `createComponent`.
|
|
71
|
+
*
|
|
72
|
+
* If no value is given, the form will be accessible for all the steps.
|
|
73
|
+
*/
|
|
74
|
+
enabledForSteps?: TFormEnabledFor;
|
|
75
|
+
/**
|
|
76
|
+
*
|
|
77
|
+
* @param data The data that is available for creating the custom form.
|
|
78
|
+
* @param props Props that can be used for the custom form.
|
|
79
|
+
* @returns An {@see JSX.Element} that is the custom form.
|
|
80
|
+
* @example
|
|
81
|
+
* ### With custom props
|
|
82
|
+
* ```tsx
|
|
83
|
+
* type CustomProps = {
|
|
84
|
+
* title: string;
|
|
85
|
+
* description?: string;
|
|
86
|
+
* children: ReactNode;
|
|
87
|
+
* };
|
|
88
|
+
*
|
|
89
|
+
* const schema = createMultiStepFormSchema({
|
|
90
|
+
* steps: {
|
|
91
|
+
* step1: {
|
|
92
|
+
* title: 'Step 1',
|
|
93
|
+
* fields: {
|
|
94
|
+
* firstName: {
|
|
95
|
+
* defaultValue: ''
|
|
96
|
+
* }
|
|
97
|
+
* }
|
|
98
|
+
* },
|
|
99
|
+
* form: {
|
|
100
|
+
* alias: 'MyCustomForm',
|
|
101
|
+
* render(data, props: CustomProps) {
|
|
102
|
+
* return (
|
|
103
|
+
* <div>
|
|
104
|
+
* <h1>{props.title}</h1>
|
|
105
|
+
* <p>{props.description}</p>
|
|
106
|
+
* <form>{props.children}</form>
|
|
107
|
+
* </div>
|
|
108
|
+
* );
|
|
109
|
+
* }
|
|
110
|
+
* }
|
|
111
|
+
* }
|
|
112
|
+
* })
|
|
113
|
+
* ```
|
|
114
|
+
* ### Without custom props
|
|
115
|
+
* ```tsx
|
|
116
|
+
* const schema = createMultiStepFormSchema({
|
|
117
|
+
* steps: {
|
|
118
|
+
* step1: {
|
|
119
|
+
* title: 'Step 1',
|
|
120
|
+
* fields: {
|
|
121
|
+
* firstName: {
|
|
122
|
+
* defaultValue: ''
|
|
123
|
+
* }
|
|
124
|
+
* }
|
|
125
|
+
* },
|
|
126
|
+
* form: {
|
|
127
|
+
* alias: 'MyCustomForm',
|
|
128
|
+
* render(data, props) {
|
|
129
|
+
* // The default type for `props` will be `ComponentPropsWithRef<'form'>`
|
|
130
|
+
* // return custom form component here
|
|
131
|
+
* }
|
|
132
|
+
* }
|
|
133
|
+
* }
|
|
134
|
+
* })
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
render: (data: renderFnData<TResolvedStep, TFormEnabledFor>, props: TCustomFormProps) => JSX.Element;
|
|
138
|
+
}
|
|
139
|
+
export interface Form<TResolvedStep extends AnyResolvedStep$1, TAlias extends string, TFormEnabledFor extends formEnabledFor<TResolvedStep>, TCustomFormProps extends object> {
|
|
140
|
+
form?: FormConfig<TResolvedStep, TAlias, TFormEnabledFor, TCustomFormProps>;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Compares {@linkcode enabledFor} to the {@linkcode target} to determine if the form
|
|
144
|
+
* should be available.
|
|
145
|
+
* @param target The target steps the form _should_ be available for.
|
|
146
|
+
* @param enabledFor The steps that the form _is_ enabled for.
|
|
147
|
+
* @returns A boolean representing if the form should be available.
|
|
148
|
+
*/
|
|
149
|
+
export function isFormAvailable<TResolvedStep extends AnyResolvedStep$1, TTarget extends HelperFnChosenSteps<TResolvedStep, StepNumbers<TResolvedStep>>, TEnabledFor extends formEnabledFor<TResolvedStep>>(target: TTarget, enabledFor: TEnabledFor): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Creates a form component with a default id.
|
|
152
|
+
* @param id The default id for the form.
|
|
153
|
+
* @returns A form component with a default {@linkcode id}.
|
|
154
|
+
*/
|
|
155
|
+
export function createDefaultForm(id: string): (props: Omit<ComponentPropsWithRef<"form">, "id">) => react_jsx_runtime0.JSX.Element;
|
|
156
|
+
export {};
|
|
157
|
+
}
|
|
158
|
+
//#endregion
|
|
159
|
+
export { MultiStepFormSchemaConfig };
|
|
160
|
+
//# sourceMappingURL=form-config.d.cts.map
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { AnyResolvedStep as AnyResolvedStep$1, CreatedMultiStepFormComponent } from "./step-schema.mjs";
|
|
2
|
+
import { Expand, HelperFnChosenSteps, StepNumbers, ValidStepKey } from "@jfdevelops/multi-step-form-core";
|
|
3
|
+
import { ComponentPropsWithRef, JSX } from "react";
|
|
4
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
5
|
+
|
|
6
|
+
//#region src/form-config.d.ts
|
|
7
|
+
declare namespace MultiStepFormSchemaConfig {
|
|
8
|
+
export const DEFAULT_FORM_ALIAS = "Form";
|
|
9
|
+
export type defaultEnabledFor = HelperFnChosenSteps.defaultStringOption;
|
|
10
|
+
export type defaultFormAlias = typeof DEFAULT_FORM_ALIAS;
|
|
11
|
+
export type formEnabledFor<TResolvedStep extends AnyResolvedStep$1> = HelperFnChosenSteps<TResolvedStep, StepNumbers<TResolvedStep>>;
|
|
12
|
+
type strippedResolvedSteps<T extends AnyResolvedStep$1> = { [_ in keyof T]: Expand<Omit<T[_], 'createComponent' | 'createHelperFn'>> };
|
|
13
|
+
export type AvailableStepForForm<TResolvedStep extends AnyResolvedStep$1, TEnabledFor extends formEnabledFor<TResolvedStep>> = TEnabledFor extends defaultEnabledFor ? strippedResolvedSteps<TResolvedStep> : TEnabledFor extends [ValidStepKey<StepNumbers<TResolvedStep>>, ...ValidStepKey<StepNumbers<TResolvedStep>>[]] ? TEnabledFor[number] extends keyof TResolvedStep ? Pick<strippedResolvedSteps<TResolvedStep>, TEnabledFor[number]> : never : keyof TEnabledFor extends keyof TResolvedStep ? Expand<Pick<strippedResolvedSteps<TResolvedStep>, Extract<keyof TResolvedStep, keyof TEnabledFor>>> : never;
|
|
14
|
+
export type formCtx<TAlias extends string, TProps> = { [_ in TAlias]: CreatedMultiStepFormComponent<TProps> };
|
|
15
|
+
export type renderFnData<TResolvedStep extends AnyResolvedStep$1, TEnabledFor extends formEnabledFor<TResolvedStep>> = {
|
|
16
|
+
/**
|
|
17
|
+
* The id for the form, either a custom one or the default one.
|
|
18
|
+
*/
|
|
19
|
+
id: string;
|
|
20
|
+
/**
|
|
21
|
+
* The chosen steps that are available.
|
|
22
|
+
*/
|
|
23
|
+
steps: Expand<AvailableStepForForm<TResolvedStep, TEnabledFor>>;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* The configuration options for the `form` option.
|
|
27
|
+
*/
|
|
28
|
+
export interface FormConfig<TResolvedStep extends AnyResolvedStep$1, TAlias extends string, TFormEnabledFor extends formEnabledFor<TResolvedStep>, TCustomFormProps extends object> {
|
|
29
|
+
/**
|
|
30
|
+
* The `id` for the form component.
|
|
31
|
+
*
|
|
32
|
+
* If there is no value provided, the default id will the **current step key**.
|
|
33
|
+
*
|
|
34
|
+
* @default `${currentStep}`
|
|
35
|
+
*/
|
|
36
|
+
id?: string;
|
|
37
|
+
/**
|
|
38
|
+
* The "name" of the form component.
|
|
39
|
+
* @default 'Form'
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const schema = createMultiStepFormSchema({
|
|
43
|
+
* steps: {
|
|
44
|
+
* step1: {
|
|
45
|
+
* title: 'Step 1',
|
|
46
|
+
* fields: {
|
|
47
|
+
* firstName: {
|
|
48
|
+
* defaultValue: ''
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
* },
|
|
52
|
+
* form: {
|
|
53
|
+
* alias: 'MyCustomForm',
|
|
54
|
+
* render() {
|
|
55
|
+
* // return custom form component here
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* }
|
|
59
|
+
* })
|
|
60
|
+
*
|
|
61
|
+
* const Step1 = schema.stepSchema.step1.createComponent(
|
|
62
|
+
* ({ ctx, MyCustomForm }, props: { children: ReactNode }) =>
|
|
63
|
+
* // Notice how the form is available with its alias
|
|
64
|
+
* <MyCustomFormName>{children}</MyCustomFormName>
|
|
65
|
+
* )
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
alias?: TAlias;
|
|
69
|
+
/**
|
|
70
|
+
* If the form component should be accessible for each step when calling `createComponent`.
|
|
71
|
+
*
|
|
72
|
+
* If no value is given, the form will be accessible for all the steps.
|
|
73
|
+
*/
|
|
74
|
+
enabledForSteps?: TFormEnabledFor;
|
|
75
|
+
/**
|
|
76
|
+
*
|
|
77
|
+
* @param data The data that is available for creating the custom form.
|
|
78
|
+
* @param props Props that can be used for the custom form.
|
|
79
|
+
* @returns An {@see JSX.Element} that is the custom form.
|
|
80
|
+
* @example
|
|
81
|
+
* ### With custom props
|
|
82
|
+
* ```tsx
|
|
83
|
+
* type CustomProps = {
|
|
84
|
+
* title: string;
|
|
85
|
+
* description?: string;
|
|
86
|
+
* children: ReactNode;
|
|
87
|
+
* };
|
|
88
|
+
*
|
|
89
|
+
* const schema = createMultiStepFormSchema({
|
|
90
|
+
* steps: {
|
|
91
|
+
* step1: {
|
|
92
|
+
* title: 'Step 1',
|
|
93
|
+
* fields: {
|
|
94
|
+
* firstName: {
|
|
95
|
+
* defaultValue: ''
|
|
96
|
+
* }
|
|
97
|
+
* }
|
|
98
|
+
* },
|
|
99
|
+
* form: {
|
|
100
|
+
* alias: 'MyCustomForm',
|
|
101
|
+
* render(data, props: CustomProps) {
|
|
102
|
+
* return (
|
|
103
|
+
* <div>
|
|
104
|
+
* <h1>{props.title}</h1>
|
|
105
|
+
* <p>{props.description}</p>
|
|
106
|
+
* <form>{props.children}</form>
|
|
107
|
+
* </div>
|
|
108
|
+
* );
|
|
109
|
+
* }
|
|
110
|
+
* }
|
|
111
|
+
* }
|
|
112
|
+
* })
|
|
113
|
+
* ```
|
|
114
|
+
* ### Without custom props
|
|
115
|
+
* ```tsx
|
|
116
|
+
* const schema = createMultiStepFormSchema({
|
|
117
|
+
* steps: {
|
|
118
|
+
* step1: {
|
|
119
|
+
* title: 'Step 1',
|
|
120
|
+
* fields: {
|
|
121
|
+
* firstName: {
|
|
122
|
+
* defaultValue: ''
|
|
123
|
+
* }
|
|
124
|
+
* }
|
|
125
|
+
* },
|
|
126
|
+
* form: {
|
|
127
|
+
* alias: 'MyCustomForm',
|
|
128
|
+
* render(data, props) {
|
|
129
|
+
* // The default type for `props` will be `ComponentPropsWithRef<'form'>`
|
|
130
|
+
* // return custom form component here
|
|
131
|
+
* }
|
|
132
|
+
* }
|
|
133
|
+
* }
|
|
134
|
+
* })
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
render: (data: renderFnData<TResolvedStep, TFormEnabledFor>, props: TCustomFormProps) => JSX.Element;
|
|
138
|
+
}
|
|
139
|
+
export interface Form<TResolvedStep extends AnyResolvedStep$1, TAlias extends string, TFormEnabledFor extends formEnabledFor<TResolvedStep>, TCustomFormProps extends object> {
|
|
140
|
+
form?: FormConfig<TResolvedStep, TAlias, TFormEnabledFor, TCustomFormProps>;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Compares {@linkcode enabledFor} to the {@linkcode target} to determine if the form
|
|
144
|
+
* should be available.
|
|
145
|
+
* @param target The target steps the form _should_ be available for.
|
|
146
|
+
* @param enabledFor The steps that the form _is_ enabled for.
|
|
147
|
+
* @returns A boolean representing if the form should be available.
|
|
148
|
+
*/
|
|
149
|
+
export function isFormAvailable<TResolvedStep extends AnyResolvedStep$1, TTarget extends HelperFnChosenSteps<TResolvedStep, StepNumbers<TResolvedStep>>, TEnabledFor extends formEnabledFor<TResolvedStep>>(target: TTarget, enabledFor: TEnabledFor): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Creates a form component with a default id.
|
|
152
|
+
* @param id The default id for the form.
|
|
153
|
+
* @returns A form component with a default {@linkcode id}.
|
|
154
|
+
*/
|
|
155
|
+
export function createDefaultForm(id: string): (props: Omit<ComponentPropsWithRef<"form">, "id">) => react_jsx_runtime0.JSX.Element;
|
|
156
|
+
export {};
|
|
157
|
+
}
|
|
158
|
+
//#endregion
|
|
159
|
+
export { MultiStepFormSchemaConfig };
|
|
160
|
+
//# sourceMappingURL=form-config.d.mts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/form-config.tsx
|
|
4
|
+
let MultiStepFormSchemaConfig;
|
|
5
|
+
(function(_MultiStepFormSchemaConfig) {
|
|
6
|
+
_MultiStepFormSchemaConfig.DEFAULT_FORM_ALIAS = "Form";
|
|
7
|
+
function isFormAvailable(target, enabledFor) {
|
|
8
|
+
if (Array.isArray(target)) {
|
|
9
|
+
if (enabledFor === "all") return true;
|
|
10
|
+
if (typeof enabledFor === "object" && !Array.isArray(enabledFor)) return Object.keys(enabledFor).some((key) => target.includes(key));
|
|
11
|
+
if (Array.isArray(enabledFor)) return enabledFor.some((key) => target.includes(key));
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
_MultiStepFormSchemaConfig.isFormAvailable = isFormAvailable;
|
|
16
|
+
function createDefaultForm(id) {
|
|
17
|
+
return (props) => /* @__PURE__ */ jsx("form", {
|
|
18
|
+
id,
|
|
19
|
+
...props
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
_MultiStepFormSchemaConfig.createDefaultForm = createDefaultForm;
|
|
23
|
+
})(MultiStepFormSchemaConfig || (MultiStepFormSchemaConfig = {}));
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { MultiStepFormSchemaConfig };
|
|
27
|
+
//# sourceMappingURL=form-config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-config.mjs","names":[],"sources":["../src/form-config.tsx"],"sourcesContent":["import type {\n Expand,\n HelperFnChosenSteps,\n StepNumbers,\n ValidStepKey,\n} from '@jfdevelops/multi-step-form-core';\nimport type { ComponentPropsWithRef, JSX } from 'react';\nimport type {\n AnyResolvedStep,\n CreatedMultiStepFormComponent,\n} from './step-schema';\n\nexport namespace MultiStepFormSchemaConfig {\n export const DEFAULT_FORM_ALIAS = 'Form';\n export type defaultEnabledFor = HelperFnChosenSteps.defaultStringOption;\n export type defaultFormAlias = typeof DEFAULT_FORM_ALIAS;\n export type formEnabledFor<TResolvedStep extends AnyResolvedStep> =\n HelperFnChosenSteps<TResolvedStep, StepNumbers<TResolvedStep>>;\n type strippedResolvedSteps<T extends AnyResolvedStep> = {\n [_ in keyof T]: Expand<Omit<T[_], 'createComponent' | 'createHelperFn'>>;\n };\n export type AvailableStepForForm<\n TResolvedStep extends AnyResolvedStep,\n TEnabledFor extends formEnabledFor<TResolvedStep>\n > = TEnabledFor extends defaultEnabledFor\n ? strippedResolvedSteps<TResolvedStep>\n : TEnabledFor extends [\n ValidStepKey<StepNumbers<TResolvedStep>>,\n ...ValidStepKey<StepNumbers<TResolvedStep>>[]\n ]\n ? TEnabledFor[number] extends keyof TResolvedStep\n ? Pick<strippedResolvedSteps<TResolvedStep>, TEnabledFor[number]>\n : never\n : keyof TEnabledFor extends keyof TResolvedStep\n ? Expand<\n Pick<\n strippedResolvedSteps<TResolvedStep>,\n Extract<keyof TResolvedStep, keyof TEnabledFor>\n >\n >\n : never;\n export type formCtx<TAlias extends string, TProps> = {\n [_ in TAlias]: CreatedMultiStepFormComponent<TProps>;\n };\n export type renderFnData<\n TResolvedStep extends AnyResolvedStep,\n TEnabledFor extends formEnabledFor<TResolvedStep>\n > = {\n /**\n * The id for the form, either a custom one or the default one.\n */\n id: string;\n /**\n * The chosen steps that are available.\n */\n steps: Expand<AvailableStepForForm<TResolvedStep, TEnabledFor>>;\n };\n\n /**\n * The configuration options for the `form` option.\n */\n export interface FormConfig<\n TResolvedStep extends AnyResolvedStep,\n TAlias extends string,\n TFormEnabledFor extends formEnabledFor<TResolvedStep>,\n TCustomFormProps extends object\n > {\n /**\n * The `id` for the form component.\n *\n * If there is no value provided, the default id will the **current step key**.\n *\n * @default `${currentStep}`\n */\n id?: string;\n /**\n * The \"name\" of the form component.\n * @default 'Form'\n * @example\n * ```tsx\n * const schema = createMultiStepFormSchema({\n * steps: {\n * step1: {\n * title: 'Step 1',\n * fields: {\n * firstName: {\n * defaultValue: ''\n * }\n * }\n * },\n * form: {\n * alias: 'MyCustomForm',\n * render() {\n * // return custom form component here\n * }\n * }\n * }\n * })\n *\n * const Step1 = schema.stepSchema.step1.createComponent(\n * ({ ctx, MyCustomForm }, props: { children: ReactNode }) =>\n * // Notice how the form is available with its alias\n * <MyCustomFormName>{children}</MyCustomFormName>\n * )\n * ```\n */\n alias?: TAlias;\n /**\n * If the form component should be accessible for each step when calling `createComponent`.\n *\n * If no value is given, the form will be accessible for all the steps.\n */\n enabledForSteps?: TFormEnabledFor;\n /**\n *\n * @param data The data that is available for creating the custom form.\n * @param props Props that can be used for the custom form.\n * @returns An {@see JSX.Element} that is the custom form.\n * @example\n * ### With custom props\n * ```tsx\n * type CustomProps = {\n * title: string;\n * description?: string;\n * children: ReactNode;\n * };\n *\n * const schema = createMultiStepFormSchema({\n * steps: {\n * step1: {\n * title: 'Step 1',\n * fields: {\n * firstName: {\n * defaultValue: ''\n * }\n * }\n * },\n * form: {\n * alias: 'MyCustomForm',\n * render(data, props: CustomProps) {\n * return (\n * <div>\n * <h1>{props.title}</h1>\n * <p>{props.description}</p>\n * <form>{props.children}</form>\n * </div>\n * );\n * }\n * }\n * }\n * })\n * ```\n * ### Without custom props\n * ```tsx\n * const schema = createMultiStepFormSchema({\n * steps: {\n * step1: {\n * title: 'Step 1',\n * fields: {\n * firstName: {\n * defaultValue: ''\n * }\n * }\n * },\n * form: {\n * alias: 'MyCustomForm',\n * render(data, props) {\n * // The default type for `props` will be `ComponentPropsWithRef<'form'>`\n * // return custom form component here\n * }\n * }\n * }\n * })\n * ```\n */\n render: (\n data: renderFnData<TResolvedStep, TFormEnabledFor>,\n props: TCustomFormProps\n ) => JSX.Element;\n }\n\n export interface Form<\n TResolvedStep extends AnyResolvedStep,\n TAlias extends string,\n TFormEnabledFor extends formEnabledFor<TResolvedStep>,\n TCustomFormProps extends object\n > {\n form?: FormConfig<TResolvedStep, TAlias, TFormEnabledFor, TCustomFormProps>;\n }\n\n /**\n * Compares {@linkcode enabledFor} to the {@linkcode target} to determine if the form\n * should be available.\n * @param target The target steps the form _should_ be available for.\n * @param enabledFor The steps that the form _is_ enabled for.\n * @returns A boolean representing if the form should be available.\n */\n // Note: the implementation is specific to `MultiStepFormStepSchema.createComponentForStep`\n // because the `target` will always be an `Array` in `MultiStepFormStepSchema.createComponentForStep`.\n // TODO add validation to keys\n export function isFormAvailable<\n TResolvedStep extends AnyResolvedStep,\n TTarget extends HelperFnChosenSteps<\n TResolvedStep,\n StepNumbers<TResolvedStep>\n >,\n TEnabledFor extends formEnabledFor<TResolvedStep>\n >(target: TTarget, enabledFor: TEnabledFor) {\n if (Array.isArray(target)) {\n if (enabledFor === 'all') {\n return true;\n }\n\n if (typeof enabledFor === 'object' && !Array.isArray(enabledFor)) {\n return Object.keys(enabledFor).some((key) =>\n target.includes(key as `step${StepNumbers<TResolvedStep>}`)\n );\n }\n\n if (Array.isArray(enabledFor)) {\n return enabledFor.some((key) => target.includes(key));\n }\n }\n\n return false;\n }\n\n /**\n * Creates a form component with a default id.\n * @param id The default id for the form.\n * @returns A form component with a default {@linkcode id}.\n */\n export function createDefaultForm(id: string) {\n return (props: Omit<ComponentPropsWithRef<'form'>, 'id'>) => (\n <form id={id} {...props} />\n );\n }\n}\n"],"mappings":";;;;;iDAaoC;CA2L3B,SAAS,gBAOd,QAAiB,YAAyB;AAC1C,MAAI,MAAM,QAAQ,OAAO,EAAE;AACzB,OAAI,eAAe,MACjB,QAAO;AAGT,OAAI,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,WAAW,CAC9D,QAAO,OAAO,KAAK,WAAW,CAAC,MAAM,QACnC,OAAO,SAAS,IAA2C,CAC5D;AAGH,OAAI,MAAM,QAAQ,WAAW,CAC3B,QAAO,WAAW,MAAM,QAAQ,OAAO,SAAS,IAAI,CAAC;;AAIzD,SAAO;;;CAQF,SAAS,kBAAkB,IAAY;AAC5C,UAAQ,UACN,oBAAC;GAAS;GAAI,GAAI;IAAS"}
|