@infuro/cms-core 1.0.35 → 1.0.38

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 (69) hide show
  1. package/dist/admin.cjs +1222 -1024
  2. package/dist/admin.d.cts +6 -0
  3. package/dist/admin.d.ts +6 -0
  4. package/dist/admin.js +1224 -1026
  5. package/dist/api.cjs +40 -39
  6. package/dist/api.js +8 -7
  7. package/dist/auth.cjs +51 -51
  8. package/dist/auth.d.cts +3 -3
  9. package/dist/auth.d.ts +3 -3
  10. package/dist/auth.js +3 -3
  11. package/dist/chunk-22FFHLTO.cjs +2356 -0
  12. package/dist/{chunk-CNTSLED2.cjs → chunk-E6WVP7BK.cjs} +75 -14
  13. package/dist/chunk-HCIRL37O.js +21 -0
  14. package/dist/chunk-HT5DI3XW.cjs +82 -0
  15. package/dist/{chunk-EF2JBPDM.js → chunk-KFFB6EMZ.js} +9 -0
  16. package/dist/chunk-NNQBWDCI.js +2325 -0
  17. package/dist/{chunk-TIAEXJLI.cjs → chunk-OIGCAGH7.cjs} +7 -7
  18. package/dist/{chunk-4TRPKBKO.js → chunk-P7QCLE5W.js} +52 -24
  19. package/dist/{chunk-2XE4X74C.js → chunk-PYUXVU75.js} +7801 -6871
  20. package/dist/{chunk-EQPITOP6.js → chunk-SBRBR3VO.js} +70 -9
  21. package/dist/{chunk-N44BJZ4C.cjs → chunk-SPQFNIYJ.cjs} +9 -0
  22. package/dist/chunk-UCKN4BBY.cjs +24 -0
  23. package/dist/{chunk-6KPQWRFW.js → chunk-UXMDSNIG.js} +1 -1
  24. package/dist/{chunk-BGJAV67S.cjs → chunk-VJDUKAJ3.cjs} +8207 -7261
  25. package/dist/{chunk-3KPNTQBV.cjs → chunk-WMXPKKXU.cjs} +52 -23
  26. package/dist/chunk-X47PBV4I.js +79 -0
  27. package/dist/cli.cjs +4 -2
  28. package/dist/cli.js +4 -2
  29. package/dist/emit-order-notification-trigger-D2N3KFHL.cjs +16 -0
  30. package/dist/emit-order-notification-trigger-IVLWKKJL.js +3 -0
  31. package/dist/{event-order-defaults-DUGDVGJI.cjs → event-order-defaults-EMWBIGL3.cjs} +9 -9
  32. package/dist/{event-order-defaults-6E543227.js → event-order-defaults-SDRNAZHC.js} +1 -1
  33. package/dist/index.cjs +805 -1059
  34. package/dist/index.d.cts +834 -728
  35. package/dist/index.d.ts +834 -728
  36. package/dist/index.js +385 -724
  37. package/dist/migrations/1775500000000-RssFeedsAndArticles.ts +0 -1
  38. package/dist/migrations/1775700000000-JobSchedules.ts +0 -1
  39. package/dist/migrations/1781220000000-AddWhatsappTriggerBindings.ts +23 -0
  40. package/dist/migrations/1781230000000-AddOrderNotificationTriggers.ts +46 -0
  41. package/dist/migrations/1781240000000-DropEventOrderNotificationColumns.ts +29 -0
  42. package/dist/migrations/1781250000000-RemoveOrderRefundedTrigger.ts +36 -0
  43. package/dist/migrations/1781260000000-RenameWhatsappTriggerBindingsToOrderNotificationBindings.ts +92 -0
  44. package/dist/migrations/1781270000000-ComboVendorId.ts +58 -0
  45. package/dist/order-notification-dispatcher-RU7BTGGX.cjs +18 -0
  46. package/dist/order-notification-dispatcher-XWIJYDGA.js +5 -0
  47. package/dist/{rbac-debug-db-D7ME7QUY.cjs → rbac-debug-db-KHG4FJC3.cjs} +2 -2
  48. package/dist/{rbac-debug-db-MTCTVNNM.js → rbac-debug-db-QWHOENBR.js} +1 -1
  49. package/package.json +1 -1
  50. package/dist/chunk-46GKADYE.cjs +0 -84
  51. package/dist/chunk-7YIBMQDR.cjs +0 -86
  52. package/dist/chunk-J7XHLOLO.js +0 -830
  53. package/dist/chunk-JBRR5UYL.js +0 -87
  54. package/dist/chunk-JHF4YYRC.cjs +0 -188
  55. package/dist/chunk-PAMVINEX.cjs +0 -577
  56. package/dist/chunk-QM733NUK.js +0 -186
  57. package/dist/chunk-R73BKDRO.cjs +0 -90
  58. package/dist/chunk-TFUOHI37.cjs +0 -839
  59. package/dist/chunk-XDSNZUW7.js +0 -564
  60. package/dist/chunk-ZQ4X6OAU.js +0 -82
  61. package/dist/chunk-ZSVCP6N3.js +0 -83
  62. package/dist/email-FKR4FXFI.js +0 -5
  63. package/dist/email-KVKVPNCL.cjs +0 -58
  64. package/dist/event-order-notifications-5GSAOYVS.cjs +0 -27
  65. package/dist/event-order-notifications-IIIF23D5.js +0 -10
  66. package/dist/layout-36UFTHC5.cjs +0 -11
  67. package/dist/layout-AOBN26XG.js +0 -2
  68. package/dist/whatsapp-queue-3DXA4MXU.js +0 -2
  69. package/dist/whatsapp-queue-KG65MXD5.cjs +0 -15
@@ -17,6 +17,8 @@ var PERMISSION_ENTITY_INTERNAL_EXCLUDE = /* @__PURE__ */ new Set([
17
17
  "wishlists",
18
18
  "wishlist_items",
19
19
  "message_templates",
20
+ "order_notification_triggers",
21
+ "order_notification_bindings",
20
22
  "vendor_users",
21
23
  "vendor_roles",
22
24
  "vendor_role_permissions"
@@ -69,7 +71,52 @@ function hasEntityPermission(record, entity, action) {
69
71
  }
70
72
  chunkUSNT2KNT_cjs.__name(hasEntityPermission, "hasEntityPermission");
71
73
 
74
+ // src/auth/role-helpers.ts
75
+ var SUPER_ADMIN_GROUP_ID = 1;
76
+ var VENDOR_ADMIN_GROUP_ID = 5;
77
+ function isSuperAdmin(user) {
78
+ if (!user) return false;
79
+ if (user.groupId === SUPER_ADMIN_GROUP_ID) return true;
80
+ if (user.isRBACAdmin === true) return true;
81
+ return isSuperAdminGroupName(user.groupName);
82
+ }
83
+ chunkUSNT2KNT_cjs.__name(isSuperAdmin, "isSuperAdmin");
84
+ function isVendorAdmin(user) {
85
+ if (!user?.email || isSuperAdmin(user)) return false;
86
+ if (user.groupId === VENDOR_ADMIN_GROUP_ID) return true;
87
+ if ((user.vendorIds?.length ?? 0) > 0) return true;
88
+ return isVendorGroupName(user.groupName);
89
+ }
90
+ chunkUSNT2KNT_cjs.__name(isVendorAdmin, "isVendorAdmin");
91
+
72
92
  // src/auth/vendor-scope.ts
93
+ var DEFAULT_VENDOR_SLUG = "default";
94
+ async function resolveDefaultVendorId(dataSource) {
95
+ try {
96
+ const rows = await dataSource.query(`SELECT id FROM vendors WHERE slug = $1 AND deleted = false LIMIT 1`, [
97
+ DEFAULT_VENDOR_SLUG
98
+ ]);
99
+ const id = rows[0]?.id;
100
+ return typeof id === "number" ? id : null;
101
+ } catch {
102
+ return null;
103
+ }
104
+ }
105
+ chunkUSNT2KNT_cjs.__name(resolveDefaultVendorId, "resolveDefaultVendorId");
106
+ async function resolveDisabledMultiVendorScope(dataSource) {
107
+ const defaultVendorId = await resolveDefaultVendorId(dataSource);
108
+ if (defaultVendorId == null) return {
109
+ type: "deny"
110
+ };
111
+ return {
112
+ type: "vendor",
113
+ vendorId: defaultVendorId,
114
+ vendorIds: [
115
+ defaultVendorId
116
+ ]
117
+ };
118
+ }
119
+ chunkUSNT2KNT_cjs.__name(resolveDisabledMultiVendorScope, "resolveDisabledMultiVendorScope");
73
120
  var VENDOR_SCOPED_STORE_ENTITIES = /* @__PURE__ */ new Set([
74
121
  "products",
75
122
  "collections",
@@ -82,7 +129,8 @@ var VENDOR_SCOPED_STORE_ENTITIES = /* @__PURE__ */ new Set([
82
129
  "vendor_customers",
83
130
  "discounts",
84
131
  "events",
85
- "refund_policies"
132
+ "refund_policies",
133
+ "combos"
86
134
  ]);
87
135
  var VENDOR_STORE_RBAC_ENTITIES = /* @__PURE__ */ new Set([
88
136
  ...VENDOR_SCOPED_STORE_ENTITIES,
@@ -166,24 +214,6 @@ function vendorPortalFlagsFromUser(input) {
166
214
  }
167
215
  chunkUSNT2KNT_cjs.__name(vendorPortalFlagsFromUser, "vendorPortalFlagsFromUser");
168
216
 
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
217
  // src/lib/vendor-role-defaults.ts
188
218
  var VENDOR_RBAC_ENTITIES = [
189
219
  ...VENDOR_STORE_RBAC_ENTITIES,
@@ -351,9 +381,7 @@ var VENDOR_VIEWER_ROLE_NAME = "Viewer";
351
381
  var LOG_PREFIX = "[cms-rbac]";
352
382
  function isRbacDebugEnabled() {
353
383
  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";
384
+ return v === "1" || v === "true" || v === "yes";
357
385
  }
358
386
  chunkUSNT2KNT_cjs.__name(isRbacDebugEnabled, "isRbacDebugEnabled");
359
387
  function logRbac(message, data) {
@@ -567,7 +595,7 @@ async function logEntityAccessDecision(dataSource, context, user, entity, action
567
595
  const id = Number(user.id);
568
596
  if (Number.isFinite(id)) {
569
597
  try {
570
- const { loadDbPermissionsForUser } = await import('./rbac-debug-db-D7ME7QUY.cjs');
598
+ const { loadDbPermissionsForUser } = await import('./rbac-debug-db-KHG4FJC3.cjs');
571
599
  dbPermissions = await loadDbPermissionsForUser(dataSource, id);
572
600
  } catch (e) {
573
601
  dbPermissions = {
@@ -615,6 +643,7 @@ exports.isVendorStaff = isVendorStaff;
615
643
  exports.logEntityAccessDecision = logEntityAccessDecision;
616
644
  exports.logRbac = logRbac;
617
645
  exports.permissionRowsToRecord = permissionRowsToRecord;
646
+ exports.resolveDisabledMultiVendorScope = resolveDisabledMultiVendorScope;
618
647
  exports.resolveVendorScopeFromSessionUser = resolveVendorScopeFromSessionUser;
619
648
  exports.summarizeEntityPerms = summarizeEntityPerms;
620
649
  exports.vendorPortalFlagsFromUser = vendorPortalFlagsFromUser;
@@ -0,0 +1,79 @@
1
+ import { notificationTriggerEmitter } from './chunk-HCIRL37O.js';
2
+ import { __name } from './chunk-SHUYVCID.js';
3
+
4
+ // src/lib/emit-order-notification-trigger.ts
5
+ function maskPhone(raw) {
6
+ const digits = String(raw ?? "").replace(/\D/g, "");
7
+ if (digits.length <= 4) return "(none)";
8
+ return `***${digits.slice(-4)}`;
9
+ }
10
+ __name(maskPhone, "maskPhone");
11
+ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
12
+ if (!deps.entityMap.orders) {
13
+ console.warn("[notification-triggers] skip emit: orders entity missing from entityMap", {
14
+ triggerKey,
15
+ orderId
16
+ });
17
+ return;
18
+ }
19
+ const listenerCount = notificationTriggerEmitter.listenerCount("__any__");
20
+ if (listenerCount === 0) {
21
+ console.warn("[notification-triggers] no WhatsApp dispatcher listener \u2014 ensure createCmsApiHandler passes getCms (initWhatsappTriggerDispatcher)");
22
+ }
23
+ const orderRepo = deps.dataSource.getRepository(deps.entityMap.orders);
24
+ const fullOrder = await orderRepo.findOne({
25
+ where: {
26
+ id: orderId,
27
+ deleted: false
28
+ },
29
+ relations: [
30
+ "contact"
31
+ ]
32
+ });
33
+ if (!fullOrder) {
34
+ console.warn("[notification-triggers] skip emit: order not found", {
35
+ triggerKey,
36
+ orderId
37
+ });
38
+ return;
39
+ }
40
+ const fo = fullOrder;
41
+ const phone = fo.contact?.phone ?? null;
42
+ console.log("[notification-triggers] emit", {
43
+ triggerKey,
44
+ orderId,
45
+ orderNumber: fo.orderNumber ?? null,
46
+ phone: maskPhone(phone),
47
+ listeners: listenerCount
48
+ });
49
+ if (!phone?.trim()) {
50
+ console.warn("[notification-triggers] order contact has no phone \u2014 WhatsApp will be skipped", {
51
+ orderId
52
+ });
53
+ }
54
+ notificationTriggerEmitter.emitTrigger(triggerKey, {
55
+ orderId,
56
+ orderNumber: String(fo.orderNumber ?? ""),
57
+ customerName: fo.contact?.name ?? "",
58
+ customerPhone: phone,
59
+ total: fo.total ?? 0,
60
+ currency: String(fo.currency ?? "INR"),
61
+ vendorId: fo.vendorId ?? null,
62
+ ...extra?.refundAmount != null ? {
63
+ refundAmount: extra.refundAmount
64
+ } : {}
65
+ });
66
+ }
67
+ __name(emitOrderNotificationTrigger, "emitOrderNotificationTrigger");
68
+ function fireOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
69
+ console.log("[notification-triggers] fire", {
70
+ triggerKey,
71
+ orderId
72
+ });
73
+ void emitOrderNotificationTrigger(triggerKey, orderId, deps, extra).catch((err) => {
74
+ console.error("[notification-triggers]", triggerKey, orderId, err);
75
+ });
76
+ }
77
+ __name(fireOrderNotificationTrigger, "fireOrderNotificationTrigger");
78
+
79
+ export { emitOrderNotificationTrigger, fireOrderNotificationTrigger };
package/dist/cli.cjs CHANGED
@@ -67,13 +67,14 @@ export const requireAdminAccess = helpers.requireAdminAccess;
67
67
  export const getAuthenticatedUser = helpers.getAuthenticatedUser;
68
68
  `,
69
69
  "src/lib/cms.ts": `import {
70
- createCmsApp,
70
+ createCmsAppWithMessaging,
71
71
  localStoragePlugin,
72
72
  blogGeneratorPlugin,
73
73
  pgBossPlugin,
74
74
  socialMediaPlugin,
75
75
  type CmsApp,
76
76
  } from '@infuro/cms-core';
77
+ import { CMS_ENTITY_MAP } from '@infuro/cms-core';
77
78
  import { getDataSourceInitialized } from './data-source';
78
79
 
79
80
  let cmsPromise: Promise<CmsApp> | null = null;
@@ -81,8 +82,9 @@ let cmsPromise: Promise<CmsApp> | null = null;
81
82
  export async function getCms(): Promise<CmsApp> {
82
83
  if (cmsPromise) return cmsPromise;
83
84
  const dataSource = await getDataSourceInitialized();
84
- cmsPromise = createCmsApp({
85
+ cmsPromise = createCmsAppWithMessaging({
85
86
  dataSource,
87
+ entityMap: CMS_ENTITY_MAP,
86
88
  config: process.env as unknown as Record<string, string>,
87
89
  plugins: [
88
90
  localStoragePlugin({ dir: 'public/uploads' }),
package/dist/cli.js CHANGED
@@ -60,13 +60,14 @@ export const requireAdminAccess = helpers.requireAdminAccess;
60
60
  export const getAuthenticatedUser = helpers.getAuthenticatedUser;
61
61
  `,
62
62
  "src/lib/cms.ts": `import {
63
- createCmsApp,
63
+ createCmsAppWithMessaging,
64
64
  localStoragePlugin,
65
65
  blogGeneratorPlugin,
66
66
  pgBossPlugin,
67
67
  socialMediaPlugin,
68
68
  type CmsApp,
69
69
  } from '@infuro/cms-core';
70
+ import { CMS_ENTITY_MAP } from '@infuro/cms-core';
70
71
  import { getDataSourceInitialized } from './data-source';
71
72
 
72
73
  let cmsPromise: Promise<CmsApp> | null = null;
@@ -74,8 +75,9 @@ let cmsPromise: Promise<CmsApp> | null = null;
74
75
  export async function getCms(): Promise<CmsApp> {
75
76
  if (cmsPromise) return cmsPromise;
76
77
  const dataSource = await getDataSourceInitialized();
77
- cmsPromise = createCmsApp({
78
+ cmsPromise = createCmsAppWithMessaging({
78
79
  dataSource,
80
+ entityMap: CMS_ENTITY_MAP,
79
81
  config: process.env as unknown as Record<string, string>,
80
82
  plugins: [
81
83
  localStoragePlugin({ dir: 'public/uploads' }),
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunkHT5DI3XW_cjs = require('./chunk-HT5DI3XW.cjs');
4
+ require('./chunk-UCKN4BBY.cjs');
5
+ require('./chunk-USNT2KNT.cjs');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "emitOrderNotificationTrigger", {
10
+ enumerable: true,
11
+ get: function () { return chunkHT5DI3XW_cjs.emitOrderNotificationTrigger; }
12
+ });
13
+ Object.defineProperty(exports, "fireOrderNotificationTrigger", {
14
+ enumerable: true,
15
+ get: function () { return chunkHT5DI3XW_cjs.fireOrderNotificationTrigger; }
16
+ });
@@ -0,0 +1,3 @@
1
+ export { emitOrderNotificationTrigger, fireOrderNotificationTrigger } from './chunk-X47PBV4I.js';
2
+ import './chunk-HCIRL37O.js';
3
+ import './chunk-SHUYVCID.js';
@@ -1,39 +1,39 @@
1
1
  'use strict';
2
2
 
3
- var chunkN44BJZ4C_cjs = require('./chunk-N44BJZ4C.cjs');
3
+ var chunkSPQFNIYJ_cjs = require('./chunk-SPQFNIYJ.cjs');
4
4
  require('./chunk-USNT2KNT.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS", {
9
9
  enumerable: true,
10
- get: function () { return chunkN44BJZ4C_cjs.EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS; }
10
+ get: function () { return chunkSPQFNIYJ_cjs.EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS; }
11
11
  });
12
12
  Object.defineProperty(exports, "EVENT_ORDER_TEMPLATE_KEY", {
13
13
  enumerable: true,
14
- get: function () { return chunkN44BJZ4C_cjs.EVENT_ORDER_TEMPLATE_KEY; }
14
+ get: function () { return chunkSPQFNIYJ_cjs.EVENT_ORDER_TEMPLATE_KEY; }
15
15
  });
16
16
  Object.defineProperty(exports, "EVENT_ORDER_TEMPLATE_VARIABLES", {
17
17
  enumerable: true,
18
- get: function () { return chunkN44BJZ4C_cjs.EVENT_ORDER_TEMPLATE_VARIABLES; }
18
+ get: function () { return chunkSPQFNIYJ_cjs.EVENT_ORDER_TEMPLATE_VARIABLES; }
19
19
  });
20
20
  Object.defineProperty(exports, "EVENT_ORDER_TEMPLATE_VARIABLE_HINTS", {
21
21
  enumerable: true,
22
- get: function () { return chunkN44BJZ4C_cjs.EVENT_ORDER_TEMPLATE_VARIABLE_HINTS; }
22
+ get: function () { return chunkSPQFNIYJ_cjs.EVENT_ORDER_TEMPLATE_VARIABLE_HINTS; }
23
23
  });
24
24
  Object.defineProperty(exports, "EVENT_ORDER_WHATSAPP_PARAM_KEYS", {
25
25
  enumerable: true,
26
- get: function () { return chunkN44BJZ4C_cjs.EVENT_ORDER_WHATSAPP_PARAM_KEYS; }
26
+ get: function () { return chunkSPQFNIYJ_cjs.EVENT_ORDER_WHATSAPP_PARAM_KEYS; }
27
27
  });
28
28
  Object.defineProperty(exports, "getEventOrderTemplateDefault", {
29
29
  enumerable: true,
30
- get: function () { return chunkN44BJZ4C_cjs.getEventOrderTemplateDefault; }
30
+ get: function () { return chunkSPQFNIYJ_cjs.getEventOrderTemplateDefault; }
31
31
  });
32
32
  Object.defineProperty(exports, "pickWhatsAppTemplateParams", {
33
33
  enumerable: true,
34
- get: function () { return chunkN44BJZ4C_cjs.pickWhatsAppTemplateParams; }
34
+ get: function () { return chunkSPQFNIYJ_cjs.pickWhatsAppTemplateParams; }
35
35
  });
36
36
  Object.defineProperty(exports, "resolveEventOrderTemplate", {
37
37
  enumerable: true,
38
- get: function () { return chunkN44BJZ4C_cjs.resolveEventOrderTemplate; }
38
+ get: function () { return chunkSPQFNIYJ_cjs.resolveEventOrderTemplate; }
39
39
  });
@@ -1,2 +1,2 @@
1
- export { EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS, EVENT_ORDER_TEMPLATE_KEY, EVENT_ORDER_TEMPLATE_VARIABLES, EVENT_ORDER_TEMPLATE_VARIABLE_HINTS, EVENT_ORDER_WHATSAPP_PARAM_KEYS, getEventOrderTemplateDefault, pickWhatsAppTemplateParams, resolveEventOrderTemplate } from './chunk-EF2JBPDM.js';
1
+ export { EVENT_ORDER_MESSAGE_TEMPLATE_DEFAULTS, EVENT_ORDER_TEMPLATE_KEY, EVENT_ORDER_TEMPLATE_VARIABLES, EVENT_ORDER_TEMPLATE_VARIABLE_HINTS, EVENT_ORDER_WHATSAPP_PARAM_KEYS, getEventOrderTemplateDefault, pickWhatsAppTemplateParams, resolveEventOrderTemplate } from './chunk-KFFB6EMZ.js';
2
2
  import './chunk-SHUYVCID.js';