@infuro/cms-core 1.0.46 → 1.0.50

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 (65) hide show
  1. package/README.md +30 -16
  2. package/dist/admin.cjs +4568 -2716
  3. package/dist/admin.d.cts +18 -4
  4. package/dist/admin.d.ts +18 -4
  5. package/dist/admin.js +3475 -1625
  6. package/dist/api.cjs +38 -39
  7. package/dist/api.d.cts +9 -3
  8. package/dist/api.d.ts +9 -3
  9. package/dist/api.js +6 -7
  10. package/dist/auth.cjs +84 -51
  11. package/dist/auth.d.cts +105 -4
  12. package/dist/auth.d.ts +105 -4
  13. package/dist/auth.js +4 -3
  14. package/dist/chunk-2IAXTKQN.cjs +19 -0
  15. package/dist/chunk-3EOM4V2M.cjs +452 -0
  16. package/dist/{chunk-X6UQFV4X.cjs → chunk-77NUXO6A.cjs} +14 -12
  17. package/dist/{chunk-KFFB6EMZ.js → chunk-AYERBA7I.js} +3 -7
  18. package/dist/chunk-EIZKW2PF.js +13 -0
  19. package/dist/{chunk-CRYKVJTO.js → chunk-IPDHT2UV.js} +1420 -3
  20. package/dist/{chunk-UDVLFVEC.cjs → chunk-JCMOOPNX.cjs} +3820 -2907
  21. package/dist/{chunk-X47PBV4I.js → chunk-JE22VP6S.js} +1 -0
  22. package/dist/{chunk-DN65KDIA.js → chunk-JIWUVQ6B.js} +14 -13
  23. package/dist/{chunk-HT5DI3XW.cjs → chunk-KOTXDSQB.cjs} +1 -0
  24. package/dist/{chunk-UKC3HYXI.js → chunk-LT2WOPKA.js} +3733 -2813
  25. package/dist/chunk-RK5ETF2I.js +434 -0
  26. package/dist/{chunk-SPQFNIYJ.cjs → chunk-TJ2MIQUT.cjs} +3 -7
  27. package/dist/{chunk-TCSGFAWB.cjs → chunk-UUWAUHUW.cjs} +1451 -3
  28. package/dist/{chunk-57O3HZPG.js → chunk-WRKV6MHB.js} +415 -3
  29. package/dist/{chunk-FBKDMRQL.cjs → chunk-YV5PK4JW.cjs} +427 -7
  30. package/dist/cli.cjs +13 -22
  31. package/dist/cli.js +13 -22
  32. package/dist/{emit-order-notification-trigger-IVLWKKJL.js → emit-order-notification-trigger-6XX7LSC4.js} +1 -1
  33. package/dist/{emit-order-notification-trigger-D2N3KFHL.cjs → emit-order-notification-trigger-NASG7ZEO.cjs} +3 -3
  34. package/dist/{event-order-defaults-EMWBIGL3.cjs → event-order-defaults-DU7V3YND.cjs} +9 -9
  35. package/dist/{event-order-defaults-SDRNAZHC.js → event-order-defaults-H4RT7NMR.js} +1 -1
  36. package/dist/hooks.cjs +43 -0
  37. package/dist/hooks.d.cts +10 -1
  38. package/dist/hooks.d.ts +10 -1
  39. package/dist/hooks.js +39 -1
  40. package/dist/index.cjs +479 -339
  41. package/dist/index.d.cts +181 -20
  42. package/dist/index.d.ts +181 -20
  43. package/dist/index.js +115 -13
  44. package/dist/migrations/1782200000000-VendorTeamProfiles.ts +233 -0
  45. package/dist/migrations/1782300000000-AddTypeToOrderNotificationBindings.ts +75 -0
  46. package/dist/migrations/1782400000000-CreateUserDeviceTokens.ts +36 -0
  47. package/dist/migrations/1782500000000-AddPushToOrderNotificationBindingsChannelEnum.ts +15 -0
  48. package/dist/{order-notification-dispatcher-ZJZB2HUN.js → order-notification-dispatcher-3TA4ETYJ.js} +1 -2
  49. package/dist/{order-notification-dispatcher-SBQAMM5V.cjs → order-notification-dispatcher-ZEAZ5SHV.cjs} +7 -4
  50. package/dist/{rbac-debug-db-2SGNLANF.js → rbac-debug-db-6EMIVMGF.js} +1 -1
  51. package/dist/{rbac-debug-db-4Z6A425H.cjs → rbac-debug-db-6PWTLBEL.cjs} +2 -2
  52. package/dist/theme.cjs +6 -1
  53. package/dist/theme.d.cts +4 -1
  54. package/dist/theme.d.ts +4 -1
  55. package/dist/theme.js +3 -1
  56. package/package.json +1 -1
  57. package/src/admin/admin.css +7 -0
  58. package/dist/chunk-7PMHZRF3.cjs +0 -872
  59. package/dist/chunk-CQHXW4TR.js +0 -107
  60. package/dist/chunk-GUSHM5HN.js +0 -862
  61. package/dist/chunk-NBY4NVTY.cjs +0 -182
  62. package/dist/chunk-SF2XKMCI.js +0 -171
  63. package/dist/chunk-XMRMZ6NQ.cjs +0 -109
  64. package/dist/send-order-placed-emails-B5ZVJT7T.cjs +0 -15
  65. package/dist/send-order-placed-emails-WPI37KRZ.js +0 -6
@@ -0,0 +1,233 @@
1
+ import type { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ /**
4
+ * Vendor team/profiles redesign:
5
+ * - Rename user group "Vendor Owner" → "Vendor"
6
+ * - Create vendor_user_profiles
7
+ * - Add vendor_users.vendorUserProfileId; backfill profiles + vendorRoleId
8
+ * - Drop vendor_users.role and vendors.pan
9
+ */
10
+ export class VendorTeamProfiles1782200000000 implements MigrationInterface {
11
+ name = 'VendorTeamProfiles1782200000000';
12
+
13
+ public async up(queryRunner: QueryRunner): Promise<void> {
14
+ await queryRunner.query(`
15
+ UPDATE "user_groups"
16
+ SET "name" = 'Vendor'
17
+ WHERE "name" = 'Vendor Owner' AND "deleted" = false
18
+ `);
19
+
20
+ await queryRunner.query(`
21
+ CREATE TABLE IF NOT EXISTS "vendor_user_profiles" (
22
+ "id" SERIAL PRIMARY KEY,
23
+ "name" character varying NOT NULL,
24
+ "email" character varying NOT NULL,
25
+ "phone" character varying,
26
+ "aadhaarNo" character varying,
27
+ "panNo" character varying,
28
+ "addressLine1" character varying,
29
+ "addressLine2" character varying,
30
+ "city" character varying,
31
+ "state" character varying,
32
+ "postalCode" character varying,
33
+ "createdAt" TIMESTAMP NOT NULL DEFAULT now(),
34
+ "updatedAt" TIMESTAMP NOT NULL DEFAULT now()
35
+ )
36
+ `);
37
+
38
+ const hasProfileFk = (await queryRunner.query(`
39
+ SELECT 1 FROM information_schema.columns
40
+ WHERE table_name = 'vendor_users' AND column_name = 'vendorUserProfileId'
41
+ LIMIT 1
42
+ `)) as unknown[];
43
+ if (!hasProfileFk.length) {
44
+ await queryRunner.query(`
45
+ ALTER TABLE "vendor_users"
46
+ ADD COLUMN "vendorUserProfileId" integer
47
+ `);
48
+ }
49
+
50
+ // One profile per membership (loop keeps vu.id ↔ profile.id aligned)
51
+ await queryRunner.query(`
52
+ DO $$
53
+ DECLARE
54
+ r RECORD;
55
+ new_id integer;
56
+ is_owner boolean;
57
+ BEGIN
58
+ FOR r IN
59
+ SELECT
60
+ vu.id AS vu_id,
61
+ vu.role AS vu_role,
62
+ vu."vendorRoleId" AS vendor_role_id,
63
+ COALESCE(NULLIF(TRIM(u.name), ''), COALESCE(NULLIF(TRIM(u.email), ''), 'Vendor user')) AS pname,
64
+ COALESCE(NULLIF(TRIM(u.email), ''), CONCAT('vendor-user-', vu.id, '@placeholder.local')) AS pemail,
65
+ NULLIF(TRIM(u.phone), '') AS pphone,
66
+ v.pan AS vpan,
67
+ v."addressLine1" AS a1,
68
+ v."addressLine2" AS a2,
69
+ v.city AS city,
70
+ v.state AS state,
71
+ v."postalCode" AS postal,
72
+ COALESCE(vr."isOwnerRole", false) AS role_is_owner
73
+ FROM "vendor_users" vu
74
+ INNER JOIN "users" u ON u.id = vu."userId"
75
+ INNER JOIN "vendors" v ON v.id = vu."vendorId"
76
+ LEFT JOIN "vendor_roles" vr ON vr.id = vu."vendorRoleId"
77
+ WHERE vu."vendorUserProfileId" IS NULL
78
+ ORDER BY vu.id
79
+ LOOP
80
+ is_owner := (r.vu_role = 'owner') OR (r.role_is_owner = true);
81
+ INSERT INTO "vendor_user_profiles" (
82
+ "name", "email", "phone", "aadhaarNo", "panNo",
83
+ "addressLine1", "addressLine2", "city", "state", "postalCode",
84
+ "createdAt", "updatedAt"
85
+ ) VALUES (
86
+ r.pname,
87
+ r.pemail,
88
+ r.pphone,
89
+ NULL,
90
+ CASE WHEN is_owner THEN NULLIF(TRIM(r.vpan), '') ELSE NULL END,
91
+ CASE WHEN is_owner THEN r.a1 ELSE NULL END,
92
+ CASE WHEN is_owner THEN r.a2 ELSE NULL END,
93
+ CASE WHEN is_owner THEN r.city ELSE NULL END,
94
+ CASE WHEN is_owner THEN r.state ELSE NULL END,
95
+ CASE WHEN is_owner THEN r.postal ELSE NULL END,
96
+ now(),
97
+ now()
98
+ ) RETURNING id INTO new_id;
99
+ UPDATE "vendor_users" SET "vendorUserProfileId" = new_id WHERE id = r.vu_id;
100
+ END LOOP;
101
+ END $$;
102
+ `);
103
+
104
+ // Ensure vendorRoleId for legacy rows (while role column still exists)
105
+ await queryRunner.query(`
106
+ UPDATE "vendor_users" vu
107
+ SET "vendorRoleId" = vr.id
108
+ FROM "vendor_roles" vr
109
+ WHERE vu."vendorId" = vr."vendorId"
110
+ AND vu."vendorRoleId" IS NULL
111
+ AND vr.deleted = false
112
+ AND vu.role = 'owner'
113
+ AND vr."isOwnerRole" = true
114
+ `);
115
+
116
+ await queryRunner.query(`
117
+ UPDATE "vendor_users" vu
118
+ SET "vendorRoleId" = vr.id
119
+ FROM "vendor_roles" vr
120
+ WHERE vu."vendorId" = vr."vendorId"
121
+ AND vu."vendorRoleId" IS NULL
122
+ AND vr.deleted = false
123
+ AND vu.role IS DISTINCT FROM 'owner'
124
+ AND vr.name = 'Viewer'
125
+ AND vr."isSystem" = true
126
+ `);
127
+
128
+ await queryRunner.query(`
129
+ UPDATE "vendor_users" vu
130
+ SET "vendorRoleId" = vr.id
131
+ FROM "vendor_roles" vr
132
+ WHERE vu."vendorId" = vr."vendorId"
133
+ AND vu."vendorRoleId" IS NULL
134
+ AND vr.deleted = false
135
+ AND vr."isOwnerRole" = false
136
+ AND vr."isSystem" = true
137
+ AND vr.name = 'Manager'
138
+ `);
139
+
140
+ const nullProfiles = (await queryRunner.query(`
141
+ SELECT COUNT(*)::int AS c FROM "vendor_users" WHERE "vendorUserProfileId" IS NULL
142
+ `)) as Array<{ c: number }>;
143
+ if (Number(nullProfiles[0]?.c ?? 0) > 0) {
144
+ throw new Error('VendorTeamProfiles migration: some vendor_users still lack vendorUserProfileId');
145
+ }
146
+
147
+ await queryRunner.query(`
148
+ ALTER TABLE "vendor_users"
149
+ ALTER COLUMN "vendorUserProfileId" SET NOT NULL
150
+ `);
151
+
152
+ const fkExists = (await queryRunner.query(`
153
+ SELECT 1 FROM pg_constraint WHERE conname = 'FK_vendor_users_vendorUserProfileId' LIMIT 1
154
+ `)) as unknown[];
155
+ if (!fkExists.length) {
156
+ await queryRunner.query(`
157
+ ALTER TABLE "vendor_users"
158
+ ADD CONSTRAINT "FK_vendor_users_vendorUserProfileId"
159
+ FOREIGN KEY ("vendorUserProfileId") REFERENCES "vendor_user_profiles"("id")
160
+ ON DELETE RESTRICT
161
+ `);
162
+ }
163
+
164
+ const roleCol = (await queryRunner.query(`
165
+ SELECT 1 FROM information_schema.columns
166
+ WHERE table_name = 'vendor_users' AND column_name = 'role'
167
+ LIMIT 1
168
+ `)) as unknown[];
169
+ if (roleCol.length) {
170
+ await queryRunner.query(`ALTER TABLE "vendor_users" DROP COLUMN "role"`);
171
+ }
172
+
173
+ const panCol = (await queryRunner.query(`
174
+ SELECT 1 FROM information_schema.columns
175
+ WHERE table_name = 'vendors' AND column_name = 'pan'
176
+ LIMIT 1
177
+ `)) as unknown[];
178
+ if (panCol.length) {
179
+ await queryRunner.query(`ALTER TABLE "vendors" DROP COLUMN "pan"`);
180
+ }
181
+ }
182
+
183
+ public async down(queryRunner: QueryRunner): Promise<void> {
184
+ const panCol = (await queryRunner.query(`
185
+ SELECT 1 FROM information_schema.columns
186
+ WHERE table_name = 'vendors' AND column_name = 'pan'
187
+ LIMIT 1
188
+ `)) as unknown[];
189
+ if (!panCol.length) {
190
+ await queryRunner.query(`ALTER TABLE "vendors" ADD COLUMN "pan" character varying`);
191
+ await queryRunner.query(`
192
+ UPDATE "vendors" v
193
+ SET pan = p."panNo"
194
+ FROM "vendor_users" vu
195
+ INNER JOIN "vendor_user_profiles" p ON p.id = vu."vendorUserProfileId"
196
+ INNER JOIN "vendor_roles" vr ON vr.id = vu."vendorRoleId" AND vr."isOwnerRole" = true
197
+ WHERE vu."vendorId" = v.id AND p."panNo" IS NOT NULL
198
+ `);
199
+ }
200
+
201
+ const roleCol = (await queryRunner.query(`
202
+ SELECT 1 FROM information_schema.columns
203
+ WHERE table_name = 'vendor_users' AND column_name = 'role'
204
+ LIMIT 1
205
+ `)) as unknown[];
206
+ if (!roleCol.length) {
207
+ await queryRunner.query(`
208
+ ALTER TABLE "vendor_users"
209
+ ADD COLUMN "role" character varying NOT NULL DEFAULT 'staff'
210
+ `);
211
+ await queryRunner.query(`
212
+ UPDATE "vendor_users" vu
213
+ SET "role" = 'owner'
214
+ FROM "vendor_roles" vr
215
+ WHERE vu."vendorRoleId" = vr.id AND vr."isOwnerRole" = true
216
+ `);
217
+ }
218
+
219
+ await queryRunner.query(`
220
+ ALTER TABLE "vendor_users" DROP CONSTRAINT IF EXISTS "FK_vendor_users_vendorUserProfileId"
221
+ `);
222
+ await queryRunner.query(`
223
+ ALTER TABLE "vendor_users" DROP COLUMN IF EXISTS "vendorUserProfileId"
224
+ `);
225
+ await queryRunner.query(`DROP TABLE IF EXISTS "vendor_user_profiles"`);
226
+
227
+ await queryRunner.query(`
228
+ UPDATE "user_groups"
229
+ SET "name" = 'Vendor Owner'
230
+ WHERE "name" = 'Vendor' AND "deleted" = false
231
+ `);
232
+ }
233
+ }
@@ -0,0 +1,75 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ export class AddTypeToOrderNotificationBindings1782300000000
4
+ implements MigrationInterface
5
+ {
6
+ name = 'AddTypeToOrderNotificationBindings1782300000000';
7
+
8
+ public async up(queryRunner: QueryRunner): Promise<void> {
9
+ // 1. Create the audience type enum.
10
+ await queryRunner.query(`
11
+ CREATE TYPE "order_notification_bindings_type_enum" AS ENUM ('customers', 'vendors', 'admin')
12
+ `);
13
+
14
+ // 2. Add the type column, defaulting existing rows to 'customers'.
15
+ await queryRunner.query(`
16
+ ALTER TABLE "order_notification_bindings"
17
+ ADD COLUMN "type" "order_notification_bindings_type_enum" NOT NULL DEFAULT 'customers'
18
+ `);
19
+
20
+ // 3. Drop old unique constraint on (triggerKey, channel).
21
+ await queryRunner.query(`
22
+ DO $$
23
+ DECLARE
24
+ old_constraint_name text;
25
+ BEGIN
26
+ SELECT con.conname INTO old_constraint_name
27
+ FROM pg_constraint con
28
+ JOIN pg_class rel ON rel.oid = con.conrelid
29
+ WHERE rel.relname = 'order_notification_bindings'
30
+ AND con.contype = 'u'
31
+ AND con.conname LIKE '%triggerKey_channel%'
32
+ LIMIT 1;
33
+
34
+ IF old_constraint_name IS NOT NULL THEN
35
+ EXECUTE format('ALTER TABLE "order_notification_bindings" DROP CONSTRAINT %I', old_constraint_name);
36
+ END IF;
37
+ END $$;
38
+ `);
39
+
40
+ // 4. Add new composite unique constraint on (triggerKey, channel, type).
41
+ await queryRunner.query(`
42
+ ALTER TABLE "order_notification_bindings"
43
+ ADD CONSTRAINT "UQ_order_notification_bindings_triggerKey_channel_type" UNIQUE ("triggerKey", "channel", "type")
44
+ `);
45
+ }
46
+
47
+ public async down(queryRunner: QueryRunner): Promise<void> {
48
+ // 1. Drop composite unique constraint.
49
+ await queryRunner.query(`
50
+ ALTER TABLE "order_notification_bindings"
51
+ DROP CONSTRAINT "UQ_order_notification_bindings_triggerKey_channel_type"
52
+ `);
53
+
54
+ // 2. Remove vendor/admin audience rows prior to rollback.
55
+ await queryRunner.query(`
56
+ DELETE FROM "order_notification_bindings" WHERE "type" != 'customers'
57
+ `);
58
+
59
+ // 3. Drop type column.
60
+ await queryRunner.query(`
61
+ ALTER TABLE "order_notification_bindings" DROP COLUMN "type"
62
+ `);
63
+
64
+ // 4. Restore original unique constraint on (triggerKey, channel).
65
+ await queryRunner.query(`
66
+ ALTER TABLE "order_notification_bindings"
67
+ ADD CONSTRAINT "UQ_order_notification_bindings_triggerKey_channel" UNIQUE ("triggerKey", "channel")
68
+ `);
69
+
70
+ // 5. Drop enum type.
71
+ await queryRunner.query(`
72
+ DROP TYPE "order_notification_bindings_type_enum"
73
+ `);
74
+ }
75
+ }
@@ -0,0 +1,36 @@
1
+ import type { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ export class CreateUserDeviceTokens1782400000000 implements MigrationInterface {
4
+ name = 'CreateUserDeviceTokens1782400000000';
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ await queryRunner.query(`
8
+ DO $$ BEGIN
9
+ CREATE TYPE "user_device_tokens_platform_enum" AS ENUM ('android', 'ios');
10
+ EXCEPTION WHEN duplicate_object THEN NULL; END $$;
11
+ `);
12
+
13
+ await queryRunner.query(`
14
+ CREATE TABLE IF NOT EXISTS "user_device_tokens" (
15
+ "id" uuid NOT NULL DEFAULT gen_random_uuid(),
16
+ "vendor_id" uuid NOT NULL,
17
+ "user_id" uuid NOT NULL,
18
+ "token" text NOT NULL,
19
+ "platform" "user_device_tokens_platform_enum" NOT NULL,
20
+ "device_id" character varying(255),
21
+ "app_version" character varying(50),
22
+ "is_active" boolean NOT NULL DEFAULT true,
23
+ "last_used_at" TIMESTAMP NULL,
24
+ "created_at" TIMESTAMP NOT NULL DEFAULT NOW(),
25
+ "updated_at" TIMESTAMP NOT NULL DEFAULT NOW(),
26
+ CONSTRAINT "PK_user_device_tokens" PRIMARY KEY ("id"),
27
+ CONSTRAINT "uq_user_device_token" UNIQUE ("user_id", "token")
28
+ )
29
+ `);
30
+ }
31
+
32
+ public async down(queryRunner: QueryRunner): Promise<void> {
33
+ await queryRunner.query(`DROP TABLE IF EXISTS "user_device_tokens"`);
34
+ await queryRunner.query(`DROP TYPE IF EXISTS "user_device_tokens_platform_enum"`);
35
+ }
36
+ }
@@ -0,0 +1,15 @@
1
+ import type { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ export class AddMobileToOrderNotificationBindingsChannelEnum1782500000000 implements MigrationInterface {
4
+ name = 'AddMobileToOrderNotificationBindingsChannelEnum1782500000000';
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ await queryRunner.query(`
8
+ ALTER TYPE "order_notification_bindings_channel_enum" ADD VALUE IF NOT EXISTS 'mobile';
9
+ `);
10
+ }
11
+
12
+ public async down(queryRunner: QueryRunner): Promise<void> {
13
+ /* Postgres ENUM values cannot be safely removed once added */
14
+ }
15
+ }
@@ -1,5 +1,4 @@
1
- export { initWhatsappTriggerDispatcher, resendOrderNotification } from './chunk-GUSHM5HN.js';
2
- import './chunk-CRYKVJTO.js';
1
+ export { getSettingsGroup, initWhatsappTriggerDispatcher, resendOrderNotification } from './chunk-IPDHT2UV.js';
3
2
  import './chunk-HCIRL37O.js';
4
3
  import './chunk-L3525VXI.js';
5
4
  import './chunk-2KUCQVAQ.js';
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk7PMHZRF3_cjs = require('./chunk-7PMHZRF3.cjs');
4
- require('./chunk-TCSGFAWB.cjs');
3
+ var chunkUUWAUHUW_cjs = require('./chunk-UUWAUHUW.cjs');
5
4
  require('./chunk-UCKN4BBY.cjs');
6
5
  require('./chunk-V25RDUOU.cjs');
7
6
  require('./chunk-BXYZDMTZ.cjs');
@@ -11,11 +10,15 @@ require('./chunk-USNT2KNT.cjs');
11
10
 
12
11
 
13
12
 
13
+ Object.defineProperty(exports, "getSettingsGroup", {
14
+ enumerable: true,
15
+ get: function () { return chunkUUWAUHUW_cjs.getSettingsGroup; }
16
+ });
14
17
  Object.defineProperty(exports, "initWhatsappTriggerDispatcher", {
15
18
  enumerable: true,
16
- get: function () { return chunk7PMHZRF3_cjs.initWhatsappTriggerDispatcher; }
19
+ get: function () { return chunkUUWAUHUW_cjs.initWhatsappTriggerDispatcher; }
17
20
  });
18
21
  Object.defineProperty(exports, "resendOrderNotification", {
19
22
  enumerable: true,
20
- get: function () { return chunk7PMHZRF3_cjs.resendOrderNotification; }
23
+ get: function () { return chunkUUWAUHUW_cjs.resendOrderNotification; }
21
24
  });
@@ -1,4 +1,4 @@
1
- import { summarizeEntityPerms, permissionRowsToRecord } from './chunk-DN65KDIA.js';
1
+ import { summarizeEntityPerms, permissionRowsToRecord } from './chunk-JIWUVQ6B.js';
2
2
  import { __name } from './chunk-SHUYVCID.js';
3
3
 
4
4
  // src/auth/rbac-debug-db.ts
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkX6UQFV4X_cjs = require('./chunk-X6UQFV4X.cjs');
3
+ var chunk77NUXO6A_cjs = require('./chunk-77NUXO6A.cjs');
4
4
  var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
5
 
6
6
  // src/auth/rbac-debug-db.ts
@@ -27,7 +27,7 @@ async function loadDbPermissionsForUser(dataSource, userId) {
27
27
  return {
28
28
  groupId,
29
29
  groupName,
30
- dbEntityPerms: chunkX6UQFV4X_cjs.summarizeEntityPerms(chunkX6UQFV4X_cjs.permissionRowsToRecord(permRows))
30
+ dbEntityPerms: chunk77NUXO6A_cjs.summarizeEntityPerms(chunk77NUXO6A_cjs.permissionRowsToRecord(permRows))
31
31
  };
32
32
  }
33
33
  chunkUSNT2KNT_cjs.__name(loadDbPermissionsForUser, "loadDbPermissionsForUser");
package/dist/theme.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var chunk2IAXTKQN_cjs = require('./chunk-2IAXTKQN.cjs');
3
4
  var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
5
  var React = require('react');
5
6
 
@@ -42,7 +43,7 @@ function PageRenderer({ content, theme, navbarConfig, footerConfig }) {
42
43
  const resolver = buildResolver(theme);
43
44
  const NavbarComponent = theme.layout?.navbar?.component;
44
45
  const FooterComponent = theme.layout?.footer?.component;
45
- return React__default.default.createElement(React__default.default.Fragment, null, NavbarComponent && navbarConfig ? React__default.default.createElement(NavbarComponent, navbarConfig) : null, React__default.default.createElement("main", null, renderNode(content, "ROOT", resolver)), FooterComponent && footerConfig ? React__default.default.createElement(FooterComponent, footerConfig) : null);
46
+ return React__default.default.createElement(React__default.default.Fragment, null, React__default.default.createElement(chunk2IAXTKQN_cjs.ForceLightMode), NavbarComponent && navbarConfig ? React__default.default.createElement(NavbarComponent, navbarConfig) : null, React__default.default.createElement("main", null, renderNode(content, "ROOT", resolver)), FooterComponent && footerConfig ? React__default.default.createElement(FooterComponent, footerConfig) : null);
46
47
  }
47
48
  chunkUSNT2KNT_cjs.__name(PageRenderer, "PageRenderer");
48
49
  function getChildIds(node) {
@@ -79,6 +80,10 @@ function renderNode(json, nodeId, resolver) {
79
80
  }
80
81
  chunkUSNT2KNT_cjs.__name(renderNode, "renderNode");
81
82
 
83
+ Object.defineProperty(exports, "ForceLightMode", {
84
+ enumerable: true,
85
+ get: function () { return chunk2IAXTKQN_cjs.ForceLightMode; }
86
+ });
82
87
  exports.PageRenderer = PageRenderer;
83
88
  exports.buildResolver = buildResolver;
84
89
  exports.createTheme = createTheme;
package/dist/theme.d.cts CHANGED
@@ -104,4 +104,7 @@ declare function PageRenderer({ content, theme, navbarConfig, footerConfig }: Pa
104
104
  children?: React$1.ReactNode | undefined;
105
105
  }>;
106
106
 
107
- export { type CatalogGroup, type ComponentMeta, type FooterConfig, type LayoutConfig, type NavItem, type NavbarConfig, PageRenderer, type PropDefinition, type PropType, type ThemeComponent, type ThemeConfig, buildResolver, createTheme, getCatalog };
107
+ /** Component wrapper that forces light mode */
108
+ declare function ForceLightMode(): React$1.ReactElement;
109
+
110
+ export { type CatalogGroup, type ComponentMeta, type FooterConfig, ForceLightMode, type LayoutConfig, type NavItem, type NavbarConfig, PageRenderer, type PropDefinition, type PropType, type ThemeComponent, type ThemeConfig, buildResolver, createTheme, getCatalog };
package/dist/theme.d.ts CHANGED
@@ -104,4 +104,7 @@ declare function PageRenderer({ content, theme, navbarConfig, footerConfig }: Pa
104
104
  children?: React$1.ReactNode | undefined;
105
105
  }>;
106
106
 
107
- export { type CatalogGroup, type ComponentMeta, type FooterConfig, type LayoutConfig, type NavItem, type NavbarConfig, PageRenderer, type PropDefinition, type PropType, type ThemeComponent, type ThemeConfig, buildResolver, createTheme, getCatalog };
107
+ /** Component wrapper that forces light mode */
108
+ declare function ForceLightMode(): React$1.ReactElement;
109
+
110
+ export { type CatalogGroup, type ComponentMeta, type FooterConfig, ForceLightMode, type LayoutConfig, type NavItem, type NavbarConfig, PageRenderer, type PropDefinition, type PropType, type ThemeComponent, type ThemeConfig, buildResolver, createTheme, getCatalog };
package/dist/theme.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { ForceLightMode } from './chunk-EIZKW2PF.js';
2
+ export { ForceLightMode } from './chunk-EIZKW2PF.js';
1
3
  import { __name } from './chunk-SHUYVCID.js';
2
4
  import React from 'react';
3
5
 
@@ -36,7 +38,7 @@ function PageRenderer({ content, theme, navbarConfig, footerConfig }) {
36
38
  const resolver = buildResolver(theme);
37
39
  const NavbarComponent = theme.layout?.navbar?.component;
38
40
  const FooterComponent = theme.layout?.footer?.component;
39
- return React.createElement(React.Fragment, null, NavbarComponent && navbarConfig ? React.createElement(NavbarComponent, navbarConfig) : null, React.createElement("main", null, renderNode(content, "ROOT", resolver)), FooterComponent && footerConfig ? React.createElement(FooterComponent, footerConfig) : null);
41
+ return React.createElement(React.Fragment, null, React.createElement(ForceLightMode), NavbarComponent && navbarConfig ? React.createElement(NavbarComponent, navbarConfig) : null, React.createElement("main", null, renderNode(content, "ROOT", resolver)), FooterComponent && footerConfig ? React.createElement(FooterComponent, footerConfig) : null);
40
42
  }
41
43
  __name(PageRenderer, "PageRenderer");
42
44
  function getChildIds(node) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infuro/cms-core",
3
- "version": "1.0.46",
3
+ "version": "1.0.50",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -72,4 +72,11 @@ body {
72
72
  background-color: hsl(var(--background));
73
73
  color: hsl(var(--foreground));
74
74
  }
75
+
76
+ .jodit-wysiwyg ul, .jodit-workplace ul, .md-content ul, .product-detail__description ul { list-style-type: disc !important; padding-left: 1.5rem !important; margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; }
77
+ .jodit-wysiwyg ol, .jodit-workplace ol, .md-content ol, .product-detail__description ol { list-style-type: decimal !important; padding-left: 1.5rem !important; margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; }
78
+ .jodit-wysiwyg li, .jodit-workplace li, .md-content li, .product-detail__description li { display: list-item !important; margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; }
79
+ .jodit-wysiwyg ul ul, .md-content ul ul { list-style-type: circle !important; }
80
+ .jodit-wysiwyg ul ul ul, .md-content ul ul ul { list-style-type: square !important; }
75
81
  }
82
+