@queelabs/connectors-polar 0.0.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.
@@ -0,0 +1,6 @@
1
+ import type { MppPaymentAdapter } from "@queelabs/core";
2
+ /**
3
+ * Polar adapter (MPP-shaped): maps Polar checkouts to Quee payment challenges and receipts.
4
+ */
5
+ export declare function createPolarMppConnector(): MppPaymentAdapter;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,iBAAiB,EAGlB,MAAM,gBAAgB,CAAC;AAaxB;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAoF3D"}
package/dist/index.js ADDED
@@ -0,0 +1,86 @@
1
+ import { Polar } from "@polar-sh/sdk";
2
+ function readRecord(source, key) {
3
+ const value = source[key];
4
+ if (!value || typeof value !== "object" || Array.isArray(value))
5
+ return null;
6
+ return value;
7
+ }
8
+ function readString(source, key) {
9
+ const value = source[key];
10
+ return typeof value === "string" && value.length > 0 ? value : null;
11
+ }
12
+ /**
13
+ * Polar adapter (MPP-shaped): maps Polar checkouts to Quee payment challenges and receipts.
14
+ */
15
+ export function createPolarMppConnector() {
16
+ return {
17
+ async createPurchaseChallenge(input) {
18
+ const accessToken = process.env.POLAR_ACCESS_TOKEN;
19
+ if (!accessToken) {
20
+ throw new Error("POLAR_ACCESS_TOKEN is not set");
21
+ }
22
+ const rawCheckoutBaseUrl = process.env.QUEE_CHECKOUT_BASE_URL;
23
+ if (!rawCheckoutBaseUrl) {
24
+ throw new Error("QUEE_CHECKOUT_BASE_URL is not set");
25
+ }
26
+ const checkoutBaseUrl = rawCheckoutBaseUrl.replace(/\/+$/, "");
27
+ const productId = process.env.POLAR_DEFAULT_PRODUCT_ID;
28
+ if (!productId) {
29
+ throw new Error("POLAR_DEFAULT_PRODUCT_ID is not set");
30
+ }
31
+ const polar = new Polar({ accessToken });
32
+ const checkout = await polar.checkouts.create({
33
+ products: [productId],
34
+ successUrl: `${checkoutBaseUrl}/pay/${input.orderId}/success`,
35
+ });
36
+ return {
37
+ challengeId: `polar_ch_${input.orderId}`,
38
+ rail: "polar",
39
+ payload: {
40
+ type: "polar_checkout_challenge",
41
+ version: "0.1",
42
+ orderId: input.orderId,
43
+ amountMinor: input.amountMinor,
44
+ currency: input.currency,
45
+ polar: {
46
+ checkoutUrl: checkout.url,
47
+ checkoutId: checkout.id,
48
+ },
49
+ },
50
+ };
51
+ },
52
+ async verifyPurchase(input) {
53
+ const accessToken = process.env.POLAR_ACCESS_TOKEN;
54
+ if (!accessToken) {
55
+ throw new Error("POLAR_ACCESS_TOKEN is not set");
56
+ }
57
+ const polar = new Polar({ accessToken });
58
+ const expectedCheckoutId = readString(readRecord(input.challengePayload, "polar") ?? {}, "checkoutId");
59
+ const checkoutId = typeof input.proof.polarCheckoutId === "string"
60
+ ? input.proof.polarCheckoutId
61
+ : null;
62
+ if (!expectedCheckoutId || !checkoutId || checkoutId !== expectedCheckoutId) {
63
+ throw new Error("polar proof does not match stored challenge");
64
+ }
65
+ const checkout = await polar.checkouts.get({ id: checkoutId });
66
+ if (checkout.id !== expectedCheckoutId) {
67
+ throw new Error("Polar checkout does not match stored challenge");
68
+ }
69
+ if (checkout.status !== "succeeded") {
70
+ throw new Error(`Polar checkout not succeeded: ${checkout.status}`);
71
+ }
72
+ return {
73
+ receiptPayload: {
74
+ verified: true,
75
+ challengeId: input.challengeId,
76
+ orderId: input.orderId,
77
+ settledVia: "polar",
78
+ proof: input.proof,
79
+ providerReference: checkout.paymentId || checkout.id,
80
+ },
81
+ verifiedAt: new Date(),
82
+ };
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@queelabs/connectors-polar",
3
+ "version": "0.0.1",
4
+ "license": "UNLICENSED",
5
+ "description": "Polar adapter for Quee (MPP-shaped)",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/quee-protocol/quee.git",
18
+ "directory": "connectors/polar"
19
+ },
20
+ "dependencies": {
21
+ "@polar-sh/sdk": "^0.47.0",
22
+ "@queelabs/core": "0.0.1"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^22.10.2",
26
+ "typescript": "^5.7.2"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc",
30
+ "lint": "echo ok"
31
+ }
32
+ }