@secmia/openui-flow 4.2.5 → 4.2.7
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/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -286,6 +286,7 @@ type UseAdaptiveFlowOptions<TContext extends AdaptiveContextBase = AdaptiveConte
|
|
|
286
286
|
type UseAdaptiveFlowResult<TContext extends AdaptiveContextBase, TRequirement extends string, TStep extends string> = {
|
|
287
287
|
context: TContext;
|
|
288
288
|
step: TStep;
|
|
289
|
+
hasEvaluated: boolean;
|
|
289
290
|
completeStep: TStep;
|
|
290
291
|
requirements: readonly TRequirement[];
|
|
291
292
|
missingRequirements: TRequirement[];
|
package/dist/index.d.ts
CHANGED
|
@@ -286,6 +286,7 @@ type UseAdaptiveFlowOptions<TContext extends AdaptiveContextBase = AdaptiveConte
|
|
|
286
286
|
type UseAdaptiveFlowResult<TContext extends AdaptiveContextBase, TRequirement extends string, TStep extends string> = {
|
|
287
287
|
context: TContext;
|
|
288
288
|
step: TStep;
|
|
289
|
+
hasEvaluated: boolean;
|
|
289
290
|
completeStep: TStep;
|
|
290
291
|
requirements: readonly TRequirement[];
|
|
291
292
|
missingRequirements: TRequirement[];
|
package/dist/index.js
CHANGED
|
@@ -610,6 +610,7 @@ function useAdaptiveFlow({
|
|
|
610
610
|
return {
|
|
611
611
|
...state,
|
|
612
612
|
step: action.step,
|
|
613
|
+
hasEvaluated: true,
|
|
613
614
|
missingRequirements: action.missingRequirements,
|
|
614
615
|
transitions: [...state.transitions, action.transition].slice(-100)
|
|
615
616
|
};
|
|
@@ -634,6 +635,7 @@ function useAdaptiveFlow({
|
|
|
634
635
|
const [context, setContext] = React.useState(() => withDefaults(initialValue));
|
|
635
636
|
const [runtime, dispatch] = React.useReducer(runtimeReducer, {
|
|
636
637
|
step: normalizedCompleteStep,
|
|
638
|
+
hasEvaluated: false,
|
|
637
639
|
missingRequirements: [],
|
|
638
640
|
transitions: [],
|
|
639
641
|
busy: false,
|
|
@@ -645,6 +647,7 @@ function useAdaptiveFlow({
|
|
|
645
647
|
});
|
|
646
648
|
const {
|
|
647
649
|
step,
|
|
650
|
+
hasEvaluated,
|
|
648
651
|
missingRequirements,
|
|
649
652
|
transitions,
|
|
650
653
|
busy,
|
|
@@ -928,6 +931,7 @@ function useAdaptiveFlow({
|
|
|
928
931
|
return {
|
|
929
932
|
context,
|
|
930
933
|
step,
|
|
934
|
+
hasEvaluated,
|
|
931
935
|
completeStep: normalizedCompleteStep,
|
|
932
936
|
requirements: normalizedRequirements,
|
|
933
937
|
missingRequirements,
|
|
@@ -974,6 +978,7 @@ function AdaptiveFlow({
|
|
|
974
978
|
const {
|
|
975
979
|
context,
|
|
976
980
|
step,
|
|
981
|
+
hasEvaluated,
|
|
977
982
|
completeStep: normalizedCompleteStep,
|
|
978
983
|
requirements: normalizedRequirements,
|
|
979
984
|
missingRequirements: missing,
|
|
@@ -1011,9 +1016,11 @@ function AdaptiveFlow({
|
|
|
1011
1016
|
() => oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders,
|
|
1012
1017
|
[oauthProviders]
|
|
1013
1018
|
);
|
|
1019
|
+
const completedCount = hasEvaluated ? normalizedRequirements.length - missing.length : 0;
|
|
1014
1020
|
const needsJobTitle = normalizedRequirements.includes("has_job_title");
|
|
1015
|
-
const stepLabel = stepTitles?.[step] ?? defaultStepTitle[step] ?? step;
|
|
1021
|
+
const stepLabel = hasEvaluated ? stepTitles?.[step] ?? defaultStepTitle[step] ?? step : "Loading flow";
|
|
1016
1022
|
const defaultView = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
1023
|
+
!hasEvaluated ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: classNames?.info, style: uiStyles.info, children: "Evaluating required steps..." }) : null,
|
|
1017
1024
|
step === "COLLECT_EMAIL" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
1018
1025
|
EmailBlock,
|
|
1019
1026
|
{
|
|
@@ -1111,7 +1118,7 @@ function AdaptiveFlow({
|
|
|
1111
1118
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: classNames?.title, style: uiStyles.title, children: stepLabel })
|
|
1112
1119
|
] }),
|
|
1113
1120
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: classNames?.badge, style: uiStyles.badge, children: [
|
|
1114
|
-
|
|
1121
|
+
completedCount,
|
|
1115
1122
|
"/",
|
|
1116
1123
|
normalizedRequirements.length
|
|
1117
1124
|
] })
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["export {\r\n\tuseAdaptiveFlow,\r\n\tAdaptiveFlow,\r\n\ttype AdaptiveFlowAdapter,\r\n\ttype AdaptiveFlowClassNames,\r\n\ttype AdaptiveFlowFieldErrors,\r\n\ttype AdaptiveFlowOAuthProvider,\r\n\ttype AdaptiveFlowPersistence,\r\n\ttype AdaptiveFlowProps,\r\n\ttype AdaptiveFlowSchema,\r\n\ttype AdaptiveFlowSchemas,\r\n\ttype AdaptiveFlowRetryPolicy,\r\n\ttype AdaptiveFlowValidationIssue,\r\n\ttype AdaptiveFlowValidationResult,\r\n\ttype AdaptiveStepRegistry,\r\n\ttype AdaptiveStepRendererArgs,\r\n\ttype AdaptiveStepTransition,\r\n\ttype AdaptiveFlowStorageDriver,\r\n\ttype AdaptiveFlowStyleSlot,\r\n\ttype AdaptiveFlowStyles,\r\n\ttype AdaptiveFlowValidationContext,\r\n\ttype AdaptiveFlowValidators,\r\n\ttype AdaptiveStepRenderArgs,\r\n\ttype UseAdaptiveFlowOptions,\r\n\ttype UseAdaptiveFlowResult,\r\n\ttype IdentityResolution,\r\n\ttype OAuthProvider,\r\n\ttype PersistedAdaptiveFlowState,\r\n} from \"./AdaptiveFlow\";\r\nexport {\r\n\tdefaultRequirements,\r\n\tcreateDefaultRequirementGraph,\r\n\tcreateRequirementGraph,\r\n\tdefaultRequirementResolvers,\r\n\tevaluateNextStep,\r\n\tgetMissingRequirements,\r\n\tinitialContext,\r\n\ttype RequirementGraph,\r\n\ttype RequirementGraphNode,\r\n\ttype MaybePromise,\r\n\tDefaultAdaptiveSteps,\r\n\tDefaultAppRequirements,\r\n\ttype AdaptiveContext,\r\n\ttype AdaptiveContextBase,\r\n\ttype AdaptiveStep,\r\n\ttype AppRequirement,\r\n\ttype DefaultAdaptiveStep,\r\n\ttype DefaultAppRequirement,\r\n\ttype RequirementResolver,\r\n} from \"./engine\";","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = stepTitles?.[step] ?? defaultStepTitle[step] ?? step;\r\n\r\n const defaultView = (\r\n <>\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {normalizedRequirements.length - missing.length}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#ffffff\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#6b7280\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#374151\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#4b5563\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n },\r\n button: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#f9fafb\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["export {\r\n\tuseAdaptiveFlow,\r\n\tAdaptiveFlow,\r\n\ttype AdaptiveFlowAdapter,\r\n\ttype AdaptiveFlowClassNames,\r\n\ttype AdaptiveFlowFieldErrors,\r\n\ttype AdaptiveFlowOAuthProvider,\r\n\ttype AdaptiveFlowPersistence,\r\n\ttype AdaptiveFlowProps,\r\n\ttype AdaptiveFlowSchema,\r\n\ttype AdaptiveFlowSchemas,\r\n\ttype AdaptiveFlowRetryPolicy,\r\n\ttype AdaptiveFlowValidationIssue,\r\n\ttype AdaptiveFlowValidationResult,\r\n\ttype AdaptiveStepRegistry,\r\n\ttype AdaptiveStepRendererArgs,\r\n\ttype AdaptiveStepTransition,\r\n\ttype AdaptiveFlowStorageDriver,\r\n\ttype AdaptiveFlowStyleSlot,\r\n\ttype AdaptiveFlowStyles,\r\n\ttype AdaptiveFlowValidationContext,\r\n\ttype AdaptiveFlowValidators,\r\n\ttype AdaptiveStepRenderArgs,\r\n\ttype UseAdaptiveFlowOptions,\r\n\ttype UseAdaptiveFlowResult,\r\n\ttype IdentityResolution,\r\n\ttype OAuthProvider,\r\n\ttype PersistedAdaptiveFlowState,\r\n} from \"./AdaptiveFlow\";\r\nexport {\r\n\tdefaultRequirements,\r\n\tcreateDefaultRequirementGraph,\r\n\tcreateRequirementGraph,\r\n\tdefaultRequirementResolvers,\r\n\tevaluateNextStep,\r\n\tgetMissingRequirements,\r\n\tinitialContext,\r\n\ttype RequirementGraph,\r\n\ttype RequirementGraphNode,\r\n\ttype MaybePromise,\r\n\tDefaultAdaptiveSteps,\r\n\tDefaultAppRequirements,\r\n\ttype AdaptiveContext,\r\n\ttype AdaptiveContextBase,\r\n\ttype AdaptiveStep,\r\n\ttype AppRequirement,\r\n\ttype DefaultAdaptiveStep,\r\n\ttype DefaultAppRequirement,\r\n\ttype RequirementResolver,\r\n} from \"./engine\";","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n hasEvaluated: true,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n hasEvaluated: false,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n hasEvaluated,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const completedCount = hasEvaluated\r\n ? normalizedRequirements.length - missing.length\r\n : 0;\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = hasEvaluated\r\n ? (stepTitles?.[step] ?? defaultStepTitle[step] ?? step)\r\n : \"Loading flow\";\r\n\r\n const defaultView = (\r\n <>\r\n {!hasEvaluated ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n Evaluating required steps...\r\n </div>\r\n ) : null}\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {completedCount}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#ffffff\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#6b7280\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#374151\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#4b5563\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n },\r\n button: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#f9fafb\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -565,6 +565,7 @@ function useAdaptiveFlow({
|
|
|
565
565
|
return {
|
|
566
566
|
...state,
|
|
567
567
|
step: action.step,
|
|
568
|
+
hasEvaluated: true,
|
|
568
569
|
missingRequirements: action.missingRequirements,
|
|
569
570
|
transitions: [...state.transitions, action.transition].slice(-100)
|
|
570
571
|
};
|
|
@@ -589,6 +590,7 @@ function useAdaptiveFlow({
|
|
|
589
590
|
const [context, setContext] = React.useState(() => withDefaults(initialValue));
|
|
590
591
|
const [runtime, dispatch] = React.useReducer(runtimeReducer, {
|
|
591
592
|
step: normalizedCompleteStep,
|
|
593
|
+
hasEvaluated: false,
|
|
592
594
|
missingRequirements: [],
|
|
593
595
|
transitions: [],
|
|
594
596
|
busy: false,
|
|
@@ -600,6 +602,7 @@ function useAdaptiveFlow({
|
|
|
600
602
|
});
|
|
601
603
|
const {
|
|
602
604
|
step,
|
|
605
|
+
hasEvaluated,
|
|
603
606
|
missingRequirements,
|
|
604
607
|
transitions,
|
|
605
608
|
busy,
|
|
@@ -883,6 +886,7 @@ function useAdaptiveFlow({
|
|
|
883
886
|
return {
|
|
884
887
|
context,
|
|
885
888
|
step,
|
|
889
|
+
hasEvaluated,
|
|
886
890
|
completeStep: normalizedCompleteStep,
|
|
887
891
|
requirements: normalizedRequirements,
|
|
888
892
|
missingRequirements,
|
|
@@ -929,6 +933,7 @@ function AdaptiveFlow({
|
|
|
929
933
|
const {
|
|
930
934
|
context,
|
|
931
935
|
step,
|
|
936
|
+
hasEvaluated,
|
|
932
937
|
completeStep: normalizedCompleteStep,
|
|
933
938
|
requirements: normalizedRequirements,
|
|
934
939
|
missingRequirements: missing,
|
|
@@ -966,9 +971,11 @@ function AdaptiveFlow({
|
|
|
966
971
|
() => oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders,
|
|
967
972
|
[oauthProviders]
|
|
968
973
|
);
|
|
974
|
+
const completedCount = hasEvaluated ? normalizedRequirements.length - missing.length : 0;
|
|
969
975
|
const needsJobTitle = normalizedRequirements.includes("has_job_title");
|
|
970
|
-
const stepLabel = stepTitles?.[step] ?? defaultStepTitle[step] ?? step;
|
|
976
|
+
const stepLabel = hasEvaluated ? stepTitles?.[step] ?? defaultStepTitle[step] ?? step : "Loading flow";
|
|
971
977
|
const defaultView = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
978
|
+
!hasEvaluated ? /* @__PURE__ */ jsx("div", { className: classNames?.info, style: uiStyles.info, children: "Evaluating required steps..." }) : null,
|
|
972
979
|
step === "COLLECT_EMAIL" ? /* @__PURE__ */ jsx(
|
|
973
980
|
EmailBlock,
|
|
974
981
|
{
|
|
@@ -1066,7 +1073,7 @@ function AdaptiveFlow({
|
|
|
1066
1073
|
/* @__PURE__ */ jsx("h2", { className: classNames?.title, style: uiStyles.title, children: stepLabel })
|
|
1067
1074
|
] }),
|
|
1068
1075
|
/* @__PURE__ */ jsxs("div", { className: classNames?.badge, style: uiStyles.badge, children: [
|
|
1069
|
-
|
|
1076
|
+
completedCount,
|
|
1070
1077
|
"/",
|
|
1071
1078
|
normalizedRequirements.length
|
|
1072
1079
|
] })
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = stepTitles?.[step] ?? defaultStepTitle[step] ?? step;\r\n\r\n const defaultView = (\r\n <>\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {normalizedRequirements.length - missing.length}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#ffffff\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#6b7280\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#374151\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#4b5563\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n },\r\n button: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#f9fafb\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n completeStep: TStep;\r\n requirements: readonly TRequirement[];\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n handleEmail: (emailInput: string) => void;\r\n handleOtp: (code: string) => void;\r\n handlePassword: (password: string) => void;\r\n handleProfile: (profile: AdaptiveContextBase[\"profile\"]) => void;\r\n handleTos: () => void;\r\n handleOAuth: (provider: OAuthProvider) => void;\r\n};\r\n\r\ntype PlainObject = Record<string, unknown>;\r\n\r\n/** Default provider buttons rendered by the component footer when no provider list is supplied. */\r\nconst defaultOAuthProviders: readonly AdaptiveFlowOAuthProvider[] = [\r\n { id: \"google\", label: \"Continue with Google\" },\r\n { id: \"apple\", label: \"Continue with Apple\" },\r\n];\r\n\r\n/** Human-friendly labels used when a step title override is not supplied. */\r\nconst defaultStepTitle: Record<string, string> = {\r\n COLLECT_EMAIL: \"Enter your email\",\r\n VERIFY_OTP: \"Verify your email\",\r\n COLLECT_PASSWORD: \"Set up your password\",\r\n COLLECT_PROFILE: \"Complete your profile\",\r\n COLLECT_TOS: \"Accept terms\",\r\n COMPLETE: \"Done\",\r\n};\r\n\r\n/** Built-in step keys that have a default renderer in the component shell. */\r\nconst builtInDefaultSteps = new Set<string>([\r\n \"COLLECT_EMAIL\",\r\n \"VERIFY_OTP\",\r\n \"COLLECT_PASSWORD\",\r\n \"COLLECT_PROFILE\",\r\n \"COLLECT_TOS\",\r\n \"COMPLETE\",\r\n]);\r\n\r\nconst styleSlots: AdaptiveFlowStyleSlot[] = [\r\n \"shell\",\r\n \"headerRow\",\r\n \"eyebrow\",\r\n \"title\",\r\n \"badge\",\r\n \"success\",\r\n \"error\",\r\n \"info\",\r\n \"caption\",\r\n \"formRow\",\r\n \"formColumn\",\r\n \"input\",\r\n \"button\",\r\n \"checkboxRow\",\r\n \"complete\",\r\n \"footer\",\r\n \"oauthButton\",\r\n];\r\n\r\n/**\r\n * Deeply merge a patch into the current context.\r\n *\r\n * Plain nested objects are merged recursively, while arrays and non-plain values are replaced.\r\n */\r\nfunction mergeContext<TContext extends AdaptiveContextBase>(\r\n current: TContext,\r\n patch: Partial<TContext>,\r\n): TContext {\r\n const mergeValue = (baseValue: unknown, patchValue: unknown): unknown => {\r\n if (Array.isArray(baseValue) || Array.isArray(patchValue)) {\r\n return patchValue;\r\n }\r\n\r\n const baseIsObject = Boolean(baseValue) && typeof baseValue === \"object\";\r\n const patchIsObject = Boolean(patchValue) && typeof patchValue === \"object\";\r\n\r\n if (!baseIsObject || !patchIsObject) {\r\n return patchValue === undefined ? baseValue : patchValue;\r\n }\r\n\r\n const baseObject = baseValue as PlainObject;\r\n const patchObject = patchValue as PlainObject;\r\n const result: PlainObject = { ...baseObject };\r\n\r\n for (const key of Object.keys(patchObject)) {\r\n result[key] = mergeValue(baseObject[key], patchObject[key]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return mergeValue(current, patch) as TContext;\r\n}\r\n\r\n/** Merge the supplied initial value into the library's default context shape. */\r\nfunction withDefaults<TContext extends AdaptiveContextBase>(initialValue?: Partial<TContext>): TContext {\r\n if (!initialValue) {\r\n return initialContext as TContext;\r\n }\r\n\r\n return mergeContext(initialContext as TContext, initialValue);\r\n}\r\n\r\n/** Normalize any thrown value into an Error instance while preserving message and code when available. */\r\nfunction toError(error: unknown): Error {\r\n if (error instanceof Error) {\r\n return error;\r\n }\r\n\r\n if (typeof error === \"string\") {\r\n return new Error(error);\r\n }\r\n\r\n if (error && typeof error === \"object\") {\r\n const maybeError = error as { message?: unknown; code?: unknown };\r\n const message = typeof maybeError.message === \"string\" && maybeError.message.trim().length > 0\r\n ? maybeError.message\r\n : \"Unknown error while processing adaptive flow\";\r\n const normalized = new Error(message);\r\n if (typeof maybeError.code === \"string\" && maybeError.code.trim().length > 0) {\r\n normalized.name = maybeError.code;\r\n }\r\n (normalized as Error & { cause?: unknown }).cause = error;\r\n return normalized;\r\n }\r\n\r\n return new Error(`Unknown error while processing adaptive flow: ${String(error)}`);\r\n}\r\n\r\n/** Pause execution for the requested number of milliseconds. */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/** Clamp and normalize a retry delay into a safe non-negative millisecond value. */\r\nfunction normalizeDelay(delay: number | undefined, fallback: number): number {\r\n if (typeof delay !== \"number\" || Number.isNaN(delay) || delay < 0) {\r\n return fallback;\r\n }\r\n return delay;\r\n}\r\n\r\n/** Compute the delay for the current retry attempt using exponential backoff and optional jitter. */\r\n/** Compute the delay for a retry attempt using exponential backoff and optional jitter. */\r\nfunction computeRetryDelay(policy: AdaptiveFlowRetryPolicy | undefined, attempt: number): number {\r\n if (policy?.delay) {\r\n return normalizeDelay(policy.delay(attempt), 0);\r\n }\r\n\r\n const initialDelayMs = normalizeDelay(policy?.initialDelayMs, 250);\r\n const factor = typeof policy?.factor === \"number\" && policy.factor > 0 ? policy.factor : 2;\r\n const maxDelayMs = normalizeDelay(policy?.maxDelayMs, Number.POSITIVE_INFINITY);\r\n let delay = initialDelayMs * Math.pow(factor, Math.max(0, attempt - 1));\r\n\r\n if (policy?.jitter) {\r\n delay = delay * (0.5 + Math.random() * 0.5);\r\n }\r\n\r\n return Math.min(delay, maxDelayMs);\r\n}\r\n\r\n/** Execute an async operation with configurable retry/backoff behavior. */\r\nasync function withRetry<T>(\r\n operation: () => Promise<T>,\r\n retryPolicy: AdaptiveFlowRetryPolicy | undefined,\r\n): Promise<T> {\r\n if (!retryPolicy) {\r\n return operation();\r\n }\r\n\r\n const maxAttempts = Math.max(1, Math.trunc(retryPolicy.maxAttempts ?? 3));\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n lastError = error;\r\n const normalized = toError(error);\r\n const shouldRetry = retryPolicy.shouldRetry?.(normalized, attempt) ?? attempt < maxAttempts;\r\n if (!shouldRetry || attempt === maxAttempts) {\r\n throw normalized;\r\n }\r\n\r\n await sleep(computeRetryDelay(retryPolicy, attempt));\r\n }\r\n }\r\n\r\n throw toError(lastError);\r\n}\r\n\r\n/** Join class names while dropping falsy entries. */\r\nfunction cx(...names: Array<string | undefined | false | null>): string | undefined {\r\n const value = names.filter(Boolean).join(\" \").trim();\r\n return value.length > 0 ? value : undefined;\r\n}\r\n\r\n/** Resolve the configured storage driver or return null when running outside the browser. */\r\nfunction pickStorage(storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver): AdaptiveFlowStorageDriver | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n\r\n if (!storage || storage === \"session\") {\r\n return window.sessionStorage;\r\n }\r\n\r\n if (storage === \"local\") {\r\n return window.localStorage;\r\n }\r\n\r\n return storage;\r\n}\r\n\r\n/** Read and deserialize persisted flow state from storage. */\r\nfunction readPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): PersistedAdaptiveFlowState<TContext> | null {\r\n if (!persistence) {\r\n return null;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return null;\r\n }\r\n\r\n const raw = storage.getItem(persistence.key);\r\n if (!raw) {\r\n return null;\r\n }\r\n\r\n const deserialize = persistence.deserialize ?? ((value: string) => JSON.parse(value));\r\n return deserialize(raw);\r\n}\r\n\r\n/** Serialize and persist the current flow state to storage. */\r\nfunction writePersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n state: PersistedAdaptiveFlowState<TContext>,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n const serialize = persistence.serialize ?? ((value: PersistedAdaptiveFlowState<TContext>) => JSON.stringify(value));\r\n storage.setItem(persistence.key, serialize(state));\r\n}\r\n\r\n/** Remove persisted flow state from storage. */\r\nfunction clearPersistedState<TContext extends AdaptiveContextBase>(\r\n persistence: AdaptiveFlowPersistence<TContext> | undefined,\r\n): void {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n const storage = pickStorage(persistence.storage);\r\n if (!storage) {\r\n return;\r\n }\r\n\r\n storage.removeItem(persistence.key);\r\n}\r\n\r\n/** Internal error type used to carry field-level validation failures. */\r\nclass FlowValidationError extends Error {\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n\r\n constructor(message: string, fieldErrors: AdaptiveFlowFieldErrors) {\r\n super(message);\r\n this.name = \"FlowValidationError\";\r\n this.fieldErrors = fieldErrors;\r\n }\r\n}\r\n\r\n/** Convert a validation issue into the internal validation error shape. */\r\nfunction toValidationError(\r\n issue: AdaptiveFlowValidationIssue,\r\n fallbackField?: string,\r\n): FlowValidationError {\r\n const field = issue.field ?? fallbackField;\r\n if (field) {\r\n return new FlowValidationError(issue.message, { [field]: issue.message });\r\n }\r\n return new FlowValidationError(issue.message, {});\r\n}\r\n\r\n/** Map schema validation issues into field error messages keyed by path. */\r\nfunction normalizeSchemaIssues(\r\n error: { message?: string; issues?: Array<{ message?: string; path?: Array<string | number> }> } | undefined,\r\n fallbackField?: string,\r\n): AdaptiveFlowFieldErrors {\r\n const fieldErrors: AdaptiveFlowFieldErrors = {};\r\n const issues = error?.issues ?? [];\r\n\r\n for (const issue of issues) {\r\n const path = issue.path?.length ? issue.path.map(String).join(\".\") : fallbackField;\r\n const message = issue.message?.trim() || error?.message || \"Validation failed.\";\r\n if (path && !fieldErrors[path]) {\r\n fieldErrors[path] = message;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldErrors).length === 0 && fallbackField) {\r\n fieldErrors[fallbackField] = error?.message || \"Validation failed.\";\r\n }\r\n\r\n return fieldErrors;\r\n}\r\n\r\n/** Execute a validator result and raise a field-aware validation error when needed. */\r\nasync function assertValid(result: AdaptiveFlowValidationResult, fallbackField?: string): Promise<void> {\r\n const outcome = await result;\r\n if (!outcome) {\r\n return;\r\n }\r\n\r\n if (typeof outcome === \"string\") {\r\n const message = outcome.trim();\r\n if (message.length > 0) {\r\n throw new FlowValidationError(message, fallbackField ? { [fallbackField]: message } : {});\r\n }\r\n return;\r\n }\r\n\r\n if (outcome.message.trim().length > 0) {\r\n throw toValidationError(outcome, fallbackField);\r\n }\r\n}\r\n\r\n/** Execute an optional schema validator before running the custom validator chain. */\r\nasync function assertSchema<TValue>(\r\n schema: AdaptiveFlowSchema<TValue> | undefined,\r\n value: TValue,\r\n fallbackField?: string,\r\n): Promise<void> {\r\n if (!schema) {\r\n return;\r\n }\r\n\r\n if (schema.safeParse) {\r\n const result = schema.safeParse(value);\r\n if (!result.success) {\r\n const fieldErrors = normalizeSchemaIssues(result.error, fallbackField);\r\n throw new FlowValidationError(result.error?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n return;\r\n }\r\n\r\n if (!schema.parse) {\r\n return;\r\n }\r\n\r\n try {\r\n schema.parse(value);\r\n } catch (error) {\r\n const normalized = error as {\r\n message?: string;\r\n issues?: Array<{ message?: string; path?: Array<string | number> }>;\r\n };\r\n const fieldErrors = normalizeSchemaIssues(\r\n {\r\n message: normalized?.message,\r\n issues: normalized?.issues,\r\n },\r\n fallbackField,\r\n );\r\n throw new FlowValidationError(normalized?.message || \"Validation failed.\", fieldErrors);\r\n }\r\n}\r\n\r\n/** Merge built-in style defaults with user overrides or return raw overrides in unstyled mode. */\r\nfunction resolveStyles(\r\n unstyled: boolean,\r\n styleOverrides?: AdaptiveFlowStyles,\r\n): Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined> {\r\n const resolved = {} as Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n\r\n for (const slot of styleSlots) {\r\n if (unstyled) {\r\n resolved[slot] = styleOverrides?.[slot];\r\n continue;\r\n }\r\n\r\n resolved[slot] = {\r\n ...defaultStyles[slot],\r\n ...(styleOverrides?.[slot] ?? {}),\r\n };\r\n }\r\n\r\n return resolved;\r\n}\r\n\r\n/** Headless flow hook that owns state, evaluation, persistence, retries, and adapter wiring. */\r\nexport function useAdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: UseAdaptiveFlowOptions<TContext, TRequirement, TStep>): UseAdaptiveFlowResult<\r\n TContext,\r\n TRequirement,\r\n TStep\r\n> {\r\n const normalizedRequirements = React.useMemo(\r\n () => (requirements ?? (defaultRequirements as unknown as readonly TRequirement[])),\r\n [requirements],\r\n );\r\n const normalizedCompleteStep = React.useMemo(\r\n () => (completeStep ?? (\"COMPLETE\" as TStep)),\r\n [completeStep],\r\n );\r\n const resolvers = React.useMemo(\r\n () =>\r\n ({\r\n ...(defaultRequirementResolvers as unknown as Partial<\r\n Record<TRequirement, RequirementResolver<TContext, TStep>>\r\n >),\r\n ...(requirementResolvers ?? {}),\r\n }) as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n [requirementResolvers],\r\n );\r\n const graph = React.useMemo(\r\n () =>\r\n requirementGraph ??\r\n createDefaultRequirementGraph({\r\n requirements: normalizedRequirements,\r\n resolvers,\r\n priorities: requirementGraphConfig?.priorities,\r\n conditions: requirementGraphConfig?.conditions,\r\n dependencies: requirementGraphConfig?.dependencies,\r\n }),\r\n [\r\n requirementGraph,\r\n normalizedRequirements,\r\n resolvers,\r\n requirementGraphConfig?.priorities,\r\n requirementGraphConfig?.conditions,\r\n requirementGraphConfig?.dependencies,\r\n ],\r\n );\r\n\r\n type RuntimeState = {\r\n step: TStep;\r\n hasEvaluated: boolean;\r\n missingRequirements: TRequirement[];\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n oauthPendingProvider: OAuthProvider | null;\r\n persistenceHydrated: boolean;\r\n };\r\n\r\n type RuntimeAction =\r\n | {\r\n type: \"evaluated\";\r\n missingRequirements: TRequirement[];\r\n step: TStep;\r\n transition: AdaptiveStepTransition<TStep>;\r\n }\r\n | { type: \"set_busy\"; busy: boolean }\r\n | { type: \"set_message\"; message: string | null }\r\n | { type: \"set_error\"; errorMessage: string | null }\r\n | { type: \"set_field_errors\"; fieldErrors: AdaptiveFlowFieldErrors }\r\n | { type: \"start_job\" }\r\n | { type: \"set_oauth_pending\"; provider: OAuthProvider | null }\r\n | { type: \"set_hydrated\"; hydrated: boolean };\r\n\r\n const runtimeReducer = (state: RuntimeState, action: RuntimeAction): RuntimeState => {\r\n switch (action.type) {\r\n case \"evaluated\":\r\n return {\r\n ...state,\r\n step: action.step,\r\n hasEvaluated: true,\r\n missingRequirements: action.missingRequirements,\r\n transitions: [...state.transitions, action.transition].slice(-100),\r\n };\r\n case \"set_busy\":\r\n return { ...state, busy: action.busy };\r\n case \"set_message\":\r\n return { ...state, message: action.message };\r\n case \"set_error\":\r\n return { ...state, errorMessage: action.errorMessage };\r\n case \"set_field_errors\":\r\n return { ...state, fieldErrors: action.fieldErrors };\r\n case \"start_job\":\r\n return { ...state, busy: true, errorMessage: null, fieldErrors: {} };\r\n case \"set_oauth_pending\":\r\n return { ...state, oauthPendingProvider: action.provider };\r\n case \"set_hydrated\":\r\n return { ...state, persistenceHydrated: action.hydrated };\r\n default:\r\n return state;\r\n }\r\n };\r\n\r\n const [context, setContext] = React.useState<TContext>(() => withDefaults(initialValue));\r\n const [runtime, dispatch] = React.useReducer(runtimeReducer, {\r\n step: normalizedCompleteStep,\r\n hasEvaluated: false,\r\n missingRequirements: [],\r\n transitions: [],\r\n busy: false,\r\n message: null,\r\n errorMessage: null,\r\n fieldErrors: {},\r\n oauthPendingProvider: null,\r\n persistenceHydrated: !persistence,\r\n } satisfies RuntimeState);\r\n\r\n const {\r\n step,\r\n hasEvaluated,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n oauthPendingProvider,\r\n persistenceHydrated,\r\n } = runtime;\r\n const attemptByStepRef = React.useRef<Record<string, number>>({});\r\n const previousStepRef = React.useRef<TStep | null>(null);\r\n const evaluationRef = React.useRef(0);\r\n const completed = React.useRef(false);\r\n\r\n const reportPersistenceError = React.useCallback(\r\n (error: unknown, phase: \"read\" | \"write\" | \"clear\") => {\r\n const normalized = toError(error);\r\n persistence?.onError?.(normalized, phase);\r\n onError?.(normalized);\r\n },\r\n [onError, persistence],\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!persistence) {\r\n return;\r\n }\r\n\r\n try {\r\n const persisted = readPersistedState(persistence);\r\n if (persisted?.context) {\r\n setContext(mergeContext(withDefaults(initialValue), persisted.context));\r\n }\r\n if (persisted?.oauthPendingProvider) {\r\n dispatch({ type: \"set_oauth_pending\", provider: persisted.oauthPendingProvider });\r\n }\r\n } catch (error) {\r\n reportPersistenceError(error, \"read\");\r\n } finally {\r\n dispatch({ type: \"set_hydrated\", hydrated: true });\r\n }\r\n }, [initialValue, persistence, reportPersistenceError]);\r\n\r\n React.useEffect(() => {\r\n const currentEvaluation = ++evaluationRef.current;\r\n\r\n void (async () => {\r\n const [missing, next] = await Promise.all([\r\n getMissingRequirements(context, graph as RequirementGraph<TContext, TRequirement, TStep>),\r\n evaluateNextStep(context, graph as RequirementGraph<TContext, TRequirement, TStep>, normalizedCompleteStep),\r\n ]);\r\n\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const from = previousStepRef.current;\r\n const attemptKey = String(next);\r\n const nextAttempt = from === next ? (attemptByStepRef.current[attemptKey] ?? 0) + 1 : 1;\r\n attemptByStepRef.current[attemptKey] = nextAttempt;\r\n\r\n const transition: AdaptiveStepTransition<TStep> = {\r\n from,\r\n to: next,\r\n at: Date.now(),\r\n attempt: nextAttempt,\r\n };\r\n\r\n dispatch({\r\n type: \"evaluated\",\r\n missingRequirements: missing,\r\n step: next,\r\n transition,\r\n });\r\n previousStepRef.current = next;\r\n onStepTransition?.(transition, context);\r\n })().catch((error) => {\r\n if (currentEvaluation !== evaluationRef.current) {\r\n return;\r\n }\r\n\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_field_errors\", fieldErrors: {} });\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n });\r\n }, [context, graph, normalizedCompleteStep, onError, onStepTransition]);\r\n\r\n React.useEffect(() => {\r\n if (step === normalizedCompleteStep) {\r\n if (!completed.current) {\r\n completed.current = true;\r\n onComplete?.(context);\r\n\r\n const shouldClearPersistence = persistence?.clearOnComplete ?? true;\r\n if (shouldClearPersistence) {\r\n try {\r\n clearPersistedState(persistence);\r\n } catch (error) {\r\n reportPersistenceError(error, \"clear\");\r\n }\r\n }\r\n }\r\n } else {\r\n completed.current = false;\r\n }\r\n }, [context, normalizedCompleteStep, onComplete, persistence, reportPersistenceError, step]);\r\n\r\n React.useEffect(() => {\r\n if (!persistence || !persistenceHydrated) {\r\n return;\r\n }\r\n\r\n try {\r\n writePersistedState(persistence, { context, oauthPendingProvider });\r\n } catch (error) {\r\n reportPersistenceError(error, \"write\");\r\n }\r\n }, [context, oauthPendingProvider, persistence, persistenceHydrated, reportPersistenceError]);\r\n\r\n const run = React.useCallback(\r\n async (job: () => Promise<void>) => {\r\n dispatch({ type: \"start_job\" });\r\n try {\r\n await job();\r\n } catch (error) {\r\n if (error instanceof FlowValidationError) {\r\n dispatch({ type: \"set_field_errors\", fieldErrors: error.fieldErrors });\r\n if (Object.keys(error.fieldErrors).length === 0) {\r\n dispatch({ type: \"set_error\", errorMessage: error.message });\r\n onError?.(error);\r\n }\r\n } else {\r\n const normalized = toError(error);\r\n dispatch({ type: \"set_error\", errorMessage: normalized.message });\r\n onError?.(normalized);\r\n }\r\n } finally {\r\n dispatch({ type: \"set_busy\", busy: false });\r\n }\r\n },\r\n [onError],\r\n );\r\n\r\n const patchContext = React.useCallback((patch: Partial<TContext>) => {\r\n setContext((prev) => mergeContext(prev, patch));\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n const completeOAuth = adapter?.completeOAuth;\r\n if (!oauthPendingProvider || !completeOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n const patch = await withRetry(\r\n () => completeOAuth(oauthPendingProvider, context),\r\n retryPolicy,\r\n );\r\n if (patch) {\r\n patchContext(patch);\r\n }\r\n dispatch({ type: \"set_oauth_pending\", provider: null });\r\n dispatch({ type: \"set_message\", message: \"OAuth sign-in completed.\" });\r\n });\r\n }, [adapter, context, oauthPendingProvider, patchContext, retryPolicy, run]);\r\n\r\n const handleEmail = (emailInput: string) => {\r\n const email = emailInput.trim().toLowerCase();\r\n if (!email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.email, email, \"email\");\r\n if (validators?.email) {\r\n await assertValid(validators.email(email, { context }), \"email\");\r\n }\r\n\r\n const identity = adapter?.lookupByEmail\r\n ? await withRetry(() => adapter.lookupByEmail!(email), retryPolicy)\r\n : null;\r\n\r\n patchContext({\r\n email,\r\n hasPassword: Boolean(identity?.hasPassword),\r\n isVerified: Boolean(identity?.isVerified),\r\n agreedToTos: Boolean(identity?.agreedToTos),\r\n profile: {\r\n firstName: identity?.profile?.firstName ?? null,\r\n lastName: identity?.profile?.lastName ?? null,\r\n jobTitle: identity?.profile?.jobTitle ?? null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (identity?.accountExists && identity.hasPassword) {\r\n dispatch({ type: \"set_message\", message: \"Welcome back. Enter your password to continue.\" });\r\n return;\r\n }\r\n\r\n if (adapter?.requestOtp) {\r\n await withRetry(() => adapter.requestOtp!(email), retryPolicy);\r\n dispatch({ type: \"set_message\", message: \"We sent a 6-digit code to your inbox.\" });\r\n } else {\r\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV;\r\n const isDev = env !== \"production\";\r\n if (!isDev) {\r\n throw new Error(\"OTP adapter is required in production. Provide adapter.requestOtp.\");\r\n }\r\n\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({\r\n type: \"set_message\",\r\n message: \"No OTP adapter configured. Verification was skipped in development mode.\",\r\n });\r\n }\r\n });\r\n };\r\n\r\n const handleOtp = (code: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.otp, code, \"otp\");\r\n if (validators?.otp) {\r\n await assertValid(validators.otp(code, { context, email: context.email as string }), \"otp\");\r\n }\r\n\r\n if (adapter?.verifyOtp) {\r\n await withRetry(() => adapter.verifyOtp!(context.email as string, code), retryPolicy);\r\n }\r\n patchContext({ isVerified: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Email verified.\" });\r\n });\r\n };\r\n\r\n const handlePassword = (password: string) => {\r\n if (!context.email) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n await assertSchema(schemas?.password, password, \"password\");\r\n if (validators?.password) {\r\n await assertValid(\r\n validators.password(password, { context, hasPassword: context.hasPassword }),\r\n \"password\",\r\n );\r\n }\r\n\r\n if (context.hasPassword) {\r\n if (adapter?.signInWithPassword) {\r\n await withRetry(\r\n () => adapter.signInWithPassword!(context.email as string, password),\r\n retryPolicy,\r\n );\r\n }\r\n } else {\r\n if (adapter?.createPassword) {\r\n await withRetry(() => adapter.createPassword!(password), retryPolicy);\r\n }\r\n patchContext({ hasPassword: true } as Partial<TContext>);\r\n }\r\n dispatch({ type: \"set_message\", message: \"Password step complete.\" });\r\n });\r\n };\r\n\r\n const handleProfile = (profile: AdaptiveContextBase[\"profile\"]) => {\r\n void run(async () => {\r\n await assertSchema(schemas?.profile, profile, \"profile\");\r\n if (validators?.profile) {\r\n await assertValid(validators.profile(profile, { context }), \"profile\");\r\n }\r\n\r\n const next = mergeContext(context, {\r\n profile: {\r\n firstName: profile.firstName || null,\r\n lastName: profile.lastName || null,\r\n jobTitle: profile.jobTitle || null,\r\n },\r\n } as Partial<TContext>);\r\n\r\n if (adapter?.saveProfile) {\r\n await withRetry(() => adapter.saveProfile!(next), retryPolicy);\r\n }\r\n\r\n patchContext({ profile: next.profile } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Profile saved.\" });\r\n });\r\n };\r\n\r\n const handleTos = () => {\r\n void run(async () => {\r\n await assertSchema(schemas?.tos, true, \"tos\");\r\n if (validators?.tos) {\r\n await assertValid(validators.tos(true, { context }), \"tos\");\r\n }\r\n\r\n const next = mergeContext(context, { agreedToTos: true } as Partial<TContext>);\r\n if (adapter?.acceptTos) {\r\n await withRetry(() => adapter.acceptTos!(next), retryPolicy);\r\n }\r\n patchContext({ agreedToTos: true } as Partial<TContext>);\r\n dispatch({ type: \"set_message\", message: \"Terms accepted.\" });\r\n });\r\n };\r\n\r\n const handleOAuth = (provider: OAuthProvider) => {\r\n const startOAuth = adapter?.startOAuth;\r\n if (!startOAuth) {\r\n return;\r\n }\r\n\r\n void run(async () => {\r\n dispatch({ type: \"set_oauth_pending\", provider });\r\n dispatch({ type: \"set_message\", message: `Starting ${provider} sign-in...` });\r\n await withRetry(() => startOAuth(provider, context), retryPolicy);\r\n });\r\n };\r\n\r\n return {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n };\r\n}\r\n\r\n/** Default UI wrapper around useAdaptiveFlow that renders the built-in flow shell and step UI. */\r\nexport function AdaptiveFlow<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n stepTitles,\r\n renderStep,\r\n stepRegistry,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n className,\r\n classNames,\r\n styles,\r\n unstyled = false,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n}: AdaptiveFlowProps<TContext, TRequirement, TStep>) {\r\n const uiStyles = React.useMemo(() => resolveStyles(unstyled, styles), [unstyled, styles]);\r\n\r\n const {\r\n context,\r\n step,\r\n hasEvaluated,\r\n completeStep: normalizedCompleteStep,\r\n requirements: normalizedRequirements,\r\n missingRequirements: missing,\r\n transitions,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n setContextPatch: patchContext,\r\n run,\r\n handleEmail,\r\n handleOtp,\r\n handlePassword,\r\n handleProfile,\r\n handleTos,\r\n handleOAuth,\r\n } = useAdaptiveFlow<TContext, TRequirement, TStep>({\r\n adapter,\r\n requirements,\r\n requirementGraph,\r\n requirementGraphConfig,\r\n requirementResolvers,\r\n completeStep,\r\n initialValue,\r\n onComplete,\r\n onError,\r\n onStepTransition,\r\n persistence,\r\n validators,\r\n schemas,\r\n oauthProviders,\r\n retryPolicy,\r\n });\r\n\r\n const normalizedOAuthProviders = React.useMemo(\r\n () => (oauthProviders && oauthProviders.length > 0 ? oauthProviders : defaultOAuthProviders),\r\n [oauthProviders],\r\n );\r\n\r\n const completedCount = hasEvaluated\r\n ? normalizedRequirements.length - missing.length\r\n : 0;\r\n const needsJobTitle = normalizedRequirements.includes(\"has_job_title\" as TRequirement);\r\n const stepLabel = hasEvaluated\r\n ? (stepTitles?.[step] ?? defaultStepTitle[step] ?? step)\r\n : \"Loading flow\";\r\n\r\n const defaultView = (\r\n <>\r\n {!hasEvaluated ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n Evaluating required steps...\r\n </div>\r\n ) : null}\r\n {step === \"COLLECT_EMAIL\" ? (\r\n <EmailBlock\r\n onSubmit={handleEmail}\r\n disabled={busy}\r\n error={fieldErrors.email}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"VERIFY_OTP\" ? (\r\n <OtpBlock\r\n onSubmit={handleOtp}\r\n email={context.email ?? \"your email\"}\r\n disabled={busy}\r\n error={fieldErrors.otp}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PASSWORD\" ? (\r\n <PasswordBlock\r\n onSubmit={handlePassword}\r\n disabled={busy}\r\n hasPassword={context.hasPassword}\r\n error={fieldErrors.password}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_PROFILE\" ? (\r\n <ProfileBlock\r\n defaultValue={context.profile}\r\n requireJobTitle={needsJobTitle}\r\n onSubmit={handleProfile}\r\n disabled={busy}\r\n errors={fieldErrors}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === \"COLLECT_TOS\" ? (\r\n <TosBlock\r\n onSubmit={handleTos}\r\n disabled={busy}\r\n error={fieldErrors.tos}\r\n styles={uiStyles}\r\n classNames={classNames}\r\n />\r\n ) : null}\r\n {step === normalizedCompleteStep ? (\r\n <CompleteBlock styles={uiStyles} classNames={classNames} />\r\n ) : null}\r\n {!builtInDefaultSteps.has(String(step)) && step !== normalizedCompleteStep ? (\r\n <div className={classNames?.info} style={uiStyles.info}>\r\n No default renderer for step \"{step}\". Provide renderStep to handle custom steps.\r\n </div>\r\n ) : null}\r\n </>\r\n );\r\n\r\n const customView = renderStep\r\n ? renderStep({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n defaultView,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n const registryView = stepRegistry?.[step]\r\n ? stepRegistry[step]?.({\r\n step,\r\n context,\r\n busy,\r\n message,\r\n errorMessage,\r\n fieldErrors,\r\n missingRequirements: missing,\r\n requirements: normalizedRequirements,\r\n setContextPatch: patchContext,\r\n run,\r\n adapter,\r\n transitions,\r\n })\r\n : null;\r\n\r\n return (\r\n <div className={cx(className, classNames?.shell)} style={uiStyles.shell}>\r\n <div className={classNames?.headerRow} style={uiStyles.headerRow}>\r\n <div>\r\n <div className={classNames?.eyebrow} style={uiStyles.eyebrow}>\r\n Adaptive flow\r\n </div>\r\n <h2 className={classNames?.title} style={uiStyles.title}>\r\n {stepLabel}\r\n </h2>\r\n </div>\r\n <div className={classNames?.badge} style={uiStyles.badge}>\r\n {completedCount}/{normalizedRequirements.length}\r\n </div>\r\n </div>\r\n\r\n {message ? (\r\n <div className={classNames?.success} style={uiStyles.success}>\r\n {message}\r\n </div>\r\n ) : null}\r\n {errorMessage ? (\r\n <div className={classNames?.error} style={uiStyles.error}>\r\n {errorMessage}\r\n </div>\r\n ) : null}\r\n\r\n {customView ?? registryView ?? defaultView}\r\n\r\n <div className={classNames?.footer} style={uiStyles.footer}>\r\n {normalizedOAuthProviders.map((provider) => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={classNames?.oauthButton}\r\n style={uiStyles.oauthButton}\r\n disabled={busy || !adapter?.startOAuth}\r\n onClick={() => {\r\n handleOAuth(provider.id);\r\n }}\r\n >\r\n {provider.label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ntype BlockBaseProps = {\r\n disabled?: boolean;\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n};\r\n\r\n/** Default email collection form used by the built-in component. */\r\nfunction EmailBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (email: string) => void; error?: string }) {\r\n const [email, setEmail] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-email-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(email);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"email\"\r\n autoComplete=\"email\"\r\n placeholder=\"Enter your email\"\r\n value={email}\r\n onChange={(event) => setEmail(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default OTP form used by the built-in component. */\r\nfunction OtpBlock({\r\n onSubmit,\r\n disabled,\r\n email,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (code: string) => void; email: string; error?: string }) {\r\n const [code, setCode] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-otp-error\";\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(code);\r\n }}\r\n >\r\n <p className={classNames?.caption} style={styles.caption}>\r\n Use the verification code sent to {email}.\r\n </p>\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n inputMode=\"numeric\"\r\n placeholder=\"Enter 6-digit code\"\r\n value={code}\r\n onChange={(event) => setCode(event.target.value.replace(/\\D/g, \"\").slice(0, 6))}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n maxLength={6}\r\n pattern=\"[0-9]{6}\"\r\n />\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || code.length !== 6}\r\n type=\"submit\"\r\n >\r\n Verify\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </div>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default password form used by the built-in component. */\r\nfunction PasswordBlock({\r\n onSubmit,\r\n disabled,\r\n hasPassword,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: (password: string) => void; hasPassword: boolean; error?: string }) {\r\n const [password, setPassword] = React.useState(\"\");\r\n const errorId = \"adaptive-flow-password-error\";\r\n return (\r\n <form\r\n className={classNames?.formRow}\r\n style={styles.formRow}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit(password);\r\n }}\r\n >\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"password\"\r\n autoComplete={hasPassword ? \"current-password\" : \"new-password\"}\r\n placeholder={hasPassword ? \"Enter your password\" : \"Create a password\"}\r\n value={password}\r\n onChange={(event) => setPassword(event.target.value)}\r\n aria-invalid={Boolean(error)}\r\n aria-describedby={error ? errorId : undefined}\r\n required\r\n minLength={8}\r\n />\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n {error ? (\r\n <div id={errorId} className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n </form>\r\n );\r\n}\r\n\r\n/** Default profile form used by the built-in component. */\r\nfunction ProfileBlock({\r\n onSubmit,\r\n disabled,\r\n defaultValue,\r\n requireJobTitle,\r\n errors,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & {\r\n onSubmit: (profile: AdaptiveContext[\"profile\"]) => void;\r\n defaultValue: AdaptiveContext[\"profile\"];\r\n requireJobTitle: boolean;\r\n errors?: AdaptiveFlowFieldErrors;\r\n}) {\r\n const [firstName, setFirstName] = React.useState(defaultValue.firstName ?? \"\");\r\n const [lastName, setLastName] = React.useState(defaultValue.lastName ?? \"\");\r\n const [jobTitle, setJobTitle] = React.useState(defaultValue.jobTitle ?? \"\");\r\n const firstNameError = errors?.firstName ?? errors?.[\"profile.firstName\"];\r\n const lastNameError = errors?.lastName ?? errors?.[\"profile.lastName\"];\r\n const jobTitleError = errors?.jobTitle ?? errors?.[\"profile.jobTitle\"];\r\n const profileError = errors?.profile;\r\n\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n onSubmit({\r\n firstName: firstName || null,\r\n lastName: lastName || null,\r\n jobTitle: jobTitle || null,\r\n });\r\n }}\r\n >\r\n <div className={classNames?.formRow} style={styles.formRow}>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"given-name\"\r\n placeholder=\"First name\"\r\n value={firstName}\r\n onChange={(event) => setFirstName(event.target.value)}\r\n aria-invalid={Boolean(firstNameError)}\r\n required\r\n />\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"family-name\"\r\n placeholder=\"Last name\"\r\n value={lastName}\r\n onChange={(event) => setLastName(event.target.value)}\r\n aria-invalid={Boolean(lastNameError)}\r\n required\r\n />\r\n </div>\r\n {firstNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {firstNameError}\r\n </div>\r\n ) : null}\r\n {lastNameError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {lastNameError}\r\n </div>\r\n ) : null}\r\n {requireJobTitle ? (\r\n <>\r\n <input\r\n className={classNames?.input}\r\n style={styles.input}\r\n type=\"text\"\r\n autoComplete=\"organization-title\"\r\n placeholder=\"Job title\"\r\n value={jobTitle}\r\n onChange={(event) => setJobTitle(event.target.value)}\r\n aria-invalid={Boolean(jobTitleError)}\r\n required\r\n />\r\n {jobTitleError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {jobTitleError}\r\n </div>\r\n ) : null}\r\n </>\r\n ) : null}\r\n {profileError ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {profileError}\r\n </div>\r\n ) : null}\r\n <button className={classNames?.button} style={styles.button} disabled={disabled} type=\"submit\">\r\n Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Default terms acceptance form used by the built-in component. */\r\nfunction TosBlock({\r\n onSubmit,\r\n disabled,\r\n error,\r\n styles,\r\n classNames,\r\n}: BlockBaseProps & { onSubmit: () => void; error?: string }) {\r\n const [checked, setChecked] = React.useState(false);\r\n return (\r\n <form\r\n className={classNames?.formColumn}\r\n style={styles.formColumn}\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n if (checked) {\r\n onSubmit();\r\n }\r\n }}\r\n >\r\n <label className={classNames?.checkboxRow} style={styles.checkboxRow}>\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(event) => setChecked(event.target.checked)}\r\n aria-invalid={Boolean(error)}\r\n />\r\n <span>I agree to the Terms of Service and Privacy Policy.</span>\r\n </label>\r\n {error ? (\r\n <div className={classNames?.error} style={styles.error}>\r\n {error}\r\n </div>\r\n ) : null}\r\n <button\r\n className={classNames?.button}\r\n style={styles.button}\r\n disabled={disabled || !checked}\r\n type=\"submit\"\r\n >\r\n Accept and Continue\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\n/** Completion panel shown when the flow reaches the terminal step. */\r\nfunction CompleteBlock({\r\n styles,\r\n classNames,\r\n}: {\r\n styles: Record<AdaptiveFlowStyleSlot, React.CSSProperties | undefined>;\r\n classNames?: AdaptiveFlowClassNames;\r\n}) {\r\n return (\r\n <div className={classNames?.complete} style={styles.complete}>\r\n <strong>You are all set.</strong>\r\n <p className={classNames?.caption} style={styles.caption}>\r\n All requirements are complete.\r\n </p>\r\n </div>\r\n );\r\n}\r\n\r\nconst defaultStyles: Record<AdaptiveFlowStyleSlot, React.CSSProperties> = {\r\n shell: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n width: \"100%\",\r\n maxWidth: 560,\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#ffffff\",\r\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\r\n },\r\n headerRow: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n },\r\n eyebrow: {\r\n fontSize: 12,\r\n textTransform: \"uppercase\",\r\n letterSpacing: 1.2,\r\n color: \"#6b7280\",\r\n marginBottom: 4,\r\n },\r\n title: {\r\n margin: 0,\r\n fontSize: 22,\r\n lineHeight: \"28px\",\r\n },\r\n badge: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#374151\",\r\n },\r\n success: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n error: {\r\n border: \"1px solid #fecaca\",\r\n background: \"#fef2f2\",\r\n color: \"#991b1b\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n info: {\r\n border: \"1px solid #bfdbfe\",\r\n background: \"#eff6ff\",\r\n color: \"#1e3a8a\",\r\n borderRadius: 10,\r\n padding: \"8px 10px\",\r\n fontSize: 14,\r\n },\r\n caption: {\r\n margin: 0,\r\n color: \"#4b5563\",\r\n fontSize: 14,\r\n },\r\n formRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"center\",\r\n },\r\n formColumn: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 10,\r\n },\r\n input: {\r\n width: \"100%\",\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n },\r\n button: {\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n whiteSpace: \"nowrap\",\r\n cursor: \"pointer\",\r\n },\r\n checkboxRow: {\r\n display: \"flex\",\r\n gap: 8,\r\n alignItems: \"flex-start\",\r\n fontSize: 14,\r\n color: \"#374151\",\r\n },\r\n complete: {\r\n border: \"1px solid #bbf7d0\",\r\n background: \"#f0fdf4\",\r\n color: \"#166534\",\r\n borderRadius: 12,\r\n padding: 12,\r\n },\r\n footer: {\r\n display: \"flex\",\r\n gap: 8,\r\n marginTop: 4,\r\n },\r\n oauthButton: {\r\n flex: 1,\r\n border: \"1px solid #d1d5db\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#f9fafb\",\r\n cursor: \"pointer\",\r\n },\r\n};\r\n","/**\r\n * Built-in requirement keys that cover the default flow states supported by the package.\r\n */\r\nexport const DefaultAppRequirements = {\r\n HAS_EMAIL: \"has_email\",\r\n EMAIL_VERIFIED: \"email_verified\",\r\n HAS_PASSWORD: \"has_password\",\r\n HAS_FIRST_NAME: \"has_first_name\",\r\n HAS_LAST_NAME: \"has_last_name\",\r\n ACCEPTED_TOS: \"accepted_tos\",\r\n HAS_JOB_TITLE: \"has_job_title\",\r\n} as const;\r\n\r\n/**\r\n * Built-in step keys used by the default flow UI and default requirement resolvers.\r\n */\r\nexport const DefaultAdaptiveSteps = {\r\n COLLECT_EMAIL: \"COLLECT_EMAIL\",\r\n VERIFY_OTP: \"VERIFY_OTP\",\r\n COLLECT_PASSWORD: \"COLLECT_PASSWORD\",\r\n COLLECT_PROFILE: \"COLLECT_PROFILE\",\r\n COLLECT_TOS: \"COLLECT_TOS\",\r\n COMPLETE: \"COMPLETE\",\r\n} as const;\r\n\r\n/** Requirement key from the built-in default requirement set. */\r\nexport type DefaultAppRequirement = (typeof DefaultAppRequirements)[keyof typeof DefaultAppRequirements];\r\n/** Step key from the built-in default step set. */\r\nexport type DefaultAdaptiveStep = (typeof DefaultAdaptiveSteps)[keyof typeof DefaultAdaptiveSteps];\r\n\r\n/** Requirement key used by the engine, including custom app-specific requirements. */\r\nexport type AppRequirement = DefaultAppRequirement | (string & {});\r\n/** Step key used by the engine, including custom app-specific steps. */\r\nexport type AdaptiveStep = DefaultAdaptiveStep | (string & {});\r\n\r\n/** Base context shape managed by the default flow helpers and UI. */\r\nexport type AdaptiveContextBase = {\r\n email: string | null;\r\n isVerified: boolean;\r\n hasPassword: boolean;\r\n profile: {\r\n firstName: string | null;\r\n lastName: string | null;\r\n jobTitle: string | null;\r\n };\r\n agreedToTos: boolean;\r\n};\r\n\r\n/** Alias for the default context shape used by the built-in component and hook. */\r\nexport type AdaptiveContext = AdaptiveContextBase;\r\n\r\n/** Default set of requirements used when a flow does not provide its own list. */\r\nexport const defaultRequirements: DefaultAppRequirement[] = [\r\n DefaultAppRequirements.HAS_EMAIL,\r\n DefaultAppRequirements.EMAIL_VERIFIED,\r\n DefaultAppRequirements.HAS_PASSWORD,\r\n DefaultAppRequirements.HAS_FIRST_NAME,\r\n DefaultAppRequirements.HAS_LAST_NAME,\r\n DefaultAppRequirements.HAS_JOB_TITLE,\r\n DefaultAppRequirements.ACCEPTED_TOS,\r\n];\r\n\r\n/** Default initial context used by the component and hook when no initialValue is provided. */\r\nexport const initialContext: AdaptiveContextBase = {\r\n email: null,\r\n isVerified: false,\r\n hasPassword: false,\r\n profile: {\r\n firstName: null,\r\n lastName: null,\r\n jobTitle: null,\r\n },\r\n agreedToTos: false,\r\n};\r\n\r\n/** Utility type for APIs that may return either a synchronous or asynchronous value. */\r\nexport type MaybePromise<T> = T | Promise<T>;\r\n\r\n/** Resolver contract that maps one requirement to the step shown when it is unmet. */\r\nexport type RequirementResolver<\r\n TContext = AdaptiveContextBase,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n step: TStep;\r\n};\r\n\r\n/**\r\n * Single requirement node in the requirement graph.\r\n * The engine evaluates nodes by priority, dependency readiness, and custom conditions.\r\n */\r\nexport type RequirementGraphNode<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n requirement: TRequirement;\r\n step: TStep;\r\n isMet: (context: TContext) => MaybePromise<boolean>;\r\n when?: (context: TContext) => MaybePromise<boolean>;\r\n priority?: number;\r\n dependsOn?: readonly TRequirement[];\r\n};\r\n\r\n/** Ordered requirement graph consumed by the engine evaluation helpers. */\r\nexport type RequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = readonly RequirementGraphNode<TContext, TRequirement, TStep>[];\r\n\r\n/** Default requirement-to-step resolvers used by the built-in flow UI. */\r\nexport const defaultRequirementResolvers: Record<\r\n DefaultAppRequirement,\r\n RequirementResolver<AdaptiveContextBase, AdaptiveStep>\r\n> = {\r\n has_email: {\r\n isMet: (context) => Boolean(context.email),\r\n step: DefaultAdaptiveSteps.COLLECT_EMAIL,\r\n },\r\n email_verified: {\r\n isMet: (context) => context.isVerified,\r\n step: DefaultAdaptiveSteps.VERIFY_OTP,\r\n },\r\n has_password: {\r\n isMet: (context) => context.hasPassword,\r\n step: DefaultAdaptiveSteps.COLLECT_PASSWORD,\r\n },\r\n has_first_name: {\r\n isMet: (context) => Boolean(context.profile.firstName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n has_last_name: {\r\n isMet: (context) => Boolean(context.profile.lastName),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n accepted_tos: {\r\n isMet: (context) => context.agreedToTos,\r\n step: DefaultAdaptiveSteps.COLLECT_TOS,\r\n },\r\n has_job_title: {\r\n isMet: (context) => Boolean(context.profile.jobTitle),\r\n step: DefaultAdaptiveSteps.COLLECT_PROFILE,\r\n },\r\n};\r\n\r\n/**\r\n * Build a requirement graph from a requirement list, resolver map, and optional graph metadata.\r\n *\r\n * The function validates that dependencies refer to known resolver-backed requirements and\r\n * rejects circular dependency chains at graph creation time.\r\n */\r\nexport function createRequirementGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n requirements: readonly TRequirement[],\r\n resolvers: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>,\r\n options?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const graph: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n const requirementSet = new Set(requirements);\r\n const resolverBackedRequirements = new Set(\r\n requirements.filter((requirement) => Boolean(resolvers[requirement])),\r\n );\r\n\r\n for (const requirement of requirements) {\r\n const resolver = resolvers[requirement];\r\n if (!resolver) {\r\n continue;\r\n }\r\n\r\n const dependsOn = options?.dependencies?.[requirement] ?? [];\r\n for (const dependency of dependsOn) {\r\n if (!requirementSet.has(dependency)) {\r\n throw new Error(\r\n `Invalid dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\".`,\r\n );\r\n }\r\n if (!resolverBackedRequirements.has(dependency)) {\r\n throw new Error(\r\n `Dependency \\\"${String(dependency)}\\\" referenced by requirement \\\"${String(requirement)}\\\" has no resolver.`,\r\n );\r\n }\r\n }\r\n\r\n graph.push({\r\n requirement,\r\n step: resolver.step,\r\n isMet: resolver.isMet,\r\n when: options?.conditions?.[requirement],\r\n priority: options?.priorities?.[requirement] ?? 0,\r\n dependsOn,\r\n });\r\n }\r\n\r\n const byRequirement = new Map(\r\n graph.map((node) => [node.requirement, node] as const),\r\n );\r\n\r\n const visited = new Set<TRequirement>();\r\n const visiting = new Set<TRequirement>();\r\n\r\n const dfs = (requirement: TRequirement, stack: TRequirement[]) => {\r\n if (visited.has(requirement)) {\r\n return;\r\n }\r\n\r\n if (visiting.has(requirement)) {\r\n const cycleStart = stack.indexOf(requirement);\r\n const cyclePath = [...stack.slice(cycleStart), requirement]\r\n .map((value) => String(value))\r\n .join(\" -> \");\r\n throw new Error(`Circular dependency detected in requirement graph: ${cyclePath}`);\r\n }\r\n\r\n visiting.add(requirement);\r\n const node = byRequirement.get(requirement);\r\n if (node?.dependsOn?.length) {\r\n for (const dep of node.dependsOn) {\r\n if (byRequirement.has(dep)) {\r\n dfs(dep, [...stack, requirement]);\r\n }\r\n }\r\n }\r\n\r\n visiting.delete(requirement);\r\n visited.add(requirement);\r\n };\r\n\r\n for (const node of graph) {\r\n dfs(node.requirement, []);\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Build a requirement graph using the built-in default resolvers plus any app-specific overrides.\r\n */\r\nexport function createDefaultRequirementGraph<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = DefaultAppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n>(\r\n options?: {\r\n requirements?: readonly TRequirement[];\r\n resolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n },\r\n): RequirementGraph<TContext, TRequirement, TStep> {\r\n const requirements =\r\n (options?.requirements ?? (defaultRequirements as unknown as readonly TRequirement[]));\r\n\r\n const resolvers = {\r\n ...(defaultRequirementResolvers as unknown as Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>),\r\n ...(options?.resolvers ?? {}),\r\n };\r\n\r\n return createRequirementGraph(requirements, resolvers, {\r\n priorities: options?.priorities,\r\n conditions: options?.conditions,\r\n dependencies: options?.dependencies,\r\n });\r\n}\r\n\r\nfunction sortGraph<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(graph: RequirementGraph<TContext, TRequirement, TStep>) {\r\n const entries = graph.map((node, index) => ({ node, index }));\r\n const byRequirement = new Map(entries.map((entry) => [entry.node.requirement, entry] as const));\r\n\r\n const indegree = new Map<TRequirement, number>();\r\n const adjacency = new Map<TRequirement, TRequirement[]>();\r\n\r\n for (const entry of entries) {\r\n indegree.set(entry.node.requirement, 0);\r\n adjacency.set(entry.node.requirement, []);\r\n }\r\n\r\n for (const entry of entries) {\r\n const current = entry.node.requirement;\r\n for (const dependency of entry.node.dependsOn ?? []) {\r\n const depEntry = byRequirement.get(dependency);\r\n if (!depEntry) {\r\n continue;\r\n }\r\n\r\n const outgoing = adjacency.get(depEntry.node.requirement);\r\n if (outgoing) {\r\n outgoing.push(current);\r\n }\r\n indegree.set(current, (indegree.get(current) ?? 0) + 1);\r\n }\r\n }\r\n\r\n const compare = (\r\n left: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n right: { node: RequirementGraphNode<TContext, TRequirement, TStep>; index: number },\r\n ) => {\r\n const byPriority = (right.node.priority ?? 0) - (left.node.priority ?? 0);\r\n if (byPriority !== 0) {\r\n return byPriority;\r\n }\r\n // Keep declaration order for equal-priority nodes to avoid surprising step jumps.\r\n return left.index - right.index;\r\n };\r\n\r\n const ready = entries\r\n .filter((entry) => (indegree.get(entry.node.requirement) ?? 0) === 0)\r\n .sort(compare);\r\n\r\n const ordered: RequirementGraphNode<TContext, TRequirement, TStep>[] = [];\r\n\r\n while (ready.length > 0) {\r\n const current = ready.shift();\r\n if (!current) {\r\n break;\r\n }\r\n\r\n ordered.push(current.node);\r\n\r\n for (const dependent of adjacency.get(current.node.requirement) ?? []) {\r\n const next = (indegree.get(dependent) ?? 0) - 1;\r\n indegree.set(dependent, next);\r\n if (next === 0) {\r\n const dependentEntry = byRequirement.get(dependent);\r\n if (dependentEntry) {\r\n ready.push(dependentEntry);\r\n ready.sort(compare);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (ordered.length !== graph.length) {\r\n throw new Error(\"Unable to topologically sort requirement graph. Check for dependency cycles.\");\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\n/**\r\n * Evaluate the graph against the current context and return the next unmet step.\r\n *\r\n * Nodes are evaluated in dependency-aware order with deterministic tie-breaking.\r\n */\r\nexport async function evaluateNextStep<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n completeStep: TStep,\r\n): Promise<TStep> {\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (node.dependsOn && node.dependsOn.length > 0) {\r\n const prerequisiteNodes = graph.filter((candidate) =>\r\n node.dependsOn?.includes(candidate.requirement),\r\n );\r\n\r\n if (prerequisiteNodes.length > 0) {\r\n const prerequisitesMet = await Promise.all(\r\n prerequisiteNodes.map(async (candidate) => candidate.isMet(context)),\r\n );\r\n if (prerequisitesMet.includes(false)) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n return node.step;\r\n }\r\n }\r\n\r\n return completeStep;\r\n}\r\n\r\n/**\r\n * Return every unmet requirement for the current context in graph evaluation order.\r\n */\r\nexport async function getMissingRequirements<\r\n TContext,\r\n TRequirement extends string,\r\n TStep extends string,\r\n>(\r\n context: TContext,\r\n graph: RequirementGraph<TContext, TRequirement, TStep>,\r\n): Promise<TRequirement[]> {\r\n const missing: TRequirement[] = [];\r\n\r\n for (const node of sortGraph(graph)) {\r\n if (node.when && !(await node.when(context))) {\r\n continue;\r\n }\r\n\r\n if (!(await node.isMet(context))) {\r\n missing.push(node.requirement);\r\n }\r\n }\r\n\r\n return missing;\r\n}\r\n"],"mappings":"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","names":[]}
|