@arnaudjnn/billing-tools 0.58.1 → 0.59.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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/subscription.d.ts +115 -0
- package/dist/subscription.d.ts.map +1 -0
- package/dist/subscription.js +346 -0
- package/dist/subscription.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export { getWorkOS } from "./workos.js";
|
|
|
5
5
|
export { createWorkOSOrgMirror, ALL_MEMBERSHIP_STATUSES, type WorkOSOrgMirror, type WorkOSOrgMirrorOptions, } from "./org-mirror.js";
|
|
6
6
|
export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getOrgSubscription, getTokenBalance, deductTokens, creditTokens, usageSince, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, type StripePrice, } from "./billing.js";
|
|
7
7
|
export { ensurePlans, resolvePlanPrices, invalidatePlanPrices, migrateSubscriptions, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit, seatTypeLimit, planSale, definePlans, isLegacyPlan, normalizePlan, normalizePlans, planModel, plansWhere, selfServePlans, defaultBasket, validateBasket, describeBasketProblem, grantFor, poolSizeOf, packSizeOf, exhaustedPolicy, cycleWindowFor, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, type PlanDef, type SeatTypeDef, type PlansConfig, type BillingInterval, type EnsuredPrice, type PlanPrices, type MigratedSubscription, type MigrateSubscriptionsResult, type PlanCatalog, type PlanSpec, type PlanModel, type PlanDisplay, type PlanLimits, type SeatTypeSpec, type SeatTypeDisplay, type NormalSeatType, type Sells, type Grant, type Cap, type Exhausted, type Replenish, type Sale, type Money, type IntervalPrice, type Quantities as PlanQuantities, type BasketProblem, type CycleWindow, } from "./plans.js";
|
|
8
|
+
export { changePlan, cancelPlan, planActions, planRank, PlanChangeError, type PlanChangeResult, type PlanChangeKind, type PlanChangeTiming, type PlanChangeErrorCode, type ProrationPolicy, type PlanActions, } from "./subscription.js";
|
|
8
9
|
export { derivePlanViews, derivePlanView, renderPlansMarkdown, renderRateCardMarkdown, type PlanView, type PlanPriceView, type SeatRowView, type CtaView, type MoneyView, type DerivePlanViewsOptions, type MarkdownOptions, } from "./pricing.js";
|
|
9
10
|
export { resolveAllowance, fundingFor, describeDenial, type AllowanceState, type AllowanceInput, type FundingDecision, type DenialReason, } from "./allowance.js";
|
|
10
11
|
export { stripeBalanceUsageLedger, stripeMeterUsageLedger, ensureMeters, invalidateMeters, USAGE_METER_EVENT, type UsageLedger, type UsageEvent, type UsageQuery, type FundingSource, } from "./usage-ledger.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGnE,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,WAAW,CAAC;AAMnB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,QAAQ,EAIR,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,EACT,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,KAAK,EACV,KAAK,GAAG,EACR,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,IAAI,EACT,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,10 @@ export { ensurePlans, resolvePlanPrices, invalidatePlanPrices, migrateSubscripti
|
|
|
18
18
|
// it includes, how it's replenished, whether it can be bought) + presentation.
|
|
19
19
|
// The legacy PlanDef keeps working — `normalizePlans` maps it.
|
|
20
20
|
definePlans, isLegacyPlan, normalizePlan, normalizePlans, planModel, plansWhere, selfServePlans, defaultBasket, validateBasket, describeBasketProblem, grantFor, poolSizeOf, packSizeOf, exhaustedPolicy, cycleWindowFor, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, } from "./plans.js";
|
|
21
|
+
// The subscription lifecycle: one entry point for up, down and off. Before this,
|
|
22
|
+
// every plan or seat change opened a fresh Checkout Session and created a SECOND
|
|
23
|
+
// subscription, so the customer was billed twice.
|
|
24
|
+
export { changePlan, cancelPlan, planActions, planRank, PlanChangeError, } from "./subscription.js";
|
|
21
25
|
// Pricing view models: the plan config turned into what a surface renders. Also
|
|
22
26
|
// available as the leaf entry point `@arnaudjnn/billing-tools/pricing`, which
|
|
23
27
|
// pulls in neither Stripe nor WorkOS — so a client component and a docs
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type BillingInterval, type PlanCatalog, type PlanModel, type Quantities } from "./plans.js";
|
|
2
|
+
import type { BillingAdapter, ResolvedConfig } from "./types.js";
|
|
3
|
+
export type PlanChangeTiming = "auto" | "now" | "period_end";
|
|
4
|
+
export type ProrationPolicy = "next_invoice" | "invoice_now" | "none";
|
|
5
|
+
export type PlanChangeKind =
|
|
6
|
+
/** No live subscription: a Checkout Session was opened instead. */
|
|
7
|
+
"checkout"
|
|
8
|
+
/** Applied immediately. */
|
|
9
|
+
| "updated"
|
|
10
|
+
/** Takes effect at the end of the paid period. */
|
|
11
|
+
| "scheduled"
|
|
12
|
+
/** Ends at the end of the paid period (a downgrade to a free plan is this). */
|
|
13
|
+
| "canceling"
|
|
14
|
+
/** A pending cancellation was called off. */
|
|
15
|
+
| "resumed"
|
|
16
|
+
/** Already where it was asked to be. */
|
|
17
|
+
| "noop";
|
|
18
|
+
export interface PlanChangeResult {
|
|
19
|
+
kind: PlanChangeKind;
|
|
20
|
+
customerId: string | null;
|
|
21
|
+
subscriptionId: string | null;
|
|
22
|
+
/** The plan in force NOW (unchanged for `scheduled` / `canceling`). */
|
|
23
|
+
plan: string | null;
|
|
24
|
+
status: string | null;
|
|
25
|
+
/** ISO, for `scheduled` / `canceling` — when it takes effect. */
|
|
26
|
+
effectiveAt: string | null;
|
|
27
|
+
/** `checkout` only: mount these with BillingCheckoutSessionProvider. */
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
clientSecret?: string | null;
|
|
30
|
+
}
|
|
31
|
+
export type PlanChangeErrorCode = "multiple_subscriptions" | "unknown_plan" | "not_purchasable" | "invalid_basket" | "needs_return_url" | "no_customer";
|
|
32
|
+
export declare class PlanChangeError extends Error {
|
|
33
|
+
readonly code: PlanChangeErrorCode;
|
|
34
|
+
readonly detail?: unknown | undefined;
|
|
35
|
+
constructor(code: PlanChangeErrorCode, message: string, detail?: unknown | undefined);
|
|
36
|
+
}
|
|
37
|
+
/** What a plan costs per month for its default basket — the ordering a UI means
|
|
38
|
+
* by "higher" and "lower". A quoted plan sorts above every priced one. */
|
|
39
|
+
export declare function planRank(model: PlanModel): number;
|
|
40
|
+
export interface PlanActions {
|
|
41
|
+
/** The next plan up, or null when already at the top. */
|
|
42
|
+
upgradeTo: string | null;
|
|
43
|
+
/** The next plan down, or null when already at the bottom. */
|
|
44
|
+
downgradeTo: string | null;
|
|
45
|
+
/** Whether there is a paid subscription to end. False on a free plan — there
|
|
46
|
+
* is nothing to cancel, so the action shouldn't be offered. */
|
|
47
|
+
canCancel: boolean;
|
|
48
|
+
/** The plan a cancellation lands on. */
|
|
49
|
+
cancelTo: string | null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Which of upgrade / downgrade / cancel apply to an org on `currentPlan`.
|
|
53
|
+
*
|
|
54
|
+
* Pure, so a UI can hide what doesn't apply instead of offering an action that
|
|
55
|
+
* will be refused: no "upgrade" on the top plan, no "cancel" on a free one.
|
|
56
|
+
*/
|
|
57
|
+
export declare function planActions(plans: PlanCatalog, currentPlan: string | null): PlanActions;
|
|
58
|
+
/**
|
|
59
|
+
* Move an org to `to.plan` — up, down, or off.
|
|
60
|
+
*
|
|
61
|
+
* The decision tree, which is why this is one function and not three:
|
|
62
|
+
*
|
|
63
|
+
* no live subscription, paid target → open a Checkout Session
|
|
64
|
+
* live subscription, FREE target → cancel at period end
|
|
65
|
+
* live subscription, same plan, pending cancel → resume
|
|
66
|
+
* live subscription, paid target → update the items; upgrades apply now,
|
|
67
|
+
* downgrades at the period end
|
|
68
|
+
*
|
|
69
|
+
* Proration defaults to `next_invoice` (`create_prorations`): nothing is charged
|
|
70
|
+
* today and the difference rides the next invoice. That is the safe default — no
|
|
71
|
+
* charge today means no SCA challenge, no pending update that expires in ~23h, and
|
|
72
|
+
* a mistake shows up as a wrong line on the next invoice rather than a wrong
|
|
73
|
+
* charge now.
|
|
74
|
+
*/
|
|
75
|
+
export declare function changePlan(adapter: BillingAdapter, orgId: string, opts: {
|
|
76
|
+
plans: PlanCatalog;
|
|
77
|
+
to: {
|
|
78
|
+
plan: string;
|
|
79
|
+
interval?: BillingInterval;
|
|
80
|
+
seats?: Quantities;
|
|
81
|
+
};
|
|
82
|
+
config?: ResolvedConfig;
|
|
83
|
+
currency?: string;
|
|
84
|
+
timing?: PlanChangeTiming;
|
|
85
|
+
proration?: ProrationPolicy;
|
|
86
|
+
/**
|
|
87
|
+
* Manual TaxRate ids. Defaults to the rates already on the subscription's
|
|
88
|
+
* items — which is what stops a newly ADDED seat line being invoiced at 0%
|
|
89
|
+
* tax on an account that computes tax itself rather than with Stripe Tax.
|
|
90
|
+
*/
|
|
91
|
+
taxRates?: string[];
|
|
92
|
+
/** Required for the no-subscription case, which opens a Checkout Session. */
|
|
93
|
+
returnUrl?: string;
|
|
94
|
+
email?: string;
|
|
95
|
+
metadata?: Record<string, string>;
|
|
96
|
+
/** Disambiguates when a customer somehow has more than one live subscription.
|
|
97
|
+
* Without it that case throws rather than guessing which one to change. */
|
|
98
|
+
subscriptionId?: string;
|
|
99
|
+
/** Write the outcome through the adapter as well as letting the sync engine
|
|
100
|
+
* mirror it, so the next render is already correct. Default true. */
|
|
101
|
+
record?: boolean;
|
|
102
|
+
}): Promise<PlanChangeResult>;
|
|
103
|
+
/**
|
|
104
|
+
* End the paid subscription at the end of the period it has been paid for.
|
|
105
|
+
*
|
|
106
|
+
* A named alias over `changePlan` to the free plan, because "cancel" is what the
|
|
107
|
+
* copy says and what the customer means. Reversible: calling `changePlan` back to
|
|
108
|
+
* the current plan resumes it.
|
|
109
|
+
*/
|
|
110
|
+
export declare function cancelPlan(adapter: BillingAdapter, orgId: string, opts: {
|
|
111
|
+
plans: PlanCatalog;
|
|
112
|
+
currency?: string;
|
|
113
|
+
record?: boolean;
|
|
114
|
+
}): Promise<PlanChangeResult>;
|
|
115
|
+
//# sourceMappingURL=subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmBjE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;AAC7D,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,aAAa,GAAG,MAAM,CAAC;AAEtE,MAAM,MAAM,cAAc;AACxB,mEAAmE;AACjE,UAAU;AACZ,2BAA2B;GACzB,SAAS;AACX,kDAAkD;GAChD,WAAW;AACb,+EAA+E;GAC7E,WAAW;AACb,6CAA6C;GAC3C,SAAS;AACX,wCAAwC;GACtC,MAAM,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iEAAiE;IACjE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,mBAAmB,GAC3B,wBAAwB,GACxB,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,aAAa,CAAC;AAElB,qBAAa,eAAgB,SAAQ,KAAK;IAEtC,QAAQ,CAAC,IAAI,EAAE,mBAAmB;IAElC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO;gBAFhB,IAAI,EAAE,mBAAmB,EAClC,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,OAAO,YAAA;CAK5B;AA4BD;2EAC2E;AAC3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAKjD;AAED,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;oEACgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAiBvF;AAcD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IACrE,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;gFAC4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;0EACsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,OAAO,CAAC,gBAAgB,CAAC,CA0P3B;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,OAAO,CAAC,gBAAgB,CAAC,CAI3B"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { ensureStripeCustomer, getBillingCustomerId, getStripe } from "./billing.js";
|
|
2
|
+
import { createCheckoutSession } from "./checkout.js";
|
|
3
|
+
import { defaultBasket, normalizePlans, planModel, resolvePlanPrices, validateBasket, describeBasketProblem, lookupKeyFor, } from "./plans.js";
|
|
4
|
+
export class PlanChangeError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
detail;
|
|
7
|
+
constructor(code, message, detail) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.detail = detail;
|
|
11
|
+
this.name = "PlanChangeError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Statuses that are still being billed, so still worth changing. A canceled or
|
|
15
|
+
* incomplete_expired subscription will never be invoiced again. */
|
|
16
|
+
const LIVE_STATUSES = new Set([
|
|
17
|
+
"active",
|
|
18
|
+
"trialing",
|
|
19
|
+
"past_due",
|
|
20
|
+
"unpaid",
|
|
21
|
+
"paused",
|
|
22
|
+
]);
|
|
23
|
+
/**
|
|
24
|
+
* The subscription period, read off the ITEMS.
|
|
25
|
+
*
|
|
26
|
+
* `current_period_start/_end` moved off `Subscription` onto `SubscriptionItem` in
|
|
27
|
+
* the API version this SDK pins, so reading them from the subscription yields
|
|
28
|
+
* `undefined` — and this is the date a "cancels on …" or "changes on …" line has
|
|
29
|
+
* to show. Widest window, since items can differ.
|
|
30
|
+
*/
|
|
31
|
+
function periodEndOf(sub) {
|
|
32
|
+
const ends = (sub.items?.data ?? [])
|
|
33
|
+
.map((i) => i.current_period_end)
|
|
34
|
+
.filter((v) => !!v);
|
|
35
|
+
return ends.length ? new Date(Math.max(...ends) * 1000).toISOString() : null;
|
|
36
|
+
}
|
|
37
|
+
/** What a plan costs per month for its default basket — the ordering a UI means
|
|
38
|
+
* by "higher" and "lower". A quoted plan sorts above every priced one. */
|
|
39
|
+
export function planRank(model) {
|
|
40
|
+
if (model.sale === "quote")
|
|
41
|
+
return Number.MAX_SAFE_INTEGER;
|
|
42
|
+
const basket = defaultBasket(model);
|
|
43
|
+
if (model.sells.kind === "flat")
|
|
44
|
+
return model.sells.price.monthly;
|
|
45
|
+
return model.seatTypes.reduce((sum, s) => sum + (basket[s.key] ?? 0) * s.price.monthly, 0);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Which of upgrade / downgrade / cancel apply to an org on `currentPlan`.
|
|
49
|
+
*
|
|
50
|
+
* Pure, so a UI can hide what doesn't apply instead of offering an action that
|
|
51
|
+
* will be refused: no "upgrade" on the top plan, no "cancel" on a free one.
|
|
52
|
+
*/
|
|
53
|
+
export function planActions(plans, currentPlan) {
|
|
54
|
+
const models = normalizePlans(plans)
|
|
55
|
+
.filter((m) => m.sale !== "legacy" && !m.display?.hidden)
|
|
56
|
+
.sort((a, b) => planRank(a) - planRank(b));
|
|
57
|
+
const free = models.find((m) => m.sale === "free") ?? null;
|
|
58
|
+
const current = currentPlan ? models.find((m) => m.key === currentPlan) : null;
|
|
59
|
+
// No recorded plan behaves as the free tier: nothing is being billed.
|
|
60
|
+
const rank = current ? planRank(current) : (free ? planRank(free) : 0);
|
|
61
|
+
const above = models.filter((m) => planRank(m) > rank);
|
|
62
|
+
const below = models.filter((m) => planRank(m) < rank);
|
|
63
|
+
const isPaid = current ? current.sells.kind !== "nothing" && current.sale !== "free" : false;
|
|
64
|
+
return {
|
|
65
|
+
upgradeTo: above[0]?.key ?? null,
|
|
66
|
+
downgradeTo: below[below.length - 1]?.key ?? null,
|
|
67
|
+
canCancel: isPaid,
|
|
68
|
+
cancelTo: free?.key ?? null,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async function liveSubscriptions(customerId) {
|
|
72
|
+
const out = [];
|
|
73
|
+
for await (const sub of getStripe().subscriptions.list({
|
|
74
|
+
customer: customerId,
|
|
75
|
+
status: "all",
|
|
76
|
+
limit: 100,
|
|
77
|
+
})) {
|
|
78
|
+
if (LIVE_STATUSES.has(sub.status))
|
|
79
|
+
out.push(sub);
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Move an org to `to.plan` — up, down, or off.
|
|
85
|
+
*
|
|
86
|
+
* The decision tree, which is why this is one function and not three:
|
|
87
|
+
*
|
|
88
|
+
* no live subscription, paid target → open a Checkout Session
|
|
89
|
+
* live subscription, FREE target → cancel at period end
|
|
90
|
+
* live subscription, same plan, pending cancel → resume
|
|
91
|
+
* live subscription, paid target → update the items; upgrades apply now,
|
|
92
|
+
* downgrades at the period end
|
|
93
|
+
*
|
|
94
|
+
* Proration defaults to `next_invoice` (`create_prorations`): nothing is charged
|
|
95
|
+
* today and the difference rides the next invoice. That is the safe default — no
|
|
96
|
+
* charge today means no SCA challenge, no pending update that expires in ~23h, and
|
|
97
|
+
* a mistake shows up as a wrong line on the next invoice rather than a wrong
|
|
98
|
+
* charge now.
|
|
99
|
+
*/
|
|
100
|
+
export async function changePlan(adapter, orgId, opts) {
|
|
101
|
+
const stripe = getStripe();
|
|
102
|
+
const target = planModel(opts.plans, opts.to.plan);
|
|
103
|
+
if (!target)
|
|
104
|
+
throw new PlanChangeError("unknown_plan", `Unknown plan "${opts.to.plan}"`);
|
|
105
|
+
const interval = opts.to.interval ?? (target.intervals.includes("monthly") ? "monthly" : "yearly");
|
|
106
|
+
const targetIsFree = target.sells.kind === "nothing" || target.sale === "free";
|
|
107
|
+
const record = opts.record ?? true;
|
|
108
|
+
let customerId = await getBillingCustomerId(adapter, orgId);
|
|
109
|
+
if (!customerId && !targetIsFree) {
|
|
110
|
+
if (!opts.config)
|
|
111
|
+
throw new PlanChangeError("no_customer", "No Stripe customer, and no config to create one with");
|
|
112
|
+
customerId = await ensureStripeCustomer(adapter, orgId, opts.email, opts.config);
|
|
113
|
+
}
|
|
114
|
+
if (!customerId) {
|
|
115
|
+
// Nothing was ever billed and nothing is being asked for.
|
|
116
|
+
if (record)
|
|
117
|
+
await adapter.setSubscription?.(orgId, { plan: target.key, status: null, subscriptionId: null, periodEnd: null });
|
|
118
|
+
return { kind: "noop", customerId: null, subscriptionId: null, plan: target.key, status: null, effectiveAt: null };
|
|
119
|
+
}
|
|
120
|
+
const live = await liveSubscriptions(customerId);
|
|
121
|
+
const sub = opts.subscriptionId
|
|
122
|
+
? live.find((s) => s.id === opts.subscriptionId)
|
|
123
|
+
: live.length > 1
|
|
124
|
+
? undefined
|
|
125
|
+
: live[0];
|
|
126
|
+
if (!sub && live.length > 1) {
|
|
127
|
+
throw new PlanChangeError("multiple_subscriptions", `Customer ${customerId} has ${live.length} live subscriptions; pass subscriptionId to say which one to change`, live.map((s) => s.id));
|
|
128
|
+
}
|
|
129
|
+
// ── No live subscription: open a checkout ─────────────────────────────────
|
|
130
|
+
if (!sub) {
|
|
131
|
+
if (targetIsFree) {
|
|
132
|
+
if (record) {
|
|
133
|
+
await adapter.setSubscription?.(orgId, { plan: target.key, status: null, subscriptionId: null, periodEnd: null });
|
|
134
|
+
}
|
|
135
|
+
return { kind: "noop", customerId, subscriptionId: null, plan: target.key, status: null, effectiveAt: null };
|
|
136
|
+
}
|
|
137
|
+
const problems = validateBasket(opts.plans, { plan: target.key, interval, seats: opts.to.seats });
|
|
138
|
+
if (problems.length) {
|
|
139
|
+
throw new PlanChangeError("invalid_basket", problems.map(describeBasketProblem).join("; "), problems);
|
|
140
|
+
}
|
|
141
|
+
if (!opts.returnUrl) {
|
|
142
|
+
throw new PlanChangeError("needs_return_url", "No live subscription, so a Checkout Session is needed — pass returnUrl");
|
|
143
|
+
}
|
|
144
|
+
const session = await createCheckoutSession({
|
|
145
|
+
plans: opts.plans,
|
|
146
|
+
plan: target.key,
|
|
147
|
+
interval,
|
|
148
|
+
seats: opts.to.seats ?? defaultBasket(target),
|
|
149
|
+
returnUrl: opts.returnUrl,
|
|
150
|
+
customerId,
|
|
151
|
+
currency: opts.currency,
|
|
152
|
+
taxRates: opts.taxRates,
|
|
153
|
+
reuse: true,
|
|
154
|
+
// `org_id`, the key every sync handler reads. Without it the subscription
|
|
155
|
+
// this session creates is invisible to plan mirroring and to grants.
|
|
156
|
+
metadata: { ...opts.metadata, org_id: orgId, plan: target.key },
|
|
157
|
+
});
|
|
158
|
+
return {
|
|
159
|
+
kind: "checkout",
|
|
160
|
+
customerId,
|
|
161
|
+
subscriptionId: null,
|
|
162
|
+
plan: null,
|
|
163
|
+
status: null,
|
|
164
|
+
effectiveAt: null,
|
|
165
|
+
sessionId: session.sessionId,
|
|
166
|
+
clientSecret: session.clientSecret,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const effectiveAt = periodEndOf(sub);
|
|
170
|
+
const currentPlanKey = sub.metadata?.plan ?? null;
|
|
171
|
+
// ── A pending cancellation being called off ───────────────────────────────
|
|
172
|
+
if (sub.cancel_at_period_end && currentPlanKey && currentPlanKey === target.key) {
|
|
173
|
+
const resumed = await stripe.subscriptions.update(sub.id, { cancel_at_period_end: false });
|
|
174
|
+
if (record) {
|
|
175
|
+
await adapter.setSubscription?.(orgId, {
|
|
176
|
+
plan: target.key,
|
|
177
|
+
status: resumed.status,
|
|
178
|
+
subscriptionId: resumed.id,
|
|
179
|
+
periodEnd: periodEndOf(resumed),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return { kind: "resumed", customerId, subscriptionId: sub.id, plan: target.key, status: resumed.status, effectiveAt: periodEndOf(resumed) };
|
|
183
|
+
}
|
|
184
|
+
// ── Down to a free plan: cancel at the end of the paid period ─────────────
|
|
185
|
+
//
|
|
186
|
+
// The cheap primitive, not a schedule: it is one field, reversible with
|
|
187
|
+
// `false`, and the customer keeps what they paid for until it runs out.
|
|
188
|
+
if (targetIsFree) {
|
|
189
|
+
if (sub.cancel_at_period_end) {
|
|
190
|
+
return { kind: "canceling", customerId, subscriptionId: sub.id, plan: currentPlanKey, status: sub.status, effectiveAt };
|
|
191
|
+
}
|
|
192
|
+
const canceling = await stripe.subscriptions.update(sub.id, {
|
|
193
|
+
cancel_at_period_end: true,
|
|
194
|
+
metadata: { ...sub.metadata, org_id: orgId, pending_plan: target.key },
|
|
195
|
+
});
|
|
196
|
+
if (record) {
|
|
197
|
+
// The plan in force does NOT change yet — writing the downgraded plan now
|
|
198
|
+
// would remove the customer's access a month before they stop paying.
|
|
199
|
+
await adapter.setOrgMetadata?.(orgId, {
|
|
200
|
+
pendingPlan: target.key,
|
|
201
|
+
pendingPlanAt: periodEndOf(canceling),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
kind: "canceling",
|
|
206
|
+
customerId,
|
|
207
|
+
subscriptionId: sub.id,
|
|
208
|
+
plan: currentPlanKey,
|
|
209
|
+
status: canceling.status,
|
|
210
|
+
effectiveAt: periodEndOf(canceling),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// ── A paid target: diff the items ─────────────────────────────────────────
|
|
214
|
+
const seats = opts.to.seats ?? defaultBasket(target);
|
|
215
|
+
const problems = validateBasket(opts.plans, { plan: target.key, interval, seats });
|
|
216
|
+
if (problems.length) {
|
|
217
|
+
throw new PlanChangeError("invalid_basket", problems.map(describeBasketProblem).join("; "), problems);
|
|
218
|
+
}
|
|
219
|
+
const prices = await resolvePlanPrices(opts.plans, { currency: opts.currency });
|
|
220
|
+
const desired = new Map();
|
|
221
|
+
if (target.sells.kind === "flat") {
|
|
222
|
+
const key = lookupKeyFor(target.key, interval);
|
|
223
|
+
const id = prices.get(key);
|
|
224
|
+
if (!id)
|
|
225
|
+
throw new PlanChangeError("invalid_basket", `No Stripe price for ${key}`);
|
|
226
|
+
desired.set(id, 1);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
for (const [seatType, qty] of Object.entries(seats)) {
|
|
230
|
+
if (qty <= 0)
|
|
231
|
+
continue;
|
|
232
|
+
const key = lookupKeyFor(target.key, interval, seatType);
|
|
233
|
+
const id = prices.get(key);
|
|
234
|
+
if (!id)
|
|
235
|
+
throw new PlanChangeError("invalid_basket", `No Stripe price for ${key}`);
|
|
236
|
+
desired.set(id, qty);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Tax rates already on the subscription carry onto ADDED lines. Without this, an
|
|
240
|
+
// account that computes its own tax (manual TaxRates rather than Stripe Tax)
|
|
241
|
+
// invoices a newly added line at 0%.
|
|
242
|
+
const carried = opts.taxRates ??
|
|
243
|
+
[...new Set(sub.items.data.flatMap((i) => (i.tax_rates ?? []).map((r) => r.id)))];
|
|
244
|
+
const items = [];
|
|
245
|
+
const seen = new Set();
|
|
246
|
+
for (const item of sub.items.data) {
|
|
247
|
+
const want = desired.get(item.price.id);
|
|
248
|
+
if (want != null) {
|
|
249
|
+
seen.add(item.price.id);
|
|
250
|
+
if ((item.quantity ?? 1) !== want)
|
|
251
|
+
items.push({ id: item.id, quantity: want });
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
items.push({ id: item.id, deleted: true });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
for (const [priceId, quantity] of desired) {
|
|
258
|
+
if (!seen.has(priceId)) {
|
|
259
|
+
items.push({ price: priceId, quantity, ...(carried.length ? { tax_rates: carried } : {}) });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (items.length === 0) {
|
|
263
|
+
return { kind: "noop", customerId, subscriptionId: sub.id, plan: currentPlanKey ?? target.key, status: sub.status, effectiveAt };
|
|
264
|
+
}
|
|
265
|
+
const proration = opts.proration ?? "next_invoice";
|
|
266
|
+
const proration_behavior = proration === "invoice_now" ? "always_invoice" : proration === "none" ? "none" : "create_prorations";
|
|
267
|
+
// Direction decides the default timing: pay more now, pay less at the boundary.
|
|
268
|
+
const currentModel = currentPlanKey ? planModel(opts.plans, currentPlanKey) : null;
|
|
269
|
+
const isDowngrade = currentModel ? planRank(target) < planRank(currentModel) : false;
|
|
270
|
+
const timing = opts.timing ?? "auto";
|
|
271
|
+
const applyAtPeriodEnd = timing === "period_end" || (timing === "auto" && isDowngrade);
|
|
272
|
+
if (applyAtPeriodEnd) {
|
|
273
|
+
// A schedule, because a downgrade must not take effect before the paid period
|
|
274
|
+
// it replaces has run out.
|
|
275
|
+
const schedule = sub.schedule
|
|
276
|
+
? await stripe.subscriptionSchedules.retrieve(sub.schedule)
|
|
277
|
+
: await stripe.subscriptionSchedules.create({ from_subscription: sub.id });
|
|
278
|
+
const currentPhase = schedule.phases[schedule.phases.length - 1];
|
|
279
|
+
await stripe.subscriptionSchedules.update(schedule.id, {
|
|
280
|
+
end_behavior: "release",
|
|
281
|
+
proration_behavior: "none",
|
|
282
|
+
phases: [
|
|
283
|
+
{
|
|
284
|
+
items: currentPhase.items.map((i) => ({
|
|
285
|
+
price: typeof i.price === "string" ? i.price : i.price.id,
|
|
286
|
+
quantity: i.quantity ?? 1,
|
|
287
|
+
})),
|
|
288
|
+
start_date: currentPhase.start_date,
|
|
289
|
+
end_date: currentPhase.end_date,
|
|
290
|
+
...(carried.length ? { default_tax_rates: carried } : {}),
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
items: [...desired].map(([price, quantity]) => ({ price, quantity })),
|
|
294
|
+
...(carried.length ? { default_tax_rates: carried } : {}),
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
});
|
|
298
|
+
if (record) {
|
|
299
|
+
await adapter.setOrgMetadata?.(orgId, { pendingPlan: target.key, pendingPlanAt: effectiveAt });
|
|
300
|
+
}
|
|
301
|
+
return { kind: "scheduled", customerId, subscriptionId: sub.id, plan: currentPlanKey, status: sub.status, effectiveAt };
|
|
302
|
+
}
|
|
303
|
+
const updated = await stripe.subscriptions.update(sub.id, {
|
|
304
|
+
items,
|
|
305
|
+
proration_behavior,
|
|
306
|
+
// The live-subscription equivalent of `default_incomplete`: the change
|
|
307
|
+
// applies only once the invoice it generates is paid, and the original
|
|
308
|
+
// subscription is untouched if it never is.
|
|
309
|
+
...(proration === "invoice_now" ? { payment_behavior: "pending_if_incomplete" } : {}),
|
|
310
|
+
metadata: { ...sub.metadata, org_id: orgId, plan: target.key },
|
|
311
|
+
},
|
|
312
|
+
// Keyed on the target, so a double-clicked Confirm inside Stripe's 24h window
|
|
313
|
+
// is a no-op rather than a second proration invoice.
|
|
314
|
+
{ idempotencyKey: `plan:${sub.id}:${target.key}:${interval}:${JSON.stringify([...desired].sort())}:${timing}:${proration}` });
|
|
315
|
+
if (record) {
|
|
316
|
+
await adapter.setSubscription?.(orgId, {
|
|
317
|
+
plan: target.key,
|
|
318
|
+
status: updated.status,
|
|
319
|
+
subscriptionId: updated.id,
|
|
320
|
+
periodEnd: periodEndOf(updated),
|
|
321
|
+
});
|
|
322
|
+
await adapter.setOrgMetadata?.(orgId, { pendingPlan: null, pendingPlanAt: null });
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
kind: "updated",
|
|
326
|
+
customerId,
|
|
327
|
+
subscriptionId: updated.id,
|
|
328
|
+
plan: target.key,
|
|
329
|
+
status: updated.status,
|
|
330
|
+
effectiveAt: periodEndOf(updated),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* End the paid subscription at the end of the period it has been paid for.
|
|
335
|
+
*
|
|
336
|
+
* A named alias over `changePlan` to the free plan, because "cancel" is what the
|
|
337
|
+
* copy says and what the customer means. Reversible: calling `changePlan` back to
|
|
338
|
+
* the current plan resumes it.
|
|
339
|
+
*/
|
|
340
|
+
export async function cancelPlan(adapter, orgId, opts) {
|
|
341
|
+
const free = normalizePlans(opts.plans).find((m) => m.sale === "free");
|
|
342
|
+
if (!free)
|
|
343
|
+
throw new PlanChangeError("unknown_plan", "No free plan to cancel down to");
|
|
344
|
+
return changePlan(adapter, orgId, { ...opts, to: { plan: free.key } });
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../src/subscription.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arnaudjnn/billing-tools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
4
4
|
"description": "The get-paid engine for Stripe + WorkOS apps, for humans and AI agents. Drop-in API-key auth, token/credit + subscription billing, auth.md agent registration, and MPP machine payments, as MCP tools, a REST API, and a CLI. Framework-agnostic, storage-pluggable.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Arnaud Jeannin",
|