@boltclaw/referrals 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +500 -3
- package/dist/api-types.d.ts +245 -0
- package/dist/api-types.js +2 -0
- package/dist/api-types.js.map +1 -0
- package/dist/assistant-tools.d.ts +40 -0
- package/dist/assistant-tools.js +120 -0
- package/dist/assistant-tools.js.map +1 -0
- package/dist/assistant.d.ts +62 -0
- package/dist/assistant.js +305 -0
- package/dist/assistant.js.map +1 -0
- package/dist/case.d.ts +2 -0
- package/dist/case.js +30 -0
- package/dist/case.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.js +80 -0
- package/dist/client.js.map +1 -0
- package/dist/element.d.ts +4 -0
- package/dist/element.js +204 -0
- package/dist/element.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.js +62 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/api.d.ts +6477 -0
- package/dist/generated/api.js +891 -0
- package/dist/generated/api.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +118 -0
- package/dist/loader.js +524 -0
- package/dist/loader.js.map +1 -0
- package/dist/middleware.d.ts +100 -0
- package/dist/middleware.js +378 -0
- package/dist/middleware.js.map +1 -0
- package/dist/origin.d.ts +3 -0
- package/dist/origin.js +22 -0
- package/dist/origin.js.map +1 -0
- package/dist/react.d.ts +69 -0
- package/dist/react.js +328 -0
- package/dist/react.js.map +1 -0
- package/dist/server-index.d.ts +17 -0
- package/dist/server-index.js +9 -0
- package/dist/server-index.js.map +1 -0
- package/dist/server.d.ts +106 -0
- package/dist/server.js +511 -0
- package/dist/server.js.map +1 -0
- package/dist/typed-code.d.ts +78 -0
- package/dist/typed-code.js +234 -0
- package/dist/typed-code.js.map +1 -0
- package/dist/types.d.ts +254 -0
- package/dist/types.js +61 -0
- package/dist/types.js.map +1 -0
- package/dist/webhooks.d.ts +20 -0
- package/dist/webhooks.js +90 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +97 -6
package/dist/server.js
ADDED
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
import { ReferralsApiError } from "./errors.js";
|
|
2
|
+
import { BoltClawApiError, BoltClawClient } from "./generated/api.js";
|
|
3
|
+
import { isAllowedUrl } from "./origin.js";
|
|
4
|
+
import { fromSnake } from "./case.js";
|
|
5
|
+
import { EMBED_TTL_MAX_SECONDS, EMBED_TTL_MIN_SECONDS, OFFER_CHECK_SOURCES, OFFER_INTERVALS, } from "./types.js";
|
|
6
|
+
export const DEFAULT_BASE_URL = "https://api.boltclaw.ai/v1";
|
|
7
|
+
function requireLocale(value) {
|
|
8
|
+
if (typeof value !== "string" || value.length > 35 || !/^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8}){0,2}$/.test(value)) {
|
|
9
|
+
throw new TypeError("locale must be a language tag like de, fr or pt-BR.");
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function isObject(value) {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
function checkoutDiscounts(offer, coupon, eligible) {
|
|
17
|
+
if (!eligible || !offer)
|
|
18
|
+
return [];
|
|
19
|
+
const promotionCode = offer.stripe?.promotionCode;
|
|
20
|
+
if (typeof promotionCode === "string" && promotionCode !== "")
|
|
21
|
+
return [{ promotion_code: promotionCode }];
|
|
22
|
+
if (coupon !== null)
|
|
23
|
+
return [{ coupon }];
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
function requireText(value, field, max = 200) {
|
|
27
|
+
if (typeof value !== "string" || value.length === 0 || value.length > max) {
|
|
28
|
+
throw new TypeError(`${field} must be a text of 1 to ${max} characters.`);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
function requireMinor(value, field) {
|
|
33
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
|
|
34
|
+
throw new TypeError(`${field} must be a whole number of minor units, 0 or more.`);
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
function requireCurrency(value) {
|
|
39
|
+
if (typeof value !== "string" || !/^[A-Za-z]{3}$/.test(value)) {
|
|
40
|
+
throw new TypeError("currency must be a three-letter ISO 4217 code.");
|
|
41
|
+
}
|
|
42
|
+
return value.toUpperCase();
|
|
43
|
+
}
|
|
44
|
+
function optionalText(value, field, max) {
|
|
45
|
+
if (value === undefined || value === null)
|
|
46
|
+
return undefined;
|
|
47
|
+
return requireText(value, field, max);
|
|
48
|
+
}
|
|
49
|
+
function saleItems(items) {
|
|
50
|
+
if (items === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
if (!Array.isArray(items) || items.length > 100)
|
|
53
|
+
throw new TypeError("items must be a list of at most 100 lines.");
|
|
54
|
+
return items.map((item, i) => {
|
|
55
|
+
const line = { amount: requireMinor(item?.amount, `items[${i}].amount`) };
|
|
56
|
+
if (item.product !== undefined)
|
|
57
|
+
line.product = requireText(item.product, `items[${i}].product`);
|
|
58
|
+
if (item.price !== undefined)
|
|
59
|
+
line.price = requireText(item.price, `items[${i}].price`);
|
|
60
|
+
if (item.plan !== undefined)
|
|
61
|
+
line.plan = requireText(item.plan, `items[${i}].plan`);
|
|
62
|
+
if (item.interval !== undefined) {
|
|
63
|
+
if (item.interval !== "month" && item.interval !== "year" && item.interval !== "one_time") {
|
|
64
|
+
throw new TypeError(`items[${i}].interval must be month, year or one_time.`);
|
|
65
|
+
}
|
|
66
|
+
line.interval = item.interval;
|
|
67
|
+
}
|
|
68
|
+
if (item.quantity !== undefined) {
|
|
69
|
+
if (!Number.isSafeInteger(item.quantity) || item.quantity < 1)
|
|
70
|
+
throw new TypeError(`items[${i}].quantity must be 1 or more.`);
|
|
71
|
+
line.quantity = item.quantity;
|
|
72
|
+
}
|
|
73
|
+
return line;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const IDEMPOTENCY_KEY = /^[!-~]{1,255}$/;
|
|
77
|
+
function idempotency(key) {
|
|
78
|
+
if (key === undefined)
|
|
79
|
+
return {};
|
|
80
|
+
if (typeof key !== "string" || !IDEMPOTENCY_KEY.test(key)) {
|
|
81
|
+
throw new TypeError("idempotencyKey must be 1 to 255 printable ASCII characters.");
|
|
82
|
+
}
|
|
83
|
+
return { idempotencyKey: key };
|
|
84
|
+
}
|
|
85
|
+
export class ReferralsServer {
|
|
86
|
+
programId;
|
|
87
|
+
baseUrl;
|
|
88
|
+
api;
|
|
89
|
+
constructor(options) {
|
|
90
|
+
if (typeof window !== "undefined" && options?.dangerouslyAllowBrowser !== true) {
|
|
91
|
+
throw new Error("ReferralsServer must run on your server: an API key must never reach a browser. Mint tokens on the server and give the page only the token.");
|
|
92
|
+
}
|
|
93
|
+
const apiKey = requireText(options?.apiKey, "apiKey", 500);
|
|
94
|
+
this.programId = requireText(options.programId, "programId", 100);
|
|
95
|
+
let url;
|
|
96
|
+
try {
|
|
97
|
+
url = new URL(options.baseUrl ?? DEFAULT_BASE_URL);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new TypeError("baseUrl must be an absolute URL.");
|
|
101
|
+
}
|
|
102
|
+
if (!isAllowedUrl(url) || url.search !== "" || url.hash !== "") {
|
|
103
|
+
throw new TypeError("baseUrl must be https (http is allowed only for localhost and 127.0.0.1), with no credentials, query or fragment.");
|
|
104
|
+
}
|
|
105
|
+
this.baseUrl = url.toString().replace(/\/+$/, "");
|
|
106
|
+
const f = options.fetch ?? (typeof fetch === "function" ? fetch.bind(globalThis) : undefined);
|
|
107
|
+
if (!f)
|
|
108
|
+
throw new TypeError("No fetch is available; pass one in the options.");
|
|
109
|
+
this.api = new BoltClawClient({ apiKey, baseUrl: this.baseUrl, fetch: f, dangerouslyAllowBrowser: true });
|
|
110
|
+
}
|
|
111
|
+
toJSON() {
|
|
112
|
+
return { programId: this.programId, baseUrl: this.baseUrl };
|
|
113
|
+
}
|
|
114
|
+
async #send(operationId, input, options = {}) {
|
|
115
|
+
try {
|
|
116
|
+
const answer = await this.api.send(operationId, input, options);
|
|
117
|
+
return { status: answer.status, body: answer.data };
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error instanceof BoltClawApiError) {
|
|
121
|
+
throw new ReferralsApiError({
|
|
122
|
+
status: error.status,
|
|
123
|
+
code: error.code,
|
|
124
|
+
message: error.message,
|
|
125
|
+
requestId: error.requestId,
|
|
126
|
+
approvalId: error.approval?.id,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async createEmbedToken(input) {
|
|
133
|
+
const mode = input.mode;
|
|
134
|
+
if (mode !== undefined && mode !== "panel" && mode !== "preview")
|
|
135
|
+
throw new TypeError("mode must be panel or preview.");
|
|
136
|
+
const body = {};
|
|
137
|
+
if (input.externalId !== undefined || mode !== "preview") {
|
|
138
|
+
body.referrer = referrerBody(input);
|
|
139
|
+
}
|
|
140
|
+
if (input.ttlSeconds !== undefined) {
|
|
141
|
+
const ttl = input.ttlSeconds;
|
|
142
|
+
if (!Number.isSafeInteger(ttl) || ttl < EMBED_TTL_MIN_SECONDS || ttl > EMBED_TTL_MAX_SECONDS) {
|
|
143
|
+
throw new TypeError(`ttlSeconds must be a whole number from ${EMBED_TTL_MIN_SECONDS} to ${EMBED_TTL_MAX_SECONDS}.`);
|
|
144
|
+
}
|
|
145
|
+
body.ttl_seconds = ttl;
|
|
146
|
+
}
|
|
147
|
+
if (mode !== undefined)
|
|
148
|
+
body.mode = mode;
|
|
149
|
+
if (input.locale !== undefined)
|
|
150
|
+
body.locale = requireLocale(input.locale);
|
|
151
|
+
const { body: answer } = await this.#send("createReferralEmbedToken", { id: this.programId, body });
|
|
152
|
+
const view = fromSnake(answer);
|
|
153
|
+
return { token: view.token, expiresAt: view.expiresAt, referrer: view.referrer ?? null };
|
|
154
|
+
}
|
|
155
|
+
async upsertReferrer(input) {
|
|
156
|
+
const body = referrerBody(input, true);
|
|
157
|
+
const { status, body: answer } = await this.#send("upsertReferralReferrer", { id: this.programId, body });
|
|
158
|
+
return { referrer: fromSnake(answer), created: status === 201 };
|
|
159
|
+
}
|
|
160
|
+
async getReferrer(externalId) {
|
|
161
|
+
requireText(externalId, "externalId");
|
|
162
|
+
const { body } = await this.#send("getReferralReferrer", { id: this.programId, external_id: externalId });
|
|
163
|
+
return fromSnake(body);
|
|
164
|
+
}
|
|
165
|
+
async shouldAsk(externalId) {
|
|
166
|
+
let view;
|
|
167
|
+
try {
|
|
168
|
+
view = await this.getReferrer(externalId);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
if (error instanceof ReferralsApiError && error.status === 404)
|
|
172
|
+
return false;
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
if (view.referrer?.status === "banned" || view.program?.status === "paused")
|
|
176
|
+
return false;
|
|
177
|
+
return view.ask?.shouldAsk === true;
|
|
178
|
+
}
|
|
179
|
+
async getOffer(code, options = {}) {
|
|
180
|
+
requireText(code, "code");
|
|
181
|
+
if (options.customerId !== undefined)
|
|
182
|
+
requireText(options.customerId, "customerId", 255);
|
|
183
|
+
if (options.newCustomer !== undefined && typeof options.newCustomer !== "boolean") {
|
|
184
|
+
throw new TypeError("newCustomer must be true or false.");
|
|
185
|
+
}
|
|
186
|
+
const locale = options.locale === undefined ? undefined : requireLocale(options.locale);
|
|
187
|
+
if (options.email !== undefined)
|
|
188
|
+
requireText(options.email, "email", 320);
|
|
189
|
+
if (options.interval !== undefined && !OFFER_INTERVALS.includes(options.interval)) {
|
|
190
|
+
throw new TypeError("interval must be month, year or one_time.");
|
|
191
|
+
}
|
|
192
|
+
const { body } = await this.#send("getReferralOffer", {
|
|
193
|
+
code,
|
|
194
|
+
customer_id: options.customerId,
|
|
195
|
+
new_customer: options.newCustomer === undefined ? undefined : String(options.newCustomer),
|
|
196
|
+
locale,
|
|
197
|
+
email: options.email,
|
|
198
|
+
interval: options.interval,
|
|
199
|
+
});
|
|
200
|
+
const answer = isObject(body) ? fromSnake(body) : {};
|
|
201
|
+
const offer = isObject(answer.offer) ? answer.offer : null;
|
|
202
|
+
const eligible = answer.eligible === true;
|
|
203
|
+
const coupon = typeof answer.coupon === "string" && answer.coupon !== "" ? answer.coupon : null;
|
|
204
|
+
return {
|
|
205
|
+
offer,
|
|
206
|
+
eligible,
|
|
207
|
+
reasonCode: answer.reasonCode ?? null,
|
|
208
|
+
reason: typeof answer.reason === "string" ? answer.reason : null,
|
|
209
|
+
coupon,
|
|
210
|
+
couponNote: typeof answer.couponNote === "string" ? answer.couponNote : null,
|
|
211
|
+
checked: Array.isArray(answer.checked)
|
|
212
|
+
? answer.checked.filter((c) => OFFER_CHECK_SOURCES.includes(String(c)))
|
|
213
|
+
: [],
|
|
214
|
+
discounts: checkoutDiscounts(offer, coupon, eligible),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
async getCustomerReferral(externalId) {
|
|
218
|
+
requireText(externalId, "externalId", 255);
|
|
219
|
+
const { body } = await this.#send("getReferralCustomerReferral", { id: this.programId, external_id: externalId });
|
|
220
|
+
const answer = isObject(body) ? fromSnake(body) : {};
|
|
221
|
+
return { invitedBy: answer.invitedBy ?? null, invitedAt: answer.invitedAt ?? null, via: answer.via ?? null };
|
|
222
|
+
}
|
|
223
|
+
async getCustomer(externalId) {
|
|
224
|
+
requireText(externalId, "externalId", 255);
|
|
225
|
+
const { body } = await this.#send("getReferralCustomer", { external_id: externalId });
|
|
226
|
+
const answer = isObject(body) ? fromSnake(body) : {};
|
|
227
|
+
return { externalId: answer.externalId ?? externalId, programs: Array.isArray(answer.programs) ? answer.programs : [] };
|
|
228
|
+
}
|
|
229
|
+
async listReferrers(query = {}) {
|
|
230
|
+
const { body } = await this.#send("listReferralReferrers", {
|
|
231
|
+
id: this.programId,
|
|
232
|
+
status: query.status,
|
|
233
|
+
search: query.search,
|
|
234
|
+
limit: query.limit,
|
|
235
|
+
cursor: query.cursor,
|
|
236
|
+
});
|
|
237
|
+
const answer = isObject(body) ? body : {};
|
|
238
|
+
const data = Array.isArray(answer.data) ? answer.data.map((row) => fromSnake(row)) : [];
|
|
239
|
+
return { data, nextCursor: typeof answer.next_cursor === "string" ? answer.next_cursor : null };
|
|
240
|
+
}
|
|
241
|
+
async eraseReferrer(referrerId, options = {}) {
|
|
242
|
+
requireText(referrerId, "referrerId");
|
|
243
|
+
const { body } = await this.#send("eraseReferralReferrer", { id: referrerId }, options.approvalId ? { approvalId: options.approvalId } : {});
|
|
244
|
+
const answer = isObject(body) ? fromSnake(body) : {};
|
|
245
|
+
return { erased: answer.erased !== false, programId: answer.programId ?? null };
|
|
246
|
+
}
|
|
247
|
+
async updateReferrerStatus(referrerId, status) {
|
|
248
|
+
requireText(referrerId, "referrerId");
|
|
249
|
+
if (status !== "approved" && status !== "banned")
|
|
250
|
+
throw new TypeError("status must be approved or banned.");
|
|
251
|
+
const { body } = await this.#send("updateReferralReferrer", { id: referrerId, body: { status } });
|
|
252
|
+
return fromSnake(body);
|
|
253
|
+
}
|
|
254
|
+
async #conversion(body, key) {
|
|
255
|
+
const { status, body: answer } = await this.#send("recordReferralConversion", { body }, idempotency(key));
|
|
256
|
+
return { conversion: fromSnake(answer), created: status === 201 };
|
|
257
|
+
}
|
|
258
|
+
#common(input, event) {
|
|
259
|
+
const body = {
|
|
260
|
+
program_id: this.programId,
|
|
261
|
+
event,
|
|
262
|
+
event_id: requireText(input?.eventId, "eventId", 255),
|
|
263
|
+
};
|
|
264
|
+
const occurredAt = optionalText(input.occurredAt, "occurredAt", 64);
|
|
265
|
+
if (occurredAt !== undefined)
|
|
266
|
+
body.occurred_at = occurredAt;
|
|
267
|
+
if (input.test !== undefined) {
|
|
268
|
+
if (typeof input.test !== "boolean")
|
|
269
|
+
throw new TypeError("test must be true or false.");
|
|
270
|
+
if (input.test)
|
|
271
|
+
body.test = true;
|
|
272
|
+
}
|
|
273
|
+
return body;
|
|
274
|
+
}
|
|
275
|
+
#customerAndReferral(input, body) {
|
|
276
|
+
const customer = { id: requireText(input.customerId, "customerId", 255) };
|
|
277
|
+
const email = optionalText(input.email, "email", 320);
|
|
278
|
+
if (email !== undefined)
|
|
279
|
+
customer.email = email;
|
|
280
|
+
if (input.customerCreatedAt !== undefined) {
|
|
281
|
+
const at = input.customerCreatedAt instanceof Date ? input.customerCreatedAt : new Date(String(input.customerCreatedAt));
|
|
282
|
+
if (Number.isNaN(at.getTime()))
|
|
283
|
+
throw new TypeError("customerCreatedAt must be a date or an ISO 8601 date-time.");
|
|
284
|
+
customer.created_at = at.toISOString();
|
|
285
|
+
}
|
|
286
|
+
if (input.customerBillingCustomer !== undefined) {
|
|
287
|
+
if (input.customerBillingCustomer !== null && typeof input.customerBillingCustomer !== "string") {
|
|
288
|
+
throw new TypeError("customerBillingCustomer must be text or null.");
|
|
289
|
+
}
|
|
290
|
+
customer.billing_customer = input.customerBillingCustomer;
|
|
291
|
+
}
|
|
292
|
+
if (input.customerLabel !== undefined) {
|
|
293
|
+
if (input.customerLabel !== null && typeof input.customerLabel !== "string")
|
|
294
|
+
throw new TypeError("customerLabel must be text or null.");
|
|
295
|
+
customer.label = input.customerLabel;
|
|
296
|
+
}
|
|
297
|
+
const signupIp = optionalText(input.signupIp, "signupIp", 64);
|
|
298
|
+
if (signupIp !== undefined)
|
|
299
|
+
customer.signup_ip = signupIp;
|
|
300
|
+
const signupUserAgent = optionalText(input.signupUserAgent, "signupUserAgent", 1024);
|
|
301
|
+
if (signupUserAgent !== undefined)
|
|
302
|
+
customer.signup_user_agent = signupUserAgent;
|
|
303
|
+
const country = optionalText(input.country, "country", 8);
|
|
304
|
+
if (country !== undefined)
|
|
305
|
+
customer.country = country;
|
|
306
|
+
if (input.firstPaidAt !== undefined && input.firstPaidAt !== null) {
|
|
307
|
+
const at = input.firstPaidAt instanceof Date ? input.firstPaidAt : new Date(String(input.firstPaidAt));
|
|
308
|
+
if (Number.isNaN(at.getTime()))
|
|
309
|
+
throw new TypeError("firstPaidAt must be a date or an ISO 8601 date-time.");
|
|
310
|
+
customer.first_paid_at = at.toISOString();
|
|
311
|
+
}
|
|
312
|
+
body.customer = customer;
|
|
313
|
+
const locale = optionalText(input.locale, "locale", 35);
|
|
314
|
+
if (locale !== undefined)
|
|
315
|
+
body.locale = locale;
|
|
316
|
+
const referral = {};
|
|
317
|
+
const code = optionalText(input.referralCode, "referralCode", 2048);
|
|
318
|
+
if (code !== undefined)
|
|
319
|
+
referral.code = code;
|
|
320
|
+
const entry = optionalText(input.entry, "entry", 32);
|
|
321
|
+
if (entry !== undefined)
|
|
322
|
+
referral.entry = entry;
|
|
323
|
+
const surface = optionalText(input.surface, "surface", 32);
|
|
324
|
+
if (surface !== undefined)
|
|
325
|
+
referral.surface = surface;
|
|
326
|
+
const discount = optionalText(input.discountCode, "discountCode", 64);
|
|
327
|
+
if (discount !== undefined)
|
|
328
|
+
referral.discount_code = discount;
|
|
329
|
+
if (input.discountApplied !== undefined) {
|
|
330
|
+
if (typeof input.discountApplied !== "boolean")
|
|
331
|
+
throw new TypeError("discountApplied must be true or false.");
|
|
332
|
+
referral.discount_applied = input.discountApplied;
|
|
333
|
+
}
|
|
334
|
+
if (Object.keys(referral).length > 0)
|
|
335
|
+
body.referral = referral;
|
|
336
|
+
}
|
|
337
|
+
async recordLead(input) {
|
|
338
|
+
const body = this.#common(input, "lead");
|
|
339
|
+
this.#customerAndReferral(input, body);
|
|
340
|
+
return this.#conversion(body, input.idempotencyKey);
|
|
341
|
+
}
|
|
342
|
+
async recordSale(input) {
|
|
343
|
+
const body = this.#common(input, "sale");
|
|
344
|
+
this.#customerAndReferral(input, body);
|
|
345
|
+
body.amount = requireMinor(input.amount, "amount");
|
|
346
|
+
body.currency = requireCurrency(input.currency);
|
|
347
|
+
const items = saleItems(input.items);
|
|
348
|
+
if (items !== undefined)
|
|
349
|
+
body.items = items;
|
|
350
|
+
return this.#conversion(body, input.idempotencyKey);
|
|
351
|
+
}
|
|
352
|
+
async recordRefund(input) {
|
|
353
|
+
const body = this.#common(input, "refund");
|
|
354
|
+
body.refund_of = requireText(input.refundOf, "refundOf", 255);
|
|
355
|
+
body.amount = requireMinor(input.amount, "amount");
|
|
356
|
+
if (input.currency !== undefined)
|
|
357
|
+
body.currency = requireCurrency(input.currency);
|
|
358
|
+
return this.#conversion(body, input.idempotencyKey);
|
|
359
|
+
}
|
|
360
|
+
async recordDispute(input) {
|
|
361
|
+
const body = this.#common(input, "dispute");
|
|
362
|
+
body.refund_of = requireText(input.refundOf, "refundOf", 255);
|
|
363
|
+
if (input.amount !== undefined)
|
|
364
|
+
body.amount = requireMinor(input.amount, "amount");
|
|
365
|
+
if (input.currency !== undefined)
|
|
366
|
+
body.currency = requireCurrency(input.currency);
|
|
367
|
+
return this.#conversion(body, input.idempotencyKey);
|
|
368
|
+
}
|
|
369
|
+
async recordClick(input) {
|
|
370
|
+
const body = { code: requireText(input?.code, "code", 64) };
|
|
371
|
+
const ip = optionalText(input.ip, "ip", 64);
|
|
372
|
+
if (ip !== undefined)
|
|
373
|
+
body.ip = ip;
|
|
374
|
+
const ua = optionalText(input.userAgent, "userAgent", 1024);
|
|
375
|
+
if (ua !== undefined)
|
|
376
|
+
body.user_agent = ua;
|
|
377
|
+
const referrer = optionalText(input.referrer, "referrer", 2048);
|
|
378
|
+
if (referrer !== undefined)
|
|
379
|
+
body.referrer = referrer;
|
|
380
|
+
const country = optionalText(input.country, "country", 8);
|
|
381
|
+
if (country !== undefined)
|
|
382
|
+
body.country = country;
|
|
383
|
+
const landing = optionalText(input.landingPath, "landingPath", 2048);
|
|
384
|
+
if (landing !== undefined)
|
|
385
|
+
body.landing_path = landing;
|
|
386
|
+
const { body: answer } = await this.#send("recordReferralClick", { body });
|
|
387
|
+
const view = isObject(answer) ? fromSnake(answer) : {};
|
|
388
|
+
return {
|
|
389
|
+
recorded: view.recorded === true,
|
|
390
|
+
reason: view.reason === "bot" || view.reason === "allowance" ? view.reason : null,
|
|
391
|
+
programId: typeof view.programId === "string" ? view.programId : this.programId,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
async getIntegrationStatus() {
|
|
395
|
+
const { body } = await this.#send("getReferralIntegrationStatus", { id: this.programId });
|
|
396
|
+
return fromSnake(body);
|
|
397
|
+
}
|
|
398
|
+
async sendTestSale(options = {}) {
|
|
399
|
+
const { body } = await this.#send("sendReferralTestSale", { id: this.programId }, idempotency(options.idempotencyKey));
|
|
400
|
+
return fromSnake(body);
|
|
401
|
+
}
|
|
402
|
+
async listGrants(query = {}) {
|
|
403
|
+
const { body } = await this.#send("listReferralGrants", {
|
|
404
|
+
id: this.programId,
|
|
405
|
+
status: query.status,
|
|
406
|
+
type: query.type,
|
|
407
|
+
recipient: query.recipient,
|
|
408
|
+
limit: query.limit,
|
|
409
|
+
cursor: query.cursor,
|
|
410
|
+
});
|
|
411
|
+
const answer = isObject(body) ? body : {};
|
|
412
|
+
const data = Array.isArray(answer.data) ? answer.data.map((row) => fromSnake(row)) : [];
|
|
413
|
+
return { data, nextCursor: typeof answer.next_cursor === "string" ? answer.next_cursor : null };
|
|
414
|
+
}
|
|
415
|
+
async getGrant(grantId) {
|
|
416
|
+
requireText(grantId, "grantId");
|
|
417
|
+
const { body } = await this.#send("getReferralGrant", { id: grantId });
|
|
418
|
+
return fromSnake(body);
|
|
419
|
+
}
|
|
420
|
+
async claimGrant(grantId, options = {}) {
|
|
421
|
+
requireText(grantId, "grantId");
|
|
422
|
+
const { body } = await this.#send("claimReferralGrant", { id: grantId }, idempotency(options.idempotencyKey));
|
|
423
|
+
const answer = isObject(body) ? body : {};
|
|
424
|
+
const claim = isObject(answer.claim) ? answer.claim : {};
|
|
425
|
+
return {
|
|
426
|
+
grant: fromSnake(answer.grant),
|
|
427
|
+
claim: { outcome: typeof claim.outcome === "string" ? claim.outcome : "", reason: typeof claim.reason === "string" ? claim.reason : null },
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
async markRewardsSeen(externalId, options = {}) {
|
|
431
|
+
requireText(externalId, "externalId");
|
|
432
|
+
const body = {};
|
|
433
|
+
if (options.through !== undefined)
|
|
434
|
+
body.through = instant(options.through, "through");
|
|
435
|
+
if (options.test === true)
|
|
436
|
+
body.test = true;
|
|
437
|
+
const { body: answer } = await this.#send("markReferralReferrerRewardsSeen", { id: this.programId, external_id: externalId, body });
|
|
438
|
+
return fromSnake(answer);
|
|
439
|
+
}
|
|
440
|
+
async recordSignup(input) {
|
|
441
|
+
const user = input?.user;
|
|
442
|
+
if (!isObject(user))
|
|
443
|
+
throw new TypeError("user is required: { id, createdAt }.");
|
|
444
|
+
const userId = requireText(user.id, "user.id", 255);
|
|
445
|
+
if (user.createdAt === undefined || user.createdAt === null) {
|
|
446
|
+
throw new TypeError("user.createdAt is required: when the account was created in your system, from your own user record.");
|
|
447
|
+
}
|
|
448
|
+
const createdAt = Date.parse(instant(user.createdAt, "user.createdAt"));
|
|
449
|
+
const given = input.occurredAt !== undefined && input.occurredAt !== null;
|
|
450
|
+
const occurredAt = given ? Date.parse(instant(input.occurredAt, "occurredAt")) : Date.now();
|
|
451
|
+
if (given && Math.floor(occurredAt / 1000) === Math.floor(createdAt / 1000)) {
|
|
452
|
+
throw new TypeError("occurredAt equals the account's creation time: occurredAt is when the signup (or the code) happened, never when the account was made. Leave it out to mean now.");
|
|
453
|
+
}
|
|
454
|
+
if (occurredAt < createdAt - SIGNUP_CLOCK_SKEW_MS) {
|
|
455
|
+
throw new TypeError("occurredAt is before the account existed: the two dates are the wrong way round (user.createdAt is the account's creation, occurredAt the signup).");
|
|
456
|
+
}
|
|
457
|
+
return this.recordLead({
|
|
458
|
+
eventId: input.eventId ?? `signup:${userId}`,
|
|
459
|
+
occurredAt: new Date(occurredAt).toISOString(),
|
|
460
|
+
customerId: userId,
|
|
461
|
+
customerCreatedAt: new Date(createdAt).toISOString(),
|
|
462
|
+
email: typeof user.email === "string" && user.email !== "" ? user.email : undefined,
|
|
463
|
+
customerLabel: input.label,
|
|
464
|
+
customerBillingCustomer: input.billingCustomer,
|
|
465
|
+
referralCode: input.code ?? null,
|
|
466
|
+
discountCode: input.discountCode ?? null,
|
|
467
|
+
entry: input.entry,
|
|
468
|
+
surface: input.surface,
|
|
469
|
+
signupIp: input.signupIp,
|
|
470
|
+
signupUserAgent: input.signupUserAgent,
|
|
471
|
+
country: input.country,
|
|
472
|
+
test: input.test,
|
|
473
|
+
idempotencyKey: input.idempotencyKey,
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
export const SIGNUP_CLOCK_SKEW_MS = 5 * 60_000;
|
|
478
|
+
function instant(value, field) {
|
|
479
|
+
const at = value instanceof Date ? value : typeof value === "string" ? new Date(value) : new Date(Number.NaN);
|
|
480
|
+
if (Number.isNaN(at.getTime()))
|
|
481
|
+
throw new TypeError(`${field} must be a date or an ISO 8601 date-time.`);
|
|
482
|
+
return at.toISOString();
|
|
483
|
+
}
|
|
484
|
+
function referrerBody(input, full = false) {
|
|
485
|
+
const out = { external_id: requireText(input?.externalId, "externalId") };
|
|
486
|
+
if (input.name !== undefined)
|
|
487
|
+
out.name = input.name;
|
|
488
|
+
if (input.email !== undefined)
|
|
489
|
+
out.email = input.email;
|
|
490
|
+
if (input.code !== undefined)
|
|
491
|
+
out.code = input.code;
|
|
492
|
+
if ("label" in input && input.label !== undefined)
|
|
493
|
+
out.label = input.label;
|
|
494
|
+
if (full) {
|
|
495
|
+
if (input.locale !== undefined)
|
|
496
|
+
out.locale = input.locale === null ? null : requireLocale(input.locale);
|
|
497
|
+
if (input.billingCustomer !== undefined)
|
|
498
|
+
out.billing_customer = input.billingCustomer;
|
|
499
|
+
if (input.test !== undefined) {
|
|
500
|
+
if (typeof input.test !== "boolean")
|
|
501
|
+
throw new TypeError("test must be true or false.");
|
|
502
|
+
if (input.test)
|
|
503
|
+
out.test = true;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return out;
|
|
507
|
+
}
|
|
508
|
+
export function createReferralsServer(options) {
|
|
509
|
+
return new ReferralsServer(options);
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export type Parsed<T> = {
|
|
2
|
+
ok: true;
|
|
3
|
+
value: T;
|
|
4
|
+
} | {
|
|
5
|
+
ok: false;
|
|
6
|
+
error: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const BOLTCLAW_LINK_HOSTS: readonly string[];
|
|
9
|
+
export declare const DEFAULT_LINK_PARAM = "via";
|
|
10
|
+
export declare const TYPED_INPUT_MAX = 2048;
|
|
11
|
+
export interface TypedCodeHosts {
|
|
12
|
+
hosts?: readonly string[];
|
|
13
|
+
linkHosts?: readonly string[];
|
|
14
|
+
param?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function typedCodeLooksLikeLink(input: unknown): boolean;
|
|
17
|
+
export declare function parseTypedCode(input: unknown, hosts?: TypedCodeHosts): string | null;
|
|
18
|
+
export declare function codeKeyOf(code: string): string;
|
|
19
|
+
export declare const CODE_STYLES: readonly ["standard", "typed"];
|
|
20
|
+
export type CodeStyle = (typeof CODE_STYLES)[number];
|
|
21
|
+
export declare const CODE_PREFIXES: readonly ["none", "name"];
|
|
22
|
+
export type CodePrefix = (typeof CODE_PREFIXES)[number];
|
|
23
|
+
export declare const TYPED_CODE_LENGTH_MIN = 6;
|
|
24
|
+
export declare const TYPED_CODE_LENGTH_MAX = 8;
|
|
25
|
+
export declare const TYPED_CODE_LENGTH_DEFAULT = 8;
|
|
26
|
+
export declare const STANDARD_CODE_LENGTH = 10;
|
|
27
|
+
export declare const NAME_PREFIX_MAX = 8;
|
|
28
|
+
export declare const NAME_RANDOM_LENGTH = 4;
|
|
29
|
+
export interface ProgramCodeStyle {
|
|
30
|
+
style: CodeStyle;
|
|
31
|
+
length: number | null;
|
|
32
|
+
prefix: CodePrefix;
|
|
33
|
+
}
|
|
34
|
+
export declare const STANDARD_CODE_STYLE: ProgramCodeStyle;
|
|
35
|
+
export declare function codeStyleOf(row: {
|
|
36
|
+
codeStyle?: unknown;
|
|
37
|
+
codeLength?: unknown;
|
|
38
|
+
codePrefix?: unknown;
|
|
39
|
+
} | null | undefined): ProgramCodeStyle;
|
|
40
|
+
export declare function parseCodeStyle(input: {
|
|
41
|
+
style?: unknown;
|
|
42
|
+
length?: unknown;
|
|
43
|
+
prefix?: unknown;
|
|
44
|
+
}, current?: ProgramCodeStyle): Parsed<ProgramCodeStyle>;
|
|
45
|
+
export declare function foldNameForCode(name: unknown): string;
|
|
46
|
+
export declare function codeInStyle(style: ProgramCodeStyle, name: unknown, draw: (length: number) => string): string;
|
|
47
|
+
export declare function displayCode(code: string, style: ProgramCodeStyle | CodeStyle): string;
|
|
48
|
+
export declare const CODE_WINDOWS: readonly ["account_age", "first_payment"];
|
|
49
|
+
export type CodeWindow = (typeof CODE_WINDOWS)[number];
|
|
50
|
+
export declare const CODE_WINDOW_ENTRIES: readonly ["link", "typed", "checkout_code"];
|
|
51
|
+
export type CodeWindowEntry = (typeof CODE_WINDOW_ENTRIES)[number];
|
|
52
|
+
export declare const CODE_WINDOW_DAYS_MIN = 1;
|
|
53
|
+
export declare const CODE_WINDOW_DAYS_MAX = 365;
|
|
54
|
+
export declare const CODE_WINDOW_DAYS_DEFAULT = 30;
|
|
55
|
+
export interface ProgramCodeWindow {
|
|
56
|
+
until: CodeWindow;
|
|
57
|
+
days: number;
|
|
58
|
+
entries: CodeWindowEntry[] | null;
|
|
59
|
+
}
|
|
60
|
+
export declare const ACCOUNT_AGE_WINDOW: ProgramCodeWindow;
|
|
61
|
+
export declare function codeWindowOf(row: {
|
|
62
|
+
codeWindow?: unknown;
|
|
63
|
+
codeWindowDays?: unknown;
|
|
64
|
+
codeWindowEntries?: unknown;
|
|
65
|
+
} | null | undefined): ProgramCodeWindow;
|
|
66
|
+
export declare function parseCodeWindow(input: {
|
|
67
|
+
until?: unknown;
|
|
68
|
+
days?: unknown;
|
|
69
|
+
entries?: unknown;
|
|
70
|
+
}, current?: ProgramCodeWindow): Parsed<ProgramCodeWindow>;
|
|
71
|
+
export declare function firstPaymentWindowApplies(window: ProgramCodeWindow, entry: string | null): boolean;
|
|
72
|
+
export declare const REFERRAL_REFUSALS: readonly ["late_code", "self_referral", "unknown_code", "inactive_code", "too_many_attempts", "paid_before", "already_referred"];
|
|
73
|
+
export type ReferralRefusal = (typeof REFERRAL_REFUSALS)[number];
|
|
74
|
+
export declare function isReferralRefusal(value: unknown): value is ReferralRefusal;
|
|
75
|
+
export declare const REFUSAL_SENTENCES_EN: Readonly<Record<ReferralRefusal, string>>;
|
|
76
|
+
export declare const CODE_ATTEMPTS_PER_CUSTOMER_HOUR = 10;
|
|
77
|
+
export declare const CODE_ATTEMPTS_PER_NETWORK_HOUR = 30;
|
|
78
|
+
export declare const CODE_GUESSING_MIN = 5;
|