@foldspace-fe/casdoor-next-auth-kit 0.1.19 → 0.1.21
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/billing/index.d.ts +20 -3
- package/dist/billing/index.js +10 -2
- package/dist/{chunk-46V73LSW.js → chunk-FL6LOXEG.js} +95 -1
- package/dist/chunk-FL6LOXEG.js.map +1 -0
- package/dist/{chunk-ZCHLJYLN.js → chunk-NWYEHQNK.js} +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +10 -2
- package/dist/react/index.d.ts +43 -2
- package/dist/react/index.js +285 -7
- package/dist/react/index.js.map +1 -1
- package/dist/skills/casdoor-next-auth-kit/SKILL.md +14 -6
- package/dist/{types-xgHVGy75.d.ts → types-oVIQpMut.d.ts} +122 -1
- package/package.json +1 -1
- package/dist/chunk-46V73LSW.js.map +0 -1
- /package/dist/{chunk-ZCHLJYLN.js.map → chunk-NWYEHQNK.js.map} +0 -0
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/hooks.ts","../../src/billing/react.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { Session } from 'next-auth';\nimport { SessionProvider } from 'next-auth/react';\n\nexport function AuthProvider({\n children,\n session,\n}: {\n children: ReactNode;\n session?: Session | null;\n}) {\n return <SessionProvider session={session}>{children}</SessionProvider>;\n}\n","'use client';\n\nimport { useSession } from 'next-auth/react';\nimport { buildAuthJumpHref } from '../core/redirect';\nimport type { AuthSession } from '../next/options';\n\nexport type AuthRole = 'guest' | 'user' | 'admin';\n\nexport interface AuthUserSummary {\n id: string | null;\n name: string;\n email: string | null;\n image: string | null;\n isAuthenticated: boolean;\n isAdmin: boolean;\n tokenBalance: number;\n isVip: boolean;\n role: AuthRole;\n}\n\nexport interface AuthActions {\n loginHref: string;\n signupHref: string;\n logoutHref: string;\n accountHref: string;\n adminHref: string;\n}\n\nexport interface AuthActionsOptions {\n redirect?: string | null;\n}\n\nfunction getUserSummary(session: AuthSession | null | undefined): AuthUserSummary {\n const user = session?.user;\n const name = user?.name || '登录';\n const isAuthenticated = Boolean(user);\n const isAdmin = Boolean(user?.isAdmin);\n const role: AuthRole = !isAuthenticated ? 'guest' : isAdmin ? 'admin' : 'user';\n\n return {\n id: user?.id ?? null,\n name,\n email: user?.email ?? null,\n image: user?.image ?? null,\n isAuthenticated,\n isAdmin,\n tokenBalance: Number(user?.tokenBalance ?? 2580),\n isVip: Boolean(user?.isVip ?? true),\n role,\n };\n}\n\nexport function useAuthSession() {\n return useSession() as ReturnType<typeof useSession> & {\n data: AuthSession | null | undefined;\n };\n}\n\nexport function useAuthUser(): AuthUserSummary {\n const { data: session } = useAuthSession();\n return getUserSummary(session ?? null);\n}\n\nexport function useAuthRole(): AuthRole {\n return useAuthUser().role;\n}\n\nexport function useAuthActions(options: AuthActionsOptions = {}): AuthActions {\n const user = useAuthUser();\n const redirect = options.redirect ?? null;\n\n return {\n loginHref: buildAuthJumpHref('login', redirect ?? undefined),\n signupHref: buildAuthJumpHref('signup', redirect ?? undefined),\n logoutHref: '/logout',\n accountHref: '/user/account',\n adminHref: '/admin',\n };\n}\n","'use client';\n\nimport {\n type Context,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n buildBillingActionPayload,\n buildBillingPurchaseRequest,\n deriveBillingCreditsState,\n deriveBillingEntitlements,\n filterBillingPurchasableItems,\n normalizeBillingPurchaseStatus,\n normalizeBillingCatalogConfig,\n normalizeBillingRuntimeConfig,\n resolveBillingItem,\n resolveBillingPurchasable,\n resolveBillingProductSnapshot,\n resolveBillingSubscriptionProduct,\n} from './runtime';\nimport {\n buildCasdoorBuyProductRequest,\n normalizeCasdoorBuyProductResponse,\n normalizeCasdoorProductId,\n} from './casdoor-purchase.js';\nimport type {\n BillingActionExecutor,\n BillingActionKind,\n BillingActionExecutionResult,\n BillingActionPayload,\n BillingApiClient,\n BillingCatalogConfig,\n BillingCasdoorBuyProductRequest,\n BillingCasdoorProductDetail,\n BillingCoreContextValue,\n BillingCreditsContextValue,\n BillingCreditsState,\n BillingDefaults,\n BillingEntitlementState,\n BillingLoaders,\n BillingOrderHistoryItem,\n BillingPaymentHistoryItem,\n BillingItem,\n BillingProductState,\n BillingProductContextValue,\n BillingProductSnapshot,\n BillingPurchaseHooks,\n BillingPurchaseStatus,\n BillingRuntimeConfig,\n BillingStatusState,\n BillingSubscriptionContextValue,\n BillingSubscriptionHistoryItem,\n BillingSubscriptionState,\n} from './types';\n\nexport interface BillingProviderProps {\n children: ReactNode;\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n purchaseStatus?: BillingPurchaseStatus;\n purchaseHooks?: BillingPurchaseHooks;\n autoRefresh?: boolean;\n}\n\nexport type BillingCoreProviderProps = BillingProviderProps;\nexport interface BillingSubscriptionProviderProps {\n children: ReactNode;\n availablePlans?: BillingItem[];\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n}\n\nexport interface BillingProductProviderProps {\n children: ReactNode;\n availableProducts?: BillingItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n status?: BillingStatusState;\n}\n\nexport interface BillingCreditsProviderProps {\n children: ReactNode;\n credits?: BillingCreditsState;\n status?: BillingStatusState;\n}\n\nexport interface BillingPipelineOptions {\n onBeforeAction?: (payload: BillingActionPayload) => Promise<BillingActionPayload>;\n onAfterAction?: (result: { redirectTo?: string; nextAction?: string }) => Promise<void>;\n onError?: (error: unknown) => Promise<void>;\n}\n\nconst BillingCoreContext = createContext<BillingCoreContextValue | null>(null);\nconst BillingSubscriptionContext = createContext<BillingSubscriptionContextValue | null>(null);\nconst BillingProductContext = createContext<BillingProductContextValue | null>(null);\nconst BillingCreditsContext = createContext<BillingCreditsContextValue | null>(null);\n\nfunction useOptionalContext<T>(context: Context<T | null>): T | null {\n return useContext(context);\n}\n\nfunction useRequiredCoreContext(): BillingCoreContextValue {\n const context = useContext(BillingCoreContext);\n if (!context) {\n throw new Error('Billing hooks must be used inside BillingProvider or BillingCoreProvider.');\n }\n return context;\n}\n\nfunction choose<T>(primary: T | undefined, fallback: T | undefined): T | undefined {\n return primary ?? fallback;\n}\n\nasync function runPurchaseHook<T>(\n name: string,\n hook: ((context: T) => void | Promise<void>) | undefined,\n context: T | undefined,\n): Promise<void> {\n if (!hook || context === undefined) {\n return;\n }\n\n try {\n await hook(context);\n } catch (error) {\n console.error(`[casdoor-next-auth-kit] billing ${name} hook failed`, error);\n }\n}\n\nfunction getLatestOrder(orders: BillingOrderHistoryItem[] | undefined): BillingOrderHistoryItem | undefined {\n return [...(orders ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction getLatestPayment(payments: BillingPaymentHistoryItem[] | undefined): BillingPaymentHistoryItem | undefined {\n return [...(payments ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction extractCasdoorResponseData<TData>(response: { data?: TData } | TData | undefined): TData | undefined {\n if (!response) return undefined;\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return (response as { data?: TData }).data;\n }\n return response as TData;\n}\n\nasync function runCasdoorProductPurchase(\n purchaseRequest: NonNullable<ReturnType<typeof buildBillingPurchaseRequest>>,\n apiClient: BillingApiClient,\n loaders: BillingLoaders | undefined,\n): Promise<BillingActionExecutionResult | null> {\n const buyProductLoader = loaders?.buyProductLoader ?? apiClient.buyProduct;\n if (!buyProductLoader) {\n return null;\n }\n\n const productLoader = loaders?.productLoader ?? apiClient.fetchProduct;\n const organizationNamesLoader = loaders?.organizationNamesLoader ?? apiClient.fetchOrganizationNames;\n\n let productDetail: BillingCasdoorProductDetail | undefined;\n if (productLoader) {\n const productResponse = await productLoader({ id: purchaseRequest.productId }).catch(() => undefined);\n productDetail = extractCasdoorResponseData<BillingCasdoorProductDetail>(productResponse);\n }\n\n if (!productDetail) {\n if (purchaseRequest.productOwner && purchaseRequest.productName) {\n productDetail = {\n owner: purchaseRequest.productOwner,\n name: purchaseRequest.productName,\n };\n } else {\n try {\n const normalized = normalizeCasdoorProductId(purchaseRequest.productId);\n productDetail = {\n owner: normalized.owner,\n name: normalized.name,\n };\n } catch {\n return null;\n }\n }\n }\n\n if (organizationNamesLoader && productDetail.owner) {\n const organizationResponse = await organizationNamesLoader({ owner: productDetail.owner }).catch(() => undefined);\n void extractCasdoorResponseData(organizationResponse);\n }\n\n const buyRequest: BillingCasdoorBuyProductRequest = buildCasdoorBuyProductRequest(\n purchaseRequest,\n productDetail,\n purchaseRequest.providerName,\n );\n\n const response = await buyProductLoader(buyRequest);\n return normalizeCasdoorBuyProductResponse(response, purchaseRequest.returnTo ?? productDetail.returnUrl ?? productDetail.successUrl);\n}\n\nfunction normalizeRuntimeConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingRuntimeConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingRuntimeConfig(config);\n}\n\nfunction normalizeCatalogConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingCatalogConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingCatalogConfig(config);\n}\n\nfunction buildCoreValue(input: {\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n runtimeCatalog?: BillingCatalogConfig;\n runtimeConfigLoading: boolean;\n runtimeConfigError: string | null;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n purchaseStatus?: BillingPurchaseStatus;\n purchaseHooks?: BillingPurchaseHooks;\n status: BillingStatusState;\n refresh: () => Promise<void>;\n runAction: (payload: BillingActionPayload) => Promise<BillingActionExecutionResult>;\n setRuntimeConfig: (config?: BillingRuntimeConfig) => void;\n setSubscription: (value?: BillingSubscriptionState) => void;\n setSubscriptionHistory: (value?: BillingSubscriptionHistoryItem[]) => void;\n setProducts: (value?: BillingProductState[]) => void;\n setOrderHistory: (value?: BillingOrderHistoryItem[]) => void;\n setPaymentHistory: (value?: BillingPaymentHistoryItem[]) => void;\n setCredits: (value?: BillingCreditsState) => void;\n setEntitlements: (value?: BillingEntitlementState) => void;\n setPurchaseStatus: (status?: BillingPurchaseStatus) => void;\n setStatus: (status: BillingStatusState | ((current: BillingStatusState) => BillingStatusState)) => void;\n}): BillingCoreContextValue {\n return {\n apiClient: input.apiClient,\n loaders: input.loaders,\n runtimeConfigLoader: input.runtimeConfigLoader,\n actionExecutor: input.actionExecutor,\n defaults: input.defaults,\n runtimeConfig: input.runtimeConfig,\n runtimeCatalog: input.runtimeCatalog,\n runtimeConfigLoading: input.runtimeConfigLoading,\n runtimeConfigError: input.runtimeConfigError,\n subscription: input.subscription,\n subscriptionHistory: input.subscriptionHistory,\n products: input.products,\n orderHistory: input.orderHistory,\n paymentHistory: input.paymentHistory,\n availablePlans: filterBillingPurchasableItems(\n input.runtimeConfig?.items?.filter((item) => item.kind === 'subscription'),\n input.runtimeConfig ?? input.runtimeCatalog,\n ),\n availableProducts: filterBillingPurchasableItems(\n input.runtimeConfig?.items?.filter((item) => item.kind === 'product'),\n input.runtimeConfig ?? input.runtimeCatalog,\n ),\n credits: input.credits,\n entitlements: input.entitlements,\n purchaseStatus: input.purchaseStatus,\n purchaseHooks: input.purchaseHooks,\n status: input.status,\n refresh: input.refresh,\n runAction: input.runAction,\n setRuntimeConfig: input.setRuntimeConfig,\n setSubscription: input.setSubscription,\n setSubscriptionHistory: input.setSubscriptionHistory,\n setProducts: input.setProducts,\n setOrderHistory: input.setOrderHistory,\n setPaymentHistory: input.setPaymentHistory,\n setCredits: input.setCredits,\n setEntitlements: input.setEntitlements,\n setPurchaseStatus: input.setPurchaseStatus,\n setStatus: input.setStatus,\n };\n}\n\nexport function BillingProvider({\n children,\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig: runtimeConfigProp,\n subscription: subscriptionProp,\n subscriptionHistory: subscriptionHistoryProp,\n products: productsProp,\n orderHistory: orderHistoryProp,\n paymentHistory: paymentHistoryProp,\n credits: creditsProp,\n entitlements: entitlementsProp,\n status: statusProp,\n purchaseStatus: purchaseStatusProp,\n purchaseHooks,\n autoRefresh = true,\n}: BillingProviderProps) {\n const [runtimeConfig, setRuntimeConfig] = useState<BillingRuntimeConfig | undefined>(normalizeRuntimeConfigInput(runtimeConfigProp));\n const [runtimeCatalog, setRuntimeCatalog] = useState<BillingCatalogConfig | undefined>(normalizeCatalogConfigInput(runtimeConfigProp));\n const [runtimeConfigLoading, setRuntimeConfigLoading] = useState(false);\n const [runtimeConfigError, setRuntimeConfigError] = useState<string | null>(null);\n const [subscription, setSubscription] = useState<BillingSubscriptionState | undefined>(subscriptionProp);\n const [subscriptionHistory, setSubscriptionHistory] = useState<BillingSubscriptionHistoryItem[] | undefined>(subscriptionHistoryProp);\n const [products, setProducts] = useState<BillingProductState[] | undefined>(productsProp);\n const [orderHistory, setOrderHistory] = useState<BillingOrderHistoryItem[] | undefined>(orderHistoryProp);\n const [paymentHistory, setPaymentHistory] = useState<BillingPaymentHistoryItem[] | undefined>(paymentHistoryProp);\n const [credits, setCredits] = useState<BillingCreditsState | undefined>(creditsProp);\n const [entitlements, setEntitlements] = useState<BillingEntitlementState | undefined>(entitlementsProp);\n const [purchaseStatus, setPurchaseStatus] = useState<BillingPurchaseStatus | undefined>(purchaseStatusProp);\n const [status, setStatus] = useState<BillingStatusState>(\n statusProp ?? { loading: false, refreshing: false, error: null },\n );\n\n useEffect(() => {\n if (runtimeConfigProp) {\n setRuntimeConfig(normalizeRuntimeConfigInput(runtimeConfigProp));\n setRuntimeCatalog(normalizeCatalogConfigInput(runtimeConfigProp));\n }\n }, [runtimeConfigProp]);\n\n useEffect(() => {\n if (subscriptionProp) setSubscription(subscriptionProp);\n }, [subscriptionProp]);\n\n useEffect(() => {\n if (subscriptionHistoryProp) setSubscriptionHistory(subscriptionHistoryProp);\n }, [subscriptionHistoryProp]);\n\n useEffect(() => {\n if (productsProp) setProducts(productsProp);\n }, [productsProp]);\n\n useEffect(() => {\n if (orderHistoryProp) setOrderHistory(orderHistoryProp);\n }, [orderHistoryProp]);\n\n useEffect(() => {\n if (paymentHistoryProp) setPaymentHistory(paymentHistoryProp);\n }, [paymentHistoryProp]);\n\n useEffect(() => {\n if (creditsProp) setCredits(creditsProp);\n }, [creditsProp]);\n\n useEffect(() => {\n if (entitlementsProp) setEntitlements(entitlementsProp);\n }, [entitlementsProp]);\n\n useEffect(() => {\n if (purchaseStatusProp) setPurchaseStatus(purchaseStatusProp);\n }, [purchaseStatusProp]);\n\n useEffect(() => {\n if (statusProp) setStatus(statusProp);\n }, [statusProp]);\n\n const refresh = useCallback(async () => {\n const catalogKey = runtimeCatalog?.catalogKey ?? runtimeConfig?.catalogKey ?? 'default';\n const runtimeLoader = runtimeConfigLoader ?? apiClient.fetchRuntimeConfig;\n const resolvedLoaders = loaders ?? {};\n const subscriptionLoader = resolvedLoaders.subscriptionLoader ?? apiClient.fetchSubscription;\n const subscriptionHistoryLoader = resolvedLoaders.subscriptionHistoryLoader ?? apiClient.fetchSubscriptionHistory;\n const productsLoader = resolvedLoaders.productsLoader ?? apiClient.fetchProducts;\n const orderHistoryLoader = resolvedLoaders.orderHistoryLoader ?? apiClient.fetchOrderHistory;\n const paymentHistoryLoader = resolvedLoaders.paymentHistoryLoader ?? apiClient.fetchPaymentHistory;\n const purchaseStatusLoader = resolvedLoaders.purchaseStatusLoader ?? apiClient.fetchPurchaseStatus;\n const creditsLoader = resolvedLoaders.creditsLoader ?? apiClient.fetchCredits;\n const entitlementsLoader = resolvedLoaders.entitlementsLoader ?? apiClient.fetchEntitlements;\n\n setRuntimeConfigLoading(true);\n setRuntimeConfigError(null);\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n const nextRuntimeCatalog = normalizeCatalogConfigInput(await runtimeLoader(catalogKey));\n const nextRuntimeConfig = nextRuntimeCatalog ? normalizeRuntimeConfigInput(nextRuntimeCatalog) : undefined;\n if (nextRuntimeConfig) {\n setRuntimeCatalog(nextRuntimeCatalog);\n setRuntimeConfig(nextRuntimeConfig);\n }\n\n const nextCatalogKey = nextRuntimeConfig?.catalogKey ?? nextRuntimeCatalog?.catalogKey ?? catalogKey;\n\n const [\n nextSubscription,\n nextSubscriptionHistory,\n nextProducts,\n nextOrderHistory,\n nextPaymentHistory,\n nextCredits,\n nextEntitlements,\n ] = await Promise.all([\n subscriptionLoader({ catalogKey: nextCatalogKey }),\n subscriptionHistoryLoader({ catalogKey: nextCatalogKey }),\n productsLoader({ catalogKey: nextCatalogKey }),\n orderHistoryLoader({ catalogKey: nextCatalogKey }),\n paymentHistoryLoader({ catalogKey: nextCatalogKey }),\n creditsLoader({ catalogKey: nextCatalogKey }),\n entitlementsLoader({ catalogKey: nextCatalogKey }),\n ]);\n\n const subscriptionWithProduct = nextSubscription\n ? {\n ...nextSubscription,\n product: resolveBillingSubscriptionProduct(nextSubscription, nextRuntimeConfig ?? runtimeConfig),\n }\n : undefined;\n const normalizedCredits = deriveBillingCreditsState(nextCredits, nextProducts, nextRuntimeConfig?.conversionRules ?? runtimeConfig?.conversionRules);\n const normalizedEntitlements = nextEntitlements ?? deriveBillingEntitlements(subscriptionWithProduct, nextProducts, normalizedCredits, nextRuntimeConfig ?? runtimeConfig);\n const latestOrder = getLatestOrder(nextOrderHistory);\n const latestPayment = getLatestPayment(nextPaymentHistory);\n const fetchedPurchaseStatus = await purchaseStatusLoader({\n orderId: latestOrder?.orderId,\n paymentId: latestPayment?.paymentId,\n transactionId: latestPayment?.transactionId ?? latestOrder?.transactionId,\n }).catch(() => undefined);\n const normalizedPurchaseStatus = normalizeBillingPurchaseStatus(\n fetchedPurchaseStatus,\n latestOrder,\n latestPayment,\n );\n\n setSubscription(subscriptionWithProduct);\n setSubscriptionHistory(nextSubscriptionHistory);\n setProducts(nextProducts);\n setOrderHistory(nextOrderHistory);\n setPaymentHistory(nextPaymentHistory);\n setCredits(normalizedCredits);\n setEntitlements(normalizedEntitlements);\n setPurchaseStatus(normalizedPurchaseStatus);\n setStatus({ loading: false, refreshing: false, error: null, lastFetchedAt: new Date().toISOString() });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setRuntimeConfigError(message);\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n } finally {\n setRuntimeConfigLoading(false);\n }\n }, [apiClient, loaders, runtimeConfig, runtimeConfigLoader, runtimeCatalog]);\n\n const runAction = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = buildBillingActionPayload(payload, runtimeConfig);\n const executor = actionExecutor ?? ((input: BillingActionPayload) => apiClient.createAction(input));\n const isPurchaseFlow = prepared.kind === 'purchase' || prepared.kind === 'subscribe';\n const purchasable = isPurchaseFlow\n ? resolveBillingPurchasable(runtimeConfig, prepared.key) ?? resolveBillingPurchasable(runtimeConfig, prepared.productId)\n : undefined;\n const purchaseRequest = isPurchaseFlow ? buildBillingPurchaseRequest(prepared, runtimeConfig) : null;\n\n if (isPurchaseFlow && !purchasable) {\n throw new Error(`Billing item \"${prepared.key}\" is not purchasable in the current runtime config.`);\n }\n\n await runPurchaseHook('onPurchaseStart', purchaseHooks?.onPurchaseStart, purchaseRequest ?? undefined);\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'pending',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n let result: BillingActionExecutionResult;\n let usedCasdoorPurchaseFlow = false;\n if (isPurchaseFlow && purchaseRequest) {\n const casdoorResult = await runCasdoorProductPurchase(\n purchaseRequest as NonNullable<ReturnType<typeof buildBillingPurchaseRequest>>,\n apiClient,\n loaders,\n );\n if (casdoorResult) {\n result = casdoorResult;\n usedCasdoorPurchaseFlow = true;\n } else {\n result = await executor(prepared);\n }\n } else {\n result = await executor(prepared);\n }\n\n if (result.status === 'failed') {\n await runPurchaseHook(\n 'onPurchaseError',\n purchaseHooks?.onPurchaseError,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n status: 'failed',\n message: result.message ?? 'Purchase failed.',\n errorCode: result.errorCode,\n redirectTo: result.redirectTo ?? null,\n rawResult: result.rawResult ?? result,\n }\n : undefined,\n );\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: result.orderId ?? current?.orderId,\n paymentId: result.paymentId ?? current?.paymentId,\n transactionId: result.transactionId ?? current?.transactionId,\n status: 'failed',\n redirectTo: result.redirectTo ?? current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({\n ...current,\n loading: false,\n refreshing: false,\n error: result.message ?? current.error ?? 'Purchase failed.',\n }));\n\n await runPurchaseHook(\n 'onPurchaseComplete',\n purchaseHooks?.onPurchaseComplete,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n status: 'failed',\n redirectTo: result.redirectTo ?? null,\n }\n : undefined,\n );\n\n await refresh();\n return result;\n }\n\n await runPurchaseHook(\n 'onOrderCreated',\n purchaseHooks?.onOrderCreated,\n purchaseRequest && purchasable\n ? {\n request: purchaseRequest,\n purchasable,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n redirectTo: result.redirectTo ?? null,\n rawResult: result.rawResult ?? result,\n }\n : undefined,\n );\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status:\n usedCasdoorPurchaseFlow && result.status !== 'failed'\n ? 'requires_payment'\n : result.status === 'failed'\n ? 'failed'\n : result.status === 'succeeded'\n ? 'paid'\n : 'pending',\n redirectTo: result.redirectTo ?? current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n if (result.redirectTo || result.nextAction) {\n // host handles the redirect/next action, we only persist the result\n }\n\n await runPurchaseHook(\n 'onPurchaseComplete',\n purchaseHooks?.onPurchaseComplete,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n status: 'succeeded',\n redirectTo: result.redirectTo ?? null,\n }\n : undefined,\n );\n\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await runPurchaseHook(\n 'onPurchaseError',\n purchaseHooks?.onPurchaseError,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: null,\n paymentId: null,\n status: 'failed',\n message,\n redirectTo: null,\n rawResult: error,\n }\n : undefined,\n );\n await runPurchaseHook(\n 'onPurchaseComplete',\n purchaseHooks?.onPurchaseComplete,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: null,\n paymentId: null,\n status: 'failed',\n redirectTo: null,\n }\n : undefined,\n );\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'failed',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n throw error;\n }\n },\n [actionExecutor, apiClient, loaders, purchaseHooks, refresh, runtimeConfig],\n );\n\n useEffect(() => {\n if (!autoRefresh) return;\n if (runtimeConfigLoading) return;\n if (!runtimeConfig && !runtimeConfigError) {\n void refresh();\n }\n }, [autoRefresh, refresh, runtimeConfig, runtimeConfigError, runtimeConfigLoading]);\n\n const coreValue = useMemo(\n () =>\n buildCoreValue({\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig,\n runtimeCatalog,\n runtimeConfigLoading,\n runtimeConfigError,\n subscription,\n subscriptionHistory,\n products,\n orderHistory,\n paymentHistory,\n credits,\n entitlements,\n purchaseStatus,\n purchaseHooks,\n status,\n refresh,\n runAction,\n setRuntimeConfig,\n setSubscription,\n setSubscriptionHistory,\n setProducts,\n setOrderHistory,\n setPaymentHistory,\n setCredits,\n setEntitlements,\n setPurchaseStatus,\n setStatus,\n }),\n [\n actionExecutor,\n apiClient,\n credits,\n defaults,\n entitlements,\n orderHistory,\n paymentHistory,\n products,\n purchaseStatus,\n purchaseHooks,\n refresh,\n runAction,\n runtimeConfig,\n runtimeConfigError,\n runtimeConfigLoader,\n runtimeConfigLoading,\n runtimeCatalog,\n loaders,\n status,\n subscription,\n subscriptionHistory,\n ],\n );\n\n return (\n <BillingCoreContext.Provider value={coreValue}>\n <SubscriptionProvider subscription={subscription} subscriptionHistory={subscriptionHistory} entitlements={entitlements} status={status}>\n <ProductProvider products={products} orderHistory={orderHistory} paymentHistory={paymentHistory} status={status}>\n <CreditsProvider credits={credits} status={status}>{children}</CreditsProvider>\n </ProductProvider>\n </SubscriptionProvider>\n </BillingCoreContext.Provider>\n );\n}\n\nexport function BillingCoreProvider(props: BillingCoreProviderProps) {\n return <BillingProvider {...props} />;\n}\n\nexport function SubscriptionProvider({\n children,\n availablePlans,\n subscription,\n subscriptionHistory,\n entitlements,\n status,\n}: BillingSubscriptionProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const runtimeConfig = core?.runtimeConfig ?? core?.runtimeCatalog;\n const visiblePlans = choose(availablePlans, core?.availablePlans);\n const value = useMemo<BillingSubscriptionContextValue>(\n () => ({\n availablePlans: choose(\n visiblePlans ? filterBillingPurchasableItems(visiblePlans, runtimeConfig) : undefined,\n filterBillingPurchasableItems(core?.runtimeConfig?.items?.filter((item) => item.kind === 'subscription'), runtimeConfig),\n ),\n subscription: choose(subscription, core?.subscription),\n subscriptionHistory: choose(subscriptionHistory, core?.subscriptionHistory),\n entitlements: choose(entitlements, core?.entitlements),\n status: choose(status, core?.status),\n }),\n [availablePlans, core?.availablePlans, core?.entitlements, core?.runtimeCatalog, core?.runtimeConfig, core?.status, core?.subscription, core?.subscriptionHistory, entitlements, runtimeConfig, status, subscription, subscriptionHistory, visiblePlans],\n );\n\n return <BillingSubscriptionContext.Provider value={value}>{children}</BillingSubscriptionContext.Provider>;\n}\n\nexport function ProductProvider({\n children,\n availableProducts,\n products,\n orderHistory,\n paymentHistory,\n status,\n}: BillingProductProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const runtimeConfig = core?.runtimeConfig ?? core?.runtimeCatalog;\n const visibleProducts = choose(availableProducts, core?.availableProducts);\n const value = useMemo<BillingProductContextValue>(\n () => ({\n availableProducts: choose(\n visibleProducts ? filterBillingPurchasableItems(visibleProducts, runtimeConfig) : undefined,\n filterBillingPurchasableItems(core?.runtimeConfig?.items?.filter((item) => item.kind === 'product'), runtimeConfig),\n ),\n products: choose(products, core?.products),\n orderHistory: choose(orderHistory, core?.orderHistory),\n paymentHistory: choose(paymentHistory, core?.paymentHistory),\n status: choose(status, core?.status),\n }),\n [availableProducts, core?.availableProducts, core?.orderHistory, core?.paymentHistory, core?.products, core?.runtimeCatalog, core?.runtimeConfig, core?.status, orderHistory, paymentHistory, products, runtimeConfig, status, visibleProducts],\n );\n\n return <BillingProductContext.Provider value={value}>{children}</BillingProductContext.Provider>;\n}\n\nexport function CreditsProvider({ children, credits, status }: BillingCreditsProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingCreditsContextValue>(\n () => ({\n credits: choose(credits, core?.credits),\n status: choose(status, core?.status),\n }),\n [credits, core?.credits, core?.status, status],\n );\n\n return <BillingCreditsContext.Provider value={value}>{children}</BillingCreditsContext.Provider>;\n}\n\nexport interface BillingCatalogState {\n catalog?: BillingRuntimeConfig | BillingCatalogConfig;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingContext(): BillingCoreContextValue {\n return useRequiredCoreContext();\n}\n\nexport function useBillingCatalog(): BillingCatalogState {\n const core = useRequiredCoreContext();\n return useMemo(\n () => ({\n catalog: core.runtimeCatalog ?? core.runtimeConfig,\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeCatalog, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading],\n );\n}\n\nexport interface BillingItemState {\n item?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingItem(itemKey: string): BillingItemState {\n const core = useRequiredCoreContext();\n return useMemo(() => {\n const item = resolveBillingItem(core.runtimeConfig?.items, itemKey);\n return {\n item: resolveBillingProductSnapshot(item),\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n };\n }, [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, itemKey]);\n}\n\nexport interface BillingProductDetailState {\n product?: BillingCasdoorProductDetail;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProductDetail(productId: string): BillingProductDetailState {\n const core = useRequiredCoreContext();\n const productLoader = core.loaders?.productLoader ?? core.apiClient.fetchProduct;\n const [product, setProduct] = useState<BillingCasdoorProductDetail | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!productLoader || !productId) {\n setProduct(undefined);\n setError(productId ? 'Missing Casdoor product loader.' : null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const response = await productLoader({ id: productId });\n const detail = extractCasdoorResponseData<BillingCasdoorProductDetail>(response);\n setProduct(detail);\n setError(null);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setProduct(undefined);\n setError(message);\n } finally {\n setLoading(false);\n }\n }, [productId, productLoader]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return useMemo(\n () => ({\n product,\n loading: loading || core.runtimeConfigLoading || core.status.loading,\n error: error ?? core.runtimeConfigError ?? core.status.error,\n refresh,\n }),\n [core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, error, loading, product, refresh],\n );\n}\n\nexport interface BillingProductPurchaseOptionsState {\n product?: BillingCasdoorProductDetail;\n providers: BillingCasdoorProductDetail['providers'];\n providerObjs: BillingCasdoorProductDetail['providerObjs'];\n providerName?: string;\n selectedProvider?: NonNullable<BillingCasdoorProductDetail['providerObjs']>[number];\n setProviderName: (providerName?: string) => void;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProductPurchaseOptions(productId: string, preferredProviderName?: string): BillingProductPurchaseOptionsState {\n const detailState = useBillingProductDetail(productId);\n const [providerName, setProviderName] = useState<string | undefined>(preferredProviderName);\n\n useEffect(() => {\n if (preferredProviderName) {\n setProviderName(preferredProviderName);\n return;\n }\n\n const product = detailState.product;\n const fallbackProvider = product?.providers?.[0] ?? product?.providerObjs?.[0]?.name;\n if (!providerName || (product && !product.providers?.includes(providerName) && !product.providerObjs?.some((item) => item.name === providerName))) {\n setProviderName(fallbackProvider);\n }\n }, [detailState.product, preferredProviderName, providerName]);\n\n return useMemo(\n () => ({\n product: detailState.product,\n providers: detailState.product?.providers ?? [],\n providerObjs: detailState.product?.providerObjs ?? [],\n providerName,\n selectedProvider: detailState.product?.providerObjs?.find((item) => item.name === providerName),\n setProviderName,\n loading: detailState.loading,\n error: detailState.error,\n refresh: detailState.refresh,\n }),\n [detailState.error, detailState.loading, detailState.product, detailState.refresh, providerName],\n );\n}\n\nexport interface BillingProductsState {\n products: BillingProductState[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProducts(): BillingProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const products = choose(productContext?.products, core.products) ?? [];\n return useMemo(\n () => ({\n products,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, products],\n );\n}\n\nexport interface BillingAvailablePlansState {\n plans: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailablePlans(): BillingAvailablePlansState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const plans = choose(subscriptionContext?.availablePlans, core.availablePlans) ?? [];\n return useMemo(\n () => ({\n plans,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.availablePlans, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, plans],\n );\n}\n\nexport interface BillingAvailableProductsState {\n items: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailableProducts(): BillingAvailableProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const items = choose(productContext?.availableProducts, core.availableProducts) ?? [];\n return useMemo(\n () => ({\n items,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.availableProducts, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, items],\n );\n}\n\nexport interface BillingOrderHistoryState {\n orders: BillingOrderHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingOrderHistory(_options: { userId?: string; catalogKey?: string; productKey?: string } = {}): BillingOrderHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const orders = choose(productContext?.orderHistory, core.orderHistory) ?? [];\n return useMemo(\n () => ({\n orders,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, orders],\n );\n}\n\nexport interface BillingPaymentHistoryState {\n payments: BillingPaymentHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPaymentHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingPaymentHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const payments = choose(productContext?.paymentHistory, core.paymentHistory) ?? [];\n return useMemo(\n () => ({\n payments,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, payments],\n );\n}\n\nexport interface BillingSubscriptionStateView {\n subscription?: BillingSubscriptionState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscription(): BillingSubscriptionStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n return useMemo(\n () => ({\n subscription: choose(subscriptionContext?.subscription, core.subscription),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, core.subscription, subscriptionContext?.subscription],\n );\n}\n\nexport interface BillingSubscriptionProductState {\n product?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionProduct(): BillingSubscriptionProductState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const subscription = choose(subscriptionContext?.subscription, core.subscription);\n return useMemo(\n () => ({\n product: subscription?.product ?? resolveBillingSubscriptionProduct(subscription, core.runtimeConfig),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, subscription],\n );\n}\n\nexport interface BillingSubscriptionHistoryState {\n history: BillingSubscriptionHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingSubscriptionHistoryState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const history = choose(subscriptionContext?.subscriptionHistory, core.subscriptionHistory) ?? [];\n return useMemo(\n () => ({\n history,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, history],\n );\n}\n\nexport interface BillingCreditsStateView {\n credits?: BillingCreditsState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingCredits(): BillingCreditsStateView {\n const core = useRequiredCoreContext();\n const creditsContext = useOptionalContext(BillingCreditsContext);\n const credits = choose(creditsContext?.credits, core.credits) ?? deriveBillingCreditsState(undefined, core.products, core.runtimeConfig?.conversionRules);\n return useMemo(\n () => ({\n credits,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.conversionRules, core.runtimeConfigError, core.runtimeConfigLoading, core.products, core.status.error, core.status.loading, credits],\n );\n}\n\nexport interface BillingEntitlementsStateView {\n entitlements?: BillingEntitlementState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingEntitlements(): BillingEntitlementsStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const entitlements =\n choose(subscriptionContext?.entitlements, core.entitlements) ??\n deriveBillingEntitlements(subscriptionContext?.subscription ?? core.subscription, core.products, core.credits, core.runtimeConfig);\n return useMemo(\n () => ({\n entitlements,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.credits, core.products, core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, entitlements, subscriptionContext?.subscription, core.subscription],\n );\n}\n\nexport interface BillingPurchaseStatusView {\n purchaseStatus?: BillingPurchaseStatus;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPurchaseStatus(): BillingPurchaseStatusView {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const order = getLatestOrder(choose(productContext?.orderHistory, core.orderHistory));\n const payment = getLatestPayment(choose(productContext?.paymentHistory, core.paymentHistory));\n const purchaseStatus = core.purchaseStatus ?? normalizeBillingPurchaseStatus(undefined, order, payment);\n return useMemo(\n () => ({\n purchaseStatus,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.purchaseStatus, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, order, payment, purchaseStatus],\n );\n}\n\nexport interface BillingStatusView {\n status: BillingStatusState;\n}\n\nexport function useBillingStatus(): BillingStatusView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ status: core.status }), [core.status]);\n}\n\nexport interface BillingRefreshView {\n refresh: () => Promise<void>;\n}\n\nexport function useBillingRefresh(): BillingRefreshView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ refresh: core.refresh }), [core.refresh]);\n}\n\nexport interface BillingPipelineResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n purchaseStatus?: BillingPurchaseStatus;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPipeline(options: BillingPipelineOptions = {}): BillingPipelineResult {\n const core = useRequiredCoreContext();\n const purchaseStatusView = useBillingPurchaseStatus();\n\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = options.onBeforeAction ? await options.onBeforeAction(payload) : payload;\n try {\n const result = await core.runAction(prepared);\n if (options.onAfterAction) {\n await options.onAfterAction({ redirectTo: result.redirectTo, nextAction: result.nextAction });\n }\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n }\n throw error;\n }\n },\n [core, options],\n );\n\n return useMemo(\n () => ({\n run,\n loading: core.status.loading || core.runtimeConfigLoading,\n error: core.status.error ?? core.runtimeConfigError,\n purchaseStatus: purchaseStatusView.purchaseStatus,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, purchaseStatusView.purchaseStatus, run],\n );\n}\n\nexport interface BillingActionHookResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n}\n\nfunction useBillingActionRunner(kind: BillingActionKind, defaults?: Partial<BillingActionPayload>): BillingActionHookResult {\n const pipeline = useBillingPipeline();\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n await pipeline.run({\n ...defaults,\n ...payload,\n kind,\n });\n },\n [defaults, kind, pipeline],\n );\n\n return useMemo(\n () => ({\n run,\n loading: pipeline.loading,\n error: pipeline.error,\n }),\n [pipeline.error, pipeline.loading, run],\n );\n}\n\nexport function useSubscribePlan(): BillingActionHookResult {\n return useBillingActionRunner('subscribe');\n}\n\nexport function useManageSubscription(): BillingActionHookResult {\n return useBillingActionRunner('manage');\n}\n\nexport function useUpgradePlan(): BillingActionHookResult {\n return useBillingActionRunner('upgrade');\n}\n\nexport function useCancelSubscription(): BillingActionHookResult {\n return useBillingActionRunner('cancel');\n}\n\nexport function usePurchaseProduct(): BillingActionHookResult {\n return useBillingActionRunner('purchase');\n}\n\nexport interface BillingProductStateView {\n product?: BillingProductState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProduct(productKey: string): BillingProductStateView {\n const productsState = useBillingProducts();\n const product = productsState.products.find((item) => item.productKey === productKey);\n return useMemo(\n () => ({\n product,\n loading: productsState.loading,\n error: productsState.error,\n refresh: productsState.refresh,\n }),\n [product, productsState.error, productsState.loading, productsState.refresh],\n );\n}\n\nexport function useBillingCatalogConfig(): BillingCatalogState {\n return useBillingCatalog();\n}\n"],"mappings":"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","names":["jsx"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/provider.tsx","../../src/react/hooks.ts","../../src/billing/react.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { Session } from 'next-auth';\nimport { SessionProvider } from 'next-auth/react';\n\nexport function AuthProvider({\n children,\n session,\n}: {\n children: ReactNode;\n session?: Session | null;\n}) {\n return <SessionProvider session={session}>{children}</SessionProvider>;\n}\n","'use client';\n\nimport { useSession } from 'next-auth/react';\nimport { buildAuthJumpHref } from '../core/redirect';\nimport type { AuthSession } from '../next/options';\n\nexport type AuthRole = 'guest' | 'user' | 'admin';\n\nexport interface AuthUserSummary {\n id: string | null;\n name: string;\n email: string | null;\n image: string | null;\n isAuthenticated: boolean;\n isAdmin: boolean;\n tokenBalance: number;\n isVip: boolean;\n role: AuthRole;\n}\n\nexport interface AuthActions {\n loginHref: string;\n signupHref: string;\n logoutHref: string;\n accountHref: string;\n adminHref: string;\n}\n\nexport interface AuthActionsOptions {\n redirect?: string | null;\n}\n\nfunction getUserSummary(session: AuthSession | null | undefined): AuthUserSummary {\n const user = session?.user;\n const name = user?.name || '登录';\n const isAuthenticated = Boolean(user);\n const isAdmin = Boolean(user?.isAdmin);\n const role: AuthRole = !isAuthenticated ? 'guest' : isAdmin ? 'admin' : 'user';\n\n return {\n id: user?.id ?? null,\n name,\n email: user?.email ?? null,\n image: user?.image ?? null,\n isAuthenticated,\n isAdmin,\n tokenBalance: Number(user?.tokenBalance ?? 2580),\n isVip: Boolean(user?.isVip ?? true),\n role,\n };\n}\n\nexport function useAuthSession() {\n return useSession() as ReturnType<typeof useSession> & {\n data: AuthSession | null | undefined;\n };\n}\n\nexport function useAuthUser(): AuthUserSummary {\n const { data: session } = useAuthSession();\n return getUserSummary(session ?? null);\n}\n\nexport function useAuthRole(): AuthRole {\n return useAuthUser().role;\n}\n\nexport function useAuthActions(options: AuthActionsOptions = {}): AuthActions {\n const user = useAuthUser();\n const redirect = options.redirect ?? null;\n\n return {\n loginHref: buildAuthJumpHref('login', redirect ?? undefined),\n signupHref: buildAuthJumpHref('signup', redirect ?? undefined),\n logoutHref: '/logout',\n accountHref: '/user/account',\n adminHref: '/admin',\n };\n}\n","'use client';\n\nimport {\n type Context,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport {\n buildBillingActionPayload,\n buildBillingPurchaseRequest,\n deriveBillingCreditsState,\n deriveBillingEntitlements,\n filterBillingPurchasableItems,\n normalizeCasdoorOrderHistoryItem,\n normalizeCasdoorPaymentHistoryItem,\n normalizeCasdoorSubscriptionDetail,\n normalizeCasdoorSubscriptionHistoryItem,\n normalizeBillingPurchaseStatus,\n normalizeBillingCatalogConfig,\n normalizeBillingRuntimeConfig,\n resolveBillingItem,\n resolveBillingPurchasable,\n resolveBillingProductSnapshot,\n resolveBillingSubscriptionProduct,\n} from './runtime';\nimport {\n buildCasdoorBuyProductRequest,\n normalizeCasdoorBuyProductResponse,\n normalizeCasdoorProductId,\n} from './casdoor-purchase.js';\nimport type {\n BillingActionExecutor,\n BillingActionKind,\n BillingActionExecutionResult,\n BillingActionPayload,\n BillingApiClient,\n BillingCatalogConfig,\n BillingCasdoorBuyProductRequest,\n BillingCasdoorOrderDetail,\n BillingCasdoorOrdersResponse,\n BillingCasdoorPlanDetail,\n BillingCasdoorPricingDetail,\n BillingCasdoorProductDetail,\n BillingCasdoorQueryState,\n BillingCasdoorSubscriptionDetail,\n BillingCasdoorSubscriptionsResponse,\n BillingCoreContextValue,\n BillingCreditsContextValue,\n BillingCreditsState,\n BillingDefaults,\n BillingEntitlementState,\n BillingLoaders,\n BillingOrderHistoryItem,\n BillingPaymentHistoryItem,\n BillingItem,\n BillingProductState,\n BillingProductContextValue,\n BillingProductSnapshot,\n BillingPurchaseHooks,\n BillingPurchaseStatus,\n BillingRuntimeConfig,\n BillingStatusState,\n BillingSubscriptionContextValue,\n BillingSubscriptionHistoryItem,\n BillingSubscriptionState,\n} from './types';\n\nexport interface BillingProviderProps {\n children: ReactNode;\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n purchaseStatus?: BillingPurchaseStatus;\n purchaseHooks?: BillingPurchaseHooks;\n autoRefresh?: boolean;\n}\n\nexport type BillingCoreProviderProps = BillingProviderProps;\nexport interface BillingSubscriptionProviderProps {\n children: ReactNode;\n availablePlans?: BillingItem[];\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n entitlements?: BillingEntitlementState;\n status?: BillingStatusState;\n}\n\nexport interface BillingProductProviderProps {\n children: ReactNode;\n availableProducts?: BillingItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n status?: BillingStatusState;\n}\n\nexport interface BillingCreditsProviderProps {\n children: ReactNode;\n credits?: BillingCreditsState;\n status?: BillingStatusState;\n}\n\nexport interface BillingPipelineOptions {\n onBeforeAction?: (payload: BillingActionPayload) => Promise<BillingActionPayload>;\n onAfterAction?: (result: { redirectTo?: string; nextAction?: string }) => Promise<void>;\n onError?: (error: unknown) => Promise<void>;\n}\n\nconst BillingCoreContext = createContext<BillingCoreContextValue | null>(null);\nconst BillingSubscriptionContext = createContext<BillingSubscriptionContextValue | null>(null);\nconst BillingProductContext = createContext<BillingProductContextValue | null>(null);\nconst BillingCreditsContext = createContext<BillingCreditsContextValue | null>(null);\n\nfunction useOptionalContext<T>(context: Context<T | null>): T | null {\n return useContext(context);\n}\n\nfunction useRequiredCoreContext(): BillingCoreContextValue {\n const context = useContext(BillingCoreContext);\n if (!context) {\n throw new Error('Billing hooks must be used inside BillingProvider or BillingCoreProvider.');\n }\n return context;\n}\n\nfunction choose<T>(primary: T | undefined, fallback: T | undefined): T | undefined {\n return primary ?? fallback;\n}\n\nasync function runPurchaseHook<T>(\n name: string,\n hook: ((context: T) => void | Promise<void>) | undefined,\n context: T | undefined,\n): Promise<void> {\n if (!hook || context === undefined) {\n return;\n }\n\n try {\n await hook(context);\n } catch (error) {\n console.error(`[casdoor-next-auth-kit] billing ${name} hook failed`, error);\n }\n}\n\nfunction getLatestOrder(orders: BillingOrderHistoryItem[] | undefined): BillingOrderHistoryItem | undefined {\n return [...(orders ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction getLatestPayment(payments: BillingPaymentHistoryItem[] | undefined): BillingPaymentHistoryItem | undefined {\n return [...(payments ?? [])].sort((a, b) => {\n const left = Date.parse(b.updatedAt ?? b.createdAt ?? '') || 0;\n const right = Date.parse(a.updatedAt ?? a.createdAt ?? '') || 0;\n return left - right;\n })[0];\n}\n\nfunction extractCasdoorResponseData<TData>(response: { data?: TData } | TData | undefined): TData | undefined {\n if (!response) return undefined;\n if (typeof response === 'object' && response !== null && 'data' in response) {\n return (response as { data?: TData }).data;\n }\n return response as TData;\n}\n\nfunction useBillingCasdoorQuery<TData, TArgs extends Record<string, unknown>>(\n loader: ((args: TArgs) => Promise<{ data?: TData } | TData>) | undefined,\n buildArgs: () => TArgs,\n deps: readonly unknown[],\n missingLoaderMessage: string,\n): BillingCasdoorQueryState<TData> {\n const [data, setData] = useState<TData | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!loader) {\n setData(undefined);\n setError(missingLoaderMessage);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const response = await loader(buildArgs());\n const extracted = extractCasdoorResponseData<TData>(response);\n setData(extracted);\n setError(null);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setData(undefined);\n setError(message);\n } finally {\n setLoading(false);\n }\n }, [buildArgs, loader, missingLoaderMessage]);\n\n useEffect(() => {\n void refresh();\n }, [refresh, ...deps]);\n\n return useMemo(\n () => ({\n data,\n loading,\n error,\n refresh,\n }),\n [data, error, loading, refresh],\n );\n}\n\nfunction pickCurrentCasdoorSubscription(records: BillingCasdoorSubscriptionDetail[]): BillingCasdoorSubscriptionDetail | undefined {\n if (!records.length) return undefined;\n const active = records.find((record) => {\n const status = (record.state ?? '').toLowerCase();\n return status.includes('active') || status.includes('trial');\n });\n if (active) return active;\n return [...records].sort((left, right) => {\n const leftTime = Date.parse(left.endTime ?? left.createdTime ?? '') || 0;\n const rightTime = Date.parse(right.endTime ?? right.createdTime ?? '') || 0;\n return rightTime - leftTime;\n })[0];\n}\n\nfunction pickLatestCasdoorOrder(records: BillingCasdoorOrderDetail[]): BillingCasdoorOrderDetail | undefined {\n if (!records.length) return undefined;\n return [...records].sort((left, right) => {\n const leftTime = Date.parse((left as { updatedTime?: string }).updatedTime ?? left.createdTime ?? '') || 0;\n const rightTime = Date.parse((right as { updatedTime?: string }).updatedTime ?? right.createdTime ?? '') || 0;\n return rightTime - leftTime;\n })[0];\n}\n\nasync function runCasdoorProductPurchase(\n purchaseRequest: NonNullable<ReturnType<typeof buildBillingPurchaseRequest>>,\n apiClient: BillingApiClient,\n loaders: BillingLoaders | undefined,\n): Promise<BillingActionExecutionResult | null> {\n const buyProductLoader = loaders?.buyProductLoader ?? apiClient.buyProduct;\n if (!buyProductLoader) {\n return null;\n }\n\n const productLoader = loaders?.productLoader ?? apiClient.fetchProduct;\n const organizationNamesLoader = loaders?.organizationNamesLoader ?? apiClient.fetchOrganizationNames;\n\n let productDetail: BillingCasdoorProductDetail | undefined;\n if (productLoader) {\n const productResponse = await productLoader({ id: purchaseRequest.productId }).catch(() => undefined);\n productDetail = extractCasdoorResponseData<BillingCasdoorProductDetail>(productResponse);\n }\n\n if (!productDetail) {\n if (purchaseRequest.productOwner && purchaseRequest.productName) {\n productDetail = {\n owner: purchaseRequest.productOwner,\n name: purchaseRequest.productName,\n };\n } else {\n try {\n const normalized = normalizeCasdoorProductId(purchaseRequest.productId);\n productDetail = {\n owner: normalized.owner,\n name: normalized.name,\n };\n } catch {\n return null;\n }\n }\n }\n\n if (organizationNamesLoader && productDetail.owner) {\n const organizationResponse = await organizationNamesLoader({ owner: productDetail.owner }).catch(() => undefined);\n void extractCasdoorResponseData(organizationResponse);\n }\n\n const buyRequest: BillingCasdoorBuyProductRequest = buildCasdoorBuyProductRequest(\n purchaseRequest,\n productDetail,\n purchaseRequest.providerName,\n );\n\n const response = await buyProductLoader(buyRequest);\n return normalizeCasdoorBuyProductResponse(response, purchaseRequest.returnTo ?? productDetail.returnUrl ?? productDetail.successUrl);\n}\n\nfunction normalizeRuntimeConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingRuntimeConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingRuntimeConfig(config);\n}\n\nfunction normalizeCatalogConfigInput(config?: BillingRuntimeConfig | BillingCatalogConfig | null): BillingCatalogConfig | undefined {\n if (!config) return undefined;\n return normalizeBillingCatalogConfig(config);\n}\n\nfunction buildCoreValue(input: {\n apiClient: BillingApiClient;\n loaders?: BillingLoaders;\n runtimeConfigLoader?: BillingLoaders['runtimeConfigLoader'];\n actionExecutor?: BillingActionExecutor;\n defaults?: BillingDefaults;\n runtimeConfig?: BillingRuntimeConfig | BillingCatalogConfig;\n runtimeCatalog?: BillingCatalogConfig;\n runtimeConfigLoading: boolean;\n runtimeConfigError: string | null;\n subscription?: BillingSubscriptionState;\n subscriptionHistory?: BillingSubscriptionHistoryItem[];\n products?: BillingProductState[];\n orderHistory?: BillingOrderHistoryItem[];\n paymentHistory?: BillingPaymentHistoryItem[];\n credits?: BillingCreditsState;\n entitlements?: BillingEntitlementState;\n purchaseStatus?: BillingPurchaseStatus;\n purchaseHooks?: BillingPurchaseHooks;\n status: BillingStatusState;\n refresh: () => Promise<void>;\n runAction: (payload: BillingActionPayload) => Promise<BillingActionExecutionResult>;\n setRuntimeConfig: (config?: BillingRuntimeConfig) => void;\n setSubscription: (value?: BillingSubscriptionState) => void;\n setSubscriptionHistory: (value?: BillingSubscriptionHistoryItem[]) => void;\n setProducts: (value?: BillingProductState[]) => void;\n setOrderHistory: (value?: BillingOrderHistoryItem[]) => void;\n setPaymentHistory: (value?: BillingPaymentHistoryItem[]) => void;\n setCredits: (value?: BillingCreditsState) => void;\n setEntitlements: (value?: BillingEntitlementState) => void;\n setPurchaseStatus: (status?: BillingPurchaseStatus) => void;\n setStatus: (status: BillingStatusState | ((current: BillingStatusState) => BillingStatusState)) => void;\n}): BillingCoreContextValue {\n return {\n apiClient: input.apiClient,\n loaders: input.loaders,\n runtimeConfigLoader: input.runtimeConfigLoader,\n actionExecutor: input.actionExecutor,\n defaults: input.defaults,\n runtimeConfig: input.runtimeConfig,\n runtimeCatalog: input.runtimeCatalog,\n runtimeConfigLoading: input.runtimeConfigLoading,\n runtimeConfigError: input.runtimeConfigError,\n subscription: input.subscription,\n subscriptionHistory: input.subscriptionHistory,\n products: input.products,\n orderHistory: input.orderHistory,\n paymentHistory: input.paymentHistory,\n availablePlans: filterBillingPurchasableItems(\n input.runtimeConfig?.items?.filter((item) => item.kind === 'subscription'),\n input.runtimeConfig ?? input.runtimeCatalog,\n ),\n availableProducts: filterBillingPurchasableItems(\n input.runtimeConfig?.items?.filter((item) => item.kind === 'product'),\n input.runtimeConfig ?? input.runtimeCatalog,\n ),\n credits: input.credits,\n entitlements: input.entitlements,\n purchaseStatus: input.purchaseStatus,\n purchaseHooks: input.purchaseHooks,\n status: input.status,\n refresh: input.refresh,\n runAction: input.runAction,\n setRuntimeConfig: input.setRuntimeConfig,\n setSubscription: input.setSubscription,\n setSubscriptionHistory: input.setSubscriptionHistory,\n setProducts: input.setProducts,\n setOrderHistory: input.setOrderHistory,\n setPaymentHistory: input.setPaymentHistory,\n setCredits: input.setCredits,\n setEntitlements: input.setEntitlements,\n setPurchaseStatus: input.setPurchaseStatus,\n setStatus: input.setStatus,\n };\n}\n\nexport function BillingProvider({\n children,\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig: runtimeConfigProp,\n subscription: subscriptionProp,\n subscriptionHistory: subscriptionHistoryProp,\n products: productsProp,\n orderHistory: orderHistoryProp,\n paymentHistory: paymentHistoryProp,\n credits: creditsProp,\n entitlements: entitlementsProp,\n status: statusProp,\n purchaseStatus: purchaseStatusProp,\n purchaseHooks,\n autoRefresh = true,\n}: BillingProviderProps) {\n const [runtimeConfig, setRuntimeConfig] = useState<BillingRuntimeConfig | undefined>(normalizeRuntimeConfigInput(runtimeConfigProp));\n const [runtimeCatalog, setRuntimeCatalog] = useState<BillingCatalogConfig | undefined>(normalizeCatalogConfigInput(runtimeConfigProp));\n const [runtimeConfigLoading, setRuntimeConfigLoading] = useState(false);\n const [runtimeConfigError, setRuntimeConfigError] = useState<string | null>(null);\n const [subscription, setSubscription] = useState<BillingSubscriptionState | undefined>(subscriptionProp);\n const [subscriptionHistory, setSubscriptionHistory] = useState<BillingSubscriptionHistoryItem[] | undefined>(subscriptionHistoryProp);\n const [products, setProducts] = useState<BillingProductState[] | undefined>(productsProp);\n const [orderHistory, setOrderHistory] = useState<BillingOrderHistoryItem[] | undefined>(orderHistoryProp);\n const [paymentHistory, setPaymentHistory] = useState<BillingPaymentHistoryItem[] | undefined>(paymentHistoryProp);\n const [credits, setCredits] = useState<BillingCreditsState | undefined>(creditsProp);\n const [entitlements, setEntitlements] = useState<BillingEntitlementState | undefined>(entitlementsProp);\n const [purchaseStatus, setPurchaseStatus] = useState<BillingPurchaseStatus | undefined>(purchaseStatusProp);\n const [status, setStatus] = useState<BillingStatusState>(\n statusProp ?? { loading: false, refreshing: false, error: null },\n );\n\n useEffect(() => {\n if (runtimeConfigProp) {\n setRuntimeConfig(normalizeRuntimeConfigInput(runtimeConfigProp));\n setRuntimeCatalog(normalizeCatalogConfigInput(runtimeConfigProp));\n }\n }, [runtimeConfigProp]);\n\n useEffect(() => {\n if (subscriptionProp) setSubscription(subscriptionProp);\n }, [subscriptionProp]);\n\n useEffect(() => {\n if (subscriptionHistoryProp) setSubscriptionHistory(subscriptionHistoryProp);\n }, [subscriptionHistoryProp]);\n\n useEffect(() => {\n if (productsProp) setProducts(productsProp);\n }, [productsProp]);\n\n useEffect(() => {\n if (orderHistoryProp) setOrderHistory(orderHistoryProp);\n }, [orderHistoryProp]);\n\n useEffect(() => {\n if (paymentHistoryProp) setPaymentHistory(paymentHistoryProp);\n }, [paymentHistoryProp]);\n\n useEffect(() => {\n if (creditsProp) setCredits(creditsProp);\n }, [creditsProp]);\n\n useEffect(() => {\n if (entitlementsProp) setEntitlements(entitlementsProp);\n }, [entitlementsProp]);\n\n useEffect(() => {\n if (purchaseStatusProp) setPurchaseStatus(purchaseStatusProp);\n }, [purchaseStatusProp]);\n\n useEffect(() => {\n if (statusProp) setStatus(statusProp);\n }, [statusProp]);\n\n const refresh = useCallback(async () => {\n const catalogKey = runtimeCatalog?.catalogKey ?? runtimeConfig?.catalogKey ?? 'default';\n const runtimeLoader = runtimeConfigLoader ?? apiClient.fetchRuntimeConfig;\n const resolvedLoaders = loaders ?? {};\n const subscriptionLoader = resolvedLoaders.subscriptionLoader ?? apiClient.fetchSubscription;\n const subscriptionHistoryLoader = resolvedLoaders.subscriptionHistoryLoader ?? apiClient.fetchSubscriptionHistory;\n const subscriptionsLoader = resolvedLoaders.subscriptionsLoader ?? apiClient.fetchSubscriptions;\n const productsLoader = resolvedLoaders.productsLoader ?? apiClient.fetchProducts;\n const orderHistoryLoader = resolvedLoaders.orderHistoryLoader ?? apiClient.fetchOrderHistory;\n const ordersLoader = resolvedLoaders.ordersLoader ?? apiClient.fetchOrders;\n const paymentHistoryLoader = resolvedLoaders.paymentHistoryLoader ?? apiClient.fetchPaymentHistory;\n const paymentLoader = resolvedLoaders.paymentLoader ?? apiClient.fetchPayment;\n const purchaseStatusLoader = resolvedLoaders.purchaseStatusLoader ?? apiClient.fetchPurchaseStatus;\n const creditsLoader = resolvedLoaders.creditsLoader ?? apiClient.fetchCredits;\n const entitlementsLoader = resolvedLoaders.entitlementsLoader ?? apiClient.fetchEntitlements;\n\n setRuntimeConfigLoading(true);\n setRuntimeConfigError(null);\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n const nextRuntimeCatalog = normalizeCatalogConfigInput(await runtimeLoader(catalogKey));\n const nextRuntimeConfig = nextRuntimeCatalog ? normalizeRuntimeConfigInput(nextRuntimeCatalog) : undefined;\n if (nextRuntimeConfig) {\n setRuntimeCatalog(nextRuntimeCatalog);\n setRuntimeConfig(nextRuntimeConfig);\n }\n\n const nextCatalogKey = nextRuntimeConfig?.catalogKey ?? nextRuntimeCatalog?.catalogKey ?? catalogKey;\n const nextSubscriptionsResponsePromise: Promise<BillingCasdoorSubscriptionsResponse | undefined> = subscriptionsLoader\n ? subscriptionsLoader({}).catch(() => undefined)\n : Promise.resolve(undefined);\n const nextOrdersResponsePromise: Promise<BillingCasdoorOrdersResponse | undefined> = ordersLoader\n ? ordersLoader({}).catch(() => undefined)\n : Promise.resolve(undefined);\n\n const [\n nextSubscription,\n nextSubscriptionHistory,\n nextSubscriptionsResponse,\n nextProducts,\n nextOrderHistory,\n nextOrdersResponse,\n nextPaymentHistory,\n nextCredits,\n nextEntitlements,\n ] = await Promise.all([\n subscriptionLoader({ catalogKey: nextCatalogKey }),\n subscriptionHistoryLoader({ catalogKey: nextCatalogKey }),\n nextSubscriptionsResponsePromise,\n productsLoader({ catalogKey: nextCatalogKey }),\n orderHistoryLoader({ catalogKey: nextCatalogKey }),\n nextOrdersResponsePromise,\n paymentHistoryLoader({ catalogKey: nextCatalogKey }),\n creditsLoader({ catalogKey: nextCatalogKey }),\n entitlementsLoader({ catalogKey: nextCatalogKey }),\n ]);\n\n const casdoorSubscriptions = extractCasdoorResponseData<BillingCasdoorSubscriptionDetail[]>(nextSubscriptionsResponse) ?? [];\n const casdoorOrders = extractCasdoorResponseData<BillingCasdoorOrderDetail[]>(nextOrdersResponse) ?? [];\n const derivedSubscriptionHistory = nextSubscriptionHistory ?? casdoorSubscriptions.map(normalizeCasdoorSubscriptionHistoryItem);\n const derivedOrderHistory = nextOrderHistory ?? casdoorOrders.map(normalizeCasdoorOrderHistoryItem);\n\n let resolvedPaymentHistory = nextPaymentHistory;\n if ((!resolvedPaymentHistory || resolvedPaymentHistory.length === 0) && casdoorOrders.length && paymentLoader) {\n const latestCasdoorOrder = pickLatestCasdoorOrder(casdoorOrders);\n const paymentId = latestCasdoorOrder?.payment ?? latestCasdoorOrder?.transaction;\n if (paymentId) {\n const paymentResponse = await paymentLoader({ id: paymentId }).catch(() => undefined);\n const paymentDetail = extractCasdoorResponseData<{\n name?: string;\n order?: string;\n outOrderId?: string;\n product?: string;\n productName?: string;\n productDisplayName?: string;\n price?: number;\n currency?: string;\n state?: string;\n transactionId?: string;\n createdTime?: string;\n updatedTime?: string;\n }>(paymentResponse);\n if (paymentDetail?.name) {\n resolvedPaymentHistory = [\n normalizeCasdoorPaymentHistoryItem({\n name: paymentDetail.name,\n order: paymentDetail.order,\n outOrderId: paymentDetail.outOrderId,\n product: paymentDetail.product ?? paymentDetail.productName,\n productName: paymentDetail.productName,\n productDisplayName: paymentDetail.productDisplayName,\n price: paymentDetail.price,\n currency: paymentDetail.currency,\n state: paymentDetail.state,\n transactionId: paymentDetail.transactionId,\n createdTime: paymentDetail.createdTime,\n updatedTime: paymentDetail.updatedTime,\n }),\n ];\n }\n }\n }\n\n const subscriptionWithProduct = nextSubscription\n ? {\n ...nextSubscription,\n product: resolveBillingSubscriptionProduct(nextSubscription, nextRuntimeConfig ?? runtimeConfig),\n }\n : (() => {\n const derivedSubscription = normalizeCasdoorSubscriptionDetail(pickCurrentCasdoorSubscription(casdoorSubscriptions));\n return derivedSubscription\n ? {\n ...derivedSubscription,\n product: resolveBillingSubscriptionProduct(derivedSubscription, nextRuntimeConfig ?? runtimeConfig),\n }\n : undefined;\n })();\n\n const normalizedCredits = deriveBillingCreditsState(nextCredits, nextProducts, nextRuntimeConfig?.conversionRules ?? runtimeConfig?.conversionRules);\n const normalizedEntitlements = nextEntitlements ?? deriveBillingEntitlements(subscriptionWithProduct, nextProducts, normalizedCredits, nextRuntimeConfig ?? runtimeConfig);\n const latestOrder = getLatestOrder(derivedOrderHistory);\n const latestPayment = getLatestPayment(resolvedPaymentHistory);\n const fetchedPurchaseStatus = await purchaseStatusLoader({\n orderId: latestOrder?.orderId,\n paymentId: latestPayment?.paymentId,\n transactionId: latestPayment?.transactionId ?? latestOrder?.transactionId,\n }).catch(() => undefined);\n const normalizedPurchaseStatus = normalizeBillingPurchaseStatus(\n fetchedPurchaseStatus,\n latestOrder,\n latestPayment,\n );\n\n setSubscription(subscriptionWithProduct);\n setSubscriptionHistory(derivedSubscriptionHistory);\n setProducts(nextProducts);\n setOrderHistory(derivedOrderHistory);\n setPaymentHistory(resolvedPaymentHistory);\n setCredits(normalizedCredits);\n setEntitlements(normalizedEntitlements);\n setPurchaseStatus(normalizedPurchaseStatus);\n setStatus({ loading: false, refreshing: false, error: null, lastFetchedAt: new Date().toISOString() });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setRuntimeConfigError(message);\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n } finally {\n setRuntimeConfigLoading(false);\n }\n }, [apiClient, loaders, runtimeConfig, runtimeConfigLoader, runtimeCatalog]);\n\n const runAction = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = buildBillingActionPayload(payload, runtimeConfig);\n const executor = actionExecutor ?? ((input: BillingActionPayload) => apiClient.createAction(input));\n const isPurchaseFlow = prepared.kind === 'purchase' || prepared.kind === 'subscribe';\n const purchasable = isPurchaseFlow\n ? resolveBillingPurchasable(runtimeConfig, prepared.key) ?? resolveBillingPurchasable(runtimeConfig, prepared.productId)\n : undefined;\n const purchaseRequest = isPurchaseFlow ? buildBillingPurchaseRequest(prepared, runtimeConfig) : null;\n\n if (isPurchaseFlow && !purchasable) {\n throw new Error(`Billing item \"${prepared.key}\" is not purchasable in the current runtime config.`);\n }\n\n await runPurchaseHook('onPurchaseStart', purchaseHooks?.onPurchaseStart, purchaseRequest ?? undefined);\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'pending',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: true, refreshing: true, error: null }));\n\n try {\n let result: BillingActionExecutionResult;\n let usedCasdoorPurchaseFlow = false;\n if (isPurchaseFlow && purchaseRequest) {\n const casdoorResult = await runCasdoorProductPurchase(\n purchaseRequest as NonNullable<ReturnType<typeof buildBillingPurchaseRequest>>,\n apiClient,\n loaders,\n );\n if (casdoorResult) {\n result = casdoorResult;\n usedCasdoorPurchaseFlow = true;\n } else {\n result = await executor(prepared);\n }\n } else {\n result = await executor(prepared);\n }\n\n if (result.status === 'failed') {\n await runPurchaseHook(\n 'onPurchaseError',\n purchaseHooks?.onPurchaseError,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n status: 'failed',\n message: result.message ?? 'Purchase failed.',\n errorCode: result.errorCode,\n redirectTo: result.redirectTo ?? null,\n rawResult: result.rawResult ?? result,\n }\n : undefined,\n );\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: result.orderId ?? current?.orderId,\n paymentId: result.paymentId ?? current?.paymentId,\n transactionId: result.transactionId ?? current?.transactionId,\n status: 'failed',\n redirectTo: result.redirectTo ?? current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({\n ...current,\n loading: false,\n refreshing: false,\n error: result.message ?? current.error ?? 'Purchase failed.',\n }));\n\n await runPurchaseHook(\n 'onPurchaseComplete',\n purchaseHooks?.onPurchaseComplete,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n status: 'failed',\n redirectTo: result.redirectTo ?? null,\n }\n : undefined,\n );\n\n await refresh();\n return result;\n }\n\n await runPurchaseHook(\n 'onOrderCreated',\n purchaseHooks?.onOrderCreated,\n purchaseRequest && purchasable\n ? {\n request: purchaseRequest,\n purchasable,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n redirectTo: result.redirectTo ?? null,\n rawResult: result.rawResult ?? result,\n }\n : undefined,\n );\n\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status:\n usedCasdoorPurchaseFlow && result.status !== 'failed'\n ? 'requires_payment'\n : result.status === 'failed'\n ? 'failed'\n : result.status === 'succeeded'\n ? 'paid'\n : 'pending',\n redirectTo: result.redirectTo ?? current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n if (result.redirectTo || result.nextAction) {\n // host handles the redirect/next action, we only persist the result\n }\n\n await runPurchaseHook(\n 'onPurchaseComplete',\n purchaseHooks?.onPurchaseComplete,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: result.orderId ?? null,\n paymentId: result.paymentId ?? null,\n status: 'succeeded',\n redirectTo: result.redirectTo ?? null,\n }\n : undefined,\n );\n\n await refresh();\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await runPurchaseHook(\n 'onPurchaseError',\n purchaseHooks?.onPurchaseError,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: null,\n paymentId: null,\n status: 'failed',\n message,\n redirectTo: null,\n rawResult: error,\n }\n : undefined,\n );\n await runPurchaseHook(\n 'onPurchaseComplete',\n purchaseHooks?.onPurchaseComplete,\n purchaseRequest\n ? {\n request: purchaseRequest,\n orderId: null,\n paymentId: null,\n status: 'failed',\n redirectTo: null,\n }\n : undefined,\n );\n setPurchaseStatus((current) => ({\n actionKey: prepared.key,\n orderId: current?.orderId,\n paymentId: current?.paymentId,\n transactionId: current?.transactionId,\n status: 'failed',\n redirectTo: current?.redirectTo,\n updatedAt: new Date().toISOString(),\n }));\n setStatus((current) => ({ ...current, loading: false, refreshing: false, error: message }));\n throw error;\n }\n },\n [actionExecutor, apiClient, loaders, purchaseHooks, refresh, runtimeConfig],\n );\n\n useEffect(() => {\n if (!autoRefresh) return;\n if (runtimeConfigLoading) return;\n if (!runtimeConfig && !runtimeConfigError) {\n void refresh();\n }\n }, [autoRefresh, refresh, runtimeConfig, runtimeConfigError, runtimeConfigLoading]);\n\n const coreValue = useMemo(\n () =>\n buildCoreValue({\n apiClient,\n loaders,\n runtimeConfigLoader,\n actionExecutor,\n defaults,\n runtimeConfig,\n runtimeCatalog,\n runtimeConfigLoading,\n runtimeConfigError,\n subscription,\n subscriptionHistory,\n products,\n orderHistory,\n paymentHistory,\n credits,\n entitlements,\n purchaseStatus,\n purchaseHooks,\n status,\n refresh,\n runAction,\n setRuntimeConfig,\n setSubscription,\n setSubscriptionHistory,\n setProducts,\n setOrderHistory,\n setPaymentHistory,\n setCredits,\n setEntitlements,\n setPurchaseStatus,\n setStatus,\n }),\n [\n actionExecutor,\n apiClient,\n credits,\n defaults,\n entitlements,\n orderHistory,\n paymentHistory,\n products,\n purchaseStatus,\n purchaseHooks,\n refresh,\n runAction,\n runtimeConfig,\n runtimeConfigError,\n runtimeConfigLoader,\n runtimeConfigLoading,\n runtimeCatalog,\n loaders,\n status,\n subscription,\n subscriptionHistory,\n ],\n );\n\n return (\n <BillingCoreContext.Provider value={coreValue}>\n <SubscriptionProvider subscription={subscription} subscriptionHistory={subscriptionHistory} entitlements={entitlements} status={status}>\n <ProductProvider products={products} orderHistory={orderHistory} paymentHistory={paymentHistory} status={status}>\n <CreditsProvider credits={credits} status={status}>{children}</CreditsProvider>\n </ProductProvider>\n </SubscriptionProvider>\n </BillingCoreContext.Provider>\n );\n}\n\nexport function BillingCoreProvider(props: BillingCoreProviderProps) {\n return <BillingProvider {...props} />;\n}\n\nexport function SubscriptionProvider({\n children,\n availablePlans,\n subscription,\n subscriptionHistory,\n entitlements,\n status,\n}: BillingSubscriptionProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const runtimeConfig = core?.runtimeConfig ?? core?.runtimeCatalog;\n const visiblePlans = choose(availablePlans, core?.availablePlans);\n const value = useMemo<BillingSubscriptionContextValue>(\n () => ({\n availablePlans: choose(\n visiblePlans ? filterBillingPurchasableItems(visiblePlans, runtimeConfig) : undefined,\n filterBillingPurchasableItems(core?.runtimeConfig?.items?.filter((item) => item.kind === 'subscription'), runtimeConfig),\n ),\n subscription: choose(subscription, core?.subscription),\n subscriptionHistory: choose(subscriptionHistory, core?.subscriptionHistory),\n entitlements: choose(entitlements, core?.entitlements),\n status: choose(status, core?.status),\n }),\n [availablePlans, core?.availablePlans, core?.entitlements, core?.runtimeCatalog, core?.runtimeConfig, core?.status, core?.subscription, core?.subscriptionHistory, entitlements, runtimeConfig, status, subscription, subscriptionHistory, visiblePlans],\n );\n\n return <BillingSubscriptionContext.Provider value={value}>{children}</BillingSubscriptionContext.Provider>;\n}\n\nexport function ProductProvider({\n children,\n availableProducts,\n products,\n orderHistory,\n paymentHistory,\n status,\n}: BillingProductProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const runtimeConfig = core?.runtimeConfig ?? core?.runtimeCatalog;\n const visibleProducts = choose(availableProducts, core?.availableProducts);\n const value = useMemo<BillingProductContextValue>(\n () => ({\n availableProducts: choose(\n visibleProducts ? filterBillingPurchasableItems(visibleProducts, runtimeConfig) : undefined,\n filterBillingPurchasableItems(core?.runtimeConfig?.items?.filter((item) => item.kind === 'product'), runtimeConfig),\n ),\n products: choose(products, core?.products),\n orderHistory: choose(orderHistory, core?.orderHistory),\n paymentHistory: choose(paymentHistory, core?.paymentHistory),\n status: choose(status, core?.status),\n }),\n [availableProducts, core?.availableProducts, core?.orderHistory, core?.paymentHistory, core?.products, core?.runtimeCatalog, core?.runtimeConfig, core?.status, orderHistory, paymentHistory, products, runtimeConfig, status, visibleProducts],\n );\n\n return <BillingProductContext.Provider value={value}>{children}</BillingProductContext.Provider>;\n}\n\nexport function CreditsProvider({ children, credits, status }: BillingCreditsProviderProps) {\n const core = useOptionalContext(BillingCoreContext);\n const value = useMemo<BillingCreditsContextValue>(\n () => ({\n credits: choose(credits, core?.credits),\n status: choose(status, core?.status),\n }),\n [credits, core?.credits, core?.status, status],\n );\n\n return <BillingCreditsContext.Provider value={value}>{children}</BillingCreditsContext.Provider>;\n}\n\nexport interface BillingCatalogState {\n catalog?: BillingRuntimeConfig | BillingCatalogConfig;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingContext(): BillingCoreContextValue {\n return useRequiredCoreContext();\n}\n\nexport function useBillingCatalog(): BillingCatalogState {\n const core = useRequiredCoreContext();\n return useMemo(\n () => ({\n catalog: core.runtimeCatalog ?? core.runtimeConfig,\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeCatalog, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading],\n );\n}\n\nexport interface BillingItemState {\n item?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingItem(itemKey: string): BillingItemState {\n const core = useRequiredCoreContext();\n return useMemo(() => {\n const item = resolveBillingItem(core.runtimeConfig?.items, itemKey);\n return {\n item: resolveBillingProductSnapshot(item),\n loading: core.runtimeConfigLoading,\n error: core.runtimeConfigError,\n refresh: core.refresh,\n };\n }, [core.refresh, core.runtimeConfig?.items, core.runtimeConfigError, core.runtimeConfigLoading, itemKey]);\n}\n\nexport interface BillingProductDetailState {\n product?: BillingCasdoorProductDetail;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProductDetail(productId: string): BillingProductDetailState {\n const core = useRequiredCoreContext();\n const productLoader = core.loaders?.productLoader ?? core.apiClient.fetchProduct;\n const [product, setProduct] = useState<BillingCasdoorProductDetail | undefined>();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!productLoader || !productId) {\n setProduct(undefined);\n setError(productId ? 'Missing Casdoor product loader.' : null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const response = await productLoader({ id: productId });\n const detail = extractCasdoorResponseData<BillingCasdoorProductDetail>(response);\n setProduct(detail);\n setError(null);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setProduct(undefined);\n setError(message);\n } finally {\n setLoading(false);\n }\n }, [productId, productLoader]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return useMemo(\n () => ({\n product,\n loading: loading || core.runtimeConfigLoading || core.status.loading,\n error: error ?? core.runtimeConfigError ?? core.status.error,\n refresh,\n }),\n [core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, error, loading, product, refresh],\n );\n}\n\nexport interface BillingProductPurchaseOptionsState {\n product?: BillingCasdoorProductDetail;\n providers: BillingCasdoorProductDetail['providers'];\n providerObjs: BillingCasdoorProductDetail['providerObjs'];\n providerName?: string;\n selectedProvider?: NonNullable<BillingCasdoorProductDetail['providerObjs']>[number];\n setProviderName: (providerName?: string) => void;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProductPurchaseOptions(productId: string, preferredProviderName?: string): BillingProductPurchaseOptionsState {\n const detailState = useBillingProductDetail(productId);\n const [providerName, setProviderName] = useState<string | undefined>(preferredProviderName);\n\n useEffect(() => {\n if (preferredProviderName) {\n setProviderName(preferredProviderName);\n return;\n }\n\n const product = detailState.product;\n const fallbackProvider = product?.providers?.[0] ?? product?.providerObjs?.[0]?.name;\n if (!providerName || (product && !product.providers?.includes(providerName) && !product.providerObjs?.some((item) => item.name === providerName))) {\n setProviderName(fallbackProvider);\n }\n }, [detailState.product, preferredProviderName, providerName]);\n\n return useMemo(\n () => ({\n product: detailState.product,\n providers: detailState.product?.providers ?? [],\n providerObjs: detailState.product?.providerObjs ?? [],\n providerName,\n selectedProvider: detailState.product?.providerObjs?.find((item) => item.name === providerName),\n setProviderName,\n loading: detailState.loading,\n error: detailState.error,\n refresh: detailState.refresh,\n }),\n [detailState.error, detailState.loading, detailState.product, detailState.refresh, providerName],\n );\n}\n\nexport type BillingPricingState = BillingCasdoorQueryState<BillingCasdoorPricingDetail>;\nexport type BillingPlanState = BillingCasdoorQueryState<BillingCasdoorPlanDetail>;\nexport type BillingOrderState = BillingCasdoorQueryState<BillingCasdoorOrderDetail>;\nexport type BillingOrdersState = BillingCasdoorQueryState<BillingCasdoorOrderDetail[]>;\nexport type BillingSubscriptionRecordState = BillingCasdoorQueryState<BillingCasdoorSubscriptionDetail>;\nexport type BillingSubscriptionsState = BillingCasdoorQueryState<BillingCasdoorSubscriptionDetail[]>;\n\nexport function useBillingPricing(pricingId: string): BillingPricingState {\n const core = useRequiredCoreContext();\n const loader = core.loaders?.pricingLoader ?? core.apiClient.fetchPricing;\n return useBillingCasdoorQuery(\n loader,\n useCallback(() => ({ id: pricingId }), [pricingId]),\n [pricingId, loader],\n 'Missing billing pricing loader.',\n );\n}\n\nexport function useBillingPlan(planId: string, includeOption = false): BillingPlanState {\n const core = useRequiredCoreContext();\n const loader = core.loaders?.planLoader ?? core.apiClient.fetchPlan;\n return useBillingCasdoorQuery(\n loader,\n useCallback(() => ({ id: planId, includeOption }), [includeOption, planId]),\n [includeOption, loader, planId],\n 'Missing billing plan loader.',\n );\n}\n\nexport function useBillingOrder(orderId: string): BillingOrderState {\n const core = useRequiredCoreContext();\n const loader = core.loaders?.orderLoader ?? core.apiClient.fetchOrder;\n return useBillingCasdoorQuery(\n loader,\n useCallback(() => ({ id: orderId }), [orderId]),\n [loader, orderId],\n 'Missing billing order loader.',\n );\n}\n\nexport function useBillingSubscriptionRecord(subscriptionId: string): BillingSubscriptionRecordState {\n const core = useRequiredCoreContext();\n const loader = core.loaders?.subscriptionRecordLoader ?? core.apiClient.fetchSubscriptionRecord;\n return useBillingCasdoorQuery(\n loader,\n useCallback(() => ({ id: subscriptionId }), [subscriptionId]),\n [loader, subscriptionId],\n 'Missing billing subscription loader.',\n );\n}\n\nexport function useBillingOrders(options: { owner?: string; user?: string; product?: string } = {}): BillingOrdersState {\n const core = useRequiredCoreContext();\n const loader = core.loaders?.ordersLoader ?? core.apiClient.fetchOrders;\n const owner = options.owner;\n const user = options.user;\n const product = options.product;\n return useBillingCasdoorQuery(\n loader,\n useCallback(() => ({ owner, user, product }), [owner, product, user]),\n [loader, owner, product, user],\n 'Missing billing orders loader.',\n );\n}\n\nexport function useBillingSubscriptions(options: { owner?: string; user?: string } = {}): BillingSubscriptionsState {\n const core = useRequiredCoreContext();\n const loader = core.loaders?.subscriptionsLoader ?? core.apiClient.fetchSubscriptions;\n const owner = options.owner;\n const user = options.user;\n return useBillingCasdoorQuery(\n loader,\n useCallback(() => ({ owner, user }), [owner, user]),\n [loader, owner, user],\n 'Missing billing subscriptions loader.',\n );\n}\n\nexport interface BillingPricingPlansState {\n pricing?: BillingCasdoorPricingDetail;\n plans: BillingCasdoorPlanDetail[];\n selectedPlanName?: string;\n selectedPlan?: BillingCasdoorPlanDetail;\n setSelectedPlanName: (planName?: string) => void;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPricingPlans(\n pricingId: string,\n includeOption = false,\n preferredPlanName?: string,\n): BillingPricingPlansState {\n const pricingState = useBillingPricing(pricingId);\n const core = useRequiredCoreContext();\n const [selectedPlanName, setSelectedPlanName] = useState<string | undefined>(preferredPlanName);\n const planLoader = core.loaders?.planLoader ?? core.apiClient.fetchPlan;\n const [plans, setPlans] = useState<BillingCasdoorPlanDetail[]>([]);\n const [planLoading, setPlanLoading] = useState(false);\n const [planError, setPlanError] = useState<string | null>(null);\n\n useEffect(() => {\n if (preferredPlanName) {\n setSelectedPlanName(preferredPlanName);\n }\n }, [preferredPlanName]);\n\n useEffect(() => {\n const nextPlanName = selectedPlanName ?? pricingState.data?.plans?.[0];\n if (!nextPlanName || (selectedPlanName && pricingState.data?.plans && !pricingState.data.plans.includes(selectedPlanName))) {\n setSelectedPlanName(pricingState.data?.plans?.[0]);\n return;\n }\n if (!selectedPlanName && nextPlanName) {\n setSelectedPlanName(nextPlanName);\n }\n }, [pricingState.data?.plans, selectedPlanName]);\n\n const refreshPlans = useCallback(async () => {\n if (!planLoader) {\n setPlans([]);\n setPlanError('Missing billing plan loader.');\n setPlanLoading(false);\n return;\n }\n\n const planNames = pricingState.data?.plans ?? [];\n if (!planNames.length) {\n setPlans([]);\n setPlanError(null);\n setPlanLoading(false);\n return;\n }\n\n setPlanLoading(true);\n setPlanError(null);\n try {\n const results = await Promise.all(\n planNames.map(async (planName) => {\n const response = await planLoader({ id: planName, includeOption });\n return extractCasdoorResponseData<BillingCasdoorPlanDetail>(response);\n }),\n );\n setPlans(results.filter((plan): plan is BillingCasdoorPlanDetail => Boolean(plan)));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setPlans([]);\n setPlanError(message);\n } finally {\n setPlanLoading(false);\n }\n }, [includeOption, planLoader, pricingState.data?.plans]);\n\n useEffect(() => {\n void refreshPlans();\n }, [refreshPlans]);\n\n const selectedPlan = useMemo(\n () => plans.find((plan) => plan.name === selectedPlanName) ?? (plans.length === 1 ? plans[0] : undefined),\n [plans, selectedPlanName],\n );\n\n return useMemo(\n () => ({\n pricing: pricingState.data,\n plans,\n selectedPlanName,\n selectedPlan,\n setSelectedPlanName,\n loading: pricingState.loading || planLoading,\n error: pricingState.error ?? planError,\n refresh: async () => {\n await pricingState.refresh();\n await refreshPlans();\n },\n }),\n [planError, planLoading, plans, pricingState, refreshPlans, selectedPlan, selectedPlanName],\n );\n}\n\nexport interface BillingSubscriptionPurchaseOptionsState {\n pricing?: BillingCasdoorPricingDetail;\n plans: BillingCasdoorPlanDetail[];\n selectedPlanName?: string;\n selectedPlan?: BillingCasdoorPlanDetail;\n setSelectedPlanName: (planName?: string) => void;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionPurchaseOptions(\n pricingId: string,\n includeOption = false,\n preferredPlanName?: string,\n): BillingSubscriptionPurchaseOptionsState {\n const pricingPlans = useBillingPricingPlans(pricingId, includeOption, preferredPlanName);\n return useMemo(\n () => ({\n pricing: pricingPlans.pricing,\n plans: pricingPlans.plans,\n selectedPlanName: pricingPlans.selectedPlanName,\n selectedPlan: pricingPlans.selectedPlan,\n setSelectedPlanName: pricingPlans.setSelectedPlanName,\n loading: pricingPlans.loading,\n error: pricingPlans.error,\n refresh: pricingPlans.refresh,\n }),\n [pricingPlans],\n );\n}\n\nexport interface BillingProductsState {\n products: BillingProductState[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProducts(): BillingProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const products = choose(productContext?.products, core.products) ?? [];\n return useMemo(\n () => ({\n products,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, products],\n );\n}\n\nexport interface BillingAvailablePlansState {\n plans: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailablePlans(): BillingAvailablePlansState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const plans = choose(subscriptionContext?.availablePlans, core.availablePlans) ?? [];\n return useMemo(\n () => ({\n plans,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.availablePlans, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, plans],\n );\n}\n\nexport interface BillingAvailableProductsState {\n items: BillingItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingAvailableProducts(): BillingAvailableProductsState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const items = choose(productContext?.availableProducts, core.availableProducts) ?? [];\n return useMemo(\n () => ({\n items,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.availableProducts, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, items],\n );\n}\n\nexport interface BillingOrderHistoryState {\n orders: BillingOrderHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingOrderHistory(_options: { userId?: string; catalogKey?: string; productKey?: string } = {}): BillingOrderHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const orders = choose(productContext?.orderHistory, core.orderHistory) ?? [];\n return useMemo(\n () => ({\n orders,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, orders],\n );\n}\n\nexport interface BillingPaymentHistoryState {\n payments: BillingPaymentHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPaymentHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingPaymentHistoryState {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const payments = choose(productContext?.paymentHistory, core.paymentHistory) ?? [];\n return useMemo(\n () => ({\n payments,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, payments],\n );\n}\n\nexport interface BillingSubscriptionStateView {\n subscription?: BillingSubscriptionState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscription(): BillingSubscriptionStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n return useMemo(\n () => ({\n subscription: choose(subscriptionContext?.subscription, core.subscription),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, core.subscription, subscriptionContext?.subscription],\n );\n}\n\nexport interface BillingSubscriptionProductState {\n product?: BillingProductSnapshot;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionProduct(): BillingSubscriptionProductState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const subscription = choose(subscriptionContext?.subscription, core.subscription);\n return useMemo(\n () => ({\n product: subscription?.product ?? resolveBillingSubscriptionProduct(subscription, core.runtimeConfig),\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, subscription],\n );\n}\n\nexport interface BillingSubscriptionHistoryState {\n history: BillingSubscriptionHistoryItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingSubscriptionHistory(_options: { userId?: string; catalogKey?: string } = {}): BillingSubscriptionHistoryState {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const history = choose(subscriptionContext?.subscriptionHistory, core.subscriptionHistory) ?? [];\n return useMemo(\n () => ({\n history,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, history],\n );\n}\n\nexport interface BillingCreditsStateView {\n credits?: BillingCreditsState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingCredits(): BillingCreditsStateView {\n const core = useRequiredCoreContext();\n const creditsContext = useOptionalContext(BillingCreditsContext);\n const credits = choose(creditsContext?.credits, core.credits) ?? deriveBillingCreditsState(undefined, core.products, core.runtimeConfig?.conversionRules);\n return useMemo(\n () => ({\n credits,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfig?.conversionRules, core.runtimeConfigError, core.runtimeConfigLoading, core.products, core.status.error, core.status.loading, credits],\n );\n}\n\nexport interface BillingEntitlementsStateView {\n entitlements?: BillingEntitlementState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingEntitlements(): BillingEntitlementsStateView {\n const core = useRequiredCoreContext();\n const subscriptionContext = useOptionalContext(BillingSubscriptionContext);\n const entitlements =\n choose(subscriptionContext?.entitlements, core.entitlements) ??\n deriveBillingEntitlements(subscriptionContext?.subscription ?? core.subscription, core.products, core.credits, core.runtimeConfig);\n return useMemo(\n () => ({\n entitlements,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.credits, core.products, core.refresh, core.runtimeConfig, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, entitlements, subscriptionContext?.subscription, core.subscription],\n );\n}\n\nexport interface BillingPurchaseStatusView {\n purchaseStatus?: BillingPurchaseStatus;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPurchaseStatus(): BillingPurchaseStatusView {\n const core = useRequiredCoreContext();\n const productContext = useOptionalContext(BillingProductContext);\n const order = getLatestOrder(choose(productContext?.orderHistory, core.orderHistory));\n const payment = getLatestPayment(choose(productContext?.paymentHistory, core.paymentHistory));\n const purchaseStatus = core.purchaseStatus ?? normalizeBillingPurchaseStatus(undefined, order, payment);\n return useMemo(\n () => ({\n purchaseStatus,\n loading: core.runtimeConfigLoading || core.status.loading,\n error: core.runtimeConfigError ?? core.status.error,\n refresh: core.refresh,\n }),\n [core.purchaseStatus, core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, order, payment, purchaseStatus],\n );\n}\n\nexport interface BillingStatusView {\n status: BillingStatusState;\n}\n\nexport function useBillingStatus(): BillingStatusView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ status: core.status }), [core.status]);\n}\n\nexport interface BillingRefreshView {\n refresh: () => Promise<void>;\n}\n\nexport function useBillingRefresh(): BillingRefreshView {\n const core = useRequiredCoreContext();\n return useMemo(() => ({ refresh: core.refresh }), [core.refresh]);\n}\n\nexport interface BillingPipelineResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n purchaseStatus?: BillingPurchaseStatus;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingPipeline(options: BillingPipelineOptions = {}): BillingPipelineResult {\n const core = useRequiredCoreContext();\n const purchaseStatusView = useBillingPurchaseStatus();\n\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n const prepared = options.onBeforeAction ? await options.onBeforeAction(payload) : payload;\n try {\n const result = await core.runAction(prepared);\n if (options.onAfterAction) {\n await options.onAfterAction({ redirectTo: result.redirectTo, nextAction: result.nextAction });\n }\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n }\n throw error;\n }\n },\n [core, options],\n );\n\n return useMemo(\n () => ({\n run,\n loading: core.status.loading || core.runtimeConfigLoading,\n error: core.status.error ?? core.runtimeConfigError,\n purchaseStatus: purchaseStatusView.purchaseStatus,\n refresh: core.refresh,\n }),\n [core.refresh, core.runtimeConfigError, core.runtimeConfigLoading, core.status.error, core.status.loading, purchaseStatusView.purchaseStatus, run],\n );\n}\n\nexport interface BillingActionHookResult {\n run: (payload: BillingActionPayload) => Promise<void>;\n loading: boolean;\n error: string | null;\n}\n\nfunction useBillingActionRunner(kind: BillingActionKind, defaults?: Partial<BillingActionPayload>): BillingActionHookResult {\n const pipeline = useBillingPipeline();\n const run = useCallback(\n async (payload: BillingActionPayload) => {\n await pipeline.run({\n ...defaults,\n ...payload,\n kind,\n });\n },\n [defaults, kind, pipeline],\n );\n\n return useMemo(\n () => ({\n run,\n loading: pipeline.loading,\n error: pipeline.error,\n }),\n [pipeline.error, pipeline.loading, run],\n );\n}\n\nexport function useSubscribePlan(): BillingActionHookResult {\n return useBillingActionRunner('subscribe');\n}\n\nexport function useManageSubscription(): BillingActionHookResult {\n return useBillingActionRunner('manage');\n}\n\nexport function useUpgradePlan(): BillingActionHookResult {\n return useBillingActionRunner('upgrade');\n}\n\nexport function useCancelSubscription(): BillingActionHookResult {\n return useBillingActionRunner('cancel');\n}\n\nexport function usePurchaseProduct(): BillingActionHookResult {\n return useBillingActionRunner('purchase');\n}\n\nexport interface BillingProductStateView {\n product?: BillingProductState;\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useBillingProduct(productKey: string): BillingProductStateView {\n const productsState = useBillingProducts();\n const product = productsState.products.find((item) => item.productKey === productKey);\n return useMemo(\n () => ({\n product,\n loading: productsState.loading,\n error: productsState.error,\n refresh: productsState.refresh,\n }),\n [product, productsState.error, productsState.loading, productsState.refresh],\n );\n}\n\nexport function useBillingCatalogConfig(): BillingCatalogState {\n return useBillingCatalog();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,uBAAuB;AASvB;AAPF,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAGG;AACD,SAAO,oBAAC,mBAAgB,SAAmB,UAAS;AACtD;;;ACZA,SAAS,kBAAkB;AA8B3B,SAAS,eAAe,SAA0D;AAChF,QAAM,OAAO,SAAS;AACtB,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,kBAAkB,QAAQ,IAAI;AACpC,QAAM,UAAU,QAAQ,MAAM,OAAO;AACrC,QAAM,OAAiB,CAAC,kBAAkB,UAAU,UAAU,UAAU;AAExE,SAAO;AAAA,IACL,IAAI,MAAM,MAAM;AAAA,IAChB;AAAA,IACA,OAAO,MAAM,SAAS;AAAA,IACtB,OAAO,MAAM,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,IACA,cAAc,OAAO,MAAM,gBAAgB,IAAI;AAAA,IAC/C,OAAO,QAAQ,MAAM,SAAS,IAAI;AAAA,IAClC;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB;AAC/B,SAAO,WAAW;AAGpB;AAEO,SAAS,cAA+B;AAC7C,QAAM,EAAE,MAAM,QAAQ,IAAI,eAAe;AACzC,SAAO,eAAe,WAAW,IAAI;AACvC;AAEO,SAAS,cAAwB;AACtC,SAAO,YAAY,EAAE;AACvB;AAEO,SAAS,eAAe,UAA8B,CAAC,GAAgB;AAC5E,QAAM,OAAO,YAAY;AACzB,QAAM,WAAW,QAAQ,YAAY;AAErC,SAAO;AAAA,IACL,WAAW,kBAAkB,SAAS,YAAY,MAAS;AAAA,IAC3D,YAAY,kBAAkB,UAAU,YAAY,MAAS;AAAA,IAC7D,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AACF;;;AC5EA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAo3BG,gBAAAA,YAAA;AAlwBV,IAAM,qBAAqB,cAA8C,IAAI;AAC7E,IAAM,6BAA6B,cAAsD,IAAI;AAC7F,IAAM,wBAAwB,cAAiD,IAAI;AACnF,IAAM,wBAAwB,cAAiD,IAAI;AAEnF,SAAS,mBAAsB,SAAsC;AACnE,SAAO,WAAW,OAAO;AAC3B;AAEA,SAAS,yBAAkD;AACzD,QAAM,UAAU,WAAW,kBAAkB;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,2EAA2E;AAAA,EAC7F;AACA,SAAO;AACT;AAEA,SAAS,OAAU,SAAwB,UAAwC;AACjF,SAAO,WAAW;AACpB;AAEA,eAAe,gBACb,MACA,MACA,SACe;AACf,MAAI,CAAC,QAAQ,YAAY,QAAW;AAClC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,KAAK,OAAO;AAAA,EACpB,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,IAAI,gBAAgB,KAAK;AAAA,EAC5E;AACF;AAEA,SAAS,eAAe,QAAoF;AAC1G,SAAO,CAAC,GAAI,UAAU,CAAC,CAAE,EAAE,KAAK,CAAC,GAAG,MAAM;AACxC,UAAM,OAAO,KAAK,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK;AAC7D,UAAM,QAAQ,KAAK,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK;AAC9D,WAAO,OAAO;AAAA,EAChB,CAAC,EAAE,CAAC;AACN;AAEA,SAAS,iBAAiB,UAA0F;AAClH,SAAO,CAAC,GAAI,YAAY,CAAC,CAAE,EAAE,KAAK,CAAC,GAAG,MAAM;AAC1C,UAAM,OAAO,KAAK,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK;AAC7D,UAAM,QAAQ,KAAK,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK;AAC9D,WAAO,OAAO;AAAA,EAChB,CAAC,EAAE,CAAC;AACN;AAEA,SAAS,2BAAkC,UAAmE;AAC5G,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,OAAO,aAAa,YAAY,aAAa,QAAQ,UAAU,UAAU;AAC3E,WAAQ,SAA8B;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,uBACP,QACA,WACA,MACA,sBACiC;AACjC,QAAM,CAAC,MAAM,OAAO,IAAI,SAA4B;AACpD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,UAAU,YAAY,YAAY;AACtC,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAS;AACjB,eAAS,oBAAoB;AAC7B,iBAAW,KAAK;AAChB;AAAA,IACF;AAEA,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,UAAU,CAAC;AACzC,YAAM,YAAY,2BAAkC,QAAQ;AAC5D,cAAQ,SAAS;AACjB,eAAS,IAAI;AAAA,IACf,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,cAAQ,MAAS;AACjB,eAAS,OAAO;AAAA,IAClB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,QAAQ,oBAAoB,CAAC;AAE5C,YAAU,MAAM;AACd,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;AAErB,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,MAAM,OAAO,SAAS,OAAO;AAAA,EAChC;AACF;AAEA,SAAS,+BAA+B,SAA2F;AACjI,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,SAAS,QAAQ,KAAK,CAAC,WAAW;AACtC,UAAM,UAAU,OAAO,SAAS,IAAI,YAAY;AAChD,WAAO,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,OAAO;AAAA,EAC7D,CAAC;AACD,MAAI,OAAQ,QAAO;AACnB,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,UAAU;AACxC,UAAM,WAAW,KAAK,MAAM,KAAK,WAAW,KAAK,eAAe,EAAE,KAAK;AACvE,UAAM,YAAY,KAAK,MAAM,MAAM,WAAW,MAAM,eAAe,EAAE,KAAK;AAC1E,WAAO,YAAY;AAAA,EACrB,CAAC,EAAE,CAAC;AACN;AAEA,SAAS,uBAAuB,SAA6E;AAC3G,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,UAAU;AACxC,UAAM,WAAW,KAAK,MAAO,KAAkC,eAAe,KAAK,eAAe,EAAE,KAAK;AACzG,UAAM,YAAY,KAAK,MAAO,MAAmC,eAAe,MAAM,eAAe,EAAE,KAAK;AAC5G,WAAO,YAAY;AAAA,EACrB,CAAC,EAAE,CAAC;AACN;AAEA,eAAe,0BACb,iBACA,WACA,SAC8C;AAC9C,QAAM,mBAAmB,SAAS,oBAAoB,UAAU;AAChE,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,iBAAiB,UAAU;AAC1D,QAAM,0BAA0B,SAAS,2BAA2B,UAAU;AAE9E,MAAI;AACJ,MAAI,eAAe;AACjB,UAAM,kBAAkB,MAAM,cAAc,EAAE,IAAI,gBAAgB,UAAU,CAAC,EAAE,MAAM,MAAM,MAAS;AACpG,oBAAgB,2BAAwD,eAAe;AAAA,EACzF;AAEA,MAAI,CAAC,eAAe;AAClB,QAAI,gBAAgB,gBAAgB,gBAAgB,aAAa;AAC/D,sBAAgB;AAAA,QACd,OAAO,gBAAgB;AAAA,QACvB,MAAM,gBAAgB;AAAA,MACxB;AAAA,IACF,OAAO;AACL,UAAI;AACF,cAAM,aAAa,0BAA0B,gBAAgB,SAAS;AACtE,wBAAgB;AAAA,UACd,OAAO,WAAW;AAAA,UAClB,MAAM,WAAW;AAAA,QACnB;AAAA,MACF,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,2BAA2B,cAAc,OAAO;AAClD,UAAM,uBAAuB,MAAM,wBAAwB,EAAE,OAAO,cAAc,MAAM,CAAC,EAAE,MAAM,MAAM,MAAS;AAChH,SAAK,2BAA2B,oBAAoB;AAAA,EACtD;AAEA,QAAM,aAA8C;AAAA,IAClD;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,EAClB;AAEA,QAAM,WAAW,MAAM,iBAAiB,UAAU;AAClD,SAAO,mCAAmC,UAAU,gBAAgB,YAAY,cAAc,aAAa,cAAc,UAAU;AACrI;AAEA,SAAS,4BAA4B,QAA+F;AAClI,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,8BAA8B,MAAM;AAC7C;AAEA,SAAS,4BAA4B,QAA+F;AAClI,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,8BAA8B,MAAM;AAC7C;AAEA,SAAS,eAAe,OAgCI;AAC1B,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,qBAAqB,MAAM;AAAA,IAC3B,gBAAgB,MAAM;AAAA,IACtB,UAAU,MAAM;AAAA,IAChB,eAAe,MAAM;AAAA,IACrB,gBAAgB,MAAM;AAAA,IACtB,sBAAsB,MAAM;AAAA,IAC5B,oBAAoB,MAAM;AAAA,IAC1B,cAAc,MAAM;AAAA,IACpB,qBAAqB,MAAM;AAAA,IAC3B,UAAU,MAAM;AAAA,IAChB,cAAc,MAAM;AAAA,IACpB,gBAAgB,MAAM;AAAA,IACtB,gBAAgB;AAAA,MACd,MAAM,eAAe,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,cAAc;AAAA,MACzE,MAAM,iBAAiB,MAAM;AAAA,IAC/B;AAAA,IACA,mBAAmB;AAAA,MACjB,MAAM,eAAe,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS;AAAA,MACpE,MAAM,iBAAiB,MAAM;AAAA,IAC/B;AAAA,IACA,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,IACpB,gBAAgB,MAAM;AAAA,IACtB,eAAe,MAAM;AAAA,IACrB,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,kBAAkB,MAAM;AAAA,IACxB,iBAAiB,MAAM;AAAA,IACvB,wBAAwB,MAAM;AAAA,IAC9B,aAAa,MAAM;AAAA,IACnB,iBAAiB,MAAM;AAAA,IACvB,mBAAmB,MAAM;AAAA,IACzB,YAAY,MAAM;AAAA,IAClB,iBAAiB,MAAM;AAAA,IACvB,mBAAmB,MAAM;AAAA,IACzB,WAAW,MAAM;AAAA,EACnB;AACF;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB;AAAA,EACA,cAAc;AAChB,GAAyB;AACvB,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA2C,4BAA4B,iBAAiB,CAAC;AACnI,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA2C,4BAA4B,iBAAiB,CAAC;AACrI,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAS,KAAK;AACtE,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAwB,IAAI;AAChF,QAAM,CAAC,cAAc,eAAe,IAAI,SAA+C,gBAAgB;AACvG,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAuD,uBAAuB;AACpI,QAAM,CAAC,UAAU,WAAW,IAAI,SAA4C,YAAY;AACxF,QAAM,CAAC,cAAc,eAAe,IAAI,SAAgD,gBAAgB;AACxG,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAkD,kBAAkB;AAChH,QAAM,CAAC,SAAS,UAAU,IAAI,SAA0C,WAAW;AACnF,QAAM,CAAC,cAAc,eAAe,IAAI,SAA8C,gBAAgB;AACtG,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA4C,kBAAkB;AAC1G,QAAM,CAAC,QAAQ,SAAS,IAAI;AAAA,IAC1B,cAAc,EAAE,SAAS,OAAO,YAAY,OAAO,OAAO,KAAK;AAAA,EACjE;AAEA,YAAU,MAAM;AACd,QAAI,mBAAmB;AACrB,uBAAiB,4BAA4B,iBAAiB,CAAC;AAC/D,wBAAkB,4BAA4B,iBAAiB,CAAC;AAAA,IAClE;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAEtB,YAAU,MAAM;AACd,QAAI,iBAAkB,iBAAgB,gBAAgB;AAAA,EACxD,GAAG,CAAC,gBAAgB,CAAC;AAErB,YAAU,MAAM;AACd,QAAI,wBAAyB,wBAAuB,uBAAuB;AAAA,EAC7E,GAAG,CAAC,uBAAuB,CAAC;AAE5B,YAAU,MAAM;AACd,QAAI,aAAc,aAAY,YAAY;AAAA,EAC5C,GAAG,CAAC,YAAY,CAAC;AAEjB,YAAU,MAAM;AACd,QAAI,iBAAkB,iBAAgB,gBAAgB;AAAA,EACxD,GAAG,CAAC,gBAAgB,CAAC;AAErB,YAAU,MAAM;AACd,QAAI,mBAAoB,mBAAkB,kBAAkB;AAAA,EAC9D,GAAG,CAAC,kBAAkB,CAAC;AAEvB,YAAU,MAAM;AACd,QAAI,YAAa,YAAW,WAAW;AAAA,EACzC,GAAG,CAAC,WAAW,CAAC;AAEhB,YAAU,MAAM;AACd,QAAI,iBAAkB,iBAAgB,gBAAgB;AAAA,EACxD,GAAG,CAAC,gBAAgB,CAAC;AAErB,YAAU,MAAM;AACd,QAAI,mBAAoB,mBAAkB,kBAAkB;AAAA,EAC9D,GAAG,CAAC,kBAAkB,CAAC;AAEvB,YAAU,MAAM;AACd,QAAI,WAAY,WAAU,UAAU;AAAA,EACtC,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,UAAU,YAAY,YAAY;AACtC,UAAM,aAAa,gBAAgB,cAAc,eAAe,cAAc;AAC9E,UAAM,gBAAgB,uBAAuB,UAAU;AACvD,UAAM,kBAAkB,WAAW,CAAC;AACpC,UAAM,qBAAqB,gBAAgB,sBAAsB,UAAU;AAC3E,UAAM,4BAA4B,gBAAgB,6BAA6B,UAAU;AACzF,UAAM,sBAAsB,gBAAgB,uBAAuB,UAAU;AAC7E,UAAM,iBAAiB,gBAAgB,kBAAkB,UAAU;AACnE,UAAM,qBAAqB,gBAAgB,sBAAsB,UAAU;AAC3E,UAAM,eAAe,gBAAgB,gBAAgB,UAAU;AAC/D,UAAM,uBAAuB,gBAAgB,wBAAwB,UAAU;AAC/E,UAAM,gBAAgB,gBAAgB,iBAAiB,UAAU;AACjE,UAAM,uBAAuB,gBAAgB,wBAAwB,UAAU;AAC/E,UAAM,gBAAgB,gBAAgB,iBAAiB,UAAU;AACjE,UAAM,qBAAqB,gBAAgB,sBAAsB,UAAU;AAE3E,4BAAwB,IAAI;AAC5B,0BAAsB,IAAI;AAC1B,cAAU,CAAC,aAAa,EAAE,GAAG,SAAS,SAAS,MAAM,YAAY,MAAM,OAAO,KAAK,EAAE;AAErF,QAAI;AACF,YAAM,qBAAqB,4BAA4B,MAAM,cAAc,UAAU,CAAC;AACtF,YAAM,oBAAoB,qBAAqB,4BAA4B,kBAAkB,IAAI;AACjG,UAAI,mBAAmB;AACrB,0BAAkB,kBAAkB;AACpC,yBAAiB,iBAAiB;AAAA,MACpC;AAEA,YAAM,iBAAiB,mBAAmB,cAAc,oBAAoB,cAAc;AAC1F,YAAM,mCAA6F,sBAC/F,oBAAoB,CAAC,CAAC,EAAE,MAAM,MAAM,MAAS,IAC7C,QAAQ,QAAQ,MAAS;AAC7B,YAAM,4BAA+E,eACjF,aAAa,CAAC,CAAC,EAAE,MAAM,MAAM,MAAS,IACtC,QAAQ,QAAQ,MAAS;AAE7B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpB,mBAAmB,EAAE,YAAY,eAAe,CAAC;AAAA,QACjD,0BAA0B,EAAE,YAAY,eAAe,CAAC;AAAA,QACxD;AAAA,QACA,eAAe,EAAE,YAAY,eAAe,CAAC;AAAA,QAC7C,mBAAmB,EAAE,YAAY,eAAe,CAAC;AAAA,QACjD;AAAA,QACA,qBAAqB,EAAE,YAAY,eAAe,CAAC;AAAA,QACnD,cAAc,EAAE,YAAY,eAAe,CAAC;AAAA,QAC5C,mBAAmB,EAAE,YAAY,eAAe,CAAC;AAAA,MACnD,CAAC;AAED,YAAM,uBAAuB,2BAA+D,yBAAyB,KAAK,CAAC;AAC3H,YAAM,gBAAgB,2BAAwD,kBAAkB,KAAK,CAAC;AACtG,YAAM,6BAA6B,2BAA2B,qBAAqB,IAAI,uCAAuC;AAC9H,YAAM,sBAAsB,oBAAoB,cAAc,IAAI,gCAAgC;AAElG,UAAI,yBAAyB;AAC7B,WAAK,CAAC,0BAA0B,uBAAuB,WAAW,MAAM,cAAc,UAAU,eAAe;AAC7G,cAAM,qBAAqB,uBAAuB,aAAa;AAC/D,cAAM,YAAY,oBAAoB,WAAW,oBAAoB;AACrE,YAAI,WAAW;AACb,gBAAM,kBAAkB,MAAM,cAAc,EAAE,IAAI,UAAU,CAAC,EAAE,MAAM,MAAM,MAAS;AACpF,gBAAM,gBAAgB,2BAanB,eAAe;AAClB,cAAI,eAAe,MAAM;AACvB,qCAAyB;AAAA,cACvB,mCAAmC;AAAA,gBACjC,MAAM,cAAc;AAAA,gBACpB,OAAO,cAAc;AAAA,gBACrB,YAAY,cAAc;AAAA,gBAC1B,SAAS,cAAc,WAAW,cAAc;AAAA,gBAChD,aAAa,cAAc;AAAA,gBAC3B,oBAAoB,cAAc;AAAA,gBAClC,OAAO,cAAc;AAAA,gBACrB,UAAU,cAAc;AAAA,gBACxB,OAAO,cAAc;AAAA,gBACrB,eAAe,cAAc;AAAA,gBAC7B,aAAa,cAAc;AAAA,gBAC3B,aAAa,cAAc;AAAA,cAC7B,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,0BAA0B,mBAC5B;AAAA,QACE,GAAG;AAAA,QACH,SAAS,kCAAkC,kBAAkB,qBAAqB,aAAa;AAAA,MACjG,KACC,MAAM;AACL,cAAM,sBAAsB,mCAAmC,+BAA+B,oBAAoB,CAAC;AACnH,eAAO,sBACH;AAAA,UACE,GAAG;AAAA,UACH,SAAS,kCAAkC,qBAAqB,qBAAqB,aAAa;AAAA,QACpG,IACA;AAAA,MACN,GAAG;AAEP,YAAM,oBAAoB,0BAA0B,aAAa,cAAc,mBAAmB,mBAAmB,eAAe,eAAe;AACnJ,YAAM,yBAAyB,oBAAoB,0BAA0B,yBAAyB,cAAc,mBAAmB,qBAAqB,aAAa;AACzK,YAAM,cAAc,eAAe,mBAAmB;AACtD,YAAM,gBAAgB,iBAAiB,sBAAsB;AAC7D,YAAM,wBAAwB,MAAM,qBAAqB;AAAA,QACvD,SAAS,aAAa;AAAA,QACtB,WAAW,eAAe;AAAA,QAC1B,eAAe,eAAe,iBAAiB,aAAa;AAAA,MAC9D,CAAC,EAAE,MAAM,MAAM,MAAS;AACxB,YAAM,2BAA2B;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,sBAAgB,uBAAuB;AACvC,6BAAuB,0BAA0B;AACjD,kBAAY,YAAY;AACxB,sBAAgB,mBAAmB;AACnC,wBAAkB,sBAAsB;AACxC,iBAAW,iBAAiB;AAC5B,sBAAgB,sBAAsB;AACtC,wBAAkB,wBAAwB;AAC1C,gBAAU,EAAE,SAAS,OAAO,YAAY,OAAO,OAAO,MAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,IACvG,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,4BAAsB,OAAO;AAC7B,gBAAU,CAAC,aAAa,EAAE,GAAG,SAAS,SAAS,OAAO,YAAY,OAAO,OAAO,QAAQ,EAAE;AAAA,IAC5F,UAAE;AACA,8BAAwB,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,WAAW,SAAS,eAAe,qBAAqB,cAAc,CAAC;AAE3E,QAAM,YAAY;AAAA,IAChB,OAAO,YAAkC;AACvC,YAAM,WAAW,0BAA0B,SAAS,aAAa;AACjE,YAAM,WAAW,mBAAmB,CAAC,UAAgC,UAAU,aAAa,KAAK;AACjG,YAAM,iBAAiB,SAAS,SAAS,cAAc,SAAS,SAAS;AACzE,YAAM,cAAc,iBAChB,0BAA0B,eAAe,SAAS,GAAG,KAAK,0BAA0B,eAAe,SAAS,SAAS,IACrH;AACJ,YAAM,kBAAkB,iBAAiB,4BAA4B,UAAU,aAAa,IAAI;AAEhG,UAAI,kBAAkB,CAAC,aAAa;AAClC,cAAM,IAAI,MAAM,iBAAiB,SAAS,GAAG,qDAAqD;AAAA,MACpG;AAEA,YAAM,gBAAgB,mBAAmB,eAAe,iBAAiB,mBAAmB,MAAS;AAErG,wBAAkB,CAAC,aAAa;AAAA,QAC9B,WAAW,SAAS;AAAA,QACpB,SAAS,SAAS;AAAA,QAClB,WAAW,SAAS;AAAA,QACpB,eAAe,SAAS;AAAA,QACxB,QAAQ;AAAA,QACR,YAAY,SAAS;AAAA,QACrB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,EAAE;AACF,gBAAU,CAAC,aAAa,EAAE,GAAG,SAAS,SAAS,MAAM,YAAY,MAAM,OAAO,KAAK,EAAE;AAErF,UAAI;AACF,YAAI;AACJ,YAAI,0BAA0B;AAC9B,YAAI,kBAAkB,iBAAiB;AACrC,gBAAM,gBAAgB,MAAM;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,eAAe;AACjB,qBAAS;AACT,sCAA0B;AAAA,UAC5B,OAAO;AACL,qBAAS,MAAM,SAAS,QAAQ;AAAA,UAClC;AAAA,QACF,OAAO;AACL,mBAAS,MAAM,SAAS,QAAQ;AAAA,QAClC;AAEA,YAAI,OAAO,WAAW,UAAU;AAC9B,gBAAM;AAAA,YACJ;AAAA,YACA,eAAe;AAAA,YACf,kBACI;AAAA,cACE,SAAS;AAAA,cACT,SAAS,OAAO,WAAW;AAAA,cAC3B,WAAW,OAAO,aAAa;AAAA,cAC/B,QAAQ;AAAA,cACR,SAAS,OAAO,WAAW;AAAA,cAC3B,WAAW,OAAO;AAAA,cAClB,YAAY,OAAO,cAAc;AAAA,cACjC,WAAW,OAAO,aAAa;AAAA,YACjC,IACA;AAAA,UACN;AAEA,4BAAkB,CAAC,aAAa;AAAA,YAC9B,WAAW,SAAS;AAAA,YACpB,SAAS,OAAO,WAAW,SAAS;AAAA,YACpC,WAAW,OAAO,aAAa,SAAS;AAAA,YACxC,eAAe,OAAO,iBAAiB,SAAS;AAAA,YAChD,QAAQ;AAAA,YACR,YAAY,OAAO,cAAc,SAAS;AAAA,YAC1C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,EAAE;AACF,oBAAU,CAAC,aAAa;AAAA,YACtB,GAAG;AAAA,YACH,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,OAAO,OAAO,WAAW,QAAQ,SAAS;AAAA,UAC5C,EAAE;AAEF,gBAAM;AAAA,YACJ;AAAA,YACA,eAAe;AAAA,YACf,kBACI;AAAA,cACE,SAAS;AAAA,cACT,SAAS,OAAO,WAAW;AAAA,cAC3B,WAAW,OAAO,aAAa;AAAA,cAC/B,QAAQ;AAAA,cACR,YAAY,OAAO,cAAc;AAAA,YACnC,IACA;AAAA,UACN;AAEA,gBAAM,QAAQ;AACd,iBAAO;AAAA,QACT;AAEA,cAAM;AAAA,UACJ;AAAA,UACA,eAAe;AAAA,UACf,mBAAmB,cACf;AAAA,YACE,SAAS;AAAA,YACT;AAAA,YACA,SAAS,OAAO,WAAW;AAAA,YAC3B,WAAW,OAAO,aAAa;AAAA,YAC/B,YAAY,OAAO,cAAc;AAAA,YACjC,WAAW,OAAO,aAAa;AAAA,UACjC,IACA;AAAA,QACN;AAEA,0BAAkB,CAAC,aAAa;AAAA,UAC9B,WAAW,SAAS;AAAA,UACpB,SAAS,SAAS;AAAA,UAClB,WAAW,SAAS;AAAA,UACpB,eAAe,SAAS;AAAA,UACxB,QACE,2BAA2B,OAAO,WAAW,WACzC,qBACA,OAAO,WAAW,WAChB,WACA,OAAO,WAAW,cAChB,SACA;AAAA,UACV,YAAY,OAAO,cAAc,SAAS;AAAA,UAC1C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,EAAE;AACF,YAAI,OAAO,cAAc,OAAO,YAAY;AAAA,QAE5C;AAEA,cAAM;AAAA,UACJ;AAAA,UACA,eAAe;AAAA,UACf,kBACI;AAAA,YACE,SAAS;AAAA,YACT,SAAS,OAAO,WAAW;AAAA,YAC3B,WAAW,OAAO,aAAa;AAAA,YAC/B,QAAQ;AAAA,YACR,YAAY,OAAO,cAAc;AAAA,UACnC,IACA;AAAA,QACN;AAEA,cAAM,QAAQ;AACd,eAAO;AAAA,MACT,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAM;AAAA,UACJ;AAAA,UACA,eAAe;AAAA,UACf,kBACI;AAAA,YACE,SAAS;AAAA,YACT,SAAS;AAAA,YACT,WAAW;AAAA,YACX,QAAQ;AAAA,YACR;AAAA,YACA,YAAY;AAAA,YACZ,WAAW;AAAA,UACb,IACA;AAAA,QACN;AACA,cAAM;AAAA,UACJ;AAAA,UACA,eAAe;AAAA,UACf,kBACI;AAAA,YACE,SAAS;AAAA,YACT,SAAS;AAAA,YACT,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,YAAY;AAAA,UACd,IACA;AAAA,QACN;AACA,0BAAkB,CAAC,aAAa;AAAA,UAC9B,WAAW,SAAS;AAAA,UACpB,SAAS,SAAS;AAAA,UAClB,WAAW,SAAS;AAAA,UACpB,eAAe,SAAS;AAAA,UACxB,QAAQ;AAAA,UACR,YAAY,SAAS;AAAA,UACrB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,EAAE;AACF,kBAAU,CAAC,aAAa,EAAE,GAAG,SAAS,SAAS,OAAO,YAAY,OAAO,OAAO,QAAQ,EAAE;AAC1F,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,WAAW,SAAS,eAAe,SAAS,aAAa;AAAA,EAC5E;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,YAAa;AAClB,QAAI,qBAAsB;AAC1B,QAAI,CAAC,iBAAiB,CAAC,oBAAoB;AACzC,WAAK,QAAQ;AAAA,IACf;AAAA,EACF,GAAG,CAAC,aAAa,SAAS,eAAe,oBAAoB,oBAAoB,CAAC;AAElF,QAAM,YAAY;AAAA,IAChB,MACE,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,gBAAAA,KAAC,mBAAmB,UAAnB,EAA4B,OAAO,WAClC,0BAAAA,KAAC,wBAAqB,cAA4B,qBAA0C,cAA4B,QACtH,0BAAAA,KAAC,mBAAgB,UAAoB,cAA4B,gBAAgC,QAC/F,0BAAAA,KAAC,mBAAgB,SAAkB,QAAiB,UAAS,GAC/D,GACF,GACF;AAEJ;AAEO,SAAS,oBAAoB,OAAiC;AACnE,SAAO,gBAAAA,KAAC,mBAAiB,GAAG,OAAO;AACrC;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqC;AACnC,QAAM,OAAO,mBAAmB,kBAAkB;AAClD,QAAM,gBAAgB,MAAM,iBAAiB,MAAM;AACnD,QAAM,eAAe,OAAO,gBAAgB,MAAM,cAAc;AAChE,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL,gBAAgB;AAAA,QACd,eAAe,8BAA8B,cAAc,aAAa,IAAI;AAAA,QAC5E,8BAA8B,MAAM,eAAe,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,cAAc,GAAG,aAAa;AAAA,MACzH;AAAA,MACA,cAAc,OAAO,cAAc,MAAM,YAAY;AAAA,MACrD,qBAAqB,OAAO,qBAAqB,MAAM,mBAAmB;AAAA,MAC1E,cAAc,OAAO,cAAc,MAAM,YAAY;AAAA,MACrD,QAAQ,OAAO,QAAQ,MAAM,MAAM;AAAA,IACrC;AAAA,IACA,CAAC,gBAAgB,MAAM,gBAAgB,MAAM,cAAc,MAAM,gBAAgB,MAAM,eAAe,MAAM,QAAQ,MAAM,cAAc,MAAM,qBAAqB,cAAc,eAAe,QAAQ,cAAc,qBAAqB,YAAY;AAAA,EACzP;AAEA,SAAO,gBAAAA,KAAC,2BAA2B,UAA3B,EAAoC,OAAe,UAAS;AACtE;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,OAAO,mBAAmB,kBAAkB;AAClD,QAAM,gBAAgB,MAAM,iBAAiB,MAAM;AACnD,QAAM,kBAAkB,OAAO,mBAAmB,MAAM,iBAAiB;AACzE,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL,mBAAmB;AAAA,QACjB,kBAAkB,8BAA8B,iBAAiB,aAAa,IAAI;AAAA,QAClF,8BAA8B,MAAM,eAAe,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,GAAG,aAAa;AAAA,MACpH;AAAA,MACA,UAAU,OAAO,UAAU,MAAM,QAAQ;AAAA,MACzC,cAAc,OAAO,cAAc,MAAM,YAAY;AAAA,MACrD,gBAAgB,OAAO,gBAAgB,MAAM,cAAc;AAAA,MAC3D,QAAQ,OAAO,QAAQ,MAAM,MAAM;AAAA,IACrC;AAAA,IACA,CAAC,mBAAmB,MAAM,mBAAmB,MAAM,cAAc,MAAM,gBAAgB,MAAM,UAAU,MAAM,gBAAgB,MAAM,eAAe,MAAM,QAAQ,cAAc,gBAAgB,UAAU,eAAe,QAAQ,eAAe;AAAA,EAChP;AAEA,SAAO,gBAAAA,KAAC,sBAAsB,UAAtB,EAA+B,OAAe,UAAS;AACjE;AAEO,SAAS,gBAAgB,EAAE,UAAU,SAAS,OAAO,GAAgC;AAC1F,QAAM,OAAO,mBAAmB,kBAAkB;AAClD,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL,SAAS,OAAO,SAAS,MAAM,OAAO;AAAA,MACtC,QAAQ,OAAO,QAAQ,MAAM,MAAM;AAAA,IACrC;AAAA,IACA,CAAC,SAAS,MAAM,SAAS,MAAM,QAAQ,MAAM;AAAA,EAC/C;AAEA,SAAO,gBAAAA,KAAC,sBAAsB,UAAtB,EAA+B,OAAe,UAAS;AACjE;AASO,SAAS,oBAA6C;AAC3D,SAAO,uBAAuB;AAChC;AAEO,SAAS,oBAAyC;AACvD,QAAM,OAAO,uBAAuB;AACpC,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,KAAK,kBAAkB,KAAK;AAAA,MACrC,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,gBAAgB,KAAK,eAAe,KAAK,oBAAoB,KAAK,oBAAoB;AAAA,EAC5G;AACF;AASO,SAAS,eAAe,SAAmC;AAChE,QAAM,OAAO,uBAAuB;AACpC,SAAO,QAAQ,MAAM;AACnB,UAAM,OAAO,mBAAmB,KAAK,eAAe,OAAO,OAAO;AAClE,WAAO;AAAA,MACL,MAAM,8BAA8B,IAAI;AAAA,MACxC,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,KAAK,SAAS,KAAK,eAAe,OAAO,KAAK,oBAAoB,KAAK,sBAAsB,OAAO,CAAC;AAC3G;AASO,SAAS,wBAAwB,WAA8C;AACpF,QAAM,OAAO,uBAAuB;AACpC,QAAM,gBAAgB,KAAK,SAAS,iBAAiB,KAAK,UAAU;AACpE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkD;AAChF,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,QAAM,UAAU,YAAY,YAAY;AACtC,QAAI,CAAC,iBAAiB,CAAC,WAAW;AAChC,iBAAW,MAAS;AACpB,eAAS,YAAY,oCAAoC,IAAI;AAC7D,iBAAW,KAAK;AAChB;AAAA,IACF;AAEA,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,WAAW,MAAM,cAAc,EAAE,IAAI,UAAU,CAAC;AACtD,YAAM,SAAS,2BAAwD,QAAQ;AAC/E,iBAAW,MAAM;AACjB,eAAS,IAAI;AAAA,IACf,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,iBAAW,MAAS;AACpB,eAAS,OAAO;AAAA,IAClB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,aAAa,CAAC;AAE7B,YAAU,MAAM;AACd,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,WAAW,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAC7D,OAAO,SAAS,KAAK,sBAAsB,KAAK,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAAC,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,OAAO,SAAS,SAAS,OAAO;AAAA,EAC/H;AACF;AAcO,SAAS,iCAAiC,WAAmB,uBAAoE;AACtI,QAAM,cAAc,wBAAwB,SAAS;AACrD,QAAM,CAAC,cAAc,eAAe,IAAI,SAA6B,qBAAqB;AAE1F,YAAU,MAAM;AACd,QAAI,uBAAuB;AACzB,sBAAgB,qBAAqB;AACrC;AAAA,IACF;AAEA,UAAM,UAAU,YAAY;AAC5B,UAAM,mBAAmB,SAAS,YAAY,CAAC,KAAK,SAAS,eAAe,CAAC,GAAG;AAChF,QAAI,CAAC,gBAAiB,WAAW,CAAC,QAAQ,WAAW,SAAS,YAAY,KAAK,CAAC,QAAQ,cAAc,KAAK,CAAC,SAAS,KAAK,SAAS,YAAY,GAAI;AACjJ,sBAAgB,gBAAgB;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,uBAAuB,YAAY,CAAC;AAE7D,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,YAAY;AAAA,MACrB,WAAW,YAAY,SAAS,aAAa,CAAC;AAAA,MAC9C,cAAc,YAAY,SAAS,gBAAgB,CAAC;AAAA,MACpD;AAAA,MACA,kBAAkB,YAAY,SAAS,cAAc,KAAK,CAAC,SAAS,KAAK,SAAS,YAAY;AAAA,MAC9F;AAAA,MACA,SAAS,YAAY;AAAA,MACrB,OAAO,YAAY;AAAA,MACnB,SAAS,YAAY;AAAA,IACvB;AAAA,IACA,CAAC,YAAY,OAAO,YAAY,SAAS,YAAY,SAAS,YAAY,SAAS,YAAY;AAAA,EACjG;AACF;AASO,SAAS,kBAAkB,WAAwC;AACxE,QAAM,OAAO,uBAAuB;AACpC,QAAM,SAAS,KAAK,SAAS,iBAAiB,KAAK,UAAU;AAC7D,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,EAAE,IAAI,UAAU,IAAI,CAAC,SAAS,CAAC;AAAA,IAClD,CAAC,WAAW,MAAM;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,eAAe,QAAgB,gBAAgB,OAAyB;AACtF,QAAM,OAAO,uBAAuB;AACpC,QAAM,SAAS,KAAK,SAAS,cAAc,KAAK,UAAU;AAC1D,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,EAAE,IAAI,QAAQ,cAAc,IAAI,CAAC,eAAe,MAAM,CAAC;AAAA,IAC1E,CAAC,eAAe,QAAQ,MAAM;AAAA,IAC9B;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,SAAoC;AAClE,QAAM,OAAO,uBAAuB;AACpC,QAAM,SAAS,KAAK,SAAS,eAAe,KAAK,UAAU;AAC3D,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,EAAE,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC;AAAA,IAC9C,CAAC,QAAQ,OAAO;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,6BAA6B,gBAAwD;AACnG,QAAM,OAAO,uBAAuB;AACpC,QAAM,SAAS,KAAK,SAAS,4BAA4B,KAAK,UAAU;AACxE,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,EAAE,IAAI,eAAe,IAAI,CAAC,cAAc,CAAC;AAAA,IAC5D,CAAC,QAAQ,cAAc;AAAA,IACvB;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,UAA+D,CAAC,GAAuB;AACtH,QAAM,OAAO,uBAAuB;AACpC,QAAM,SAAS,KAAK,SAAS,gBAAgB,KAAK,UAAU;AAC5D,QAAM,QAAQ,QAAQ;AACtB,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,QAAQ;AACxB,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,EAAE,OAAO,MAAM,QAAQ,IAAI,CAAC,OAAO,SAAS,IAAI,CAAC;AAAA,IACpE,CAAC,QAAQ,OAAO,SAAS,IAAI;AAAA,IAC7B;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,UAA6C,CAAC,GAA8B;AAClH,QAAM,OAAO,uBAAuB;AACpC,QAAM,SAAS,KAAK,SAAS,uBAAuB,KAAK,UAAU;AACnE,QAAM,QAAQ,QAAQ;AACtB,QAAM,OAAO,QAAQ;AACrB,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC;AAAA,IAClD,CAAC,QAAQ,OAAO,IAAI;AAAA,IACpB;AAAA,EACF;AACF;AAaO,SAAS,uBACd,WACA,gBAAgB,OAChB,mBAC0B;AAC1B,QAAM,eAAe,kBAAkB,SAAS;AAChD,QAAM,OAAO,uBAAuB;AACpC,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAA6B,iBAAiB;AAC9F,QAAM,aAAa,KAAK,SAAS,cAAc,KAAK,UAAU;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAqC,CAAC,CAAC;AACjE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAE9D,YAAU,MAAM;AACd,QAAI,mBAAmB;AACrB,0BAAoB,iBAAiB;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,iBAAiB,CAAC;AAEtB,YAAU,MAAM;AACd,UAAM,eAAe,oBAAoB,aAAa,MAAM,QAAQ,CAAC;AACrE,QAAI,CAAC,gBAAiB,oBAAoB,aAAa,MAAM,SAAS,CAAC,aAAa,KAAK,MAAM,SAAS,gBAAgB,GAAI;AAC1H,0BAAoB,aAAa,MAAM,QAAQ,CAAC,CAAC;AACjD;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB,cAAc;AACrC,0BAAoB,YAAY;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,aAAa,MAAM,OAAO,gBAAgB,CAAC;AAE/C,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI,CAAC,YAAY;AACf,eAAS,CAAC,CAAC;AACX,mBAAa,8BAA8B;AAC3C,qBAAe,KAAK;AACpB;AAAA,IACF;AAEA,UAAM,YAAY,aAAa,MAAM,SAAS,CAAC;AAC/C,QAAI,CAAC,UAAU,QAAQ;AACrB,eAAS,CAAC,CAAC;AACX,mBAAa,IAAI;AACjB,qBAAe,KAAK;AACpB;AAAA,IACF;AAEA,mBAAe,IAAI;AACnB,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,UAAU,IAAI,OAAO,aAAa;AAChC,gBAAM,WAAW,MAAM,WAAW,EAAE,IAAI,UAAU,cAAc,CAAC;AACjE,iBAAO,2BAAqD,QAAQ;AAAA,QACtE,CAAC;AAAA,MACH;AACA,eAAS,QAAQ,OAAO,CAAC,SAA2C,QAAQ,IAAI,CAAC,CAAC;AAAA,IACpF,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,eAAS,CAAC,CAAC;AACX,mBAAa,OAAO;AAAA,IACtB,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,eAAe,YAAY,aAAa,MAAM,KAAK,CAAC;AAExD,YAAU,MAAM;AACd,SAAK,aAAa;AAAA,EACpB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,eAAe;AAAA,IACnB,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,gBAAgB,MAAM,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI;AAAA,IAC/F,CAAC,OAAO,gBAAgB;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,aAAa;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,aAAa,WAAW;AAAA,MACjC,OAAO,aAAa,SAAS;AAAA,MAC7B,SAAS,YAAY;AACnB,cAAM,aAAa,QAAQ;AAC3B,cAAM,aAAa;AAAA,MACrB;AAAA,IACF;AAAA,IACA,CAAC,WAAW,aAAa,OAAO,cAAc,cAAc,cAAc,gBAAgB;AAAA,EAC5F;AACF;AAaO,SAAS,sCACd,WACA,gBAAgB,OAChB,mBACyC;AACzC,QAAM,eAAe,uBAAuB,WAAW,eAAe,iBAAiB;AACvF,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,aAAa;AAAA,MACtB,OAAO,aAAa;AAAA,MACpB,kBAAkB,aAAa;AAAA,MAC/B,cAAc,aAAa;AAAA,MAC3B,qBAAqB,aAAa;AAAA,MAClC,SAAS,aAAa;AAAA,MACtB,OAAO,aAAa;AAAA,MACpB,SAAS,aAAa;AAAA,IACxB;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AACF;AASO,SAAS,qBAA2C;AACzD,QAAM,OAAO,uBAAuB;AACpC,QAAM,iBAAiB,mBAAmB,qBAAqB;AAC/D,QAAM,WAAW,OAAO,gBAAgB,UAAU,KAAK,QAAQ,KAAK,CAAC;AACrE,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,QAAQ;AAAA,EACrH;AACF;AASO,SAAS,2BAAuD;AACrE,QAAM,OAAO,uBAAuB;AACpC,QAAM,sBAAsB,mBAAmB,0BAA0B;AACzE,QAAM,QAAQ,OAAO,qBAAqB,gBAAgB,KAAK,cAAc,KAAK,CAAC;AACnF,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,gBAAgB,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK;AAAA,EACvI;AACF;AASO,SAAS,8BAA6D;AAC3E,QAAM,OAAO,uBAAuB;AACpC,QAAM,iBAAiB,mBAAmB,qBAAqB;AAC/D,QAAM,QAAQ,OAAO,gBAAgB,mBAAmB,KAAK,iBAAiB,KAAK,CAAC;AACpF,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,mBAAmB,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK;AAAA,EAC1I;AACF;AASO,SAAS,uBAAuB,WAA0E,CAAC,GAA6B;AAC7I,QAAM,OAAO,uBAAuB;AACpC,QAAM,iBAAiB,mBAAmB,qBAAqB;AAC/D,QAAM,SAAS,OAAO,gBAAgB,cAAc,KAAK,YAAY,KAAK,CAAC;AAC3E,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,MAAM;AAAA,EACnH;AACF;AASO,SAAS,yBAAyB,WAAqD,CAAC,GAA+B;AAC5H,QAAM,OAAO,uBAAuB;AACpC,QAAM,iBAAiB,mBAAmB,qBAAqB;AAC/D,QAAM,WAAW,OAAO,gBAAgB,gBAAgB,KAAK,cAAc,KAAK,CAAC;AACjF,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,QAAQ;AAAA,EACrH;AACF;AASO,SAAS,yBAAuD;AACrE,QAAM,OAAO,uBAAuB;AACpC,QAAM,sBAAsB,mBAAmB,0BAA0B;AACzE,SAAO;AAAA,IACL,OAAO;AAAA,MACL,cAAc,OAAO,qBAAqB,cAAc,KAAK,YAAY;AAAA,MACzE,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,KAAK,cAAc,qBAAqB,YAAY;AAAA,EACjK;AACF;AASO,SAAS,gCAAiE;AAC/E,QAAM,OAAO,uBAAuB;AACpC,QAAM,sBAAsB,mBAAmB,0BAA0B;AACzE,QAAM,eAAe,OAAO,qBAAqB,cAAc,KAAK,YAAY;AAChF,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,cAAc,WAAW,kCAAkC,cAAc,KAAK,aAAa;AAAA,MACpG,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,eAAe,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,YAAY;AAAA,EAC7I;AACF;AASO,SAAS,8BAA8B,WAAqD,CAAC,GAAoC;AACtI,QAAM,OAAO,uBAAuB;AACpC,QAAM,sBAAsB,mBAAmB,0BAA0B;AACzE,QAAM,UAAU,OAAO,qBAAqB,qBAAqB,KAAK,mBAAmB,KAAK,CAAC;AAC/F,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,OAAO;AAAA,EACpH;AACF;AASO,SAAS,oBAA6C;AAC3D,QAAM,OAAO,uBAAuB;AACpC,QAAM,iBAAiB,mBAAmB,qBAAqB;AAC/D,QAAM,UAAU,OAAO,gBAAgB,SAAS,KAAK,OAAO,KAAK,0BAA0B,QAAW,KAAK,UAAU,KAAK,eAAe,eAAe;AACxJ,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,eAAe,iBAAiB,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,UAAU,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,OAAO;AAAA,EACxK;AACF;AASO,SAAS,yBAAuD;AACrE,QAAM,OAAO,uBAAuB;AACpC,QAAM,sBAAsB,mBAAmB,0BAA0B;AACzE,QAAM,eACJ,OAAO,qBAAqB,cAAc,KAAK,YAAY,KAC3D,0BAA0B,qBAAqB,gBAAgB,KAAK,cAAc,KAAK,UAAU,KAAK,SAAS,KAAK,aAAa;AACnI,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,UAAU,KAAK,SAAS,KAAK,eAAe,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,cAAc,qBAAqB,cAAc,KAAK,YAAY;AAAA,EAChO;AACF;AASO,SAAS,2BAAsD;AACpE,QAAM,OAAO,uBAAuB;AACpC,QAAM,iBAAiB,mBAAmB,qBAAqB;AAC/D,QAAM,QAAQ,eAAe,OAAO,gBAAgB,cAAc,KAAK,YAAY,CAAC;AACpF,QAAM,UAAU,iBAAiB,OAAO,gBAAgB,gBAAgB,KAAK,cAAc,CAAC;AAC5F,QAAM,iBAAiB,KAAK,kBAAkB,+BAA+B,QAAW,OAAO,OAAO;AACtG,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,wBAAwB,KAAK,OAAO;AAAA,MAClD,OAAO,KAAK,sBAAsB,KAAK,OAAO;AAAA,MAC9C,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,gBAAgB,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,OAAO,SAAS,cAAc;AAAA,EAChK;AACF;AAMO,SAAS,mBAAsC;AACpD,QAAM,OAAO,uBAAuB;AACpC,SAAO,QAAQ,OAAO,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM,CAAC;AAC/D;AAMO,SAAS,oBAAwC;AACtD,QAAM,OAAO,uBAAuB;AACpC,SAAO,QAAQ,OAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO,CAAC;AAClE;AAUO,SAAS,mBAAmB,UAAkC,CAAC,GAA0B;AAC9F,QAAM,OAAO,uBAAuB;AACpC,QAAM,qBAAqB,yBAAyB;AAEpD,QAAM,MAAM;AAAA,IACV,OAAO,YAAkC;AACvC,YAAM,WAAW,QAAQ,iBAAiB,MAAM,QAAQ,eAAe,OAAO,IAAI;AAClF,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,UAAU,QAAQ;AAC5C,YAAI,QAAQ,eAAe;AACzB,gBAAM,QAAQ,cAAc,EAAE,YAAY,OAAO,YAAY,YAAY,OAAO,WAAW,CAAC;AAAA,QAC9F;AAAA,MACF,SAAS,OAAO;AACd,YAAI,QAAQ,SAAS;AACnB,gBAAM,QAAQ,QAAQ,KAAK;AAAA,QAC7B;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,MAAM,OAAO;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,OAAO,WAAW,KAAK;AAAA,MACrC,OAAO,KAAK,OAAO,SAAS,KAAK;AAAA,MACjC,gBAAgB,mBAAmB;AAAA,MACnC,SAAS,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,KAAK,SAAS,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,OAAO,OAAO,KAAK,OAAO,SAAS,mBAAmB,gBAAgB,GAAG;AAAA,EACnJ;AACF;AAQA,SAAS,uBAAuB,MAAyB,UAAmE;AAC1H,QAAM,WAAW,mBAAmB;AACpC,QAAM,MAAM;AAAA,IACV,OAAO,YAAkC;AACvC,YAAM,SAAS,IAAI;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,UAAU,MAAM,QAAQ;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,IAClB;AAAA,IACA,CAAC,SAAS,OAAO,SAAS,SAAS,GAAG;AAAA,EACxC;AACF;AAEO,SAAS,mBAA4C;AAC1D,SAAO,uBAAuB,WAAW;AAC3C;AAEO,SAAS,wBAAiD;AAC/D,SAAO,uBAAuB,QAAQ;AACxC;AAEO,SAAS,iBAA0C;AACxD,SAAO,uBAAuB,SAAS;AACzC;AAEO,SAAS,wBAAiD;AAC/D,SAAO,uBAAuB,QAAQ;AACxC;AAEO,SAAS,qBAA8C;AAC5D,SAAO,uBAAuB,UAAU;AAC1C;AASO,SAAS,kBAAkB,YAA6C;AAC7E,QAAM,gBAAgB,mBAAmB;AACzC,QAAM,UAAU,cAAc,SAAS,KAAK,CAAC,SAAS,KAAK,eAAe,UAAU;AACpF,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA,SAAS,cAAc;AAAA,MACvB,OAAO,cAAc;AAAA,MACrB,SAAS,cAAc;AAAA,IACzB;AAAA,IACA,CAAC,SAAS,cAAc,OAAO,cAAc,SAAS,cAAc,OAAO;AAAA,EAC7E;AACF;AAEO,SAAS,0BAA+C;AAC7D,SAAO,kBAAkB;AAC3B;","names":["jsx"]}
|
|
@@ -83,12 +83,16 @@ npx @foldspace-fe/casdoor-next-auth-kit@latest check
|
|
|
83
83
|
- `BillingProvider` / `BillingCoreProvider` — headless billing runtime 的根 Provider,支持 `purchasableIds` 白名单、`purchasables` 显式条目、Casdoor 商品购买适配器和购买回调 hooks
|
|
84
84
|
- `SubscriptionProvider` / `ProductProvider` / `CreditsProvider` — 分域 billing Provider,按需注入订阅、商品和额度状态
|
|
85
85
|
- `useBillingAvailablePlans` / `useBillingAvailableProducts` — 从配置或注入的 catalog 中读取可订阅套餐和可购买商品列表,并自动过滤白名单外条目
|
|
86
|
-
- `
|
|
87
|
-
- `
|
|
86
|
+
- `useBillingPricing` / `useBillingPlan` / `useBillingPricingPlans` / `useBillingSubscriptionPurchaseOptions` — 读取订阅定价、单个计划、计划组合和订阅购买选项
|
|
87
|
+
- `useBillingSubscription` / `useBillingSubscriptionHistory` / `useBillingSubscriptionRecord` / `useBillingSubscriptions` / `useBillingSubscriptionProduct` — 查看当前订阅、订阅历史、订阅记录、订阅列表和当前订阅对应产品
|
|
88
|
+
- `useBillingProducts` / `useBillingProduct` / `useBillingProductDetail` / `useBillingProductPurchaseOptions` / `useBillingOrder` / `useBillingOrders` / `useBillingOrderHistory` / `useBillingPaymentHistory` — 查看商品状态、商品详情、商品购买选项、单条订单、订单列表、订单历史和支付历史
|
|
88
89
|
- `useBillingCredits` / `useBillingEntitlements` / `useBillingPurchaseStatus` — 查看额度、权益和归一化购买状态
|
|
89
|
-
- `useSubscribePlan` / `usePurchaseProduct` —
|
|
90
|
+
- `useSubscribePlan` / `usePurchaseProduct` — 发起订阅和商品购买动作,单次购买只针对一个具体条目;订阅购买会先走定价和计划查询,商品购买会先走商品详情解析,再组装 Casdoor 的下单参数
|
|
90
91
|
- `useBillingRefresh` / `useBillingPipeline` — 刷新 billing 状态和编排动作执行链路
|
|
91
92
|
|
|
93
|
+
订阅域和商品域要保持分离:`kind: 'subscription'` 的 catalog 条目只负责定价、计划和订阅状态,`kind: 'product'` 的 catalog 条目只负责商品、订单和支付状态。两类条目可以共存于同一个 catalog,但不要把它们压成一套无差别的购买对象。
|
|
94
|
+
这条约定已经由 `packages/auth-kit/test/billing-subscription-domain.test.ts` 锁住;后续如果调整 catalog、购买 payload 或订阅购买路径,优先更新这个回归测试,确保订阅和商品仍然是两条独立链路。
|
|
95
|
+
|
|
92
96
|
## 路由模型
|
|
93
97
|
|
|
94
98
|
认证套件采用同源路由架构,所有认证相关页面均在宿主应用域名下呈现:
|
|
@@ -112,6 +116,8 @@ Billing 的购买白名单可以通过 `BillingCatalogConfig.purchasableIds` 或
|
|
|
112
116
|
|
|
113
117
|
商品购买的包内适配器会优先读取 Casdoor 商品详情,再按 `owner/name` 解析商品 ID,并自动选择可用 provider 后调用 `buy-product` 兼容接口;宿主只需要提供允许购买的商品 id 和相应的 Casdoor 接口 loader。loader 约定使用 Casdoor 的标准响应 envelope,然后从 `data` 中取出商品、组织、账号、应用或支付记录。`buy-product` 如果返回 `status: "error"`,包内会把 `msg` 里的错误信息和错误码透传到宿主的 `onPurchaseError` / `onPurchaseComplete`。`useBillingProductDetail` 会把商品详情里的 `providers` 和 `providerObjs` 暴露给宿主,`useBillingProductPurchaseOptions` 可以直接拿到商品详情、当前 provider 选择、当前选中 provider 对象和 setter,适合商品详情页按支付方式展示不同购买参数;宿主选中的 `providerName` 也可以直接传给 `purchaseProduct.run({ key, providerName })`,让包内适配器按这个 provider 下单。这个 hook 只是给单选场景提供默认态,如果宿主想同时渲染两个不同的支付入口,直接遍历 `providerObjs` 就行,`selectedProvider` 不会限制 UI 结构。`productId` 推荐写成 `owner/name` 形式,例如 `qixiaoju/创小剧积分包-50`,和 `GET /api/get-product?id=qixiaoju/创小剧积分包-50` 的查询值保持一致。支付结果轮询和 `get-account` / `get-application` / `get-payment` 这类浏览器侧查询,优先请求 `/auth/api/*` 同域代理;只有服务端或明确启用 CORS 的特殊场景,才考虑直接连 `NEXT_PUBLIC_CASDOOR_SERVER_URL` origin 的 `/api/*`。
|
|
114
118
|
|
|
119
|
+
SaaS 订阅状态建议直接接 Casdoor 的 `get-pricing` / `get-plan` / `get-subscription` / `get-subscriptions`,产品购买后的订单列表和订单状态建议直接接 Casdoor 的 `get-order` / `get-orders` / `get-payment`。宿主本地的 `BillingSubscriptionState`、`BillingOrderHistoryItem`、`BillingPurchaseStatus` 只应该是归一化展示层,不应该成为真相源;如果宿主需要展示订阅计划价格、计划列表、订单详情或支付明细,优先从这些 Casdoor 查询 loader 里取 `data`。订阅 catalog 条目和商品 catalog 条目可以共存,但 UI 和购买参数生成要保持两个分支各自独立。
|
|
120
|
+
|
|
115
121
|
## 宿主工程 `proxy.ts` 配置要求
|
|
116
122
|
|
|
117
123
|
`proxy.ts` 是宿主工程的 Next.js middleware(通常放在项目根目录,在 `next.config.ts` 中通过 `middleware` 字段指向),不属于 `@foldspace-fe/casdoor-next-auth-kit` 的受管文件。它的核心职责是**认证守卫**——拦截未登录用户对业务页面的访问,将其重定向到登录页;同时放行所有公开路径和认证流程路径。
|
|
@@ -385,9 +391,11 @@ Billing headless 能力的方案、接口草案和设计图已经放在仓库文
|
|
|
385
391
|
Billing 的宿主接入方式是:
|
|
386
392
|
|
|
387
393
|
1. 在宿主应用里通过 `BillingProvider` 注入 `runtimeConfig` 或显式的 `availablePlans` / `availableProducts`
|
|
388
|
-
2.
|
|
389
|
-
3.
|
|
390
|
-
4. 使用 `
|
|
394
|
+
2. 如果要做订阅面板,优先用 `useBillingPricing` / `useBillingPlan` / `useBillingPricingPlans` / `useBillingSubscriptionPurchaseOptions`
|
|
395
|
+
3. 如果要做商品面板,优先用 `useBillingProductDetail` / `useBillingProductPurchaseOptions`
|
|
396
|
+
4. 使用 `useSubscribePlan`、`usePurchaseProduct` 发起动作
|
|
397
|
+
5. 使用 `useBillingSubscription`、`useBillingSubscriptionHistory`、`useBillingSubscriptionRecord`、`useBillingSubscriptions`、`useBillingOrder`、`useBillingOrders`、`useBillingOrderHistory`、`useBillingPaymentHistory`、`useBillingCredits` 查看状态
|
|
398
|
+
6. 使用 `useBillingPipeline` 或 `actionExecutor` 接入宿主自己的支付、跳转和后端编排逻辑
|
|
391
399
|
|
|
392
400
|
购买动作只保留两类:
|
|
393
401
|
|