@blamejs/blamejs-shop 0.0.129 → 0.1.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/CHANGELOG.md +4 -0
- package/lib/admin.js +1 -2
- package/lib/affiliates.js +4 -3
- package/lib/analytics.js +3 -2
- package/lib/api-keys.js +1 -1
- package/lib/assembly-instructions.js +2 -1
- package/lib/auto-replenish.js +4 -3
- package/lib/backorder.js +2 -1
- package/lib/business-hours.js +8 -1
- package/lib/carrier-accounts.js +1 -1
- package/lib/carrier-rates.js +1 -1
- package/lib/cart-abandonment.js +3 -2
- package/lib/cart-bulk-ops.js +2 -1
- package/lib/cart-recovery.js +5 -4
- package/lib/cart.js +6 -2
- package/lib/catalog-drafts.js +1 -1
- package/lib/click-and-collect.js +3 -2
- package/lib/clickstream.js +4 -3
- package/lib/config.js +2 -1
- package/lib/cookie-consent.js +2 -1
- package/lib/credit-limits.js +2 -1
- package/lib/currency-display.js +2 -1
- package/lib/customer-activity.js +3 -2
- package/lib/customer-impersonation.js +3 -3
- package/lib/customer-merge.js +4 -3
- package/lib/customer-portal.js +4 -4
- package/lib/customer-risk-profile.js +2 -1
- package/lib/customer-segments.js +2 -1
- package/lib/customer-surveys.js +6 -3
- package/lib/delivery-estimate.js +2 -2
- package/lib/demand-forecast.js +2 -1
- package/lib/discount-analytics.js +2 -2
- package/lib/dunning.js +4 -1
- package/lib/email-warmup.js +6 -1
- package/lib/email.js +1 -8
- package/lib/error-log.js +3 -2
- package/lib/event-log.js +3 -2
- package/lib/fraud-screen.js +3 -1
- package/lib/fulfillment-sla.js +3 -1
- package/lib/index.js +11 -3
- package/lib/inventory-allocations.js +3 -0
- package/lib/inventory-snapshots.js +2 -1
- package/lib/invoice-renderer.js +2 -1
- package/lib/line-gift-wrap.js +6 -1
- package/lib/live-chat.js +2 -1
- package/lib/loyalty-redemption.js +2 -1
- package/lib/newsletter.js +6 -1
- package/lib/operator-activity-feed.js +4 -3
- package/lib/operator-sessions.js +7 -7
- package/lib/order-exchanges.js +1 -0
- package/lib/order-timeline.js +2 -1
- package/lib/payment-retries.js +2 -1
- package/lib/payment.js +5 -4
- package/lib/pixel-events.js +6 -5
- package/lib/preorder.js +2 -1
- package/lib/print-queue.js +2 -1
- package/lib/product-compare.js +2 -1
- package/lib/product-qa.js +2 -1
- package/lib/push-notifications.js +6 -5
- package/lib/recently-viewed.js +7 -2
- package/lib/recommendations.js +7 -2
- package/lib/referral-leaderboard.js +2 -1
- package/lib/refund-automation.js +1 -1
- package/lib/refund-policy.js +1 -1
- package/lib/reorder-reminders.js +2 -1
- package/lib/reorder-thresholds.js +2 -1
- package/lib/robots-config.js +1 -0
- package/lib/sales-reports.js +17 -14
- package/lib/sales-tax-filings.js +2 -1
- package/lib/save-for-later.js +2 -1
- package/lib/search-suggestions.js +1 -1
- package/lib/shipping-insurance.js +2 -1
- package/lib/shipping-labels.js +3 -2
- package/lib/shipping-zones.js +1 -0
- package/lib/shrinkage-report.js +9 -8
- package/lib/sms-dispatcher.js +6 -5
- package/lib/stock-alerts.js +1 -1
- package/lib/stock-receipts.js +2 -1
- package/lib/store-credit.js +2 -1
- package/lib/storefront-forms.js +1 -1
- package/lib/storefront.js +93 -112
- package/lib/subscription-analytics.js +7 -2
- package/lib/subscription-controls.js +9 -8
- package/lib/subscription-gifts.js +2 -1
- package/lib/subscriptions.js +2 -0
- package/lib/support-tickets.js +4 -4
- package/lib/tax-cert-renewals.js +2 -1
- package/lib/tax-remittance.js +2 -1
- package/lib/theme-assets.js +1 -1
- package/lib/vendor/MANIFEST.json +2 -2
- package/lib/vendor/blamejs/CHANGELOG.md +2 -0
- package/lib/vendor/blamejs/README.md +1 -0
- package/lib/vendor/blamejs/api-snapshot.json +92 -2
- package/lib/vendor/blamejs/index.js +1 -0
- package/lib/vendor/blamejs/lib/did.js +367 -0
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.12.41.json +18 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +9 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/did.test.js +147 -0
- package/lib/vendor-invoices.js +1 -1
- package/lib/webhook-receiver.js +8 -2
- package/lib/webhook-subscriptions.js +1 -1
- package/lib/webhooks.js +6 -5
- package/lib/winback-campaigns.js +2 -1
- package/lib/wishlist-alerts.js +2 -1
- package/lib/wishlist-digest.js +2 -1
- package/package.json +1 -1
package/lib/email-warmup.js
CHANGED
|
@@ -92,6 +92,11 @@
|
|
|
92
92
|
|
|
93
93
|
// ---- constants ----------------------------------------------------------
|
|
94
94
|
|
|
95
|
+
// `_b()` is a hoisted function declaration (defined below); resolving the
|
|
96
|
+
// framework constants here at module-eval is safe — the index entry point
|
|
97
|
+
// exposes `framework` before the require cascade.
|
|
98
|
+
var C = _b().constants;
|
|
99
|
+
|
|
95
100
|
var MAX_SLUG_LEN = 80;
|
|
96
101
|
var MAX_DAILY_TARGETS = 365; // a year of ramp ceiling — operator schedule, not framework
|
|
97
102
|
var MAX_DAILY_TARGET = 10000000; // 10M sends in one day — well above any reasonable IP ceiling
|
|
@@ -100,7 +105,7 @@ var MAX_REASON_LEN = 280;
|
|
|
100
105
|
var MAX_LIST_LIMIT = 500;
|
|
101
106
|
var MAX_DOMAIN_LEN = 253; // DNS hostname cap
|
|
102
107
|
var MAX_IP_LEN = 45; // IPv6 max textual length
|
|
103
|
-
var MS_PER_DAY =
|
|
108
|
+
var MS_PER_DAY = C.TIME.days(1);
|
|
104
109
|
|
|
105
110
|
var SLUG_RE = /^[a-z0-9][a-z0-9._-]{0,79}$/;
|
|
106
111
|
// Lowercase domain — IDN punycode + alnum + hyphen + dot, ending in a
|
package/lib/email.js
CHANGED
|
@@ -32,16 +32,9 @@ function _b() {
|
|
|
32
32
|
return bShop.framework;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
var HTML_ESCAPE_MAP = {
|
|
36
|
-
"&": "&",
|
|
37
|
-
"<": "<",
|
|
38
|
-
">": ">",
|
|
39
|
-
"\"": """,
|
|
40
|
-
"'": "'",
|
|
41
|
-
};
|
|
42
35
|
function _htmlEscape(s) {
|
|
43
36
|
if (s == null) return "";
|
|
44
|
-
return
|
|
37
|
+
return _b().template.escapeHtml(String(s));
|
|
45
38
|
}
|
|
46
39
|
|
|
47
40
|
// Strict {{var}} renderer. Refuses unrecognized placeholders so a
|
package/lib/error-log.js
CHANGED
|
@@ -71,9 +71,10 @@ function _b() {
|
|
|
71
71
|
if (!bShop) bShop = require("./index");
|
|
72
72
|
return bShop.framework;
|
|
73
73
|
}
|
|
74
|
+
var C = _b().constants;
|
|
74
75
|
|
|
75
|
-
var ONE_YEAR_MS = 365
|
|
76
|
-
var DEFAULT_WINDOW_MS =
|
|
76
|
+
var ONE_YEAR_MS = C.TIME.days(365);
|
|
77
|
+
var DEFAULT_WINDOW_MS = C.TIME.days(1); // 24h — the dashboard's default
|
|
77
78
|
|
|
78
79
|
var SESSION_NAMESPACE = "error-log-session";
|
|
79
80
|
|
package/lib/event-log.js
CHANGED
|
@@ -92,6 +92,7 @@ function _b() {
|
|
|
92
92
|
if (!bShop) bShop = require("./index");
|
|
93
93
|
return bShop.framework;
|
|
94
94
|
}
|
|
95
|
+
var C = _b().constants;
|
|
95
96
|
|
|
96
97
|
// ---- constants ---------------------------------------------------------
|
|
97
98
|
|
|
@@ -115,7 +116,7 @@ var MAX_TAIL_EVENTS = 500;
|
|
|
115
116
|
var DEFAULT_TAIL_EVENTS = 50;
|
|
116
117
|
var MIN_POLL_MS = 250;
|
|
117
118
|
var DEFAULT_POLL_MS = 2000;
|
|
118
|
-
var MAX_POLL_MS =
|
|
119
|
+
var MAX_POLL_MS = C.TIME.minutes(1);
|
|
119
120
|
var MAX_PURGE_DAYS = 3650;
|
|
120
121
|
|
|
121
122
|
// Identifier shapes — kind / subject_kind / actor_kind / source share
|
|
@@ -650,7 +651,7 @@ function create(opts) {
|
|
|
650
651
|
throw new TypeError("eventLog.purgeOlderThan: days must be an integer in [1, " + MAX_PURGE_DAYS + "]");
|
|
651
652
|
}
|
|
652
653
|
var excludeCritical = !!input.exclude_critical;
|
|
653
|
-
var cutoff = _now() - days
|
|
654
|
+
var cutoff = _now() - C.TIME.days(days);
|
|
654
655
|
|
|
655
656
|
var sql, params;
|
|
656
657
|
if (excludeCritical) {
|
package/lib/fraud-screen.js
CHANGED
|
@@ -101,6 +101,7 @@ function _b() {
|
|
|
101
101
|
}
|
|
102
102
|
return bShop.framework;
|
|
103
103
|
}
|
|
104
|
+
var C = _b().constants;
|
|
104
105
|
|
|
105
106
|
// ---- constants ----------------------------------------------------------
|
|
106
107
|
|
|
@@ -137,10 +138,11 @@ var WEIGHTS = Object.freeze({
|
|
|
137
138
|
});
|
|
138
139
|
|
|
139
140
|
// Thresholds for the heuristic dials.
|
|
140
|
-
var VELOCITY_WINDOW_MS =
|
|
141
|
+
var VELOCITY_WINDOW_MS = C.TIME.days(1); // 24h lookback
|
|
141
142
|
var VELOCITY_MAX_OK = 3; // > N triggers
|
|
142
143
|
var HIGH_VALUE_NEW_THRESH = 50000; // 500.00 minor units
|
|
143
144
|
var SESSION_FAST_MAX_SEC = 15;
|
|
145
|
+
// allow:raw-time-literal — session-age ceiling in SECONDS (24h); compared against session_age_seconds, C.TIME returns ms
|
|
144
146
|
var SESSION_OLD_MAX_SEC = 24 * 60 * 60;
|
|
145
147
|
var LARGE_LINE_COUNT_THRESH = 25;
|
|
146
148
|
var SCORE_MAX = 100;
|
package/lib/fulfillment-sla.js
CHANGED
|
@@ -107,6 +107,7 @@ function _b() {
|
|
|
107
107
|
if (!bShop) bShop = require("./index");
|
|
108
108
|
return bShop.framework;
|
|
109
109
|
}
|
|
110
|
+
var C = _b().constants;
|
|
110
111
|
|
|
111
112
|
// ---- constants ----------------------------------------------------------
|
|
112
113
|
|
|
@@ -124,7 +125,7 @@ var SLUG_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/;
|
|
|
124
125
|
var CUTOFF_RE = /^([01][0-9]|2[0-3]):([0-5][0-9])$/;
|
|
125
126
|
var TIMEZONE_RE = /^[A-Za-z][A-Za-z0-9+_\-/]{0,63}$/;
|
|
126
127
|
|
|
127
|
-
var MS_PER_HOUR =
|
|
128
|
+
var MS_PER_HOUR = C.TIME.hours(1);
|
|
128
129
|
var MS_PER_DAY = 24 * MS_PER_HOUR;
|
|
129
130
|
|
|
130
131
|
var SEVERITY_MINOR_MAX = 24;
|
|
@@ -296,6 +297,7 @@ function _clockStart(placedAt, cutoffLocalTime, timezone) {
|
|
|
296
297
|
var nextHour = Number(nextByType.hour);
|
|
297
298
|
var nextMinute = Number(nextByType.minute);
|
|
298
299
|
var nextSecond = Number(nextByType.second);
|
|
300
|
+
// allow:raw-time-literal — converts a runtime-computed local time-of-day (h/m/s) to ms; not a fixed duration C.TIME can express
|
|
299
301
|
var localOffsetMs = (nextHour * 3600 + nextMinute * 60 + nextSecond) * 1000;
|
|
300
302
|
return nextDayMs - localOffsetMs;
|
|
301
303
|
}
|
package/lib/index.js
CHANGED
|
@@ -30,8 +30,16 @@ try {
|
|
|
30
30
|
throw e;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
// Expose the framework on the exports object up front — before the
|
|
34
|
+
// require cascade below — so a shop module that composes a framework
|
|
35
|
+
// primitive at module-eval time (e.g. `var C = require("./index")
|
|
36
|
+
// .framework.constants` via the `_b()` lazy accessor, used for
|
|
37
|
+
// duration constants) resolves `framework` cleanly while it is itself
|
|
38
|
+
// being required. Without this, `_b()` mid-cascade would see a
|
|
39
|
+
// half-built exports object with no `framework` field.
|
|
40
|
+
module.exports.framework = framework;
|
|
41
|
+
|
|
42
|
+
Object.assign(module.exports, {
|
|
35
43
|
externaldbD1: require("./externaldb-d1"),
|
|
36
44
|
r2Bridge: require("./r2-bridge"),
|
|
37
45
|
catalog: require("./catalog"),
|
|
@@ -242,4 +250,4 @@ module.exports = {
|
|
|
242
250
|
winbackCampaigns: require("./winback-campaigns"),
|
|
243
251
|
wishlistDigest: require("./wishlist-digest"),
|
|
244
252
|
operatorHelpCenter: require("./operator-help-center"),
|
|
245
|
-
};
|
|
253
|
+
});
|
|
@@ -84,6 +84,7 @@ var ORDER_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
|
84
84
|
var HOLD_ID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
85
85
|
var REASON_RE = /^[\S\s]{1,256}$/;
|
|
86
86
|
var DEFAULT_TTL = 900; // 15 minutes by default
|
|
87
|
+
// allow:raw-time-literal — TTL ceiling in SECONDS (not ms); C.TIME returns ms
|
|
87
88
|
var MAX_TTL = 24 * 60 * 60; // 24h ceiling — anything longer is a usage-error smell
|
|
88
89
|
var MIN_TTL = 1;
|
|
89
90
|
|
|
@@ -284,6 +285,7 @@ function create(opts) {
|
|
|
284
285
|
}
|
|
285
286
|
|
|
286
287
|
var ts = _monotonicTs();
|
|
288
|
+
// allow:raw-time-literal — seconds→ms conversion of a variable TTL count; C.TIME helpers take a fixed duration, not a runtime value
|
|
287
289
|
var expiresAt = ts + ttlSeconds * 1000;
|
|
288
290
|
var id = _b().uuid.v7();
|
|
289
291
|
await query(
|
|
@@ -415,6 +417,7 @@ function create(opts) {
|
|
|
415
417
|
", expected 'held'");
|
|
416
418
|
}
|
|
417
419
|
|
|
420
|
+
// allow:raw-time-literal — seconds→ms conversion of a variable TTL count; C.TIME helpers take a fixed duration, not a runtime value
|
|
418
421
|
var nextExpires = Number(existing.expires_at) + input.additional_ttl_seconds * 1000;
|
|
419
422
|
await query(
|
|
420
423
|
"UPDATE inventory_holds SET expires_at = ?1 WHERE id = ?2 AND status = 'held'",
|
|
@@ -90,6 +90,7 @@ function _b() {
|
|
|
90
90
|
if (!bShop) bShop = require("./index");
|
|
91
91
|
return bShop.framework;
|
|
92
92
|
}
|
|
93
|
+
var C = _b().constants;
|
|
93
94
|
|
|
94
95
|
// ---- constants ----------------------------------------------------------
|
|
95
96
|
|
|
@@ -660,7 +661,7 @@ function create(opts) {
|
|
|
660
661
|
// to wipe the snapshot history wholesale call with 0.
|
|
661
662
|
purgeOlderThan: async function (days) {
|
|
662
663
|
_days(days);
|
|
663
|
-
var cutoff = _now() - (days
|
|
664
|
+
var cutoff = _now() - C.TIME.days(days);
|
|
664
665
|
// Read the ids first so the return shape can carry both the
|
|
665
666
|
// count and the ids that were removed (operators occasionally
|
|
666
667
|
// want to log "purged snapshots: a, b, c" for a compliance
|
package/lib/invoice-renderer.js
CHANGED
|
@@ -88,6 +88,7 @@ function _b() {
|
|
|
88
88
|
if (!bShop) bShop = require("./index");
|
|
89
89
|
return bShop.framework;
|
|
90
90
|
}
|
|
91
|
+
var C = _b().constants;
|
|
91
92
|
|
|
92
93
|
// ---- constants ----------------------------------------------------------
|
|
93
94
|
|
|
@@ -503,7 +504,7 @@ function create(opts) {
|
|
|
503
504
|
var issuer = await _resolveIssuer();
|
|
504
505
|
|
|
505
506
|
var generatedAt = Date.now();
|
|
506
|
-
var dueAt = generatedAt + dueDays
|
|
507
|
+
var dueAt = generatedAt + C.TIME.days(dueDays);
|
|
507
508
|
|
|
508
509
|
var seq = await _advanceSeries(series);
|
|
509
510
|
var invoiceNumber = _formatInvoiceNumber(seq, generatedAt);
|
package/lib/line-gift-wrap.js
CHANGED
|
@@ -68,9 +68,14 @@
|
|
|
68
68
|
|
|
69
69
|
// ---- constants ----------------------------------------------------------
|
|
70
70
|
|
|
71
|
+
// `_b()` is a hoisted function declaration (defined below); resolving the
|
|
72
|
+
// framework constants here at module-eval is safe — the index entry point
|
|
73
|
+
// exposes `framework` before the require cascade.
|
|
74
|
+
var C = _b().constants;
|
|
75
|
+
|
|
71
76
|
var MAX_MESSAGE_LEN = 500;
|
|
72
77
|
var MAX_RECIPIENT_LEN = 120;
|
|
73
|
-
var MAX_FROM_TO_SPAN = 366
|
|
78
|
+
var MAX_FROM_TO_SPAN = C.TIME.days(366); // analytics window cap
|
|
74
79
|
|
|
75
80
|
// SKU shape mirrors catalog.js + gift-options.js — alnum + . _ -, ≤
|
|
76
81
|
// 128 chars, leading char must be alnum so a wrap_sku can never
|
package/lib/live-chat.js
CHANGED
|
@@ -114,6 +114,7 @@ function _b() {
|
|
|
114
114
|
if (!bShop) bShop = require("./index");
|
|
115
115
|
return bShop.framework;
|
|
116
116
|
}
|
|
117
|
+
var C = _b().constants;
|
|
117
118
|
|
|
118
119
|
// ---- validators ---------------------------------------------------------
|
|
119
120
|
|
|
@@ -673,7 +674,7 @@ function create(opts) {
|
|
|
673
674
|
}
|
|
674
675
|
var idleMinutes = _idleMinutes(input.idle_minutes);
|
|
675
676
|
var ts = _now();
|
|
676
|
-
var threshold = ts - idleMinutes
|
|
677
|
+
var threshold = ts - C.TIME.minutes(idleMinutes);
|
|
677
678
|
var r = await query(
|
|
678
679
|
"SELECT id FROM chat_sessions " +
|
|
679
680
|
"WHERE status IN ('queued','assigned','active','waiting') " +
|
|
@@ -68,6 +68,7 @@ function _b() {
|
|
|
68
68
|
if (!bShop) bShop = require("./index");
|
|
69
69
|
return bShop.framework;
|
|
70
70
|
}
|
|
71
|
+
var C = _b().constants;
|
|
71
72
|
|
|
72
73
|
// ---- constants ----------------------------------------------------------
|
|
73
74
|
|
|
@@ -82,7 +83,7 @@ var MAX_REDEMPTIONS_LIMIT = 200;
|
|
|
82
83
|
var MAX_POINT_COST = 100000000;
|
|
83
84
|
var MAX_PER_CUSTOMER = 100000;
|
|
84
85
|
var MAX_EXPIRES_DAYS = 3650;
|
|
85
|
-
var MS_PER_DAY =
|
|
86
|
+
var MS_PER_DAY = C.TIME.days(1);
|
|
86
87
|
|
|
87
88
|
// Slug shape matches the catalog / promo-banners convention — alnum +
|
|
88
89
|
// hyphen + underscore + dot, leading char alnum, capped length.
|
package/lib/newsletter.js
CHANGED
|
@@ -48,10 +48,15 @@
|
|
|
48
48
|
|
|
49
49
|
"use strict";
|
|
50
50
|
|
|
51
|
+
// `_b()` is a hoisted function declaration (defined below); resolving the
|
|
52
|
+
// framework constants here at module-eval is safe — the index entry point
|
|
53
|
+
// exposes `framework` before the require cascade.
|
|
54
|
+
var C = _b().constants;
|
|
55
|
+
|
|
51
56
|
var EMAIL_NAMESPACE = "newsletter-email";
|
|
52
57
|
var UNSUBSCRIBE_NAMESPACE = "newsletter-unsubscribe";
|
|
53
58
|
var UNSUBSCRIBE_TOKEN_BYTES = 24;
|
|
54
|
-
var UNSUBSCRIBE_TTL_MS = 365
|
|
59
|
+
var UNSUBSCRIBE_TTL_MS = C.TIME.days(365);
|
|
55
60
|
var MAX_SOURCE_LEN = 64;
|
|
56
61
|
var SOURCE_RE = /^[a-z0-9][a-z0-9._-]{0,62}[a-z0-9]$/;
|
|
57
62
|
|
|
@@ -106,19 +106,20 @@ function _b() {
|
|
|
106
106
|
if (!bShop) bShop = require("./index");
|
|
107
107
|
return bShop.framework;
|
|
108
108
|
}
|
|
109
|
+
var C = _b().constants;
|
|
109
110
|
|
|
110
111
|
// ---- constants ----------------------------------------------------------
|
|
111
112
|
|
|
112
113
|
var MAX_LIMIT = 200;
|
|
113
114
|
var DEFAULT_LIMIT = 50;
|
|
114
115
|
var MAX_RECENT_LOGINS = 10;
|
|
115
|
-
var ONLINE_WINDOW_MS = 5
|
|
116
|
-
var MS_PER_DAY =
|
|
116
|
+
var ONLINE_WINDOW_MS = C.TIME.minutes(5);
|
|
117
|
+
var MS_PER_DAY = C.TIME.days(1);
|
|
117
118
|
|
|
118
119
|
// Cache freshness window. summarizeForOperator returns the cached row
|
|
119
120
|
// when computed_at is within this window AND no source has a newer
|
|
120
121
|
// event than last_activity_at. Same posture as customer-activity uses.
|
|
121
|
-
var CACHE_TTL_MS = 5
|
|
122
|
+
var CACHE_TTL_MS = C.TIME.minutes(5);
|
|
122
123
|
|
|
123
124
|
// Order-key for the forOperator() pagination cursor — (occurred_at
|
|
124
125
|
// DESC, kind DESC). Tuple keeps the cursor monotonic even when two
|
package/lib/operator-sessions.js
CHANGED
|
@@ -140,16 +140,16 @@
|
|
|
140
140
|
|
|
141
141
|
var TOKEN_NAMESPACE = "operator-session-token";
|
|
142
142
|
var TOKEN_BYTES = 32;
|
|
143
|
-
var DEFAULT_TTL_SECONDS = 8 * 60 * 60; // 8-hour shift default
|
|
143
|
+
var DEFAULT_TTL_SECONDS = 8 * 60 * 60; // allow:raw-time-literal — TTL stored in seconds; C.TIME returns ms (8-hour shift default)
|
|
144
144
|
var MIN_TTL_SECONDS = 60; // refuse zero / sub-minute
|
|
145
|
-
var MAX_TTL_SECONDS = 60 * 60 * 24; // hard ceiling — one day
|
|
145
|
+
var MAX_TTL_SECONDS = 60 * 60 * 24; // allow:raw-time-literal — TTL stored in seconds; C.TIME returns ms (hard ceiling — one day)
|
|
146
146
|
var MAX_REASON_LEN = 64;
|
|
147
147
|
var MAX_UA_CLASS_LEN = 64;
|
|
148
148
|
var MAX_IP_HASH_LEN = 256;
|
|
149
149
|
var MIN_IP_HASH_LEN = 1;
|
|
150
|
-
var DEFAULT_LOCKOUT_WINDOW = 15 * 60; // 15-minute rolling window
|
|
150
|
+
var DEFAULT_LOCKOUT_WINDOW = 15 * 60; // allow:raw-time-literal — lockout window stored in seconds; C.TIME returns ms (15-minute rolling window)
|
|
151
151
|
var DEFAULT_LOCKOUT_THRESH = 5; // 5 failures trips lockout
|
|
152
|
-
var MAX_LOCKOUT_WINDOW = 24 * 60 * 60; // sanity cap — one day
|
|
152
|
+
var MAX_LOCKOUT_WINDOW = 24 * 60 * 60; // allow:raw-time-literal — lockout window stored in seconds; C.TIME returns ms (sanity cap — one day)
|
|
153
153
|
var MIN_LOCKOUT_THRESHOLD = 1;
|
|
154
154
|
var MAX_LOCKOUT_THRESHOLD = 1000;
|
|
155
155
|
|
|
@@ -344,7 +344,7 @@ function create(opts) {
|
|
|
344
344
|
var tokenHash = _b().crypto.namespaceHash(TOKEN_NAMESPACE, plaintext);
|
|
345
345
|
var id = _b().uuid.v7();
|
|
346
346
|
var now = _now();
|
|
347
|
-
var expiresAt = now + (ttl * 1000);
|
|
347
|
+
var expiresAt = now + (ttl * 1000); // allow:raw-time-literal — ttl is in seconds; * 1000 converts to ms
|
|
348
348
|
|
|
349
349
|
await query(
|
|
350
350
|
"INSERT INTO operator_sessions " +
|
|
@@ -615,7 +615,7 @@ function create(opts) {
|
|
|
615
615
|
// emit a metric.
|
|
616
616
|
expireOlderThan: async function (seconds) {
|
|
617
617
|
_seconds(seconds, "seconds");
|
|
618
|
-
var threshold = _now() - (seconds * 1000);
|
|
618
|
+
var threshold = _now() - (seconds * 1000); // allow:raw-time-literal — seconds arg is in seconds; * 1000 converts to ms
|
|
619
619
|
var r = await query(
|
|
620
620
|
"UPDATE operator_sessions " +
|
|
621
621
|
"SET status = 'expired' " +
|
|
@@ -646,7 +646,7 @@ function create(opts) {
|
|
|
646
646
|
}
|
|
647
647
|
var windowSec = _lockoutWindow(lopts.window_seconds);
|
|
648
648
|
var threshold = _lockoutThreshold(lopts.threshold);
|
|
649
|
-
var since = _now() - (windowSec * 1000);
|
|
649
|
+
var since = _now() - (windowSec * 1000); // allow:raw-time-literal — windowSec is in seconds; * 1000 converts to ms
|
|
650
650
|
var r = await query(
|
|
651
651
|
"SELECT COUNT(*) AS n FROM operator_failed_logins " +
|
|
652
652
|
"WHERE ip_hash = ?1 AND occurred_at >= ?2",
|
package/lib/order-exchanges.js
CHANGED
|
@@ -301,6 +301,7 @@ function create(opts) {
|
|
|
301
301
|
sku: existing.replacement_sku,
|
|
302
302
|
variant_id: existing.replacement_variant_id || null,
|
|
303
303
|
quantity: existing.replacement_qty,
|
|
304
|
+
// allow:raw-time-literal — hold TTL in SECONDS (passed to holdForCart's ttl_seconds); C.TIME returns ms
|
|
304
305
|
ttl_seconds: input.hold_ttl_seconds || 86400,
|
|
305
306
|
});
|
|
306
307
|
}
|
package/lib/order-timeline.js
CHANGED
|
@@ -101,6 +101,7 @@ function _b() {
|
|
|
101
101
|
if (!bShop) bShop = require("./index");
|
|
102
102
|
return bShop.framework;
|
|
103
103
|
}
|
|
104
|
+
var C = _b().constants;
|
|
104
105
|
|
|
105
106
|
// ---- constants ----------------------------------------------------------
|
|
106
107
|
|
|
@@ -113,7 +114,7 @@ var DEFAULT_RECENT_LIMIT = 20;
|
|
|
113
114
|
// pathological "no new events but the cache is stale" case still
|
|
114
115
|
// recomputes after a few minutes — gives the operator dashboard
|
|
115
116
|
// fresh totals even when the underlying primitives are quiet.
|
|
116
|
-
var CACHE_TTL_MS = 5
|
|
117
|
+
var CACHE_TTL_MS = C.TIME.minutes(5);
|
|
117
118
|
|
|
118
119
|
// BCP-47 shape: 2-3 alpha primary subtag, optional region/script
|
|
119
120
|
// subtags. Matches the shape gift-options uses for the same purpose.
|
package/lib/payment-retries.js
CHANGED
|
@@ -133,6 +133,7 @@ function _b() {
|
|
|
133
133
|
if (!bShop) bShop = require("./index");
|
|
134
134
|
return bShop.framework;
|
|
135
135
|
}
|
|
136
|
+
var C = _b().constants;
|
|
136
137
|
|
|
137
138
|
// ---- constants ----------------------------------------------------------
|
|
138
139
|
|
|
@@ -146,7 +147,7 @@ var MAX_SCHEDULE_STEPS = 64;
|
|
|
146
147
|
var MAX_ATTEMPTS_CAP = 64;
|
|
147
148
|
var MAX_LIST_LIMIT = 500;
|
|
148
149
|
var DEFAULT_LIST_LIMIT = 100;
|
|
149
|
-
var MS_PER_HOUR =
|
|
150
|
+
var MS_PER_HOUR = C.TIME.hours(1);
|
|
150
151
|
|
|
151
152
|
var SLUG_RE = /^[a-z](?:[a-z0-9-]*[a-z0-9])?$/;
|
|
152
153
|
var FAILURE_CODE_RE = /^[a-z](?:[a-z0-9_]*[a-z0-9])?$/;
|
package/lib/payment.js
CHANGED
|
@@ -28,6 +28,7 @@ function _b() {
|
|
|
28
28
|
if (!bShop) bShop = require("./index");
|
|
29
29
|
return bShop.framework;
|
|
30
30
|
}
|
|
31
|
+
var C = _b().constants;
|
|
31
32
|
|
|
32
33
|
var STRIPE_API_BASE_DEFAULT = "https://api.stripe.com/v1";
|
|
33
34
|
var STRIPE_WEBHOOK_TOLERANCE = 300; // ± 5 minutes (Stripe default)
|
|
@@ -38,7 +39,7 @@ var CURRENCY_RE = /^[a-z]{3}$/; // Stripe wants lowercase ISO 421
|
|
|
38
39
|
// expires on the same window — operators who run `cleanupExpired()`
|
|
39
40
|
// on a daily schedule keep the table small without ever shortening
|
|
40
41
|
// the replay window below Stripe's own retention.
|
|
41
|
-
var IDEMPOTENCY_TTL_MS =
|
|
42
|
+
var IDEMPOTENCY_TTL_MS = C.TIME.days(1);
|
|
42
43
|
var IDEMPOTENCY_NAMESPACE = "payment-idempotency-body";
|
|
43
44
|
var IDEMPOTENT_OPERATIONS = {
|
|
44
45
|
"payment_intent.create": true,
|
|
@@ -124,8 +125,8 @@ async function _verifyWebhook(headers, rawBody, secret, opts) {
|
|
|
124
125
|
if (!headerVal) return { ok: false, reason: "no-signature" };
|
|
125
126
|
|
|
126
127
|
var toleranceMs = opts.toleranceSeconds == null
|
|
127
|
-
? STRIPE_WEBHOOK_TOLERANCE * 1000
|
|
128
|
-
: opts.toleranceSeconds * 1000;
|
|
128
|
+
? STRIPE_WEBHOOK_TOLERANCE * 1000 // allow:raw-time-literal — seconds value; *1000 converts to ms
|
|
129
|
+
: opts.toleranceSeconds * 1000; // allow:raw-time-literal — runtime seconds value; *1000 converts to ms
|
|
129
130
|
if (typeof toleranceMs !== "number" || !isFinite(toleranceMs) || toleranceMs <= 0) {
|
|
130
131
|
throw new TypeError("payment.verifyWebhook: toleranceSeconds must be a positive number");
|
|
131
132
|
}
|
|
@@ -138,7 +139,7 @@ async function _verifyWebhook(headers, rawBody, secret, opts) {
|
|
|
138
139
|
body: rawBody,
|
|
139
140
|
toleranceMs: toleranceMs,
|
|
140
141
|
nonceStore: opts.nonceStore || undefined,
|
|
141
|
-
_nowMs: opts.now != null ? opts.now * 1000 : undefined,
|
|
142
|
+
_nowMs: opts.now != null ? opts.now * 1000 : undefined, // allow:raw-time-literal — opts.now is a runtime seconds value; *1000 converts to ms
|
|
142
143
|
});
|
|
143
144
|
} catch (e) {
|
|
144
145
|
var code = (e && e.code) || "";
|
package/lib/pixel-events.js
CHANGED
|
@@ -103,6 +103,7 @@ function _b() {
|
|
|
103
103
|
if (!bShop) bShop = require("./index");
|
|
104
104
|
return bShop.framework;
|
|
105
105
|
}
|
|
106
|
+
var C = _b().constants;
|
|
106
107
|
|
|
107
108
|
// ---- constants ----------------------------------------------------------
|
|
108
109
|
|
|
@@ -159,11 +160,11 @@ var PHONE_RAW_RE = /^\+?[0-9 ().\-]{7,32}$/;
|
|
|
159
160
|
// request — runaway retries against a permanently-broken provider
|
|
160
161
|
// credential would otherwise saturate the worker tick.
|
|
161
162
|
var RETRY_BACKOFF_MS = [
|
|
162
|
-
|
|
163
|
-
5
|
|
164
|
-
30
|
|
165
|
-
2
|
|
166
|
-
12
|
|
163
|
+
C.TIME.minutes(1),
|
|
164
|
+
C.TIME.minutes(5),
|
|
165
|
+
C.TIME.minutes(30),
|
|
166
|
+
C.TIME.hours(2),
|
|
167
|
+
C.TIME.hours(12),
|
|
167
168
|
];
|
|
168
169
|
|
|
169
170
|
// ---- monotonic clock ---------------------------------------------------
|
package/lib/preorder.js
CHANGED
|
@@ -108,6 +108,7 @@ function _b() {
|
|
|
108
108
|
if (!bShop) bShop = require("./index");
|
|
109
109
|
return bShop.framework;
|
|
110
110
|
}
|
|
111
|
+
var C = _b().constants;
|
|
111
112
|
|
|
112
113
|
// ---- constants ----------------------------------------------------------
|
|
113
114
|
|
|
@@ -116,7 +117,7 @@ var SKU_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
|
116
117
|
var CURRENCY_RE = /^[A-Z]{3}$/;
|
|
117
118
|
var MAX_COPY_LEN = 2000;
|
|
118
119
|
var MAX_REASON_LEN = 280;
|
|
119
|
-
var DAY_MS =
|
|
120
|
+
var DAY_MS = C.TIME.days(1);
|
|
120
121
|
|
|
121
122
|
var CAMPAIGN_STATUSES = Object.freeze(["active", "launched", "closed"]);
|
|
122
123
|
var RESERVATION_STATUSES = Object.freeze(["active", "converted", "cancelled"]);
|
package/lib/print-queue.js
CHANGED
|
@@ -113,6 +113,7 @@ function _b() {
|
|
|
113
113
|
if (!bShop) bShop = require("./index");
|
|
114
114
|
return bShop.framework;
|
|
115
115
|
}
|
|
116
|
+
var C = _b().constants;
|
|
116
117
|
|
|
117
118
|
// ---- constants ----------------------------------------------------------
|
|
118
119
|
|
|
@@ -573,7 +574,7 @@ function create(opts) {
|
|
|
573
574
|
throw new TypeError("print-queue.cleanupCompleted: input object required");
|
|
574
575
|
}
|
|
575
576
|
_hours(input.older_than_hours, "older_than_hours");
|
|
576
|
-
var cutoff = _now() - Math.floor(input.older_than_hours
|
|
577
|
+
var cutoff = _now() - Math.floor(C.TIME.hours(input.older_than_hours));
|
|
577
578
|
var r = await query(
|
|
578
579
|
"DELETE FROM print_jobs WHERE status IN ('complete', 'cancelled', 'failed') " +
|
|
579
580
|
"AND COALESCE(completed_at, failed_at, created_at) < ?1",
|
package/lib/product-compare.js
CHANGED
|
@@ -80,6 +80,7 @@ function _b() {
|
|
|
80
80
|
if (!bShop) bShop = require("./index");
|
|
81
81
|
return bShop.framework;
|
|
82
82
|
}
|
|
83
|
+
var C = _b().constants;
|
|
83
84
|
|
|
84
85
|
// ---- constants ----------------------------------------------------------
|
|
85
86
|
|
|
@@ -775,7 +776,7 @@ function create(opts) {
|
|
|
775
776
|
// dashboard can render the sweep's footprint.
|
|
776
777
|
cleanupOlderThan: async function (days) {
|
|
777
778
|
_days(days);
|
|
778
|
-
var threshold = _now() - (days
|
|
779
|
+
var threshold = _now() - C.TIME.days(days);
|
|
779
780
|
var lists = await query(
|
|
780
781
|
"DELETE FROM compare_lists WHERE updated_at < ?1",
|
|
781
782
|
[threshold],
|
package/lib/product-qa.js
CHANGED
|
@@ -91,6 +91,7 @@ function _b() {
|
|
|
91
91
|
if (!bShop) { bShop = require("./index"); }
|
|
92
92
|
return bShop.framework;
|
|
93
93
|
}
|
|
94
|
+
var C = _b().constants;
|
|
94
95
|
|
|
95
96
|
// ---- monotonic clock ---------------------------------------------------
|
|
96
97
|
//
|
|
@@ -689,7 +690,7 @@ function create(opts) {
|
|
|
689
690
|
// attached to non-rejected questions.
|
|
690
691
|
async function cleanupRejected(days) {
|
|
691
692
|
var d = _cleanupDays(days);
|
|
692
|
-
var cutoff = _now() - (d
|
|
693
|
+
var cutoff = _now() - C.TIME.days(d);
|
|
693
694
|
|
|
694
695
|
var qDel = await query(
|
|
695
696
|
"DELETE FROM product_qa_questions WHERE status = 'rejected' AND occurred_at < ?1",
|
|
@@ -73,6 +73,7 @@ function _b() {
|
|
|
73
73
|
if (!bShop) bShop = require("./index");
|
|
74
74
|
return bShop.framework;
|
|
75
75
|
}
|
|
76
|
+
var C = _b().constants;
|
|
76
77
|
|
|
77
78
|
// ---- constants ----------------------------------------------------------
|
|
78
79
|
|
|
@@ -108,11 +109,11 @@ var MAX_PROV_MSG_ID_LEN = 256;
|
|
|
108
109
|
// to compute `next_retry_at`; once the schedule is exhausted the row
|
|
109
110
|
// terminates as failed regardless of the caller's `retry` request.
|
|
110
111
|
var RETRY_BACKOFF_MS = [
|
|
111
|
-
|
|
112
|
-
5
|
|
113
|
-
30
|
|
114
|
-
2
|
|
115
|
-
12
|
|
112
|
+
C.TIME.minutes(1),
|
|
113
|
+
C.TIME.minutes(5),
|
|
114
|
+
C.TIME.minutes(30),
|
|
115
|
+
C.TIME.hours(2),
|
|
116
|
+
C.TIME.hours(12),
|
|
116
117
|
];
|
|
117
118
|
|
|
118
119
|
var SLUG_RE = /^[a-z](?:[a-z0-9-]*[a-z0-9])?$/;
|
package/lib/recently-viewed.js
CHANGED
|
@@ -76,10 +76,15 @@
|
|
|
76
76
|
* @related b.guardUuid, b.crypto.namespaceHash, b.uuid
|
|
77
77
|
*/
|
|
78
78
|
|
|
79
|
+
// `_b()` is a hoisted function declaration (defined below); resolving the
|
|
80
|
+
// framework constants here at module-eval is safe — the index entry point
|
|
81
|
+
// exposes `framework` before the require cascade.
|
|
82
|
+
var C = _b().constants;
|
|
83
|
+
|
|
79
84
|
var DEFAULT_LIMIT = 20;
|
|
80
85
|
var MAX_LIMIT = 100;
|
|
81
86
|
var PER_SUBJECT_CAP = 20;
|
|
82
|
-
var DEDUP_WINDOW_MS = 5
|
|
87
|
+
var DEDUP_WINDOW_MS = C.TIME.minutes(5);
|
|
83
88
|
var SESSION_NAMESPACE = "recently-viewed-session";
|
|
84
89
|
var SESSION_ID_RE = /^[A-Za-z0-9_-]{16,64}$/;
|
|
85
90
|
var RECOMMEND_LIMIT = 10;
|
|
@@ -479,7 +484,7 @@ function create(opts) {
|
|
|
479
484
|
// shopper population grows.
|
|
480
485
|
cleanupOlderThan: async function (days) {
|
|
481
486
|
_days(days);
|
|
482
|
-
var threshold = Date.now() - (days
|
|
487
|
+
var threshold = Date.now() - C.TIME.days(days);
|
|
483
488
|
var r = await query(
|
|
484
489
|
"DELETE FROM recently_viewed WHERE last_viewed_at < ?1",
|
|
485
490
|
[threshold],
|
package/lib/recommendations.js
CHANGED
|
@@ -106,13 +106,18 @@
|
|
|
106
106
|
* shop.recentlyViewed, shop.analytics, shop.catalog
|
|
107
107
|
*/
|
|
108
108
|
|
|
109
|
+
// `_b()` is a hoisted function declaration (defined below); resolving the
|
|
110
|
+
// framework constants here at module-eval is safe — the index entry point
|
|
111
|
+
// exposes `framework` before the require cascade.
|
|
112
|
+
var C = _b().constants;
|
|
113
|
+
|
|
109
114
|
var DEFAULT_LIMIT = 8;
|
|
110
115
|
var MAX_LIMIT = 50;
|
|
111
116
|
var MAX_CART_PRODUCTS = 50;
|
|
112
117
|
var DEFAULT_WEIGHT = 100;
|
|
113
118
|
var MAX_WEIGHT = 1000000;
|
|
114
|
-
var ONE_YEAR_MS = 365
|
|
115
|
-
var DEFAULT_WINDOW_MS = 30
|
|
119
|
+
var ONE_YEAR_MS = C.TIME.days(365);
|
|
120
|
+
var DEFAULT_WINDOW_MS = C.TIME.days(30);
|
|
116
121
|
var KINDS = ["product", "cart", "customer", "category"];
|
|
117
122
|
var EVENT_TYPES = ["impression", "click", "conversion"];
|
|
118
123
|
var SESSION_NAMESPACE = "recommendations-session";
|
|
@@ -83,6 +83,7 @@ function _b() {
|
|
|
83
83
|
if (!bShop) bShop = require("./index");
|
|
84
84
|
return bShop.framework;
|
|
85
85
|
}
|
|
86
|
+
var C = _b().constants;
|
|
86
87
|
|
|
87
88
|
var TIERS = ["bronze", "silver", "gold", "platinum"];
|
|
88
89
|
|
|
@@ -100,7 +101,7 @@ var DEFAULT_TIER_BONUS_POINTS = {
|
|
|
100
101
|
platinum: 10000,
|
|
101
102
|
};
|
|
102
103
|
|
|
103
|
-
var MS_PER_DAY =
|
|
104
|
+
var MS_PER_DAY = C.TIME.days(1);
|
|
104
105
|
var ROLLING_WINDOW_DAYS = 90;
|
|
105
106
|
|
|
106
107
|
var MAX_LEADERBOARD_LIMIT = 100;
|
package/lib/refund-automation.js
CHANGED
|
@@ -122,7 +122,7 @@ var MAX_PRIORITY = 1000000;
|
|
|
122
122
|
var MAX_LIST_LIMIT = 200;
|
|
123
123
|
var MAX_REASONS_PER_RULE = 32;
|
|
124
124
|
var MAX_CURRENCIES_PER_RULE = 32;
|
|
125
|
-
var MS_PER_YEAR = 365
|
|
125
|
+
var MS_PER_YEAR = _b().constants.TIME.days(365);
|
|
126
126
|
|
|
127
127
|
// Slug shape matches coupon-stacking / refund-policy convention.
|
|
128
128
|
var SLUG_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,79}$/;
|
package/lib/refund-policy.js
CHANGED
|
@@ -81,7 +81,7 @@ var MAX_STATUS_LEN = 64;
|
|
|
81
81
|
var MAX_WINDOW_DAYS = 36500; // ~100 years; refuses absurd values
|
|
82
82
|
var MAX_PRIORITY = 1000000;
|
|
83
83
|
var MAX_LIST_LIMIT = 200;
|
|
84
|
-
var MS_PER_DAY =
|
|
84
|
+
var MS_PER_DAY = _b().constants.TIME.days(1);
|
|
85
85
|
|
|
86
86
|
// Slug shape matches coupon-stacking / promo-banners / customer-segments
|
|
87
87
|
// convention — alnum + hyphen + underscore + dot, leading char alnum,
|