@aglyn/tenant-data-admin 1.0.0-beta.201 → 1.0.0-beta.203

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.
Files changed (35) hide show
  1. package/package.json +7 -7
  2. package/src/lib/server/card-payment-velocity.d.ts +85 -0
  3. package/src/lib/server/card-payment-velocity.js +202 -0
  4. package/src/lib/server/card-payment-velocity.js.map +1 -0
  5. package/src/lib/server/configured-url-fetch.d.ts +42 -0
  6. package/src/lib/server/configured-url-fetch.js +118 -0
  7. package/src/lib/server/configured-url-fetch.js.map +1 -0
  8. package/src/lib/server/hosted-page-review.d.ts +22 -2
  9. package/src/lib/server/hosted-page-review.js +43 -7
  10. package/src/lib/server/hosted-page-review.js.map +1 -1
  11. package/src/lib/server/member-email-aliases.js +18 -7
  12. package/src/lib/server/member-email-aliases.js.map +1 -1
  13. package/src/lib/server/notifications.d.ts +8 -0
  14. package/src/lib/server/notifications.js +92 -17
  15. package/src/lib/server/notifications.js.map +1 -1
  16. package/src/lib/server/org-member-notice.js +20 -5
  17. package/src/lib/server/org-member-notice.js.map +1 -1
  18. package/src/lib/server/organizations.d.ts +10 -1
  19. package/src/lib/server/organizations.js +12 -4
  20. package/src/lib/server/organizations.js.map +1 -1
  21. package/src/lib/server/outbound-send-review.d.ts +4 -2
  22. package/src/lib/server/outbound-send-review.js +1 -1
  23. package/src/lib/server/outbound-send-review.js.map +1 -1
  24. package/src/lib/server/render-system-email.d.ts +176 -0
  25. package/src/lib/server/render-system-email.js +315 -0
  26. package/src/lib/server/render-system-email.js.map +1 -0
  27. package/src/lib/server/staff-alert-email.d.ts +2 -1
  28. package/src/lib/server/staff-alert-email.js +16 -5
  29. package/src/lib/server/staff-alert-email.js.map +1 -1
  30. package/src/lib/server/stripe-transfer-reversal.d.ts +63 -0
  31. package/src/lib/server/stripe-transfer-reversal.js +177 -0
  32. package/src/lib/server/stripe-transfer-reversal.js.map +1 -0
  33. package/src/tenancy.d.ts +2 -0
  34. package/src/tenancy.js +2 -0
  35. package/src/tenancy.js.map +1 -1
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /*==========================================
17
+ * A SELLER'S SHARE OF A DESTINATION CHARGE, PULLED BACK (AGL-1794, AGL-3363).
18
+ *
19
+ * Every tenant sale is a destination charge on the platform account, so a
20
+ * lost dispute debits the PLATFORM's balance while the seller keeps the
21
+ * transfer. The AGL-1794 policy: the seller returns their share by a
22
+ * `transfers/{id}/reversals` call; the platform keeps Stripe's dispute fee.
23
+ * This is the Stripe half of that, written once. It started as the commerce
24
+ * webhook's `reverseSellerShare`; the booking deposit's lost dispute uses it
25
+ * too (AGL-3363), so the two cannot drift. Each caller keeps its own record
26
+ * and its own settle marker — this module touches no Firestore.
27
+ *
28
+ * PROPORTIONAL, NEVER MORE: `cause × transfer.amount ÷ charge.amount`,
29
+ * FLOORED, capped at what the transfer has left (`amount − amount_reversed`).
30
+ * No `refund_application_fee`: on a chargeback the platform keeps its
31
+ * commission, a policy switch the AGL-1794 note says not to flip here.
32
+ *
33
+ * IDEMPOTENT at Stripe twice over: a reversal already on the transfer carrying
34
+ * this cause's id in its metadata is ADOPTED rather than repeated (the crash
35
+ * window between the POST and the caller's record), and the POST carries an
36
+ * `Idempotency-Key` derived from the cause, so a racing delivery gets Stripe's
37
+ * stored answer.
38
+ *
39
+ * TRANSIENT failures (a network reject, 429, 5xx) THROW, so the webhook's
40
+ * redelivery is the retry. DEFINITIVE ones answer `not-reversed` with a
41
+ * reason, for the caller to settle and record; no redelivery fixes them.
42
+ *=========================================*/ /** Why nothing was pulled back, when the answer is final. */ /** Stripe failures a redelivery can actually fix. */ export function isTransientStripeStatus(status) {
43
+ return status === 429 || status >= 500;
44
+ }
45
+ async function stripeGet(url, stripeKey, fetchImpl) {
46
+ const response = await fetchImpl(url, {
47
+ headers: {
48
+ Authorization: `Bearer ${stripeKey}`
49
+ }
50
+ });
51
+ const body = await response.json().catch(()=>null);
52
+ return {
53
+ ok: response.ok,
54
+ status: response.status,
55
+ body
56
+ };
57
+ }
58
+ /** The metadata key a cause's reversal is stamped and found by. */ export function transferReversalMetadataKey(kind) {
59
+ return kind === 'dispute' ? 'disputeId' : 'refundId';
60
+ }
61
+ /**
62
+ * Pull the seller's proportional share of `cause` back from the charge's
63
+ * transfer. See the module header for the rules.
64
+ */ export async function reverseDestinationTransfer(cause, deps = {}) {
65
+ var _deps_stripeKey, _deps_fetchImpl, _cause_id, _cause_chargeId, _ref, _ref1, _ref2, _ref3, _ref4, _cause_amountCents, _cause_metadata, _ref5, _ref6;
66
+ var _charge_body, _charge_body1, _transfer_body_reversals, _transfer_body, _transfer_body1, _transfer_body2;
67
+ const stripeKey = (_deps_stripeKey = deps.stripeKey) != null ? _deps_stripeKey : process.env.STRIPE_SECRET_KEY;
68
+ if (!stripeKey) return {
69
+ kind: 'skipped',
70
+ reason: 'no-stripe-key'
71
+ };
72
+ const fetchImpl = (_deps_fetchImpl = deps.fetchImpl) != null ? _deps_fetchImpl : fetch;
73
+ const causeId = String((_cause_id = cause.id) != null ? _cause_id : '');
74
+ const metadataKey = transferReversalMetadataKey(cause.kind);
75
+ const label = `${cause.kind} ${causeId}`;
76
+ const chargeId = String((_cause_chargeId = cause.chargeId) != null ? _cause_chargeId : '');
77
+ if (!chargeId) return {
78
+ kind: 'not-reversed',
79
+ reason: 'no-charge-on-cause'
80
+ };
81
+ const charge = await stripeGet(`https://api.stripe.com/v1/charges/${chargeId}`, stripeKey, fetchImpl);
82
+ if (!charge.ok) {
83
+ var _charge_body2;
84
+ if (isTransientStripeStatus(charge.status)) {
85
+ throw new Error(`Stripe charge read failed (${charge.status}) for ${label}`);
86
+ }
87
+ console.error('Stripe refused the charge read', (_charge_body2 = charge.body) == null ? void 0 : _charge_body2.error);
88
+ return {
89
+ kind: 'not-reversed',
90
+ reason: 'charge-read-refused'
91
+ };
92
+ }
93
+ const transferId = String((_ref = (_charge_body = charge.body) == null ? void 0 : _charge_body.transfer) != null ? _ref : '');
94
+ const chargeAmountCents = Math.round(Number((_ref1 = (_charge_body1 = charge.body) == null ? void 0 : _charge_body1.amount) != null ? _ref1 : 0));
95
+ if (!transferId || !(chargeAmountCents > 0)) {
96
+ return {
97
+ kind: 'not-reversed',
98
+ reason: 'no-transfer-on-charge'
99
+ };
100
+ }
101
+ const transfer = await stripeGet(`https://api.stripe.com/v1/transfers/${transferId}`, stripeKey, fetchImpl);
102
+ if (!transfer.ok) {
103
+ var _transfer_body3;
104
+ if (isTransientStripeStatus(transfer.status)) {
105
+ throw new Error(`Stripe transfer read failed (${transfer.status}) for ${label}`);
106
+ }
107
+ console.error('Stripe refused the transfer read', (_transfer_body3 = transfer.body) == null ? void 0 : _transfer_body3.error);
108
+ return {
109
+ kind: 'not-reversed',
110
+ reason: 'transfer-read-refused'
111
+ };
112
+ }
113
+ // The crash window's backstop: the POST landed on a previous delivery and
114
+ // the caller's record did not. Adopt it rather than creating a second one.
115
+ const existing = ((_ref2 = (_transfer_body = transfer.body) == null ? void 0 : (_transfer_body_reversals = _transfer_body.reversals) == null ? void 0 : _transfer_body_reversals.data) != null ? _ref2 : []).find((item)=>{
116
+ var _ref;
117
+ var _item_metadata;
118
+ return String((_ref = item == null ? void 0 : (_item_metadata = item.metadata) == null ? void 0 : _item_metadata[metadataKey]) != null ? _ref : '') === causeId;
119
+ });
120
+ if (existing) {
121
+ var _existing_amount, _existing_id;
122
+ return {
123
+ kind: 'reversed',
124
+ cents: Math.round(Number((_existing_amount = existing.amount) != null ? _existing_amount : 0)),
125
+ reversalId: String((_existing_id = existing.id) != null ? _existing_id : ''),
126
+ adopted: true
127
+ };
128
+ }
129
+ const transferCents = Math.round(Number((_ref3 = (_transfer_body1 = transfer.body) == null ? void 0 : _transfer_body1.amount) != null ? _ref3 : 0));
130
+ const alreadyReversedCents = Math.round(Number((_ref4 = (_transfer_body2 = transfer.body) == null ? void 0 : _transfer_body2.amount_reversed) != null ? _ref4 : 0));
131
+ const remainingCents = Math.max(0, transferCents - alreadyReversedCents);
132
+ const causeCents = Math.round(Number((_cause_amountCents = cause.amountCents) != null ? _cause_amountCents : 0));
133
+ const shareCents = Math.min(Math.floor(causeCents * transferCents / chargeAmountCents), remainingCents);
134
+ if (!(shareCents > 0)) {
135
+ return {
136
+ kind: 'not-reversed',
137
+ reason: 'transfer-fully-reversed',
138
+ owedCents: 0
139
+ };
140
+ }
141
+ const params = new URLSearchParams({
142
+ amount: String(shareCents),
143
+ [`metadata[${metadataKey}]`]: causeId
144
+ });
145
+ for (const [key, value] of Object.entries((_cause_metadata = cause.metadata) != null ? _cause_metadata : {})){
146
+ params.set(`metadata[${key}]`, value);
147
+ }
148
+ const response = await fetchImpl(`https://api.stripe.com/v1/transfers/${transferId}/reversals`, {
149
+ method: 'POST',
150
+ headers: {
151
+ Authorization: `Bearer ${stripeKey}`,
152
+ 'Content-Type': 'application/x-www-form-urlencoded',
153
+ 'Idempotency-Key': `${cause.kind}-reversal-${causeId}`
154
+ },
155
+ body: params.toString()
156
+ });
157
+ const reversal = await response.json().catch(()=>null);
158
+ if (!response.ok) {
159
+ if (isTransientStripeStatus(response.status)) {
160
+ throw new Error(`Stripe transfer reversal failed (${response.status}) for ${label}`);
161
+ }
162
+ console.error('Stripe refused the transfer reversal', reversal == null ? void 0 : reversal.error);
163
+ return {
164
+ kind: 'not-reversed',
165
+ reason: 'reversal-refused',
166
+ owedCents: shareCents
167
+ };
168
+ }
169
+ return {
170
+ kind: 'reversed',
171
+ cents: Math.round(Number((_ref5 = reversal == null ? void 0 : reversal.amount) != null ? _ref5 : shareCents)),
172
+ reversalId: String((_ref6 = reversal == null ? void 0 : reversal.id) != null ? _ref6 : ''),
173
+ adopted: false
174
+ };
175
+ }
176
+
177
+ //# sourceMappingURL=stripe-transfer-reversal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/tenant/data/admin/src/lib/server/stripe-transfer-reversal.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * A SELLER'S SHARE OF A DESTINATION CHARGE, PULLED BACK (AGL-1794, AGL-3363).\n *\n * Every tenant sale is a destination charge on the platform account, so a\n * lost dispute debits the PLATFORM's balance while the seller keeps the\n * transfer. The AGL-1794 policy: the seller returns their share by a\n * `transfers/{id}/reversals` call; the platform keeps Stripe's dispute fee.\n * This is the Stripe half of that, written once. It started as the commerce\n * webhook's `reverseSellerShare`; the booking deposit's lost dispute uses it\n * too (AGL-3363), so the two cannot drift. Each caller keeps its own record\n * and its own settle marker — this module touches no Firestore.\n *\n * PROPORTIONAL, NEVER MORE: `cause × transfer.amount ÷ charge.amount`,\n * FLOORED, capped at what the transfer has left (`amount − amount_reversed`).\n * No `refund_application_fee`: on a chargeback the platform keeps its\n * commission, a policy switch the AGL-1794 note says not to flip here.\n *\n * IDEMPOTENT at Stripe twice over: a reversal already on the transfer carrying\n * this cause's id in its metadata is ADOPTED rather than repeated (the crash\n * window between the POST and the caller's record), and the POST carries an\n * `Idempotency-Key` derived from the cause, so a racing delivery gets Stripe's\n * stored answer.\n *\n * TRANSIENT failures (a network reject, 429, 5xx) THROW, so the webhook's\n * redelivery is the retry. DEFINITIVE ones answer `not-reversed` with a\n * reason, for the caller to settle and record; no redelivery fixes them.\n *=========================================*/\n\n/** Why nothing was pulled back, when the answer is final. */\nexport type TransferReversalFailure =\n | 'no-charge-on-cause'\n | 'charge-read-refused'\n | 'no-transfer-on-charge'\n | 'transfer-read-refused'\n | 'transfer-fully-reversed'\n | 'reversal-refused'\n\nexport type TransferReversalOutcome =\n /** Pulled back now, or found already pulled back and adopted. */\n | { kind: 'reversed'; cents: number; reversalId: string; adopted: boolean }\n /** Final: settle it and record why. `owedCents` when the share was known. */\n | { kind: 'not-reversed'; reason: TransferReversalFailure; owedCents?: number }\n /** Nothing was attempted and nothing should be settled: retry later. */\n | { kind: 'skipped'; reason: 'no-stripe-key' }\n\nexport interface TransferReversalCause {\n /** Which door: decides the metadata key and the idempotency key. */\n kind: 'dispute' | 'refund'\n /** The dispute's or refund's Stripe id. */\n id: string\n /** Cents going back to the cardholder. */\n amountCents: number\n /** The charge whose transfer is pulled back. */\n chargeId: string\n /** More metadata for the reversal: the caller's record id. */\n metadata?: Record<string, string>\n}\n\n/** Stripe failures a redelivery can actually fix. */\nexport function isTransientStripeStatus(status: number): boolean {\n return status === 429 || status >= 500\n}\n\ntype FetchLike = typeof fetch\n\nasync function stripeGet(\n url: string,\n stripeKey: string,\n fetchImpl: FetchLike,\n): Promise<{ ok: boolean; status: number; body: any }> {\n const response = await fetchImpl(url, {\n headers: { Authorization: `Bearer ${stripeKey}` },\n })\n const body = await response.json().catch(() => null)\n return { ok: response.ok, status: response.status, body }\n}\n\n/** The metadata key a cause's reversal is stamped and found by. */\nexport function transferReversalMetadataKey(kind: TransferReversalCause['kind']): string {\n return kind === 'dispute' ? 'disputeId' : 'refundId'\n}\n\n/**\n * Pull the seller's proportional share of `cause` back from the charge's\n * transfer. See the module header for the rules.\n */\nexport async function reverseDestinationTransfer(\n cause: TransferReversalCause,\n deps: { stripeKey?: string; fetchImpl?: FetchLike } = {},\n): Promise<TransferReversalOutcome> {\n const stripeKey = deps.stripeKey ?? process.env.STRIPE_SECRET_KEY\n if (!stripeKey) return { kind: 'skipped', reason: 'no-stripe-key' }\n const fetchImpl = deps.fetchImpl ?? fetch\n const causeId = String(cause.id ?? '')\n const metadataKey = transferReversalMetadataKey(cause.kind)\n const label = `${cause.kind} ${causeId}`\n\n const chargeId = String(cause.chargeId ?? '')\n if (!chargeId) return { kind: 'not-reversed', reason: 'no-charge-on-cause' }\n const charge = await stripeGet(\n `https://api.stripe.com/v1/charges/${chargeId}`,\n stripeKey,\n fetchImpl,\n )\n if (!charge.ok) {\n if (isTransientStripeStatus(charge.status)) {\n throw new Error(`Stripe charge read failed (${charge.status}) for ${label}`)\n }\n console.error('Stripe refused the charge read', charge.body?.error)\n return { kind: 'not-reversed', reason: 'charge-read-refused' }\n }\n const transferId = String(charge.body?.transfer ?? '')\n const chargeAmountCents = Math.round(Number(charge.body?.amount ?? 0))\n if (!transferId || !(chargeAmountCents > 0)) {\n return { kind: 'not-reversed', reason: 'no-transfer-on-charge' }\n }\n const transfer = await stripeGet(\n `https://api.stripe.com/v1/transfers/${transferId}`,\n stripeKey,\n fetchImpl,\n )\n if (!transfer.ok) {\n if (isTransientStripeStatus(transfer.status)) {\n throw new Error(`Stripe transfer read failed (${transfer.status}) for ${label}`)\n }\n console.error('Stripe refused the transfer read', transfer.body?.error)\n return { kind: 'not-reversed', reason: 'transfer-read-refused' }\n }\n // The crash window's backstop: the POST landed on a previous delivery and\n // the caller's record did not. Adopt it rather than creating a second one.\n const existing = ((transfer.body?.reversals?.data ?? []) as any[]).find(\n (item) => String(item?.metadata?.[metadataKey] ?? '') === causeId,\n )\n if (existing) {\n return {\n kind: 'reversed',\n cents: Math.round(Number(existing.amount ?? 0)),\n reversalId: String(existing.id ?? ''),\n adopted: true,\n }\n }\n const transferCents = Math.round(Number(transfer.body?.amount ?? 0))\n const alreadyReversedCents = Math.round(Number(transfer.body?.amount_reversed ?? 0))\n const remainingCents = Math.max(0, transferCents - alreadyReversedCents)\n const causeCents = Math.round(Number(cause.amountCents ?? 0))\n const shareCents = Math.min(\n Math.floor((causeCents * transferCents) / chargeAmountCents),\n remainingCents,\n )\n if (!(shareCents > 0)) {\n return { kind: 'not-reversed', reason: 'transfer-fully-reversed', owedCents: 0 }\n }\n const params = new URLSearchParams({\n amount: String(shareCents),\n [`metadata[${metadataKey}]`]: causeId,\n })\n for (const [key, value] of Object.entries(cause.metadata ?? {})) {\n params.set(`metadata[${key}]`, value)\n }\n const response = await fetchImpl(\n `https://api.stripe.com/v1/transfers/${transferId}/reversals`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${stripeKey}`,\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Idempotency-Key': `${cause.kind}-reversal-${causeId}`,\n },\n body: params.toString(),\n },\n )\n const reversal = await response.json().catch(() => null)\n if (!response.ok) {\n if (isTransientStripeStatus(response.status)) {\n throw new Error(`Stripe transfer reversal failed (${response.status}) for ${label}`)\n }\n console.error('Stripe refused the transfer reversal', reversal?.error)\n return { kind: 'not-reversed', reason: 'reversal-refused', owedCents: shareCents }\n }\n return {\n kind: 'reversed',\n cents: Math.round(Number(reversal?.amount ?? shareCents)),\n reversalId: String(reversal?.id ?? ''),\n adopted: false,\n }\n}\n"],"names":["isTransientStripeStatus","status","stripeGet","url","stripeKey","fetchImpl","response","headers","Authorization","body","json","catch","ok","transferReversalMetadataKey","kind","reverseDestinationTransfer","cause","deps","charge","transfer","process","env","STRIPE_SECRET_KEY","reason","fetch","causeId","String","id","metadataKey","label","chargeId","Error","console","error","transferId","chargeAmountCents","Math","round","Number","amount","existing","reversals","data","find","item","metadata","cents","reversalId","adopted","transferCents","alreadyReversedCents","amount_reversed","remainingCents","max","causeCents","amountCents","shareCents","min","floor","owedCents","params","URLSearchParams","key","value","Object","entries","set","method","toString","reversal"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;2CA0B2C,GAE3C,2DAA2D,GA8B3D,mDAAmD,GACnD,OAAO,SAASA,wBAAwBC,MAAc;IACpD,OAAOA,WAAW,OAAOA,UAAU;AACrC;AAIA,eAAeC,UACbC,GAAW,EACXC,SAAiB,EACjBC,SAAoB;IAEpB,MAAMC,WAAW,MAAMD,UAAUF,KAAK;QACpCI,SAAS;YAAEC,eAAe,CAAC,OAAO,EAAEJ,WAAW;QAAC;IAClD;IACA,MAAMK,OAAO,MAAMH,SAASI,IAAI,GAAGC,KAAK,CAAC,IAAM;IAC/C,OAAO;QAAEC,IAAIN,SAASM,EAAE;QAAEX,QAAQK,SAASL,MAAM;QAAEQ;IAAK;AAC1D;AAEA,iEAAiE,GACjE,OAAO,SAASI,4BAA4BC,IAAmC;IAC7E,OAAOA,SAAS,YAAY,cAAc;AAC5C;AAEA;;;CAGC,GACD,OAAO,eAAeC,2BACpBC,KAA4B,EAC5BC,OAAsD,CAAC,CAAC;QAEtCA,iBAEAA,iBACKD,WAICA,mDA+CaA,oBAYKA;QA7ChBE,cACkBA,eAkBzBC,0BAAAA,gBAWqBA,iBACOA;IApD/C,MAAMf,aAAYa,kBAAAA,KAAKb,SAAS,YAAda,kBAAkBG,QAAQC,GAAG,CAACC,iBAAiB;IACjE,IAAI,CAAClB,WAAW,OAAO;QAAEU,MAAM;QAAWS,QAAQ;IAAgB;IAClE,MAAMlB,aAAYY,kBAAAA,KAAKZ,SAAS,YAAdY,kBAAkBO;IACpC,MAAMC,UAAUC,QAAOV,YAAAA,MAAMW,EAAE,YAARX,YAAY;IACnC,MAAMY,cAAcf,4BAA4BG,MAAMF,IAAI;IAC1D,MAAMe,QAAQ,GAAGb,MAAMF,IAAI,CAAC,CAAC,EAAEW,SAAS;IAExC,MAAMK,WAAWJ,QAAOV,kBAAAA,MAAMc,QAAQ,YAAdd,kBAAkB;IAC1C,IAAI,CAACc,UAAU,OAAO;QAAEhB,MAAM;QAAgBS,QAAQ;IAAqB;IAC3E,MAAML,SAAS,MAAMhB,UACnB,CAAC,kCAAkC,EAAE4B,UAAU,EAC/C1B,WACAC;IAEF,IAAI,CAACa,OAAON,EAAE,EAAE;YAIkCM;QAHhD,IAAIlB,wBAAwBkB,OAAOjB,MAAM,GAAG;YAC1C,MAAM,IAAI8B,MAAM,CAAC,2BAA2B,EAAEb,OAAOjB,MAAM,CAAC,MAAM,EAAE4B,OAAO;QAC7E;QACAG,QAAQC,KAAK,CAAC,mCAAkCf,gBAAAA,OAAOT,IAAI,qBAAXS,cAAae,KAAK;QAClE,OAAO;YAAEnB,MAAM;YAAgBS,QAAQ;QAAsB;IAC/D;IACA,MAAMW,aAAaR,gBAAOR,eAAAA,OAAOT,IAAI,qBAAXS,aAAaC,QAAQ,mBAAI;IACnD,MAAMgB,oBAAoBC,KAAKC,KAAK,CAACC,iBAAOpB,gBAAAA,OAAOT,IAAI,qBAAXS,cAAaqB,MAAM,oBAAI;IACnE,IAAI,CAACL,cAAc,CAAEC,CAAAA,oBAAoB,CAAA,GAAI;QAC3C,OAAO;YAAErB,MAAM;YAAgBS,QAAQ;QAAwB;IACjE;IACA,MAAMJ,WAAW,MAAMjB,UACrB,CAAC,oCAAoC,EAAEgC,YAAY,EACnD9B,WACAC;IAEF,IAAI,CAACc,SAASP,EAAE,EAAE;YAIkCO;QAHlD,IAAInB,wBAAwBmB,SAASlB,MAAM,GAAG;YAC5C,MAAM,IAAI8B,MAAM,CAAC,6BAA6B,EAAEZ,SAASlB,MAAM,CAAC,MAAM,EAAE4B,OAAO;QACjF;QACAG,QAAQC,KAAK,CAAC,qCAAoCd,kBAAAA,SAASV,IAAI,qBAAbU,gBAAec,KAAK;QACtE,OAAO;YAAEnB,MAAM;YAAgBS,QAAQ;QAAwB;IACjE;IACA,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAMiB,WAAW,WAAErB,iBAAAA,SAASV,IAAI,sBAAbU,2BAAAA,eAAesB,SAAS,qBAAxBtB,yBAA0BuB,IAAI,oBAAI,EAAE,EAAYC,IAAI,CACrE,CAACC;;YAAgBA;eAAPlB,eAAOkB,yBAAAA,iBAAAA,KAAMC,QAAQ,qBAAdD,cAAgB,CAAChB,YAAY,mBAAI,QAAQH;;IAE5D,IAAIe,UAAU;YAGeA,kBACNA;QAHrB,OAAO;YACL1B,MAAM;YACNgC,OAAOV,KAAKC,KAAK,CAACC,QAAOE,mBAAAA,SAASD,MAAM,YAAfC,mBAAmB;YAC5CO,YAAYrB,QAAOc,eAAAA,SAASb,EAAE,YAAXa,eAAe;YAClCQ,SAAS;QACX;IACF;IACA,MAAMC,gBAAgBb,KAAKC,KAAK,CAACC,iBAAOnB,kBAAAA,SAASV,IAAI,qBAAbU,gBAAeoB,MAAM,oBAAI;IACjE,MAAMW,uBAAuBd,KAAKC,KAAK,CAACC,iBAAOnB,kBAAAA,SAASV,IAAI,qBAAbU,gBAAegC,eAAe,oBAAI;IACjF,MAAMC,iBAAiBhB,KAAKiB,GAAG,CAAC,GAAGJ,gBAAgBC;IACnD,MAAMI,aAAalB,KAAKC,KAAK,CAACC,QAAOtB,qBAAAA,MAAMuC,WAAW,YAAjBvC,qBAAqB;IAC1D,MAAMwC,aAAapB,KAAKqB,GAAG,CACzBrB,KAAKsB,KAAK,CAAC,AAACJ,aAAaL,gBAAiBd,oBAC1CiB;IAEF,IAAI,CAAEI,CAAAA,aAAa,CAAA,GAAI;QACrB,OAAO;YAAE1C,MAAM;YAAgBS,QAAQ;YAA2BoC,WAAW;QAAE;IACjF;IACA,MAAMC,SAAS,IAAIC,gBAAgB;QACjCtB,QAAQb,OAAO8B;QACf,CAAC,CAAC,SAAS,EAAE5B,YAAY,CAAC,CAAC,CAAC,EAAEH;IAChC;IACA,KAAK,MAAM,CAACqC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,EAACjD,kBAAAA,MAAM6B,QAAQ,YAAd7B,kBAAkB,CAAC,GAAI;QAC/D4C,OAAOM,GAAG,CAAC,CAAC,SAAS,EAAEJ,IAAI,CAAC,CAAC,EAAEC;IACjC;IACA,MAAMzD,WAAW,MAAMD,UACrB,CAAC,oCAAoC,EAAE6B,WAAW,UAAU,CAAC,EAC7D;QACEiC,QAAQ;QACR5D,SAAS;YACPC,eAAe,CAAC,OAAO,EAAEJ,WAAW;YACpC,gBAAgB;YAChB,mBAAmB,GAAGY,MAAMF,IAAI,CAAC,UAAU,EAAEW,SAAS;QACxD;QACAhB,MAAMmD,OAAOQ,QAAQ;IACvB;IAEF,MAAMC,WAAW,MAAM/D,SAASI,IAAI,GAAGC,KAAK,CAAC,IAAM;IACnD,IAAI,CAACL,SAASM,EAAE,EAAE;QAChB,IAAIZ,wBAAwBM,SAASL,MAAM,GAAG;YAC5C,MAAM,IAAI8B,MAAM,CAAC,iCAAiC,EAAEzB,SAASL,MAAM,CAAC,MAAM,EAAE4B,OAAO;QACrF;QACAG,QAAQC,KAAK,CAAC,wCAAwCoC,4BAAAA,SAAUpC,KAAK;QACrE,OAAO;YAAEnB,MAAM;YAAgBS,QAAQ;YAAoBoC,WAAWH;QAAW;IACnF;IACA,OAAO;QACL1C,MAAM;QACNgC,OAAOV,KAAKC,KAAK,CAACC,gBAAO+B,4BAAAA,SAAU9B,MAAM,oBAAIiB;QAC7CT,YAAYrB,gBAAO2C,4BAAAA,SAAU1C,EAAE,oBAAI;QACnCqB,SAAS;IACX;AACF"}
package/src/tenancy.d.ts CHANGED
@@ -83,6 +83,7 @@ export * from './lib/server/verify-email-cooldown';
83
83
  export * from './lib/server/vercel-drain-signature';
84
84
  export * from './lib/server/vercel-log-drain';
85
85
  export * from './lib/server/visitor-write-rate-limit';
86
+ export * from './lib/server/card-payment-velocity';
86
87
  export * from './lib/server/console-api-rate-limit';
87
88
  export * from './lib/server/realm-plugins';
88
89
  export * from './lib/server/release-flags';
@@ -100,6 +101,7 @@ export * from './lib/server/media-tombstone';
100
101
  export * from './lib/server/media-variants';
101
102
  export * from './lib/server/serve-media-cdn';
102
103
  export * from './lib/server/serve-plugin-fetch';
104
+ export * from './lib/server/configured-url-fetch';
103
105
  export * from './lib/server/sso-break-glass-owners';
104
106
  export * from './lib/server/sso-domain-policy';
105
107
  export * from './lib/server/sso-enforcement';
package/src/tenancy.js CHANGED
@@ -102,6 +102,7 @@ export * from "./lib/server/verify-email-cooldown.js";
102
102
  export * from "./lib/server/vercel-drain-signature.js";
103
103
  export * from "./lib/server/vercel-log-drain.js";
104
104
  export * from "./lib/server/visitor-write-rate-limit.js";
105
+ export * from "./lib/server/card-payment-velocity.js";
105
106
  export * from "./lib/server/console-api-rate-limit.js";
106
107
  export * from "./lib/server/realm-plugins.js";
107
108
  export * from "./lib/server/release-flags.js";
@@ -119,6 +120,7 @@ export * from "./lib/server/media-tombstone.js";
119
120
  export * from "./lib/server/media-variants.js";
120
121
  export * from "./lib/server/serve-media-cdn.js";
121
122
  export * from "./lib/server/serve-plugin-fetch.js";
123
+ export * from "./lib/server/configured-url-fetch.js";
122
124
  export * from "./lib/server/sso-break-glass-owners.js";
123
125
  export * from "./lib/server/sso-domain-policy.js";
124
126
  export * from "./lib/server/sso-enforcement.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../libs/tenant/data/admin/src/tenancy.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2022 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './lib/server/analytics-retention'\nexport * from './lib/server/api-http'\nexport * from './lib/server/api-keys'\nexport * from './lib/server/account-emails'\nexport * from './lib/server/auth-pools'\nexport * from './lib/server/client-error-report'\nexport * from './lib/server/connect-account-status'\nexport * from './lib/server/connect-payout-failure'\nexport * from './lib/server/stripe-account-mode'\nexport * from './lib/server/auth-handoff'\nexport * from './lib/server/console-domains'\nexport * from './lib/server/dns-probe'\nexport * from './lib/server/sending-domains'\nexport * from './lib/server/host-sending-domain'\nexport * from './lib/server/sending-domain-debt'\nexport * from './lib/server/sending-domain-recheck'\n// The hosting seam itself, so a door can ask whether this deployment is able\n// to register a name at all before it promises the caller one.\n// `workspace-domains` re-exports the pieces its own callers share with it; the\n// provider behind it is not among them.\nexport { domainProvider } from './lib/server/domain-provider'\nexport type {\n DomainProvider,\n DomainProviderId,\n DomainScope,\n} from './lib/server/domain-provider'\nexport * from './lib/server/platform-domain-names'\nexport * from './lib/server/consume-once'\nexport * from './lib/server/csp-aggregate'\nexport * from './lib/server/data-storage-gate'\nexport * from './lib/server/contact-suppression'\nexport * from './lib/server/email-suppression'\n// The double opt-in quarantine, after the module whose keying it shares and\n// whose `filterTopicSendable` is the reader that makes it a quarantine rather\n// than a stored fact.\nexport * from './lib/server/email-topic-confirmation'\nexport * from './lib/server/email-unsubscribe-link'\nexport * from './lib/server/email-flow-gate'\n// Side-effecting on purpose, for the reason `email-send-rate` below is:\n// evaluating this module INSTALLS the marketing gate on `sendEmail`, so the\n// unsubscribe header, the suppression check and the frequency ceiling reach\n// every bulk sender without a call at each server entrypoint.\nexport * from './lib/server/email-marketing-gate'\n// A consent group change (AGL-3320): the carries of the three stores above,\n// and the executor that runs a change around them.\nexport * from './lib/server/consent-group-carry'\nexport * from './lib/server/consent-group-change'\nexport * from './lib/server/sms-keywords'\nexport * from './lib/server/document-id'\nexport * from './lib/server/collection-preview-token'\nexport * from './lib/server/edit-access-authz'\nexport * from './lib/server/edit-access-token'\nexport * from './lib/server/edit-hint-token'\nexport * from './lib/server/email-metering'\n// Side-effecting on purpose (AGL-2409): evaluating this module INSTALLS the\n// platform send-rate governor on `sendEmail`. Every server surface already\n// imports this barrel, so nothing has to remember to call an installer.\nexport * from './lib/server/campaign-conversion-attribution'\nexport * from './lib/server/email-send-rate'\n// Side-effecting on purpose, for the same reason (AGL-3328): evaluating this\n// module INSTALLS the deliverability preflight on `sendEmail`, so a recipient\n// whose domain takes no mail is refused, and bulk mail behind a gateway that\n// refused its sending domain twice is held, on every send path at once.\nexport * from './lib/server/email-deliverability'\nexport * from './lib/server/email-sender-reputation'\nexport * from './lib/server/erase'\nexport * from './lib/server/erase-person'\nexport * from './lib/server/dynamic-list-materialize'\nexport * from './lib/server/firebase-admin'\nexport * from './lib/server/free-workspace-cap'\nexport * from './lib/server/ga4-measurement-protocol'\nexport * from './lib/server/host-memberships'\nexport * from './lib/server/host-visitor-records'\nexport * from './lib/server/list-members'\nexport * from './lib/server/lockdown'\nexport * from './lib/server/token-revocation'\nexport * from './lib/server/tenant-write-lockdown'\nexport * from './lib/server/outbound-send-review'\n// The same review for a published page, read where it is composed (AGL-3356).\nexport * from './lib/server/hosted-page-review'\nexport * from './lib/server/host-email-tokens'\nexport * from './lib/server/notifications'\nexport * from './lib/server/org-billing'\nexport * from './lib/server/organizations'\nexport * from './lib/server/duplicate-activity'\nexport * from './lib/server/duplicate-resource'\nexport * from './lib/server/workspace-domains'\nexport * from './lib/server/membership-recover-throttle'\nexport * from './lib/server/password-reset-throttle'\nexport * from './lib/server/rate-limit-store'\nexport * from './lib/server/verify-email-cooldown'\nexport * from './lib/server/vercel-drain-signature'\nexport * from './lib/server/vercel-log-drain'\nexport * from './lib/server/visitor-write-rate-limit'\nexport * from './lib/server/console-api-rate-limit'\nexport * from './lib/server/realm-plugins'\nexport * from './lib/server/release-flags'\nexport * from './lib/server/resolve-people'\nexport * from './lib/server/member-photo'\nexport * from './lib/server/personal-data-export'\nexport * from './lib/server/media-delivery'\nexport * from './lib/server/media-download-tokens'\nexport * from './lib/server/media-quarantine'\nexport * from './lib/server/media-signing'\nexport * from './lib/server/media-storage-path'\nexport * from './lib/server/safe-equal'\nexport * from './lib/server/media-strong-digest'\nexport * from './lib/server/media-tombstone'\nexport * from './lib/server/media-variants'\nexport * from './lib/server/serve-media-cdn'\nexport * from './lib/server/serve-plugin-fetch'\nexport * from './lib/server/sso-break-glass-owners'\nexport * from './lib/server/sso-domain-policy'\nexport * from './lib/server/sso-enforcement'\nexport * from './lib/server/sso-provisioning'\nexport * from './lib/server/update-existing'\nexport * from './lib/server/contact-company-link'\nexport * from './lib/server/contact-email-index'\nexport * from './lib/server/contact-merge'\nexport * from './lib/server/upsert-contact'\n// The stage floor a won deal applies to its contact (AGL-2641).\nexport * from './lib/server/contact-lifecycle-floor'\nexport * from './lib/server/crm-records'\n// The `nextTaskAtMs` a contact, a company and a deal carry, recomputed from\n// their open tasks by every server-side task writer (AGL-2661).\nexport * from './lib/server/crm-next-activity'\n// Where a one-to-one email's activity row lives and how the delivery\n// webhook advances it (AGL-2615).\nexport * from './lib/server/crm-email-activity'\n// What a confirmed booking files on the CRM record — the meeting and the\n// follow-up (AGL-2660).\nexport * from './lib/server/crm-booking-activity'\n// The org's email capture token and the filing of one received message\n// on the record it was with (AGL-2657).\nexport * from './lib/server/crm-inbound-email'\n// A member's own addresses in a workspace, and the signed link that\n// confirms one (AGL-2975).\nexport * from './lib/server/member-email-aliases'\nexport * from './lib/server/user-profiles'\nexport * from './lib/server/legal-acceptance'\n// The person's decision about the platform's own product email, on their\n// document and on the operator's marketing contact (AGL-3185).\nexport * from './lib/server/platform-marketing-consent'\n"],"names":["domainProvider"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../libs/tenant/data/admin/src/tenancy.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2022 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './lib/server/analytics-retention'\nexport * from './lib/server/api-http'\nexport * from './lib/server/api-keys'\nexport * from './lib/server/account-emails'\nexport * from './lib/server/auth-pools'\nexport * from './lib/server/client-error-report'\nexport * from './lib/server/connect-account-status'\nexport * from './lib/server/connect-payout-failure'\nexport * from './lib/server/stripe-account-mode'\nexport * from './lib/server/auth-handoff'\nexport * from './lib/server/console-domains'\nexport * from './lib/server/dns-probe'\nexport * from './lib/server/sending-domains'\nexport * from './lib/server/host-sending-domain'\nexport * from './lib/server/sending-domain-debt'\nexport * from './lib/server/sending-domain-recheck'\n// The hosting seam itself, so a door can ask whether this deployment is able\n// to register a name at all before it promises the caller one.\n// `workspace-domains` re-exports the pieces its own callers share with it; the\n// provider behind it is not among them.\nexport { domainProvider } from './lib/server/domain-provider'\nexport type {\n DomainProvider,\n DomainProviderId,\n DomainScope,\n} from './lib/server/domain-provider'\nexport * from './lib/server/platform-domain-names'\nexport * from './lib/server/consume-once'\nexport * from './lib/server/csp-aggregate'\nexport * from './lib/server/data-storage-gate'\nexport * from './lib/server/contact-suppression'\nexport * from './lib/server/email-suppression'\n// The double opt-in quarantine, after the module whose keying it shares and\n// whose `filterTopicSendable` is the reader that makes it a quarantine rather\n// than a stored fact.\nexport * from './lib/server/email-topic-confirmation'\nexport * from './lib/server/email-unsubscribe-link'\nexport * from './lib/server/email-flow-gate'\n// Side-effecting on purpose, for the reason `email-send-rate` below is:\n// evaluating this module INSTALLS the marketing gate on `sendEmail`, so the\n// unsubscribe header, the suppression check and the frequency ceiling reach\n// every bulk sender without a call at each server entrypoint.\nexport * from './lib/server/email-marketing-gate'\n// A consent group change (AGL-3320): the carries of the three stores above,\n// and the executor that runs a change around them.\nexport * from './lib/server/consent-group-carry'\nexport * from './lib/server/consent-group-change'\nexport * from './lib/server/sms-keywords'\nexport * from './lib/server/document-id'\nexport * from './lib/server/collection-preview-token'\nexport * from './lib/server/edit-access-authz'\nexport * from './lib/server/edit-access-token'\nexport * from './lib/server/edit-hint-token'\nexport * from './lib/server/email-metering'\n// Side-effecting on purpose (AGL-2409): evaluating this module INSTALLS the\n// platform send-rate governor on `sendEmail`. Every server surface already\n// imports this barrel, so nothing has to remember to call an installer.\nexport * from './lib/server/campaign-conversion-attribution'\nexport * from './lib/server/email-send-rate'\n// Side-effecting on purpose, for the same reason (AGL-3328): evaluating this\n// module INSTALLS the deliverability preflight on `sendEmail`, so a recipient\n// whose domain takes no mail is refused, and bulk mail behind a gateway that\n// refused its sending domain twice is held, on every send path at once.\nexport * from './lib/server/email-deliverability'\nexport * from './lib/server/email-sender-reputation'\nexport * from './lib/server/erase'\nexport * from './lib/server/erase-person'\nexport * from './lib/server/dynamic-list-materialize'\nexport * from './lib/server/firebase-admin'\nexport * from './lib/server/free-workspace-cap'\nexport * from './lib/server/ga4-measurement-protocol'\nexport * from './lib/server/host-memberships'\nexport * from './lib/server/host-visitor-records'\nexport * from './lib/server/list-members'\nexport * from './lib/server/lockdown'\nexport * from './lib/server/token-revocation'\nexport * from './lib/server/tenant-write-lockdown'\nexport * from './lib/server/outbound-send-review'\n// The same review for a published page, read where it is composed (AGL-3356).\nexport * from './lib/server/hosted-page-review'\nexport * from './lib/server/host-email-tokens'\nexport * from './lib/server/notifications'\nexport * from './lib/server/org-billing'\nexport * from './lib/server/organizations'\nexport * from './lib/server/duplicate-activity'\nexport * from './lib/server/duplicate-resource'\nexport * from './lib/server/workspace-domains'\nexport * from './lib/server/membership-recover-throttle'\nexport * from './lib/server/password-reset-throttle'\nexport * from './lib/server/rate-limit-store'\nexport * from './lib/server/verify-email-cooldown'\nexport * from './lib/server/vercel-drain-signature'\nexport * from './lib/server/vercel-log-drain'\nexport * from './lib/server/visitor-write-rate-limit'\nexport * from './lib/server/card-payment-velocity'\nexport * from './lib/server/console-api-rate-limit'\nexport * from './lib/server/realm-plugins'\nexport * from './lib/server/release-flags'\nexport * from './lib/server/resolve-people'\nexport * from './lib/server/member-photo'\nexport * from './lib/server/personal-data-export'\nexport * from './lib/server/media-delivery'\nexport * from './lib/server/media-download-tokens'\nexport * from './lib/server/media-quarantine'\nexport * from './lib/server/media-signing'\nexport * from './lib/server/media-storage-path'\nexport * from './lib/server/safe-equal'\nexport * from './lib/server/media-strong-digest'\nexport * from './lib/server/media-tombstone'\nexport * from './lib/server/media-variants'\nexport * from './lib/server/serve-media-cdn'\nexport * from './lib/server/serve-plugin-fetch'\nexport * from './lib/server/configured-url-fetch'\nexport * from './lib/server/sso-break-glass-owners'\nexport * from './lib/server/sso-domain-policy'\nexport * from './lib/server/sso-enforcement'\nexport * from './lib/server/sso-provisioning'\nexport * from './lib/server/update-existing'\nexport * from './lib/server/contact-company-link'\nexport * from './lib/server/contact-email-index'\nexport * from './lib/server/contact-merge'\nexport * from './lib/server/upsert-contact'\n// The stage floor a won deal applies to its contact (AGL-2641).\nexport * from './lib/server/contact-lifecycle-floor'\nexport * from './lib/server/crm-records'\n// The `nextTaskAtMs` a contact, a company and a deal carry, recomputed from\n// their open tasks by every server-side task writer (AGL-2661).\nexport * from './lib/server/crm-next-activity'\n// Where a one-to-one email's activity row lives and how the delivery\n// webhook advances it (AGL-2615).\nexport * from './lib/server/crm-email-activity'\n// What a confirmed booking files on the CRM record — the meeting and the\n// follow-up (AGL-2660).\nexport * from './lib/server/crm-booking-activity'\n// The org's email capture token and the filing of one received message\n// on the record it was with (AGL-2657).\nexport * from './lib/server/crm-inbound-email'\n// A member's own addresses in a workspace, and the signed link that\n// confirms one (AGL-2975).\nexport * from './lib/server/member-email-aliases'\nexport * from './lib/server/user-profiles'\nexport * from './lib/server/legal-acceptance'\n// The person's decision about the platform's own product email, on their\n// document and on the operator's marketing contact (AGL-3185).\nexport * from './lib/server/platform-marketing-consent'\n"],"names":["domainProvider"],"mappings":"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"}