billsdk 0.1.4 → 0.2.0
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/README.md +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +725 -361
- package/dist/index.js.map +1 -1
- package/dist/integrations/next.d.ts +1 -5
- package/dist/integrations/next.js +1 -2
- package/dist/integrations/next.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/routes/customer.ts","../src/api/routes/features.ts","../src/api/routes/health.ts","../src/api/routes/plan.ts","../src/api/routes/subscription.ts","../src/api/routes/webhook.ts","../src/api/router.ts","../src/db/field.ts","../src/db/schema.ts","../src/db/internal-adapter.ts","../src/context/create-context.ts","../src/billsdk/base.ts"],"names":["z","canceled","endpoint"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Create customer schema\n */\nconst createCustomerSchema = z.object({\n externalId: z.string().min(1),\n email: z.string().email(),\n name: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Get customer query schema\n */\nconst getCustomerQuerySchema = z.object({\n externalId: z.string().min(1),\n});\n\n/**\n * Customer endpoints\n */\nexport const customerEndpoints: Record<string, BillingEndpoint> = {\n createCustomer: {\n path: \"/customer\",\n options: {\n method: \"POST\",\n body: createCustomerSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof createCustomerSchema>>,\n ) => {\n const { ctx, body } = context;\n\n // Check if customer already exists\n const existing = await ctx.internalAdapter.findCustomerByExternalId(\n body.externalId,\n );\n if (existing) {\n return { customer: existing };\n }\n\n // Create customer\n const customer = await ctx.internalAdapter.createCustomer(body);\n return { customer };\n },\n },\n\n getCustomer: {\n path: \"/customer\",\n options: {\n method: \"GET\",\n query: getCustomerQuerySchema,\n },\n handler: async (\n context: EndpointContext<unknown, z.infer<typeof getCustomerQuerySchema>>,\n ) => {\n const { ctx, query } = context;\n\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n query.externalId,\n );\n if (!customer) {\n return { customer: null };\n }\n\n return { customer };\n },\n },\n};\n","import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Check feature access query schema\n */\nconst checkFeatureQuerySchema = z.object({\n customerId: z.string().min(1),\n feature: z.string().min(1),\n});\n\n/**\n * List features query schema\n */\nconst listFeaturesQuerySchema = z.object({\n customerId: z.string().min(1),\n});\n\n/**\n * Feature endpoints\n */\nexport const featureEndpoints: Record<string, BillingEndpoint> = {\n checkFeature: {\n path: \"/features/check\",\n options: {\n method: \"GET\",\n query: checkFeatureQuerySchema,\n },\n handler: async (\n context: EndpointContext<\n unknown,\n z.infer<typeof checkFeatureQuerySchema>\n >,\n ) => {\n const { ctx, query } = context;\n\n const result = await ctx.internalAdapter.checkFeatureAccess(\n query.customerId,\n query.feature,\n );\n return result;\n },\n },\n\n listFeatures: {\n path: \"/features\",\n options: {\n method: \"GET\",\n query: listFeaturesQuerySchema,\n },\n handler: async (\n context: EndpointContext<\n unknown,\n z.infer<typeof listFeaturesQuerySchema>\n >,\n ) => {\n const { ctx, query } = context;\n\n // Find customer\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n query.customerId,\n );\n if (!customer) {\n return { features: [] };\n }\n\n // Find active subscription\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) {\n return { features: [] };\n }\n\n // Get plan features from config (synchronous)\n const featureCodes = ctx.internalAdapter.getPlanFeatures(\n subscription.planCode,\n );\n const features = featureCodes.map((code: string) => {\n const feature = ctx.internalAdapter.findFeatureByCode(code);\n return {\n code,\n name: feature?.name ?? code,\n type: feature?.type ?? \"boolean\",\n enabled: true,\n };\n });\n\n return { features };\n },\n },\n};\n","import type { BillingEndpoint } from \"../../types/api\";\n\n/**\n * Health check endpoint\n */\nexport const healthEndpoint: Record<string, BillingEndpoint> = {\n health: {\n path: \"/health\",\n options: {\n method: \"GET\",\n },\n handler: async () => {\n return {\n status: \"ok\",\n timestamp: new Date().toISOString(),\n version: \"0.1.0\",\n };\n },\n },\n};\n","import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Plan endpoints - plans come from config, not DB\n */\nexport const planEndpoints: Record<string, BillingEndpoint> = {\n listPlans: {\n path: \"/plans\",\n options: {\n method: \"GET\",\n },\n handler: async (context: EndpointContext) => {\n const { ctx } = context;\n // Plans come from config, synchronous\n const plans = ctx.internalAdapter.listPlans({ includePrivate: false });\n return { plans };\n },\n },\n\n getPlan: {\n path: \"/plan\",\n options: {\n method: \"GET\",\n query: z.object({\n code: z.string(),\n }),\n },\n handler: async (context: EndpointContext<unknown, { code: string }>) => {\n const { ctx, query } = context;\n // Plans come from config, synchronous\n const plan = ctx.internalAdapter.findPlanByCode(query.code);\n\n if (!plan) {\n return { plan: null };\n }\n\n // Prices are included in the plan from config\n return { plan };\n },\n },\n};\n","import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Get subscription query schema\n */\nconst getSubscriptionQuerySchema = z.object({\n customerId: z.string().min(1),\n});\n\n/**\n * Create subscription schema\n * successUrl and cancelUrl are optional - only required if payment adapter needs them\n */\nconst createSubscriptionSchema = z.object({\n customerId: z.string().min(1),\n planCode: z.string().min(1),\n interval: z.enum([\"monthly\", \"yearly\"]).optional().default(\"monthly\"),\n successUrl: z.string().url().optional(),\n cancelUrl: z.string().url().optional(),\n});\n\n/**\n * Cancel subscription schema\n */\nconst cancelSubscriptionSchema = z.object({\n customerId: z.string().min(1),\n cancelAt: z\n .enum([\"period_end\", \"immediately\"])\n .optional()\n .default(\"period_end\"),\n});\n\n/**\n * Subscription endpoints\n */\nexport const subscriptionEndpoints: Record<string, BillingEndpoint> = {\n getSubscription: {\n path: \"/subscription\",\n options: {\n method: \"GET\",\n query: getSubscriptionQuerySchema,\n },\n handler: async (\n context: EndpointContext<\n unknown,\n z.infer<typeof getSubscriptionQuerySchema>\n >,\n ) => {\n const { ctx, query } = context;\n\n // Find customer by external ID\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n query.customerId,\n );\n if (!customer) {\n return { subscription: null };\n }\n\n // Find active subscription\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) {\n return { subscription: null };\n }\n\n // Get plan from config (synchronous)\n const plan = ctx.internalAdapter.findPlanByCode(subscription.planCode);\n const price = plan\n ? ctx.internalAdapter.getPlanPrice(\n subscription.planCode,\n subscription.interval,\n )\n : null;\n\n return {\n subscription,\n plan,\n price,\n };\n },\n },\n\n createSubscription: {\n path: \"/subscription\",\n options: {\n method: \"POST\",\n body: createSubscriptionSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof createSubscriptionSchema>>,\n ) => {\n const { ctx, body } = context;\n\n // Check if payment adapter is configured\n if (!ctx.paymentAdapter) {\n throw new Error(\"Payment adapter not configured\");\n }\n\n // Find customer\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n body.customerId,\n );\n if (!customer) {\n throw new Error(\"Customer not found\");\n }\n\n // Find plan from config (synchronous)\n const plan = ctx.internalAdapter.findPlanByCode(body.planCode);\n if (!plan) {\n throw new Error(\"Plan not found\");\n }\n\n // Find price for interval (synchronous)\n const price = ctx.internalAdapter.getPlanPrice(\n body.planCode,\n body.interval,\n );\n if (!price) {\n throw new Error(\n `No price found for plan ${body.planCode} with interval ${body.interval}`,\n );\n }\n\n // Create subscription in pending state\n const subscription = await ctx.internalAdapter.createSubscription({\n customerId: customer.id,\n planCode: body.planCode,\n interval: body.interval,\n status: \"pending_payment\",\n trialDays: price.trialDays,\n });\n\n // Process payment - adapter decides the flow\n const result = await ctx.paymentAdapter.processPayment({\n customer: {\n id: customer.id,\n email: customer.email,\n providerCustomerId: customer.providerCustomerId,\n },\n plan: {\n code: plan.code,\n name: plan.name,\n },\n price: {\n amount: price.amount,\n currency: price.currency,\n interval: price.interval,\n },\n subscription: {\n id: subscription.id,\n },\n successUrl: body.successUrl,\n cancelUrl: body.cancelUrl,\n metadata: {\n subscriptionId: subscription.id,\n customerId: customer.id,\n },\n });\n\n // Handle payment result based on adapter's decision\n if (result.status === \"active\") {\n // Cancel any other active subscriptions for this customer\n const existingSubscriptions =\n await ctx.internalAdapter.listSubscriptions(customer.id);\n for (const existing of existingSubscriptions) {\n if (\n existing.id !== subscription.id &&\n (existing.status === \"active\" || existing.status === \"trialing\")\n ) {\n await ctx.internalAdapter.cancelSubscription(existing.id);\n }\n }\n\n // Payment completed immediately - activate subscription\n const activeSubscription = await ctx.internalAdapter.updateSubscription(\n subscription.id,\n { status: \"active\" },\n );\n\n // Update customer with provider ID if returned\n if (result.providerCustomerId && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n\n return {\n subscription: activeSubscription ?? {\n ...subscription,\n status: \"active\",\n },\n };\n }\n\n if (result.status === \"pending\") {\n // Payment pending - user needs to complete payment flow\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n providerCheckoutSessionId: result.sessionId,\n });\n\n // Update customer with provider ID if returned\n if (result.providerCustomerId && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n\n return {\n subscription,\n redirectUrl: result.redirectUrl,\n };\n }\n\n // result.status === \"failed\"\n // Mark the subscription as canceled since payment failed\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n status: \"canceled\",\n });\n throw new Error(result.error);\n },\n },\n\n cancelSubscription: {\n path: \"/subscription/cancel\",\n options: {\n method: \"POST\",\n body: cancelSubscriptionSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof cancelSubscriptionSchema>>,\n ) => {\n const { ctx, body } = context;\n\n // Find customer\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n body.customerId,\n );\n if (!customer) {\n throw new Error(\"Customer not found\");\n }\n\n // Find active subscription\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) {\n throw new Error(\"No active subscription found\");\n }\n\n // Cancel subscription\n if (body.cancelAt === \"immediately\") {\n const canceled = await ctx.internalAdapter.cancelSubscription(\n subscription.id,\n );\n return { subscription: canceled, canceledImmediately: true };\n }\n\n // Cancel at period end\n const canceled = await ctx.internalAdapter.cancelSubscription(\n subscription.id,\n subscription.currentPeriodEnd,\n );\n return {\n subscription: canceled,\n canceledImmediately: false,\n accessUntil: subscription.currentPeriodEnd,\n };\n },\n },\n};\n","import type { BillingContext } from \"../../context/create-context\";\nimport type { BillingEndpoint } from \"../../types/api\";\n\n/**\n * Webhook endpoints\n */\nexport const webhookEndpoints: Record<string, BillingEndpoint> = {\n handleWebhook: {\n path: \"/webhook\",\n options: {\n method: \"POST\",\n },\n handler: async (context: { ctx: BillingContext; request: Request }) => {\n const { ctx, request } = context;\n\n if (!ctx.paymentAdapter) {\n throw new Error(\"Payment adapter not configured\");\n }\n\n // Check if payment adapter supports confirmPayment\n if (!ctx.paymentAdapter.confirmPayment) {\n // Adapter doesn't need webhooks (e.g., default adapter that activates immediately)\n ctx.logger.debug(\"Payment adapter does not support confirmPayment\");\n return { received: true };\n }\n\n // Confirm payment from webhook/callback\n const result = await ctx.paymentAdapter.confirmPayment(request);\n\n // If result is null, the event was acknowledged but not relevant to us\n if (!result) {\n ctx.logger.debug(\"Webhook event acknowledged but not processed\");\n return { received: true };\n }\n\n ctx.logger.debug(\"Payment confirmation received\", {\n subscriptionId: result.subscriptionId,\n status: result.status,\n });\n\n if (result.status === \"active\") {\n // Find the subscription\n const subscription = await ctx.internalAdapter.findSubscriptionById(\n result.subscriptionId,\n );\n\n if (subscription) {\n // Cancel any other active subscriptions for this customer\n const existingSubscriptions =\n await ctx.internalAdapter.listSubscriptions(\n subscription.customerId,\n );\n\n for (const existing of existingSubscriptions) {\n if (\n existing.id !== subscription.id &&\n (existing.status === \"active\" || existing.status === \"trialing\")\n ) {\n await ctx.internalAdapter.cancelSubscription(existing.id);\n ctx.logger.info(\"Canceled previous subscription\", {\n subscriptionId: existing.id,\n planCode: existing.planCode,\n });\n }\n }\n\n // Update subscription to active\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n status: \"active\",\n providerSubscriptionId: result.providerSubscriptionId,\n });\n\n // Update customer provider ID if present\n if (result.providerCustomerId) {\n const customer = await ctx.internalAdapter.findCustomerById(\n subscription.customerId,\n );\n if (customer && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n }\n\n ctx.logger.info(\"Subscription activated via webhook\", {\n subscriptionId: subscription.id,\n providerSubscriptionId: result.providerSubscriptionId,\n });\n } else {\n ctx.logger.warn(\"Subscription not found for confirmation\", {\n subscriptionId: result.subscriptionId,\n });\n }\n } else if (result.status === \"failed\") {\n // Mark subscription as failed/canceled\n const subscription = await ctx.internalAdapter.findSubscriptionById(\n result.subscriptionId,\n );\n\n if (subscription) {\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n status: \"canceled\",\n });\n ctx.logger.warn(\"Payment failed, subscription canceled\", {\n subscriptionId: subscription.id,\n });\n }\n }\n\n return { received: true };\n },\n },\n};\n","import type { BillingContext } from \"../context/create-context\";\nimport type { BillingEndpoint } from \"../types/api\";\nimport { customerEndpoints } from \"./routes/customer\";\nimport { featureEndpoints } from \"./routes/features\";\nimport { healthEndpoint } from \"./routes/health\";\nimport { planEndpoints } from \"./routes/plan\";\nimport { subscriptionEndpoints } from \"./routes/subscription\";\nimport { webhookEndpoints } from \"./routes/webhook\";\n\n/**\n * Collect all endpoints\n */\nexport function getEndpoints(\n ctx: BillingContext,\n): Record<string, BillingEndpoint> {\n const baseEndpoints: Record<string, BillingEndpoint> = {\n ...healthEndpoint,\n ...customerEndpoints,\n ...planEndpoints,\n ...subscriptionEndpoints,\n ...featureEndpoints,\n ...webhookEndpoints,\n };\n\n // Add plugin endpoints\n let allEndpoints = { ...baseEndpoints };\n for (const plugin of ctx.plugins) {\n if (plugin.endpoints) {\n allEndpoints = { ...allEndpoints, ...plugin.endpoints };\n }\n }\n\n return allEndpoints;\n}\n\n/**\n * Parse URL to get path and query params\n */\nfunction parseUrl(\n url: string,\n basePath: string,\n): { path: string; query: URLSearchParams } {\n const urlObj = new URL(url);\n let path = urlObj.pathname;\n\n // Remove base path\n if (path.startsWith(basePath)) {\n path = path.slice(basePath.length);\n }\n\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = `/${path}`;\n }\n\n return { path, query: urlObj.searchParams };\n}\n\n/**\n * Parse query params to object\n */\nfunction queryToObject(query: URLSearchParams): Record<string, string> {\n const obj: Record<string, string> = {};\n query.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n}\n\n/**\n * Create a JSON response\n */\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n}\n\n/**\n * Create an error response\n */\nfunction errorResponse(code: string, message: string, status = 400): Response {\n return jsonResponse({ error: { code, message } }, status);\n}\n\n/**\n * Create the router\n */\nexport function createRouter(ctx: BillingContext): {\n handler: (request: Request) => Promise<Response>;\n endpoints: Record<string, BillingEndpoint>;\n} {\n const endpoints = getEndpoints(ctx);\n\n const handler = async (request: Request): Promise<Response> => {\n const method = request.method.toUpperCase();\n const { path, query } = parseUrl(request.url, ctx.basePath);\n\n ctx.logger.debug(`${method} ${path}`);\n\n // Run before hooks\n if (ctx.options.hooks.before) {\n const result = await ctx.options.hooks.before({\n request,\n path,\n method,\n });\n if (result instanceof Response) {\n return result;\n }\n }\n\n // Run plugin before hooks\n for (const plugin of ctx.plugins) {\n if (plugin.hooks?.before) {\n for (const hook of plugin.hooks.before) {\n if (hook.matcher({ path, method })) {\n const result = await hook.handler({\n request,\n path,\n method,\n billingContext: ctx,\n });\n if (result instanceof Response) {\n return result;\n }\n }\n }\n }\n }\n\n // Find matching endpoint\n const endpointKey = Object.keys(endpoints).find((key) => {\n const endpoint = endpoints[key];\n if (!endpoint) return false;\n\n // Check method\n if (endpoint.options.method !== method) return false;\n\n // Check path (simple matching for now)\n // TODO: Add path params support\n return endpoint.path === path;\n });\n\n if (!endpointKey) {\n return errorResponse(\n \"NOT_FOUND\",\n `No endpoint found for ${method} ${path}`,\n 404,\n );\n }\n\n const endpoint = endpoints[endpointKey]!;\n\n try {\n const requestForHandler = request.clone();\n\n // Parse body for POST/PUT/PATCH\n let body: unknown;\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method) && endpoint.options.body) {\n try {\n const text = await request.text();\n if (text) {\n body = JSON.parse(text);\n }\n } catch {\n // Body might be empty or not JSON\n }\n }\n\n // Validate body if schema provided\n if (endpoint.options.body && body) {\n const result = endpoint.options.body.safeParse(body);\n if (!result.success) {\n const issues = \"issues\" in result.error ? result.error.issues : [];\n return errorResponse(\n \"VALIDATION_ERROR\",\n (issues as Array<{ message: string }>)\n .map((e) => e.message)\n .join(\", \"),\n 400,\n );\n }\n body = result.data;\n }\n\n // Validate query if schema provided\n let queryObj: Record<string, string> = queryToObject(query);\n if (endpoint.options.query) {\n const result = endpoint.options.query.safeParse(queryObj);\n if (!result.success) {\n const issues = \"issues\" in result.error ? result.error.issues : [];\n return errorResponse(\n \"VALIDATION_ERROR\",\n (issues as Array<{ message: string }>)\n .map((e) => e.message)\n .join(\", \"),\n 400,\n );\n }\n queryObj = result.data as Record<string, string>;\n }\n\n // Create endpoint context\n // Use cloned request so handlers can read the body if needed (e.g., webhooks)\n const endpointContext = {\n request: requestForHandler,\n body,\n query: queryObj,\n headers: requestForHandler.headers,\n params: {},\n ctx, // Add billing context\n };\n\n // Execute handler\n // biome-ignore lint/suspicious/noExplicitAny: Type assertion needed to call handlers with different context types\n const response = await endpoint.handler(endpointContext as any);\n\n // Run after hooks\n let finalResponse = jsonResponse(response);\n\n // Run plugin after hooks\n for (const plugin of ctx.plugins) {\n if (plugin.hooks?.after) {\n for (const hook of plugin.hooks.after) {\n if (hook.matcher({ path, method })) {\n const result = await hook.handler({\n request,\n path,\n method,\n billingContext: ctx,\n });\n if (result instanceof Response) {\n finalResponse = result;\n }\n }\n }\n }\n }\n\n if (ctx.options.hooks.after) {\n const result = await ctx.options.hooks.after({\n request,\n path,\n method,\n });\n if (result instanceof Response) {\n finalResponse = result;\n }\n }\n\n return finalResponse;\n } catch (error) {\n ctx.logger.error(\"Endpoint error\", error);\n\n if (error instanceof Error) {\n return errorResponse(\"INTERNAL_ERROR\", error.message, 500);\n }\n\n return errorResponse(\n \"INTERNAL_ERROR\",\n \"An unexpected error occurred\",\n 500,\n );\n }\n };\n\n return { handler, endpoints };\n}\n","/**\n * Supported field types for the schema\n */\nexport type DBFieldType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"json\"\n | \"string[]\"\n | \"number[]\";\n\n/**\n * Reference configuration for foreign keys\n */\nexport interface DBFieldReference {\n model: string;\n field: string;\n onDelete?: \"cascade\" | \"restrict\" | \"set-null\";\n}\n\n/**\n * Field attribute definition for schema\n */\nexport interface DBFieldAttribute {\n /**\n * Data type of the field\n */\n type: DBFieldType;\n\n /**\n * Custom field name in the database (defaults to key)\n */\n fieldName?: string;\n\n /**\n * Whether the field is required\n * @default true\n */\n required?: boolean;\n\n /**\n * Whether the field has a unique constraint\n */\n unique?: boolean;\n\n /**\n * Whether to create an index on this field\n */\n index?: boolean;\n\n /**\n * Whether this is a primary key\n */\n primaryKey?: boolean;\n\n /**\n * Foreign key reference\n */\n references?: DBFieldReference;\n\n /**\n * Default value or function to generate it\n */\n defaultValue?: unknown | (() => unknown);\n\n /**\n * Whether this field can be set via input\n * @default true\n */\n input?: boolean;\n\n /**\n * Whether this field is returned in responses\n * @default true\n */\n returned?: boolean;\n}\n\n/**\n * Table schema definition\n */\nexport interface DBTableSchema {\n fields: Record<string, DBFieldAttribute>;\n}\n\n/**\n * Full database schema\n */\nexport type DBSchema = Record<string, DBTableSchema>;\n\n/**\n * Helper to define a field\n */\nexport function defineField(attribute: DBFieldAttribute): DBFieldAttribute {\n return {\n required: true,\n input: true,\n returned: true,\n ...attribute,\n };\n}\n\n/**\n * Helper to define a table\n */\nexport function defineTable(\n fields: Record<string, DBFieldAttribute>,\n): DBTableSchema {\n return { fields };\n}\n","import type { DBSchema } from \"./field\";\nimport { defineField, defineTable } from \"./field\";\n\n// Re-export DBSchema\nexport type { DBSchema } from \"./field\";\n\n/**\n * Generate a unique ID\n */\nconst generateId = () => crypto.randomUUID();\n\n/**\n * Base billing schema\n * Only tables that need persistence - plans/features come from config\n */\nexport const billingSchema: DBSchema = {\n customer: defineTable({\n id: defineField({\n type: \"string\",\n primaryKey: true,\n defaultValue: generateId,\n input: false,\n }),\n externalId: defineField({\n type: \"string\",\n unique: true,\n index: true,\n }),\n email: defineField({\n type: \"string\",\n index: true,\n }),\n name: defineField({\n type: \"string\",\n required: false,\n }),\n providerCustomerId: defineField({\n type: \"string\",\n required: false,\n index: true,\n }),\n metadata: defineField({\n type: \"json\",\n required: false,\n }),\n createdAt: defineField({\n type: \"date\",\n defaultValue: () => new Date(),\n input: false,\n }),\n updatedAt: defineField({\n type: \"date\",\n defaultValue: () => new Date(),\n input: false,\n }),\n }),\n\n subscription: defineTable({\n id: defineField({\n type: \"string\",\n primaryKey: true,\n defaultValue: generateId,\n input: false,\n }),\n customerId: defineField({\n type: \"string\",\n index: true,\n references: {\n model: \"customer\",\n field: \"id\",\n onDelete: \"cascade\",\n },\n }),\n // Plan code from config (not a foreign key)\n planCode: defineField({\n type: \"string\",\n index: true,\n }),\n // Billing interval\n interval: defineField({\n type: \"string\", // \"monthly\" | \"yearly\"\n defaultValue: \"monthly\",\n }),\n status: defineField({\n type: \"string\", // SubscriptionStatus\n defaultValue: \"active\",\n }),\n providerSubscriptionId: defineField({\n type: \"string\",\n required: false,\n index: true,\n }),\n providerCheckoutSessionId: defineField({\n type: \"string\",\n required: false,\n index: true,\n }),\n currentPeriodStart: defineField({\n type: \"date\",\n defaultValue: () => new Date(),\n }),\n currentPeriodEnd: defineField({\n type: \"date\",\n }),\n canceledAt: defineField({\n type: \"date\",\n required: false,\n }),\n cancelAt: defineField({\n type: \"date\",\n required: false,\n }),\n trialStart: defineField({\n type: \"date\",\n required: false,\n }),\n trialEnd: defineField({\n type: \"date\",\n required: false,\n }),\n metadata: defineField({\n type: \"json\",\n required: false,\n }),\n createdAt: defineField({\n type: \"date\",\n defaultValue: () => new Date(),\n input: false,\n }),\n updatedAt: defineField({\n type: \"date\",\n defaultValue: () => new Date(),\n input: false,\n }),\n }),\n};\n\n/**\n * Get the billing schema\n * Can be extended by plugins\n */\nexport function getBillingSchema(): DBSchema {\n return billingSchema;\n}\n\n/**\n * Table names for type safety\n */\nexport const TABLES = {\n CUSTOMER: \"customer\",\n SUBSCRIPTION: \"subscription\",\n} as const;\n\nexport type TableName = (typeof TABLES)[keyof typeof TABLES];\n","import type { DBAdapter } from \"../types/adapter\";\nimport type {\n BillingInterval,\n CreateCustomerInput,\n CreateSubscriptionInput,\n Customer,\n Feature,\n Plan,\n PlanPrice,\n Subscription,\n} from \"../types/models\";\nimport type { FeatureConfig, PlanConfig } from \"../types/options\";\nimport { TABLES } from \"./schema\";\n\n/**\n * Internal adapter that wraps DBAdapter with business logic\n * Plans and features come from config, only customer/subscription from DB\n */\nexport interface InternalAdapter {\n // Customer operations (DB)\n createCustomer(data: CreateCustomerInput): Promise<Customer>;\n findCustomerById(id: string): Promise<Customer | null>;\n findCustomerByExternalId(externalId: string): Promise<Customer | null>;\n updateCustomer(id: string, data: Partial<Customer>): Promise<Customer | null>;\n deleteCustomer(id: string): Promise<void>;\n listCustomers(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Customer[]>;\n\n // Plan operations (from config)\n findPlanByCode(code: string): Plan | null;\n listPlans(options?: { includePrivate?: boolean }): Plan[];\n getPlanPrice(planCode: string, interval: BillingInterval): PlanPrice | null;\n\n // Feature operations (from config)\n findFeatureByCode(code: string): Feature | null;\n listFeatures(): Feature[];\n getPlanFeatures(planCode: string): string[];\n\n // Subscription operations (DB)\n createSubscription(data: CreateSubscriptionInput): Promise<Subscription>;\n findSubscriptionById(id: string): Promise<Subscription | null>;\n findSubscriptionByCustomerId(\n customerId: string,\n ): Promise<Subscription | null>;\n findSubscriptionByProviderSessionId(\n sessionId: string,\n ): Promise<Subscription | null>;\n updateSubscription(\n id: string,\n data: Partial<Subscription>,\n ): Promise<Subscription | null>;\n cancelSubscription(id: string, cancelAt?: Date): Promise<Subscription | null>;\n listSubscriptions(customerId: string): Promise<Subscription[]>;\n\n // Feature access check\n checkFeatureAccess(\n customerId: string,\n featureCode: string,\n ): Promise<{ allowed: boolean }>;\n}\n\n/**\n * Convert PlanConfig to Plan\n */\nfunction planConfigToPlan(config: PlanConfig): Plan {\n return {\n code: config.code,\n name: config.name,\n description: config.description,\n isPublic: config.isPublic ?? true,\n prices: config.prices.map((p) => ({\n amount: p.amount,\n currency: p.currency ?? \"usd\",\n interval: p.interval,\n trialDays: p.trialDays,\n })),\n features: config.features ?? [],\n };\n}\n\n/**\n * Convert FeatureConfig to Feature\n */\nfunction featureConfigToFeature(config: FeatureConfig): Feature {\n return {\n code: config.code,\n name: config.name,\n type: config.type ?? \"boolean\",\n };\n}\n\n/**\n * Create an internal adapter from a DBAdapter and config\n */\nexport function createInternalAdapter(\n adapter: DBAdapter,\n plans: PlanConfig[] = [],\n features: FeatureConfig[] = [],\n): InternalAdapter {\n // Build lookup maps for fast access\n const plansByCode = new Map<string, Plan>();\n for (const config of plans) {\n plansByCode.set(config.code, planConfigToPlan(config));\n }\n\n const featuresByCode = new Map<string, Feature>();\n for (const config of features) {\n featuresByCode.set(config.code, featureConfigToFeature(config));\n }\n\n return {\n // Customer operations (DB)\n async createCustomer(data: CreateCustomerInput): Promise<Customer> {\n const now = new Date();\n return adapter.create<Customer>({\n model: TABLES.CUSTOMER,\n data: {\n ...data,\n createdAt: now,\n updatedAt: now,\n } as Omit<Customer, \"id\">,\n });\n },\n\n async findCustomerById(id: string): Promise<Customer | null> {\n return adapter.findOne<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n });\n },\n\n async findCustomerByExternalId(\n externalId: string,\n ): Promise<Customer | null> {\n return adapter.findOne<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"externalId\", operator: \"eq\", value: externalId }],\n });\n },\n\n async updateCustomer(\n id: string,\n data: Partial<Customer>,\n ): Promise<Customer | null> {\n return adapter.update<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n update: { ...data, updatedAt: new Date() },\n });\n },\n\n async deleteCustomer(id: string): Promise<void> {\n await adapter.delete({\n model: TABLES.CUSTOMER,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n });\n },\n\n async listCustomers(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Customer[]> {\n return adapter.findMany<Customer>({\n model: TABLES.CUSTOMER,\n limit: options?.limit,\n offset: options?.offset,\n sortBy: { field: \"createdAt\", direction: \"desc\" },\n });\n },\n\n // Plan operations (from config - synchronous)\n findPlanByCode(code: string): Plan | null {\n return plansByCode.get(code) ?? null;\n },\n\n listPlans(options?: { includePrivate?: boolean }): Plan[] {\n const allPlans = Array.from(plansByCode.values());\n if (options?.includePrivate) {\n return allPlans;\n }\n return allPlans.filter((p) => p.isPublic);\n },\n\n getPlanPrice(\n planCode: string,\n interval: BillingInterval,\n ): PlanPrice | null {\n const plan = plansByCode.get(planCode);\n if (!plan) return null;\n return (\n plan.prices.find((p) => p.interval === interval) ??\n plan.prices[0] ??\n null\n );\n },\n\n // Feature operations (from config - synchronous)\n findFeatureByCode(code: string): Feature | null {\n return featuresByCode.get(code) ?? null;\n },\n\n listFeatures(): Feature[] {\n return Array.from(featuresByCode.values());\n },\n\n getPlanFeatures(planCode: string): string[] {\n const plan = plansByCode.get(planCode);\n return plan?.features ?? [];\n },\n\n // Subscription operations (DB)\n async createSubscription(\n data: CreateSubscriptionInput,\n ): Promise<Subscription> {\n const now = new Date();\n const interval = data.interval ?? \"monthly\";\n const currentPeriodEnd = new Date(now);\n\n // Set period end based on interval\n if (interval === \"yearly\") {\n currentPeriodEnd.setFullYear(currentPeriodEnd.getFullYear() + 1);\n } else if (interval === \"quarterly\") {\n currentPeriodEnd.setMonth(currentPeriodEnd.getMonth() + 3);\n } else {\n currentPeriodEnd.setMonth(currentPeriodEnd.getMonth() + 1);\n }\n\n let trialStart: Date | undefined;\n let trialEnd: Date | undefined;\n let status = data.status ?? \"pending_payment\";\n\n if (data.trialDays && data.trialDays > 0) {\n trialStart = now;\n trialEnd = new Date(now);\n trialEnd.setDate(trialEnd.getDate() + data.trialDays);\n status = \"trialing\";\n }\n\n return adapter.create<Subscription>({\n model: TABLES.SUBSCRIPTION,\n data: {\n customerId: data.customerId,\n planCode: data.planCode,\n interval,\n status,\n providerSubscriptionId: data.providerSubscriptionId,\n providerCheckoutSessionId: data.providerCheckoutSessionId,\n currentPeriodStart: now,\n currentPeriodEnd: trialEnd ?? currentPeriodEnd,\n trialStart,\n trialEnd,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n } as Omit<Subscription, \"id\">,\n });\n },\n\n async findSubscriptionById(id: string): Promise<Subscription | null> {\n return adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n });\n },\n\n async findSubscriptionByCustomerId(\n customerId: string,\n ): Promise<Subscription | null> {\n return adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [\n { field: \"customerId\", operator: \"eq\", value: customerId },\n {\n field: \"status\",\n operator: \"in\",\n value: [\"active\", \"trialing\", \"past_due\", \"pending_payment\"],\n },\n ],\n });\n },\n\n async findSubscriptionByProviderSessionId(\n sessionId: string,\n ): Promise<Subscription | null> {\n return adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [\n {\n field: \"providerCheckoutSessionId\",\n operator: \"eq\",\n value: sessionId,\n },\n ],\n });\n },\n\n async updateSubscription(\n id: string,\n data: Partial<Subscription>,\n ): Promise<Subscription | null> {\n return adapter.update<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n update: { ...data, updatedAt: new Date() },\n });\n },\n\n async cancelSubscription(\n id: string,\n cancelAt?: Date,\n ): Promise<Subscription | null> {\n const now = new Date();\n return adapter.update<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n update: {\n status: cancelAt ? \"active\" : \"canceled\",\n canceledAt: now,\n cancelAt: cancelAt ?? now,\n updatedAt: now,\n },\n });\n },\n\n async listSubscriptions(customerId: string): Promise<Subscription[]> {\n return adapter.findMany<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"customerId\", operator: \"eq\", value: customerId }],\n sortBy: { field: \"createdAt\", direction: \"desc\" },\n });\n },\n\n // Feature access check\n async checkFeatureAccess(\n customerId: string,\n featureCode: string,\n ): Promise<{ allowed: boolean }> {\n // Find customer by external ID\n const customer = await adapter.findOne<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"externalId\", operator: \"eq\", value: customerId }],\n });\n\n if (!customer) {\n return { allowed: false };\n }\n\n // Find active subscription\n const subscription = await adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [\n { field: \"customerId\", operator: \"eq\", value: customer.id },\n { field: \"status\", operator: \"in\", value: [\"active\", \"trialing\"] },\n ],\n });\n\n if (!subscription) {\n return { allowed: false };\n }\n\n // Check if plan has the feature (from config)\n const planFeatures = this.getPlanFeatures(subscription.planCode);\n return { allowed: planFeatures.includes(featureCode) };\n },\n };\n}\n","import {\n createInternalAdapter,\n type InternalAdapter,\n} from \"../db/internal-adapter\";\nimport { type DBSchema, getBillingSchema } from \"../db/schema\";\nimport type { DBAdapter } from \"../types/adapter\";\nimport type { BillSDKOptions, ResolvedBillSDKOptions } from \"../types/options\";\nimport type { PaymentAdapter } from \"../types/payment\";\nimport type { BillSDKPlugin } from \"../types/plugins\";\n\n/**\n * Logger interface for the billing context\n */\nexport interface Logger {\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n/**\n * The billing context containing all runtime state\n */\nexport interface BillingContext {\n /**\n * Resolved options with defaults\n */\n options: ResolvedBillSDKOptions;\n\n /**\n * Base path for the API\n */\n basePath: string;\n\n /**\n * Database adapter\n */\n adapter: DBAdapter;\n\n /**\n * Payment adapter (optional)\n */\n paymentAdapter?: PaymentAdapter;\n\n /**\n * Internal adapter with business logic\n */\n internalAdapter: InternalAdapter;\n\n /**\n * Database schema\n */\n schema: DBSchema;\n\n /**\n * Registered plugins\n */\n plugins: BillSDKPlugin[];\n\n /**\n * Logger instance\n */\n logger: Logger;\n\n /**\n * Secret for signing\n */\n secret: string;\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin: (id: string) => boolean;\n\n /**\n * Get a plugin by ID\n */\n getPlugin: <T extends BillSDKPlugin>(id: string) => T | null;\n\n /**\n * Generate a unique ID\n */\n generateId: () => string;\n}\n\n/**\n * Create a logger instance\n */\nfunction createLogger(options: BillSDKOptions[\"logger\"]): Logger {\n const level = options?.level ?? \"info\";\n const disabled = options?.disabled ?? false;\n\n const levels = [\"debug\", \"info\", \"warn\", \"error\"];\n const currentLevelIndex = levels.indexOf(level);\n\n const shouldLog = (logLevel: string) => {\n if (disabled) return false;\n return levels.indexOf(logLevel) >= currentLevelIndex;\n };\n\n return {\n debug: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"debug\")) console.debug(`[billsdk] ${message}`, ...args);\n },\n info: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"info\")) console.info(`[billsdk] ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"warn\")) console.warn(`[billsdk] ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"error\")) console.error(`[billsdk] ${message}`, ...args);\n },\n };\n}\n\n/**\n * Resolve options with defaults\n */\nfunction resolveOptions(\n options: BillSDKOptions,\n adapter: DBAdapter,\n): ResolvedBillSDKOptions {\n return {\n database: adapter,\n payment: options.payment,\n basePath: options.basePath ?? \"/api/billing\",\n secret: options.secret ?? generateDefaultSecret(),\n plans: options.plans,\n features: options.features,\n plugins: options.plugins ?? [],\n hooks: options.hooks ?? {},\n logger: {\n level: options.logger?.level ?? \"info\",\n disabled: options.logger?.disabled ?? false,\n },\n };\n}\n\n/**\n * Generate a default secret (for development only)\n */\nfunction generateDefaultSecret(): string {\n // In production, users should provide their own secret\n return \"billsdk-development-secret-change-in-production\";\n}\n\n/**\n * Create the billing context\n * Plans and features are read from config, not seeded to DB\n */\nexport async function createBillingContext(\n adapter: DBAdapter,\n options: BillSDKOptions,\n): Promise<BillingContext> {\n const resolvedOptions = resolveOptions(options, adapter);\n const logger = createLogger(options.logger);\n const plugins = resolvedOptions.plugins;\n\n // Get base schema\n let schema = getBillingSchema();\n\n // Extend schema with plugins\n for (const plugin of plugins) {\n if (plugin.schema) {\n schema = { ...schema, ...plugin.schema };\n }\n }\n\n // Create internal adapter with config (no DB seeding needed!)\n const internalAdapter = createInternalAdapter(\n adapter,\n options.plans ?? [],\n options.features ?? [],\n );\n\n // Build context\n const context: BillingContext = {\n options: resolvedOptions,\n basePath: resolvedOptions.basePath,\n adapter,\n paymentAdapter: options.payment,\n internalAdapter,\n schema,\n plugins,\n logger,\n secret: resolvedOptions.secret,\n\n hasPlugin(id: string): boolean {\n return plugins.some((p) => p.id === id);\n },\n\n getPlugin<T extends BillSDKPlugin>(id: string): T | null {\n const plugin = plugins.find((p) => p.id === id);\n return (plugin as T) ?? null;\n },\n\n generateId(): string {\n return crypto.randomUUID();\n },\n };\n\n // Initialize plugins\n for (const plugin of plugins) {\n if (plugin.init) {\n await plugin.init(context);\n }\n }\n\n logger.debug(\"BillingContext created\", {\n basePath: context.basePath,\n plugins: plugins.map((p) => p.id),\n hasPaymentAdapter: !!context.paymentAdapter,\n plans: options.plans?.length ?? 0,\n features: options.features?.length ?? 0,\n });\n\n return context;\n}\n","import { memoryAdapter } from \"../adapters/memory-adapter\";\nimport { paymentAdapter } from \"../adapters/payment\";\nimport { createRouter } from \"../api\";\nimport {\n type BillingContext,\n createBillingContext,\n} from \"../context/create-context\";\nimport type { BillSDK, InferredAPI } from \"../types/billsdk\";\nimport type { BillSDKOptions, FeatureConfig } from \"../types/options\";\n\n/**\n * Base error codes for BillSDK\n */\nconst BASE_ERROR_CODES = {\n CUSTOMER_NOT_FOUND: \"CUSTOMER_NOT_FOUND\",\n PLAN_NOT_FOUND: \"PLAN_NOT_FOUND\",\n SUBSCRIPTION_NOT_FOUND: \"SUBSCRIPTION_NOT_FOUND\",\n FEATURE_NOT_FOUND: \"FEATURE_NOT_FOUND\",\n PAYMENT_ADAPTER_NOT_CONFIGURED: \"PAYMENT_ADAPTER_NOT_CONFIGURED\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\n/**\n * Create the API object for direct server-side access\n * The generic is for type inference only - runtime behavior is the same\n */\nfunction createAPI<TFeatureCode extends string = string>(\n contextPromise: Promise<BillingContext>,\n): InferredAPI<TFeatureCode> {\n return {\n async getCustomer(params) {\n const ctx = await contextPromise;\n return ctx.internalAdapter.findCustomerByExternalId(params.externalId);\n },\n\n async createCustomer(data) {\n const ctx = await contextPromise;\n return ctx.internalAdapter.createCustomer(data);\n },\n\n async listPlans() {\n const ctx = await contextPromise;\n // Plans come from config, synchronous\n return ctx.internalAdapter.listPlans();\n },\n\n async getPlan(params) {\n const ctx = await contextPromise;\n // Plans come from config, synchronous\n return ctx.internalAdapter.findPlanByCode(params.code);\n },\n\n async getSubscription(params) {\n const ctx = await contextPromise;\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n params.customerId,\n );\n if (!customer) return null;\n return ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n },\n\n async createSubscription(params) {\n const ctx = await contextPromise;\n\n if (!ctx.paymentAdapter) {\n throw new Error(\"Payment adapter not configured\");\n }\n\n // Find customer\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n params.customerId,\n );\n if (!customer) {\n throw new Error(\"Customer not found\");\n }\n\n // Find plan (from config, synchronous)\n const plan = ctx.internalAdapter.findPlanByCode(params.planCode);\n if (!plan) {\n throw new Error(\"Plan not found\");\n }\n\n // Find price for interval\n const interval = params.interval ?? \"monthly\";\n const price = ctx.internalAdapter.getPlanPrice(params.planCode, interval);\n if (!price) {\n throw new Error(\n `No price found for plan ${params.planCode} with interval ${interval}`,\n );\n }\n\n // Create subscription in pending state\n const subscription = await ctx.internalAdapter.createSubscription({\n customerId: customer.id,\n planCode: params.planCode,\n interval,\n status: \"pending_payment\",\n trialDays: price.trialDays,\n });\n\n // Process payment - adapter decides the flow\n const result = await ctx.paymentAdapter.processPayment({\n customer: {\n id: customer.id,\n email: customer.email,\n providerCustomerId: customer.providerCustomerId,\n },\n plan: { code: plan.code, name: plan.name },\n price: {\n amount: price.amount,\n currency: price.currency,\n interval: price.interval,\n },\n subscription: { id: subscription.id },\n successUrl: params.successUrl,\n cancelUrl: params.cancelUrl,\n metadata: { subscriptionId: subscription.id },\n });\n\n // Handle payment result based on adapter's decision\n if (result.status === \"active\") {\n // Cancel any other active subscriptions for this customer\n const existingSubscriptions =\n await ctx.internalAdapter.listSubscriptions(customer.id);\n for (const existing of existingSubscriptions) {\n if (\n existing.id !== subscription.id &&\n (existing.status === \"active\" || existing.status === \"trialing\")\n ) {\n await ctx.internalAdapter.cancelSubscription(existing.id);\n }\n }\n\n // Payment completed immediately - activate subscription\n const activeSubscription = await ctx.internalAdapter.updateSubscription(\n subscription.id,\n { status: \"active\" },\n );\n\n // Update customer with provider ID if returned\n if (result.providerCustomerId && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n\n return {\n subscription: activeSubscription ?? {\n ...subscription,\n status: \"active\" as const,\n },\n };\n }\n\n if (result.status === \"pending\") {\n // Payment pending - user needs to complete payment flow\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n providerCheckoutSessionId: result.sessionId,\n });\n\n // Update customer with provider ID if returned\n if (result.providerCustomerId && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n\n return {\n subscription,\n redirectUrl: result.redirectUrl,\n };\n }\n\n // result.status === \"failed\"\n // Delete the pending subscription since payment failed\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n status: \"canceled\",\n });\n throw new Error(result.error);\n },\n\n async cancelSubscription(params) {\n const ctx = await contextPromise;\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n params.customerId,\n );\n if (!customer) {\n return null;\n }\n\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) {\n return null;\n }\n\n const cancelAt = params.cancelAt ?? \"period_end\";\n\n if (cancelAt === \"immediately\") {\n // Cancel immediately\n return ctx.internalAdapter.cancelSubscription(subscription.id);\n }\n\n // Cancel at period end - set cancelAt date but keep active\n return ctx.internalAdapter.cancelSubscription(\n subscription.id,\n subscription.currentPeriodEnd,\n );\n },\n\n async checkFeature(params) {\n const ctx = await contextPromise;\n return ctx.internalAdapter.checkFeatureAccess(\n params.customerId,\n params.feature,\n );\n },\n\n async listFeatures(params) {\n const ctx = await contextPromise;\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n params.customerId,\n );\n if (!customer) return [];\n\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) return [];\n\n // Get features from config (synchronous)\n const featureCodes = ctx.internalAdapter.getPlanFeatures(\n subscription.planCode,\n );\n return featureCodes.map((code) => {\n const feature = ctx.internalAdapter.findFeatureByCode(code);\n return feature\n ? {\n code: feature.code as TFeatureCode,\n name: feature.name,\n enabled: true as const,\n }\n : { code: code as TFeatureCode, name: code, enabled: true as const };\n });\n },\n\n async health() {\n return {\n status: \"ok\" as const,\n timestamp: new Date().toISOString(),\n };\n },\n };\n}\n\n/**\n * Initialize the billing context\n */\nasync function init(options: BillSDKOptions): Promise<BillingContext> {\n const database = options.database ?? memoryAdapter();\n const payment = options.payment ?? paymentAdapter();\n return createBillingContext(database, { ...options, payment });\n}\n\n/**\n * Create a BillSDK instance\n *\n * @param options - Configuration options\n * @returns BillSDK instance\n */\n// biome-ignore lint/suspicious/noExplicitAny: Generic constraint flexibility for readonly/mutable arrays\nexport function createBillSDK<Options extends BillSDKOptions<any>>(\n options: Options,\n): BillSDK<Options> {\n // Lazy initialization - context is created only when needed\n const contextPromise = init(options);\n\n // Collect error codes from plugins\n const errorCodes: Record<string, string> = {};\n for (const plugin of options.plugins ?? []) {\n if (plugin.$ERROR_CODES) {\n Object.assign(errorCodes, plugin.$ERROR_CODES);\n }\n }\n\n // Create the request handler\n const handler = async (request: Request): Promise<Response> => {\n const ctx = await contextPromise;\n const { handler: routeHandler } = createRouter(ctx);\n return routeHandler(request);\n };\n\n // Create the API object\n // Type assertion needed because runtime uses string but we want type inference\n const api = createAPI(contextPromise) as BillSDK<Options>[\"api\"];\n\n return {\n handler,\n api,\n options,\n $context: contextPromise,\n $Infer: {} as BillSDK<Options>[\"$Infer\"],\n $ERROR_CODES: {\n ...BASE_ERROR_CODES,\n ...errorCodes,\n } as BillSDK<Options>[\"$ERROR_CODES\"],\n };\n}\n\n/**\n * Create a BillSDK instance\n *\n * @example\n * ```typescript\n * import { billsdk } from \"@billsdk/core\";\n *\n * export const billing = billsdk({\n * basePath: \"/api/billing\",\n * features: [\n * { code: \"export\", name: \"Export\" },\n * ],\n * plans: [\n * { code: \"pro\", features: [\"export\"] }, // Validated!\n * ],\n * });\n * ```\n */\nexport function billsdk<\n const TFeatures extends readonly FeatureConfig<string>[],\n>(options: BillSDKOptions<TFeatures>): BillSDK<BillSDKOptions<TFeatures>> {\n // biome-ignore lint/suspicious/noExplicitAny: Type coercion needed for generic constraint compatibility\n return createBillSDK(options as any);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/routes/customer.ts","../src/api/routes/features.ts","../src/api/routes/health.ts","../src/api/routes/payment.ts","../src/api/routes/plan.ts","../src/logic/payment-failed-service.ts","../src/logic/refund-service.ts","../src/logic/proration.ts","../src/logic/subscription-service.ts","../src/logic/trial-end-service.ts","../src/logic/behaviors/defaults.ts","../src/logic/behaviors/runner.ts","../src/api/routes/refund.ts","../src/api/routes/subscription.ts","../src/api/routes/webhook.ts","../src/api/router.ts","../src/db/internal-adapter.ts","../src/context/create-context.ts","../src/billsdk/base.ts"],"names":["z","canceled","endpoint"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Create customer schema\n */\nconst createCustomerSchema = z.object({\n externalId: z.string().min(1),\n email: z.string().email(),\n name: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Get customer query schema\n */\nconst getCustomerQuerySchema = z.object({\n externalId: z.string().min(1),\n});\n\n/**\n * Customer endpoints\n */\nexport const customerEndpoints: Record<string, BillingEndpoint> = {\n createCustomer: {\n path: \"/customer\",\n options: {\n method: \"POST\",\n body: createCustomerSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof createCustomerSchema>>,\n ) => {\n const { ctx, body } = context;\n\n // Check if customer already exists\n const existing = await ctx.internalAdapter.findCustomerByExternalId(\n body.externalId,\n );\n if (existing) {\n return { customer: existing };\n }\n\n // Create customer\n const customer = await ctx.internalAdapter.createCustomer(body);\n return { customer };\n },\n },\n\n getCustomer: {\n path: \"/customer\",\n options: {\n method: \"GET\",\n query: getCustomerQuerySchema,\n },\n handler: async (\n context: EndpointContext<unknown, z.infer<typeof getCustomerQuerySchema>>,\n ) => {\n const { ctx, query } = context;\n\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n query.externalId,\n );\n if (!customer) {\n return { customer: null };\n }\n\n return { customer };\n },\n },\n};\n","import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Check feature access query schema\n */\nconst checkFeatureQuerySchema = z.object({\n customerId: z.string().min(1),\n feature: z.string().min(1),\n});\n\n/**\n * List features query schema\n */\nconst listFeaturesQuerySchema = z.object({\n customerId: z.string().min(1),\n});\n\n/**\n * Feature endpoints\n */\nexport const featureEndpoints: Record<string, BillingEndpoint> = {\n checkFeature: {\n path: \"/features/check\",\n options: {\n method: \"GET\",\n query: checkFeatureQuerySchema,\n },\n handler: async (\n context: EndpointContext<\n unknown,\n z.infer<typeof checkFeatureQuerySchema>\n >,\n ) => {\n const { ctx, query } = context;\n\n const result = await ctx.internalAdapter.checkFeatureAccess(\n query.customerId,\n query.feature,\n );\n return result;\n },\n },\n\n listFeatures: {\n path: \"/features\",\n options: {\n method: \"GET\",\n query: listFeaturesQuerySchema,\n },\n handler: async (\n context: EndpointContext<\n unknown,\n z.infer<typeof listFeaturesQuerySchema>\n >,\n ) => {\n const { ctx, query } = context;\n\n // Find customer\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n query.customerId,\n );\n if (!customer) {\n return { features: [] };\n }\n\n // Find active subscription\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) {\n return { features: [] };\n }\n\n // Get plan features from config (synchronous)\n const featureCodes = ctx.internalAdapter.getPlanFeatures(\n subscription.planCode,\n );\n const features = featureCodes.map((code: string) => {\n const feature = ctx.internalAdapter.findFeatureByCode(code);\n return {\n code,\n name: feature?.name ?? code,\n type: feature?.type ?? \"boolean\",\n enabled: true,\n };\n });\n\n return { features };\n },\n },\n};\n","import type { BillingEndpoint } from \"../../types/api\";\n\n/**\n * Health check endpoint\n */\nexport const healthEndpoint: Record<string, BillingEndpoint> = {\n health: {\n path: \"/health\",\n options: {\n method: \"GET\",\n },\n handler: async () => {\n return {\n status: \"ok\",\n timestamp: new Date().toISOString(),\n version: \"0.1.0\",\n };\n },\n },\n};\n","import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * List payments query schema\n */\nconst listPaymentsQuerySchema = z.object({\n customerId: z.string().min(1),\n limit: z.coerce.number().positive().max(100).optional().default(25),\n offset: z.coerce.number().nonnegative().optional().default(0),\n});\n\n/**\n * Get payment query schema\n */\nconst getPaymentQuerySchema = z.object({\n paymentId: z.string().min(1),\n});\n\n/**\n * Payment endpoints\n */\nexport const paymentEndpoints: Record<string, BillingEndpoint> = {\n listPayments: {\n path: \"/payments\",\n options: {\n method: \"GET\",\n query: listPaymentsQuerySchema,\n },\n handler: async (\n context: EndpointContext<\n unknown,\n z.infer<typeof listPaymentsQuerySchema>\n >,\n ) => {\n const { ctx, query } = context;\n\n // Find customer by external ID\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n query.customerId,\n );\n if (!customer) {\n return { payments: [] };\n }\n\n // List payments for customer\n const payments = await ctx.internalAdapter.listPayments(customer.id, {\n limit: query.limit,\n offset: query.offset,\n });\n\n return { payments };\n },\n },\n\n getPayment: {\n path: \"/payment\",\n options: {\n method: \"GET\",\n query: getPaymentQuerySchema,\n },\n handler: async (\n context: EndpointContext<unknown, z.infer<typeof getPaymentQuerySchema>>,\n ) => {\n const { ctx, query } = context;\n\n const payment = await ctx.internalAdapter.findPaymentById(\n query.paymentId,\n );\n\n return { payment };\n },\n },\n};\n","import { z } from \"zod\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Plan endpoints - plans come from config, not DB\n */\nexport const planEndpoints: Record<string, BillingEndpoint> = {\n listPlans: {\n path: \"/plans\",\n options: {\n method: \"GET\",\n },\n handler: async (context: EndpointContext) => {\n const { ctx } = context;\n // Plans come from config, synchronous\n const plans = ctx.internalAdapter.listPlans({ includePrivate: false });\n return { plans };\n },\n },\n\n getPlan: {\n path: \"/plan\",\n options: {\n method: \"GET\",\n query: z.object({\n code: z.string(),\n }),\n },\n handler: async (context: EndpointContext<unknown, { code: string }>) => {\n const { ctx, query } = context;\n // Plans come from config, synchronous\n const plan = ctx.internalAdapter.findPlanByCode(query.code);\n\n if (!plan) {\n return { plan: null };\n }\n\n // Prices are included in the plan from config\n return { plan };\n },\n },\n};\n","import type { Subscription } from \"@billsdk/core\";\nimport type { BillingContext } from \"../context/create-context\";\n\nexport interface HandlePaymentFailedParams {\n /**\n * Subscription ID whose payment failed\n */\n subscriptionId: string;\n /**\n * Error message from the payment provider\n */\n error?: string;\n}\n\nexport interface HandlePaymentFailedResult {\n /**\n * The subscription that was marked as past_due\n */\n subscription: Subscription;\n}\n\n/**\n * Handle a failed payment for a subscription.\n *\n * This is the single source of truth for payment failure logic.\n * The default behavior marks the subscription as past_due to give\n * the customer a chance to update their payment method.\n */\nexport async function handlePaymentFailed(\n ctx: BillingContext,\n params: HandlePaymentFailedParams,\n): Promise<HandlePaymentFailedResult> {\n const { subscriptionId, error } = params;\n\n // Find the subscription\n const subscription =\n await ctx.internalAdapter.findSubscriptionById(subscriptionId);\n if (!subscription) {\n throw new Error(\"Subscription not found\");\n }\n\n ctx.logger.info(\"Payment failed, marking subscription as past_due\", {\n subscriptionId: subscription.id,\n error,\n });\n\n // Update subscription status to past_due\n const updatedSubscription = await ctx.internalAdapter.updateSubscription(\n subscription.id,\n { status: \"past_due\" },\n );\n\n return {\n subscription: updatedSubscription ?? {\n ...subscription,\n status: \"past_due\",\n },\n };\n}\n","import type { Payment } from \"@billsdk/core\";\nimport type { BillingContext } from \"../context/create-context\";\n\nexport interface CreateRefundParams {\n /**\n * Payment ID to refund (BillSDK payment ID)\n */\n paymentId: string;\n /**\n * Amount to refund in cents (partial refund)\n * If omitted, full refund is issued\n */\n amount?: number;\n /**\n * Reason for the refund\n */\n reason?: string;\n}\n\nexport interface CreateRefundResult {\n refund: Payment;\n originalPayment: Payment;\n}\n\n/**\n * Create a refund for a payment.\n *\n * This is the single source of truth for refund logic.\n * Both HTTP endpoints and direct API methods should use this function.\n */\nexport async function createRefund(\n ctx: BillingContext,\n params: CreateRefundParams,\n): Promise<CreateRefundResult> {\n const { paymentId, amount, reason } = params;\n\n // Check if payment adapter supports refunds\n if (!ctx.paymentAdapter?.refund) {\n throw new Error(\"Payment adapter does not support refunds\");\n }\n\n // Find the payment\n const payment = await ctx.internalAdapter.findPaymentById(paymentId);\n if (!payment) {\n throw new Error(\"Payment not found\");\n }\n\n // Check payment is refundable\n if (payment.status !== \"succeeded\") {\n throw new Error(`Cannot refund payment with status \"${payment.status}\"`);\n }\n\n // Check if already fully refunded\n const alreadyRefunded = payment.refundedAmount ?? 0;\n const remainingAmount = payment.amount - alreadyRefunded;\n\n if (remainingAmount <= 0) {\n throw new Error(\"Payment has already been fully refunded\");\n }\n\n // Determine refund amount\n const refundAmount = amount ?? remainingAmount;\n\n if (refundAmount > remainingAmount) {\n throw new Error(\n `Cannot refund ${refundAmount}. Only ${remainingAmount} is available for refund.`,\n );\n }\n\n // Check if payment has a provider payment ID\n if (!payment.providerPaymentId) {\n throw new Error(\n \"Payment does not have a provider payment ID. Cannot process refund.\",\n );\n }\n\n // Call the adapter to process the refund\n const result = await ctx.paymentAdapter.refund({\n providerPaymentId: payment.providerPaymentId,\n amount: refundAmount,\n reason,\n });\n\n if (result.status === \"failed\") {\n throw new Error(result.error ?? \"Refund failed\");\n }\n\n // Update the original payment with refunded amount\n const newRefundedAmount = alreadyRefunded + refundAmount;\n const newStatus =\n newRefundedAmount >= payment.amount ? \"refunded\" : \"succeeded\";\n\n await ctx.internalAdapter.updatePayment(payment.id, {\n status: newStatus,\n refundedAmount: newRefundedAmount,\n });\n\n // Record the refund as a negative payment\n const refundPayment = await ctx.internalAdapter.createPayment({\n customerId: payment.customerId,\n subscriptionId: payment.subscriptionId ?? undefined,\n type: \"refund\",\n status: \"succeeded\",\n amount: -refundAmount, // Negative to indicate refund\n currency: payment.currency,\n providerPaymentId: result.providerRefundId,\n metadata: {\n originalPaymentId: payment.id,\n reason,\n },\n });\n\n ctx.logger.info(\"Refund processed\", {\n originalPaymentId: payment.id,\n refundPaymentId: refundPayment.id,\n amount: refundAmount,\n });\n\n if (payment.subscriptionId) {\n const subscription = await ctx.internalAdapter.findSubscriptionById(\n payment.subscriptionId,\n );\n\n if (subscription && subscription.status !== \"canceled\") {\n ctx.logger.info(\"Refund includes subscription cancellation\", {\n subscriptionId: subscription.id,\n paymentId,\n });\n\n await ctx.internalAdapter.cancelSubscription(subscription.id);\n }\n }\n\n return {\n refund: refundPayment,\n originalPayment: {\n ...payment,\n status: newStatus,\n refundedAmount: newRefundedAmount,\n },\n };\n}\n","import type { BillingInterval } from \"../types/models\";\n\n/**\n * Result of a proration calculation\n */\nexport interface ProrationResult {\n /**\n * Credit for unused time on current plan (in cents)\n */\n credit: number;\n /**\n * Charge for new plan prorated to remaining time (in cents)\n */\n charge: number;\n /**\n * Net amount to charge (charge - credit, can be negative = credit to customer)\n */\n netAmount: number;\n /**\n * Number of days remaining in period\n */\n daysRemaining: number;\n /**\n * Total days in the billing period\n */\n totalDays: number;\n}\n\n/**\n * Parameters for proration calculation\n */\nexport interface ProrationParams {\n /**\n * Current plan amount in cents\n */\n oldPlanAmount: number;\n /**\n * New plan amount in cents\n */\n newPlanAmount: number;\n /**\n * Start of current billing period\n */\n currentPeriodStart: Date;\n /**\n * End of current billing period\n */\n currentPeriodEnd: Date;\n /**\n * Date when the plan change occurs (defaults to now)\n */\n changeDate?: Date;\n}\n\n/**\n * Calculate the number of days between two dates\n */\nfunction daysBetween(start: Date, end: Date): number {\n const msPerDay = 1000 * 60 * 60 * 24;\n return Math.ceil((end.getTime() - start.getTime()) / msPerDay);\n}\n\n/**\n * Calculate proration for a plan change\n *\n * BillSDK handles all proration logic. The payment adapter only sees\n * the final amount to charge.\n *\n * @example\n * ```typescript\n * // User on Pro ($20/mo) upgrading to Enterprise ($50/mo) mid-month\n * const result = calculateProration({\n * oldPlanAmount: 2000, // $20 in cents\n * newPlanAmount: 5000, // $50 in cents\n * currentPeriodStart: new Date('2024-01-01'),\n * currentPeriodEnd: new Date('2024-01-31'),\n * changeDate: new Date('2024-01-15'),\n * });\n *\n * // result.credit = 1032 (unused Pro time)\n * // result.charge = 2581 (prorated Enterprise)\n * // result.netAmount = 1549 ($15.49 to charge)\n * ```\n */\nexport function calculateProration(params: ProrationParams): ProrationResult {\n const {\n oldPlanAmount,\n newPlanAmount,\n currentPeriodStart,\n currentPeriodEnd,\n changeDate = new Date(),\n } = params;\n\n // Calculate total days in billing period\n const totalDays = daysBetween(currentPeriodStart, currentPeriodEnd);\n\n // Calculate days remaining (from change date to period end)\n const daysRemaining = daysBetween(changeDate, currentPeriodEnd);\n\n // Ensure daysRemaining is not negative or greater than totalDays\n const effectiveDaysRemaining = Math.max(\n 0,\n Math.min(daysRemaining, totalDays),\n );\n\n // Calculate credit for unused time on old plan\n // credit = (oldPlanAmount / totalDays) * daysRemaining\n const credit = Math.round(\n (oldPlanAmount / totalDays) * effectiveDaysRemaining,\n );\n\n // Calculate charge for new plan prorated\n // charge = (newPlanAmount / totalDays) * daysRemaining\n const charge = Math.round(\n (newPlanAmount / totalDays) * effectiveDaysRemaining,\n );\n\n // Net amount (can be negative if downgrading)\n const netAmount = charge - credit;\n\n return {\n credit,\n charge,\n netAmount,\n daysRemaining: effectiveDaysRemaining,\n totalDays,\n };\n}\n\n/**\n * Calculate the full amount for a new subscription period\n * (No proration - full amount for the interval)\n */\nexport function calculateFullPeriodAmount(\n amount: number,\n _interval: BillingInterval,\n): number {\n // For now, just return the amount as-is\n // In the future, this could handle quarterly calculations, etc.\n return amount;\n}\n","import type { Payment, Plan, Subscription } from \"@billsdk/core\";\nimport type { BillingContext } from \"../context/create-context\";\nimport { calculateProration } from \"./proration\";\n\nexport interface CreateSubscriptionParams {\n customerId: string;\n planCode: string;\n interval?: \"monthly\" | \"yearly\";\n successUrl?: string;\n cancelUrl?: string;\n}\n\nexport interface CreateSubscriptionResult {\n subscription: Subscription;\n redirectUrl?: string;\n}\n\n/**\n * Create a new subscription for a customer.\n *\n * This is the single source of truth for subscription creation logic.\n * Both HTTP endpoints and direct API methods should use this function.\n */\nexport async function createSubscription(\n ctx: BillingContext,\n params: CreateSubscriptionParams,\n): Promise<CreateSubscriptionResult> {\n const {\n customerId,\n planCode,\n interval = \"monthly\",\n successUrl,\n cancelUrl,\n } = params;\n\n // Check if payment adapter is configured\n if (!ctx.paymentAdapter) {\n throw new Error(\"Payment adapter not configured\");\n }\n\n // Find customer by external ID\n const customer =\n await ctx.internalAdapter.findCustomerByExternalId(customerId);\n if (!customer) {\n throw new Error(\"Customer not found\");\n }\n\n // Find plan from config (synchronous)\n const plan = ctx.internalAdapter.findPlanByCode(planCode);\n if (!plan) {\n throw new Error(\"Plan not found\");\n }\n\n // Find price for interval (synchronous)\n const price = ctx.internalAdapter.getPlanPrice(planCode, interval);\n if (!price) {\n throw new Error(\n `No price found for plan ${planCode} with interval ${interval}`,\n );\n }\n\n // Create subscription in pending state\n const subscription = await ctx.internalAdapter.createSubscription({\n customerId: customer.id,\n planCode,\n interval,\n status: \"pending_payment\",\n trialDays: price.trialDays,\n });\n\n // Process payment - adapter decides the flow\n const result = await ctx.paymentAdapter.processPayment({\n customer: {\n id: customer.id,\n email: customer.email,\n providerCustomerId: customer.providerCustomerId,\n },\n plan: {\n code: plan.code,\n name: plan.name,\n },\n price: {\n amount: price.amount,\n currency: price.currency,\n interval: price.interval,\n },\n subscription: {\n id: subscription.id,\n },\n successUrl,\n cancelUrl,\n metadata: {\n subscriptionId: subscription.id,\n customerId: customer.id,\n },\n });\n\n // Handle payment result based on adapter's decision\n if (result.status === \"active\") {\n // Cancel any other active subscriptions for this customer\n const existingSubscriptions = await ctx.internalAdapter.listSubscriptions(\n customer.id,\n );\n for (const existing of existingSubscriptions) {\n if (\n existing.id !== subscription.id &&\n (existing.status === \"active\" || existing.status === \"trialing\")\n ) {\n await ctx.internalAdapter.cancelSubscription(existing.id);\n }\n }\n\n // Payment completed immediately - activate subscription\n const activeSubscription = await ctx.internalAdapter.updateSubscription(\n subscription.id,\n { status: \"active\" },\n );\n\n // Update customer with provider ID if returned\n if (result.providerCustomerId && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n\n // Record the payment (only if amount > 0)\n if (price.amount > 0) {\n await ctx.internalAdapter.createPayment({\n customerId: customer.id,\n subscriptionId: subscription.id,\n type: \"subscription\",\n status: \"succeeded\",\n amount: price.amount,\n currency: price.currency,\n metadata: {\n planCode: plan.code,\n interval,\n },\n });\n }\n\n return {\n subscription: activeSubscription ?? {\n ...subscription,\n status: \"active\" as const,\n },\n };\n }\n\n if (result.status === \"pending\") {\n // Payment pending - user needs to complete payment flow\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n providerCheckoutSessionId: result.sessionId,\n });\n\n // Update customer with provider ID if returned\n if (result.providerCustomerId && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n\n return {\n subscription,\n redirectUrl: result.redirectUrl,\n };\n }\n\n // result.status === \"failed\"\n // Mark the subscription as canceled since payment failed\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n status: \"canceled\",\n });\n throw new Error(result.error);\n}\n\nexport interface CancelSubscriptionParams {\n customerId: string;\n cancelAt?: \"period_end\" | \"immediately\";\n}\n\nexport interface CancelSubscriptionResult {\n subscription: Subscription | null;\n canceledImmediately: boolean;\n accessUntil?: Date;\n}\n\n/**\n * Cancel an existing subscription.\n *\n * This is the single source of truth for subscription cancellation logic.\n * Both HTTP endpoints and direct API methods should use this function.\n */\nexport async function cancelSubscription(\n ctx: BillingContext,\n params: CancelSubscriptionParams,\n): Promise<CancelSubscriptionResult> {\n const { customerId, cancelAt = \"period_end\" } = params;\n\n // Find customer by external ID\n const customer =\n await ctx.internalAdapter.findCustomerByExternalId(customerId);\n if (!customer) {\n throw new Error(\"Customer not found\");\n }\n\n // Find active subscription\n const subscription = await ctx.internalAdapter.findSubscriptionByCustomerId(\n customer.id,\n );\n if (!subscription) {\n throw new Error(\"No active subscription found\");\n }\n\n // Cancel subscription\n if (cancelAt === \"immediately\") {\n const canceled = await ctx.internalAdapter.cancelSubscription(\n subscription.id,\n );\n return { subscription: canceled, canceledImmediately: true };\n }\n\n // Cancel at period end\n const canceled = await ctx.internalAdapter.cancelSubscription(\n subscription.id,\n subscription.currentPeriodEnd,\n );\n return {\n subscription: canceled,\n canceledImmediately: false,\n accessUntil: subscription.currentPeriodEnd,\n };\n}\n\nexport interface ChangeSubscriptionParams {\n customerId: string;\n newPlanCode: string;\n prorate?: boolean;\n}\n\nexport interface ChangeSubscriptionResult {\n subscription: Subscription | null;\n previousPlan: Plan | null;\n newPlan: Plan;\n payment: Payment | null;\n}\n\n/**\n * Change a subscription to a different plan.\n *\n * This is the single source of truth for subscription change logic.\n * Both HTTP endpoints and direct API methods should use this function.\n */\nexport async function changeSubscription(\n ctx: BillingContext,\n params: ChangeSubscriptionParams,\n): Promise<ChangeSubscriptionResult> {\n const { customerId, newPlanCode, prorate = true } = params;\n\n // Find customer by external ID\n const customer =\n await ctx.internalAdapter.findCustomerByExternalId(customerId);\n if (!customer) {\n throw new Error(\"Customer not found\");\n }\n\n // Find active subscription\n const subscription = await ctx.internalAdapter.findSubscriptionByCustomerId(\n customer.id,\n );\n if (!subscription) {\n throw new Error(\"No active subscription found\");\n }\n\n // Check if already on the same plan\n if (subscription.planCode === newPlanCode) {\n throw new Error(\"Already on this plan\");\n }\n\n // Get current plan and price\n const oldPlan = ctx.internalAdapter.findPlanByCode(subscription.planCode);\n const oldPrice = ctx.internalAdapter.getPlanPrice(\n subscription.planCode,\n subscription.interval,\n );\n if (!oldPrice) {\n throw new Error(\"Current plan price not found\");\n }\n\n // Get new plan and price\n const newPlan = ctx.internalAdapter.findPlanByCode(newPlanCode);\n if (!newPlan) {\n throw new Error(\"New plan not found\");\n }\n\n const newPrice = ctx.internalAdapter.getPlanPrice(\n newPlanCode,\n subscription.interval,\n );\n if (!newPrice) {\n throw new Error(\n `No price found for plan ${newPlanCode} with interval ${subscription.interval}`,\n );\n }\n\n let payment: Payment | null = null;\n\n // Calculate and process proration if enabled\n if (prorate) {\n const prorationResult = calculateProration({\n oldPlanAmount: oldPrice.amount,\n newPlanAmount: newPrice.amount,\n currentPeriodStart: subscription.currentPeriodStart,\n currentPeriodEnd: subscription.currentPeriodEnd,\n changeDate: new Date(),\n });\n\n ctx.logger.info(\"Proration calculated\", {\n credit: prorationResult.credit,\n charge: prorationResult.charge,\n netAmount: prorationResult.netAmount,\n daysRemaining: prorationResult.daysRemaining,\n });\n\n // If there's a positive net amount, charge the customer\n if (prorationResult.netAmount > 0) {\n // Check if adapter supports direct charging\n if (!ctx.paymentAdapter?.charge) {\n throw new Error(\n \"Payment adapter does not support direct charging. Cannot process upgrade.\",\n );\n }\n\n // Customer must have a saved payment method\n if (!customer.providerCustomerId) {\n throw new Error(\n \"Customer does not have a saved payment method. Cannot process upgrade.\",\n );\n }\n\n // Charge the difference\n const chargeResult = await ctx.paymentAdapter.charge({\n customer: {\n id: customer.id,\n email: customer.email,\n providerCustomerId: customer.providerCustomerId,\n },\n amount: prorationResult.netAmount,\n currency: newPrice.currency,\n description: `Upgrade from ${oldPlan?.name ?? subscription.planCode} to ${newPlan.name}`,\n metadata: {\n subscriptionId: subscription.id,\n customerId: customer.id,\n type: \"upgrade\",\n oldPlanCode: subscription.planCode,\n newPlanCode,\n },\n });\n\n if (chargeResult.status === \"failed\") {\n throw new Error(chargeResult.error ?? \"Charge failed\");\n }\n\n // Record the payment\n payment = await ctx.internalAdapter.createPayment({\n customerId: customer.id,\n subscriptionId: subscription.id,\n type: \"upgrade\",\n status: \"succeeded\",\n amount: prorationResult.netAmount,\n currency: newPrice.currency,\n providerPaymentId: chargeResult.providerPaymentId,\n metadata: {\n oldPlanCode: subscription.planCode,\n newPlanCode,\n proration: {\n credit: prorationResult.credit,\n charge: prorationResult.charge,\n },\n },\n });\n }\n // If netAmount is negative (downgrade), we could issue a credit\n // For now, we just update the plan without refunding\n }\n\n // Update subscription with new plan\n const updatedSubscription = await ctx.internalAdapter.updateSubscription(\n subscription.id,\n { planCode: newPlanCode },\n );\n\n return {\n subscription: updatedSubscription,\n previousPlan: oldPlan,\n newPlan,\n payment,\n };\n}\n","import type { Subscription } from \"@billsdk/core\";\nimport type { BillingContext } from \"../context/create-context\";\n\nexport interface HandleTrialEndParams {\n /**\n * Subscription ID whose trial is ending\n */\n subscriptionId: string;\n}\n\nexport interface HandleTrialEndResult {\n /**\n * The subscription after trial processing\n */\n subscription: Subscription;\n /**\n * Whether the subscription was converted to paid (true) or canceled (false)\n */\n converted: boolean;\n}\n\n/**\n * Handle the end of a trial period for a subscription.\n *\n * This is the single source of truth for trial end logic.\n * The default behavior:\n * - If customer has a payment method: activates the subscription\n * - If no payment method: cancels the subscription\n */\nexport async function handleTrialEnd(\n ctx: BillingContext,\n params: HandleTrialEndParams,\n): Promise<HandleTrialEndResult> {\n const { subscriptionId } = params;\n\n // Find the subscription\n const subscription =\n await ctx.internalAdapter.findSubscriptionById(subscriptionId);\n if (!subscription) {\n throw new Error(\"Subscription not found\");\n }\n\n // Find the customer\n const customer = await ctx.internalAdapter.findCustomerById(\n subscription.customerId,\n );\n if (!customer) {\n throw new Error(\"Customer not found\");\n }\n\n // Get the plan\n const plan = ctx.internalAdapter.findPlanByCode(subscription.planCode);\n\n ctx.logger.info(\"Processing trial end\", {\n subscriptionId: subscription.id,\n customerId: customer.id,\n planCode: plan?.code,\n });\n\n // If customer has no payment method, cancel the subscription\n if (!customer.providerCustomerId) {\n ctx.logger.info(\"No payment method, canceling subscription\", {\n subscriptionId: subscription.id,\n });\n\n const canceledSubscription = await ctx.internalAdapter.cancelSubscription(\n subscription.id,\n );\n\n return {\n subscription: canceledSubscription ?? {\n ...subscription,\n status: \"canceled\",\n },\n converted: false,\n };\n }\n\n // Customer has payment method - activate the subscription\n ctx.logger.info(\"Payment method exists, activating subscription\", {\n subscriptionId: subscription.id,\n });\n\n const activeSubscription = await ctx.internalAdapter.updateSubscription(\n subscription.id,\n { status: \"active\" },\n );\n\n return {\n subscription: activeSubscription ?? { ...subscription, status: \"active\" },\n converted: true,\n };\n}\n","import type {\n OnPaymentFailedParams,\n OnPaymentFailedResult,\n OnRefundParams,\n OnRefundResult,\n OnSubscriptionCancelParams,\n OnSubscriptionCancelResult,\n OnTrialEndParams,\n OnTrialEndResult,\n} from \"@billsdk/core\";\nimport type { BillingContext } from \"../../context/create-context\";\nimport { handlePaymentFailed as handlePaymentFailedService } from \"../payment-failed-service\";\nimport { createRefund as createRefundService } from \"../refund-service\";\nimport { cancelSubscription as cancelSubscriptionService } from \"../subscription-service\";\nimport { handleTrialEnd as handleTrialEndService } from \"../trial-end-service\";\n\n/**\n * Default billing behaviors - these are the opinionated defaults that BillSDK\n * provides out of the box. Each can be overridden in the billsdk config.\n *\n * Philosophy: Defaults should be safe, predictable, and align with common\n * billing best practices.\n */\nexport const defaultBehaviors = {\n /**\n * Default onRefund behavior: Delegates to refund service.\n *\n * The service handles all business logic:\n * - Process the refund via payment adapter\n * - Cancel the associated subscription (BillSDK opinionated default)\n *\n * Override this behavior if you want different logic (e.g., refund without cancel).\n */\n onRefund: async (\n ctx: BillingContext,\n params: OnRefundParams,\n ): Promise<OnRefundResult> => {\n return createRefundService(ctx, {\n paymentId: params.paymentId,\n amount: params.amount,\n reason: params.reason,\n });\n },\n\n /**\n * Default onPaymentFailed behavior: Delegates to payment-failed service.\n *\n * The service handles all business logic:\n * - Find subscription\n * - Mark as past_due\n *\n * Override this behavior if you want different logic (e.g., immediate cancel).\n */\n onPaymentFailed: async (\n ctx: BillingContext,\n params: OnPaymentFailedParams,\n ): Promise<OnPaymentFailedResult> => {\n return handlePaymentFailedService(ctx, {\n subscriptionId: params.subscriptionId,\n error: params.error,\n });\n },\n\n /**\n * Default onSubscriptionCancel behavior: Delegates to cancel service.\n *\n * The service handles all business logic:\n * - Find customer and subscription\n * - Cancel immediately or at period end\n *\n * Override this behavior if you want different logic (e.g., downgrade to free).\n */\n onSubscriptionCancel: async (\n ctx: BillingContext,\n params: OnSubscriptionCancelParams,\n ): Promise<OnSubscriptionCancelResult> => {\n return cancelSubscriptionService(ctx, {\n customerId: params.customerId,\n cancelAt: params.cancelAt,\n });\n },\n\n /**\n * Default onTrialEnd behavior: Delegates to trial-end service.\n *\n * The service handles all business logic:\n * - If customer has payment method: activates subscription\n * - If no payment method: cancels subscription\n *\n * Override this behavior if you want different logic (e.g., extend trial).\n */\n onTrialEnd: async (\n ctx: BillingContext,\n params: OnTrialEndParams,\n ): Promise<OnTrialEndResult> => {\n return handleTrialEndService(ctx, {\n subscriptionId: params.subscriptionId,\n });\n },\n};\n\n/**\n * Type for the default behaviors object\n */\nexport type DefaultBehaviors = typeof defaultBehaviors;\n","import type {\n OnPaymentFailedParams,\n OnPaymentFailedResult,\n OnRefundParams,\n OnRefundResult,\n OnSubscriptionCancelParams,\n OnSubscriptionCancelResult,\n OnTrialEndParams,\n OnTrialEndResult,\n} from \"@billsdk/core\";\nimport type { BillingContext } from \"../../context/create-context\";\nimport { defaultBehaviors } from \"./defaults\";\n\n/**\n * Map of behavior names to their parameter and result types.\n * Used for type inference in runBehavior.\n */\ntype BehaviorConfig = {\n onRefund: { params: OnRefundParams; result: OnRefundResult };\n onPaymentFailed: {\n params: OnPaymentFailedParams;\n result: OnPaymentFailedResult;\n };\n onSubscriptionCancel: {\n params: OnSubscriptionCancelParams;\n result: OnSubscriptionCancelResult;\n };\n onTrialEnd: { params: OnTrialEndParams; result: OnTrialEndResult };\n};\n\n/**\n * Run a billing behavior with optional user override.\n *\n * This is the core of the configurable behaviors system:\n * 1. If the user provided an override, call it with the default as an argument\n * 2. If no override, run the default behavior\n *\n * The behavior controls the entire operation and returns the result.\n *\n * @param ctx - The billing context\n * @param behaviorName - Name of the behavior to run\n * @param params - Input parameters for the behavior\n * @returns The result of the behavior operation\n *\n * @example\n * ```typescript\n * // Entry point calls behavior with inputs:\n * const result = await runBehavior(ctx, \"onRefund\", {\n * paymentId: \"pay_123\",\n * amount: 1000,\n * });\n * ```\n */\nexport async function runBehavior<T extends keyof BehaviorConfig>(\n ctx: BillingContext,\n behaviorName: T,\n params: BehaviorConfig[T][\"params\"],\n): Promise<BehaviorConfig[T][\"result\"]> {\n const userBehavior = ctx.options.behaviors?.[behaviorName];\n const defaultFn = defaultBehaviors[behaviorName];\n\n // Create the default behavior function that the user can optionally call\n const defaultBehavior = async (): Promise<BehaviorConfig[T][\"result\"]> => {\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing is handled by the caller\n return defaultFn(ctx, params as any);\n };\n\n if (userBehavior) {\n ctx.logger.debug(`Running user-defined behavior: ${behaviorName}`);\n // User provided an override - call it with the default available\n // biome-ignore lint/suspicious/noExplicitAny: Type narrowing is handled by the caller\n return userBehavior(ctx as any, params as any, defaultBehavior as any);\n }\n\n ctx.logger.debug(`Running default behavior: ${behaviorName}`);\n // No override - run the default\n return defaultBehavior();\n}\n","import { z } from \"zod\";\nimport type { BillingContext } from \"../../context/create-context\";\nimport { runBehavior } from \"../../logic/behaviors/runner\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Create refund schema\n */\nconst createRefundSchema = z.object({\n /**\n * Payment ID to refund (BillSDK payment ID)\n */\n paymentId: z.string().min(1),\n /**\n * Amount to refund in cents (partial refund)\n * If omitted, full refund is issued\n */\n amount: z.number().positive().optional(),\n /**\n * Reason for the refund\n */\n reason: z.string().optional(),\n});\n\n/**\n * Refund endpoints\n */\nexport const refundEndpoints: Record<string, BillingEndpoint> = {\n createRefund: {\n path: \"/refund\",\n options: {\n method: \"POST\",\n body: createRefundSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof createRefundSchema>>,\n ) => {\n const { ctx, body } = context;\n\n // Delegate to behavior (default: refund + cancel subscription)\n return runBehavior(ctx as BillingContext, \"onRefund\", {\n paymentId: body.paymentId,\n amount: body.amount,\n reason: body.reason,\n });\n },\n },\n};\n","import { z } from \"zod\";\nimport type { BillingContext } from \"../../context/create-context\";\nimport { runBehavior } from \"../../logic/behaviors/runner\";\nimport {\n changeSubscription as changeSubscriptionService,\n createSubscription as createSubscriptionService,\n} from \"../../logic/subscription-service\";\nimport type { BillingEndpoint, EndpointContext } from \"../../types/api\";\n\n/**\n * Get subscription query schema\n */\nconst getSubscriptionQuerySchema = z.object({\n customerId: z.string().min(1),\n});\n\n/**\n * Create subscription schema\n * successUrl and cancelUrl are optional - only required if payment adapter needs them\n */\nconst createSubscriptionSchema = z.object({\n customerId: z.string().min(1),\n planCode: z.string().min(1),\n interval: z.enum([\"monthly\", \"yearly\"]).optional().default(\"monthly\"),\n successUrl: z.string().url().optional(),\n cancelUrl: z.string().url().optional(),\n});\n\n/**\n * Cancel subscription schema\n */\nconst cancelSubscriptionSchema = z.object({\n customerId: z.string().min(1),\n cancelAt: z\n .enum([\"period_end\", \"immediately\"])\n .optional()\n .default(\"period_end\"),\n});\n\n/**\n * Change subscription (upgrade/downgrade) schema\n */\nconst changeSubscriptionSchema = z.object({\n customerId: z.string().min(1),\n newPlanCode: z.string().min(1),\n /**\n * Whether to prorate the charge/credit\n * If false, the new plan starts at the next billing cycle\n */\n prorate: z.boolean().optional().default(true),\n});\n\n/**\n * Subscription endpoints\n */\nexport const subscriptionEndpoints: Record<string, BillingEndpoint> = {\n getSubscription: {\n path: \"/subscription\",\n options: {\n method: \"GET\",\n query: getSubscriptionQuerySchema,\n },\n handler: async (\n context: EndpointContext<\n unknown,\n z.infer<typeof getSubscriptionQuerySchema>\n >,\n ) => {\n const { ctx, query } = context;\n\n // Find customer by external ID\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n query.customerId,\n );\n if (!customer) {\n return { subscription: null };\n }\n\n // Find active subscription\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) {\n return { subscription: null };\n }\n\n // Get plan from config (synchronous)\n const plan = ctx.internalAdapter.findPlanByCode(subscription.planCode);\n const price = plan\n ? ctx.internalAdapter.getPlanPrice(\n subscription.planCode,\n subscription.interval,\n )\n : null;\n\n return {\n subscription,\n plan,\n price,\n };\n },\n },\n\n createSubscription: {\n path: \"/subscription\",\n options: {\n method: \"POST\",\n body: createSubscriptionSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof createSubscriptionSchema>>,\n ) => {\n const { ctx, body } = context;\n\n // Delegate to shared service\n return createSubscriptionService(ctx as BillingContext, {\n customerId: body.customerId,\n planCode: body.planCode,\n interval: body.interval,\n successUrl: body.successUrl,\n cancelUrl: body.cancelUrl,\n });\n },\n },\n\n cancelSubscription: {\n path: \"/subscription/cancel\",\n options: {\n method: \"POST\",\n body: cancelSubscriptionSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof cancelSubscriptionSchema>>,\n ) => {\n const { ctx, body } = context;\n\n // Delegate to behavior (default: cancel subscription)\n return runBehavior(ctx as BillingContext, \"onSubscriptionCancel\", {\n customerId: body.customerId,\n cancelAt: body.cancelAt,\n });\n },\n },\n\n changeSubscription: {\n path: \"/subscription/change\",\n options: {\n method: \"POST\",\n body: changeSubscriptionSchema,\n },\n handler: async (\n context: EndpointContext<z.infer<typeof changeSubscriptionSchema>>,\n ) => {\n const { ctx, body } = context;\n const billingCtx = ctx as BillingContext;\n return changeSubscriptionService(billingCtx, body);\n },\n },\n};\n","import type { BillingContext } from \"../../context/create-context\";\nimport type { BillingEndpoint } from \"../../types/api\";\n\n/**\n * Webhook endpoints\n */\nexport const webhookEndpoints: Record<string, BillingEndpoint> = {\n handleWebhook: {\n path: \"/webhook\",\n options: {\n method: \"POST\",\n },\n handler: async (context: { ctx: BillingContext; request: Request }) => {\n const { ctx, request } = context;\n\n if (!ctx.paymentAdapter) {\n throw new Error(\"Payment adapter not configured\");\n }\n\n // Check if payment adapter supports confirmPayment\n if (!ctx.paymentAdapter.confirmPayment) {\n // Adapter doesn't need webhooks (e.g., default adapter that activates immediately)\n ctx.logger.debug(\"Payment adapter does not support confirmPayment\");\n return { received: true };\n }\n\n // Confirm payment from webhook/callback\n const result = await ctx.paymentAdapter.confirmPayment(request);\n\n // If result is null, the event was acknowledged but not relevant to us\n if (!result) {\n ctx.logger.debug(\"Webhook event acknowledged but not processed\");\n return { received: true };\n }\n\n ctx.logger.debug(\"Payment confirmation received\", {\n subscriptionId: result.subscriptionId,\n status: result.status,\n });\n\n if (result.status === \"active\") {\n // Find the subscription\n const subscription = await ctx.internalAdapter.findSubscriptionById(\n result.subscriptionId,\n );\n\n if (subscription) {\n // Cancel any other active subscriptions for this customer\n const existingSubscriptions =\n await ctx.internalAdapter.listSubscriptions(\n subscription.customerId,\n );\n\n for (const existing of existingSubscriptions) {\n if (\n existing.id !== subscription.id &&\n (existing.status === \"active\" || existing.status === \"trialing\")\n ) {\n await ctx.internalAdapter.cancelSubscription(existing.id);\n ctx.logger.info(\"Canceled previous subscription\", {\n subscriptionId: existing.id,\n planCode: existing.planCode,\n });\n }\n }\n\n // Update subscription to active\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n status: \"active\",\n providerSubscriptionId: result.providerSubscriptionId,\n });\n\n // Update customer provider ID if present\n if (result.providerCustomerId) {\n const customer = await ctx.internalAdapter.findCustomerById(\n subscription.customerId,\n );\n if (customer && !customer.providerCustomerId) {\n await ctx.internalAdapter.updateCustomer(customer.id, {\n providerCustomerId: result.providerCustomerId,\n });\n }\n }\n\n ctx.logger.info(\"Subscription activated via webhook\", {\n subscriptionId: subscription.id,\n providerSubscriptionId: result.providerSubscriptionId,\n });\n } else {\n ctx.logger.warn(\"Subscription not found for confirmation\", {\n subscriptionId: result.subscriptionId,\n });\n }\n } else if (result.status === \"failed\") {\n // Mark subscription as failed/canceled\n const subscription = await ctx.internalAdapter.findSubscriptionById(\n result.subscriptionId,\n );\n\n if (subscription) {\n await ctx.internalAdapter.updateSubscription(subscription.id, {\n status: \"canceled\",\n });\n ctx.logger.warn(\"Payment failed, subscription canceled\", {\n subscriptionId: subscription.id,\n });\n }\n }\n\n return { received: true };\n },\n },\n};\n","import type { BillingContext } from \"../context/create-context\";\nimport type { BillingEndpoint } from \"../types/api\";\nimport { customerEndpoints } from \"./routes/customer\";\nimport { featureEndpoints } from \"./routes/features\";\nimport { healthEndpoint } from \"./routes/health\";\nimport { paymentEndpoints } from \"./routes/payment\";\nimport { planEndpoints } from \"./routes/plan\";\nimport { refundEndpoints } from \"./routes/refund\";\nimport { subscriptionEndpoints } from \"./routes/subscription\";\nimport { webhookEndpoints } from \"./routes/webhook\";\n\n/**\n * Collect all endpoints\n */\nexport function getEndpoints(\n ctx: BillingContext,\n): Record<string, BillingEndpoint> {\n const baseEndpoints: Record<string, BillingEndpoint> = {\n ...healthEndpoint,\n ...customerEndpoints,\n ...planEndpoints,\n ...subscriptionEndpoints,\n ...featureEndpoints,\n ...paymentEndpoints,\n ...refundEndpoints,\n ...webhookEndpoints,\n };\n\n // Add plugin endpoints\n let allEndpoints = { ...baseEndpoints };\n for (const plugin of ctx.plugins) {\n if (plugin.endpoints) {\n allEndpoints = { ...allEndpoints, ...plugin.endpoints };\n }\n }\n\n return allEndpoints;\n}\n\n/**\n * Parse URL to get path and query params\n */\nfunction parseUrl(\n url: string,\n basePath: string,\n): { path: string; query: URLSearchParams } {\n const urlObj = new URL(url);\n let path = urlObj.pathname;\n\n // Remove base path\n if (path.startsWith(basePath)) {\n path = path.slice(basePath.length);\n }\n\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = `/${path}`;\n }\n\n return { path, query: urlObj.searchParams };\n}\n\n/**\n * Parse query params to object\n */\nfunction queryToObject(query: URLSearchParams): Record<string, string> {\n const obj: Record<string, string> = {};\n query.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n}\n\n/**\n * Create a JSON response\n */\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n}\n\n/**\n * Create an error response\n */\nfunction errorResponse(code: string, message: string, status = 400): Response {\n return jsonResponse({ error: { code, message } }, status);\n}\n\n/**\n * Create the router\n */\nexport function createRouter(ctx: BillingContext): {\n handler: (request: Request) => Promise<Response>;\n endpoints: Record<string, BillingEndpoint>;\n} {\n const endpoints = getEndpoints(ctx);\n\n const handler = async (request: Request): Promise<Response> => {\n const method = request.method.toUpperCase();\n const { path, query } = parseUrl(request.url, ctx.basePath);\n\n ctx.logger.debug(`${method} ${path}`);\n\n // Run before hooks\n if (ctx.options.hooks.before) {\n const result = await ctx.options.hooks.before({\n request,\n path,\n method,\n });\n if (result instanceof Response) {\n return result;\n }\n }\n\n // Run plugin before hooks\n for (const plugin of ctx.plugins) {\n if (plugin.hooks?.before) {\n for (const hook of plugin.hooks.before) {\n if (hook.matcher({ path, method })) {\n const result = await hook.handler({\n request,\n path,\n method,\n billingContext: ctx,\n });\n if (result instanceof Response) {\n return result;\n }\n }\n }\n }\n }\n\n // Find matching endpoint\n const endpointKey = Object.keys(endpoints).find((key) => {\n const endpoint = endpoints[key];\n if (!endpoint) return false;\n\n // Check method\n if (endpoint.options.method !== method) return false;\n\n // Check path (simple matching for now)\n // TODO: Add path params support\n return endpoint.path === path;\n });\n\n if (!endpointKey) {\n return errorResponse(\n \"NOT_FOUND\",\n `No endpoint found for ${method} ${path}`,\n 404,\n );\n }\n\n const endpoint = endpoints[endpointKey]!;\n\n try {\n const requestForHandler = request.clone();\n\n // Parse body for POST/PUT/PATCH\n let body: unknown;\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method) && endpoint.options.body) {\n try {\n const text = await request.text();\n if (text) {\n body = JSON.parse(text);\n }\n } catch {\n // Body might be empty or not JSON\n }\n }\n\n // Validate body if schema provided\n if (endpoint.options.body && body) {\n const result = endpoint.options.body.safeParse(body);\n if (!result.success) {\n const issues = \"issues\" in result.error ? result.error.issues : [];\n return errorResponse(\n \"VALIDATION_ERROR\",\n (issues as Array<{ message: string }>)\n .map((e) => e.message)\n .join(\", \"),\n 400,\n );\n }\n body = result.data;\n }\n\n // Validate query if schema provided\n let queryObj: Record<string, string> = queryToObject(query);\n if (endpoint.options.query) {\n const result = endpoint.options.query.safeParse(queryObj);\n if (!result.success) {\n const issues = \"issues\" in result.error ? result.error.issues : [];\n return errorResponse(\n \"VALIDATION_ERROR\",\n (issues as Array<{ message: string }>)\n .map((e) => e.message)\n .join(\", \"),\n 400,\n );\n }\n queryObj = result.data as Record<string, string>;\n }\n\n // Create endpoint context\n // Use cloned request so handlers can read the body if needed (e.g., webhooks)\n const endpointContext = {\n request: requestForHandler,\n body,\n query: queryObj,\n headers: requestForHandler.headers,\n params: {},\n ctx, // Add billing context\n };\n\n // Execute handler\n // biome-ignore lint/suspicious/noExplicitAny: Type assertion needed to call handlers with different context types\n const response = await endpoint.handler(endpointContext as any);\n\n // Run after hooks\n let finalResponse = jsonResponse(response);\n\n // Run plugin after hooks\n for (const plugin of ctx.plugins) {\n if (plugin.hooks?.after) {\n for (const hook of plugin.hooks.after) {\n if (hook.matcher({ path, method })) {\n const result = await hook.handler({\n request,\n path,\n method,\n billingContext: ctx,\n });\n if (result instanceof Response) {\n finalResponse = result;\n }\n }\n }\n }\n }\n\n if (ctx.options.hooks.after) {\n const result = await ctx.options.hooks.after({\n request,\n path,\n method,\n });\n if (result instanceof Response) {\n finalResponse = result;\n }\n }\n\n return finalResponse;\n } catch (error) {\n ctx.logger.error(\"Endpoint error\", error);\n\n if (error instanceof Error) {\n return errorResponse(\"INTERNAL_ERROR\", error.message, 500);\n }\n\n return errorResponse(\n \"INTERNAL_ERROR\",\n \"An unexpected error occurred\",\n 500,\n );\n }\n };\n\n return { handler, endpoints };\n}\n","import type { DBAdapter } from \"../types/adapter\";\nimport type {\n BillingInterval,\n CreateCustomerInput,\n CreatePaymentInput,\n CreateSubscriptionInput,\n Customer,\n Feature,\n Payment,\n Plan,\n PlanPrice,\n Subscription,\n} from \"../types/models\";\nimport type { FeatureConfig, PlanConfig } from \"../types/options\";\nimport { TABLES } from \"./schema\";\n\n/**\n * Internal adapter that wraps DBAdapter with business logic\n * Plans and features come from config, only customer/subscription from DB\n */\nexport interface InternalAdapter {\n // Customer operations (DB)\n createCustomer(data: CreateCustomerInput): Promise<Customer>;\n findCustomerById(id: string): Promise<Customer | null>;\n findCustomerByExternalId(externalId: string): Promise<Customer | null>;\n updateCustomer(id: string, data: Partial<Customer>): Promise<Customer | null>;\n deleteCustomer(id: string): Promise<void>;\n listCustomers(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Customer[]>;\n\n // Plan operations (from config)\n findPlanByCode(code: string): Plan | null;\n listPlans(options?: { includePrivate?: boolean }): Plan[];\n getPlanPrice(planCode: string, interval: BillingInterval): PlanPrice | null;\n\n // Feature operations (from config)\n findFeatureByCode(code: string): Feature | null;\n listFeatures(): Feature[];\n getPlanFeatures(planCode: string): string[];\n\n // Subscription operations (DB)\n createSubscription(data: CreateSubscriptionInput): Promise<Subscription>;\n findSubscriptionById(id: string): Promise<Subscription | null>;\n findSubscriptionByCustomerId(\n customerId: string,\n ): Promise<Subscription | null>;\n findSubscriptionByProviderSessionId(\n sessionId: string,\n ): Promise<Subscription | null>;\n updateSubscription(\n id: string,\n data: Partial<Subscription>,\n ): Promise<Subscription | null>;\n cancelSubscription(id: string, cancelAt?: Date): Promise<Subscription | null>;\n listSubscriptions(customerId: string): Promise<Subscription[]>;\n\n // Feature access check\n checkFeatureAccess(\n customerId: string,\n featureCode: string,\n ): Promise<{ allowed: boolean }>;\n\n // Payment operations (DB)\n createPayment(data: CreatePaymentInput): Promise<Payment>;\n findPaymentById(id: string): Promise<Payment | null>;\n findPaymentByProviderPaymentId(\n providerPaymentId: string,\n ): Promise<Payment | null>;\n updatePayment(id: string, data: Partial<Payment>): Promise<Payment | null>;\n listPayments(\n customerId: string,\n options?: { limit?: number; offset?: number },\n ): Promise<Payment[]>;\n}\n\n/**\n * Convert PlanConfig to Plan\n */\nfunction planConfigToPlan(config: PlanConfig): Plan {\n return {\n code: config.code,\n name: config.name,\n description: config.description,\n isPublic: config.isPublic ?? true,\n prices: config.prices.map((p) => ({\n amount: p.amount,\n currency: p.currency ?? \"usd\",\n interval: p.interval,\n trialDays: p.trialDays,\n })),\n features: config.features ?? [],\n };\n}\n\n/**\n * Convert FeatureConfig to Feature\n */\nfunction featureConfigToFeature(config: FeatureConfig): Feature {\n return {\n code: config.code,\n name: config.name,\n type: config.type ?? \"boolean\",\n };\n}\n\n/**\n * Create an internal adapter from a DBAdapter and config\n */\nexport function createInternalAdapter(\n adapter: DBAdapter,\n plans: PlanConfig[] = [],\n features: FeatureConfig[] = [],\n): InternalAdapter {\n // Build lookup maps for fast access\n const plansByCode = new Map<string, Plan>();\n for (const config of plans) {\n plansByCode.set(config.code, planConfigToPlan(config));\n }\n\n const featuresByCode = new Map<string, Feature>();\n for (const config of features) {\n featuresByCode.set(config.code, featureConfigToFeature(config));\n }\n\n return {\n // Customer operations (DB)\n async createCustomer(data: CreateCustomerInput): Promise<Customer> {\n const now = new Date();\n return adapter.create<Customer>({\n model: TABLES.CUSTOMER,\n data: {\n ...data,\n createdAt: now,\n updatedAt: now,\n } as Omit<Customer, \"id\">,\n });\n },\n\n async findCustomerById(id: string): Promise<Customer | null> {\n return adapter.findOne<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n });\n },\n\n async findCustomerByExternalId(\n externalId: string,\n ): Promise<Customer | null> {\n return adapter.findOne<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"externalId\", operator: \"eq\", value: externalId }],\n });\n },\n\n async updateCustomer(\n id: string,\n data: Partial<Customer>,\n ): Promise<Customer | null> {\n return adapter.update<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n update: { ...data, updatedAt: new Date() },\n });\n },\n\n async deleteCustomer(id: string): Promise<void> {\n await adapter.delete({\n model: TABLES.CUSTOMER,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n });\n },\n\n async listCustomers(options?: {\n limit?: number;\n offset?: number;\n }): Promise<Customer[]> {\n return adapter.findMany<Customer>({\n model: TABLES.CUSTOMER,\n limit: options?.limit,\n offset: options?.offset,\n sortBy: { field: \"createdAt\", direction: \"desc\" },\n });\n },\n\n // Plan operations (from config - synchronous)\n findPlanByCode(code: string): Plan | null {\n return plansByCode.get(code) ?? null;\n },\n\n listPlans(options?: { includePrivate?: boolean }): Plan[] {\n const allPlans = Array.from(plansByCode.values());\n if (options?.includePrivate) {\n return allPlans;\n }\n return allPlans.filter((p) => p.isPublic);\n },\n\n getPlanPrice(\n planCode: string,\n interval: BillingInterval,\n ): PlanPrice | null {\n const plan = plansByCode.get(planCode);\n if (!plan) return null;\n return (\n plan.prices.find((p) => p.interval === interval) ??\n plan.prices[0] ??\n null\n );\n },\n\n // Feature operations (from config - synchronous)\n findFeatureByCode(code: string): Feature | null {\n return featuresByCode.get(code) ?? null;\n },\n\n listFeatures(): Feature[] {\n return Array.from(featuresByCode.values());\n },\n\n getPlanFeatures(planCode: string): string[] {\n const plan = plansByCode.get(planCode);\n return plan?.features ?? [];\n },\n\n // Subscription operations (DB)\n async createSubscription(\n data: CreateSubscriptionInput,\n ): Promise<Subscription> {\n const now = new Date();\n const interval = data.interval ?? \"monthly\";\n const currentPeriodEnd = new Date(now);\n\n // Set period end based on interval\n if (interval === \"yearly\") {\n currentPeriodEnd.setFullYear(currentPeriodEnd.getFullYear() + 1);\n } else if (interval === \"quarterly\") {\n currentPeriodEnd.setMonth(currentPeriodEnd.getMonth() + 3);\n } else {\n currentPeriodEnd.setMonth(currentPeriodEnd.getMonth() + 1);\n }\n\n let trialStart: Date | undefined;\n let trialEnd: Date | undefined;\n let status = data.status ?? \"pending_payment\";\n\n if (data.trialDays && data.trialDays > 0) {\n trialStart = now;\n trialEnd = new Date(now);\n trialEnd.setDate(trialEnd.getDate() + data.trialDays);\n status = \"trialing\";\n }\n\n return adapter.create<Subscription>({\n model: TABLES.SUBSCRIPTION,\n data: {\n customerId: data.customerId,\n planCode: data.planCode,\n interval,\n status,\n providerSubscriptionId: data.providerSubscriptionId,\n providerCheckoutSessionId: data.providerCheckoutSessionId,\n currentPeriodStart: now,\n currentPeriodEnd: trialEnd ?? currentPeriodEnd,\n trialStart,\n trialEnd,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n } as Omit<Subscription, \"id\">,\n });\n },\n\n async findSubscriptionById(id: string): Promise<Subscription | null> {\n return adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n });\n },\n\n async findSubscriptionByCustomerId(\n customerId: string,\n ): Promise<Subscription | null> {\n return adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [\n { field: \"customerId\", operator: \"eq\", value: customerId },\n {\n field: \"status\",\n operator: \"in\",\n value: [\"active\", \"trialing\", \"past_due\", \"pending_payment\"],\n },\n ],\n });\n },\n\n async findSubscriptionByProviderSessionId(\n sessionId: string,\n ): Promise<Subscription | null> {\n return adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [\n {\n field: \"providerCheckoutSessionId\",\n operator: \"eq\",\n value: sessionId,\n },\n ],\n });\n },\n\n async updateSubscription(\n id: string,\n data: Partial<Subscription>,\n ): Promise<Subscription | null> {\n return adapter.update<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n update: { ...data, updatedAt: new Date() },\n });\n },\n\n async cancelSubscription(\n id: string,\n cancelAt?: Date,\n ): Promise<Subscription | null> {\n const now = new Date();\n return adapter.update<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n update: {\n status: cancelAt ? \"active\" : \"canceled\",\n canceledAt: now,\n cancelAt: cancelAt ?? now,\n updatedAt: now,\n },\n });\n },\n\n async listSubscriptions(customerId: string): Promise<Subscription[]> {\n return adapter.findMany<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [{ field: \"customerId\", operator: \"eq\", value: customerId }],\n sortBy: { field: \"createdAt\", direction: \"desc\" },\n });\n },\n\n // Feature access check\n async checkFeatureAccess(\n customerId: string,\n featureCode: string,\n ): Promise<{ allowed: boolean }> {\n // Find customer by external ID\n const customer = await adapter.findOne<Customer>({\n model: TABLES.CUSTOMER,\n where: [{ field: \"externalId\", operator: \"eq\", value: customerId }],\n });\n\n if (!customer) {\n return { allowed: false };\n }\n\n // Find active subscription\n const subscription = await adapter.findOne<Subscription>({\n model: TABLES.SUBSCRIPTION,\n where: [\n { field: \"customerId\", operator: \"eq\", value: customer.id },\n { field: \"status\", operator: \"in\", value: [\"active\", \"trialing\"] },\n ],\n });\n\n if (!subscription) {\n return { allowed: false };\n }\n\n // Check if plan has the feature (from config)\n const planFeatures = this.getPlanFeatures(subscription.planCode);\n return { allowed: planFeatures.includes(featureCode) };\n },\n\n // Payment operations (DB)\n async createPayment(data: CreatePaymentInput): Promise<Payment> {\n const now = new Date();\n return adapter.create<Payment>({\n model: TABLES.PAYMENT,\n data: {\n customerId: data.customerId,\n subscriptionId: data.subscriptionId,\n type: data.type,\n status: data.status ?? \"pending\",\n amount: data.amount,\n currency: data.currency ?? \"usd\",\n providerPaymentId: data.providerPaymentId,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n } as Omit<Payment, \"id\">,\n });\n },\n\n async findPaymentById(id: string): Promise<Payment | null> {\n return adapter.findOne<Payment>({\n model: TABLES.PAYMENT,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n });\n },\n\n async findPaymentByProviderPaymentId(\n providerPaymentId: string,\n ): Promise<Payment | null> {\n return adapter.findOne<Payment>({\n model: TABLES.PAYMENT,\n where: [\n {\n field: \"providerPaymentId\",\n operator: \"eq\",\n value: providerPaymentId,\n },\n ],\n });\n },\n\n async updatePayment(\n id: string,\n data: Partial<Payment>,\n ): Promise<Payment | null> {\n return adapter.update<Payment>({\n model: TABLES.PAYMENT,\n where: [{ field: \"id\", operator: \"eq\", value: id }],\n update: { ...data, updatedAt: new Date() },\n });\n },\n\n async listPayments(\n customerId: string,\n options?: { limit?: number; offset?: number },\n ): Promise<Payment[]> {\n return adapter.findMany<Payment>({\n model: TABLES.PAYMENT,\n where: [{ field: \"customerId\", operator: \"eq\", value: customerId }],\n limit: options?.limit,\n offset: options?.offset,\n sortBy: { field: \"createdAt\", direction: \"desc\" },\n });\n },\n };\n}\n","import {\n createInternalAdapter,\n type InternalAdapter,\n} from \"../db/internal-adapter\";\nimport { type DBSchema, getBillingSchema } from \"../db/schema\";\nimport type { DBAdapter } from \"../types/adapter\";\nimport type { BillSDKOptions, ResolvedBillSDKOptions } from \"../types/options\";\nimport type { PaymentAdapter } from \"../types/payment\";\nimport type { BillSDKPlugin } from \"../types/plugins\";\n\n/**\n * Logger interface for the billing context\n */\nexport interface Logger {\n debug: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n}\n\n/**\n * The billing context containing all runtime state\n */\nexport interface BillingContext {\n /**\n * Resolved options with defaults\n */\n options: ResolvedBillSDKOptions;\n\n /**\n * Base path for the API\n */\n basePath: string;\n\n /**\n * Database adapter\n */\n adapter: DBAdapter;\n\n /**\n * Payment adapter (optional)\n */\n paymentAdapter?: PaymentAdapter;\n\n /**\n * Internal adapter with business logic\n */\n internalAdapter: InternalAdapter;\n\n /**\n * Database schema\n */\n schema: DBSchema;\n\n /**\n * Registered plugins\n */\n plugins: BillSDKPlugin[];\n\n /**\n * Logger instance\n */\n logger: Logger;\n\n /**\n * Secret for signing\n */\n secret: string;\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin: (id: string) => boolean;\n\n /**\n * Get a plugin by ID\n */\n getPlugin: <T extends BillSDKPlugin>(id: string) => T | null;\n\n /**\n * Generate a unique ID\n */\n generateId: () => string;\n}\n\n/**\n * Create a logger instance\n */\nfunction createLogger(options: BillSDKOptions[\"logger\"]): Logger {\n const level = options?.level ?? \"info\";\n const disabled = options?.disabled ?? false;\n\n const levels = [\"debug\", \"info\", \"warn\", \"error\"];\n const currentLevelIndex = levels.indexOf(level);\n\n const shouldLog = (logLevel: string) => {\n if (disabled) return false;\n return levels.indexOf(logLevel) >= currentLevelIndex;\n };\n\n return {\n debug: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"debug\")) console.debug(`[billsdk] ${message}`, ...args);\n },\n info: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"info\")) console.info(`[billsdk] ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"warn\")) console.warn(`[billsdk] ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n if (shouldLog(\"error\")) console.error(`[billsdk] ${message}`, ...args);\n },\n };\n}\n\n/**\n * Resolve options with defaults\n */\nfunction resolveOptions(\n options: BillSDKOptions,\n adapter: DBAdapter,\n): ResolvedBillSDKOptions {\n return {\n database: adapter,\n payment: options.payment,\n basePath: options.basePath ?? \"/api/billing\",\n secret: options.secret ?? generateDefaultSecret(),\n plans: options.plans,\n features: options.features,\n plugins: options.plugins ?? [],\n hooks: options.hooks ?? {},\n behaviors: options.behaviors,\n logger: {\n level: options.logger?.level ?? \"info\",\n disabled: options.logger?.disabled ?? false,\n },\n };\n}\n\n/**\n * Generate a default secret (for development only)\n */\nfunction generateDefaultSecret(): string {\n // In production, users should provide their own secret\n return \"billsdk-development-secret-change-in-production\";\n}\n\n/**\n * Create the billing context\n * Plans and features are read from config, not seeded to DB\n */\nexport async function createBillingContext(\n adapter: DBAdapter,\n options: BillSDKOptions,\n): Promise<BillingContext> {\n const resolvedOptions = resolveOptions(options, adapter);\n const logger = createLogger(options.logger);\n const plugins = resolvedOptions.plugins;\n\n // Get base schema\n let schema = getBillingSchema();\n\n // Extend schema with plugins\n for (const plugin of plugins) {\n if (plugin.schema) {\n schema = { ...schema, ...plugin.schema };\n }\n }\n\n // Create internal adapter with config (no DB seeding needed!)\n const internalAdapter = createInternalAdapter(\n adapter,\n options.plans ?? [],\n options.features ?? [],\n );\n\n // Build context\n const context: BillingContext = {\n options: resolvedOptions,\n basePath: resolvedOptions.basePath,\n adapter,\n paymentAdapter: options.payment,\n internalAdapter,\n schema,\n plugins,\n logger,\n secret: resolvedOptions.secret,\n\n hasPlugin(id: string): boolean {\n return plugins.some((p) => p.id === id);\n },\n\n getPlugin<T extends BillSDKPlugin>(id: string): T | null {\n const plugin = plugins.find((p) => p.id === id);\n return (plugin as T) ?? null;\n },\n\n generateId(): string {\n return crypto.randomUUID();\n },\n };\n\n // Initialize plugins\n for (const plugin of plugins) {\n if (plugin.init) {\n await plugin.init(context);\n }\n }\n\n logger.debug(\"BillingContext created\", {\n basePath: context.basePath,\n plugins: plugins.map((p) => p.id),\n hasPaymentAdapter: !!context.paymentAdapter,\n plans: options.plans?.length ?? 0,\n features: options.features?.length ?? 0,\n });\n\n return context;\n}\n","import { memoryAdapter } from \"../adapters/memory-adapter\";\nimport { paymentAdapter } from \"../adapters/payment\";\nimport { createRouter } from \"../api\";\nimport {\n type BillingContext,\n createBillingContext,\n} from \"../context/create-context\";\nimport { runBehavior } from \"../logic/behaviors/runner\";\nimport {\n changeSubscription as changeSubscriptionService,\n createSubscription as createSubscriptionService,\n} from \"../logic/subscription-service\";\nimport type { BillSDK, InferredAPI } from \"../types/billsdk\";\nimport type { BillSDKOptions, FeatureConfig } from \"../types/options\";\n\n/**\n * Base error codes for BillSDK\n */\nconst BASE_ERROR_CODES = {\n CUSTOMER_NOT_FOUND: \"CUSTOMER_NOT_FOUND\",\n PLAN_NOT_FOUND: \"PLAN_NOT_FOUND\",\n SUBSCRIPTION_NOT_FOUND: \"SUBSCRIPTION_NOT_FOUND\",\n FEATURE_NOT_FOUND: \"FEATURE_NOT_FOUND\",\n PAYMENT_ADAPTER_NOT_CONFIGURED: \"PAYMENT_ADAPTER_NOT_CONFIGURED\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\n/**\n * Create the API object for direct server-side access\n * The generic is for type inference only - runtime behavior is the same\n */\nfunction createAPI<TFeatureCode extends string = string>(\n contextPromise: Promise<BillingContext>,\n): InferredAPI<TFeatureCode> {\n return {\n async getCustomer(params) {\n const ctx = await contextPromise;\n return ctx.internalAdapter.findCustomerByExternalId(params.externalId);\n },\n\n async createCustomer(data) {\n const ctx = await contextPromise;\n return ctx.internalAdapter.createCustomer(data);\n },\n\n async listPlans() {\n const ctx = await contextPromise;\n // Plans come from config, synchronous\n return ctx.internalAdapter.listPlans();\n },\n\n async getPlan(params) {\n const ctx = await contextPromise;\n // Plans come from config, synchronous\n return ctx.internalAdapter.findPlanByCode(params.code);\n },\n\n async getSubscription(params) {\n const ctx = await contextPromise;\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n params.customerId,\n );\n if (!customer) return null;\n return ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n },\n\n async createSubscription(params) {\n const ctx = await contextPromise;\n\n // Delegate to shared service\n return createSubscriptionService(ctx, {\n customerId: params.customerId,\n planCode: params.planCode,\n interval: params.interval,\n successUrl: params.successUrl,\n cancelUrl: params.cancelUrl,\n });\n },\n\n async cancelSubscription(params) {\n const ctx = await contextPromise;\n\n // Delegate to behavior (default: cancel subscription)\n const result = await runBehavior(ctx, \"onSubscriptionCancel\", {\n customerId: params.customerId,\n cancelAt: params.cancelAt,\n });\n\n return result.subscription;\n },\n\n async changeSubscription(params) {\n const ctx = await contextPromise;\n return changeSubscriptionService(ctx, params);\n },\n\n async checkFeature(params) {\n const ctx = await contextPromise;\n return ctx.internalAdapter.checkFeatureAccess(\n params.customerId,\n params.feature,\n );\n },\n\n async listFeatures(params) {\n const ctx = await contextPromise;\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n params.customerId,\n );\n if (!customer) return [];\n\n const subscription =\n await ctx.internalAdapter.findSubscriptionByCustomerId(customer.id);\n if (!subscription) return [];\n\n // Get features from config (synchronous)\n const featureCodes = ctx.internalAdapter.getPlanFeatures(\n subscription.planCode,\n );\n return featureCodes.map((code) => {\n const feature = ctx.internalAdapter.findFeatureByCode(code);\n return feature\n ? {\n code: feature.code as TFeatureCode,\n name: feature.name,\n enabled: true as const,\n }\n : { code: code as TFeatureCode, name: code, enabled: true as const };\n });\n },\n\n async health() {\n return {\n status: \"ok\" as const,\n timestamp: new Date().toISOString(),\n };\n },\n\n async listPayments(params) {\n const ctx = await contextPromise;\n const customer = await ctx.internalAdapter.findCustomerByExternalId(\n params.customerId,\n );\n if (!customer) return [];\n return ctx.internalAdapter.listPayments(customer.id, {\n limit: params.limit,\n offset: params.offset,\n });\n },\n\n async getPayment(params) {\n const ctx = await contextPromise;\n return ctx.internalAdapter.findPaymentById(params.paymentId);\n },\n\n async createRefund(params) {\n const ctx = await contextPromise;\n\n // Delegate to behavior (default: refund + cancel subscription)\n return runBehavior(ctx, \"onRefund\", {\n paymentId: params.paymentId,\n amount: params.amount,\n reason: params.reason,\n });\n },\n };\n}\n\n/**\n * Initialize the billing context\n */\nasync function init(options: BillSDKOptions): Promise<BillingContext> {\n const database = options.database ?? memoryAdapter();\n const payment = options.payment ?? paymentAdapter();\n return createBillingContext(database, { ...options, payment });\n}\n\n/**\n * Create a BillSDK instance\n *\n * @param options - Configuration options\n * @returns BillSDK instance\n */\n// biome-ignore lint/suspicious/noExplicitAny: Generic constraint flexibility for readonly/mutable arrays\nexport function createBillSDK<Options extends BillSDKOptions<any>>(\n options: Options,\n): BillSDK<Options> {\n // Lazy initialization - context is created only when needed\n const contextPromise = init(options);\n\n // Collect error codes from plugins\n const errorCodes: Record<string, string> = {};\n for (const plugin of options.plugins ?? []) {\n if (plugin.$ERROR_CODES) {\n Object.assign(errorCodes, plugin.$ERROR_CODES);\n }\n }\n\n // Create the request handler\n const handler = async (request: Request): Promise<Response> => {\n const ctx = await contextPromise;\n const { handler: routeHandler } = createRouter(ctx);\n return routeHandler(request);\n };\n\n // Create the API object\n // Type assertion needed because runtime uses string but we want type inference\n const api = createAPI(contextPromise) as BillSDK<Options>[\"api\"];\n\n return {\n handler,\n api,\n options,\n $context: contextPromise,\n $Infer: {} as BillSDK<Options>[\"$Infer\"],\n $ERROR_CODES: {\n ...BASE_ERROR_CODES,\n ...errorCodes,\n } as BillSDK<Options>[\"$ERROR_CODES\"],\n };\n}\n\n/**\n * Create a BillSDK instance\n *\n * @example\n * ```typescript\n * import { billsdk } from \"@billsdk/core\";\n *\n * export const billing = billsdk({\n * basePath: \"/api/billing\",\n * features: [\n * { code: \"export\", name: \"Export\" },\n * ],\n * plans: [\n * { code: \"pro\", features: [\"export\"] }, // Validated!\n * ],\n * });\n * ```\n */\nexport function billsdk<\n const TFeatures extends readonly FeatureConfig<string>[],\n>(options: BillSDKOptions<TFeatures>): BillSDK<BillSDKOptions<TFeatures>> {\n // biome-ignore lint/suspicious/noExplicitAny: Type coercion needed for generic constraint compatibility\n return createBillSDK(options as any);\n}\n"]}
|
|
@@ -23,9 +23,5 @@ declare function billingHandler(billing: BillingInstance): {
|
|
|
23
23
|
GET: (request: Request) => Promise<Response>;
|
|
24
24
|
POST: (request: Request) => Promise<Response>;
|
|
25
25
|
};
|
|
26
|
-
/**
|
|
27
|
-
* Alias for billingHandler (matches better-auth naming)
|
|
28
|
-
*/
|
|
29
|
-
declare const toNextJsHandler: typeof billingHandler;
|
|
30
26
|
|
|
31
|
-
export { billingHandler
|
|
27
|
+
export { billingHandler };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/integrations/next.ts"],"names":[],"mappings":";AAyBO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAqB;AAC1C,IAAA,OAAO,aAAa,OAAA,GAAU,OAAA,CAAQ,QAAQ,OAAO,CAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,EAC1E,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,OAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACR;AACF
|
|
1
|
+
{"version":3,"sources":["../../src/integrations/next.ts"],"names":[],"mappings":";AAyBO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAqB;AAC1C,IAAA,OAAO,aAAa,OAAA,GAAU,OAAA,CAAQ,QAAQ,OAAO,CAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,EAC1E,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,OAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACR;AACF","file":"next.js","sourcesContent":["/**\n * BillSDK Next.js integration\n *\n * @example\n * ```typescript\n * // app/api/billing/[...all]/route.ts\n * import { billingHandler } from \"@billsdk/next\";\n * import { billing } from \"@/lib/billing\";\n *\n * export const { GET, POST } = billingHandler(billing);\n * ```\n */\n\ntype BillingInstance =\n | {\n handler: (request: Request) => Promise<Response>;\n }\n | ((request: Request) => Promise<Response>);\n\n/**\n * Create Next.js route handlers for BillSDK\n *\n * @param billing - The billing instance from billsdk()\n * @returns Object with GET and POST handlers for Next.js App Router\n */\nexport function billingHandler(billing: BillingInstance) {\n const handler = async (request: Request) => {\n return \"handler\" in billing ? billing.handler(request) : billing(request);\n };\n\n return {\n GET: handler,\n POST: handler,\n };\n}\n"]}
|