@infuro/cms-core 1.0.33 → 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 (164) hide show
  1. package/README.md +22 -6
  2. package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
  3. package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
  4. package/dist/admin.cjs +34072 -20487
  5. package/dist/admin.d.cts +191 -9
  6. package/dist/admin.d.ts +191 -9
  7. package/dist/admin.js +33913 -20423
  8. package/dist/api.cjs +123 -16508
  9. package/dist/api.d.cts +633 -3
  10. package/dist/api.d.ts +633 -3
  11. package/dist/api.js +14 -16519
  12. package/dist/auth.cjs +196 -955
  13. package/dist/auth.d.cts +201 -42
  14. package/dist/auth.d.ts +201 -42
  15. package/dist/auth.js +4 -888
  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 +142 -84
  59. package/dist/cli.js +101 -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 -21070
  77. package/dist/index.d.cts +2255 -749
  78. package/dist/index.d.ts +2255 -749
  79. package/dist/index.js +1925 -19891
  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/1778660000004-CreateCustomerAndCustomerContacts.ts +99 -0
  85. package/dist/migrations/1778660000005-AddCustomerIdToVendorCustomers.ts +39 -0
  86. package/dist/migrations/1778660000006-UpdateVendorCustomersContactNullable.ts +36 -0
  87. package/dist/migrations/1778660000007-VendorOwnerCustomerContactsPermission.ts +39 -0
  88. package/dist/migrations/1779300000000-VendorOwnerContactsPermission.ts +39 -0
  89. package/dist/migrations/1779400000000-AddCustomerContactIdToOrders.ts +33 -0
  90. package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
  91. package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
  92. package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
  93. package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
  94. package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
  95. package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
  96. package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
  97. package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
  98. package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
  99. package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
  100. package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
  101. package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
  102. package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
  103. package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
  104. package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
  105. package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
  106. package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
  107. package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
  108. package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
  109. package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
  110. package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
  111. package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
  112. package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
  113. package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
  114. package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
  115. package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
  116. package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
  117. package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
  118. package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
  119. package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
  120. package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
  121. package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
  122. package/dist/paid-order-erp-3USEG6WL.js +3 -0
  123. package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
  124. package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
  125. package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
  126. package/dist/razorpay-KLO2KNCB.js +49 -0
  127. package/dist/razorpay-U23LGY72.cjs +56 -0
  128. package/dist/rbac-debug-db-D7ME7QUY.cjs +35 -0
  129. package/dist/rbac-debug-db-MTCTVNNM.js +33 -0
  130. package/dist/sms-defaults-2NL24H57.js +2 -0
  131. package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
  132. package/dist/stripe-4FD27QVJ.js +51 -0
  133. package/dist/stripe-VU6OEG2D.cjs +57 -0
  134. package/dist/theme.cjs +31 -59
  135. package/dist/theme.d.cts +78 -3
  136. package/dist/theme.d.ts +78 -3
  137. package/dist/theme.js +23 -20
  138. package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
  139. package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
  140. package/dist/whatsapp-queue-3DXA4MXU.js +2 -0
  141. package/dist/whatsapp-queue-KG65MXD5.cjs +15 -0
  142. package/package.json +147 -141
  143. package/dist/admin.cjs.map +0 -1
  144. package/dist/admin.js.map +0 -1
  145. package/dist/api.cjs.map +0 -1
  146. package/dist/api.js.map +0 -1
  147. package/dist/auth.cjs.map +0 -1
  148. package/dist/auth.js.map +0 -1
  149. package/dist/cli.cjs.map +0 -1
  150. package/dist/cli.js.map +0 -1
  151. package/dist/config-DJ5CmQvS.d.cts +0 -8
  152. package/dist/config-DJ5CmQvS.d.ts +0 -8
  153. package/dist/hooks.cjs.map +0 -1
  154. package/dist/hooks.js.map +0 -1
  155. package/dist/index-DWd5Gjc4.d.ts +0 -582
  156. package/dist/index-rZTnpK7y.d.cts +0 -582
  157. package/dist/index.cjs.map +0 -1
  158. package/dist/index.js.map +0 -1
  159. package/dist/theme.cjs.map +0 -1
  160. package/dist/theme.js.map +0 -1
  161. package/dist/types-DCVaXlPV.d.cts +0 -78
  162. package/dist/types-DCVaXlPV.d.ts +0 -78
  163. package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
  164. package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
@@ -1,582 +0,0 @@
1
- import * as typeorm from 'typeorm';
2
- import { DataSource } from 'typeorm';
3
- import { E as EntityCrudAction, e as VendorScope, S as SessionUser } from './vendor-scope-DTYhJk_I.cjs';
4
-
5
- /** Social entry: use `iconUrl` for an image, or `icon` (emoji/text) as fallback when no image. */
6
- interface SocialLinkItem {
7
- url: string;
8
- iconUrl?: string;
9
- icon?: string;
10
- }
11
- interface CompanyDetails {
12
- logoUrl?: string;
13
- companyName?: string;
14
- supportEmail?: string;
15
- supportPhone?: string;
16
- socialLinks?: SocialLinkItem[];
17
- /** Shown below footer rows; from email plugin settings */
18
- footerDisclaimer?: string;
19
- /** Heading above social icons (default "Follow Us") */
20
- followUsTitle?: string;
21
- }
22
- /** One row in order-placed transactional emails */
23
- interface OrderPlacedLineItem {
24
- productName: string;
25
- quantity: number;
26
- unitPrice: number | string;
27
- lineTotal: number | string;
28
- sku?: string | null;
29
- tax?: number | string | null;
30
- hsn?: string | null;
31
- }
32
- /** Merge branding + email plugin settings for layout (email overrides when set). */
33
- declare function mergeEmailLayoutCompanyDetails(branding: Record<string, string>, emailSettings: Record<string, string>): CompanyDetails;
34
- interface EmailTemplateResult {
35
- subject: string;
36
- bodyHtml: string;
37
- text?: string;
38
- }
39
- type TemplateContext<T = unknown> = T & {
40
- companyDetails: CompanyDetails;
41
- };
42
- declare const EMAIL_TEMPLATE_NAMES: readonly ["signup", "passwordReset", "passwordChange", "orderPlaced", "returnInitiated", "shippingUpdate", "invite", "formSubmission", "otp", "chatLead"];
43
- type EmailTemplateName = (typeof EMAIL_TEMPLATE_NAMES)[number];
44
- declare function getCompanyDetailsFromSettings(settingsGroup: Record<string, string>): CompanyDetails;
45
-
46
- /**
47
- * Storage plugin contract: upload a file and return its public URL.
48
- */
49
- interface StorageService {
50
- upload(buffer: Buffer, key: string, contentType: string): Promise<string>;
51
- }
52
-
53
- type EntityMap = Record<string, typeorm.EntityTarget<typeorm.ObjectLiteral>>;
54
- interface CrudHandlerOptions {
55
- requireAuth: (req: Request) => Promise<Response | null>;
56
- json: (body: unknown, init?: {
57
- status?: number;
58
- }) => Response;
59
- requireEntityPermission?: (req: Request, entity: string, action: EntityCrudAction) => Promise<Response | null>;
60
- /** When set, contact create/update enqueues ERP `create-contact` (non-fatal). */
61
- getCms?: () => Promise<{
62
- getPlugin: (name: string) => unknown;
63
- }>;
64
- /** When set, soft-delete sets `deletedBy` from the current admin user. */
65
- getDeletedByUserId?: (req: Request) => Promise<number | null>;
66
- /** When set, store rows are filtered by session vendor (platform admin bypasses). */
67
- getVendorScope?: () => Promise<VendorScope>;
68
- }
69
- declare function createCrudHandler(dataSource: DataSource, entityMap: EntityMap, options: CrudHandlerOptions): {
70
- GET(req: Request, resource: string): Promise<Response>;
71
- POST(req: Request, resource: string): Promise<Response>;
72
- GET_METADATA(req: Request, resource: string): Promise<Response>;
73
- BULK_POST(req: Request, resource: string): Promise<Response>;
74
- GET_EXPORT(req: Request, resource: string): Promise<Response>;
75
- };
76
- declare function createCrudByIdHandler(dataSource: DataSource, entityMap: EntityMap, options: CrudHandlerOptions): {
77
- GET(req: Request, resource: string, id: string): Promise<Response>;
78
- PUT(req: Request, resource: string, id: string): Promise<Response>;
79
- DELETE(req: Request, resource: string, id: string): Promise<Response>;
80
- };
81
-
82
- /**
83
- * Auth API handler factories. Inject dataSource + entityMap, sendEmail, hash/compare; optional hooks to customize.
84
- */
85
-
86
- interface AuthHandlersConfig {
87
- json: (body: unknown, init?: {
88
- status?: number;
89
- }) => Response;
90
- baseUrl: string;
91
- hashPassword: (plain: string) => Promise<string>;
92
- comparePassword: (plain: string, hash: string) => Promise<boolean>;
93
- }
94
- interface ForgotPasswordConfig extends AuthHandlersConfig {
95
- dataSource: DataSource;
96
- entityMap: EntityMap;
97
- sendEmail?: (opts: {
98
- to: string;
99
- subject: string;
100
- html: string;
101
- text?: string;
102
- /** Plain reset URL for templated emails (preferred over parsing html). */
103
- resetLink?: string;
104
- }) => Promise<void>;
105
- resetExpiryHours?: number;
106
- afterCreateToken?: (email: string, resetLink: string) => Promise<void>;
107
- }
108
- declare function createForgotPasswordHandler(config: ForgotPasswordConfig): (request: Request) => Promise<Response>;
109
- interface SetPasswordConfig extends AuthHandlersConfig {
110
- dataSource: DataSource;
111
- entityMap: EntityMap;
112
- minPasswordLength?: number;
113
- beforeUpdate?: (email: string, userId: number) => Promise<void>;
114
- }
115
- declare function createSetPasswordHandler(config: SetPasswordConfig): (request: Request) => Promise<Response>;
116
- interface InviteAcceptConfig extends AuthHandlersConfig {
117
- dataSource: DataSource;
118
- entityMap: EntityMap;
119
- beforeActivate?: (email: string, userId: number) => Promise<void>;
120
- }
121
- /** Decode invite token (base64 email) and set password + unblock user */
122
- declare function createInviteAcceptHandler(config: InviteAcceptConfig): (request: Request) => Promise<Response>;
123
- interface ChangePasswordConfig extends AuthHandlersConfig {
124
- dataSource: DataSource;
125
- entityMap: EntityMap;
126
- getSession: () => Promise<{
127
- user?: {
128
- email?: string | null;
129
- };
130
- } | null>;
131
- minPasswordLength?: number;
132
- beforeUpdate?: (email: string) => Promise<void>;
133
- }
134
- declare function createChangePasswordHandler(config: ChangePasswordConfig): (request: Request) => Promise<Response>;
135
- interface UserAuthApiConfig extends ForgotPasswordConfig, Omit<SetPasswordConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword'>, Omit<InviteAcceptConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword'>, Omit<ChangePasswordConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword' | 'beforeUpdate' | 'getSession'> {
136
- getSession?: () => Promise<{
137
- user?: {
138
- email?: string | null;
139
- };
140
- } | null>;
141
- beforeChangePasswordUpdate?: (email: string) => Promise<void>;
142
- }
143
- /**
144
- * Single router for all user-auth APIs. Mount in the app once.
145
- * Use when you have no users/[id] route (else Next.js gives [id] precedence and "forgot-password" would match as id).
146
- * Path is the segment after the mount (e.g. "forgot-password"). Returns 404 for unknown paths.
147
- */
148
- declare function createUserAuthApiRouter(config: UserAuthApiConfig): {
149
- POST(req: Request, pathname: string): Promise<Response>;
150
- };
151
-
152
- /**
153
- * CMS API handlers: dashboard, analytics, upload, blog/form by slug, users (list/create/get/update/delete/regenerate-invite/avatar/profile).
154
- * All accept injectable deps; upload supports S3 or local.
155
- */
156
-
157
- type RequireEntityPermissionFn = (req: Request, entity: string, action: EntityCrudAction) => Promise<Response | null>;
158
- /**
159
- * Optional JSON in `LlmAgent.validationRules`. Used for programmatic checks before the LLM call.
160
- * For natural-language output rules, use `guardrails` / `outputRules` / `outputInstructions` (merged into system prompt).
161
- */
162
- type LlmAgentValidationRulesJson = {
163
- maxUserChars?: number;
164
- maxMessageLength?: number;
165
- minUserChars?: number;
166
- minMessageLength?: number;
167
- blockedSubstrings?: string[];
168
- /** Shown to the model as output guardrails (first non-empty of guardrails | outputRules | outputInstructions wins). */
169
- guardrails?: string;
170
- outputRules?: string;
171
- outputInstructions?: string;
172
- };
173
- type ParsedLlmAgentValidation = {
174
- /** Subset used for length / substring checks only. */
175
- structured: Pick<LlmAgentValidationRulesJson, 'maxUserChars' | 'maxMessageLength' | 'minUserChars' | 'minMessageLength' | 'blockedSubstrings'>;
176
- /** Appended to system prompt so the model follows output guardrails. */
177
- guardrailsForPrompt: string | null;
178
- };
179
- /**
180
- * - Valid JSON object: structural keys → validation; `guardrails` / `outputRules` / `outputInstructions` → prompt suffix.
181
- * - Not JSON: entire string is treated as prose guardrails for the prompt (no programmatic rules unless you use JSON).
182
- */
183
- declare function parseLlmAgentValidationRules(validationRulesText: string | null | undefined): ParsedLlmAgentValidation;
184
- declare function validateUserMessageAgainstStructuredRules(message: string, structured: ParsedLlmAgentValidation['structured']): {
185
- ok: true;
186
- } | {
187
- ok: false;
188
- error: string;
189
- };
190
- /** Parses `validationRules` then runs programmatic checks only. */
191
- declare function validateUserMessageAgainstAgentRules(message: string, validationRulesText: string | null | undefined): {
192
- ok: true;
193
- } | {
194
- ok: false;
195
- error: string;
196
- };
197
- /** Merges guardrails prose into the system instruction sent to the model. */
198
- declare function mergeGuardrailsIntoSystemPrompt(baseSystem: string | undefined, guardrailsForPrompt: string | null): string;
199
- interface CmsHandlersBase {
200
- json: (body: unknown, init?: {
201
- status?: number;
202
- }) => Response;
203
- requireAuth: (req: Request) => Promise<Response | null>;
204
- requireEntityPermission?: RequireEntityPermissionFn;
205
- }
206
- interface DashboardStatsConfig extends CmsHandlersBase {
207
- dataSource: DataSource;
208
- entityMap: EntityMap;
209
- requirePermission?: (req: Request, permission: string) => Promise<Response | null>;
210
- }
211
- declare function createDashboardStatsHandler(config: DashboardStatsConfig): (req: Request) => Promise<Response>;
212
- interface EcommerceAnalyticsConfig extends CmsHandlersBase {
213
- dataSource: DataSource;
214
- entityMap: EntityMap;
215
- }
216
- declare function createEcommerceAnalyticsHandler(config: EcommerceAnalyticsConfig): (req: Request) => Promise<Response>;
217
- interface AnalyticsHandlerConfig extends CmsHandlersBase {
218
- getAnalyticsData?: (days: number) => Promise<unknown>;
219
- getPropertyId?: () => ({
220
- currentViewId?: string;
221
- [k: string]: unknown;
222
- });
223
- getPermissions?: () => ({
224
- serviceAccountEmail?: string;
225
- currentViewId?: string;
226
- [k: string]: unknown;
227
- });
228
- }
229
- declare function createAnalyticsHandlers(config: AnalyticsHandlerConfig): {
230
- GET(req: Request): Promise<Response>;
231
- propertyId: () => Promise<Response>;
232
- permissions: () => Promise<Response>;
233
- };
234
-
235
- interface UploadHandlerConfig extends CmsHandlersBase {
236
- /** Storage plugin instance or getter (e.g. () => getCms().then(c => c.getPlugin('storage'))). If not set, uses local fallback. */
237
- storage?: StorageService | (() => StorageService | undefined) | (() => Promise<StorageService | undefined>);
238
- /** Fallback when storage not set: dir relative to cwd (e.g. "public/uploads") */
239
- localUploadDir?: string;
240
- allowedTypes?: string[];
241
- maxSizeBytes?: number;
242
- /** Resolve folder chain for `parentId` (merged from createCmsApiHandler when omitted). */
243
- dataSource?: DataSource;
244
- entityMap?: EntityMap;
245
- }
246
- declare function createUploadHandler(config: UploadHandlerConfig): (req: Request) => Promise<Response>;
247
- /** POST /api/media/extract/:id — expand a zip media row into folders/files under the zip’s parent folder. */
248
- declare function createMediaZipExtractHandler(config: UploadHandlerConfig): (_req: Request, zipMediaId: string) => Promise<Response>;
249
- interface BlogBySlugConfig extends CmsHandlersBase {
250
- dataSource: DataSource;
251
- entityMap: EntityMap;
252
- }
253
- declare function createBlogBySlugHandler(config: BlogBySlugConfig): (_req: Request, slug: string) => Promise<Response>;
254
- interface FormBySlugConfig extends CmsHandlersBase {
255
- dataSource: DataSource;
256
- entityMap: EntityMap;
257
- }
258
- declare function createFormBySlugHandler(config: FormBySlugConfig): (_req: Request, slug: string) => Promise<Response>;
259
- interface FormSaveHandlersConfig extends CmsHandlersBase {
260
- dataSource: DataSource;
261
- entityMap: EntityMap;
262
- }
263
- interface FormSubmissionHandlerConfig {
264
- dataSource: DataSource;
265
- entityMap: EntityMap;
266
- json: (body: unknown, init?: {
267
- status?: number;
268
- }) => Response;
269
- /** When set, form submission notification email is queued (CRM recipient). */
270
- getCms?: () => Promise<{
271
- getPlugin: (name: string) => unknown;
272
- }>;
273
- getCompanyDetails?: () => Promise<CompanyDetails>;
274
- getRecipientForChannel?: (channel: 'crm' | 'sales' | 'fulfilment') => Promise<string | null>;
275
- }
276
- interface FormSubmissionGetByIdConfig extends CmsHandlersBase {
277
- dataSource: DataSource;
278
- entityMap: EntityMap;
279
- json: (body: unknown, init?: {
280
- status?: number;
281
- }) => Response;
282
- }
283
- interface UsersApiConfig extends CmsHandlersBase {
284
- dataSource: DataSource;
285
- entityMap: EntityMap;
286
- baseUrl: string;
287
- /** When set with email queue/plugin, invite emails are sent on user create and regenerate-invite. */
288
- getCms?: () => Promise<{
289
- getPlugin: (name: string) => unknown;
290
- }>;
291
- getCompanyDetails?: () => Promise<CompanyDetails>;
292
- /** When set, soft-delete sets `deletedBy` on the user row. */
293
- getSessionUser?: () => Promise<SessionUser | null>;
294
- }
295
- declare function createUsersApiHandlers(config: UsersApiConfig): {
296
- list(req: Request): Promise<Response>;
297
- create(req: Request): Promise<Response>;
298
- getById(_req: Request, id: string): Promise<Response>;
299
- update(req: Request, id: string): Promise<Response>;
300
- delete(_req: Request, id: string): Promise<Response>;
301
- regenerateInvite(_req: Request, id: string): Promise<Response>;
302
- };
303
- interface UserAvatarConfig extends CmsHandlersBase {
304
- getSession: () => Promise<{
305
- user?: {
306
- email?: string | null;
307
- };
308
- } | null>;
309
- /** Save avatar (buffer, fileName) => publicUrl. Default: local public/uploads/avatars */
310
- saveAvatar?: (buffer: Buffer, fileName: string) => Promise<string>;
311
- }
312
- declare function createUserAvatarHandler(config: UserAvatarConfig): (req: Request) => Promise<Response>;
313
- interface UserProfileConfig extends CmsHandlersBase {
314
- dataSource: DataSource;
315
- entityMap: EntityMap;
316
- getSession: () => Promise<{
317
- user?: {
318
- id?: string;
319
- email?: string | null;
320
- name?: string | null;
321
- };
322
- } | null>;
323
- /** Optional hook after a successful profile PUT (e.g. audit logging). */
324
- onProfileUpdated?: (req: Request, user: {
325
- id: number;
326
- name: string;
327
- email: string;
328
- phone: string | null;
329
- }) => Promise<void>;
330
- }
331
- /**
332
- * GET / PUT handlers for `/api/users/profile` (current session user).
333
- * GET merges DB fields with the session; PUT updates the user row and callers should refresh the client session (e.g. `useSession().update()`).
334
- */
335
- declare function createUserProfileHandler(config: UserProfileConfig): {
336
- GET(_req: Request): Promise<Response>;
337
- PUT(req: Request): Promise<Response>;
338
- };
339
- interface SettingsApiConfig extends CmsHandlersBase {
340
- dataSource: DataSource;
341
- entityMap: EntityMap;
342
- encryptionKey?: string;
343
- /** Groups in this list are readable without auth (GET returns all keys for the group). */
344
- publicGetGroups?: string[];
345
- }
346
- declare function simpleEncrypt(text: string, key: string): string;
347
- declare function simpleDecrypt(encoded: string, key: string): string;
348
- /**
349
- * Structural types so apps with their own `typeorm` install (e.g. npm link) typecheck without duplicate-package errors.
350
- */
351
- type GetPublicSettingsGroupDataSource = {
352
- getRepository(entity: unknown): {
353
- find(options: object): Promise<unknown[]>;
354
- };
355
- };
356
- interface GetPublicSettingsGroupConfig {
357
- dataSource: GetPublicSettingsGroupDataSource;
358
- entityMap: Record<string, unknown>;
359
- encryptionKey?: string;
360
- }
361
- /** Same rows as unauthenticated GET /api/settings/:group when the group is in publicGetGroups. */
362
- declare function getPublicSettingsGroup(config: GetPublicSettingsGroupConfig, group: string): Promise<Record<string, string>>;
363
- declare function createSettingsApiHandlers(config: SettingsApiConfig): {
364
- GET(req: Request, group: string): Promise<Response>;
365
- PUT(req: Request, group: string): Promise<Response>;
366
- };
367
- interface ChatApiConfig extends CmsHandlersBase {
368
- dataSource: DataSource;
369
- entityMap: EntityMap;
370
- getCms: () => Promise<{
371
- getPlugin: (name: string) => unknown;
372
- }>;
373
- }
374
- /** Safe subset of `llm` settings for the storefront chat widget (`GET /api/chat/config`). */
375
- interface ChatPublicConfig {
376
- enabled: boolean;
377
- chatMode: 'whatsapp' | 'external' | 'llm';
378
- /** When `chatMode === 'llm'`, slug of the chatbot-scoped agent (`llm_agents.scope = chatbot`). */
379
- agentSlug: string;
380
- botName: string;
381
- icon: string;
382
- iconImageUrl: string;
383
- iconBackgroundColor: string;
384
- headerColor: string;
385
- whatsappPhone: string;
386
- }
387
-
388
- /**
389
- * Admin API: attach knowledge base documents to an LLM agent, ingest text into chunks + embeddings.
390
- * Routes: GET/POST /api/llm_agents/:slug/knowledge, DELETE /api/llm_agents/:slug/knowledge/:documentId
391
- *
392
- * Pipeline logs (grep `[llm-agent-knowledge] pipeline`):
393
- * - 01_request — incoming POST, content-type preview
394
- * - 02_agent_loaded — agent id for slug
395
- * - 03_body_parsed — JSON vs multipart, sizes / documentId
396
- * - 04_* — file decode or PDF extract (multipart)
397
- * - 05_branch — link_existing_document | new_upload_ingest
398
- * - 06_* — KB row + junction (link create / exists)
399
- * - 06b_chunks_existing_count — link path: existing chunk rows
400
- * - 06_knowledge_document_saved — new ingest: document row id
401
- * - 07_chunk_split — split stats
402
- * - 07b_chunks_persisted — chunk rows saved
403
- * - 07_query_chunks_missing_embedding — link path: rows with NULL embedding
404
- * - 08_* — resolve LLM plugin, embed availability or skip
405
- * - 09_embedding_workers_start / 10_embedding_workers_finished — concurrent embed+DB update
406
- * - 11_response — final outcome summary
407
- * - 99_pipeline_error — uncaught exception
408
- */
409
-
410
- interface LlmAgentKnowledgeApiConfig {
411
- dataSource: DataSource;
412
- entityMap: EntityMap;
413
- getCms: () => Promise<{
414
- getPlugin: (name: string) => unknown;
415
- }>;
416
- json: (body: unknown, init?: {
417
- status?: number;
418
- }) => Response;
419
- requireAuth: (req: Request) => Promise<Response | null>;
420
- requireEntityPermission?: RequireEntityPermissionFn;
421
- }
422
- declare function createLlmAgentKnowledgeHandlers(config: LlmAgentKnowledgeApiConfig): {
423
- list(req: Request, slug: string): Promise<Response>;
424
- post(req: Request, slug: string): Promise<Response>;
425
- unlink(req: Request, slug: string, documentIdStr: string): Promise<Response>;
426
- } | null;
427
-
428
- /**
429
- * Single CMS API handler: dashboard, analytics, upload, media zip extract, blog/form by slug, users API, user auth, CRUD. Mount once (e.g. app/api/[[...path]]/route.ts).
430
- */
431
-
432
- /** CMS instance with getPlugin; when provided, analytics and userAuth.sendEmail can be resolved from plugins when not passed. */
433
- type CmsGetter = () => Promise<{
434
- getPlugin: (name: string) => unknown;
435
- }>;
436
- interface CmsApiHandlerConfig {
437
- dataSource: DataSource;
438
- entityMap: EntityMap;
439
- requireAuth: (req: Request) => Promise<Response | null>;
440
- json: (body: unknown, init?: {
441
- status?: number;
442
- }) => Response;
443
- pathToModel?: (segment: string) => string;
444
- crudResources?: string[];
445
- /** When set, analytics and userAuth.sendEmail can be derived from getPlugin('analytics') and getPlugin('email') when not provided. */
446
- getCms?: CmsGetter;
447
- /** Optional: used when deriving userAuth.sendEmail to pass company details into email templates (e.g. from settings). */
448
- getCompanyDetails?: () => Promise<CompanyDetails>;
449
- /** Optional: used for form submission and other channel-based email recipients (from settings group "email"). */
450
- getRecipientForChannel?: (channel: 'crm' | 'sales' | 'fulfilment') => Promise<string | null>;
451
- userAuth?: UserAuthApiConfig;
452
- /** GET /api/dashboard/stats */
453
- dashboard?: DashboardStatsConfig;
454
- /** GET /api/dashboard/ecommerce */
455
- ecommerceAnalytics?: EcommerceAnalyticsConfig;
456
- /** GET /api/analytics. If omitted and getCms is set, uses getCms().getPlugin('analytics'). */
457
- analytics?: AnalyticsHandlerConfig;
458
- /** POST /api/upload (S3 or local) */
459
- upload?: UploadHandlerConfig;
460
- /** GET /api/blogs/slug/:slug (public) */
461
- blogBySlug?: BlogBySlugConfig;
462
- /** GET /api/forms/slug/:slug (public) */
463
- formBySlug?: FormBySlugConfig;
464
- /** POST/PUT /api/forms (save form + fields; when set, overrides CRUD for forms) */
465
- formSave?: FormSaveHandlersConfig;
466
- /** POST /api/form-submissions (public, no auth) */
467
- formSubmission?: FormSubmissionHandlerConfig;
468
- /** GET /api/form-submissions/:id (auth) with form + contact relations */
469
- formSubmissionGetById?: FormSubmissionGetByIdConfig;
470
- /** GET/POST /api/users, GET/PUT/DELETE /api/users/:id, POST /api/users/:id/regenerate-invite */
471
- usersApi?: UsersApiConfig;
472
- /** POST /api/users/avatar */
473
- userAvatar?: UserAvatarConfig;
474
- /** GET/PUT /api/users/profile (current session user) */
475
- userProfile?: UserProfileConfig;
476
- /** GET/PUT /api/settings/:group */
477
- settings?: SettingsApiConfig;
478
- /** GET /api/chat/config (public); POST /api/chat/identify; GET /api/chat/conversations/:id/messages; POST /api/chat/messages */
479
- chat?: ChatApiConfig;
480
- /**
481
- * GET/POST /api/llm_agents/:slug/knowledge; DELETE …/knowledge/:documentId — agent KB ingest + links.
482
- * When omitted but `chat` is set, the same dataSource / entityMap / getCms / json / requireAuth are reused automatically.
483
- */
484
- llmAgentKnowledge?: LlmAgentKnowledgeApiConfig;
485
- /**
486
- * Entity-level RBAC (session `entityPerms` / Administrator). When omitted, admin routes that need it respond with 403
487
- * (`entity_rbac_required`) so CRUD cannot run as auth-only. Pass `createAuthHelpers(...).requireEntityPermission` from the app.
488
- */
489
- requireEntityPermission?: (req: Request, entity: string, action: EntityCrudAction) => Promise<Response | null>;
490
- /** Required for vendor store RBAC + scoping. Alias: `getAuthenticatedUser`. */
491
- getSessionUser?: () => Promise<SessionUser | null>;
492
- /** Same as `getSessionUser` (from `createAuthHelpers().getAuthenticatedUser`). */
493
- getAuthenticatedUser?: () => Promise<SessionUser | null>;
494
- }
495
- declare function createCmsApiHandler(config: CmsApiHandlerConfig): {
496
- handle(method: string, pathInput: string[], req: Request): Promise<Response>;
497
- };
498
-
499
- interface JobScheduleApiConfig {
500
- dataSource: DataSource;
501
- entityMap: EntityMap;
502
- json: (body: unknown, init?: ResponseInit) => Response;
503
- requireAuth: (req: Request) => Promise<Response | null>;
504
- requireEntityPermission?: (req: Request, entity: string, action: 'read' | 'create' | 'update' | 'delete') => Promise<Response | null>;
505
- getCms?: CmsGetter;
506
- config?: Record<string, string>;
507
- }
508
- declare function createJobScheduleHandlers(apiConfig: JobScheduleApiConfig): {
509
- list(req: Request): Promise<Response>;
510
- getById(req: Request, id: string): Promise<Response>;
511
- create(req: Request): Promise<Response>;
512
- update(req: Request, id: string): Promise<Response>;
513
- remove(req: Request, id: string): Promise<Response>;
514
- runNow(req: Request, id: string): Promise<Response>;
515
- listRuns(req: Request, id: string): Promise<Response>;
516
- };
517
-
518
- type VendorOwnerActivation = 'invite' | 'password';
519
- interface VendorOnboardHandlersConfig {
520
- dataSource: DataSource;
521
- entityMap: EntityMap;
522
- json: (body: unknown, init?: {
523
- status?: number;
524
- }) => Response;
525
- getSessionUser: () => Promise<SessionUser | null>;
526
- baseUrl: string;
527
- getCms?: () => Promise<{
528
- getPlugin: (name: string) => unknown;
529
- }>;
530
- getCompanyDetails?: () => Promise<CompanyDetails>;
531
- hashPassword?: (plain: string) => Promise<string>;
532
- minPasswordLength?: number;
533
- }
534
- declare function createVendorOnboardHandlers(config: VendorOnboardHandlersConfig): {
535
- /** POST /api/admin/vendors/onboard — create vendor + owner user + vendor_users + invite */
536
- onboard(req: Request): Promise<Response>;
537
- /** POST /api/admin/vendor/switch — set active vendor in session (JWT update via client) */
538
- switchVendor(req: Request): Promise<Response>;
539
- /** GET /api/admin/vendor/team */
540
- listTeam(): Promise<Response>;
541
- /** POST /api/admin/vendor/team — add staff to vendor */
542
- addTeamMember(req: Request): Promise<Response>;
543
- /** DELETE /api/admin/vendor/team/:userId */
544
- removeTeamMember(_req: Request, userIdStr: string): Promise<Response>;
545
- };
546
-
547
- interface StorefrontOtpFlags {
548
- login?: boolean;
549
- verifyEmail?: boolean;
550
- verifyPhone?: boolean;
551
- }
552
- interface StorefrontApiConfig {
553
- dataSource: DataSource;
554
- entityMap: EntityMap;
555
- json: (body: unknown, init?: {
556
- status?: number;
557
- headers?: HeadersInit;
558
- }) => Response;
559
- getSessionUser: () => Promise<SessionUser | null>;
560
- guestCookieName?: string;
561
- /** Required for POST storefront/register */
562
- hashPassword?: (plain: string) => Promise<string>;
563
- /** When set, new registrations are blocked until email is verified and a signup email is sent. */
564
- getCms?: () => Promise<{
565
- getPlugin: (name: string) => unknown;
566
- }>;
567
- getCompanyDetails?: () => Promise<CompanyDetails>;
568
- /** Origin for verify links (e.g. process.env.NEXTAUTH_URL). Required with getCms for verification URLs. */
569
- publicSiteUrl?: string;
570
- /** When a flag is true, the corresponding OTP storefront route is enabled. */
571
- otpFlags?: StorefrontOtpFlags;
572
- /** Defaults to OTP_PEPPER or NEXTAUTH_SECRET. */
573
- otpPepper?: string;
574
- defaultPhoneCountryCode?: string;
575
- /** When false, login OTP send accepts email only (no phone). Default true. */
576
- otpAllowPhoneLogin?: boolean;
577
- }
578
- declare function createStorefrontApiHandler(config: StorefrontApiConfig): {
579
- handle(method: string, path: string[], req: Request): Promise<Response>;
580
- };
581
-
582
- export { createSettingsApiHandlers as $, type AnalyticsHandlerConfig as A, type BlogBySlugConfig as B, type ChangePasswordConfig as C, type DashboardStatsConfig as D, type EcommerceAnalyticsConfig as E, type ForgotPasswordConfig as F, type GetPublicSettingsGroupConfig as G, createCrudByIdHandler as H, type InviteAcceptConfig as I, type JobScheduleApiConfig as J, createCrudHandler as K, type LlmAgentKnowledgeApiConfig as L, createDashboardStatsHandler as M, createEcommerceAnalyticsHandler as N, type OrderPlacedLineItem as O, type ParsedLlmAgentValidation as P, createForgotPasswordHandler as Q, createFormBySlugHandler as R, type SetPasswordConfig as S, type TemplateContext as T, type UploadHandlerConfig as U, type VendorOnboardHandlersConfig as V, createInviteAcceptHandler as W, createJobScheduleHandlers as X, createLlmAgentKnowledgeHandlers as Y, createMediaZipExtractHandler as Z, createSetPasswordHandler as _, type AuthHandlersConfig as a, createStorefrontApiHandler as a0, createUploadHandler as a1, createUserAuthApiRouter as a2, createUserAvatarHandler as a3, createUserProfileHandler as a4, createUsersApiHandlers as a5, createVendorOnboardHandlers as a6, getCompanyDetailsFromSettings as a7, getPublicSettingsGroup as a8, mergeEmailLayoutCompanyDetails as a9, mergeGuardrailsIntoSystemPrompt as aa, parseLlmAgentValidationRules as ab, simpleDecrypt as ac, simpleEncrypt as ad, validateUserMessageAgainstAgentRules as ae, validateUserMessageAgainstStructuredRules as af, type ChatPublicConfig as b, type CmsApiHandlerConfig as c, type CmsGetter as d, type CompanyDetails as e, type CrudHandlerOptions as f, type EmailTemplateName as g, type EmailTemplateResult as h, type EntityMap as i, type FormBySlugConfig as j, type GetPublicSettingsGroupDataSource as k, type LlmAgentValidationRulesJson as l, type SettingsApiConfig as m, type SocialLinkItem as n, type StorageService as o, type StorefrontApiConfig as p, type StorefrontOtpFlags as q, type UserAuthApiConfig as r, type UserAvatarConfig as s, type UserProfileConfig as t, type UsersApiConfig as u, type VendorOwnerActivation as v, createAnalyticsHandlers as w, createBlogBySlugHandler as x, createChangePasswordHandler as y, createCmsApiHandler as z };