@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 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
- normalizedRequirements.length - missing.length,
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
- normalizedRequirements.length - missing.length,
1076
+ completedCount,
1070
1077
  "/",
1071
1078
  normalizedRequirements.length
1072
1079
  ] })
@@ -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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secmia/openui-flow",
3
- "version": "4.2.5",
3
+ "version": "4.2.7",
4
4
  "description": "Backend-agnostic adaptive flow engine for React apps",
5
5
  "license": "MIT",
6
6
  "author": "",