@spaire/better-auth 2.0.1 → 3.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/customer.ts","../src/plugins/portal.ts","../src/plugins/checkout.ts","../src/plugins/usage.ts","../../../node_modules/.pnpm/@spaire+adapter-utils@2.0.0/node_modules/@spaire/adapter-utils/dist/index.js","../src/plugins/webhooks.ts","../src/index.ts"],"sourcesContent":["import type { GenericEndpointContext, User } from \"better-auth\";\nimport { APIError } from \"better-auth/api\";\nimport type { SpaireOptions } from \"../types\";\n\nexport const onBeforeUserCreate =\n\t(options: SpaireOptions) =>\n\tasync (user: Partial<User>, context: GenericEndpointContext | null) => {\n\t\tif (context && options.createCustomerOnSignUp) {\n\t\t\ttry {\n\t\t\t\tconst params = options.getCustomerCreateParams\n\t\t\t\t\t? await options.getCustomerCreateParams({\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t})\n\t\t\t\t\t: {};\n\n\t\t\t\tif (!user.email) {\n\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\tmessage: \"An associated email is required\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Check if customer already exists\n\t\t\t\tconst { result: existingCustomers } =\n\t\t\t\t\tawait options.client.customers.list({ email: user.email });\n\t\t\t\tconst existingCustomer = existingCustomers.items[0];\n\n\t\t\t\t// Skip creation if customer already exists\n\t\t\t\tif (!existingCustomer) {\n\t\t\t\t\tawait options.client.customers.create({\n\t\t\t\t\t\t...params,\n\t\t\t\t\t\temail: user.email,\n\t\t\t\t\t\tname: user.name,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (e: unknown) {\n\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\tmessage: `Spaire customer creation failed. Error: ${e.message}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\tmessage: `Spaire customer creation failed. Error: ${e}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\nexport const onAfterUserCreate =\n\t(options: SpaireOptions) =>\n\tasync (user: User, context: GenericEndpointContext | null) => {\n\t\tif (context && options.createCustomerOnSignUp) {\n\t\t\ttry {\n\t\t\t\tconst { result: existingCustomers } =\n\t\t\t\t\tawait options.client.customers.list({ email: user.email });\n\t\t\t\tconst existingCustomer = existingCustomers.items[0];\n\n\t\t\t\tif (existingCustomer) {\n\t\t\t\t\tif (existingCustomer.externalId !== user.id) {\n\t\t\t\t\t\tawait options.client.customers.update({\n\t\t\t\t\t\t\tid: existingCustomer.id,\n\t\t\t\t\t\t\tcustomerUpdate: {\n\t\t\t\t\t\t\t\texternalId: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e: unknown) {\n\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\tmessage: `Spaire customer creation failed. Error: ${e.message}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\tmessage: `Spaire customer creation failed. Error: ${e}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\nexport const onUserUpdate =\n\t(options: SpaireOptions) =>\n\tasync (user: User, context: GenericEndpointContext | null) => {\n\t\tif (context && options.createCustomerOnSignUp) {\n\t\t\ttry {\n\t\t\t\tawait options.client.customers.updateExternal({\n\t\t\t\t\texternalId: user.id,\n\t\t\t\t\tcustomerUpdateExternalID: {\n\t\t\t\t\t\temail: user.email,\n\t\t\t\t\t\tname: user.name,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (e: unknown) {\n\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\tcontext.context.logger.error(\n\t\t\t\t\t\t`Spaire customer update failed. Error: ${e.message}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tcontext.context.logger.error(\n\t\t\t\t\t\t`Spaire customer update failed. Error: ${e}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\nexport const onUserDelete =\n\t(options: SpaireOptions) =>\n\tasync (user: User, context: GenericEndpointContext | null) => {\n\t\tif (context && options.createCustomerOnSignUp) {\n\t\t\ttry {\n\t\t\t\tif (user.email) {\n\t\t\t\t\tconst { result: existingCustomers } =\n\t\t\t\t\t\tawait options.client.customers.list({ email: user.email });\n\t\t\t\t\tconst existingCustomer = existingCustomers.items[0];\n\t\t\t\t\tif (existingCustomer) {\n\t\t\t\t\t\tawait options.client.customers.delete({\n\t\t\t\t\t\t\tid: existingCustomer.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e: unknown) {\n\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\tcontext?.context.logger.error(\n\t\t\t\t\t\t`Spaire customer delete failed. Error: ${e.message}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcontext?.context.logger.error(\n\t\t\t\t\t`Spaire customer delete failed. Error: ${e}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n","import type { Spaire } from \"@spaire/sdk\";\nimport { APIError } from \"better-auth/api\";\nimport { sessionMiddleware } from \"better-auth/api\";\nimport { createAuthEndpoint } from \"better-auth/plugins\";\nimport { z } from \"zod\";\n\nexport interface PortalConfig {\n\treturnUrl?: string;\n}\n\nexport const portal =\n\t({ returnUrl }: PortalConfig = {}) =>\n\t(spaire: Spaire) => {\n\t\tconst retUrl = returnUrl ? new URL(returnUrl) : undefined;\n\n\t\treturn {\n\t\t\tportal: createAuthEndpoint(\n\t\t\t\t\"/customer/portal\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.context.session?.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst customerSession = await spaire.customerSessions.create({\n\t\t\t\t\t\t\texternalCustomerId: ctx.context.session?.user.id,\n\t\t\t\t\t\t\treturnUrl: retUrl ? decodeURI(retUrl.toString()) : undefined,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\turl: customerSession.customerPortalUrl,\n\t\t\t\t\t\t\tredirect: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t\t`Spaire customer portal creation failed. Error: ${e.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Customer portal creation failed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tstate: createAuthEndpoint(\n\t\t\t\t\"/customer/state\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.context.session.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst state = await spaire.customers.getStateExternal({\n\t\t\t\t\t\t\texternalId: ctx.context.session?.user.id,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn ctx.json(state);\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t\t`Spaire subscriptions list failed. Error: ${e.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Subscriptions list failed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tbenefits: createAuthEndpoint(\n\t\t\t\t\"/customer/benefits/list\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tquery: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\tpage: z.coerce.number().optional(),\n\t\t\t\t\t\t\tlimit: z.coerce.number().optional(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.context.session.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst customerSession = await spaire.customerSessions.create({\n\t\t\t\t\t\t\texternalCustomerId: ctx.context.session?.user.id,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst benefits = await spaire.customerPortal.benefitGrants.list(\n\t\t\t\t\t\t\t{ customerSession: customerSession.token },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpage: ctx.query?.page,\n\t\t\t\t\t\t\t\tlimit: ctx.query?.limit,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn ctx.json(benefits);\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t\t`Spaire benefits list failed. Error: ${e.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Benefits list failed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\tsubscriptions: createAuthEndpoint(\n\t\t\t\t\"/customer/subscriptions/list\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tquery: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\treferenceId: z.string().optional(),\n\t\t\t\t\t\t\tpage: z.coerce.number().optional(),\n\t\t\t\t\t\t\tlimit: z.coerce.number().optional(),\n\t\t\t\t\t\t\tactive: z.coerce.boolean().optional(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.context.session.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctx.query?.referenceId) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst subscriptions = await spaire.subscriptions.list({\n\t\t\t\t\t\t\t\tpage: ctx.query?.page,\n\t\t\t\t\t\t\t\tlimit: ctx.query?.limit,\n\t\t\t\t\t\t\t\tactive: ctx.query?.active,\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\treferenceId: ctx.query?.referenceId,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn ctx.json(subscriptions);\n\t\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\t\tconsole.log(e);\n\t\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t\t\t`Spaire subscriptions list with referenceId failed. Error: ${e.message}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"Subscriptions list with referenceId failed\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst customerSession = await spaire.customerSessions.create({\n\t\t\t\t\t\t\texternalCustomerId: ctx.context.session?.user.id,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst subscriptions =\n\t\t\t\t\t\t\tawait spaire.customerPortal.subscriptions.list(\n\t\t\t\t\t\t\t\t{ customerSession: customerSession.token },\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpage: ctx.query?.page,\n\t\t\t\t\t\t\t\t\tlimit: ctx.query?.limit,\n\t\t\t\t\t\t\t\t\tactive: ctx.query?.active,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn ctx.json(subscriptions);\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t\t`Spaire subscriptions list failed. Error: ${e.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Spaire subscriptions list failed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t\torders: createAuthEndpoint(\n\t\t\t\t\"/customer/orders/list\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tquery: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\tpage: z.coerce.number().optional(),\n\t\t\t\t\t\t\tlimit: z.coerce.number().optional(),\n\t\t\t\t\t\t\tproductBillingType: z.enum([\"recurring\", \"one_time\"]).optional(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.context.session.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst customerSession = await spaire.customerSessions.create({\n\t\t\t\t\t\t\texternalCustomerId: ctx.context.session?.user.id,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst orders = await spaire.customerPortal.orders.list(\n\t\t\t\t\t\t\t{ customerSession: customerSession.token },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpage: ctx.query?.page,\n\t\t\t\t\t\t\t\tlimit: ctx.query?.limit,\n\t\t\t\t\t\t\t\tproductBillingType: ctx.query?.productBillingType,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn ctx.json(orders);\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t\t`Spaire orders list failed. Error: ${e.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Orders list failed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\t};\n","import type { Spaire } from \"@spaire/sdk\";\nimport { APIError, getSessionFromCtx } from \"better-auth/api\";\nimport { createAuthEndpoint } from \"better-auth/plugins\";\nimport { z } from \"zod\";\nimport type { Product } from \"../types\";\n\nexport interface CheckoutOptions {\n\t/**\n\t * Optional list of slug -> productId mappings for easy slug checkouts\n\t */\n\tproducts?: Product[] | (() => Promise<Product[]>);\n\t/**\n\t * Checkout Success URL\n\t */\n\tsuccessUrl?: string;\n\t/**\n\t * Checkout Return URL\n\t */\n\treturnUrl?: string;\n\t/**\n\t * Only allow authenticated customers to checkout\n\t */\n\tauthenticatedUsersOnly?: boolean;\n\t/**\n\t * Checkout theme\n\t */\n\ttheme?: \"light\" | \"dark\";\n\t/**\n\t * Redirect to checkout page\n\t */\n\tredirect?: boolean;\n}\n\nexport const CheckoutParams = z.object({\n\tproducts: z.union([z.array(z.string()), z.string()]).optional(),\n\tslug: z.string().optional(),\n\treferenceId: z.string().optional(),\n\tcustomFieldData: z\n\t\t.record(z.string(), z.union([z.string(), z.number(), z.boolean()]))\n\t\t.optional(),\n\tmetadata: z\n\t\t.record(z.string(), z.union([z.string(), z.number(), z.boolean()]))\n\t\t.optional(),\n\tallowDiscountCodes: z.coerce.boolean().optional(),\n\tdiscountId: z.string().optional(),\n\tredirect: z.coerce.boolean().optional(),\n\tembedOrigin: z.string().url().optional(),\n});\n\nexport type CheckoutParams = z.infer<typeof CheckoutParams>;\n\nexport const checkout =\n\t(checkoutOptions: CheckoutOptions = {}) =>\n\t(spaire: Spaire) => {\n\t\treturn {\n\t\t\tcheckout: createAuthEndpoint(\n\t\t\t\t\"/checkout\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: CheckoutParams,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst session = await getSessionFromCtx(ctx);\n\n\t\t\t\t\tlet productIds: string[] = [];\n\n\t\t\t\t\tif (ctx.body.slug) {\n\t\t\t\t\t\tconst resolvedProducts = await (typeof checkoutOptions.products ===\n\t\t\t\t\t\t\"function\"\n\t\t\t\t\t\t\t? checkoutOptions.products()\n\t\t\t\t\t\t\t: checkoutOptions.products);\n\n\t\t\t\t\t\tconst productId = resolvedProducts?.find(\n\t\t\t\t\t\t\t(product) => product.slug === ctx.body.slug,\n\t\t\t\t\t\t)?.productId;\n\n\t\t\t\t\t\tif (!productId) {\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\tmessage: \"Product not found\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tproductIds = [productId];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tproductIds = Array.isArray(ctx.body.products)\n\t\t\t\t\t\t\t? ctx.body.products.filter((id) => id !== undefined)\n\t\t\t\t\t\t\t: [ctx.body.products].filter((id) => id !== undefined);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (checkoutOptions.authenticatedUsersOnly && !session?.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"You must be logged in to checkout\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst checkout = await spaire.checkouts.create({\n\t\t\t\t\t\t\texternalCustomerId: session?.user.id,\n\t\t\t\t\t\t\tproducts: productIds,\n\t\t\t\t\t\t\tsuccessUrl: checkoutOptions.successUrl\n\t\t\t\t\t\t\t\t? new URL(\n\t\t\t\t\t\t\t\t\t\tcheckoutOptions.successUrl,\n\t\t\t\t\t\t\t\t\t\tctx.request?.url ?? ctx.context.baseURL,\n\t\t\t\t\t\t\t\t\t).toString()\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tmetadata: ctx.body.referenceId\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\treferenceId: ctx.body.referenceId,\n\t\t\t\t\t\t\t\t\t\t...ctx.body.metadata,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: ctx.body.metadata,\n\t\t\t\t\t\t\tcustomFieldData: ctx.body.customFieldData,\n\t\t\t\t\t\t\tallowDiscountCodes: ctx.body.allowDiscountCodes ?? true,\n\t\t\t\t\t\t\tdiscountId: ctx.body.discountId,\n\t\t\t\t\t\t\tembedOrigin: ctx.body.embedOrigin,\n\t\t\t\t\t\t\treturnUrl: checkoutOptions.returnUrl\n\t\t\t\t\t\t\t\t? new URL(\n\t\t\t\t\t\t\t\t\t\tcheckoutOptions.returnUrl,\n\t\t\t\t\t\t\t\t\t\tctx.request?.url ?? ctx.context.baseURL,\n\t\t\t\t\t\t\t\t\t).toString()\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst redirectUrl = new URL(checkout.url);\n\n\t\t\t\t\t\tif (checkoutOptions.theme) {\n\t\t\t\t\t\t\tredirectUrl.searchParams.set(\"theme\", checkoutOptions.theme);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\turl: redirectUrl.toString(),\n\t\t\t\t\t\t\tredirect: ctx.body.redirect ?? true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t\t`Spaire checkout creation failed. Error: ${e.message}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Checkout creation failed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t),\n\t\t};\n\t};\n","import type { Spaire } from \"@spaire/sdk\";\nimport {\n\tAPIError,\n\tcreateAuthEndpoint,\n\tsessionMiddleware,\n} from \"better-auth/api\";\nimport { z } from \"zod\";\nimport type { Product } from \"../types\";\n\nexport interface UsageOptions {\n\t/**\n\t * Products to use for topping up credits\n\t */\n\tcreditProducts?: Product[] | (() => Promise<Product[]>);\n}\n\nexport const usage = (_usageOptions?: UsageOptions) => (spaire: Spaire) => {\n\treturn {\n\t\tmeters: createAuthEndpoint(\n\t\t\t\"/usage/meters/list\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\tquery: z.object({\n\t\t\t\t\tpage: z.coerce.number().optional(),\n\t\t\t\t\tlimit: z.coerce.number().optional(),\n\t\t\t\t}),\n\t\t\t},\n\t\t\tasync (ctx) => {\n\t\t\t\tif (!ctx.context.session.user.id) {\n\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst customerSession = await spaire.customerSessions.create({\n\t\t\t\t\t\texternalCustomerId: ctx.context.session.user.id,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst customerMeters =\n\t\t\t\t\t\tawait spaire.customerPortal.customerMeters.list(\n\t\t\t\t\t\t\t{ customerSession: customerSession.token },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpage: ctx.query?.page,\n\t\t\t\t\t\t\t\tlimit: ctx.query?.limit,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\treturn ctx.json(customerMeters);\n\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t`Spaire meters list failed. Error: ${e.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\tmessage: \"Meters list failed\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t\tingestion: createAuthEndpoint(\n\t\t\t\"/usage/ingest\",\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: z.object({\n\t\t\t\t\tevent: z.string(),\n\t\t\t\t\tmetadata: z.record(\n\t\t\t\t\t\tz.string(),\n\t\t\t\t\t\tz.union([z.string(), z.number(), z.boolean()]),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t\tuse: [sessionMiddleware],\n\t\t\t},\n\t\t\tasync (ctx) => {\n\t\t\t\tif (!ctx.context.session.user.id) {\n\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst ingestion = await spaire.events.ingest({\n\t\t\t\t\t\tevents: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: ctx.body.event,\n\t\t\t\t\t\t\t\tmetadata: ctx.body.metadata,\n\t\t\t\t\t\t\t\texternalCustomerId: ctx.context.session.user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json(ingestion);\n\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t`Spaire ingestion failed. Error: ${e.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\tmessage: \"Ingestion failed\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t),\n\t};\n};\n","// src/webhooks/webhooks.ts\nvar handleWebhookPayload = async (payload, { webhookSecret, entitlements, onPayload, ...eventHandlers }) => {\n const promises = [];\n if (onPayload) {\n promises.push(onPayload(payload));\n }\n switch (payload.type) {\n case \"checkout.created\":\n if (eventHandlers.onCheckoutCreated) {\n promises.push(eventHandlers.onCheckoutCreated(payload));\n }\n break;\n case \"checkout.updated\":\n if (eventHandlers.onCheckoutUpdated) {\n promises.push(eventHandlers.onCheckoutUpdated(payload));\n }\n break;\n case \"order.created\":\n if (eventHandlers.onOrderCreated) {\n promises.push(eventHandlers.onOrderCreated(payload));\n }\n break;\n case \"order.updated\":\n if (eventHandlers.onOrderUpdated) {\n promises.push(eventHandlers.onOrderUpdated(payload));\n }\n break;\n case \"order.paid\":\n if (eventHandlers.onOrderPaid) {\n promises.push(eventHandlers.onOrderPaid(payload));\n }\n break;\n case \"subscription.created\":\n if (eventHandlers.onSubscriptionCreated) {\n promises.push(eventHandlers.onSubscriptionCreated(payload));\n }\n break;\n case \"subscription.updated\":\n if (eventHandlers.onSubscriptionUpdated) {\n promises.push(eventHandlers.onSubscriptionUpdated(payload));\n }\n break;\n case \"subscription.active\":\n if (eventHandlers.onSubscriptionActive) {\n promises.push(eventHandlers.onSubscriptionActive(payload));\n }\n break;\n case \"subscription.canceled\":\n if (eventHandlers.onSubscriptionCanceled) {\n promises.push(eventHandlers.onSubscriptionCanceled(payload));\n }\n break;\n case \"subscription.uncanceled\":\n if (eventHandlers.onSubscriptionUncanceled) {\n promises.push(eventHandlers.onSubscriptionUncanceled(payload));\n }\n break;\n case \"subscription.revoked\":\n if (eventHandlers.onSubscriptionRevoked) {\n promises.push(eventHandlers.onSubscriptionRevoked(payload));\n }\n break;\n case \"product.created\":\n if (eventHandlers.onProductCreated) {\n promises.push(eventHandlers.onProductCreated(payload));\n }\n break;\n case \"product.updated\":\n if (eventHandlers.onProductUpdated) {\n promises.push(eventHandlers.onProductUpdated(payload));\n }\n break;\n case \"organization.updated\":\n if (eventHandlers.onOrganizationUpdated) {\n promises.push(eventHandlers.onOrganizationUpdated(payload));\n }\n break;\n case \"benefit.created\":\n if (eventHandlers.onBenefitCreated) {\n promises.push(eventHandlers.onBenefitCreated(payload));\n }\n break;\n case \"benefit.updated\":\n if (eventHandlers.onBenefitUpdated) {\n promises.push(eventHandlers.onBenefitUpdated(payload));\n }\n break;\n case \"benefit_grant.created\":\n if (eventHandlers.onBenefitGrantCreated) {\n promises.push(eventHandlers.onBenefitGrantCreated(payload));\n }\n break;\n case \"benefit_grant.updated\":\n if (eventHandlers.onBenefitGrantUpdated) {\n promises.push(eventHandlers.onBenefitGrantUpdated(payload));\n }\n break;\n case \"benefit_grant.revoked\":\n if (eventHandlers.onBenefitGrantRevoked) {\n promises.push(eventHandlers.onBenefitGrantRevoked(payload));\n }\n break;\n case \"customer.created\":\n if (eventHandlers.onCustomerCreated) {\n promises.push(eventHandlers.onCustomerCreated(payload));\n }\n break;\n case \"customer.updated\":\n if (eventHandlers.onCustomerUpdated) {\n promises.push(eventHandlers.onCustomerUpdated(payload));\n }\n break;\n case \"customer.deleted\":\n if (eventHandlers.onCustomerDeleted) {\n promises.push(eventHandlers.onCustomerDeleted(payload));\n }\n break;\n case \"customer.state_changed\":\n if (eventHandlers.onCustomerStateChanged) {\n promises.push(eventHandlers.onCustomerStateChanged(payload));\n }\n break;\n case \"order.refunded\":\n if (eventHandlers.onOrderRefunded) {\n promises.push(eventHandlers.onOrderRefunded(payload));\n }\n break;\n case \"refund.created\":\n if (eventHandlers.onRefundCreated) {\n promises.push(eventHandlers.onRefundCreated(payload));\n }\n break;\n case \"refund.updated\":\n if (eventHandlers.onRefundUpdated) {\n promises.push(eventHandlers.onRefundUpdated(payload));\n }\n break;\n }\n switch (payload.type) {\n case \"benefit_grant.created\":\n case \"benefit_grant.revoked\":\n if (entitlements) {\n for (const handler of entitlements.handlers) {\n promises.push(handler(payload));\n }\n }\n }\n return Promise.all(promises);\n};\n\n// src/entitlement/entitlement.ts\nvar EntitlementStrategy = class {\n grantCallbacks = [];\n revokeCallbacks = [];\n grant(callback) {\n this.grantCallbacks.push(callback);\n return this;\n }\n revoke(callback) {\n this.revokeCallbacks.push(callback);\n return this;\n }\n handler(slug) {\n return async (payload) => {\n if (payload.data.benefit.description === slug) {\n switch (payload.type) {\n case \"benefit_grant.created\":\n await Promise.all(\n this.grantCallbacks.map(\n (callback) => callback({\n customer: payload.data.customer,\n properties: payload.data.properties,\n payload\n })\n )\n );\n break;\n case \"benefit_grant.revoked\":\n await Promise.all(\n this.revokeCallbacks.map(\n (callback) => callback({\n customer: payload.data.customer,\n properties: payload.data.properties,\n payload\n })\n )\n );\n break;\n }\n }\n };\n }\n};\nvar Entitlements = class {\n static handlers = [];\n static use(slug, strategy) {\n this.handlers.push(strategy.handler(slug));\n return this;\n }\n};\nexport {\n EntitlementStrategy,\n Entitlements,\n handleWebhookPayload\n};\n","import { handleWebhookPayload } from \"@spaire/adapter-utils\";\nimport type { Spaire } from \"@spaire/sdk\";\nimport type { WebhookBenefitCreatedPayload } from \"@spaire/sdk/models/components/webhookbenefitcreatedpayload\";\nimport type { WebhookBenefitGrantCreatedPayload } from \"@spaire/sdk/models/components/webhookbenefitgrantcreatedpayload\";\nimport type { WebhookBenefitGrantRevokedPayload } from \"@spaire/sdk/models/components/webhookbenefitgrantrevokedpayload\";\nimport type { WebhookBenefitGrantUpdatedPayload } from \"@spaire/sdk/models/components/webhookbenefitgrantupdatedpayload\";\nimport type { WebhookBenefitUpdatedPayload } from \"@spaire/sdk/models/components/webhookbenefitupdatedpayload\";\nimport type { WebhookCheckoutCreatedPayload } from \"@spaire/sdk/models/components/webhookcheckoutcreatedpayload\";\nimport type { WebhookCheckoutUpdatedPayload } from \"@spaire/sdk/models/components/webhookcheckoutupdatedpayload\";\nimport type { WebhookCustomerCreatedPayload } from \"@spaire/sdk/models/components/webhookcustomercreatedpayload\";\nimport type { WebhookCustomerDeletedPayload } from \"@spaire/sdk/models/components/webhookcustomerdeletedpayload\";\nimport type { WebhookCustomerStateChangedPayload } from \"@spaire/sdk/models/components/webhookcustomerstatechangedpayload\";\nimport type { WebhookCustomerUpdatedPayload } from \"@spaire/sdk/models/components/webhookcustomerupdatedpayload\";\nimport type { WebhookOrderCreatedPayload } from \"@spaire/sdk/models/components/webhookordercreatedpayload\";\nimport type { WebhookOrderPaidPayload } from \"@spaire/sdk/models/components/webhookorderpaidpayload\";\nimport type { WebhookOrderRefundedPayload } from \"@spaire/sdk/models/components/webhookorderrefundedpayload\";\nimport type { WebhookOrderUpdatedPayload } from \"@spaire/sdk/models/components/webhookorderupdatedpayload\";\nimport type { WebhookOrganizationUpdatedPayload } from \"@spaire/sdk/models/components/webhookorganizationupdatedpayload\";\nimport type { WebhookProductCreatedPayload } from \"@spaire/sdk/models/components/webhookproductcreatedpayload\";\nimport type { WebhookProductUpdatedPayload } from \"@spaire/sdk/models/components/webhookproductupdatedpayload\";\nimport type { WebhookRefundCreatedPayload } from \"@spaire/sdk/models/components/webhookrefundcreatedpayload\";\nimport type { WebhookRefundUpdatedPayload } from \"@spaire/sdk/models/components/webhookrefundupdatedpayload\";\nimport type { WebhookSubscriptionActivePayload } from \"@spaire/sdk/models/components/webhooksubscriptionactivepayload\";\nimport type { WebhookSubscriptionCanceledPayload } from \"@spaire/sdk/models/components/webhooksubscriptioncanceledpayload\";\nimport type { WebhookSubscriptionCreatedPayload } from \"@spaire/sdk/models/components/webhooksubscriptioncreatedpayload\";\nimport type { WebhookSubscriptionRevokedPayload } from \"@spaire/sdk/models/components/webhooksubscriptionrevokedpayload\";\nimport type { WebhookSubscriptionUncanceledPayload } from \"@spaire/sdk/models/components/webhooksubscriptionuncanceledpayload\";\nimport type { WebhookSubscriptionUpdatedPayload } from \"@spaire/sdk/models/components/webhooksubscriptionupdatedpayload\";\nimport { validateEvent } from \"@spaire/sdk/webhooks\";\nimport { APIError, createAuthEndpoint } from \"better-auth/api\";\n\nexport interface WebhooksOptions {\n\t/**\n\t * Webhook Secret\n\t */\n\tsecret: string;\n\t/**\n\t * Generic handler for all webhooks\n\t */\n\tonPayload?: (payload: ReturnType<typeof validateEvent>) => Promise<void>;\n\t/**\n\t * Webhook for checkout created\n\t */\n\tonCheckoutCreated?: (payload: WebhookCheckoutCreatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for checkout updated\n\t */\n\tonCheckoutUpdated?: (payload: WebhookCheckoutUpdatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for order created\n\t */\n\tonOrderCreated?: (payload: WebhookOrderCreatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for order refunded\n\t */\n\tonOrderRefunded?: (payload: WebhookOrderRefundedPayload) => Promise<void>;\n\t/**\n\t * Webhook for order paid\n\t */\n\tonOrderPaid?: (payload: WebhookOrderPaidPayload) => Promise<void>;\n\t/**\n\t * Webhook for order updated\n\t */\n\tonOrderUpdated?: (payload: WebhookOrderUpdatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for refund created\n\t */\n\tonRefundCreated?: (payload: WebhookRefundCreatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for refund updated\n\t */\n\tonRefundUpdated?: (payload: WebhookRefundUpdatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for subscription created\n\t */\n\tonSubscriptionCreated?: (\n\t\tpayload: WebhookSubscriptionCreatedPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for subscription updated\n\t */\n\tonSubscriptionUpdated?: (\n\t\tpayload: WebhookSubscriptionUpdatedPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for subscription active\n\t */\n\tonSubscriptionActive?: (\n\t\tpayload: WebhookSubscriptionActivePayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for subscription canceled\n\t */\n\tonSubscriptionCanceled?: (\n\t\tpayload: WebhookSubscriptionCanceledPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for subscription revoked\n\t */\n\tonSubscriptionRevoked?: (\n\t\tpayload: WebhookSubscriptionRevokedPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for subscription uncanceled\n\t */\n\tonSubscriptionUncanceled?: (\n\t\tpayload: WebhookSubscriptionUncanceledPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for product created\n\t */\n\tonProductCreated?: (payload: WebhookProductCreatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for product updated\n\t */\n\tonProductUpdated?: (payload: WebhookProductUpdatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for organization updated\n\t */\n\tonOrganizationUpdated?: (\n\t\tpayload: WebhookOrganizationUpdatedPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for benefit created\n\t */\n\tonBenefitCreated?: (payload: WebhookBenefitCreatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for benefit updated\n\t */\n\tonBenefitUpdated?: (payload: WebhookBenefitUpdatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for benefit grant created\n\t */\n\tonBenefitGrantCreated?: (\n\t\tpayload: WebhookBenefitGrantCreatedPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for benefit grant updated\n\t */\n\tonBenefitGrantUpdated?: (\n\t\tpayload: WebhookBenefitGrantUpdatedPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for benefit grant revoked\n\t */\n\tonBenefitGrantRevoked?: (\n\t\tpayload: WebhookBenefitGrantRevokedPayload,\n\t) => Promise<void>;\n\t/**\n\t * Webhook for customer created\n\t */\n\tonCustomerCreated?: (payload: WebhookCustomerCreatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for customer updated\n\t */\n\tonCustomerUpdated?: (payload: WebhookCustomerUpdatedPayload) => Promise<void>;\n\t/**\n\t * Webhook for customer deleted\n\t */\n\tonCustomerDeleted?: (payload: WebhookCustomerDeletedPayload) => Promise<void>;\n\t/**\n\t * Webhook for customer state changed\n\t */\n\tonCustomerStateChanged?: (\n\t\tpayload: WebhookCustomerStateChangedPayload,\n\t) => Promise<void>;\n}\n\nexport const webhooks = (options: WebhooksOptions) => (_spaire: Spaire) => {\n\treturn {\n\t\tspaireWebhooks: createAuthEndpoint(\n\t\t\t\"/spaire/webhooks\",\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tisAction: false,\n\t\t\t\t},\n\t\t\t\tcloneRequest: true,\n\t\t\t},\n\t\t\tasync (ctx) => {\n\t\t\t\tconst { secret, ...eventHandlers } = options;\n\n\t\t\t\tif (!ctx.request?.body) {\n\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\");\n\t\t\t\t}\n\t\t\t\tconst buf = await ctx.request.text();\n\t\t\t\tlet event: ReturnType<typeof validateEvent>;\n\t\t\t\ttry {\n\t\t\t\t\tif (!secret) {\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Spaire webhook secret not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst headers = {\n\t\t\t\t\t\t\"webhook-id\": ctx.request.headers.get(\"webhook-id\") as string,\n\t\t\t\t\t\t\"webhook-timestamp\": ctx.request.headers.get(\n\t\t\t\t\t\t\t\"webhook-timestamp\",\n\t\t\t\t\t\t) as string,\n\t\t\t\t\t\t\"webhook-signature\": ctx.request.headers.get(\n\t\t\t\t\t\t\t\"webhook-signature\",\n\t\t\t\t\t\t) as string,\n\t\t\t\t\t};\n\n\t\t\t\t\tevent = validateEvent(buf, headers, secret);\n\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\tif (err instanceof Error) {\n\t\t\t\t\t\tctx.context.logger.error(`${err.message}`);\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: `Webhook Error: ${err.message}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\tmessage: `Webhook Error: ${err}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait handleWebhookPayload(event, {\n\t\t\t\t\t\twebhookSecret: secret,\n\t\t\t\t\t\t...eventHandlers,\n\t\t\t\t\t});\n\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\t\t`Spaire webhook failed. Error: ${e.message}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.context.logger.error(`Spaire webhook failed. Error: ${e}`);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\tmessage: \"Webhook error: See server logs for more information.\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn ctx.json({ received: true });\n\t\t\t},\n\t\t),\n\t};\n};\n","import type { BetterAuthPlugin } from \"better-auth\";\nimport {\n\tonAfterUserCreate,\n\tonBeforeUserCreate,\n\tonUserDelete,\n\tonUserUpdate,\n} from \"./hooks/customer\";\nimport type { SpaireEndpoints, SpaireOptions } from \"./types\";\n\nexport { spaireClient } from \"./client\";\n\nexport * from \"./plugins/portal\";\nexport * from \"./plugins/checkout\";\nexport * from \"./plugins/usage\";\nexport * from \"./plugins/webhooks\";\n\nexport const spaire = <O extends SpaireOptions>(options: O) => {\n\tconst plugins = options.use\n\t\t.map((use) => use(options.client))\n\t\t.reduce((acc, plugin) => {\n\t\t\tObject.assign(acc, plugin);\n\t\t\treturn acc;\n\t\t}, {} as SpaireEndpoints);\n\n\treturn {\n\t\tid: \"spaire\",\n\t\tendpoints: {\n\t\t\t...plugins,\n\t\t},\n\t\tinit() {\n\t\t\treturn {\n\t\t\t\toptions: {\n\t\t\t\t\tdatabaseHooks: {\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tcreate: {\n\t\t\t\t\t\t\t\tbefore: onBeforeUserCreate(options),\n\t\t\t\t\t\t\t\tafter: onAfterUserCreate(options),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tupdate: {\n\t\t\t\t\t\t\t\tafter: onUserUpdate(options),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdelete: {\n\t\t\t\t\t\t\t\tafter: onUserDelete(options),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n"],"mappings":"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","names":["APIError","spaire","APIError","createAuthEndpoint","z","spaire","checkout","APIError","createAuthEndpoint","sessionMiddleware","z","spaire","APIError","createAuthEndpoint"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spaire/better-auth",
3
- "version": "2.0.1",
3
+ "version": "3.0.0",
4
4
  "description": "Spaire integration for better-auth",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -50,7 +50,7 @@
50
50
  ],
51
51
  "devDependencies": {
52
52
  "@biomejs/biome": "1.9.4",
53
- "@spaire/adapter-utils": "workspace:*",
53
+ "@spaire/adapter-utils": "^2.0.0",
54
54
  "@spaire/sdk": "^0.45.1",
55
55
  "@sindresorhus/tsconfig": "^7.0.0",
56
56
  "@types/node": "^20.0.0",
@@ -64,6 +64,9 @@
64
64
  "zod": "^3.24.2 || ^4"
65
65
  },
66
66
  "dependencies": {
67
- "@spaire/checkout": "npm:@polar-sh/checkout@^0.1.14"
67
+ "@spaire/checkout": "^0.2.0"
68
+ },
69
+ "publishConfig": {
70
+ "access": "public"
68
71
  }
69
72
  }