{"version":3,"sources":["../src/index.ts","../src/checkout/checkout.ts","../src/customerPortal/customerPortal.ts","../src/webhooks/webhooks.ts"],"sourcesContent":["export * from \"./checkout/checkout\";\nexport * from \"./customerPortal/customerPortal\";\nexport * from \"./webhooks/webhooks\";\n","import { Polar } from \"@polar-sh/sdk\";\nimport type { Request, Response } from \"express\";\n\nexport interface CheckoutConfig {\n\taccessToken?: string;\n\tsuccessUrl?: string;\n\treturnUrl?: string;\n\tincludeCheckoutId?: boolean;\n\tserver?: \"sandbox\" | \"production\";\n\ttheme?: \"light\" | \"dark\";\n}\n\nexport const Checkout = ({\n\taccessToken,\n\tsuccessUrl,\n\treturnUrl,\n\tserver,\n\ttheme,\n\tincludeCheckoutId = true,\n}: CheckoutConfig) => {\n\tconst polar = new Polar({\n\t\taccessToken: accessToken ?? process.env[\"POLAR_ACCESS_TOKEN\"],\n\t\tserver,\n\t});\n\n\treturn async (req: Request, res: Response) => {\n\t\tconst url = new URL(\n\t\t\t`${req.protocol}://${req.get(\"host\")}${req.originalUrl}`,\n\t\t);\n\t\tconst products = url.searchParams.getAll(\"products\");\n\n\t\tif (products.length === 0) {\n\t\t\tres.status(400).json({\n\t\t\t\terror: \"Missing products in query params\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst success = successUrl ? new URL(successUrl) : undefined;\n\n\t\tif (success && includeCheckoutId) {\n\t\t\tsuccess.searchParams.set(\"checkoutId\", \"{CHECKOUT_ID}\");\n\t\t}\n\n\t\tconst retUrl = returnUrl ? new URL(returnUrl) : undefined;\n\n\t\ttry {\n\t\t\tconst result = await polar.checkouts.create({\n\t\t\t\tproducts,\n\t\t\t\tsuccessUrl: success ? decodeURI(success.toString()) : undefined,\n\t\t\t\tcustomerId: url.searchParams.get(\"customerId\") ?? undefined,\n\t\t\t\texternalCustomerId:\n\t\t\t\t\turl.searchParams.get(\"customerExternalId\") ?? undefined,\n\t\t\t\tcustomerEmail: url.searchParams.get(\"customerEmail\") ?? undefined,\n\t\t\t\tcustomerName: url.searchParams.get(\"customerName\") ?? undefined,\n\t\t\t\tcustomerBillingAddress: url.searchParams.has(\"customerBillingAddress\")\n\t\t\t\t\t? JSON.parse(url.searchParams.get(\"customerBillingAddress\") ?? \"{}\")\n\t\t\t\t\t: undefined,\n\t\t\t\tcustomerTaxId: url.searchParams.get(\"customerTaxId\") ?? undefined,\n\t\t\t\tcustomerIpAddress:\n\t\t\t\t\turl.searchParams.get(\"customerIpAddress\") ?? undefined,\n\t\t\t\tcustomerMetadata: url.searchParams.has(\"customerMetadata\")\n\t\t\t\t\t? JSON.parse(url.searchParams.get(\"customerMetadata\") ?? \"{}\")\n\t\t\t\t\t: undefined,\n\t\t\t\tallowDiscountCodes: url.searchParams.has(\"allowDiscountCodes\")\n\t\t\t\t\t? url.searchParams.get(\"allowDiscountCodes\") === \"true\"\n\t\t\t\t\t: undefined,\n\t\t\t\tdiscountId: url.searchParams.get(\"discountId\") ?? undefined,\n\t\t\t\tmetadata: url.searchParams.has(\"metadata\")\n\t\t\t\t\t? JSON.parse(url.searchParams.get(\"metadata\") ?? \"{}\")\n\t\t\t\t\t: undefined,\n\t\t\t\tseats: url.searchParams.has(\"seats\")\n\t\t\t\t\t? Number.parseInt(url.searchParams.get(\"seats\") ?? \"1\", 10)\n\t\t\t\t\t: undefined,\n\t\t\t\treturnUrl: retUrl ? decodeURI(retUrl.toString()) : undefined,\n\t\t\t});\n\n\t\t\tconst redirectUrl = new URL(result.url);\n\n\t\t\tif (theme) {\n\t\t\t\tredirectUrl.searchParams.set(\"theme\", theme);\n\t\t\t}\n\n\t\t\tres.redirect(redirectUrl.toString());\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\tres.status(500).json({ error: \"Internal server error\" });\n\t\t}\n\t};\n};\n","import { Polar } from \"@polar-sh/sdk\";\nimport type { Request, Response } from \"express\";\n\nexport interface CustomerPortalConfig {\n\taccessToken?: string;\n\tgetCustomerId: (req: Request) => Promise<string>;\n\tserver?: \"sandbox\" | \"production\";\n\treturnUrl?: string;\n}\n\nexport const CustomerPortal = ({\n\taccessToken,\n\tserver,\n\tgetCustomerId,\n\treturnUrl,\n}: CustomerPortalConfig) => {\n\tconst polar = new Polar({\n\t\taccessToken: accessToken ?? process.env[\"POLAR_ACCESS_TOKEN\"],\n\t\tserver,\n\t});\n\n\treturn async (req: Request, res: Response) => {\n\t\tconst retUrl = returnUrl ? new URL(returnUrl) : undefined;\n\n\t\tconst customerId = await getCustomerId(req);\n\n\t\tif (!customerId) {\n\t\t\tres.status(400).json({ error: \"customerId not defined\" });\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await polar.customerSessions.create({\n\t\t\t\tcustomerId,\n\t\t\t\treturnUrl: retUrl ? decodeURI(retUrl.toString()) : undefined,\n\t\t\t});\n\n\t\t\tres.redirect(result.customerPortalUrl);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\tres.status(500).json({ error: \"Internal server error\" });\n\t\t\treturn;\n\t\t}\n\t};\n};\n","import {\n\ttype WebhooksConfig,\n\thandleWebhookPayload,\n} from \"@polar-sh/adapter-utils\";\nimport {\n\tWebhookVerificationError,\n\tvalidateEvent,\n} from \"@polar-sh/sdk/webhooks\";\nimport type { Request, RequestHandler, Response } from \"express\";\n\nexport {\n\ttype EntitlementContext,\n\ttype EntitlementHandler,\n\ttype EntitlementProperties,\n\tEntitlementStrategy,\n\tEntitlements,\n} from \"@polar-sh/adapter-utils\";\n\nexport const Webhooks = ({\n\twebhookSecret,\n\tonPayload,\n\tentitlements,\n\t...eventHandlers\n}: WebhooksConfig): RequestHandler => {\n\treturn async (req: Request, res: Response) => {\n\t\tconst requestBody = JSON.stringify(req.body);\n\n\t\tconst webhookHeaders: Record<string, string> = {\n\t\t\t\"webhook-id\": req.headers[\"webhook-id\"] as string,\n\t\t\t\"webhook-timestamp\": req.headers[\"webhook-timestamp\"] as string,\n\t\t\t\"webhook-signature\": req.headers[\"webhook-signature\"] as string,\n\t\t};\n\n\t\tlet webhookPayload: ReturnType<typeof validateEvent>;\n\t\ttry {\n\t\t\twebhookPayload = validateEvent(\n\t\t\t\trequestBody,\n\t\t\t\twebhookHeaders,\n\t\t\t\twebhookSecret,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.log(error);\n\t\t\tif (error instanceof WebhookVerificationError) {\n\t\t\t\tres.status(403).json({ received: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tres.status(500).json({ error: \"Internal server error\" });\n\t\t\treturn;\n\t\t}\n\n\t\tawait handleWebhookPayload(webhookPayload, {\n\t\t\twebhookSecret,\n\t\t\tentitlements,\n\t\t\tonPayload,\n\t\t\t...eventHandlers,\n\t\t});\n\n\t\tres.json({ received: true });\n\t};\n};\n"],"mappings":"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","names":["import_sdk","import_adapter_utils"]}