@secmia/openui-flow 4.2.7 → 4.2.8
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.js +17 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1430,10 +1430,11 @@ var defaultStyles = {
|
|
|
1430
1430
|
gap: 12,
|
|
1431
1431
|
width: "100%",
|
|
1432
1432
|
maxWidth: 560,
|
|
1433
|
-
border: "1px solid #
|
|
1433
|
+
border: "1px solid #cbd5e1",
|
|
1434
1434
|
borderRadius: 14,
|
|
1435
1435
|
padding: 16,
|
|
1436
|
-
background: "#
|
|
1436
|
+
background: "#f8fafc",
|
|
1437
|
+
color: "#0f172a",
|
|
1437
1438
|
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, sans-serif"
|
|
1438
1439
|
},
|
|
1439
1440
|
headerRow: {
|
|
@@ -1446,7 +1447,7 @@ var defaultStyles = {
|
|
|
1446
1447
|
fontSize: 12,
|
|
1447
1448
|
textTransform: "uppercase",
|
|
1448
1449
|
letterSpacing: 1.2,
|
|
1449
|
-
color: "#
|
|
1450
|
+
color: "#475569",
|
|
1450
1451
|
marginBottom: 4
|
|
1451
1452
|
},
|
|
1452
1453
|
title: {
|
|
@@ -1455,12 +1456,13 @@ var defaultStyles = {
|
|
|
1455
1456
|
lineHeight: "28px"
|
|
1456
1457
|
},
|
|
1457
1458
|
badge: {
|
|
1458
|
-
border: "1px solid #
|
|
1459
|
+
border: "1px solid #cbd5e1",
|
|
1459
1460
|
borderRadius: 999,
|
|
1460
1461
|
padding: "4px 10px",
|
|
1461
1462
|
fontSize: 12,
|
|
1462
1463
|
fontWeight: 600,
|
|
1463
|
-
color: "#
|
|
1464
|
+
color: "#1e293b",
|
|
1465
|
+
background: "#ffffff"
|
|
1464
1466
|
},
|
|
1465
1467
|
success: {
|
|
1466
1468
|
border: "1px solid #bbf7d0",
|
|
@@ -1488,7 +1490,7 @@ var defaultStyles = {
|
|
|
1488
1490
|
},
|
|
1489
1491
|
caption: {
|
|
1490
1492
|
margin: 0,
|
|
1491
|
-
color: "#
|
|
1493
|
+
color: "#334155",
|
|
1492
1494
|
fontSize: 14
|
|
1493
1495
|
},
|
|
1494
1496
|
formRow: {
|
|
@@ -1503,19 +1505,22 @@ var defaultStyles = {
|
|
|
1503
1505
|
},
|
|
1504
1506
|
input: {
|
|
1505
1507
|
width: "100%",
|
|
1506
|
-
border: "1px solid #
|
|
1508
|
+
border: "1px solid #94a3b8",
|
|
1507
1509
|
borderRadius: 8,
|
|
1508
1510
|
height: 40,
|
|
1509
1511
|
padding: "0 12px",
|
|
1510
|
-
fontSize: 14
|
|
1512
|
+
fontSize: 14,
|
|
1513
|
+
background: "#ffffff",
|
|
1514
|
+
color: "#0f172a"
|
|
1511
1515
|
},
|
|
1512
1516
|
button: {
|
|
1513
|
-
border: "1px solid #
|
|
1517
|
+
border: "1px solid #94a3b8",
|
|
1514
1518
|
borderRadius: 8,
|
|
1515
1519
|
height: 40,
|
|
1516
1520
|
padding: "0 14px",
|
|
1517
1521
|
fontWeight: 600,
|
|
1518
1522
|
background: "#ffffff",
|
|
1523
|
+
color: "#0f172a",
|
|
1519
1524
|
whiteSpace: "nowrap",
|
|
1520
1525
|
cursor: "pointer"
|
|
1521
1526
|
},
|
|
@@ -1540,10 +1545,11 @@ var defaultStyles = {
|
|
|
1540
1545
|
},
|
|
1541
1546
|
oauthButton: {
|
|
1542
1547
|
flex: 1,
|
|
1543
|
-
border: "1px solid #
|
|
1548
|
+
border: "1px solid #94a3b8",
|
|
1544
1549
|
borderRadius: 8,
|
|
1545
1550
|
padding: "10px 12px",
|
|
1546
|
-
background: "#
|
|
1551
|
+
background: "#ffffff",
|
|
1552
|
+
color: "#0f172a",
|
|
1547
1553
|
cursor: "pointer"
|
|
1548
1554
|
}
|
|
1549
1555
|
};
|
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 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":[]}
|
|
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 #cbd5e1\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#f8fafc\",\r\n color: \"#0f172a\",\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: \"#475569\",\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 #cbd5e1\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#1e293b\",\r\n background: \"#ffffff\",\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: \"#334155\",\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 #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n },\r\n button: {\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\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 #94a3b8\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\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
|
@@ -1385,10 +1385,11 @@ var defaultStyles = {
|
|
|
1385
1385
|
gap: 12,
|
|
1386
1386
|
width: "100%",
|
|
1387
1387
|
maxWidth: 560,
|
|
1388
|
-
border: "1px solid #
|
|
1388
|
+
border: "1px solid #cbd5e1",
|
|
1389
1389
|
borderRadius: 14,
|
|
1390
1390
|
padding: 16,
|
|
1391
|
-
background: "#
|
|
1391
|
+
background: "#f8fafc",
|
|
1392
|
+
color: "#0f172a",
|
|
1392
1393
|
fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, sans-serif"
|
|
1393
1394
|
},
|
|
1394
1395
|
headerRow: {
|
|
@@ -1401,7 +1402,7 @@ var defaultStyles = {
|
|
|
1401
1402
|
fontSize: 12,
|
|
1402
1403
|
textTransform: "uppercase",
|
|
1403
1404
|
letterSpacing: 1.2,
|
|
1404
|
-
color: "#
|
|
1405
|
+
color: "#475569",
|
|
1405
1406
|
marginBottom: 4
|
|
1406
1407
|
},
|
|
1407
1408
|
title: {
|
|
@@ -1410,12 +1411,13 @@ var defaultStyles = {
|
|
|
1410
1411
|
lineHeight: "28px"
|
|
1411
1412
|
},
|
|
1412
1413
|
badge: {
|
|
1413
|
-
border: "1px solid #
|
|
1414
|
+
border: "1px solid #cbd5e1",
|
|
1414
1415
|
borderRadius: 999,
|
|
1415
1416
|
padding: "4px 10px",
|
|
1416
1417
|
fontSize: 12,
|
|
1417
1418
|
fontWeight: 600,
|
|
1418
|
-
color: "#
|
|
1419
|
+
color: "#1e293b",
|
|
1420
|
+
background: "#ffffff"
|
|
1419
1421
|
},
|
|
1420
1422
|
success: {
|
|
1421
1423
|
border: "1px solid #bbf7d0",
|
|
@@ -1443,7 +1445,7 @@ var defaultStyles = {
|
|
|
1443
1445
|
},
|
|
1444
1446
|
caption: {
|
|
1445
1447
|
margin: 0,
|
|
1446
|
-
color: "#
|
|
1448
|
+
color: "#334155",
|
|
1447
1449
|
fontSize: 14
|
|
1448
1450
|
},
|
|
1449
1451
|
formRow: {
|
|
@@ -1458,19 +1460,22 @@ var defaultStyles = {
|
|
|
1458
1460
|
},
|
|
1459
1461
|
input: {
|
|
1460
1462
|
width: "100%",
|
|
1461
|
-
border: "1px solid #
|
|
1463
|
+
border: "1px solid #94a3b8",
|
|
1462
1464
|
borderRadius: 8,
|
|
1463
1465
|
height: 40,
|
|
1464
1466
|
padding: "0 12px",
|
|
1465
|
-
fontSize: 14
|
|
1467
|
+
fontSize: 14,
|
|
1468
|
+
background: "#ffffff",
|
|
1469
|
+
color: "#0f172a"
|
|
1466
1470
|
},
|
|
1467
1471
|
button: {
|
|
1468
|
-
border: "1px solid #
|
|
1472
|
+
border: "1px solid #94a3b8",
|
|
1469
1473
|
borderRadius: 8,
|
|
1470
1474
|
height: 40,
|
|
1471
1475
|
padding: "0 14px",
|
|
1472
1476
|
fontWeight: 600,
|
|
1473
1477
|
background: "#ffffff",
|
|
1478
|
+
color: "#0f172a",
|
|
1474
1479
|
whiteSpace: "nowrap",
|
|
1475
1480
|
cursor: "pointer"
|
|
1476
1481
|
},
|
|
@@ -1495,10 +1500,11 @@ var defaultStyles = {
|
|
|
1495
1500
|
},
|
|
1496
1501
|
oauthButton: {
|
|
1497
1502
|
flex: 1,
|
|
1498
|
-
border: "1px solid #
|
|
1503
|
+
border: "1px solid #94a3b8",
|
|
1499
1504
|
borderRadius: 8,
|
|
1500
1505
|
padding: "10px 12px",
|
|
1501
|
-
background: "#
|
|
1506
|
+
background: "#ffffff",
|
|
1507
|
+
color: "#0f172a",
|
|
1502
1508
|
cursor: "pointer"
|
|
1503
1509
|
}
|
|
1504
1510
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AdaptiveFlow.tsx","../src/engine.ts"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport {\r\n createDefaultRequirementGraph,\r\n defaultRequirementResolvers,\r\n defaultRequirements,\r\n evaluateNextStep,\r\n getMissingRequirements,\r\n initialContext,\r\n type AdaptiveContext,\r\n type AdaptiveContextBase,\r\n type AdaptiveStep,\r\n type AppRequirement,\r\n type MaybePromise,\r\n type RequirementGraph,\r\n type RequirementResolver,\r\n} from \"./engine\";\r\n\r\n/** Supported OAuth provider identifiers accepted by the adapter and default UI. */\r\nexport type OAuthProvider = \"google\" | \"apple\" | (string & {});\r\n\r\n/** Configurable OAuth provider label/id pair used by the default footer buttons. */\r\nexport type AdaptiveFlowOAuthProvider = {\r\n id: OAuthProvider | (string & {});\r\n label: string;\r\n};\r\n\r\n/** Result returned by lookupByEmail to seed the flow with backend identity state. */\r\nexport type IdentityResolution = {\r\n accountExists: boolean;\r\n hasPassword?: boolean;\r\n isVerified?: boolean;\r\n agreedToTos?: boolean;\r\n profile?: Partial<AdaptiveContextBase[\"profile\"]>;\r\n};\r\n\r\n/** Backend adapter contract used by the flow to delegate all side effects. */\r\nexport type AdaptiveFlowAdapter<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n lookupByEmail?: (email: string) => Promise<IdentityResolution | null>;\r\n requestOtp?: (email: string) => Promise<void>;\r\n verifyOtp?: (email: string, code: string) => Promise<void>;\r\n signInWithPassword?: (email: string, password: string) => Promise<void>;\r\n createPassword?: (password: string) => Promise<void>;\r\n saveProfile?: (context: TContext) => Promise<void>;\r\n acceptTos?: (context: TContext) => Promise<void>;\r\n startOAuth?: (provider: OAuthProvider, context: TContext) => Promise<void>;\r\n completeOAuth?: (\r\n provider: OAuthProvider | null,\r\n context: TContext,\r\n ) => Promise<Partial<TContext> | void>;\r\n};\r\n\r\n/** Named style slots used by the built-in component shell and step renderers. */\r\nexport type AdaptiveFlowStyleSlot =\r\n | \"shell\"\r\n | \"headerRow\"\r\n | \"eyebrow\"\r\n | \"title\"\r\n | \"badge\"\r\n | \"success\"\r\n | \"error\"\r\n | \"info\"\r\n | \"caption\"\r\n | \"formRow\"\r\n | \"formColumn\"\r\n | \"input\"\r\n | \"button\"\r\n | \"checkboxRow\"\r\n | \"complete\"\r\n | \"footer\"\r\n | \"oauthButton\";\r\n\r\n/** Inline style overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowStyles = Partial<Record<AdaptiveFlowStyleSlot, React.CSSProperties>>;\r\n/** CSS class overrides keyed by the built-in style slots. */\r\nexport type AdaptiveFlowClassNames = Partial<Record<AdaptiveFlowStyleSlot, string>>;\r\n\r\n/** Minimal storage interface used by persistence drivers. */\r\nexport type AdaptiveFlowStorageDriver = Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\">;\r\n\r\n/** Persistence settings for storing and restoring flow state across reloads. */\r\nexport type AdaptiveFlowPersistence<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n key: string;\r\n storage?: \"session\" | \"local\" | AdaptiveFlowStorageDriver;\r\n serialize?: (state: PersistedAdaptiveFlowState<TContext>) => string;\r\n deserialize?: (value: string) => PersistedAdaptiveFlowState<TContext>;\r\n clearOnComplete?: boolean;\r\n onError?: (error: Error, phase: \"read\" | \"write\" | \"clear\") => void;\r\n};\r\n\r\n/** Persisted flow payload written to session/local/custom storage. */\r\nexport type PersistedAdaptiveFlowState<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n context: TContext;\r\n oauthPendingProvider: OAuthProvider | null;\r\n};\r\n\r\n/** Context wrapper passed into validators so they can inspect the current flow state. */\r\nexport type AdaptiveFlowValidationContext<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n> = {\r\n context: TContext;\r\n};\r\n\r\n/** Validator failure payload that can target a specific field or the whole form. */\r\nexport type AdaptiveFlowValidationIssue = {\r\n message: string;\r\n field?: string;\r\n};\r\n\r\n/** Validator return type supported by the component and hook. */\r\nexport type AdaptiveFlowValidationResult =\r\n | string\r\n | AdaptiveFlowValidationIssue\r\n | void\r\n | Promise<string | AdaptiveFlowValidationIssue | void>;\r\n\r\n/** Schema adapter contract used for optional Zod-friendly validation. */\r\nexport type AdaptiveFlowSchema<TValue> = {\r\n safeParse?: (value: TValue) => {\r\n success: boolean;\r\n error?: {\r\n message?: string;\r\n issues?: Array<{\r\n message?: string;\r\n path?: Array<string | number>;\r\n }>;\r\n };\r\n };\r\n parse?: (value: TValue) => unknown;\r\n};\r\n\r\n/** Optional schema map for built-in step fields. */\r\nexport type AdaptiveFlowSchemas = {\r\n email?: AdaptiveFlowSchema<string>;\r\n otp?: AdaptiveFlowSchema<string>;\r\n password?: AdaptiveFlowSchema<string>;\r\n profile?: AdaptiveFlowSchema<AdaptiveContextBase[\"profile\"]>;\r\n tos?: AdaptiveFlowSchema<boolean>;\r\n};\r\n\r\n/** Backoff settings used to retry transient adapter calls and OAuth completion. */\r\nexport type AdaptiveFlowRetryPolicy = {\r\n maxAttempts?: number;\r\n initialDelayMs?: number;\r\n factor?: number;\r\n maxDelayMs?: number;\r\n jitter?: boolean;\r\n shouldRetry?: (error: Error, attempt: number) => boolean;\r\n delay?: (attempt: number) => number;\r\n};\r\n\r\n/** Field error bag keyed by field path or logical field name. */\r\nexport type AdaptiveFlowFieldErrors = Partial<Record<string, string>>;\r\n\r\n/** Validator map for the built-in flow fields. */\r\nexport type AdaptiveFlowValidators<TContext extends AdaptiveContextBase = AdaptiveContextBase> = {\r\n email?: (input: string, payload: AdaptiveFlowValidationContext<TContext>) => AdaptiveFlowValidationResult;\r\n otp?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { email: string },\r\n ) => AdaptiveFlowValidationResult;\r\n password?: (\r\n input: string,\r\n payload: AdaptiveFlowValidationContext<TContext> & { hasPassword: boolean },\r\n ) => AdaptiveFlowValidationResult;\r\n profile?: (\r\n input: AdaptiveContextBase[\"profile\"],\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n tos?: (\r\n accepted: boolean,\r\n payload: AdaptiveFlowValidationContext<TContext>,\r\n ) => AdaptiveFlowValidationResult;\r\n};\r\n\r\n/** Transition record emitted whenever the evaluated step changes. */\r\nexport type AdaptiveStepTransition<TStep extends string = AdaptiveStep> = {\r\n from: TStep | null;\r\n to: TStep;\r\n at: number;\r\n attempt: number;\r\n};\r\n\r\n/** Arguments supplied to a stepRegistry renderer for a specific step. */\r\nexport type AdaptiveStepRendererArgs<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Registry that overrides the UI for selected steps. */\r\nexport type AdaptiveStepRegistry<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = Partial<\r\n Record<TStep, (args: AdaptiveStepRendererArgs<TContext, TRequirement, TStep>) => React.ReactNode>\r\n>;\r\n\r\n/** Arguments supplied to renderStep for full step-body customization. */\r\nexport type AdaptiveStepRenderArgs<\r\n TContext extends AdaptiveContextBase = AdaptiveContextBase,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n step: TStep;\r\n context: TContext;\r\n busy: boolean;\r\n message: string | null;\r\n errorMessage: string | null;\r\n fieldErrors: AdaptiveFlowFieldErrors;\r\n missingRequirements: TRequirement[];\r\n requirements: readonly TRequirement[];\r\n defaultView: React.ReactNode;\r\n setContextPatch: (patch: Partial<TContext>) => void;\r\n run: (job: () => Promise<void>) => Promise<void>;\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n transitions: AdaptiveStepTransition<TStep>[];\r\n};\r\n\r\n/** Props accepted by the AdaptiveFlow component. */\r\nexport type AdaptiveFlowProps<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = {\r\n adapter?: AdaptiveFlowAdapter<TContext>;\r\n requirements?: readonly TRequirement[];\r\n requirementGraph?: RequirementGraph<TContext, TRequirement, TStep>;\r\n requirementGraphConfig?: {\r\n priorities?: Partial<Record<TRequirement, number>>;\r\n conditions?: Partial<Record<TRequirement, (context: TContext) => MaybePromise<boolean>>>;\r\n dependencies?: Partial<Record<TRequirement, readonly TRequirement[]>>;\r\n };\r\n requirementResolvers?: Partial<Record<TRequirement, RequirementResolver<TContext, TStep>>>;\r\n completeStep?: TStep;\r\n stepTitles?: Partial<Record<TStep, string>>;\r\n renderStep?: (args: AdaptiveStepRenderArgs<TContext, TRequirement, TStep>) => React.ReactNode;\r\n stepRegistry?: AdaptiveStepRegistry<TContext, TRequirement, TStep>;\r\n initialValue?: Partial<TContext>;\r\n onComplete?: (context: TContext) => void;\r\n onError?: (error: Error) => void;\r\n onStepTransition?: (transition: AdaptiveStepTransition<TStep>, context: TContext) => void;\r\n className?: string;\r\n classNames?: AdaptiveFlowClassNames;\r\n styles?: AdaptiveFlowStyles;\r\n unstyled?: boolean;\r\n persistence?: AdaptiveFlowPersistence<TContext>;\r\n validators?: AdaptiveFlowValidators<TContext>;\r\n schemas?: AdaptiveFlowSchemas;\r\n oauthProviders?: readonly AdaptiveFlowOAuthProvider[];\r\n retryPolicy?: AdaptiveFlowRetryPolicy;\r\n};\r\n\r\n/** Options accepted by the headless useAdaptiveFlow hook. */\r\nexport type UseAdaptiveFlowOptions<\r\n TContext extends AdaptiveContextBase = AdaptiveContext,\r\n TRequirement extends string = AppRequirement,\r\n TStep extends string = AdaptiveStep,\r\n> = Omit<\r\n AdaptiveFlowProps<TContext, TRequirement, TStep>,\r\n \"stepTitles\" | \"renderStep\" | \"stepRegistry\" | \"className\" | \"classNames\" | \"styles\" | \"unstyled\"\r\n>;\r\n\r\n/** Result object returned by useAdaptiveFlow. */\r\nexport type UseAdaptiveFlowResult<\r\n TContext extends AdaptiveContextBase,\r\n TRequirement extends string,\r\n TStep extends string,\r\n> = {\r\n context: TContext;\r\n step: TStep;\r\n 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":[]}
|
|
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 #cbd5e1\",\r\n borderRadius: 14,\r\n padding: 16,\r\n background: \"#f8fafc\",\r\n color: \"#0f172a\",\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: \"#475569\",\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 #cbd5e1\",\r\n borderRadius: 999,\r\n padding: \"4px 10px\",\r\n fontSize: 12,\r\n fontWeight: 600,\r\n color: \"#1e293b\",\r\n background: \"#ffffff\",\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: \"#334155\",\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 #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 12px\",\r\n fontSize: 14,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\r\n },\r\n button: {\r\n border: \"1px solid #94a3b8\",\r\n borderRadius: 8,\r\n height: 40,\r\n padding: \"0 14px\",\r\n fontWeight: 600,\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\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 #94a3b8\",\r\n borderRadius: 8,\r\n padding: \"10px 12px\",\r\n background: \"#ffffff\",\r\n color: \"#0f172a\",\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":[]}
|