@huloglobal/vendure-plugin-visitor-analytics 0.17.1 → 0.18.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.
@@ -15,13 +15,49 @@ const core_1 = require("@vendure/core");
15
15
  const crypto_1 = require("crypto");
16
16
  const plugin_1 = require("./plugin");
17
17
  const vendure_licence_sdk_1 = require("@huloglobal/vendure-licence-sdk");
18
+ const recovery_tokens_1 = require("./recovery-tokens");
18
19
  const loggerCtx = 'HuloAbandonedCartService';
19
20
  let AbandonedCartService = class AbandonedCartService {
20
21
  constructor(connection) {
21
22
  this.connection = connection;
22
23
  }
24
+ /** Add the 0.18.0 columns + the opt-out table on installs that don't
25
+ * run TypeORM migrations for plugins. Idempotent; never blocks boot. */
26
+ async onApplicationBootstrap() {
27
+ try {
28
+ await this.ensureSchema();
29
+ }
30
+ catch (e) {
31
+ common_1.Logger.warn(`Schema check failed (will retry next boot): ${e === null || e === void 0 ? void 0 : e.message}`, loggerCtx);
32
+ }
33
+ }
34
+ async ensureSchema() {
35
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
36
+ const cols = [
37
+ ['resumeOrderCode', 'VARCHAR(32) NULL'],
38
+ ['recoveryStep', 'VARCHAR(16) NULL'],
39
+ ['convertedAt', 'DATETIME(3) NULL'],
40
+ ['convertedOrderId', 'INT NULL'],
41
+ ['convertedOrderCode', 'VARCHAR(32) NULL'],
42
+ ];
43
+ for (const [name, type] of cols) {
44
+ await conn.query(`ALTER TABLE abandoned_cart ADD COLUMN IF NOT EXISTS ${name} ${type}`);
45
+ }
46
+ await conn.query(`
47
+ CREATE TABLE IF NOT EXISTS abandoned_cart_opt_out (
48
+ id INT AUTO_INCREMENT PRIMARY KEY,
49
+ emailHash VARCHAR(64) NOT NULL,
50
+ email VARCHAR(255) NOT NULL,
51
+ channelId INT NULL,
52
+ source VARCHAR(32) NOT NULL DEFAULT 'link',
53
+ ip VARCHAR(45) NULL,
54
+ createdAt DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
55
+ UNIQUE INDEX abandoned_cart_opt_out_hash_uniq (emailHash)
56
+ )
57
+ `);
58
+ }
23
59
  opts() {
24
- var _a, _b, _c, _d, _e, _f;
60
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
25
61
  const raw = (0, plugin_1.getOptions)().abandonment;
26
62
  return {
27
63
  windowMinutes: (_a = raw === null || raw === void 0 ? void 0 : raw.windowMinutes) !== null && _a !== void 0 ? _a : 30,
@@ -30,6 +66,8 @@ let AbandonedCartService = class AbandonedCartService {
30
66
  recoveryLinkSecret: (_d = raw === null || raw === void 0 ? void 0 : raw.recoveryLinkSecret) !== null && _d !== void 0 ? _d : '',
31
67
  recoveryLinkTtlHours: (_e = raw === null || raw === void 0 ? void 0 : raw.recoveryLinkTtlHours) !== null && _e !== void 0 ? _e : 72,
32
68
  storefrontBaseUrl: (_f = raw === null || raw === void 0 ? void 0 : raw.storefrontBaseUrl) !== null && _f !== void 0 ? _f : (0, plugin_1.getOptions)().publicBaseUrl,
69
+ storefrontBaseUrls: (_g = raw === null || raw === void 0 ? void 0 : raw.storefrontBaseUrls) !== null && _g !== void 0 ? _g : {},
70
+ optOutSecret: (_k = (_j = (_h = raw === null || raw === void 0 ? void 0 : raw.optOutSecret) !== null && _h !== void 0 ? _h : raw === null || raw === void 0 ? void 0 : raw.recoveryLinkSecret) !== null && _j !== void 0 ? _j : (0, plugin_1.getOptions)().signingSecret) !== null && _k !== void 0 ? _k : '',
33
71
  };
34
72
  }
35
73
  /**
@@ -52,7 +90,7 @@ let AbandonedCartService = class AbandonedCartService {
52
90
  // 1. Auto-mark existing abandoned rows as converted when a
53
91
  // matching checkout_completed lands afterwards.
54
92
  const converted = await conn.query(`UPDATE abandoned_cart ac
55
- SET ac.status = 'converted', ac.recoveredAt = NOW()
93
+ SET ac.status = 'converted', ac.recoveredAt = NOW(), ac.convertedAt = COALESCE(ac.convertedAt, NOW())
56
94
  WHERE ac.status = 'abandoned'
57
95
  AND EXISTS (
58
96
  SELECT 1 FROM visitor_event ve
@@ -240,31 +278,65 @@ let AbandonedCartService = class AbandonedCartService {
240
278
  * restore the cart. Returns null when the recovery-link secret is
241
279
  * unset (feature disabled). Idempotent: reissues a fresh token so
242
280
  * you can safely regenerate before every send.
281
+ *
282
+ * Pass `{ resumeOrderCode }` to bind the link to the visitor's open
283
+ * Vendure order: `findByRecoveryToken` / the resume endpoint then
284
+ * return that code (while the order is still `AddingItems` /
285
+ * `ArrangingPayment`) so the storefront can pick up the same order
286
+ * instead of rebuilding it. Passing `{ resumeOrderCode: null }`
287
+ * clears a previous binding; omitting the option keeps it.
288
+ *
289
+ * Also advances `recoveryStep` to `link_issued`.
243
290
  */
244
- async issueRecoveryLink(cartId) {
291
+ async issueRecoveryLink(cartId, options = {}) {
245
292
  const o = this.opts();
246
293
  if (!o.recoveryLinkSecret)
247
294
  return null;
248
295
  const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
249
- const rows = await conn.query(`SELECT sessionId, visitorId FROM abandoned_cart WHERE id = ? LIMIT 1`, [cartId]);
296
+ const rows = await conn.query(`SELECT ac.sessionId, ac.visitorId, ac.channelId, ac.recoveryStep, ch.code AS channelCode
297
+ FROM abandoned_cart ac LEFT JOIN channel ch ON ch.id = ac.channelId
298
+ WHERE ac.id = ? LIMIT 1`, [cartId]);
250
299
  if (!(rows === null || rows === void 0 ? void 0 : rows.length))
251
300
  return null;
252
301
  const token = (0, crypto_1.randomBytes)(24).toString('base64url');
253
302
  const expiresAt = new Date(Date.now() + o.recoveryLinkTtlHours * 3600000);
254
- await conn.query(`UPDATE abandoned_cart SET recoveryToken = ?, recoveryTokenExpiresAt = ? WHERE id = ?`, [token, expiresAt, cartId]);
255
- const base = (o.storefrontBaseUrl || '').replace(/\/$/, '');
256
- return `${base}/cart/restore?t=${token}`;
303
+ const step = (0, recovery_tokens_1.advanceRecoveryStep)(rows[0].recoveryStep, 'link_issued');
304
+ if (options.resumeOrderCode !== undefined) {
305
+ const code = options.resumeOrderCode === null ? null : (0, recovery_tokens_1.sanitiseOrderCode)(options.resumeOrderCode) || null;
306
+ await conn.query(`UPDATE abandoned_cart
307
+ SET recoveryToken = ?, recoveryTokenExpiresAt = ?, resumeOrderCode = ?, recoveryStep = ?
308
+ WHERE id = ?`, [token, expiresAt, code, step, cartId]);
309
+ }
310
+ else {
311
+ await conn.query(`UPDATE abandoned_cart SET recoveryToken = ?, recoveryTokenExpiresAt = ?, recoveryStep = ? WHERE id = ?`, [token, expiresAt, step, cartId]);
312
+ }
313
+ return `${this.storefrontBaseFor(rows[0].channelCode)}/cart/restore?t=${token}`;
314
+ }
315
+ /** Storefront origin for a channel: the per-channel map first, then
316
+ * the single storefrontBaseUrl. Trailing slashes are dropped. */
317
+ storefrontBaseFor(channelCode) {
318
+ var _a;
319
+ const o = this.opts();
320
+ const perChannel = channelCode ? (_a = o.storefrontBaseUrls) === null || _a === void 0 ? void 0 : _a[channelCode] : undefined;
321
+ return String(perChannel || o.storefrontBaseUrl || '').replace(/\/$/, '');
257
322
  }
258
323
  /**
259
324
  * Look up an abandoned cart by its recovery token. Returns null if
260
325
  * the token is unknown, expired, or the cart is already recovered.
261
326
  * Storefront calls this via `/ees/recover-cart?t=...` to rebuild the
262
327
  * cart from the persisted itemsJson.
328
+ *
329
+ * Since 0.18.0 the result also carries `orderCode` / `orderState` /
330
+ * `resumable` when the link was bound to an order, and the call
331
+ * advances `recoveryStep` to `link_opened`.
263
332
  */
264
333
  async findByRecoveryToken(token) {
265
334
  const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
266
- const rows = await conn.query(`SELECT id, currency, itemsJson, email, recoveryTokenExpiresAt, status
267
- FROM abandoned_cart WHERE recoveryToken = ? LIMIT 1`, [token]);
335
+ const t = String(token || '').trim();
336
+ if (!t || t.length > 128)
337
+ return null;
338
+ const rows = await conn.query(`SELECT id, currency, itemsJson, email, recoveryTokenExpiresAt, status, resumeOrderCode, recoveryStep, channelId
339
+ FROM abandoned_cart WHERE recoveryToken = ? LIMIT 1`, [t]);
268
340
  if (!(rows === null || rows === void 0 ? void 0 : rows.length))
269
341
  return null;
270
342
  const r = rows[0];
@@ -274,12 +346,216 @@ let AbandonedCartService = class AbandonedCartService {
274
346
  await conn.query(`UPDATE abandoned_cart SET status = 'expired' WHERE id = ?`, [r.id]);
275
347
  return null;
276
348
  }
349
+ const step = (0, recovery_tokens_1.advanceRecoveryStep)(r.recoveryStep, 'link_opened');
350
+ if (step !== r.recoveryStep) {
351
+ await conn.query(`UPDATE abandoned_cart SET recoveryStep = ? WHERE id = ?`, [step, r.id]);
352
+ }
353
+ return this.buildRecoveredCart(r);
354
+ }
355
+ /**
356
+ * Token-bound "resume" — the storefront calls this (via
357
+ * `POST /ees/recover-cart/resume?t=…`) when it would rather pick up
358
+ * the exact order the visitor left than rebuild a cart. Returns the
359
+ * same payload as `findByRecoveryToken` plus `resumeOrderCode`, which
360
+ * is set only while the bound order is still open. Advances
361
+ * `recoveryStep` to `resumed` (only when there is an order to resume,
362
+ * so the funnel column stays honest).
363
+ */
364
+ async resumeByRecoveryToken(token) {
365
+ const cart = await this.findByRecoveryToken(token);
366
+ if (!cart)
367
+ return null;
368
+ const resumeOrderCode = cart.resumable ? cart.orderCode : null;
369
+ if (resumeOrderCode) {
370
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
371
+ await conn.query(`UPDATE abandoned_cart SET recoveryStep = ? WHERE id = ? AND (recoveryStep IS NULL OR recoveryStep IN ('link_issued','link_opened'))`, ['resumed', cart.id]);
372
+ }
373
+ return { ...cart, resumeOrderCode };
374
+ }
375
+ /**
376
+ * Attribution: the restored cart checked out. Called by the storefront
377
+ * (`POST /ees/recover-cart/converted { t, orderCode }`) from the
378
+ * confirmation page. Token-bound so nobody can mark a stranger's cart
379
+ * converted; the order must exist and be past `AddingItems`.
380
+ *
381
+ * Deliberately ignores token expiry and the row's status — a visitor
382
+ * who opens the link at hour 71 and pays at hour 73 still converted.
383
+ * Idempotent.
384
+ */
385
+ async markConvertedByToken(token, orderCode) {
386
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
387
+ const t = String(token || '').trim();
388
+ const code = (0, recovery_tokens_1.sanitiseOrderCode)(orderCode);
389
+ if (!t || t.length > 128 || !code)
390
+ return { ok: false, error: 'invalid-token' };
391
+ const rows = await conn.query(`SELECT id, status, convertedOrderCode FROM abandoned_cart WHERE recoveryToken = ? LIMIT 1`, [t]);
392
+ if (!(rows === null || rows === void 0 ? void 0 : rows.length))
393
+ return { ok: false, error: 'invalid-token' };
394
+ const cart = rows[0];
395
+ if (cart.status === 'converted' && cart.convertedOrderCode === code) {
396
+ return { ok: true, cartId: Number(cart.id), orderCode: code, alreadyConverted: true };
397
+ }
398
+ const order = await this.lookupOrder(code);
399
+ if (!order)
400
+ return { ok: false, error: 'order-not-found' };
401
+ if (order.state === 'AddingItems' || order.state === 'Cancelled' || order.state === 'Draft') {
402
+ return { ok: false, error: 'order-not-placed' };
403
+ }
404
+ await conn.query(`UPDATE abandoned_cart
405
+ SET status = 'converted',
406
+ recoveredAt = COALESCE(recoveredAt, NOW(3)),
407
+ convertedAt = COALESCE(convertedAt, NOW(3)),
408
+ convertedOrderId = ?,
409
+ convertedOrderCode = ?,
410
+ recoveryOrderId = COALESCE(recoveryOrderId, ?),
411
+ recoveryStep = 'converted'
412
+ WHERE id = ?`, [order.id, order.code, order.id, cart.id]);
413
+ common_1.Logger.log(`Recovery link converted: cart=${cart.id} order=${order.code}`, loggerCtx);
414
+ return { ok: true, cartId: Number(cart.id), orderCode: order.code, alreadyConverted: false };
415
+ }
416
+ // ── opt-out ─────────────────────────────────────────────────────
417
+ optOutSecret() {
418
+ return this.opts().optOutSecret;
419
+ }
420
+ /** True when the address has asked not to receive recovery emails.
421
+ * Hosts MUST check this before every send. Fail-open on DB errors
422
+ * would mean emailing someone who opted out, so this fails closed. */
423
+ async isOptedOut(email) {
424
+ const e = (0, recovery_tokens_1.normaliseEmail)(email);
425
+ if (!e)
426
+ return false;
427
+ try {
428
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
429
+ const rows = await conn.query(`SELECT 1 AS x FROM abandoned_cart_opt_out WHERE emailHash = ? LIMIT 1`, [(0, recovery_tokens_1.hashEmail)(e)]);
430
+ return !!(rows === null || rows === void 0 ? void 0 : rows.length);
431
+ }
432
+ catch (err) {
433
+ common_1.Logger.warn(`isOptedOut(${e}) failed — treating as opted out: ${err === null || err === void 0 ? void 0 : err.message}`, loggerCtx);
434
+ return true;
435
+ }
436
+ }
437
+ /** Record an opt-out. Idempotent. Returns false for a malformed email. */
438
+ async optOut(email, meta = {}) {
439
+ var _a;
440
+ const e = (0, recovery_tokens_1.normaliseEmail)(email);
441
+ if (!e)
442
+ return false;
443
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
444
+ await conn.query(`INSERT INTO abandoned_cart_opt_out (emailHash, email, channelId, source, ip, createdAt)
445
+ VALUES (?, ?, ?, ?, ?, NOW(3))
446
+ ON DUPLICATE KEY UPDATE email = VALUES(email)`, [(0, recovery_tokens_1.hashEmail)(e), e, (_a = meta.channelId) !== null && _a !== void 0 ? _a : null, String(meta.source || 'link').slice(0, 32), meta.ip ? String(meta.ip).slice(0, 45) : null], { conflictColumns: ['emailHash'] });
447
+ return true;
448
+ }
449
+ /** Remove an opt-out (admin action after an explicit customer request). */
450
+ async optIn(email) {
451
+ var _a;
452
+ const e = (0, recovery_tokens_1.normaliseEmail)(email);
453
+ if (!e)
454
+ return false;
455
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
456
+ const res = await conn.query(`DELETE FROM abandoned_cart_opt_out WHERE emailHash = ?`, [(0, recovery_tokens_1.hashEmail)(e)], { needAffected: true });
457
+ return Number((_a = res === null || res === void 0 ? void 0 : res.affectedRows) !== null && _a !== void 0 ? _a : 0) > 0;
458
+ }
459
+ async listOptOuts(take = 50, skip = 0) {
460
+ var _a;
461
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
462
+ const [rows, totalRow] = await Promise.all([
463
+ conn.query(`SELECT id, email, channelId, source, createdAt FROM abandoned_cart_opt_out
464
+ ORDER BY createdAt DESC LIMIT ? OFFSET ?`, [take, skip]),
465
+ conn.query(`SELECT COUNT(*) AS c FROM abandoned_cart_opt_out`),
466
+ ]);
467
+ return { items: rows, total: Number(((_a = totalRow === null || totalRow === void 0 ? void 0 : totalRow[0]) === null || _a === void 0 ? void 0 : _a.c) || 0) };
468
+ }
469
+ /** Absolute opt-out URL for an email, on the Vendure server's public
470
+ * origin. Null when no secret is configured. */
471
+ buildOptOutLink(email) {
472
+ return (0, recovery_tokens_1.buildOptOutUrl)((0, plugin_1.getOptions)().publicBaseUrl, email, this.optOutSecret());
473
+ }
474
+ /** `List-Unsubscribe` + `List-Unsubscribe-Post` headers for a recovery
475
+ * email to `email`. Null when opt-out links are disabled. */
476
+ buildListUnsubscribeHeaders(email) {
477
+ return (0, recovery_tokens_1.buildListUnsubscribeHeaders)((0, plugin_1.getOptions)().publicBaseUrl, email, this.optOutSecret());
478
+ }
479
+ /** Exposed for the controller — verifies an `e=` token. */
480
+ getOptOutSecret() {
481
+ return this.optOutSecret();
482
+ }
483
+ // ── attribution ─────────────────────────────────────────────────
484
+ /** Recovery-link funnel for the admin summary: how many carts got a
485
+ * link, how many opened it, resumed, converted — and the value of
486
+ * the carts the link brought back. */
487
+ async attributionSummary(since) {
488
+ var _a;
489
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
490
+ const rows = await conn.query(`SELECT
491
+ SUM(CASE WHEN recoveryStep IS NOT NULL THEN 1 ELSE 0 END) AS linkIssued,
492
+ SUM(CASE WHEN recoveryStep IN ('link_opened','resumed','converted') THEN 1 ELSE 0 END) AS linkOpened,
493
+ SUM(CASE WHEN recoveryStep IN ('resumed','converted') THEN 1 ELSE 0 END) AS resumed,
494
+ SUM(CASE WHEN recoveryStep = 'converted' THEN 1 ELSE 0 END) AS convertedViaLink,
495
+ SUM(CASE WHEN recoveryStep = 'converted' THEN totalMinor ELSE 0 END) AS convertedViaLinkValueMinor,
496
+ SUM(CASE WHEN status = 'converted' THEN 1 ELSE 0 END) AS convertedTotal
497
+ FROM abandoned_cart
498
+ WHERE abandonedAt >= ?`, [since]);
499
+ let optOuts = 0;
500
+ try {
501
+ const o = await conn.query(`SELECT COUNT(*) AS c FROM abandoned_cart_opt_out WHERE createdAt >= ?`, [since]);
502
+ optOuts = Number(((_a = o === null || o === void 0 ? void 0 : o[0]) === null || _a === void 0 ? void 0 : _a.c) || 0);
503
+ }
504
+ catch { /* table missing on a very old install — reported as 0 */ }
505
+ const s = (rows === null || rows === void 0 ? void 0 : rows[0]) || {};
506
+ return {
507
+ linkIssued: Number(s.linkIssued || 0),
508
+ linkOpened: Number(s.linkOpened || 0),
509
+ resumed: Number(s.resumed || 0),
510
+ convertedViaLink: Number(s.convertedViaLink || 0),
511
+ convertedViaLinkValueMinor: Number(s.convertedViaLinkValueMinor || 0),
512
+ convertedTotal: Number(s.convertedTotal || 0),
513
+ optOuts,
514
+ };
515
+ }
516
+ // ── order lookup ────────────────────────────────────────────────
517
+ async lookupOrder(code) {
518
+ const c = (0, recovery_tokens_1.sanitiseOrderCode)(code);
519
+ if (!c)
520
+ return null;
521
+ const conn = (0, vendure_licence_sdk_1.adapterFor)(this.connection.rawConnection);
522
+ try {
523
+ const rows = await conn.query('SELECT o.id, o.code, o.state, oc.channelId AS channelId\n' +
524
+ 'FROM `order` o LEFT JOIN order_channels_channel oc ON oc.orderId = o.id\n' +
525
+ 'WHERE o.code = ? LIMIT 1', [c]);
526
+ if (!(rows === null || rows === void 0 ? void 0 : rows.length))
527
+ return null;
528
+ const r = rows[0];
529
+ return { id: Number(r.id), code: String(r.code), state: String(r.state), channelId: r.channelId == null ? null : Number(r.channelId) };
530
+ }
531
+ catch (e) {
532
+ common_1.Logger.warn(`Order lookup for ${c} failed: ${e === null || e === void 0 ? void 0 : e.message}`, loggerCtx);
533
+ return null;
534
+ }
535
+ }
536
+ async buildRecoveredCart(r) {
537
+ var _a, _b;
277
538
  let items = [];
278
539
  try {
279
540
  items = JSON.parse(r.itemsJson || '[]');
280
541
  }
281
542
  catch { }
282
- return { id: Number(r.id), currency: String(r.currency || 'GBP'), items, email: r.email };
543
+ const orderCode = (0, recovery_tokens_1.sanitiseOrderCode)(r.resumeOrderCode) || null;
544
+ let orderState = null;
545
+ if (orderCode) {
546
+ const order = await this.lookupOrder(orderCode);
547
+ orderState = (_a = order === null || order === void 0 ? void 0 : order.state) !== null && _a !== void 0 ? _a : null;
548
+ }
549
+ return {
550
+ id: Number(r.id),
551
+ currency: String(r.currency || 'GBP'),
552
+ items,
553
+ email: (_b = r.email) !== null && _b !== void 0 ? _b : null,
554
+ orderCode,
555
+ orderState,
556
+ resumable: !!orderCode && (0, recovery_tokens_1.isResumableOrderState)(orderState),
557
+ channelId: Number(r.channelId || 1),
558
+ };
283
559
  }
284
560
  async markStatus(cartId, status) {
285
561
  var _a;
@@ -1 +1 @@
1
- {"version":3,"file":"abandoned-cart.service.js","sourceRoot":"","sources":["../src/abandoned-cart.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"abandoned-cart.service.js","sourceRoot":"","sources":["../src/abandoned-cart.service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hulo-storefront.d.ts","sourceRoot":"","sources":["../src/hulo-storefront.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,GAAI,gBAAgB,MAAM,EAAE,yBAAoB,KAAG,MA4QjF,CAAC"}
1
+ {"version":3,"file":"hulo-storefront.d.ts","sourceRoot":"","sources":["../src/hulo-storefront.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,GAAI,gBAAgB,MAAM,EAAE,yBAAoB,KAAG,MAgUjF,CAAC"}
@@ -23,6 +23,7 @@ const HULO_STOREFRONT_JS = (backendBaseUrl, defaultChannelId = 1) => `
23
23
  var CONFIG = {
24
24
  endpoint: ${JSON.stringify(backendBaseUrl.replace(/\/$/, '') + '/ees/track')},
25
25
  recoverEndpoint: ${JSON.stringify(backendBaseUrl.replace(/\/$/, '') + '/ees/recover-cart')},
26
+ recoveryTokenKey: 'hulo_recovery_token',
26
27
  channelId: ${defaultChannelId},
27
28
  debug: false,
28
29
  autoRageClick: true,
@@ -202,12 +203,63 @@ const HULO_STOREFRONT_JS = (backendBaseUrl, defaultChannelId = 1) => `
202
203
  restoreCart: function (token) {
203
204
  var t = String(token || '').trim();
204
205
  if (!t) return Promise.reject(new Error('missing-token'));
206
+ rememberRecoveryToken(t);
205
207
  return fetch(CONFIG.recoverEndpoint + '?t=' + encodeURIComponent(t), {
206
208
  credentials: 'include',
207
209
  }).then(function (r) { return r.json(); });
208
210
  },
211
+
212
+ /**
213
+ * Like restoreCart, but asks the backend to resume the exact order
214
+ * the link was bound to. The response carries resumeOrderCode
215
+ * (non-null only while that order is still open) alongside the usual
216
+ * items — fall back to re-adding the items when it is null.
217
+ */
218
+ resumeCart: function (token) {
219
+ var t = String(token || '').trim();
220
+ if (!t) return Promise.reject(new Error('missing-token'));
221
+ rememberRecoveryToken(t);
222
+ return fetch(CONFIG.recoverEndpoint + '/resume?t=' + encodeURIComponent(t), {
223
+ method: 'POST',
224
+ credentials: 'include',
225
+ headers: { 'content-type': 'application/json' },
226
+ body: '{}',
227
+ }).then(function (r) { return r.json(); });
228
+ },
229
+
230
+ /**
231
+ * Attribution: call from the thank-you page with the placed order's
232
+ * code. Uses the recovery token remembered by restoreCart /
233
+ * resumeCart (sessionStorage), so it is a no-op for visitors who did
234
+ * not arrive through a recovery link. Resolves to null in that case.
235
+ */
236
+ recoveryConverted: function (orderCode, token) {
237
+ var t = String(token || readRecoveryToken() || '').trim();
238
+ var code = String(orderCode || '').trim();
239
+ if (!t || !code) return Promise.resolve(null);
240
+ return fetch(CONFIG.recoverEndpoint + '/converted', {
241
+ method: 'POST',
242
+ credentials: 'include',
243
+ keepalive: true,
244
+ headers: { 'content-type': 'application/json' },
245
+ body: JSON.stringify({ t: t, orderCode: code }),
246
+ }).then(function (r) { return r.json(); }).then(function (j) {
247
+ if (j && j.ok) forgetRecoveryToken();
248
+ return j;
249
+ }).catch(function () { return null; });
250
+ },
209
251
  };
210
252
 
253
+ function rememberRecoveryToken(t) {
254
+ try { sessionStorage.setItem(CONFIG.recoveryTokenKey, t); } catch (_e) {}
255
+ }
256
+ function readRecoveryToken() {
257
+ try { return sessionStorage.getItem(CONFIG.recoveryTokenKey); } catch (_e) { return null; }
258
+ }
259
+ function forgetRecoveryToken() {
260
+ try { sessionStorage.removeItem(CONFIG.recoveryTokenKey); } catch (_e) {}
261
+ }
262
+
211
263
  // ── auto rage-click detector ─────────────────────────────────────
212
264
  // Any pointerdown ≥ 3 within 500ms in a 20x20px zone counts.
213
265
  if (CONFIG.autoRageClick) {
@@ -1 +1 @@
1
- {"version":3,"file":"hulo-storefront.js","sourceRoot":"","sources":["../src/hulo-storefront.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACI,MAAM,kBAAkB,GAAG,CAAC,cAAsB,EAAE,gBAAgB,GAAG,CAAC,EAAU,EAAE,CAAC;;;;;gBAK5E,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC;uBACzD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,mBAAmB,CAAC;iBAC7E,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqQhC,CAAC;AA5QW,QAAA,kBAAkB,sBA4Q7B"}
1
+ {"version":3,"file":"hulo-storefront.js","sourceRoot":"","sources":["../src/hulo-storefront.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACI,MAAM,kBAAkB,GAAG,CAAC,cAAsB,EAAE,gBAAgB,GAAG,CAAC,EAAU,EAAE,CAAC;;;;;gBAK5E,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC;uBACzD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,mBAAmB,CAAC;;iBAE7E,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwThC,CAAC;AAhUW,QAAA,kBAAkB,sBAgU7B"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,8 @@ export { VisitorTrackingService } from './visitor-tracking.service';
6
6
  export { VisitorEvent } from './visitor-event.entity';
7
7
  export { AbandonedCart, AbandonedCartStatus } from './abandoned-cart.entity';
8
8
  export { ProductCoView } from './product-co-view.entity';
9
- export { AbandonedCartService, CartSnapshotMeta, AbandonmentOptions, } from './abandoned-cart.service';
9
+ export { AbandonedCartService, CartSnapshotMeta, AbandonmentOptions, IssueRecoveryLinkOptions, RecoveredCart, ResumedCart, } from './abandoned-cart.service';
10
+ export { RecoveryStep, RESUMABLE_ORDER_STATES, isResumableOrderState, advanceRecoveryStep, normaliseEmail, hashEmail, buildOptOutToken, verifyOptOutToken, buildOptOutUrl, buildListUnsubscribeHeaders, } from './recovery-tokens';
10
11
  export { RecommendationsService, RecommendedProduct } from './recommendations.service';
11
12
  export { SearchAnalyticsService } from './search-analytics.service';
12
13
  export { JourneyBuffsService } from './journey-buffs.service';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACH,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EACb,WAAW,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,2BAA2B,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * `@huloglobal/vendure-plugin-visitor-analytics` — public exports.
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.JourneyBuffsService = exports.SearchAnalyticsService = exports.RecommendationsService = exports.AbandonedCartService = exports.ProductCoView = exports.AbandonedCart = exports.VisitorEvent = exports.VisitorTrackingService = exports.VisitorAnalyticsPlugin = void 0;
6
+ exports.JourneyBuffsService = exports.SearchAnalyticsService = exports.RecommendationsService = exports.buildListUnsubscribeHeaders = exports.buildOptOutUrl = exports.verifyOptOutToken = exports.buildOptOutToken = exports.hashEmail = exports.normaliseEmail = exports.advanceRecoveryStep = exports.isResumableOrderState = exports.RESUMABLE_ORDER_STATES = exports.AbandonedCartService = exports.ProductCoView = exports.AbandonedCart = exports.VisitorEvent = exports.VisitorTrackingService = exports.VisitorAnalyticsPlugin = void 0;
7
7
  var plugin_1 = require("./plugin");
8
8
  Object.defineProperty(exports, "VisitorAnalyticsPlugin", { enumerable: true, get: function () { return plugin_1.VisitorAnalyticsPlugin; } });
9
9
  var visitor_tracking_service_1 = require("./visitor-tracking.service");
@@ -16,6 +16,16 @@ var product_co_view_entity_1 = require("./product-co-view.entity");
16
16
  Object.defineProperty(exports, "ProductCoView", { enumerable: true, get: function () { return product_co_view_entity_1.ProductCoView; } });
17
17
  var abandoned_cart_service_1 = require("./abandoned-cart.service");
18
18
  Object.defineProperty(exports, "AbandonedCartService", { enumerable: true, get: function () { return abandoned_cart_service_1.AbandonedCartService; } });
19
+ var recovery_tokens_1 = require("./recovery-tokens");
20
+ Object.defineProperty(exports, "RESUMABLE_ORDER_STATES", { enumerable: true, get: function () { return recovery_tokens_1.RESUMABLE_ORDER_STATES; } });
21
+ Object.defineProperty(exports, "isResumableOrderState", { enumerable: true, get: function () { return recovery_tokens_1.isResumableOrderState; } });
22
+ Object.defineProperty(exports, "advanceRecoveryStep", { enumerable: true, get: function () { return recovery_tokens_1.advanceRecoveryStep; } });
23
+ Object.defineProperty(exports, "normaliseEmail", { enumerable: true, get: function () { return recovery_tokens_1.normaliseEmail; } });
24
+ Object.defineProperty(exports, "hashEmail", { enumerable: true, get: function () { return recovery_tokens_1.hashEmail; } });
25
+ Object.defineProperty(exports, "buildOptOutToken", { enumerable: true, get: function () { return recovery_tokens_1.buildOptOutToken; } });
26
+ Object.defineProperty(exports, "verifyOptOutToken", { enumerable: true, get: function () { return recovery_tokens_1.verifyOptOutToken; } });
27
+ Object.defineProperty(exports, "buildOptOutUrl", { enumerable: true, get: function () { return recovery_tokens_1.buildOptOutUrl; } });
28
+ Object.defineProperty(exports, "buildListUnsubscribeHeaders", { enumerable: true, get: function () { return recovery_tokens_1.buildListUnsubscribeHeaders; } });
19
29
  var recommendations_service_1 = require("./recommendations.service");
20
30
  Object.defineProperty(exports, "RecommendationsService", { enumerable: true, get: function () { return recommendations_service_1.RecommendationsService; } });
21
31
  var search_analytics_service_1 = require("./search-analytics.service");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mCAAiF;AAAxE,gHAAA,sBAAsB,OAAA;AAC/B,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,+DAAsD;AAA7C,oHAAA,YAAY,OAAA;AACrB,iEAA6E;AAApE,sHAAA,aAAa,OAAA;AACtB,mEAAyD;AAAhD,uHAAA,aAAa,OAAA;AACtB,mEAIkC;AAH9B,8HAAA,oBAAoB,OAAA;AAIxB,qEAAuF;AAA9E,iIAAA,sBAAsB,OAAA;AAC/B,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mCAAiF;AAAxE,gHAAA,sBAAsB,OAAA;AAC/B,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,+DAAsD;AAA7C,oHAAA,YAAY,OAAA;AACrB,iEAA6E;AAApE,sHAAA,aAAa,OAAA;AACtB,mEAAyD;AAAhD,uHAAA,aAAa,OAAA;AACtB,mEAOkC;AAN9B,8HAAA,oBAAoB,OAAA;AAOxB,qDAW2B;AATvB,yHAAA,sBAAsB,OAAA;AACtB,wHAAA,qBAAqB,OAAA;AACrB,sHAAA,mBAAmB,OAAA;AACnB,iHAAA,cAAc,OAAA;AACd,4GAAA,SAAS,OAAA;AACT,mHAAA,gBAAgB,OAAA;AAChB,oHAAA,iBAAiB,OAAA;AACjB,iHAAA,cAAc,OAAA;AACd,8HAAA,2BAA2B,OAAA;AAE/B,qEAAuF;AAA9E,iIAAA,sBAAsB,OAAA;AAC/B,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Pure helpers behind the cart-recovery attribution + opt-out features
3
+ * (0.18.0). No I/O — everything here is unit-tested in isolation.
4
+ */
5
+ /** Vendure order states from which a customer can still pick up the same
6
+ * order (the storefront can add items / arrange payment). Anything later —
7
+ * `PaymentAuthorized`, `PaymentSettled`, `Cancelled`, … — is a finished or
8
+ * dead order and the storefront should rebuild a fresh cart instead. */
9
+ export declare const RESUMABLE_ORDER_STATES: ReadonlyArray<string>;
10
+ export declare function isResumableOrderState(state: string | null | undefined): boolean;
11
+ /**
12
+ * Where a recovery link got to. Monotonic — a step never moves backwards,
13
+ * so the admin can read a funnel straight off the column:
14
+ *
15
+ * link_issued → link_opened → resumed → converted
16
+ */
17
+ export type RecoveryStep = 'link_issued' | 'link_opened' | 'resumed' | 'converted';
18
+ export declare function recoveryStepRank(step: string | null | undefined): number;
19
+ /** Returns the later of `current` and `target`; never regresses. Unknown
20
+ * values in `current` (legacy rows, hand edits) are treated as "no step". */
21
+ export declare function advanceRecoveryStep(current: string | null | undefined, target: RecoveryStep): RecoveryStep;
22
+ /** Lower-cased, trimmed. Returns '' for anything that is not an email. */
23
+ export declare function normaliseEmail(raw: string | null | undefined): string;
24
+ /** SHA-256 hex of the normalised email — the same hash `abandoned_cart.emailHash`
25
+ * stores, so opt-outs can be matched without keeping the raw address. */
26
+ export declare function hashEmail(email: string): string;
27
+ /**
28
+ * Opt-out token: `<base64url(email)>.<base64url(hmac-sha256(secret, email))>`.
29
+ * Self-describing so the endpoint needs no DB lookup to know *who* is opting
30
+ * out, and unforgeable so a third party cannot unsubscribe someone else.
31
+ * Returns null when there is no secret (feature disabled) or the email is
32
+ * malformed.
33
+ */
34
+ export declare function buildOptOutToken(email: string, secret: string): string | null;
35
+ /** Inverse of `buildOptOutToken`. Returns the normalised email on success,
36
+ * null on any failure (bad shape, bad MAC, wrong secret). Constant-time
37
+ * MAC comparison. */
38
+ export declare function verifyOptOutToken(token: string | null | undefined, secret: string): string | null;
39
+ /** Build the absolute opt-out URL for an email. `backendBaseUrl` is the
40
+ * Vendure server's public origin (the endpoint lives on the API, not the
41
+ * storefront). */
42
+ export declare function buildOptOutUrl(backendBaseUrl: string, email: string, secret: string): string | null;
43
+ /**
44
+ * Headers a mailer should add to every abandoned-cart email so Gmail /
45
+ * Outlook / Yahoo render their native "Unsubscribe" affordance
46
+ * (RFC 2369 + RFC 8058 one-click). Returns null when opt-out links are
47
+ * disabled.
48
+ */
49
+ export declare function buildListUnsubscribeHeaders(backendBaseUrl: string, email: string, secret: string): {
50
+ 'List-Unsubscribe': string;
51
+ 'List-Unsubscribe-Post': string;
52
+ } | null;
53
+ /** Order codes are Vendure-generated (16 upper-case alphanumerics by default)
54
+ * but hosts can override the generator, so accept a generous safe subset. */
55
+ export declare function sanitiseOrderCode(raw: string | null | undefined): string;
56
+ //# sourceMappingURL=recovery-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-tokens.d.ts","sourceRoot":"","sources":["../src/recovery-tokens.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH;;;yEAGyE;AACzE,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,MAAM,CAAuC,CAAC;AAEjG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC;AAInF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGxE;AAED;8EAC8E;AAC9E,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAClC,MAAM,EAAE,YAAY,GACrB,YAAY,CAId;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIrE;AAED;0EAC0E;AAC1E,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAUD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7E;AAED;;sBAEsB;AACtB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBjG;AAED;;mBAEmB;AACnB,wBAAgB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAInG;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACvC,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACf;IAAE,kBAAkB,EAAE,MAAM,CAAC;IAAC,uBAAuB,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOxE;AAED;8EAC8E;AAC9E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGxE"}