@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.
Files changed (67) hide show
  1. package/dist/create-context.cjs +92 -0
  2. package/dist/create-context.cjs.map +1 -0
  3. package/dist/create-context.d.cts +154 -0
  4. package/dist/create-context.d.mts +154 -0
  5. package/dist/create-context.mjs +92 -0
  6. package/dist/create-context.mjs.map +1 -0
  7. package/dist/field.cjs +41 -0
  8. package/dist/field.cjs.map +1 -0
  9. package/dist/field.d.cts +68 -0
  10. package/dist/field.d.mts +68 -0
  11. package/dist/field.mjs +36 -0
  12. package/dist/field.mjs.map +1 -0
  13. package/dist/form-config.cjs +32 -0
  14. package/dist/form-config.cjs.map +1 -0
  15. package/dist/form-config.d.cts +160 -0
  16. package/dist/form-config.d.mts +160 -0
  17. package/dist/form-config.mjs +27 -0
  18. package/dist/form-config.mjs.map +1 -0
  19. package/dist/hooks/use-multi-step-form-data.cjs +41 -0
  20. package/dist/hooks/use-multi-step-form-data.cjs.map +1 -0
  21. package/dist/hooks/use-multi-step-form-data.d.cts +28 -0
  22. package/dist/hooks/use-multi-step-form-data.d.mts +28 -0
  23. package/dist/hooks/use-multi-step-form-data.mjs +39 -0
  24. package/dist/hooks/use-multi-step-form-data.mjs.map +1 -0
  25. package/dist/hooks/use-selector.cjs +64 -0
  26. package/dist/hooks/use-selector.cjs.map +1 -0
  27. package/dist/hooks/use-selector.d.cts +92 -0
  28. package/dist/hooks/use-selector.d.mts +92 -0
  29. package/dist/hooks/use-selector.mjs +64 -0
  30. package/dist/hooks/use-selector.mjs.map +1 -0
  31. package/dist/index.cjs +16 -43
  32. package/dist/index.d.cts +5 -0
  33. package/dist/index.d.mts +5 -0
  34. package/dist/index.mjs +5 -1415
  35. package/dist/schema.cjs +45 -0
  36. package/dist/schema.cjs.map +1 -0
  37. package/dist/schema.d.cts +34 -0
  38. package/dist/schema.d.mts +34 -0
  39. package/dist/schema.mjs +44 -0
  40. package/dist/schema.mjs.map +1 -0
  41. package/dist/selector.cjs +53 -0
  42. package/dist/selector.cjs.map +1 -0
  43. package/dist/selector.d.cts +56 -0
  44. package/dist/selector.d.mts +56 -0
  45. package/dist/selector.mjs +48 -0
  46. package/dist/selector.mjs.map +1 -0
  47. package/dist/step-schema.cjs +244 -0
  48. package/dist/step-schema.cjs.map +1 -0
  49. package/dist/step-schema.d.cts +164 -0
  50. package/dist/step-schema.d.mts +164 -0
  51. package/dist/step-schema.mjs +237 -0
  52. package/dist/step-schema.mjs.map +1 -0
  53. package/dist/utils.cjs +34 -0
  54. package/dist/utils.cjs.map +1 -0
  55. package/dist/utils.mjs +33 -0
  56. package/dist/utils.mjs.map +1 -0
  57. package/package.json +15 -11
  58. package/dist/index.cjs.map +0 -1
  59. package/dist/index.mjs.map +0 -1
  60. package/dist/types/create-context.d.ts +0 -156
  61. package/dist/types/field.d.ts +0 -22
  62. package/dist/types/form-config.d.ts +0 -161
  63. package/dist/types/hooks/use-multi-step-form-data.d.ts +0 -26
  64. package/dist/types/index.d.ts +0 -4
  65. package/dist/types/schema.d.ts +0 -29
  66. package/dist/types/step-schema.d.ts +0 -134
  67. package/dist/types/utils.d.ts +0 -0
@@ -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
@@ -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"}