@arnaudjnn/billing-tools 0.48.0 → 0.49.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,23 @@
1
+ import type { BillingAdapter } from "./types.js";
2
+ export type BillingProfile = {
3
+ /** Where Stripe mails invoices. Null when never overridden. */
4
+ invoiceEmail: string | null;
5
+ /** Company name printed on the invoice. Null when never overridden. */
6
+ companyName: string | null;
7
+ };
8
+ /** Stripe's documented limits. Longer values are rejected by the API. */
9
+ export declare const INVOICE_EMAIL_MAX = 254;
10
+ export declare const COMPANY_NAME_MAX = 64;
11
+ export declare function getBillingProfile(adapter: BillingAdapter, orgId: string): Promise<BillingProfile>;
12
+ /**
13
+ * Set or clear the invoice recipient and company name.
14
+ *
15
+ * Only the keys you pass are touched, so saving one field can't silently wipe
16
+ * the other. Passing null (or an empty string) clears that field back to the
17
+ * app's default.
18
+ */
19
+ export declare function updateBillingProfile(adapter: BillingAdapter, orgId: string, patch: {
20
+ invoiceEmail?: string | null;
21
+ companyName?: string | null;
22
+ }): Promise<BillingProfile>;
23
+ //# sourceMappingURL=billing-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing-profile.d.ts","sourceRoot":"","sources":["../src/billing-profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAcjD,MAAM,MAAM,cAAc,GAAG;IAC3B,+DAA+D;IAC/D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,uEAAuE;IACvE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAIF,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAUzB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACnE,OAAO,CAAC,cAAc,CAAC,CAqCzB"}
@@ -0,0 +1,60 @@
1
+ import { getStripe } from "./billing.js";
2
+ const EMPTY = { invoiceEmail: null, companyName: null };
3
+ /** Stripe's documented limits. Longer values are rejected by the API. */
4
+ export const INVOICE_EMAIL_MAX = 254;
5
+ export const COMPANY_NAME_MAX = 64;
6
+ export async function getBillingProfile(adapter, orgId) {
7
+ const customerId = await adapter.getBillingCustomerId(orgId);
8
+ if (!customerId)
9
+ return EMPTY;
10
+ const customer = await getStripe().customers.retrieve(customerId);
11
+ if (customer.deleted)
12
+ return EMPTY;
13
+ return {
14
+ invoiceEmail: customer.email || null,
15
+ companyName: customer.name || null,
16
+ };
17
+ }
18
+ /**
19
+ * Set or clear the invoice recipient and company name.
20
+ *
21
+ * Only the keys you pass are touched, so saving one field can't silently wipe
22
+ * the other. Passing null (or an empty string) clears that field back to the
23
+ * app's default.
24
+ */
25
+ export async function updateBillingProfile(adapter, orgId, patch) {
26
+ const customerId = await adapter.getBillingCustomerId(orgId);
27
+ if (!customerId)
28
+ throw new Error("No billing customer for this organization");
29
+ // Stripe clears these with an EMPTY STRING, not null — the SDK types reject
30
+ // null, and sending it would be a no-op if they didn't.
31
+ const update = {};
32
+ if (patch.invoiceEmail !== undefined) {
33
+ const email = patch.invoiceEmail?.trim() || null;
34
+ if (email && email.length > INVOICE_EMAIL_MAX) {
35
+ throw new Error(`Email must be at most ${INVOICE_EMAIL_MAX} characters`);
36
+ }
37
+ // Deliberately shallow: a full RFC check belongs to whoever renders the
38
+ // field, and Stripe rejects malformed addresses anyway. This only catches
39
+ // the case that would otherwise silently mail invoices nowhere.
40
+ if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
41
+ throw new Error("That doesn't look like an email address");
42
+ }
43
+ update.email = email ?? "";
44
+ }
45
+ if (patch.companyName !== undefined) {
46
+ const name = patch.companyName?.trim() || null;
47
+ if (name && name.length > COMPANY_NAME_MAX) {
48
+ throw new Error(`Name must be at most ${COMPANY_NAME_MAX} characters`);
49
+ }
50
+ update.name = name ?? "";
51
+ }
52
+ if (Object.keys(update).length === 0)
53
+ return getBillingProfile(adapter, orgId);
54
+ const customer = await getStripe().customers.update(customerId, update);
55
+ return {
56
+ invoiceEmail: customer.email || null,
57
+ companyName: customer.name || null,
58
+ };
59
+ }
60
+ //# sourceMappingURL=billing-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing-profile.js","sourceRoot":"","sources":["../src/billing-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAsBzC,MAAM,KAAK,GAAmB,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAExE,yEAAyE;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,KAAa;IAEb,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;QACpC,WAAW,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAuB,EACvB,KAAa,EACb,KAAoE;IAEpE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAE9E,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,MAAM,GAAsC,EAAE,CAAC;IAErD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QACjD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,yBAAyB,iBAAiB,aAAa,CAAC,CAAC;QAC3E,CAAC;QACD,wEAAwE;QACxE,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,KAAK,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QAC/C,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,wBAAwB,gBAAgB,aAAa,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE/E,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACxE,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI;QACpC,WAAW,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI;KACnC,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export type { BillingAdapter, BillingUser, ApiKeyInfo, BillingConfig, ResolvedConfig, ToolResult, ToolErrorResult, } from "./types.js";
2
2
  export { resolveConfig, internalDomainsFromEnv } from "./types.js";
3
3
  export { authContext, runWithAuth, runWithResolvedOrg, enforceAccess, enforceTokens, } from "./auth.js";
4
+ export { getWorkOS } from "./workos.js";
5
+ export { createWorkOSOrgMirror, ALL_MEMBERSHIP_STATUSES, type WorkOSOrgMirror, type WorkOSOrgMirrorOptions, } from "./org-mirror.js";
4
6
  export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getTokenBalance, deductTokens, creditTokens, usageSince, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, type StripePrice, } from "./billing.js";
5
7
  export { ensurePlans, resolvePlanPrices, invalidatePlanPrices, planPriceId, planForPriceId, seatTypeForPriceId, seatLimit, includedTokens, includedTokensByType, lookupKeyFor, DEFAULT_SEAT_TYPES, type PlanDef, type SeatTypeDef, type PlansConfig, type BillingInterval, type EnsuredPrice, type PlanPrices, } from "./plans.js";
6
8
  export { meterUsage, createMeter, createApiMeterGuard, type MeterCaller, type MeterInput, type MeterResult, type MeterConfig, type MeterCallOpts, type Meter, type ApiMeterGuard, } from "./metering.js";
@@ -36,4 +38,6 @@ export type { BillingSession, SessionUser } from "./session.js";
36
38
  export type { PlanSource } from "./session.js";
37
39
  export { listPaymentMethods, createCardSetupIntent, setDefaultPaymentMethod, detachPaymentMethod, } from "./payment-methods.js";
38
40
  export type { SavedCard } from "./payment-methods.js";
41
+ export { getBillingProfile, updateBillingProfile, INVOICE_EMAIL_MAX, COMPANY_NAME_MAX, } from "./billing-profile.js";
42
+ export type { BillingProfile } from "./billing-profile.js";
39
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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,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,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,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,GAChB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AAIvB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,cAAc,EACd,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGjE,OAAO,EACL,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGlF,OAAO,EACL,iBAAiB,EACjB,eAAe,EAGf,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,2BAA2B,GACjC,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAGvF,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG/E,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,gBAAgB,GACtB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EACL,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,6BAA6B,EAC7B,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,14 @@
2
2
  export { resolveConfig, internalDomainsFromEnv } from "./types.js";
3
3
  // Auth engine
4
4
  export { authContext, runWithAuth, runWithResolvedOrg, enforceAccess, enforceTokens, } from "./auth.js";
5
+ // The two SDK clients. Both are memoised singletons that read the env lazily,
6
+ // and they are the only constructors anywhere — including in consuming apps.
7
+ // A second `new WorkOS(...)` in a route handler is a second client (and, per
8
+ // request, a second connection pool) reading the same key to do the same thing.
9
+ export { getWorkOS } from "./workos.js";
10
+ // Pattern B: the app's own row 1:1 with a WorkOS org. Supplies the adapter's
11
+ // `map` and the membership helpers every mirror app would otherwise rewrite.
12
+ export { createWorkOSOrgMirror, ALL_MEMBERSHIP_STATUSES, } from "./org-mirror.js";
5
13
  // Billing engine (Stripe math)
6
14
  export { getStripe, stripeConfigured, ensureStripeCustomer, getBillingCustomerId, getTokenBalance, deductTokens, creditTokens, usageSince, createTokenCheckoutSession, createBillingPortalSession, getAutoReloadSettings, setAutoReloadSettings, tryAutoReload, listInvoices, listSubscriptionPrices, resolveSubscriptionPrice, } from "./billing.js";
7
15
  // Declarative plans (auto-provision Stripe products/prices from config)
@@ -67,4 +75,5 @@ export { lookupCompany } from "./util/clearout.js";
67
75
  export { createCheckoutSession, checkoutSessionOutcome, expireCheckoutSession, forgetCheckoutSession, createSubscription, updateSubscription, cancelSubscription, } from "./checkout.js";
68
76
  export { resolveSession, ANONYMOUS_SESSION } from "./session.js";
69
77
  export { listPaymentMethods, createCardSetupIntent, setDefaultPaymentMethod, detachPaymentMethod, } from "./payment-methods.js";
78
+ export { getBillingProfile, updateBillingProfile, INVOICE_EMAIL_MAX, COMPANY_NAME_MAX, } from "./billing-profile.js";
70
79
  //# sourceMappingURL=index.js.map
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":"AAAA,mEAAmE;AAYnE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEnE,cAAc;AACd,OAAO,EACL,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,WAAW,CAAC;AAEnB,8EAA8E;AAC9E,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,6EAA6E;AAC7E,6EAA6E;AAC7E,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAGxB,MAAM,iBAAiB,CAAC;AAEzB,+BAA+B;AAC/B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,cAAc,CAAC;AAEtB,wEAAwE;AACxE,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,GAOnB,MAAM,YAAY,CAAC;AAEpB,6EAA6E;AAC7E,iFAAiF;AACjF,OAAO,EACL,UAAU,EACV,WAAW,EACX,mBAAmB,GAQpB,MAAM,eAAe,CAAC;AAEvB,+EAA+E;AAC/E,wDAAwD;AACxD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,cAAc,GAEf,MAAM,YAAY,CAAC;AAEpB,kEAAkE;AAClE,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEjE,8DAA8D;AAC9D,OAAO,EACL,uBAAuB,GAMxB,MAAM,kBAAkB,CAAC;AAE1B,sEAAsE;AACtE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAElF,+EAA+E;AAC/E,OAAO,EACL,iBAAiB,EACjB,eAAe;AACf,2EAA2E;AAC3E,oDAAoD;AACpD,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,GAIjB,MAAM,WAAW,CAAC;AAEnB,4EAA4E;AAC5E,OAAO,EACL,YAAY,GAKb,MAAM,aAAa,CAAC;AAErB,oBAAoB;AACpB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,uBAAuB;AACvB,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAmB,MAAM,eAAe,CAAC;AAEvF,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAE/E,2EAA2E;AAC3E,OAAO,EACL,eAAe,EACf,gBAAgB,GAMjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,GAInB,MAAM,6BAA6B,CAAC;AAErC,8DAA8D;AAC9D,OAAO,EACL,2BAA2B,EAC3B,eAAe,GAMhB,MAAM,4BAA4B,CAAC;AAEpC,gEAAgE;AAChE,gDAAgD;AAChD,OAAO,EACL,gBAAgB,GAKjB,MAAM,wBAAwB,CAAC;AAEhC,uBAAuB;AACvB,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAmB,MAAM,kBAAkB,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAA4B,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAuB,MAAM,qBAAqB,CAAC;AACtF,uEAAuE;AACvE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAC5B,+EAA+E;AAC/E,mEAAmE;AACnE,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,6BAA6B,GAE9B,MAAM,UAAU,CAAC;AAClB,8EAA8E;AAC9E,OAAO,EACL,cAAc,GAGf,MAAM,gBAAgB,CAAC;AACxB,gFAAgF;AAChF,6DAA6D;AAC7D,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GAInB,MAAM,aAAa,CAAC;AAErB,cAAc;AACd,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAGL,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,0EAA0E;AAC1E,6EAA6E;AAC7E,kDAAkD;AAClD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { WorkOSOrgMap } from "./adapters/workos-org.js";
2
+ export interface WorkOSOrgMirrorOptions {
3
+ /** The stored WorkOS org id for a local id, or null if none is recorded yet. */
4
+ readPointer(localId: string): Promise<string | null>;
5
+ /** Persist the pointer. Called whenever it was missing or had drifted. */
6
+ writePointer(localId: string, workosOrgId: string): Promise<void>;
7
+ /** The local id a WorkOS org id maps back to, when the app can answer it from
8
+ * its own store. Return null to fall back to the org's `externalId`. */
9
+ reversePointer?(workosOrgId: string): Promise<string | null>;
10
+ /** Organization name to create with. Receives the local id; default "Workspace". */
11
+ nameFor?(localId: string): Promise<string> | string;
12
+ /** Thrown when a local id has no row at all. Default: a generic Error. */
13
+ onMissing?(localId: string): Error;
14
+ }
15
+ export interface WorkOSOrgMirror extends WorkOSOrgMap {
16
+ /** Create-or-fetch the org backing `localId` and persist the pointer.
17
+ * Idempotent — keyed on `externalId`, so a retry finds rather than duplicates. */
18
+ ensureOrg(localId: string, name?: string): Promise<string>;
19
+ /** The org id for a local id, reconciling on read when the pointer is missing. */
20
+ toWorkosOrgId(localId: string): Promise<string>;
21
+ /** The local id for an org id, via the app's store then the org's externalId. */
22
+ toOrgId(workosOrgId: string): Promise<string | null>;
23
+ /** Rename the org. A deleted org is not an error — nothing to rename. */
24
+ renameOrg(workosOrgId: string, name: string): Promise<void>;
25
+ /** Delete the org. Already gone is success. */
26
+ deleteOrg(workosOrgId: string): Promise<void>;
27
+ /** Add a user with a role, tolerating a membership that already exists. */
28
+ ensureMembership(workosOrgId: string, userId: string, roleSlug: string): Promise<void>;
29
+ /** Membership id for (org, user) across ALL statuses, or null. WorkOS keys
30
+ * membership mutations by this id, not by user id — and the default listing
31
+ * is active-only, which silently hides a pending or deactivated member. */
32
+ membershipId(workosOrgId: string, userId: string): Promise<string | null>;
33
+ }
34
+ /** Every membership status. The WorkOS listing defaults to active-only. */
35
+ export declare const ALL_MEMBERSHIP_STATUSES: readonly ["active", "inactive", "pending"];
36
+ export declare function createWorkOSOrgMirror(opts: WorkOSOrgMirrorOptions): WorkOSOrgMirror;
37
+ //# sourceMappingURL=org-mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-mirror.d.ts","sourceRoot":"","sources":["../src/org-mirror.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAyB7D,MAAM,WAAW,sBAAsB;IACrC,gFAAgF;IAChF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrD,0EAA0E;IAC1E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE;6EACyE;IACzE,cAAc,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,oFAAoF;IACpF,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACpD,0EAA0E;IAC1E,SAAS,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;CACpC;AAED,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD;uFACmF;IACnF,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,kFAAkF;IAClF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,iFAAiF;IACjF,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrD,yEAAyE;IACzE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,+CAA+C;IAC/C,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,2EAA2E;IAC3E,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF;;gFAE4E;IAC5E,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3E;AAED,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,4CAA6C,CAAC;AAElF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAiFnF"}
@@ -0,0 +1,87 @@
1
+ import { ConflictException, NotFoundException } from "@workos-inc/node";
2
+ import { getWorkOS } from "./workos.js";
3
+ /** Every membership status. The WorkOS listing defaults to active-only. */
4
+ export const ALL_MEMBERSHIP_STATUSES = ["active", "inactive", "pending"];
5
+ export function createWorkOSOrgMirror(opts) {
6
+ const workos = () => getWorkOS();
7
+ const ensureOrg = async (localId, name) => {
8
+ const resolvedName = name ?? (opts.nameFor ? await opts.nameFor(localId) : undefined) ?? "Workspace";
9
+ let orgId;
10
+ try {
11
+ orgId = (await workos().organizations.getOrganizationByExternalId(localId)).id;
12
+ }
13
+ catch (e) {
14
+ if (!(e instanceof NotFoundException))
15
+ throw e;
16
+ orgId = (await workos().organizations.createOrganization({
17
+ name: resolvedName,
18
+ externalId: localId,
19
+ })).id;
20
+ }
21
+ await opts.writePointer(localId, orgId);
22
+ return orgId;
23
+ };
24
+ return {
25
+ ensureOrg,
26
+ async toWorkosOrgId(localId) {
27
+ const stored = await opts.readPointer(localId);
28
+ if (stored)
29
+ return stored;
30
+ // No pointer: either it was never written or the row predates the mirror.
31
+ // Reconciling here (rather than throwing) is what makes the pointer a
32
+ // cache of the truth in WorkOS instead of a second source of it.
33
+ return ensureOrg(localId);
34
+ },
35
+ async toOrgId(workosOrgId) {
36
+ const local = await opts.reversePointer?.(workosOrgId);
37
+ if (local)
38
+ return local;
39
+ try {
40
+ return (await workos().organizations.getOrganization(workosOrgId)).externalId ?? null;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ },
46
+ async renameOrg(workosOrgId, name) {
47
+ try {
48
+ await workos().organizations.updateOrganization({ organization: workosOrgId, name });
49
+ }
50
+ catch (e) {
51
+ if (!(e instanceof NotFoundException))
52
+ throw e;
53
+ }
54
+ },
55
+ async deleteOrg(workosOrgId) {
56
+ try {
57
+ await workos().organizations.deleteOrganization(workosOrgId);
58
+ }
59
+ catch (e) {
60
+ if (!(e instanceof NotFoundException))
61
+ throw e;
62
+ }
63
+ },
64
+ async ensureMembership(workosOrgId, userId, roleSlug) {
65
+ try {
66
+ await workos().userManagement.createOrganizationMembership({
67
+ organizationId: workosOrgId,
68
+ userId,
69
+ roleSlug,
70
+ });
71
+ }
72
+ catch (e) {
73
+ if (!(e instanceof ConflictException))
74
+ throw e;
75
+ }
76
+ },
77
+ async membershipId(workosOrgId, userId) {
78
+ const memberships = await workos().userManagement.listOrganizationMemberships({
79
+ organizationId: workosOrgId,
80
+ userId,
81
+ statuses: [...ALL_MEMBERSHIP_STATUSES],
82
+ });
83
+ return memberships.data[0]?.id ?? null;
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=org-mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-mirror.js","sourceRoot":"","sources":["../src/org-mirror.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.48.0",
3
+ "version": "0.49.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",