import { O as UsageStatus, d as Invoice, g as Plan, s as FeatureRegistry, u as FeatureValues, x as SubscriptionWithPlan, y as Subscription } from "../types-3EaBC58c.js"; import { B as ChangePlanResult, W as PlanChangePreview, t as Subscriptions } from "../index-gRqfQZ6n.js"; import { t as PdfRenderer } from "../pdf-renderer-B-BQphqe.js"; import { Elysia } from "elysia"; //#region src/integrations/elysia.d.ts /** * Platform info for invoice rendering */ interface PlatformInfo { name: string; logo?: string; website?: string; supportEmail?: string; address?: string; } /** * Subscriber info resolver for invoice rendering */ type SubscriberInfoResolver = (subscriberId: string) => Promise<{ name?: string; email?: string; phone?: string; address?: string; } | null>; /** * Options for the Elysia plugin */ interface ElysiaPluginOptions { /** * Route prefix for subscription endpoints * @default '/subscriptions' */ prefix?: TPrefix; /** * Function to extract subscriber ID from context * Defaults to using `user.activeTenantId` */ getSubscriberId?: (ctx: unknown) => string | Promise; /** * Enable admin routes (plan management) * @default true */ adminRoutes?: boolean; /** * Custom authorization check for admin routes */ adminGuard?: (ctx: unknown) => boolean | Promise; /** * Invoice configuration for PDF/HTML generation * * The download route (`GET /invoices/:id/download`) supports two modes via * the `format` query param: * - `format=pdf` (default) — server-generated PDF. Uses `pdfRenderer` when * configured (any runtime), otherwise falls back to the Node.js puppeteer * renderer. * - `format=html` — printable invoice HTML; add `print=1` for a print-ready * page and `autoPrint=1` to open the browser print dialog on load * (client-side "Save as PDF", zero server cost). */ invoice?: { /** * Path to custom Handlebars template (Node.js filesystem only). * Prefer `templateSource` on non-Node runtimes. Defaults to the built-in * inlined template, which needs no filesystem at all. */ templatePath?: string; /** * Inline Handlebars template source. Runtime-agnostic alternative to * `templatePath`; takes precedence when both are set. */ templateSource?: string; /** * PDF renderer for `format=pdf` (e.g. `puppeteerPdfRenderer` on Node, * `cloudflarePdfRenderer` on Workers). When omitted, the legacy Node.js * puppeteer path is used. */ pdfRenderer?: PdfRenderer; /** * Platform information for invoice header */ platform?: PlatformInfo; /** * Function to resolve subscriber info for invoice */ getSubscriberInfo?: SubscriberInfoResolver; /** * Default locale for date/currency formatting * @default 'ar-EG' */ locale?: string; }; } /** * Create an Elysia plugin for subscription management * * @example * ```typescript * import { elysiaPlugin } from '@abshahin/subscriptions/elysia'; * * app.use(elysiaPlugin(subs, { * getSubscriberId: (ctx) => ctx.user.activeTenantId, * })); * ``` */ declare function elysiaPlugin(subs: Subscriptions, options?: ElysiaPluginOptions): Elysia; macroFn: { /** * Require a boolean feature to be enabled * * @example * ```typescript * app.get('/analytics', handler, { requireFeature: 'analytics' }) * ``` */ readonly requireFeature: (feature: keyof TFeatures) => { readonly beforeHandle: (ctx: unknown) => Promise; }; /** * Require usage capacity for a limited feature * * @example * ```typescript * app.post('/products', handler, { requireUsage: { feature: 'maxProducts', count: 1 } }) * ``` */ readonly requireUsage: (config: { feature: keyof TFeatures; count?: number; }) => { readonly beforeHandle: (ctx: unknown) => Promise; }; /** * Increment usage after successful handler execution * * @example * ```typescript * app.post('/products', handler, { useFeature: 'maxProducts' }) * ``` */ readonly useFeature: (feature: keyof TFeatures) => { readonly afterHandle: (ctx: unknown) => Promise; }; }; parser: {}; response: {}; }, {} & import("elysia").CreateEden<`${TPrefix}/current`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/current`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_1) ? T_1 extends import("elysia/types").IntersectIfObject, unknown> ? T_1 extends object ? { [K_1 in keyof T_1]: T_1[K_1]; } : T_1 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_2) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ subscription: SubscriptionWithPlan | null; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T) ? { [K in keyof T]: T[K]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/plans`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/plans`>, {}>, () => Promise<{ plans: Plan[]; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_1) ? { [K_1 in keyof T_1]: T_1[K_1]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/subscribe`, { post: { body: { trialDays?: number; verifiedTokenId?: string; paymentId?: string; planId: string; }; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; } | { error: string; subscription?: never; } | { subscription: Subscription; error?: never; }; 422: { type: "validation"; on: string; summary?: string; message?: string; found?: unknown; property?: string; expected?: string; }; }; }; }> & import("elysia").CreateEden<`${TPrefix}/create`, { post: { body: { trialDays?: number; verifiedTokenId?: string; paymentId?: string; planId: string; }; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; } | { error: string; subscription?: never; } | { subscription: Subscription; error?: never; }; 422: { type: "validation"; on: string; summary?: string; message?: string; found?: unknown; property?: string; expected?: string; }; }; }; }> & import("elysia").CreateEden<`${TPrefix}/change-plan`, { post: { body: { verifiedTokenId?: string; paymentId?: string; immediately?: boolean; prorate?: boolean; tokenId?: string; callbackUrl?: string; skipPayment?: boolean; planId: string; }; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; } | ChangePlanResult; 422: { type: "validation"; on: string; summary?: string; message?: string; found?: unknown; property?: string; expected?: string; }; }; }; }> & import("elysia").CreateEden<`${TPrefix}/change-plan/preview/:planId`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? { planId: string; } & {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/change-plan/preview/:planId`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_3) ? T_3 extends import("elysia/types").IntersectIfObject, unknown> ? T_3 extends object ? { [K_3 in keyof T_3]: T_3[K_3]; } : T_3 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_4) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ preview: PlanChangePreview; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_2) ? { [K_2 in keyof T_2]: T_2[K_2]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/cancel`, { post: { body: { immediately?: boolean; reason?: string; }; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; } | { subscription: Subscription; }; 422: { type: "validation"; on: string; summary?: string; message?: string; found?: unknown; property?: string; expected?: string; }; }; }; }> & import("elysia").CreateEden<`${TPrefix}/resume`, { post: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/resume`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_4) ? T_4 extends import("elysia/types").IntersectIfObject, unknown> ? T_4 extends object ? { [K_4 in keyof T_4]: T_4[K_4]; } : T_4 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_5) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ subscription: Subscription; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_3) ? { [K_3 in keyof T_3]: T_3[K_3]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/reactivate`, { post: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/reactivate`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_5) ? T_5 extends import("elysia/types").IntersectIfObject, unknown> ? T_5 extends object ? { [K_5 in keyof T_5]: T_5[K_5]; } : T_5 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_6) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ subscription: Subscription; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_4) ? { [K_4 in keyof T_4]: T_4[K_4]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/features`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/features`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_6) ? T_6 extends import("elysia/types").IntersectIfObject, unknown> ? T_6 extends object ? { [K_6 in keyof T_6]: T_6[K_6]; } : T_6 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_7) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ features: FeatureValues; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_5) ? { [K_5 in keyof T_5]: T_5[K_5]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/usage`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/usage`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_7) ? T_7 extends import("elysia/types").IntersectIfObject, unknown> ? T_7 extends object ? { [K_7 in keyof T_7]: T_7[K_7]; } : T_7 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_8) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ usage: Record; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_6) ? { [K_6 in keyof T_6]: T_6[K_6]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/usage/:feature`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? { feature: string; } & {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/usage/:feature`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_8) ? T_8 extends import("elysia/types").IntersectIfObject, unknown> ? T_8 extends object ? { [K_8 in keyof T_8]: T_8[K_8]; } : T_8 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_9) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ usage: UsageStatus; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_7) ? { [K_7 in keyof T_7]: T_7[K_7]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/can/:feature`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? { feature: string; } & {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/can/:feature`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_9) ? T_9 extends import("elysia/types").IntersectIfObject, unknown> ? T_9 extends object ? { [K_9 in keyof T_9]: T_9[K_9]; } : T_9 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_10) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ can: boolean; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_8) ? { [K_8 in keyof T_8]: T_8[K_8]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/invoices`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/invoices`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_10) ? T_10 extends import("elysia/types").IntersectIfObject, unknown> ? T_10 extends object ? { [K_10 in keyof T_10]: T_10[K_10]; } : T_10 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_11) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ invoices: Invoice[]; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_9) ? { [K_9 in keyof T_9]: T_9[K_9]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/invoices/:id/download`, { get: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? { id: string; } & {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/invoices/:id/download`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_11) ? T_11 extends import("elysia/types").IntersectIfObject, unknown> ? T_11 extends object ? { [K_11 in keyof T_11]: T_11[K_11]; } : T_11 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_12) => import("elysia").ElysiaCustomStatusResponse; }) => Promise, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_10) ? { [K_10 in keyof T_10]: T_10[K_10]; } : never; }; }> & import("elysia").CreateEden<`${TPrefix}/webhooks/:provider`, { post: { body: unknown; params: import("elysia/types").IsNever, unknown>> extends true ? { provider: string; } & {} : import("elysia/types").IntersectIfObject, unknown>; query: unknown; headers: unknown; response: import("elysia").ComposeElysiaResponse, {}, `${TPrefix}/webhooks/:provider`>, {}>, (ctx: { body: unknown; query: Record; params: undefined extends import("elysia/types").IntersectIfObject, unknown> ? Record : import("elysia/types").IntersectIfObject, unknown> extends (infer T_12) ? T_12 extends import("elysia/types").IntersectIfObject, unknown> ? T_12 extends object ? { [K_12 in keyof T_12]: T_12[K_12]; } : T_12 : never : never; headers: Record; cookie: Record>; server: import("elysia/universal/server").Server | null; redirect: import("elysia").redirect; set: { headers: import("elysia").HTTPHeaders; status?: number | keyof import("elysia").StatusMap; redirect?: string; cookie?: Record; }; path: string; route: string; request: Request; store: {}; status: (code: Code, response?: T_13) => import("elysia").ElysiaCustomStatusResponse; }) => Promise<{ received: boolean; eventId: string; }>, { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }> extends (infer T_11) ? { [K_11 in keyof T_11]: T_11[K_11]; } : never; }; }>, { derive: {}; resolve: {}; schema: {}; standaloneSchema: {}; response: {}; }, { derive: {}; resolve: {}; schema: {}; standaloneSchema: {}; response: { 200: { paymentId?: string; userAction?: string; isRetryable?: boolean; errorCode?: string; error: string; message: string; }; }; }>; //#endregion export { ElysiaPluginOptions, PlatformInfo, SubscriberInfoResolver, elysiaPlugin }; //# sourceMappingURL=elysia.d.ts.map