billsdk 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/drizzle/index.d.ts +1 -0
- package/dist/adapters/drizzle/index.js +3 -0
- package/dist/adapters/drizzle/index.js.map +1 -0
- package/dist/adapters/memory-adapter/index.d.ts +3 -0
- package/dist/adapters/memory-adapter/index.js +3 -0
- package/dist/adapters/memory-adapter/index.js.map +1 -0
- package/dist/adapters/payment/index.d.ts +1 -0
- package/dist/adapters/payment/index.js +3 -0
- package/dist/adapters/payment/index.js.map +1 -0
- package/dist/client/index.d.ts +133 -0
- package/dist/client/index.js +257 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/react/index.d.ts +120 -0
- package/dist/client/react/index.js +248 -0
- package/dist/client/react/index.js.map +1 -0
- package/dist/index.d.ts +25 -5
- package/dist/index.js +1293 -29
- package/dist/index.js.map +1 -1
- package/dist/integrations/next.d.ts +31 -0
- package/dist/integrations/next.js +15 -0
- package/dist/integrations/next.js.map +1 -0
- package/dist/types-Ofy1HBSd.d.ts +113 -0
- package/package.json +90 -23
- package/README.md +0 -22
- package/dist/index.d.mts +0 -8
- package/dist/index.mjs +0 -10
- package/dist/index.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Billsdk - Reserved package\n * @packageDocumentation\n */\n\nexport const version = \"0.0.1\";\n\nexport function billsdk(): string {\n return \"Billsdk package reserved\";\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,IAAM,UAAU;AAEhB,SAAS,UAAkB;AAChC,SAAO;AACT;","names":[]}
|
|
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) => {\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"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BillSDK Next.js integration
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* // app/api/billing/[...all]/route.ts
|
|
7
|
+
* import { billingHandler } from "@billsdk/next";
|
|
8
|
+
* import { billing } from "@/lib/billing";
|
|
9
|
+
*
|
|
10
|
+
* export const { GET, POST } = billingHandler(billing);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
type BillingInstance = {
|
|
14
|
+
handler: (request: Request) => Promise<Response>;
|
|
15
|
+
} | ((request: Request) => Promise<Response>);
|
|
16
|
+
/**
|
|
17
|
+
* Create Next.js route handlers for BillSDK
|
|
18
|
+
*
|
|
19
|
+
* @param billing - The billing instance from billsdk()
|
|
20
|
+
* @returns Object with GET and POST handlers for Next.js App Router
|
|
21
|
+
*/
|
|
22
|
+
declare function billingHandler(billing: BillingInstance): {
|
|
23
|
+
GET: (request: Request) => Promise<Response>;
|
|
24
|
+
POST: (request: Request) => Promise<Response>;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Alias for billingHandler (matches better-auth naming)
|
|
28
|
+
*/
|
|
29
|
+
declare const toNextJsHandler: typeof billingHandler;
|
|
30
|
+
|
|
31
|
+
export { billingHandler, toNextJsHandler };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/integrations/next.ts
|
|
2
|
+
function billingHandler(billing) {
|
|
3
|
+
const handler = async (request) => {
|
|
4
|
+
return "handler" in billing ? billing.handler(request) : billing(request);
|
|
5
|
+
};
|
|
6
|
+
return {
|
|
7
|
+
GET: handler,
|
|
8
|
+
POST: handler
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
var toNextJsHandler = billingHandler;
|
|
12
|
+
|
|
13
|
+
export { billingHandler, toNextJsHandler };
|
|
14
|
+
//# sourceMappingURL=next.js.map
|
|
15
|
+
//# sourceMappingURL=next.js.map
|
|
@@ -0,0 +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;AAKO,IAAM,eAAA,GAAkB","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\n/**\n * Alias for billingHandler (matches better-auth naming)\n */\nexport const toNextJsHandler = billingHandler;\n"]}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Subscription, Plan, PlanPrice, Customer } from '@billsdk/core/types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Client configuration options
|
|
5
|
+
*/
|
|
6
|
+
interface ClientConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Base URL for the billing API
|
|
9
|
+
* @default "/api/billing"
|
|
10
|
+
*/
|
|
11
|
+
baseURL?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Custom fetch function
|
|
14
|
+
*/
|
|
15
|
+
fetch?: typeof fetch;
|
|
16
|
+
/**
|
|
17
|
+
* Custom headers to include in all requests
|
|
18
|
+
*/
|
|
19
|
+
headers?: Record<string, string>;
|
|
20
|
+
/**
|
|
21
|
+
* Credentials mode for fetch requests
|
|
22
|
+
* @default "include"
|
|
23
|
+
*/
|
|
24
|
+
credentials?: "include" | "omit" | "same-origin";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* API response wrapper
|
|
28
|
+
*/
|
|
29
|
+
interface ApiResponse<T> {
|
|
30
|
+
data: T | null;
|
|
31
|
+
error: {
|
|
32
|
+
code: string;
|
|
33
|
+
message: string;
|
|
34
|
+
} | null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Customer with subscription info
|
|
38
|
+
*/
|
|
39
|
+
interface CustomerWithSubscription {
|
|
40
|
+
customer: Customer;
|
|
41
|
+
subscription: Subscription | null;
|
|
42
|
+
plan: Plan | null;
|
|
43
|
+
price: PlanPrice | null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Subscription response
|
|
47
|
+
*/
|
|
48
|
+
interface SubscriptionResponse {
|
|
49
|
+
subscription: Subscription | null;
|
|
50
|
+
plan: Plan | null;
|
|
51
|
+
price: PlanPrice | null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Health check response
|
|
55
|
+
*/
|
|
56
|
+
interface HealthResponse {
|
|
57
|
+
status: "ok";
|
|
58
|
+
timestamp: string;
|
|
59
|
+
version: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Atom-like interface for reactive state
|
|
63
|
+
*/
|
|
64
|
+
interface Atom<T> {
|
|
65
|
+
get(): T;
|
|
66
|
+
set(value: T): void;
|
|
67
|
+
subscribe(callback: (value: T) => void): () => void;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Async atom that tracks loading state
|
|
71
|
+
*/
|
|
72
|
+
interface AsyncAtom<T> {
|
|
73
|
+
get(): T | null;
|
|
74
|
+
isLoading(): boolean;
|
|
75
|
+
error(): Error | null;
|
|
76
|
+
refresh(): Promise<void>;
|
|
77
|
+
subscribe(callback: (value: T | null) => void): () => void;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Input for creating a subscription
|
|
81
|
+
*/
|
|
82
|
+
interface CreateSubscriptionInput {
|
|
83
|
+
customerId: string;
|
|
84
|
+
planCode: string;
|
|
85
|
+
interval?: "monthly" | "yearly";
|
|
86
|
+
successUrl?: string;
|
|
87
|
+
cancelUrl?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Response from creating a subscription
|
|
91
|
+
*/
|
|
92
|
+
interface CreateSubscriptionResponse {
|
|
93
|
+
subscription: Subscription;
|
|
94
|
+
/** Redirect URL if payment adapter requires redirect (e.g., Stripe checkout) */
|
|
95
|
+
redirectUrl?: string;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Input for canceling a subscription
|
|
99
|
+
*/
|
|
100
|
+
interface CancelSubscriptionInput {
|
|
101
|
+
customerId: string;
|
|
102
|
+
cancelAt?: "period_end" | "immediately";
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Response from canceling a subscription
|
|
106
|
+
*/
|
|
107
|
+
interface CancelSubscriptionResponse {
|
|
108
|
+
subscription: Subscription;
|
|
109
|
+
canceledImmediately?: boolean;
|
|
110
|
+
accessUntil?: Date;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export type { AsyncAtom as A, CreateSubscriptionInput as C, HealthResponse as H, SubscriptionResponse as S, Atom as a, CreateSubscriptionResponse as b, CancelSubscriptionInput as c, CancelSubscriptionResponse as d, ClientConfig as e, ApiResponse as f, CustomerWithSubscription as g };
|
package/package.json
CHANGED
|
@@ -1,41 +1,108 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "billsdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "The billing SDK for SaaS applications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
8
7
|
"exports": {
|
|
9
8
|
".": {
|
|
10
9
|
"types": "./dist/index.d.ts",
|
|
11
|
-
"
|
|
12
|
-
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./client": {
|
|
13
|
+
"types": "./dist/client/index.d.ts",
|
|
14
|
+
"default": "./dist/client/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./react": {
|
|
17
|
+
"types": "./dist/client/react/index.d.ts",
|
|
18
|
+
"default": "./dist/client/react/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./adapters/drizzle": {
|
|
21
|
+
"types": "./dist/adapters/drizzle/index.d.ts",
|
|
22
|
+
"default": "./dist/adapters/drizzle/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./adapters/memory": {
|
|
25
|
+
"types": "./dist/adapters/memory-adapter/index.d.ts",
|
|
26
|
+
"default": "./dist/adapters/memory-adapter/index.js"
|
|
27
|
+
},
|
|
28
|
+
"./adapters/payment": {
|
|
29
|
+
"types": "./dist/adapters/payment/index.d.ts",
|
|
30
|
+
"default": "./dist/adapters/payment/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./next": {
|
|
33
|
+
"types": "./dist/integrations/next.d.ts",
|
|
34
|
+
"default": "./dist/integrations/next.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"typesVersions": {
|
|
38
|
+
"*": {
|
|
39
|
+
"client": [
|
|
40
|
+
"./dist/client/index.d.ts"
|
|
41
|
+
],
|
|
42
|
+
"react": [
|
|
43
|
+
"./dist/client/react/index.d.ts"
|
|
44
|
+
],
|
|
45
|
+
"adapters/drizzle": [
|
|
46
|
+
"./dist/adapters/drizzle/index.d.ts"
|
|
47
|
+
],
|
|
48
|
+
"adapters/memory": [
|
|
49
|
+
"./dist/adapters/memory-adapter/index.d.ts"
|
|
50
|
+
],
|
|
51
|
+
"adapters/payment": [
|
|
52
|
+
"./dist/adapters/payment/index.d.ts"
|
|
53
|
+
],
|
|
54
|
+
"next": [
|
|
55
|
+
"./dist/integrations/next.d.ts"
|
|
56
|
+
]
|
|
13
57
|
}
|
|
14
58
|
},
|
|
15
|
-
"
|
|
59
|
+
"main": "./dist/index.js",
|
|
60
|
+
"module": "./dist/index.js",
|
|
61
|
+
"types": "./dist/index.d.ts",
|
|
62
|
+
"files": [
|
|
63
|
+
"dist"
|
|
64
|
+
],
|
|
16
65
|
"scripts": {
|
|
17
66
|
"build": "tsup",
|
|
18
67
|
"dev": "tsup --watch",
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"typecheck": "tsc --noEmit"
|
|
68
|
+
"test": "vitest run",
|
|
69
|
+
"test:watch": "vitest",
|
|
70
|
+
"typecheck": "tsc --noEmit",
|
|
71
|
+
"lint": "biome check .",
|
|
72
|
+
"lint:fix": "biome check . --write",
|
|
73
|
+
"clean": "rm -rf dist .turbo .node_modules"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"@billsdk/core": "workspace:*",
|
|
77
|
+
"@billsdk/drizzle-adapter": "workspace:*",
|
|
78
|
+
"@billsdk/memory-adapter": "workspace:*",
|
|
79
|
+
"@billsdk/payment-adapter": "workspace:*",
|
|
80
|
+
"defu": "6.1.4",
|
|
81
|
+
"zod": "4.3.5"
|
|
22
82
|
},
|
|
23
|
-
"keywords": ["billsdk"],
|
|
24
|
-
"author": "Commet Team",
|
|
25
|
-
"license": "MIT",
|
|
26
83
|
"devDependencies": {
|
|
27
|
-
"@
|
|
84
|
+
"@biomejs/biome": "2.3.11",
|
|
85
|
+
"@types/node": "22.15.29",
|
|
86
|
+
"@types/react": "^19.0.0",
|
|
87
|
+
"react": "^19.0.0",
|
|
28
88
|
"tsup": "8.5.1",
|
|
29
|
-
"typescript": "5.9.3"
|
|
89
|
+
"typescript": "5.9.3",
|
|
90
|
+
"vitest": "4.0.17"
|
|
30
91
|
},
|
|
31
92
|
"peerDependencies": {
|
|
32
|
-
"
|
|
93
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
33
94
|
},
|
|
34
|
-
"
|
|
35
|
-
"
|
|
95
|
+
"peerDependenciesMeta": {
|
|
96
|
+
"react": {
|
|
97
|
+
"optional": true
|
|
98
|
+
}
|
|
36
99
|
},
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
|
|
100
|
+
"keywords": [
|
|
101
|
+
"billing",
|
|
102
|
+
"sdk",
|
|
103
|
+
"saas",
|
|
104
|
+
"subscriptions",
|
|
105
|
+
"payments",
|
|
106
|
+
"typescript"
|
|
107
|
+
]
|
|
40
108
|
}
|
|
41
|
-
|
package/README.md
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Billsdk
|
|
2
|
-
|
|
3
|
-
This package name is reserved.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install billsdk
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Usage
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
import { billsdk } from "billsdk";
|
|
15
|
-
|
|
16
|
-
console.log(billsdk());
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## License
|
|
20
|
-
|
|
21
|
-
MIT
|
|
22
|
-
|
package/dist/index.d.mts
DELETED
package/dist/index.mjs
DELETED
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Billsdk - Reserved package\n * @packageDocumentation\n */\n\nexport const version = \"0.0.1\";\n\nexport function billsdk(): string {\n return \"Billsdk package reserved\";\n}\n\n"],"mappings":";AAKO,IAAM,UAAU;AAEhB,SAAS,UAAkB;AAChC,SAAO;AACT;","names":[]}
|