@infuro/cms-core 1.0.38 → 1.0.40

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/dist/admin.cjs CHANGED
@@ -492,7 +492,7 @@ var init_admin_config_context = __esm({
492
492
  var CMS_VERSION;
493
493
  var init_cms_version = __esm({
494
494
  "src/lib/cms-version.ts"() {
495
- CMS_VERSION = "1.0.38" ;
495
+ CMS_VERSION = "1.0.40" ;
496
496
  }
497
497
  });
498
498
  function useCatalogCategories(enabled = true) {
@@ -9145,11 +9145,40 @@ function InvitePageContent() {
9145
9145
  confirmPassword: ""
9146
9146
  });
9147
9147
  const [loading, setLoading] = React26.useState(false);
9148
+ const [checking, setChecking] = React26.useState(Boolean(token));
9149
+ const [inviteValid, setInviteValid] = React26.useState(false);
9148
9150
  const [message, setMessage] = React26.useState("");
9149
9151
  React26.useEffect(() => {
9150
9152
  if (!token) {
9151
9153
  setMessage("Invalid invite link. Token is missing.");
9154
+ setChecking(false);
9155
+ return;
9152
9156
  }
9157
+ let cancelled = false;
9158
+ void (async () => {
9159
+ try {
9160
+ const res = await fetch(`/api/users/invite?token=${encodeURIComponent(token)}`);
9161
+ const result = await res.json();
9162
+ if (cancelled) return;
9163
+ if (res.ok && result.valid === true) {
9164
+ setInviteValid(true);
9165
+ setMessage("");
9166
+ } else {
9167
+ setInviteValid(false);
9168
+ setMessage(result.error || "This invitation is no longer valid.");
9169
+ }
9170
+ } catch {
9171
+ if (!cancelled) {
9172
+ setInviteValid(false);
9173
+ setMessage("Could not verify this invite link. Please try again.");
9174
+ }
9175
+ } finally {
9176
+ if (!cancelled) setChecking(false);
9177
+ }
9178
+ })();
9179
+ return () => {
9180
+ cancelled = true;
9181
+ };
9153
9182
  }, [
9154
9183
  token
9155
9184
  ]);
@@ -9192,12 +9221,21 @@ function InvitePageContent() {
9192
9221
  setLoading(false);
9193
9222
  }
9194
9223
  }, "handleSubmit");
9195
- if (!token) {
9224
+ if (!token || checking) {
9196
9225
  return /* @__PURE__ */ React26__namespace.default.createElement(AuthPageLayout, null, /* @__PURE__ */ React26__namespace.default.createElement("div", {
9197
9226
  className: "w-full space-y-4 p-5 sm:p-6 bg-white rounded-lg shadow-md text-center"
9198
9227
  }, /* @__PURE__ */ React26__namespace.default.createElement("h2", {
9199
9228
  className: "text-xl font-bold text-gray-900"
9200
- }, "Invalid invite"), /* @__PURE__ */ React26__namespace.default.createElement("p", {
9229
+ }, checking ? "Checking invite\u2026" : "Invalid invite"), !checking && /* @__PURE__ */ React26__namespace.default.createElement("p", {
9230
+ className: "text-sm text-gray-600"
9231
+ }, message)));
9232
+ }
9233
+ if (!inviteValid) {
9234
+ return /* @__PURE__ */ React26__namespace.default.createElement(AuthPageLayout, null, /* @__PURE__ */ React26__namespace.default.createElement("div", {
9235
+ className: "w-full space-y-4 p-5 sm:p-6 bg-white rounded-lg shadow-md text-center"
9236
+ }, /* @__PURE__ */ React26__namespace.default.createElement("h2", {
9237
+ className: "text-xl font-bold text-gray-900"
9238
+ }, "Invite unavailable"), /* @__PURE__ */ React26__namespace.default.createElement("p", {
9201
9239
  className: "text-sm text-gray-600"
9202
9240
  }, message)));
9203
9241
  }
@@ -12705,7 +12743,7 @@ function SettingsPage() {
12705
12743
  onCheckedChange: setMultiVendorEnabled
12706
12744
  }), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Label3, {
12707
12745
  className: "text-sm font-medium text-gray-700"
12708
- }, "Multi Vendor Support"), /* @__PURE__ */ React.createElement("p", {
12746
+ }, "Multi Vendor"), /* @__PURE__ */ React.createElement("p", {
12709
12747
  className: "text-xs text-gray-500"
12710
12748
  }, "Enable vendor portals, vendor logins, and vendor-scoped store data. Disabling this blocks vendor-only accounts from signing in."))), storeEnabled && /* @__PURE__ */ React.createElement("div", {
12711
12749
  className: "mt-4 flex items-center gap-3 p-4 bg-gray-50 rounded-lg border border-gray-200"
@@ -31534,6 +31572,7 @@ function VendorEditPage({ vendorId }) {
31534
31572
  const [sendOwnerEmail, setSendOwnerEmail] = React26.useState(true);
31535
31573
  const [ownerPassword, setOwnerPassword] = React26.useState("");
31536
31574
  const [ownerPasswordConfirm, setOwnerPasswordConfirm] = React26.useState("");
31575
+ const [reinviting, setReinviting] = React26.useState(false);
31537
31576
  const vendorPayload = /* @__PURE__ */ __name(() => ({
31538
31577
  name: name.trim(),
31539
31578
  legalName: legalName.trim() || null,
@@ -31613,6 +31652,57 @@ function VendorEditPage({ vendorId }) {
31613
31652
  vendorId,
31614
31653
  create
31615
31654
  ]);
31655
+ const canReinviteOwner = !create && (inviteStatus === "pending" || inviteStatus === "expired");
31656
+ const handleReinviteOwner = /* @__PURE__ */ __name(async () => {
31657
+ setReinviting(true);
31658
+ setErrors([]);
31659
+ try {
31660
+ const res = await fetch(`/api/admin/vendors/${vendorId}/resend-invite`, {
31661
+ method: "POST",
31662
+ headers: {
31663
+ "Content-Type": "application/json"
31664
+ },
31665
+ body: JSON.stringify({
31666
+ sendEmail: true
31667
+ })
31668
+ });
31669
+ const data = await res.json();
31670
+ if (!res.ok) {
31671
+ setErrors([
31672
+ data.error || data.message || "Failed to resend invite"
31673
+ ]);
31674
+ return;
31675
+ }
31676
+ const refreshRes = await fetch(`/api/vendors/${vendorId}`);
31677
+ if (refreshRes.ok) {
31678
+ const refreshed = await refreshRes.json();
31679
+ setInviteStatus(refreshed.inviteStatus ?? "pending");
31680
+ setMetadata(refreshed.metadata && typeof refreshed.metadata === "object" ? refreshed.metadata : null);
31681
+ } else {
31682
+ setInviteStatus("pending");
31683
+ }
31684
+ const inviteLink = typeof data.inviteLink === "string" ? data.inviteLink.trim() : "";
31685
+ if (inviteLink) {
31686
+ try {
31687
+ await navigator.clipboard.writeText(inviteLink);
31688
+ sonner.toast.success(data.message || "Invite resent. New link copied \u2014 previous invite links no longer work.");
31689
+ } catch {
31690
+ sonner.toast.success(data.message || "Invite resent.");
31691
+ sonner.toast.message("New invite link (previous links are invalid)", {
31692
+ description: inviteLink
31693
+ });
31694
+ }
31695
+ } else {
31696
+ sonner.toast.success(data.message || "Invite resent.");
31697
+ }
31698
+ } catch {
31699
+ setErrors([
31700
+ "Failed to resend invite"
31701
+ ]);
31702
+ } finally {
31703
+ setReinviting(false);
31704
+ }
31705
+ }, "handleReinviteOwner");
31616
31706
  if (!canOnboardVendors(session?.user)) {
31617
31707
  return /* @__PURE__ */ React26__namespace.default.createElement(VendorAccessDenied, {
31618
31708
  groupName: sessionUser?.groupName
@@ -32044,7 +32134,20 @@ function VendorEditPage({ vendorId }) {
32044
32134
  readOnly: true,
32045
32135
  value: inviteStatus,
32046
32136
  className: `mt-1 ${fieldClass} bg-gray-100`
32047
- })), /* @__PURE__ */ React26__namespace.default.createElement("div", null, /* @__PURE__ */ React26__namespace.default.createElement(FieldLabel, null, "Active"), /* @__PURE__ */ React26__namespace.default.createElement(Input, {
32137
+ })), canReinviteOwner && /* @__PURE__ */ React26__namespace.default.createElement("div", {
32138
+ className: "pt-1"
32139
+ }, /* @__PURE__ */ React26__namespace.default.createElement(Button, {
32140
+ type: "button",
32141
+ variant: "outline",
32142
+ size: "sm",
32143
+ className: "w-full",
32144
+ disabled: reinviting || saving,
32145
+ onClick: /* @__PURE__ */ __name(() => void handleReinviteOwner(), "onClick")
32146
+ }, /* @__PURE__ */ React26__namespace.default.createElement(LucideIcons.Mail, {
32147
+ className: "h-4 w-4 mr-2"
32148
+ }), reinviting ? "Sending invite\u2026" : "Re-invite owner"), /* @__PURE__ */ React26__namespace.default.createElement("p", {
32149
+ className: "mt-2 text-xs text-gray-500"
32150
+ }, "Sends a new invite email and invalidates any previous invite link immediately.")), /* @__PURE__ */ React26__namespace.default.createElement("div", null, /* @__PURE__ */ React26__namespace.default.createElement(FieldLabel, null, "Active"), /* @__PURE__ */ React26__namespace.default.createElement(Input, {
32048
32151
  readOnly: true,
32049
32152
  value: active ? "Yes" : "No",
32050
32153
  className: `mt-1 ${fieldClass} bg-gray-100`
package/dist/admin.js CHANGED
@@ -10,7 +10,7 @@ import { Slot } from '@radix-ui/react-slot';
10
10
  import { cva } from 'class-variance-authority';
11
11
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
12
12
  import * as LucideIcons from 'lucide-react';
13
- import { ChevronDown, User, Settings, LogOut, LayoutDashboard, Store, FolderTree, Layers, Building2, CalendarDays, ShoppingBag, Package, Receipt, BadgePercent, ShoppingCart, CreditCard, Users, Inbox, File, LinkIcon, ClipboardList, MessageSquare, Image as Image$1, FileText, Shield, Puzzle, X, Plus, MoreVertical, Upload, Download, Edit, Copy, RefreshCw, Trash2, Save, Check, Search, AlertCircle, MapPin, BarChart3, TrendingUp, UserCheck, Activity, Globe, Eye, MousePointer, ArrowLeftRight, RotateCcw, KeyRound, Loader2, CalendarClock, Rss, ArrowLeft, Pencil, FolderPlus, LayoutGrid, List, Move, Archive, Edit2, ExternalLink, Power, Star, ChevronUp, Zap, Filter, CheckCircle2, ImageIcon, GripVertical, ChevronRight, ArrowRight, ArrowUpRight, IndianRupee, XCircle, Clock, Play, MessageCircle, Mail, Bot, FileUp, Tag, Box, SlidersHorizontal, Calculator, Link2 as Link2$1, Unlink, Gift, MoreHorizontal, Bell, QrCode, Car, Circle, Settings2, DollarSign, Hash, ChevronLeft, Share2, Smartphone, HardDrive, Folder, Film } from 'lucide-react';
13
+ import { ChevronDown, User, Settings, LogOut, LayoutDashboard, Store, FolderTree, Layers, Building2, CalendarDays, ShoppingBag, Package, Receipt, BadgePercent, ShoppingCart, CreditCard, Users, Inbox, File, LinkIcon, ClipboardList, MessageSquare, Image as Image$1, FileText, Shield, Puzzle, X, Plus, MoreVertical, Upload, Download, Edit, Copy, RefreshCw, Trash2, Save, Check, Search, AlertCircle, MapPin, BarChart3, TrendingUp, UserCheck, Activity, Globe, Eye, MousePointer, ArrowLeftRight, RotateCcw, KeyRound, Loader2, CalendarClock, Rss, ArrowLeft, Pencil, FolderPlus, LayoutGrid, List, Move, Archive, Edit2, ExternalLink, Power, Star, ChevronUp, Mail, Zap, Filter, CheckCircle2, ImageIcon, GripVertical, ChevronRight, ArrowRight, ArrowUpRight, IndianRupee, XCircle, Clock, Play, MessageCircle, Bot, FileUp, Tag, Box, SlidersHorizontal, Calculator, Link2 as Link2$1, Unlink, Gift, MoreHorizontal, Bell, QrCode, Car, Circle, Settings2, DollarSign, Hash, ChevronLeft, Share2, Smartphone, HardDrive, Folder, Film } from 'lucide-react';
14
14
  import Image from 'next/image';
15
15
  import Link2 from 'next/link';
16
16
  import { usePathname, useSearchParams, useRouter } from 'next/navigation';
@@ -457,7 +457,7 @@ var init_admin_config_context = __esm({
457
457
  var CMS_VERSION;
458
458
  var init_cms_version = __esm({
459
459
  "src/lib/cms-version.ts"() {
460
- CMS_VERSION = "1.0.38" ;
460
+ CMS_VERSION = "1.0.40" ;
461
461
  }
462
462
  });
463
463
  function useCatalogCategories(enabled = true) {
@@ -9110,11 +9110,40 @@ function InvitePageContent() {
9110
9110
  confirmPassword: ""
9111
9111
  });
9112
9112
  const [loading, setLoading] = useState(false);
9113
+ const [checking, setChecking] = useState(Boolean(token));
9114
+ const [inviteValid, setInviteValid] = useState(false);
9113
9115
  const [message, setMessage] = useState("");
9114
9116
  useEffect(() => {
9115
9117
  if (!token) {
9116
9118
  setMessage("Invalid invite link. Token is missing.");
9119
+ setChecking(false);
9120
+ return;
9117
9121
  }
9122
+ let cancelled = false;
9123
+ void (async () => {
9124
+ try {
9125
+ const res = await fetch(`/api/users/invite?token=${encodeURIComponent(token)}`);
9126
+ const result = await res.json();
9127
+ if (cancelled) return;
9128
+ if (res.ok && result.valid === true) {
9129
+ setInviteValid(true);
9130
+ setMessage("");
9131
+ } else {
9132
+ setInviteValid(false);
9133
+ setMessage(result.error || "This invitation is no longer valid.");
9134
+ }
9135
+ } catch {
9136
+ if (!cancelled) {
9137
+ setInviteValid(false);
9138
+ setMessage("Could not verify this invite link. Please try again.");
9139
+ }
9140
+ } finally {
9141
+ if (!cancelled) setChecking(false);
9142
+ }
9143
+ })();
9144
+ return () => {
9145
+ cancelled = true;
9146
+ };
9118
9147
  }, [
9119
9148
  token
9120
9149
  ]);
@@ -9157,12 +9186,21 @@ function InvitePageContent() {
9157
9186
  setLoading(false);
9158
9187
  }
9159
9188
  }, "handleSubmit");
9160
- if (!token) {
9189
+ if (!token || checking) {
9161
9190
  return /* @__PURE__ */ React26__default.createElement(AuthPageLayout, null, /* @__PURE__ */ React26__default.createElement("div", {
9162
9191
  className: "w-full space-y-4 p-5 sm:p-6 bg-white rounded-lg shadow-md text-center"
9163
9192
  }, /* @__PURE__ */ React26__default.createElement("h2", {
9164
9193
  className: "text-xl font-bold text-gray-900"
9165
- }, "Invalid invite"), /* @__PURE__ */ React26__default.createElement("p", {
9194
+ }, checking ? "Checking invite\u2026" : "Invalid invite"), !checking && /* @__PURE__ */ React26__default.createElement("p", {
9195
+ className: "text-sm text-gray-600"
9196
+ }, message)));
9197
+ }
9198
+ if (!inviteValid) {
9199
+ return /* @__PURE__ */ React26__default.createElement(AuthPageLayout, null, /* @__PURE__ */ React26__default.createElement("div", {
9200
+ className: "w-full space-y-4 p-5 sm:p-6 bg-white rounded-lg shadow-md text-center"
9201
+ }, /* @__PURE__ */ React26__default.createElement("h2", {
9202
+ className: "text-xl font-bold text-gray-900"
9203
+ }, "Invite unavailable"), /* @__PURE__ */ React26__default.createElement("p", {
9166
9204
  className: "text-sm text-gray-600"
9167
9205
  }, message)));
9168
9206
  }
@@ -12670,7 +12708,7 @@ function SettingsPage() {
12670
12708
  onCheckedChange: setMultiVendorEnabled
12671
12709
  }), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Label3, {
12672
12710
  className: "text-sm font-medium text-gray-700"
12673
- }, "Multi Vendor Support"), /* @__PURE__ */ React.createElement("p", {
12711
+ }, "Multi Vendor"), /* @__PURE__ */ React.createElement("p", {
12674
12712
  className: "text-xs text-gray-500"
12675
12713
  }, "Enable vendor portals, vendor logins, and vendor-scoped store data. Disabling this blocks vendor-only accounts from signing in."))), storeEnabled && /* @__PURE__ */ React.createElement("div", {
12676
12714
  className: "mt-4 flex items-center gap-3 p-4 bg-gray-50 rounded-lg border border-gray-200"
@@ -31499,6 +31537,7 @@ function VendorEditPage({ vendorId }) {
31499
31537
  const [sendOwnerEmail, setSendOwnerEmail] = useState(true);
31500
31538
  const [ownerPassword, setOwnerPassword] = useState("");
31501
31539
  const [ownerPasswordConfirm, setOwnerPasswordConfirm] = useState("");
31540
+ const [reinviting, setReinviting] = useState(false);
31502
31541
  const vendorPayload = /* @__PURE__ */ __name(() => ({
31503
31542
  name: name.trim(),
31504
31543
  legalName: legalName.trim() || null,
@@ -31578,6 +31617,57 @@ function VendorEditPage({ vendorId }) {
31578
31617
  vendorId,
31579
31618
  create
31580
31619
  ]);
31620
+ const canReinviteOwner = !create && (inviteStatus === "pending" || inviteStatus === "expired");
31621
+ const handleReinviteOwner = /* @__PURE__ */ __name(async () => {
31622
+ setReinviting(true);
31623
+ setErrors([]);
31624
+ try {
31625
+ const res = await fetch(`/api/admin/vendors/${vendorId}/resend-invite`, {
31626
+ method: "POST",
31627
+ headers: {
31628
+ "Content-Type": "application/json"
31629
+ },
31630
+ body: JSON.stringify({
31631
+ sendEmail: true
31632
+ })
31633
+ });
31634
+ const data = await res.json();
31635
+ if (!res.ok) {
31636
+ setErrors([
31637
+ data.error || data.message || "Failed to resend invite"
31638
+ ]);
31639
+ return;
31640
+ }
31641
+ const refreshRes = await fetch(`/api/vendors/${vendorId}`);
31642
+ if (refreshRes.ok) {
31643
+ const refreshed = await refreshRes.json();
31644
+ setInviteStatus(refreshed.inviteStatus ?? "pending");
31645
+ setMetadata(refreshed.metadata && typeof refreshed.metadata === "object" ? refreshed.metadata : null);
31646
+ } else {
31647
+ setInviteStatus("pending");
31648
+ }
31649
+ const inviteLink = typeof data.inviteLink === "string" ? data.inviteLink.trim() : "";
31650
+ if (inviteLink) {
31651
+ try {
31652
+ await navigator.clipboard.writeText(inviteLink);
31653
+ toast.success(data.message || "Invite resent. New link copied \u2014 previous invite links no longer work.");
31654
+ } catch {
31655
+ toast.success(data.message || "Invite resent.");
31656
+ toast.message("New invite link (previous links are invalid)", {
31657
+ description: inviteLink
31658
+ });
31659
+ }
31660
+ } else {
31661
+ toast.success(data.message || "Invite resent.");
31662
+ }
31663
+ } catch {
31664
+ setErrors([
31665
+ "Failed to resend invite"
31666
+ ]);
31667
+ } finally {
31668
+ setReinviting(false);
31669
+ }
31670
+ }, "handleReinviteOwner");
31581
31671
  if (!canOnboardVendors(session?.user)) {
31582
31672
  return /* @__PURE__ */ React26__default.createElement(VendorAccessDenied, {
31583
31673
  groupName: sessionUser?.groupName
@@ -32009,7 +32099,20 @@ function VendorEditPage({ vendorId }) {
32009
32099
  readOnly: true,
32010
32100
  value: inviteStatus,
32011
32101
  className: `mt-1 ${fieldClass} bg-gray-100`
32012
- })), /* @__PURE__ */ React26__default.createElement("div", null, /* @__PURE__ */ React26__default.createElement(FieldLabel, null, "Active"), /* @__PURE__ */ React26__default.createElement(Input, {
32102
+ })), canReinviteOwner && /* @__PURE__ */ React26__default.createElement("div", {
32103
+ className: "pt-1"
32104
+ }, /* @__PURE__ */ React26__default.createElement(Button, {
32105
+ type: "button",
32106
+ variant: "outline",
32107
+ size: "sm",
32108
+ className: "w-full",
32109
+ disabled: reinviting || saving,
32110
+ onClick: /* @__PURE__ */ __name(() => void handleReinviteOwner(), "onClick")
32111
+ }, /* @__PURE__ */ React26__default.createElement(Mail, {
32112
+ className: "h-4 w-4 mr-2"
32113
+ }), reinviting ? "Sending invite\u2026" : "Re-invite owner"), /* @__PURE__ */ React26__default.createElement("p", {
32114
+ className: "mt-2 text-xs text-gray-500"
32115
+ }, "Sends a new invite email and invalidates any previous invite link immediately.")), /* @__PURE__ */ React26__default.createElement("div", null, /* @__PURE__ */ React26__default.createElement(FieldLabel, null, "Active"), /* @__PURE__ */ React26__default.createElement(Input, {
32013
32116
  readOnly: true,
32014
32117
  value: active ? "Yes" : "No",
32015
32118
  className: `mt-1 ${fieldClass} bg-gray-100`
package/dist/api.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkVJDUKAJ3_cjs = require('./chunk-VJDUKAJ3.cjs');
3
+ var chunkT7GCOO5Y_cjs = require('./chunk-T7GCOO5Y.cjs');
4
4
  require('./chunk-22FFHLTO.cjs');
5
5
  require('./chunk-UCKN4BBY.cjs');
6
6
  require('./chunk-7NMT3GBR.cjs');
@@ -20,127 +20,127 @@ require('./chunk-USNT2KNT.cjs');
20
20
 
21
21
  Object.defineProperty(exports, "createAnalyticsHandlers", {
22
22
  enumerable: true,
23
- get: function () { return chunkVJDUKAJ3_cjs.createAnalyticsHandlers; }
23
+ get: function () { return chunkT7GCOO5Y_cjs.createAnalyticsHandlers; }
24
24
  });
25
25
  Object.defineProperty(exports, "createBlogBySlugHandler", {
26
26
  enumerable: true,
27
- get: function () { return chunkVJDUKAJ3_cjs.createBlogBySlugHandler; }
27
+ get: function () { return chunkT7GCOO5Y_cjs.createBlogBySlugHandler; }
28
28
  });
29
29
  Object.defineProperty(exports, "createChangePasswordHandler", {
30
30
  enumerable: true,
31
- get: function () { return chunkVJDUKAJ3_cjs.createChangePasswordHandler; }
31
+ get: function () { return chunkT7GCOO5Y_cjs.createChangePasswordHandler; }
32
32
  });
33
33
  Object.defineProperty(exports, "createCmsApiHandler", {
34
34
  enumerable: true,
35
- get: function () { return chunkVJDUKAJ3_cjs.createCmsApiHandler; }
35
+ get: function () { return chunkT7GCOO5Y_cjs.createCmsApiHandler; }
36
36
  });
37
37
  Object.defineProperty(exports, "createCrudByIdHandler", {
38
38
  enumerable: true,
39
- get: function () { return chunkVJDUKAJ3_cjs.createCrudByIdHandler; }
39
+ get: function () { return chunkT7GCOO5Y_cjs.createCrudByIdHandler; }
40
40
  });
41
41
  Object.defineProperty(exports, "createCrudHandler", {
42
42
  enumerable: true,
43
- get: function () { return chunkVJDUKAJ3_cjs.createCrudHandler; }
43
+ get: function () { return chunkT7GCOO5Y_cjs.createCrudHandler; }
44
44
  });
45
45
  Object.defineProperty(exports, "createDashboardStatsHandler", {
46
46
  enumerable: true,
47
- get: function () { return chunkVJDUKAJ3_cjs.createDashboardStatsHandler; }
47
+ get: function () { return chunkT7GCOO5Y_cjs.createDashboardStatsHandler; }
48
48
  });
49
49
  Object.defineProperty(exports, "createEcommerceAnalyticsHandler", {
50
50
  enumerable: true,
51
- get: function () { return chunkVJDUKAJ3_cjs.createEcommerceAnalyticsHandler; }
51
+ get: function () { return chunkT7GCOO5Y_cjs.createEcommerceAnalyticsHandler; }
52
52
  });
53
53
  Object.defineProperty(exports, "createForgotPasswordHandler", {
54
54
  enumerable: true,
55
- get: function () { return chunkVJDUKAJ3_cjs.createForgotPasswordHandler; }
55
+ get: function () { return chunkT7GCOO5Y_cjs.createForgotPasswordHandler; }
56
56
  });
57
57
  Object.defineProperty(exports, "createFormBySlugHandler", {
58
58
  enumerable: true,
59
- get: function () { return chunkVJDUKAJ3_cjs.createFormBySlugHandler; }
59
+ get: function () { return chunkT7GCOO5Y_cjs.createFormBySlugHandler; }
60
60
  });
61
61
  Object.defineProperty(exports, "createInviteAcceptHandler", {
62
62
  enumerable: true,
63
- get: function () { return chunkVJDUKAJ3_cjs.createInviteAcceptHandler; }
63
+ get: function () { return chunkT7GCOO5Y_cjs.createInviteAcceptHandler; }
64
64
  });
65
65
  Object.defineProperty(exports, "createJobScheduleHandlers", {
66
66
  enumerable: true,
67
- get: function () { return chunkVJDUKAJ3_cjs.createJobScheduleHandlers; }
67
+ get: function () { return chunkT7GCOO5Y_cjs.createJobScheduleHandlers; }
68
68
  });
69
69
  Object.defineProperty(exports, "createLlmAgentKnowledgeHandlers", {
70
70
  enumerable: true,
71
- get: function () { return chunkVJDUKAJ3_cjs.createLlmAgentKnowledgeHandlers; }
71
+ get: function () { return chunkT7GCOO5Y_cjs.createLlmAgentKnowledgeHandlers; }
72
72
  });
73
73
  Object.defineProperty(exports, "createMediaZipExtractHandler", {
74
74
  enumerable: true,
75
- get: function () { return chunkVJDUKAJ3_cjs.createMediaZipExtractHandler; }
75
+ get: function () { return chunkT7GCOO5Y_cjs.createMediaZipExtractHandler; }
76
76
  });
77
77
  Object.defineProperty(exports, "createSetPasswordHandler", {
78
78
  enumerable: true,
79
- get: function () { return chunkVJDUKAJ3_cjs.createSetPasswordHandler; }
79
+ get: function () { return chunkT7GCOO5Y_cjs.createSetPasswordHandler; }
80
80
  });
81
81
  Object.defineProperty(exports, "createSettingsApiHandlers", {
82
82
  enumerable: true,
83
- get: function () { return chunkVJDUKAJ3_cjs.createSettingsApiHandlers; }
83
+ get: function () { return chunkT7GCOO5Y_cjs.createSettingsApiHandlers; }
84
84
  });
85
85
  Object.defineProperty(exports, "createStorefrontApiHandler", {
86
86
  enumerable: true,
87
- get: function () { return chunkVJDUKAJ3_cjs.createStorefrontApiHandler; }
87
+ get: function () { return chunkT7GCOO5Y_cjs.createStorefrontApiHandler; }
88
88
  });
89
89
  Object.defineProperty(exports, "createUploadHandler", {
90
90
  enumerable: true,
91
- get: function () { return chunkVJDUKAJ3_cjs.createUploadHandler; }
91
+ get: function () { return chunkT7GCOO5Y_cjs.createUploadHandler; }
92
92
  });
93
93
  Object.defineProperty(exports, "createUserAuthApiRouter", {
94
94
  enumerable: true,
95
- get: function () { return chunkVJDUKAJ3_cjs.createUserAuthApiRouter; }
95
+ get: function () { return chunkT7GCOO5Y_cjs.createUserAuthApiRouter; }
96
96
  });
97
97
  Object.defineProperty(exports, "createUserAvatarHandler", {
98
98
  enumerable: true,
99
- get: function () { return chunkVJDUKAJ3_cjs.createUserAvatarHandler; }
99
+ get: function () { return chunkT7GCOO5Y_cjs.createUserAvatarHandler; }
100
100
  });
101
101
  Object.defineProperty(exports, "createUserProfileHandler", {
102
102
  enumerable: true,
103
- get: function () { return chunkVJDUKAJ3_cjs.createUserProfileHandler; }
103
+ get: function () { return chunkT7GCOO5Y_cjs.createUserProfileHandler; }
104
104
  });
105
105
  Object.defineProperty(exports, "createUsersApiHandlers", {
106
106
  enumerable: true,
107
- get: function () { return chunkVJDUKAJ3_cjs.createUsersApiHandlers; }
107
+ get: function () { return chunkT7GCOO5Y_cjs.createUsersApiHandlers; }
108
108
  });
109
109
  Object.defineProperty(exports, "createVendorDashboardHandler", {
110
110
  enumerable: true,
111
- get: function () { return chunkVJDUKAJ3_cjs.createVendorDashboardHandler; }
111
+ get: function () { return chunkT7GCOO5Y_cjs.createVendorDashboardHandler; }
112
112
  });
113
113
  Object.defineProperty(exports, "createVendorOnboardHandlers", {
114
114
  enumerable: true,
115
- get: function () { return chunkVJDUKAJ3_cjs.createVendorOnboardHandlers; }
115
+ get: function () { return chunkT7GCOO5Y_cjs.createVendorOnboardHandlers; }
116
116
  });
117
117
  Object.defineProperty(exports, "getPublicSettingsGroup", {
118
118
  enumerable: true,
119
- get: function () { return chunkVJDUKAJ3_cjs.getPublicSettingsGroup; }
119
+ get: function () { return chunkT7GCOO5Y_cjs.getPublicSettingsGroup; }
120
120
  });
121
121
  Object.defineProperty(exports, "mergeGuardrailsIntoSystemPrompt", {
122
122
  enumerable: true,
123
- get: function () { return chunkVJDUKAJ3_cjs.mergeGuardrailsIntoSystemPrompt; }
123
+ get: function () { return chunkT7GCOO5Y_cjs.mergeGuardrailsIntoSystemPrompt; }
124
124
  });
125
125
  Object.defineProperty(exports, "parseLlmAgentValidationRules", {
126
126
  enumerable: true,
127
- get: function () { return chunkVJDUKAJ3_cjs.parseLlmAgentValidationRules; }
127
+ get: function () { return chunkT7GCOO5Y_cjs.parseLlmAgentValidationRules; }
128
128
  });
129
129
  Object.defineProperty(exports, "simpleDecrypt", {
130
130
  enumerable: true,
131
- get: function () { return chunkVJDUKAJ3_cjs.simpleDecrypt; }
131
+ get: function () { return chunkT7GCOO5Y_cjs.simpleDecrypt; }
132
132
  });
133
133
  Object.defineProperty(exports, "simpleEncrypt", {
134
134
  enumerable: true,
135
- get: function () { return chunkVJDUKAJ3_cjs.simpleEncrypt; }
135
+ get: function () { return chunkT7GCOO5Y_cjs.simpleEncrypt; }
136
136
  });
137
137
  Object.defineProperty(exports, "validateUserMessageAgainstAgentRules", {
138
138
  enumerable: true,
139
- get: function () { return chunkVJDUKAJ3_cjs.validateUserMessageAgainstAgentRules; }
139
+ get: function () { return chunkT7GCOO5Y_cjs.validateUserMessageAgainstAgentRules; }
140
140
  });
141
141
  Object.defineProperty(exports, "validateUserMessageAgainstStructuredRules", {
142
142
  enumerable: true,
143
- get: function () { return chunkVJDUKAJ3_cjs.validateUserMessageAgainstStructuredRules; }
143
+ get: function () { return chunkT7GCOO5Y_cjs.validateUserMessageAgainstStructuredRules; }
144
144
  });
145
145
  Object.defineProperty(exports, "createCmsAuthBundle", {
146
146
  enumerable: true,
package/dist/api.d.cts CHANGED
@@ -137,7 +137,7 @@ interface InviteAcceptConfig extends AuthHandlersConfig {
137
137
  entityMap: EntityMap;
138
138
  beforeActivate?: (email: string, userId: number) => Promise<void>;
139
139
  }
140
- /** Decode invite token (base64 email) and set password + unblock user */
140
+ /** Accept invite: vendor rotating token (preferred) or legacy base64 email token */
141
141
  declare function createInviteAcceptHandler(config: InviteAcceptConfig): (request: Request) => Promise<Response>;
142
142
  interface ChangePasswordConfig extends AuthHandlersConfig {
143
143
  dataSource: DataSource;
@@ -165,6 +165,7 @@ interface UserAuthApiConfig extends ForgotPasswordConfig, Omit<SetPasswordConfig
165
165
  * Path is the segment after the mount (e.g. "forgot-password"). Returns 404 for unknown paths.
166
166
  */
167
167
  declare function createUserAuthApiRouter(config: UserAuthApiConfig): {
168
+ GET(req: Request, pathname: string): Promise<Response>;
168
169
  POST(req: Request, pathname: string): Promise<Response>;
169
170
  };
170
171
 
@@ -564,6 +565,8 @@ interface VendorOnboardHandlersConfig {
564
565
  declare function createVendorOnboardHandlers(config: VendorOnboardHandlersConfig): {
565
566
  /** POST /api/admin/vendors/onboard — create vendor + owner user + vendor_users + invite */
566
567
  onboard(req: Request): Promise<Response>;
568
+ /** POST /api/admin/vendors/:id/resend-invite — rotate owner invite token and resend email */
569
+ resendInvite(req: Request, vendorIdStr: string): Promise<Response>;
567
570
  /** POST /api/admin/vendor/switch — set active vendor in session (JWT update via client) */
568
571
  switchVendor(req: Request): Promise<Response>;
569
572
  /** GET /api/admin/vendor/team */
package/dist/api.d.ts CHANGED
@@ -137,7 +137,7 @@ interface InviteAcceptConfig extends AuthHandlersConfig {
137
137
  entityMap: EntityMap;
138
138
  beforeActivate?: (email: string, userId: number) => Promise<void>;
139
139
  }
140
- /** Decode invite token (base64 email) and set password + unblock user */
140
+ /** Accept invite: vendor rotating token (preferred) or legacy base64 email token */
141
141
  declare function createInviteAcceptHandler(config: InviteAcceptConfig): (request: Request) => Promise<Response>;
142
142
  interface ChangePasswordConfig extends AuthHandlersConfig {
143
143
  dataSource: DataSource;
@@ -165,6 +165,7 @@ interface UserAuthApiConfig extends ForgotPasswordConfig, Omit<SetPasswordConfig
165
165
  * Path is the segment after the mount (e.g. "forgot-password"). Returns 404 for unknown paths.
166
166
  */
167
167
  declare function createUserAuthApiRouter(config: UserAuthApiConfig): {
168
+ GET(req: Request, pathname: string): Promise<Response>;
168
169
  POST(req: Request, pathname: string): Promise<Response>;
169
170
  };
170
171
 
@@ -564,6 +565,8 @@ interface VendorOnboardHandlersConfig {
564
565
  declare function createVendorOnboardHandlers(config: VendorOnboardHandlersConfig): {
565
566
  /** POST /api/admin/vendors/onboard — create vendor + owner user + vendor_users + invite */
566
567
  onboard(req: Request): Promise<Response>;
568
+ /** POST /api/admin/vendors/:id/resend-invite — rotate owner invite token and resend email */
569
+ resendInvite(req: Request, vendorIdStr: string): Promise<Response>;
567
570
  /** POST /api/admin/vendor/switch — set active vendor in session (JWT update via client) */
568
571
  switchVendor(req: Request): Promise<Response>;
569
572
  /** GET /api/admin/vendor/team */
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- export { createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-PYUXVU75.js';
1
+ export { createAnalyticsHandlers, createBlogBySlugHandler, createChangePasswordHandler, createCmsApiHandler, createCrudByIdHandler, createCrudHandler, createDashboardStatsHandler, createEcommerceAnalyticsHandler, createForgotPasswordHandler, createFormBySlugHandler, createInviteAcceptHandler, createJobScheduleHandlers, createLlmAgentKnowledgeHandlers, createMediaZipExtractHandler, createSetPasswordHandler, createSettingsApiHandlers, createStorefrontApiHandler, createUploadHandler, createUserAuthApiRouter, createUserAvatarHandler, createUserProfileHandler, createUsersApiHandlers, createVendorDashboardHandler, createVendorOnboardHandlers, getPublicSettingsGroup, mergeGuardrailsIntoSystemPrompt, parseLlmAgentValidationRules, simpleDecrypt, simpleEncrypt, validateUserMessageAgainstAgentRules, validateUserMessageAgainstStructuredRules } from './chunk-RCMUL6SZ.js';
2
2
  import './chunk-NNQBWDCI.js';
3
3
  import './chunk-HCIRL37O.js';
4
4
  import './chunk-JXF23MPG.js';
package/dist/auth.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkE6WVP7BK_cjs = require('./chunk-E6WVP7BK.cjs');
3
+ var chunkETZN4OQI_cjs = require('./chunk-ETZN4OQI.cjs');
4
4
  var chunkOIGCAGH7_cjs = require('./chunk-OIGCAGH7.cjs');
5
5
  var chunkWMXPKKXU_cjs = require('./chunk-WMXPKKXU.cjs');
6
6
  require('./chunk-USNT2KNT.cjs');
@@ -9,47 +9,47 @@ require('./chunk-USNT2KNT.cjs');
9
9
 
10
10
  Object.defineProperty(exports, "createCmsMiddleware", {
11
11
  enumerable: true,
12
- get: function () { return chunkE6WVP7BK_cjs.createCmsMiddleware; }
12
+ get: function () { return chunkETZN4OQI_cjs.createCmsMiddleware; }
13
13
  });
14
14
  Object.defineProperty(exports, "defaultPublicApiMethods", {
15
15
  enumerable: true,
16
- get: function () { return chunkE6WVP7BK_cjs.defaultPublicApiMethods; }
16
+ get: function () { return chunkETZN4OQI_cjs.defaultPublicApiMethods; }
17
17
  });
18
18
  Object.defineProperty(exports, "getNextAuthOptions", {
19
19
  enumerable: true,
20
- get: function () { return chunkE6WVP7BK_cjs.getNextAuthOptions; }
20
+ get: function () { return chunkETZN4OQI_cjs.getNextAuthOptions; }
21
21
  });
22
22
  Object.defineProperty(exports, "getStorefrontNextAuthOptions", {
23
23
  enumerable: true,
24
- get: function () { return chunkE6WVP7BK_cjs.getStorefrontNextAuthOptions; }
24
+ get: function () { return chunkETZN4OQI_cjs.getStorefrontNextAuthOptions; }
25
25
  });
26
26
  Object.defineProperty(exports, "isAuthDebugClientEnabled", {
27
27
  enumerable: true,
28
- get: function () { return chunkE6WVP7BK_cjs.isAuthDebugClientEnabled; }
28
+ get: function () { return chunkETZN4OQI_cjs.isAuthDebugClientEnabled; }
29
29
  });
30
30
  Object.defineProperty(exports, "isAuthDebugEnabled", {
31
31
  enumerable: true,
32
- get: function () { return chunkE6WVP7BK_cjs.isAuthDebugEnabled; }
32
+ get: function () { return chunkETZN4OQI_cjs.isAuthDebugEnabled; }
33
33
  });
34
34
  Object.defineProperty(exports, "logAuth", {
35
35
  enumerable: true,
36
- get: function () { return chunkE6WVP7BK_cjs.logAuth; }
36
+ get: function () { return chunkETZN4OQI_cjs.logAuth; }
37
37
  });
38
38
  Object.defineProperty(exports, "logAuthClient", {
39
39
  enumerable: true,
40
- get: function () { return chunkE6WVP7BK_cjs.logAuthClient; }
40
+ get: function () { return chunkETZN4OQI_cjs.logAuthClient; }
41
41
  });
42
42
  Object.defineProperty(exports, "nextAuthCookieDebugInfo", {
43
43
  enumerable: true,
44
- get: function () { return chunkE6WVP7BK_cjs.nextAuthCookieDebugInfo; }
44
+ get: function () { return chunkETZN4OQI_cjs.nextAuthCookieDebugInfo; }
45
45
  });
46
46
  Object.defineProperty(exports, "seedAdministratorPermissions", {
47
47
  enumerable: true,
48
- get: function () { return chunkE6WVP7BK_cjs.seedAdministratorPermissions; }
48
+ get: function () { return chunkETZN4OQI_cjs.seedAdministratorPermissions; }
49
49
  });
50
50
  Object.defineProperty(exports, "summarizeSessionUserForLog", {
51
51
  enumerable: true,
52
- get: function () { return chunkE6WVP7BK_cjs.summarizeSessionUserForLog; }
52
+ get: function () { return chunkETZN4OQI_cjs.summarizeSessionUserForLog; }
53
53
  });
54
54
  Object.defineProperty(exports, "OPEN_ENDPOINTS", {
55
55
  enumerable: true,
package/dist/auth.js CHANGED
@@ -1,4 +1,4 @@
1
- export { createCmsMiddleware, defaultPublicApiMethods, getNextAuthOptions, getStorefrontNextAuthOptions, isAuthDebugClientEnabled, isAuthDebugEnabled, logAuth, logAuthClient, nextAuthCookieDebugInfo, seedAdministratorPermissions, summarizeSessionUserForLog } from './chunk-SBRBR3VO.js';
1
+ export { createCmsMiddleware, defaultPublicApiMethods, getNextAuthOptions, getStorefrontNextAuthOptions, isAuthDebugClientEnabled, isAuthDebugEnabled, logAuth, logAuthClient, nextAuthCookieDebugInfo, seedAdministratorPermissions, summarizeSessionUserForLog } from './chunk-4BG7XYSH.js';
2
2
  export { OPEN_ENDPOINTS, PERMISSION_REQUIRED_ENDPOINTS, RBAC_ADMIN_ONLY_ENTITIES, canManageRoles, createAuthHelpers, createCmsAuthBundle, getRequiredPermission, isOpenEndpoint, isPublicMethod, sessionHasEntityAccess } from './chunk-UXMDSNIG.js';
3
3
  export { ADMIN_GROUP_NAME, SUPER_ADMIN_GROUP_ID, VENDOR_ADMIN_GROUP_ID, VENDOR_OWNER_GROUP_NAME, VENDOR_SCOPED_STORE_ENTITIES, VENDOR_STORE_RBAC_ENTITIES, canManageVendorRoles, canManageVendorTeam, canOnboardVendors, explainSessionEntityAccess, getPermissionableEntityKeys, hasEntityPermission, isPlatformAdministrator, isRbacDebugEnabled, isSuperAdmin, isSuperAdminGroupName, isVendorAdmin, isVendorGroupName, isVendorOwner, isVendorPortalUser, isVendorStaff, logEntityAccessDecision, logRbac, permissionRowsToRecord, resolveVendorScopeFromSessionUser, summarizeEntityPerms, vendorPortalFlagsFromUser } from './chunk-P7QCLE5W.js';
4
4
  import './chunk-SHUYVCID.js';