@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
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk3KPNTQBV_cjs = require('./chunk-3KPNTQBV.cjs');
3
+ var chunkWMXPKKXU_cjs = require('./chunk-WMXPKKXU.cjs');
4
4
  var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
5
  var jwt = require('next-auth/jwt');
6
6
  var _CredentialsProvider = require('next-auth/providers/credentials');
@@ -11,16 +11,15 @@ var _CredentialsProvider__default = /*#__PURE__*/_interopDefault(_CredentialsPro
11
11
 
12
12
  // src/auth/seed-permissions.ts
13
13
  async function seedAdministratorPermissions(dataSource, entityMap) {
14
- const entities = chunk3KPNTQBV_cjs.getPermissionableEntityKeys(entityMap);
14
+ const entities = chunkWMXPKKXU_cjs.getPermissionableEntityKeys(entityMap);
15
15
  const groupRepo = dataSource.getRepository(entityMap.user_groups);
16
16
  const permRepo = dataSource.getRepository(entityMap.permissions);
17
17
  const adminGroup = await groupRepo.findOne({
18
18
  where: {
19
- name: chunk3KPNTQBV_cjs.ADMIN_GROUP_NAME,
19
+ name: chunkWMXPKKXU_cjs.ADMIN_GROUP_NAME,
20
20
  deleted: false
21
21
  }
22
22
  });
23
- console.log("ADMIN GROUP", adminGroup);
24
23
  if (!adminGroup) return;
25
24
  const fullCrud = {
26
25
  canCreate: true,
@@ -35,7 +34,6 @@ async function seedAdministratorPermissions(dataSource, entityMap) {
35
34
  entity
36
35
  }
37
36
  });
38
- console.log("EXISTING", existing);
39
37
  if (existing) {
40
38
  existing.canCreate = true;
41
39
  existing.canRead = true;
@@ -57,17 +55,13 @@ chunkUSNT2KNT_cjs.__name(seedAdministratorPermissions, "seedAdministratorPermiss
57
55
  var LOG_PREFIX = "[cms-auth]";
58
56
  function isAuthDebugEnabled() {
59
57
  const v = process.env.CMS_AUTH_DEBUG?.trim().toLowerCase();
60
- if (v === "1" || v === "true" || v === "yes") return true;
61
- if (v === "0" || v === "false" || v === "no") return false;
62
- return process.env.NODE_ENV === "development";
58
+ return v === "1" || v === "true" || v === "yes";
63
59
  }
64
60
  chunkUSNT2KNT_cjs.__name(isAuthDebugEnabled, "isAuthDebugEnabled");
65
61
  function isAuthDebugClientEnabled() {
66
62
  if (typeof window === "undefined") return false;
67
63
  const v = process.env.NEXT_PUBLIC_CMS_AUTH_DEBUG?.trim().toLowerCase();
68
- if (v === "1" || v === "true" || v === "yes") return true;
69
- if (v === "0" || v === "false" || v === "no") return false;
70
- return process.env.NODE_ENV === "development";
64
+ return v === "1" || v === "true" || v === "yes";
71
65
  }
72
66
  chunkUSNT2KNT_cjs.__name(isAuthDebugClientEnabled, "isAuthDebugClientEnabled");
73
67
  function logAuth(message, data) {
@@ -246,20 +240,76 @@ function createCmsMiddleware(config = {}) {
246
240
  }
247
241
  chunkUSNT2KNT_cjs.__name(createCmsMiddleware, "createCmsMiddleware");
248
242
  var CredentialsProvider = _CredentialsProvider__default.default.default ?? _CredentialsProvider__default.default;
243
+ function parseBooleanSetting(value) {
244
+ if (typeof value === "boolean") return value;
245
+ if (typeof value === "number") return value !== 0;
246
+ if (typeof value === "string") {
247
+ const normalized = value.trim().toLowerCase();
248
+ if ([
249
+ "true",
250
+ "1",
251
+ "yes",
252
+ "on"
253
+ ].includes(normalized)) return true;
254
+ if ([
255
+ "false",
256
+ "0",
257
+ "no",
258
+ "off"
259
+ ].includes(normalized)) return false;
260
+ }
261
+ if (value && typeof value === "object") {
262
+ const record = value;
263
+ const nested = parseBooleanSetting(record.value ?? record.enabled ?? record.isEnabled ?? record.active ?? record.state);
264
+ if (nested != null) return nested;
265
+ }
266
+ return null;
267
+ }
268
+ chunkUSNT2KNT_cjs.__name(parseBooleanSetting, "parseBooleanSetting");
269
+ async function checkMultiVendorEnabledViaSettingsApi() {
270
+ const FAIL_OPEN_DEFAULT = true;
271
+ const base = process.env.NEXTAUTH_URL?.replace(/\/$/, "");
272
+ if (!base) {
273
+ logAuth("multiVendorCheck: no NEXTAUTH_URL, defaulting", {
274
+ multiVendorEnabled: FAIL_OPEN_DEFAULT
275
+ });
276
+ return FAIL_OPEN_DEFAULT;
277
+ }
278
+ try {
279
+ const res = await fetch(`${base}/api/settings/multi_vendor`, {
280
+ cache: "no-store"
281
+ });
282
+ if (!res.ok) {
283
+ logAuth("multiVendorCheck: non-OK response, defaulting", {
284
+ status: res.status
285
+ });
286
+ return FAIL_OPEN_DEFAULT;
287
+ }
288
+ const data = await res.json();
289
+ const parsed = parseBooleanSetting(data?.enabled ?? data?.value ?? data?.isEnabled ?? data?.active ?? data?.state);
290
+ return parsed ?? FAIL_OPEN_DEFAULT;
291
+ } catch (err) {
292
+ logAuth("multiVendorCheck: fetch failed, defaulting", {
293
+ message: err instanceof Error ? err.message : String(err)
294
+ });
295
+ return FAIL_OPEN_DEFAULT;
296
+ }
297
+ }
298
+ chunkUSNT2KNT_cjs.__name(checkMultiVendorEnabledViaSettingsApi, "checkMultiVendorEnabledViaSettingsApi");
249
299
  function sessionUserFromNextAuthUser(user) {
250
300
  const g = user.group;
251
- const isRBACAdmin = chunk3KPNTQBV_cjs.isSuperAdmin({
301
+ const isRBACAdmin = chunkWMXPKKXU_cjs.isSuperAdmin({
252
302
  groupId: user.groupId ?? void 0,
253
303
  groupName: g?.name,
254
304
  isRBACAdmin: false
255
305
  });
256
- const entityPerms = chunk3KPNTQBV_cjs.permissionRowsToRecord(g?.permissions);
306
+ const entityPerms = chunkWMXPKKXU_cjs.permissionRowsToRecord(g?.permissions);
257
307
  const rawAdminAccess = user.adminAccess;
258
308
  const adminAccess = rawAdminAccess === true ? true : rawAdminAccess === false ? false : void 0;
259
309
  const vendorIds = user.vendorIds ?? [];
260
310
  const vendorRole = user.vendorRole ?? null;
261
311
  const isVendorRoleOwner = user.isVendorRoleOwner ?? false;
262
- const { isVendorPortal, isVendorOwner: isVendorOwner2 } = chunk3KPNTQBV_cjs.vendorPortalFlagsFromUser({
312
+ const { isVendorPortal, isVendorOwner: isVendorOwner2 } = chunkWMXPKKXU_cjs.vendorPortalFlagsFromUser({
263
313
  email: user.email,
264
314
  isRBACAdmin,
265
315
  groupName: g?.name,
@@ -389,6 +439,17 @@ function getNextAuthOptions(config) {
389
439
  return null;
390
440
  }
391
441
  const sessionUser = sessionUserFromNextAuthUser(user);
442
+ if (sessionUser.isVendorPortal && !sessionUser.isRBACAdmin) {
443
+ const multiVendorEnabled = await checkMultiVendorEnabledViaSettingsApi();
444
+ if (!multiVendorEnabled) {
445
+ logAuth("authorize(credentials) rejected", {
446
+ reason: "multi_vendor_disabled",
447
+ email,
448
+ userId: user.id
449
+ });
450
+ return null;
451
+ }
452
+ }
392
453
  logAuth("authorize(credentials) ok", summarizeSessionUserForLog(sessionUser));
393
454
  return sessionUser;
394
455
  } catch (err) {
@@ -0,0 +1,21 @@
1
+ import { __name } from './chunk-SHUYVCID.js';
2
+ import { EventEmitter } from 'events';
3
+
4
+ var KNOWN_NOTIFICATION_TRIGGERS = {
5
+ ORDER_PLACED: "order_placed",
6
+ ORDER_CANCELLED: "order_cancelled"
7
+ };
8
+ var NotificationTriggerEmitter = class NotificationTriggerEmitter2 extends EventEmitter {
9
+ static {
10
+ __name(this, "NotificationTriggerEmitter");
11
+ }
12
+ emitTrigger(triggerKey, payload) {
13
+ this.emit("__any__", triggerKey, payload);
14
+ }
15
+ onAnyTrigger(listener) {
16
+ this.on("__any__", listener);
17
+ }
18
+ };
19
+ var notificationTriggerEmitter = new NotificationTriggerEmitter();
20
+
21
+ export { KNOWN_NOTIFICATION_TRIGGERS, notificationTriggerEmitter };
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ var chunkUCKN4BBY_cjs = require('./chunk-UCKN4BBY.cjs');
4
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
+
6
+ // src/lib/emit-order-notification-trigger.ts
7
+ function maskPhone(raw) {
8
+ const digits = String(raw ?? "").replace(/\D/g, "");
9
+ if (digits.length <= 4) return "(none)";
10
+ return `***${digits.slice(-4)}`;
11
+ }
12
+ chunkUSNT2KNT_cjs.__name(maskPhone, "maskPhone");
13
+ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
14
+ if (!deps.entityMap.orders) {
15
+ console.warn("[notification-triggers] skip emit: orders entity missing from entityMap", {
16
+ triggerKey,
17
+ orderId
18
+ });
19
+ return;
20
+ }
21
+ const listenerCount = chunkUCKN4BBY_cjs.notificationTriggerEmitter.listenerCount("__any__");
22
+ if (listenerCount === 0) {
23
+ console.warn("[notification-triggers] no WhatsApp dispatcher listener \u2014 ensure createCmsApiHandler passes getCms (initWhatsappTriggerDispatcher)");
24
+ }
25
+ const orderRepo = deps.dataSource.getRepository(deps.entityMap.orders);
26
+ const fullOrder = await orderRepo.findOne({
27
+ where: {
28
+ id: orderId,
29
+ deleted: false
30
+ },
31
+ relations: [
32
+ "contact"
33
+ ]
34
+ });
35
+ if (!fullOrder) {
36
+ console.warn("[notification-triggers] skip emit: order not found", {
37
+ triggerKey,
38
+ orderId
39
+ });
40
+ return;
41
+ }
42
+ const fo = fullOrder;
43
+ const phone = fo.contact?.phone ?? null;
44
+ console.log("[notification-triggers] emit", {
45
+ triggerKey,
46
+ orderId,
47
+ orderNumber: fo.orderNumber ?? null,
48
+ phone: maskPhone(phone),
49
+ listeners: listenerCount
50
+ });
51
+ if (!phone?.trim()) {
52
+ console.warn("[notification-triggers] order contact has no phone \u2014 WhatsApp will be skipped", {
53
+ orderId
54
+ });
55
+ }
56
+ chunkUCKN4BBY_cjs.notificationTriggerEmitter.emitTrigger(triggerKey, {
57
+ orderId,
58
+ orderNumber: String(fo.orderNumber ?? ""),
59
+ customerName: fo.contact?.name ?? "",
60
+ customerPhone: phone,
61
+ total: fo.total ?? 0,
62
+ currency: String(fo.currency ?? "INR"),
63
+ vendorId: fo.vendorId ?? null,
64
+ ...extra?.refundAmount != null ? {
65
+ refundAmount: extra.refundAmount
66
+ } : {}
67
+ });
68
+ }
69
+ chunkUSNT2KNT_cjs.__name(emitOrderNotificationTrigger, "emitOrderNotificationTrigger");
70
+ function fireOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
71
+ console.log("[notification-triggers] fire", {
72
+ triggerKey,
73
+ orderId
74
+ });
75
+ void emitOrderNotificationTrigger(triggerKey, orderId, deps, extra).catch((err) => {
76
+ console.error("[notification-triggers]", triggerKey, orderId, err);
77
+ });
78
+ }
79
+ chunkUSNT2KNT_cjs.__name(fireOrderNotificationTrigger, "fireOrderNotificationTrigger");
80
+
81
+ exports.emitOrderNotificationTrigger = emitOrderNotificationTrigger;
82
+ exports.fireOrderNotificationTrigger = fireOrderNotificationTrigger;
@@ -84,12 +84,18 @@ async function resolveEventOrderTemplate(channel, getRow, eventOverride) {
84
84
  let subject = def.subject;
85
85
  let body = def.body;
86
86
  let externalTemplateRef = def.externalTemplateRef;
87
+ let name;
88
+ let language;
89
+ let paramOrder;
87
90
  let enabled = true;
88
91
  if (row) {
89
92
  enabled = row.enabled !== false;
90
93
  if (row.subject?.trim()) subject = row.subject.trim();
91
94
  if (row.body.trim()) body = row.body;
92
95
  if (row.externalTemplateRef?.trim()) externalTemplateRef = row.externalTemplateRef.trim();
96
+ name = row.name?.trim() || void 0;
97
+ language = row.language?.trim() || void 0;
98
+ paramOrder = row.paramOrder?.length ? row.paramOrder : void 0;
93
99
  }
94
100
  if (eventOverride) {
95
101
  if (eventOverride.subject?.trim()) subject = eventOverride.subject.trim();
@@ -102,6 +108,9 @@ async function resolveEventOrderTemplate(channel, getRow, eventOverride) {
102
108
  subject,
103
109
  body,
104
110
  externalTemplateRef: externalTemplateRef?.trim() || void 0,
111
+ name,
112
+ language,
113
+ paramOrder,
105
114
  enabled
106
115
  };
107
116
  }