@infuro/cms-core 1.0.34 → 1.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +13 -0
  2. package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
  3. package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
  4. package/dist/admin.cjs +34329 -20923
  5. package/dist/admin.d.cts +186 -9
  6. package/dist/admin.d.ts +186 -9
  7. package/dist/admin.js +34140 -20829
  8. package/dist/api.cjs +120 -17515
  9. package/dist/api.d.cts +633 -3
  10. package/dist/api.d.ts +633 -3
  11. package/dist/api.js +14 -17528
  12. package/dist/auth.cjs +192 -1034
  13. package/dist/auth.d.cts +194 -51
  14. package/dist/auth.d.ts +194 -51
  15. package/dist/auth.js +4 -966
  16. package/dist/chunk-2XE4X74C.js +29602 -0
  17. package/dist/chunk-3DZRIZOD.cjs +52 -0
  18. package/dist/chunk-3KPNTQBV.cjs +620 -0
  19. package/dist/chunk-46GKADYE.cjs +84 -0
  20. package/dist/chunk-4TRPKBKO.js +589 -0
  21. package/dist/chunk-5ELSW2UP.js +150 -0
  22. package/dist/chunk-6KPQWRFW.js +171 -0
  23. package/dist/chunk-7NMT3GBR.cjs +29 -0
  24. package/dist/chunk-7YIBMQDR.cjs +86 -0
  25. package/dist/chunk-BGJAV67S.cjs +29710 -0
  26. package/dist/chunk-CNTSLED2.cjs +559 -0
  27. package/dist/chunk-CRFV5WJK.js +16 -0
  28. package/dist/chunk-D5FBNKQM.cjs +104 -0
  29. package/dist/chunk-EF2JBPDM.js +114 -0
  30. package/dist/chunk-EQPITOP6.js +543 -0
  31. package/dist/chunk-GO7PPYNU.js +76 -0
  32. package/dist/chunk-HF3L2GIT.cjs +194 -0
  33. package/dist/chunk-J7XHLOLO.js +830 -0
  34. package/dist/chunk-JBRR5UYL.js +87 -0
  35. package/dist/chunk-JC6DLWTE.js +21 -0
  36. package/dist/chunk-JHF4YYRC.cjs +188 -0
  37. package/dist/chunk-JXF23MPG.js +25 -0
  38. package/dist/chunk-MQBT33IV.js +48 -0
  39. package/dist/chunk-N44BJZ4C.cjs +123 -0
  40. package/dist/chunk-OOTLNH63.cjs +18 -0
  41. package/dist/chunk-PAMVINEX.cjs +577 -0
  42. package/dist/chunk-PNOKNSG2.cjs +222 -0
  43. package/dist/chunk-QM733NUK.js +186 -0
  44. package/dist/chunk-R73BKDRO.cjs +90 -0
  45. package/dist/chunk-SHUYVCID.js +4 -0
  46. package/dist/chunk-SYBOCAWB.js +97 -0
  47. package/dist/chunk-TDV6EJHV.js +192 -0
  48. package/dist/chunk-TFUOHI37.cjs +839 -0
  49. package/dist/chunk-TIAEXJLI.cjs +182 -0
  50. package/dist/chunk-UPLVMVRX.cjs +23 -0
  51. package/dist/chunk-USNT2KNT.cjs +6 -0
  52. package/dist/chunk-WEMDMVHQ.js +216 -0
  53. package/dist/chunk-XDSNZUW7.js +564 -0
  54. package/dist/chunk-XQ3QUHWR.cjs +83 -0
  55. package/dist/chunk-XW5ATPRW.cjs +155 -0
  56. package/dist/chunk-ZQ4X6OAU.js +82 -0
  57. package/dist/chunk-ZSVCP6N3.js +83 -0
  58. package/dist/cli.cjs +103 -84
  59. package/dist/cli.js +62 -27
  60. package/dist/email-FKR4FXFI.js +5 -0
  61. package/dist/email-KVKVPNCL.cjs +58 -0
  62. package/dist/email-queue-CGZBVVAS.js +2 -0
  63. package/dist/email-queue-TPZWLTIV.cjs +23 -0
  64. package/dist/erp-config-enabled-CUMQ6N2V.cjs +11 -0
  65. package/dist/erp-config-enabled-T37X7T34.js +2 -0
  66. package/dist/erp-order-invoice-3YISSOWW.js +3 -0
  67. package/dist/erp-order-invoice-ZR5F2KTA.cjs +12 -0
  68. package/dist/event-order-defaults-6E543227.js +2 -0
  69. package/dist/event-order-defaults-DUGDVGJI.cjs +39 -0
  70. package/dist/event-order-notifications-5GSAOYVS.cjs +27 -0
  71. package/dist/event-order-notifications-IIIF23D5.js +10 -0
  72. package/dist/hooks.cjs +259 -132
  73. package/dist/hooks.d.cts +42 -1
  74. package/dist/hooks.d.ts +42 -1
  75. package/dist/hooks.js +234 -91
  76. package/dist/index.cjs +3884 -22307
  77. package/dist/index.d.cts +2203 -772
  78. package/dist/index.d.ts +2203 -772
  79. package/dist/index.js +2871 -22064
  80. package/dist/interpolate-WAKPN56R.cjs +11 -0
  81. package/dist/interpolate-WDUWDF3I.js +2 -0
  82. package/dist/layout-36UFTHC5.cjs +11 -0
  83. package/dist/layout-AOBN26XG.js +2 -0
  84. package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
  85. package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
  86. package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
  87. package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
  88. package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
  89. package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
  90. package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
  91. package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
  92. package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
  93. package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
  94. package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
  95. package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
  96. package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
  97. package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
  98. package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
  99. package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
  100. package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
  101. package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
  102. package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
  103. package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
  104. package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
  105. package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
  106. package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
  107. package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
  108. package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
  109. package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
  110. package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
  111. package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
  112. package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
  113. package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
  114. package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
  115. package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
  116. package/dist/paid-order-erp-3USEG6WL.js +3 -0
  117. package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
  118. package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
  119. package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
  120. package/dist/razorpay-KLO2KNCB.js +49 -0
  121. package/dist/razorpay-U23LGY72.cjs +56 -0
  122. package/dist/rbac-debug-db-D7ME7QUY.cjs +35 -0
  123. package/dist/rbac-debug-db-MTCTVNNM.js +33 -0
  124. package/dist/sms-defaults-2NL24H57.js +2 -0
  125. package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
  126. package/dist/stripe-4FD27QVJ.js +51 -0
  127. package/dist/stripe-VU6OEG2D.cjs +57 -0
  128. package/dist/theme.cjs +31 -59
  129. package/dist/theme.d.cts +78 -3
  130. package/dist/theme.d.ts +78 -3
  131. package/dist/theme.js +23 -20
  132. package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
  133. package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
  134. package/dist/whatsapp-queue-3DXA4MXU.js +2 -0
  135. package/dist/whatsapp-queue-KG65MXD5.cjs +15 -0
  136. package/package.json +147 -142
  137. package/dist/admin.cjs.map +0 -1
  138. package/dist/admin.js.map +0 -1
  139. package/dist/api.cjs.map +0 -1
  140. package/dist/api.js.map +0 -1
  141. package/dist/auth.cjs.map +0 -1
  142. package/dist/auth.js.map +0 -1
  143. package/dist/cli.cjs.map +0 -1
  144. package/dist/cli.js.map +0 -1
  145. package/dist/config-DJ5CmQvS.d.cts +0 -8
  146. package/dist/config-DJ5CmQvS.d.ts +0 -8
  147. package/dist/hooks.cjs.map +0 -1
  148. package/dist/hooks.js.map +0 -1
  149. package/dist/index-Bf5GO8fu.d.cts +0 -583
  150. package/dist/index-DOiJuMQA.d.ts +0 -583
  151. package/dist/index.cjs.map +0 -1
  152. package/dist/index.js.map +0 -1
  153. package/dist/theme.cjs.map +0 -1
  154. package/dist/theme.js.map +0 -1
  155. package/dist/types-DCVaXlPV.d.cts +0 -78
  156. package/dist/types-DCVaXlPV.d.ts +0 -78
  157. package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
  158. package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
+
5
+ // src/message-templates/sms-defaults.ts
6
+ var SMS_MESSAGE_TEMPLATE_DEFAULTS = [
7
+ {
8
+ templateKey: "auth.otp_login",
9
+ name: "Sign-in OTP (SMS)",
10
+ body: "Your sign-in code is {{code}}. Valid 10 minutes.",
11
+ providerMeta: {
12
+ otpVarKey: "var1"
13
+ }
14
+ },
15
+ {
16
+ templateKey: "auth.otp_verify_phone",
17
+ name: "Verify phone OTP (SMS)",
18
+ body: "Your verification code is {{code}}. Valid 10 minutes.",
19
+ providerMeta: {
20
+ otpVarKey: "var1"
21
+ }
22
+ }
23
+ ];
24
+ function getSmsTemplateDefault(templateKey) {
25
+ return SMS_MESSAGE_TEMPLATE_DEFAULTS.find((d) => d.templateKey === templateKey);
26
+ }
27
+ chunkUSNT2KNT_cjs.__name(getSmsTemplateDefault, "getSmsTemplateDefault");
28
+ async function resolveSmsTemplateForSend(templateKey, getRow) {
29
+ const def = getSmsTemplateDefault(templateKey);
30
+ if (!def) return null;
31
+ const row = await getRow("sms", templateKey);
32
+ let body = def.body;
33
+ let ref = def.externalTemplateRef;
34
+ let otpVarKey = def.providerMeta?.otpVarKey ?? "var1";
35
+ if (row && row.enabled !== false) {
36
+ if (row.body.trim()) body = row.body;
37
+ if (row.externalTemplateRef?.trim()) ref = row.externalTemplateRef.trim();
38
+ const pm = row.providerMeta;
39
+ const k = pm && typeof pm.otpVarKey === "string" ? pm.otpVarKey.trim() : "";
40
+ if (k) otpVarKey = k;
41
+ }
42
+ return {
43
+ body,
44
+ externalTemplateRef: ref?.trim() || void 0,
45
+ otpVarKey: otpVarKey || "var1"
46
+ };
47
+ }
48
+ chunkUSNT2KNT_cjs.__name(resolveSmsTemplateForSend, "resolveSmsTemplateForSend");
49
+
50
+ exports.SMS_MESSAGE_TEMPLATE_DEFAULTS = SMS_MESSAGE_TEMPLATE_DEFAULTS;
51
+ exports.getSmsTemplateDefault = getSmsTemplateDefault;
52
+ exports.resolveSmsTemplateForSend = resolveSmsTemplateForSend;
@@ -0,0 +1,620 @@
1
+ 'use strict';
2
+
3
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
+
5
+ // src/auth/permission-entities.ts
6
+ var PERMISSION_ENTITY_INTERNAL_EXCLUDE = /* @__PURE__ */ new Set([
7
+ "users",
8
+ "password_reset_tokens",
9
+ "user_groups",
10
+ "permissions",
11
+ "comments",
12
+ "form_fields",
13
+ "configs",
14
+ "knowledge_base_chunks",
15
+ "carts",
16
+ "cart_items",
17
+ "wishlists",
18
+ "wishlist_items",
19
+ "message_templates",
20
+ "vendor_users",
21
+ "vendor_roles",
22
+ "vendor_role_permissions"
23
+ ]);
24
+ var PERMISSION_LOGICAL_ENTITIES = [
25
+ "users",
26
+ "forms",
27
+ "form_submissions",
28
+ "dashboard",
29
+ "upload",
30
+ "settings",
31
+ "analytics",
32
+ "chat"
33
+ ];
34
+ var ADMIN_GROUP_NAME = "Administrator";
35
+ function isSuperAdminGroupName(name) {
36
+ return name === ADMIN_GROUP_NAME;
37
+ }
38
+ chunkUSNT2KNT_cjs.__name(isSuperAdminGroupName, "isSuperAdminGroupName");
39
+ function getPermissionableEntityKeys(entityMap) {
40
+ const fromMap = Object.keys(entityMap).filter((k) => !PERMISSION_ENTITY_INTERNAL_EXCLUDE.has(k));
41
+ const logical = PERMISSION_LOGICAL_ENTITIES.filter((k) => !fromMap.includes(k));
42
+ return [
43
+ ...fromMap.sort(),
44
+ ...logical
45
+ ].filter((k, i, a) => a.indexOf(k) === i);
46
+ }
47
+ chunkUSNT2KNT_cjs.__name(getPermissionableEntityKeys, "getPermissionableEntityKeys");
48
+ function permissionRowsToRecord(rows) {
49
+ const out = {};
50
+ if (!rows?.length) return out;
51
+ for (const p of rows) {
52
+ out[p.entity] = {
53
+ c: !!p.canCreate,
54
+ r: !!p.canRead,
55
+ u: !!p.canUpdate,
56
+ d: !!p.canDelete
57
+ };
58
+ }
59
+ return out;
60
+ }
61
+ chunkUSNT2KNT_cjs.__name(permissionRowsToRecord, "permissionRowsToRecord");
62
+ function hasEntityPermission(record, entity, action) {
63
+ const p = record?.[entity];
64
+ if (!p) return false;
65
+ if (action === "create") return p.c;
66
+ if (action === "read") return p.r;
67
+ if (action === "update") return p.u;
68
+ return p.d;
69
+ }
70
+ chunkUSNT2KNT_cjs.__name(hasEntityPermission, "hasEntityPermission");
71
+
72
+ // src/auth/vendor-scope.ts
73
+ var VENDOR_SCOPED_STORE_ENTITIES = /* @__PURE__ */ new Set([
74
+ "products",
75
+ "collections",
76
+ "brands",
77
+ "product_categories",
78
+ "orders",
79
+ "payments",
80
+ "taxes",
81
+ "attributes",
82
+ "vendor_customers",
83
+ "discounts",
84
+ "events",
85
+ "refund_policies"
86
+ ]);
87
+ var VENDOR_STORE_RBAC_ENTITIES = /* @__PURE__ */ new Set([
88
+ ...VENDOR_SCOPED_STORE_ENTITIES,
89
+ "order_discounts",
90
+ "order_addresses",
91
+ "event_products"
92
+ ]);
93
+ var VENDOR_OWNER_GROUP_NAME = "Vendor Owner";
94
+ function isVendorGroupName(name) {
95
+ if (!name?.trim()) return false;
96
+ const n = name.trim().toLowerCase();
97
+ return n === VENDOR_OWNER_GROUP_NAME.toLowerCase() || n.includes("vendor");
98
+ }
99
+ chunkUSNT2KNT_cjs.__name(isVendorGroupName, "isVendorGroupName");
100
+ function isPlatformAdministrator(user) {
101
+ if (!user?.email) return false;
102
+ return isSuperAdmin(user);
103
+ }
104
+ chunkUSNT2KNT_cjs.__name(isPlatformAdministrator, "isPlatformAdministrator");
105
+ function isVendorPortalUser(user) {
106
+ if (user?.isVendorPortal === true) return true;
107
+ if (!user?.email || isPlatformAdministrator(user)) return false;
108
+ if (isVendorAdmin(user)) return true;
109
+ return isVendorGroupName(user.groupName);
110
+ }
111
+ chunkUSNT2KNT_cjs.__name(isVendorPortalUser, "isVendorPortalUser");
112
+ function isVendorStaff(user) {
113
+ return isVendorPortalUser(user);
114
+ }
115
+ chunkUSNT2KNT_cjs.__name(isVendorStaff, "isVendorStaff");
116
+ function isVendorOwner(user) {
117
+ if (user?.isVendorOwner === true) return true;
118
+ if (!user?.email || isPlatformAdministrator(user)) return false;
119
+ if (user.isVendorRoleOwner === true) return true;
120
+ if (user.vendorRole === "staff") return false;
121
+ if (user.vendorRole === "owner") return true;
122
+ if (!isVendorPortalUser(user)) return false;
123
+ return user.groupName?.trim().toLowerCase() === VENDOR_OWNER_GROUP_NAME.toLowerCase();
124
+ }
125
+ chunkUSNT2KNT_cjs.__name(isVendorOwner, "isVendorOwner");
126
+ function canManageVendorTeam(user) {
127
+ return isPlatformAdministrator(user) || isVendorOwner(user);
128
+ }
129
+ chunkUSNT2KNT_cjs.__name(canManageVendorTeam, "canManageVendorTeam");
130
+ function canManageVendorRoles(user) {
131
+ return isPlatformAdministrator(user) || isVendorOwner(user);
132
+ }
133
+ chunkUSNT2KNT_cjs.__name(canManageVendorRoles, "canManageVendorRoles");
134
+ function canOnboardVendors(user) {
135
+ return isPlatformAdministrator(user);
136
+ }
137
+ chunkUSNT2KNT_cjs.__name(canOnboardVendors, "canOnboardVendors");
138
+ function resolveVendorScopeFromSessionUser(user) {
139
+ if (!user?.email) return {
140
+ type: "deny"
141
+ };
142
+ if (isPlatformAdministrator(user)) return {
143
+ type: "all"
144
+ };
145
+ const vendorIds = user.vendorIds ?? [];
146
+ if (vendorIds.length === 0) return {
147
+ type: "deny"
148
+ };
149
+ const preferred = user.activeVendorId ?? vendorIds[0];
150
+ const vendorId = vendorIds.includes(preferred) ? preferred : vendorIds[0];
151
+ return {
152
+ type: "vendor",
153
+ vendorId,
154
+ vendorIds
155
+ };
156
+ }
157
+ chunkUSNT2KNT_cjs.__name(resolveVendorScopeFromSessionUser, "resolveVendorScopeFromSessionUser");
158
+ function vendorPortalFlagsFromUser(input) {
159
+ const vendorIds = input.vendorIds ?? [];
160
+ const isVendorPortal = !input.isRBACAdmin && (vendorIds.length > 0 || isVendorGroupName(input.groupName));
161
+ const isVendorOwner2 = isVendorPortal && (input.isVendorRoleOwner === true || input.vendorRole !== "staff" && (input.vendorRole === "owner" || input.groupName?.trim().toLowerCase() === VENDOR_OWNER_GROUP_NAME.toLowerCase()));
162
+ return {
163
+ isVendorPortal,
164
+ isVendorOwner: isVendorOwner2
165
+ };
166
+ }
167
+ chunkUSNT2KNT_cjs.__name(vendorPortalFlagsFromUser, "vendorPortalFlagsFromUser");
168
+
169
+ // src/auth/role-helpers.ts
170
+ var SUPER_ADMIN_GROUP_ID = 1;
171
+ var VENDOR_ADMIN_GROUP_ID = 5;
172
+ function isSuperAdmin(user) {
173
+ if (!user) return false;
174
+ if (user.groupId === SUPER_ADMIN_GROUP_ID) return true;
175
+ if (user.isRBACAdmin === true) return true;
176
+ return isSuperAdminGroupName(user.groupName);
177
+ }
178
+ chunkUSNT2KNT_cjs.__name(isSuperAdmin, "isSuperAdmin");
179
+ function isVendorAdmin(user) {
180
+ if (!user?.email || isSuperAdmin(user)) return false;
181
+ if (user.groupId === VENDOR_ADMIN_GROUP_ID) return true;
182
+ if ((user.vendorIds?.length ?? 0) > 0) return true;
183
+ return isVendorGroupName(user.groupName);
184
+ }
185
+ chunkUSNT2KNT_cjs.__name(isVendorAdmin, "isVendorAdmin");
186
+
187
+ // src/lib/vendor-role-defaults.ts
188
+ var VENDOR_RBAC_ENTITIES = [
189
+ ...VENDOR_STORE_RBAC_ENTITIES,
190
+ "dashboard",
191
+ "settings",
192
+ "team",
193
+ "roles"
194
+ ];
195
+ var STORE_ENTITIES = [
196
+ ...VENDOR_STORE_RBAC_ENTITIES
197
+ ];
198
+ function full() {
199
+ return {
200
+ canCreate: true,
201
+ canRead: true,
202
+ canUpdate: true,
203
+ canDelete: true
204
+ };
205
+ }
206
+ chunkUSNT2KNT_cjs.__name(full, "full");
207
+ function read() {
208
+ return {
209
+ canCreate: false,
210
+ canRead: true,
211
+ canUpdate: false,
212
+ canDelete: false
213
+ };
214
+ }
215
+ chunkUSNT2KNT_cjs.__name(read, "read");
216
+ function none() {
217
+ return {
218
+ canCreate: false,
219
+ canRead: false,
220
+ canUpdate: false,
221
+ canDelete: false
222
+ };
223
+ }
224
+ chunkUSNT2KNT_cjs.__name(none, "none");
225
+ function readUpdate() {
226
+ return {
227
+ canCreate: false,
228
+ canRead: true,
229
+ canUpdate: true,
230
+ canDelete: false
231
+ };
232
+ }
233
+ chunkUSNT2KNT_cjs.__name(readUpdate, "readUpdate");
234
+ function storePerms(spec) {
235
+ const resolve = /* @__PURE__ */ chunkUSNT2KNT_cjs.__name((v) => {
236
+ if (v === "full") return full();
237
+ if (v === "read") return read();
238
+ if (v === "none") return none();
239
+ return v;
240
+ }, "resolve");
241
+ const out = {};
242
+ for (const entity of STORE_ENTITIES) {
243
+ out[entity] = resolve(spec[entity] ?? "none");
244
+ }
245
+ return out;
246
+ }
247
+ chunkUSNT2KNT_cjs.__name(storePerms, "storePerms");
248
+ var DEFAULT_VENDOR_ROLE_DEFS = [
249
+ {
250
+ name: "Owner",
251
+ description: "Full store access and team/role management",
252
+ isSystem: true,
253
+ isOwnerRole: true,
254
+ permissions: {
255
+ ...storePerms(Object.fromEntries(STORE_ENTITIES.map((e) => [
256
+ e,
257
+ "full"
258
+ ]))),
259
+ dashboard: read(),
260
+ settings: readUpdate(),
261
+ team: full(),
262
+ roles: full()
263
+ }
264
+ },
265
+ {
266
+ name: "Manager",
267
+ description: "Day-to-day store operations",
268
+ isSystem: true,
269
+ isOwnerRole: false,
270
+ permissions: {
271
+ ...storePerms({
272
+ products: "full",
273
+ collections: "full",
274
+ brands: "full",
275
+ product_categories: "full",
276
+ orders: "full",
277
+ vendor_customers: "full",
278
+ discounts: "full",
279
+ order_discounts: "full",
280
+ order_addresses: "full",
281
+ payments: "read",
282
+ taxes: "read",
283
+ attributes: "read"
284
+ }),
285
+ dashboard: read(),
286
+ settings: read(),
287
+ team: none(),
288
+ roles: none()
289
+ }
290
+ },
291
+ {
292
+ name: "Catalog Staff",
293
+ description: "Manage products and catalog content",
294
+ isSystem: true,
295
+ isOwnerRole: false,
296
+ permissions: {
297
+ ...storePerms({
298
+ products: "full",
299
+ collections: "full",
300
+ brands: "full",
301
+ product_categories: "full",
302
+ attributes: "full",
303
+ orders: "read",
304
+ vendor_customers: "read"
305
+ }),
306
+ dashboard: read(),
307
+ settings: none(),
308
+ team: none(),
309
+ roles: none()
310
+ }
311
+ },
312
+ {
313
+ name: "Fulfillment",
314
+ description: "Orders and fulfillment",
315
+ isSystem: true,
316
+ isOwnerRole: false,
317
+ permissions: {
318
+ ...storePerms({
319
+ products: "read",
320
+ orders: "full",
321
+ order_addresses: "full",
322
+ order_discounts: "read",
323
+ vendor_customers: "read"
324
+ }),
325
+ dashboard: read(),
326
+ settings: none(),
327
+ team: none(),
328
+ roles: none()
329
+ }
330
+ },
331
+ {
332
+ name: "Viewer",
333
+ description: "Read-only access to store data",
334
+ isSystem: true,
335
+ isOwnerRole: false,
336
+ permissions: {
337
+ ...storePerms(Object.fromEntries(STORE_ENTITIES.map((e) => [
338
+ e,
339
+ "read"
340
+ ]))),
341
+ dashboard: read(),
342
+ settings: none(),
343
+ team: none(),
344
+ roles: none()
345
+ }
346
+ }
347
+ ];
348
+ var VENDOR_VIEWER_ROLE_NAME = "Viewer";
349
+
350
+ // src/auth/rbac-debug.ts
351
+ var LOG_PREFIX = "[cms-rbac]";
352
+ function isRbacDebugEnabled() {
353
+ const v = process.env.CMS_RBAC_DEBUG?.trim().toLowerCase();
354
+ if (v === "1" || v === "true" || v === "yes") return true;
355
+ if (v === "0" || v === "false" || v === "no") return false;
356
+ return process.env.NODE_ENV === "development";
357
+ }
358
+ chunkUSNT2KNT_cjs.__name(isRbacDebugEnabled, "isRbacDebugEnabled");
359
+ function logRbac(message, data) {
360
+ if (!isRbacDebugEnabled()) return;
361
+ if (data) console.info(LOG_PREFIX, message, data);
362
+ else console.info(LOG_PREFIX, message);
363
+ }
364
+ chunkUSNT2KNT_cjs.__name(logRbac, "logRbac");
365
+ function summarizeEntityPerms(entityPerms) {
366
+ const out = {};
367
+ if (!entityPerms) return out;
368
+ for (const [entity, p] of Object.entries(entityPerms)) {
369
+ out[entity] = {
370
+ c: p.c,
371
+ r: p.r,
372
+ u: p.u,
373
+ d: p.d
374
+ };
375
+ }
376
+ return out;
377
+ }
378
+ chunkUSNT2KNT_cjs.__name(summarizeEntityPerms, "summarizeEntityPerms");
379
+ function vendorPortalFallbackReason(user, entity, action) {
380
+ if (!isVendorPortalUser(user)) return null;
381
+ if (entity === "dashboard" && action === "read") return "vendor_portal_dashboard_fallback";
382
+ if (entity === "analytics" && action === "read") return "vendor_portal_analytics_fallback";
383
+ if (entity === "settings" && action === "read") return "vendor_portal_settings_read_fallback";
384
+ if (VENDOR_STORE_RBAC_ENTITIES.has(entity) && action === "read") return "vendor_portal_store_read_fallback";
385
+ return null;
386
+ }
387
+ chunkUSNT2KNT_cjs.__name(vendorPortalFallbackReason, "vendorPortalFallbackReason");
388
+ function explainSessionEntityAccess(user, entity, action) {
389
+ const userSnapshot = {
390
+ email: user?.email ?? null,
391
+ id: user?.id ?? null,
392
+ groupId: user?.groupId ?? null,
393
+ groupName: user?.groupName ?? null,
394
+ isRBACAdmin: user?.isRBACAdmin ?? false,
395
+ adminAccess: user?.adminAccess ?? null,
396
+ vendorIds: user?.vendorIds ?? [],
397
+ activeVendorId: user?.activeVendorId ?? null,
398
+ vendorRole: user?.vendorRole ?? null,
399
+ vendorRoleId: user?.vendorRoleId ?? null,
400
+ vendorRoleName: user?.vendorRoleName ?? null,
401
+ isVendorRoleOwner: user?.isVendorRoleOwner ?? false,
402
+ vendorEntityPerms: summarizeEntityPerms(user?.vendorEntityPerms),
403
+ isVendorPortal: user?.isVendorPortal ?? false,
404
+ isVendorOwner: user?.isVendorOwner ?? false,
405
+ isVendorPortalComputed: isVendorPortalUser(user),
406
+ isVendorOwnerComputed: isVendorOwner(user),
407
+ jwtEntityPerms: summarizeEntityPerms(user?.entityPerms),
408
+ jwtEntityPermForTarget: user?.entityPerms?.[entity] ?? null
409
+ };
410
+ if (!user?.email) {
411
+ return {
412
+ allowed: false,
413
+ reason: "no_session_email",
414
+ userSnapshot
415
+ };
416
+ }
417
+ if (user.isRBACAdmin) {
418
+ return {
419
+ allowed: true,
420
+ reason: "platform_administrator",
421
+ userSnapshot
422
+ };
423
+ }
424
+ const vendorIds = user.vendorIds ?? [];
425
+ const isStaff = user.vendorRole === "staff";
426
+ const vendorPerms = user.vendorEntityPerms;
427
+ const hasVendorRolePerms = vendorPerms != null && Object.keys(vendorPerms).length > 0;
428
+ if (vendorIds.length > 0 && hasVendorRolePerms) {
429
+ const vendorRbacSet = new Set(VENDOR_RBAC_ENTITIES);
430
+ if (vendorRbacSet.has(entity) || entity === "analytics") {
431
+ if (entity === "analytics" && action === "read") {
432
+ const allowed3 = hasEntityPermission(vendorPerms, "dashboard", "read");
433
+ return {
434
+ allowed: allowed3,
435
+ reason: allowed3 ? "vendor_role_analytics_via_dashboard" : "vendor_role_analytics_denied",
436
+ userSnapshot
437
+ };
438
+ }
439
+ if (user.isVendorRoleOwner === true) {
440
+ return {
441
+ allowed: true,
442
+ reason: "vendor_owner_role_full",
443
+ userSnapshot
444
+ };
445
+ }
446
+ const allowed2 = hasEntityPermission(vendorPerms, entity, action);
447
+ return {
448
+ allowed: allowed2,
449
+ reason: allowed2 ? "vendor_role_permissions_allow" : "vendor_role_permissions_deny",
450
+ userSnapshot
451
+ };
452
+ }
453
+ }
454
+ if (vendorIds.length > 0) {
455
+ if (entity === "dashboard" && action === "read") {
456
+ return {
457
+ allowed: true,
458
+ reason: "vendor_link_dashboard_read",
459
+ userSnapshot
460
+ };
461
+ }
462
+ if (entity === "analytics" && action === "read") {
463
+ return {
464
+ allowed: true,
465
+ reason: "vendor_link_analytics_read",
466
+ userSnapshot
467
+ };
468
+ }
469
+ if (entity === "settings") {
470
+ if (action === "read") {
471
+ return {
472
+ allowed: true,
473
+ reason: "vendor_link_settings_read",
474
+ userSnapshot
475
+ };
476
+ }
477
+ if (action === "update" && !isStaff) {
478
+ return {
479
+ allowed: true,
480
+ reason: "vendor_link_settings_update",
481
+ userSnapshot
482
+ };
483
+ }
484
+ }
485
+ if (VENDOR_STORE_RBAC_ENTITIES.has(entity)) {
486
+ if (isStaff && action === "read") {
487
+ return {
488
+ allowed: true,
489
+ reason: "vendor_staff_store_read",
490
+ userSnapshot
491
+ };
492
+ }
493
+ if (!isStaff) {
494
+ return {
495
+ allowed: true,
496
+ reason: "vendor_link_store_full",
497
+ userSnapshot
498
+ };
499
+ }
500
+ return {
501
+ allowed: false,
502
+ reason: "vendor_staff_store_write_denied",
503
+ userSnapshot
504
+ };
505
+ }
506
+ }
507
+ if (isVendorPortalUser(user) && isVendorOwner(user)) {
508
+ if (entity === "dashboard" && action === "read") {
509
+ return {
510
+ allowed: true,
511
+ reason: "vendor_owner_group_dashboard",
512
+ userSnapshot
513
+ };
514
+ }
515
+ if (entity === "analytics" && action === "read") {
516
+ return {
517
+ allowed: true,
518
+ reason: "vendor_owner_group_analytics",
519
+ userSnapshot
520
+ };
521
+ }
522
+ if (entity === "settings" && (action === "read" || action === "update")) {
523
+ return {
524
+ allowed: true,
525
+ reason: "vendor_owner_group_settings",
526
+ userSnapshot
527
+ };
528
+ }
529
+ if (VENDOR_STORE_RBAC_ENTITIES.has(entity)) {
530
+ return {
531
+ allowed: true,
532
+ reason: "vendor_owner_group_store",
533
+ userSnapshot
534
+ };
535
+ }
536
+ }
537
+ const vendorPortalReason = vendorPortalFallbackReason(user, entity, action);
538
+ if (vendorPortalReason) {
539
+ return {
540
+ allowed: true,
541
+ reason: vendorPortalReason,
542
+ userSnapshot
543
+ };
544
+ }
545
+ const explicit = user.entityPerms?.[entity];
546
+ if (explicit !== void 0) {
547
+ const allowed2 = hasEntityPermission(user.entityPerms, entity, action);
548
+ return {
549
+ allowed: allowed2,
550
+ reason: allowed2 ? "jwt_entity_perms_allow" : "jwt_entity_perms_deny",
551
+ userSnapshot
552
+ };
553
+ }
554
+ const allowed = hasEntityPermission(user.entityPerms, entity, action);
555
+ return {
556
+ allowed,
557
+ reason: allowed ? "entity_perms_fallback_allow" : "no_matching_rule",
558
+ userSnapshot
559
+ };
560
+ }
561
+ chunkUSNT2KNT_cjs.__name(explainSessionEntityAccess, "explainSessionEntityAccess");
562
+ async function logEntityAccessDecision(dataSource, context, user, entity, action, extra) {
563
+ if (!isRbacDebugEnabled()) return;
564
+ const explanation = explainSessionEntityAccess(user, entity, action);
565
+ let dbPermissions;
566
+ if (dataSource && user?.id) {
567
+ const id = Number(user.id);
568
+ if (Number.isFinite(id)) {
569
+ try {
570
+ const { loadDbPermissionsForUser } = await import('./rbac-debug-db-D7ME7QUY.cjs');
571
+ dbPermissions = await loadDbPermissionsForUser(dataSource, id);
572
+ } catch (e) {
573
+ dbPermissions = {
574
+ error: e instanceof Error ? e.message : String(e)
575
+ };
576
+ }
577
+ }
578
+ }
579
+ logRbac(context, {
580
+ entity,
581
+ action,
582
+ allowed: explanation.allowed,
583
+ reason: explanation.reason,
584
+ ...explanation.userSnapshot,
585
+ dbPermissions,
586
+ ...extra
587
+ });
588
+ }
589
+ chunkUSNT2KNT_cjs.__name(logEntityAccessDecision, "logEntityAccessDecision");
590
+
591
+ exports.ADMIN_GROUP_NAME = ADMIN_GROUP_NAME;
592
+ exports.DEFAULT_VENDOR_ROLE_DEFS = DEFAULT_VENDOR_ROLE_DEFS;
593
+ exports.SUPER_ADMIN_GROUP_ID = SUPER_ADMIN_GROUP_ID;
594
+ exports.VENDOR_ADMIN_GROUP_ID = VENDOR_ADMIN_GROUP_ID;
595
+ exports.VENDOR_OWNER_GROUP_NAME = VENDOR_OWNER_GROUP_NAME;
596
+ exports.VENDOR_RBAC_ENTITIES = VENDOR_RBAC_ENTITIES;
597
+ exports.VENDOR_SCOPED_STORE_ENTITIES = VENDOR_SCOPED_STORE_ENTITIES;
598
+ exports.VENDOR_STORE_RBAC_ENTITIES = VENDOR_STORE_RBAC_ENTITIES;
599
+ exports.VENDOR_VIEWER_ROLE_NAME = VENDOR_VIEWER_ROLE_NAME;
600
+ exports.canManageVendorRoles = canManageVendorRoles;
601
+ exports.canManageVendorTeam = canManageVendorTeam;
602
+ exports.canOnboardVendors = canOnboardVendors;
603
+ exports.explainSessionEntityAccess = explainSessionEntityAccess;
604
+ exports.getPermissionableEntityKeys = getPermissionableEntityKeys;
605
+ exports.hasEntityPermission = hasEntityPermission;
606
+ exports.isPlatformAdministrator = isPlatformAdministrator;
607
+ exports.isRbacDebugEnabled = isRbacDebugEnabled;
608
+ exports.isSuperAdmin = isSuperAdmin;
609
+ exports.isSuperAdminGroupName = isSuperAdminGroupName;
610
+ exports.isVendorAdmin = isVendorAdmin;
611
+ exports.isVendorGroupName = isVendorGroupName;
612
+ exports.isVendorOwner = isVendorOwner;
613
+ exports.isVendorPortalUser = isVendorPortalUser;
614
+ exports.isVendorStaff = isVendorStaff;
615
+ exports.logEntityAccessDecision = logEntityAccessDecision;
616
+ exports.logRbac = logRbac;
617
+ exports.permissionRowsToRecord = permissionRowsToRecord;
618
+ exports.resolveVendorScopeFromSessionUser = resolveVendorScopeFromSessionUser;
619
+ exports.summarizeEntityPerms = summarizeEntityPerms;
620
+ exports.vendorPortalFlagsFromUser = vendorPortalFlagsFromUser;