@molecule/api-resource-user 1.2.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,7 +3,7 @@ AUTO-GENERATED — DO NOT EDIT THIS FILE.
3
3
  Generated by `mlcl sync-docs` from the package's src/index.ts JSDoc + mlcl/registry.json.
4
4
  Edits here are overwritten on the next commit (molecule's pre-commit hook regenerates).
5
5
  To change this document, edit the module-level JSDoc in src/index.ts.
6
- Generated: 2026-08-14T16:52:47.963Z
6
+ Generated: 2026-08-16T14:04:43.160Z
7
7
  -->
8
8
 
9
9
  # @molecule/api-resource-user
@@ -73,6 +73,7 @@ interface UserRequestHandlerMap {
73
73
  verifyTwoFactor: MoleculeRequestHandler
74
74
  updatePlan: MoleculeRequestHandler
75
75
  verifyPayment: MoleculeRequestHandler
76
+ billingPortal: MoleculeRequestHandler
76
77
  handlePaymentNotification: MoleculeRequestHandler
77
78
  requireWebhookAuthenticity: MoleculeRequestHandler
78
79
  }
@@ -531,6 +532,7 @@ Members:
531
532
 
532
533
  Members:
533
534
 
535
+ - `handlers.billingPortal` — function: Opens the bonded provider's hosted billing portal for the user, so they can
534
536
  - `handlers.handlePaymentNotification` — function: Generic payment notification handler that works with any bonded PaymentProvider. Reads the
535
537
  - `handlers.verifyPayment` — function: Generic payment verification handler that works with any bonded PaymentProvider. Reads the
536
538
  - `handlers.CreateRequest` — interface: Request body for user creation, including password and optional device name.
@@ -885,7 +887,7 @@ Peer dependencies:
885
887
  - `@molecule/api-locales-user` ^1.0.1
886
888
  - `@molecule/api-locales-user-payments` ^1.0.1
887
889
  - `@molecule/api-password` ^1.0.1
888
- - `@molecule/api-payments` ^1.0.1
890
+ - `@molecule/api-payments` ^1.1.0
889
891
  - `@molecule/api-push-notifications` ^1.0.1
890
892
  - `@molecule/api-rate-limit` ^1.0.1
891
893
  - `@molecule/api-resource` ^1.0.1
@@ -953,7 +955,18 @@ client method; call them with raw `http.*`. Use these EXACT paths — a weak mod
953
955
  - `POST /api/users/reset-password` — confirm with the emailed token (body `{ token, password }`)
954
956
  - `PATCH /api/users/:id` — update profile fields (name, username, email, bio); NOT `PUT /api/user`
955
957
  - `PATCH /api/users/:id/password` — change password · `DELETE /api/users/:id` — delete account
956
- - `PATCH /api/users/:id/plan` — update the subscription plan
958
+ - `PATCH /api/users/:id/plan` — update the subscription plan (a paid plan with no
959
+ existing subscription answers 201 `{ checkoutUrl }`; send the browser there)
960
+ - `POST /api/users/:id/verify-payment/:provider` — confirm a purchase server-side
961
+ (body/query `subscriptionId`); the provider returns the buyer to the APP's
962
+ `/plan-updated?provider=…&sessionId=…`, and THAT page calls this from the app
963
+ origin so the session cookie applies. A hosted checkout must never redirect
964
+ straight to this route on a separate API host: the top-level navigation carries
965
+ no credentials, so it answers 401 and the paid plan is never granted.
966
+ - `POST /api/users/:id/billing-portal/:provider` — open the provider's hosted
967
+ billing portal (update card, invoices, cancel); responds `{ url }`, optional body
968
+ `{ returnPath }` to come back to a specific app page. 404 `user.payment.noBillingAccount`
969
+ when the user has no customer record yet
957
970
  - `GET /api/users/me` — the current user (session restore) · `GET /api/users/:id` — read one
958
971
  The full, authoritative route list is the `routes` export (see `routes.ts`).
959
972
 
@@ -5,7 +5,7 @@ export * from './logIn.js';
5
5
  export * from './logInOAuth.js';
6
6
  export * from './logout.js';
7
7
  export * from './oauthAuthorize.js';
8
- export { handlePaymentNotification, verifyPayment } from './payments/registry.js';
8
+ export { billingPortal, handlePaymentNotification, verifyPayment } from './payments/registry.js';
9
9
  export * from './read.js';
10
10
  export * from './readSelf.js';
11
11
  export * from './resetPassword.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjF,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAChG,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA"}
@@ -5,7 +5,7 @@ export * from './logIn.js';
5
5
  export * from './logInOAuth.js';
6
6
  export * from './logout.js';
7
7
  export * from './oauthAuthorize.js';
8
- export { handlePaymentNotification, verifyPayment } from './payments/registry.js';
8
+ export { billingPortal, handlePaymentNotification, verifyPayment } from './payments/registry.js';
9
9
  export * from './read.js';
10
10
  export * from './readSelf.js';
11
11
  export * from './resetPassword.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACjF,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAChG,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,35 @@
1
+ import type { MoleculeRequest } from '@molecule/api-resource';
2
+ /**
3
+ * Opens the bonded provider's hosted billing portal for the user, so they can
4
+ * update their payment method, see invoices, and cancel — the self-service
5
+ * surface an app otherwise has to build (and usually doesn't, leaving a
6
+ * subscriber with no way out but support).
7
+ *
8
+ * Reads the provider name from the `:provider` route parameter and returns the
9
+ * portal URL for the client to open. Providers whose purchases are managed by
10
+ * the platform store (Apple/Google) implement no portal and answer 400 —
11
+ * their subscribers manage the subscription in the store app.
12
+ *
13
+ * The user is returned to the APP origin on exit (never the API origin, whose
14
+ * host holds no session cookie); an app-relative `returnPath` in the request
15
+ * body sends them back to the exact page they opened the portal from.
16
+ * @returns A request handler that responds `{ url, id }` with the portal session.
17
+ */
18
+ export declare const billingPortal: () => (req: MoleculeRequest) => Promise<{
19
+ statusCode: number;
20
+ body: {
21
+ error: string;
22
+ errorKey: string;
23
+ id?: undefined;
24
+ url?: undefined;
25
+ };
26
+ } | {
27
+ statusCode: number;
28
+ body: {
29
+ id: string;
30
+ url: string;
31
+ error?: undefined;
32
+ errorKey?: undefined;
33
+ };
34
+ }>;
35
+ //# sourceMappingURL=billingPortal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billingPortal.d.ts","sourceRoot":"","sources":["../../../src/handlers/payments/billingPortal.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,SACV,KAAK,eAAe;;;;;;;;;;;;;;;;EAsFnC,CAAA"}
@@ -0,0 +1,92 @@
1
+ import { getAnalytics, getLogger, require as bondRequire } from '@molecule/api-bond';
2
+ import { t } from '@molecule/api-i18n';
3
+ import { isConfigNotConfiguredError, resolveBillingPortalReturnUrl, } from '@molecule/api-payments';
4
+ const analytics = getAnalytics();
5
+ const logger = getLogger();
6
+ /**
7
+ * Opens the bonded provider's hosted billing portal for the user, so they can
8
+ * update their payment method, see invoices, and cancel — the self-service
9
+ * surface an app otherwise has to build (and usually doesn't, leaving a
10
+ * subscriber with no way out but support).
11
+ *
12
+ * Reads the provider name from the `:provider` route parameter and returns the
13
+ * portal URL for the client to open. Providers whose purchases are managed by
14
+ * the platform store (Apple/Google) implement no portal and answer 400 —
15
+ * their subscribers manage the subscription in the store app.
16
+ *
17
+ * The user is returned to the APP origin on exit (never the API origin, whose
18
+ * host holds no session cookie); an app-relative `returnPath` in the request
19
+ * body sends them back to the exact page they opened the portal from.
20
+ * @returns A request handler that responds `{ url, id }` with the portal session.
21
+ */
22
+ export const billingPortal = () => {
23
+ return async (req) => {
24
+ const providerName = req.params.provider;
25
+ const id = req.params.id;
26
+ if (!providerName) {
27
+ return {
28
+ statusCode: 400,
29
+ body: {
30
+ error: t('user.payment.providerRequired'),
31
+ errorKey: 'user.payment.providerRequired',
32
+ },
33
+ };
34
+ }
35
+ try {
36
+ const provider = bondRequire('payments', providerName);
37
+ if (!provider.createPortalSession) {
38
+ return {
39
+ statusCode: 400,
40
+ body: {
41
+ error: t('user.payment.portalNotSupported', { provider: providerName }, { defaultValue: '{{provider}} does not offer a billing portal.' }),
42
+ errorKey: 'user.payment.portalNotSupported',
43
+ },
44
+ };
45
+ }
46
+ const session = await provider.createPortalSession({
47
+ userId: id,
48
+ returnUrl: resolveBillingPortalReturnUrl(req.body?.returnPath),
49
+ });
50
+ if (!session?.url) {
51
+ // No customer record for this user (never purchased, or the purchase
52
+ // was never linked) — a distinct, actionable outcome, not a failure.
53
+ return {
54
+ statusCode: 404,
55
+ body: {
56
+ error: t('user.payment.noBillingAccount', { provider: providerName }, { defaultValue: 'No {{provider}} billing account found for this user.' }),
57
+ errorKey: 'user.payment.noBillingAccount',
58
+ },
59
+ };
60
+ }
61
+ analytics
62
+ .track({
63
+ name: 'payment.portal_opened',
64
+ userId: id,
65
+ properties: { provider: providerName },
66
+ })
67
+ .catch(() => { });
68
+ return { statusCode: 200, body: { id: session.id, url: session.url } };
69
+ }
70
+ catch (error) {
71
+ // A missing provider secret is a config problem, not a billing problem —
72
+ // pass its real 503 + errorKey through so the operator sees which key to
73
+ // set (same contract as verifyPayment).
74
+ if (isConfigNotConfiguredError(error)) {
75
+ logger.warn(error.message, { errorKey: error.errorKey, provider: providerName });
76
+ return {
77
+ statusCode: error.statusCode,
78
+ body: { error: error.message, errorKey: error.errorKey },
79
+ };
80
+ }
81
+ logger.error(`${providerName} billingPortal error:`, error);
82
+ return {
83
+ statusCode: 500,
84
+ body: {
85
+ error: t('user.payment.portalFailed', { provider: providerName }, { defaultValue: 'Could not open the {{provider}} billing portal.' }),
86
+ errorKey: 'user.payment.portalFailed',
87
+ },
88
+ };
89
+ }
90
+ };
91
+ };
92
+ //# sourceMappingURL=billingPortal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billingPortal.js","sourceRoot":"","sources":["../../../src/handlers/payments/billingPortal.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * @module
10
10
  */
11
+ export { billingPortal } from './billingPortal.js';
11
12
  export { handlePaymentNotification } from './handlePaymentNotification.js';
12
13
  export { verifyPayment } from './verifyPayment.js';
13
14
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/handlers/payments/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/handlers/payments/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * @module
10
10
  */
11
+ export { billingPortal } from './billingPortal.js';
11
12
  export { handlePaymentNotification } from './handlePaymentNotification.js';
12
13
  export { verifyPayment } from './verifyPayment.js';
13
14
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/handlers/payments/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/handlers/payments/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
@@ -4,6 +4,14 @@ import type * as types from '../types.js';
4
4
  export interface UpdatePlanRequest extends MoleculeRequest {
5
5
  body: {
6
6
  planKey?: string;
7
+ /**
8
+ * Units of the plan to buy — seats, on a per-seat plan. Omitted means one.
9
+ *
10
+ * Read from the request because only the app knows what a unit means: the
11
+ * plan catalogue describes a price, not how many of it this buyer wants.
12
+ * Ignored by flat-priced plans, whose providers receive no quantity at all.
13
+ */
14
+ quantity?: number;
7
15
  };
8
16
  }
9
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"updatePlan.d.ts","sourceRoot":"","sources":["../../src/handlers/updatePlan.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAA;AAMzC,oEAAoE;AACpE,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,IAAI,EAAE;QACJ,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;CACF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAI,sCAAsC,KAAK,CAAC,QAAQ,MAiC/D,KAAK,iBAAiB;;;;;aAzBX,CAAC;;;;;;;;;;;;;;EA4Q3B,CAAA"}
1
+ {"version":3,"file":"updatePlan.d.ts","sourceRoot":"","sources":["../../src/handlers/updatePlan.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAA;AAMzC,oEAAoE;AACpE,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,IAAI,EAAE;QACJ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB;;;;;;WAMG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAyBD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAI,sCAAsC,KAAK,CAAC,QAAQ,MAiC/D,KAAK,iBAAiB;;;;;aApDnB,CAAC;;;;;;;;;;;;;;EAwSnB,CAAA"}
@@ -7,6 +7,29 @@ import { updatePlanPropsSchema } from '../schema.js';
7
7
  import { invalidateEntitlementsCacheSafe } from '../utilities/invalidateEntitlements.js';
8
8
  const analytics = getAnalytics();
9
9
  const logger = getLogger();
10
+ /**
11
+ * Largest seat count a single plan change may buy.
12
+ *
13
+ * A ceiling, not a policy: the app's own tier limits decide the real maximum.
14
+ * This exists so a malformed or hostile body cannot ask a payment provider to
15
+ * bill four billion units.
16
+ */
17
+ const MAX_PLAN_QUANTITY = 1000;
18
+ /**
19
+ * Normalise a requested quantity into something safe to bill.
20
+ *
21
+ * @param raw - The value from the request body, of unknown provenance.
22
+ * @returns A whole number in [1, {@link MAX_PLAN_QUANTITY}], or `undefined` when
23
+ * none was requested — which providers treat as a single unit.
24
+ */
25
+ function normalizeQuantity(raw) {
26
+ if (raw === undefined || raw === null)
27
+ return undefined;
28
+ const n = Number(raw);
29
+ if (!Number.isFinite(n))
30
+ return undefined;
31
+ return Math.min(Math.max(Math.floor(n), 1), MAX_PLAN_QUANTITY);
32
+ }
10
33
  /**
11
34
  * Updates a user's subscription plan. Uses the bonded PlanService to look up plan metadata and
12
35
  * delegates to the appropriate bonded PaymentProvider based on the plan's `platformKey`. Handles
@@ -105,6 +128,7 @@ export const updatePlan = ({ name, tableName, schema: _schema }) => {
105
128
  userId: user.id,
106
129
  newProductId: plan.platformProductId,
107
130
  previousProductId: previousPlan?.platformProductId,
131
+ quantity: normalizeQuantity(req.body.quantity),
108
132
  });
109
133
  if (result.checkoutUrl) {
110
134
  // New subscription requires checkout — return the URL to the client.
@@ -1 +1 @@
1
- {"version":3,"file":"updatePlan.js","sourceRoot":"","sources":["../../src/handlers/updatePlan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updatePlan.js","sourceRoot":"","sources":["../../src/handlers/updatePlan.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -33,7 +33,18 @@
33
33
  * - `POST /api/users/reset-password` — confirm with the emailed token (body `{ token, password }`)
34
34
  * - `PATCH /api/users/:id` — update profile fields (name, username, email, bio); NOT `PUT /api/user`
35
35
  * - `PATCH /api/users/:id/password` — change password · `DELETE /api/users/:id` — delete account
36
- * - `PATCH /api/users/:id/plan` — update the subscription plan
36
+ * - `PATCH /api/users/:id/plan` — update the subscription plan (a paid plan with no
37
+ * existing subscription answers 201 `{ checkoutUrl }`; send the browser there)
38
+ * - `POST /api/users/:id/verify-payment/:provider` — confirm a purchase server-side
39
+ * (body/query `subscriptionId`); the provider returns the buyer to the APP's
40
+ * `/plan-updated?provider=…&sessionId=…`, and THAT page calls this from the app
41
+ * origin so the session cookie applies. A hosted checkout must never redirect
42
+ * straight to this route on a separate API host: the top-level navigation carries
43
+ * no credentials, so it answers 401 and the paid plan is never granted.
44
+ * - `POST /api/users/:id/billing-portal/:provider` — open the provider's hosted
45
+ * billing portal (update card, invoices, cancel); responds `{ url }`, optional body
46
+ * `{ returnPath }` to come back to a specific app page. 404 `user.payment.noBillingAccount`
47
+ * when the user has no customer record yet
37
48
  * - `GET /api/users/me` — the current user (session restore) · `GET /api/users/:id` — read one
38
49
  * The full, authoritative route list is the `routes` export (see `routes.ts`).
39
50
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AAEH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAA;AACrD,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,wBAAwB,CAAA;AACtC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAEH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAA;AACrD,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,wBAAwB,CAAA;AACtC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -33,7 +33,18 @@
33
33
  * - `POST /api/users/reset-password` — confirm with the emailed token (body `{ token, password }`)
34
34
  * - `PATCH /api/users/:id` — update profile fields (name, username, email, bio); NOT `PUT /api/user`
35
35
  * - `PATCH /api/users/:id/password` — change password · `DELETE /api/users/:id` — delete account
36
- * - `PATCH /api/users/:id/plan` — update the subscription plan
36
+ * - `PATCH /api/users/:id/plan` — update the subscription plan (a paid plan with no
37
+ * existing subscription answers 201 `{ checkoutUrl }`; send the browser there)
38
+ * - `POST /api/users/:id/verify-payment/:provider` — confirm a purchase server-side
39
+ * (body/query `subscriptionId`); the provider returns the buyer to the APP's
40
+ * `/plan-updated?provider=…&sessionId=…`, and THAT page calls this from the app
41
+ * origin so the session cookie applies. A hosted checkout must never redirect
42
+ * straight to this route on a separate API host: the top-level navigation carries
43
+ * no credentials, so it answers 401 and the paid plan is never granted.
44
+ * - `POST /api/users/:id/billing-portal/:provider` — open the provider's hosted
45
+ * billing portal (update card, invoices, cancel); responds `{ url }`, optional body
46
+ * `{ returnPath }` to come back to a specific app page. 404 `user.payment.noBillingAccount`
47
+ * when the user has no customer record yet
37
48
  * - `GET /api/users/me` — the current user (session restore) · `GET /api/users/:id` — read one
38
49
  * The full, authoritative route list is the `routes` export (see `routes.ts`).
39
50
  *
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AAEH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAA;AACrD,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,wBAAwB,CAAA;AACtC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAEH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAA;AACrD,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,cAAc,WAAW,CAAA;AACzB,cAAc,wBAAwB,CAAA;AACtC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA"}
@@ -27,6 +27,7 @@ export interface UserRequestHandlerMap {
27
27
  verifyTwoFactor: MoleculeRequestHandler;
28
28
  updatePlan: MoleculeRequestHandler;
29
29
  verifyPayment: MoleculeRequestHandler;
30
+ billingPortal: MoleculeRequestHandler;
30
31
  handlePaymentNotification: MoleculeRequestHandler;
31
32
  requireWebhookAuthenticity: MoleculeRequestHandler;
32
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"requestHandlerMap.d.ts","sourceRoot":"","sources":["../src/requestHandlerMap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,IAAI,oBAAoB,EAC5C,sBAAsB,EACvB,MAAM,wBAAwB,CAAA;AAM/B,KAAK,qBAAqB,GAAG,OAAO,oBAAoB,CAAA;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,sBAAsB,CAAA;IAC5B,QAAQ,EAAE,sBAAsB,CAAA;IAChC,aAAa,EAAE,sBAAsB,CAAA;IACrC,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,MAAM,EAAE,sBAAsB,CAAA;IAC9B,KAAK,EAAE,sBAAsB,CAAA;IAC7B,cAAc,EAAE,sBAAsB,CAAA;IACtC,UAAU,EAAE,sBAAsB,CAAA;IAClC,MAAM,EAAE,sBAAsB,CAAA;IAC9B,IAAI,EAAE,sBAAsB,CAAA;IAC5B,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,sBAAsB,CAAA;IAC9B,GAAG,EAAE,sBAAsB,CAAA;IAC3B,cAAc,EAAE,sBAAsB,CAAA;IACtC,cAAc,EAAE,sBAAsB,CAAA;IACtC,aAAa,EAAE,sBAAsB,CAAA;IACrC,eAAe,EAAE,sBAAsB,CAAA;IACvC,UAAU,EAAE,sBAAsB,CAAA;IAClC,aAAa,EAAE,sBAAsB,CAAA;IACrC,yBAAyB,EAAE,sBAAsB,CAAA;IACjD,0BAA0B,EAAE,sBAAsB,CAAA;CACnD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,qBAAqB,KAC1C,qBA0DF,CAAA"}
1
+ {"version":3,"file":"requestHandlerMap.d.ts","sourceRoot":"","sources":["../src/requestHandlerMap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,IAAI,oBAAoB,EAC5C,sBAAsB,EACvB,MAAM,wBAAwB,CAAA;AAM/B,KAAK,qBAAqB,GAAG,OAAO,oBAAoB,CAAA;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,sBAAsB,CAAA;IAC5B,QAAQ,EAAE,sBAAsB,CAAA;IAChC,aAAa,EAAE,sBAAsB,CAAA;IACrC,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,MAAM,EAAE,sBAAsB,CAAA;IAC9B,KAAK,EAAE,sBAAsB,CAAA;IAC7B,cAAc,EAAE,sBAAsB,CAAA;IACtC,UAAU,EAAE,sBAAsB,CAAA;IAClC,MAAM,EAAE,sBAAsB,CAAA;IAC9B,IAAI,EAAE,sBAAsB,CAAA;IAC5B,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,sBAAsB,CAAA;IAC9B,GAAG,EAAE,sBAAsB,CAAA;IAC3B,cAAc,EAAE,sBAAsB,CAAA;IACtC,cAAc,EAAE,sBAAsB,CAAA;IACtC,aAAa,EAAE,sBAAsB,CAAA;IACrC,eAAe,EAAE,sBAAsB,CAAA;IACvC,UAAU,EAAE,sBAAsB,CAAA;IAClC,aAAa,EAAE,sBAAsB,CAAA;IACrC,aAAa,EAAE,sBAAsB,CAAA;IACrC,yBAAyB,EAAE,sBAAsB,CAAA;IACjD,0BAA0B,EAAE,sBAAsB,CAAA;CACnD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,GAClC,sBAAsB,qBAAqB,KAC1C,qBA2DF,CAAA"}
@@ -58,6 +58,7 @@ export const createRequestHandlerMap = (createRequestHandler) => {
58
58
  // requested :provider. Adding a new payment provider requires only a
59
59
  // new bond package — no source changes here.
60
60
  verifyPayment: createRequestHandler(handlers.verifyPayment(resource)),
61
+ billingPortal: createRequestHandler(handlers.billingPortal()),
61
62
  handlePaymentNotification: createRequestHandler(handlers.handlePaymentNotification(resource)),
62
63
  };
63
64
  // Suppress unused-import warning while keeping the bond-registry import
@@ -1 +1 @@
1
- {"version":3,"file":"requestHandlerMap.js","sourceRoot":"","sources":["../src/requestHandlerMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAO3C,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAmCxC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,oBAA2C,EACpB,EAAE;IACzB,MAAM,GAAG,GAA0B;QACjC,cAAc;QACd,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE;QACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE;QAChC,wEAAwE;QACxE,0EAA0E;QAC1E,uEAAuE;QACvE,kEAAkE;QAClE,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC;YACnC,KAAK,EAAE,MAAM;YACb,WAAW,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC;SACxE,CAAC;QACF,8EAA8E;QAC9E,0DAA0D;QAC1D,kBAAkB,EAAE,WAAW,CAAC,SAAS,CAAC;YACxC,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,CAAC;YACN,WAAW,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC;SAC7C,CAAC;QACF,0EAA0E;QAC1E,0BAA0B,EAAE,WAAW,CAAC,0BAA0B,EAAE;QAEpE,gBAAgB;QAChB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/C,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,GAAG,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvE,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvE,aAAa,EAAE,oBAAoB,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrE,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACzE,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE/D,qEAAqE;QACrE,uEAAuE;QACvE,4CAA4C;QAC5C,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC/D,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE/D,wEAAwE;QACxE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,6CAA6C;QAC7C,aAAa,EAAE,oBAAoB,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrE,yBAAyB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;KAC9F,CAAA;IAED,wEAAwE;IACxE,8FAA8F;IAC9F,KAAK,MAAuB,CAAA;IAE5B,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
1
+ {"version":3,"file":"requestHandlerMap.js","sourceRoot":"","sources":["../src/requestHandlerMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAO3C,OAAO,KAAK,WAAW,MAAM,wBAAwB,CAAA;AACrD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAoCxC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,oBAA2C,EACpB,EAAE;IACzB,MAAM,GAAG,GAA0B;QACjC,cAAc;QACd,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE;QACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE;QAChC,wEAAwE;QACxE,0EAA0E;QAC1E,uEAAuE;QACvE,kEAAkE;QAClE,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC;YACnC,KAAK,EAAE,MAAM;YACb,WAAW,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC;SACxE,CAAC;QACF,8EAA8E;QAC9E,0DAA0D;QAC1D,kBAAkB,EAAE,WAAW,CAAC,SAAS,CAAC;YACxC,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,CAAC;YACN,WAAW,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC;SAC7C,CAAC;QACF,0EAA0E;QAC1E,0BAA0B,EAAE,WAAW,CAAC,0BAA0B,EAAE;QAEpE,gBAAgB;QAChB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/C,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,GAAG,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvE,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvE,aAAa,EAAE,oBAAoB,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrE,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACzE,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE/D,qEAAqE;QACrE,uEAAuE;QACvE,4CAA4C;QAC5C,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC/D,UAAU,EAAE,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE/D,wEAAwE;QACxE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,6CAA6C;QAC7C,aAAa,EAAE,oBAAoB,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrE,aAAa,EAAE,oBAAoB,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC7D,yBAAyB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;KAC9F,CAAA;IAED,wEAAwE;IACxE,8FAA8F;IAC9F,KAAK,MAAuB,CAAA;IAE5B,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsHlB,CAAA"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiIlB,CAAA"}
package/dist/routes.js CHANGED
@@ -106,6 +106,17 @@ export const routes = [
106
106
  handler: 'verifyPayment',
107
107
  optional: 'payments',
108
108
  },
109
+ // Hosted billing portal (payment-method updates, invoices, cancellation).
110
+ // authSelf: the portal session is minted for `:id`'s provider customer and
111
+ // its URL is a bearer credential for that account's whole billing history —
112
+ // an unauthenticated or cross-user POST must never mint one.
113
+ {
114
+ method: 'post',
115
+ path: '/users/:id/billing-portal/:provider',
116
+ middlewares: ['authSelf'],
117
+ handler: 'billingPortal',
118
+ optional: 'payments',
119
+ },
109
120
  // Payment notifications (webhooks, S2S). The authenticity guard lets
110
121
  // signature-verifying webhook providers (Stripe) through and requires a shared
111
122
  // secret for unsigned server-to-server providers (Apple/Google) so the public
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@molecule/api-resource-user",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "User resource types and schema for molecule.dev.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -36,7 +36,7 @@
36
36
  "@molecule/api-config": "1.0.1",
37
37
  "@molecule/api-locales-user": "1.0.1",
38
38
  "@molecule/api-locales-user-payments": "1.0.1",
39
- "@molecule/api-payments": "1.0.1",
39
+ "@molecule/api-payments": "1.2.0",
40
40
  "@molecule/api-push-notifications": "1.0.1",
41
41
  "@molecule/api-rate-limit": "1.0.1",
42
42
  "@molecule/api-two-factor": "1.0.1",
@@ -54,7 +54,7 @@
54
54
  "@molecule/api-locales-user": "^1.0.1",
55
55
  "@molecule/api-locales-user-payments": "^1.0.1",
56
56
  "@molecule/api-password": "^1.0.1",
57
- "@molecule/api-payments": "^1.0.1",
57
+ "@molecule/api-payments": "^1.1.0",
58
58
  "@molecule/api-push-notifications": "^1.0.1",
59
59
  "@molecule/api-rate-limit": "^1.0.1",
60
60
  "@molecule/api-resource": "^1.0.1",