@open-mercato/shared 0.4.2-canary-c02407ff85

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 (324) hide show
  1. package/build.mjs +101 -0
  2. package/dist/index.js +1 -0
  3. package/dist/index.js.map +7 -0
  4. package/dist/lib/api/crud.js +47 -0
  5. package/dist/lib/api/crud.js.map +7 -0
  6. package/dist/lib/api/scoped.js +140 -0
  7. package/dist/lib/api/scoped.js.map +7 -0
  8. package/dist/lib/auth/jwt.js +34 -0
  9. package/dist/lib/auth/jwt.js.map +7 -0
  10. package/dist/lib/auth/server.js +157 -0
  11. package/dist/lib/auth/server.js.map +7 -0
  12. package/dist/lib/boolean.js +22 -0
  13. package/dist/lib/boolean.js.map +7 -0
  14. package/dist/lib/bootstrap/appResolver.js +43 -0
  15. package/dist/lib/bootstrap/appResolver.js.map +7 -0
  16. package/dist/lib/bootstrap/dynamicLoader.js +108 -0
  17. package/dist/lib/bootstrap/dynamicLoader.js.map +7 -0
  18. package/dist/lib/bootstrap/factory.js +59 -0
  19. package/dist/lib/bootstrap/factory.js.map +7 -0
  20. package/dist/lib/bootstrap/index.js +11 -0
  21. package/dist/lib/bootstrap/index.js.map +7 -0
  22. package/dist/lib/bootstrap/types.js +1 -0
  23. package/dist/lib/bootstrap/types.js.map +7 -0
  24. package/dist/lib/cache/segments.js +36 -0
  25. package/dist/lib/cache/segments.js.map +7 -0
  26. package/dist/lib/cli/progress.js +46 -0
  27. package/dist/lib/cli/progress.js.map +7 -0
  28. package/dist/lib/commands/command-bus.js +285 -0
  29. package/dist/lib/commands/command-bus.js.map +7 -0
  30. package/dist/lib/commands/customFieldSnapshots.js +66 -0
  31. package/dist/lib/commands/customFieldSnapshots.js.map +7 -0
  32. package/dist/lib/commands/helpers.js +98 -0
  33. package/dist/lib/commands/helpers.js.map +7 -0
  34. package/dist/lib/commands/index.js +8 -0
  35. package/dist/lib/commands/index.js.map +7 -0
  36. package/dist/lib/commands/operationMetadata.js +32 -0
  37. package/dist/lib/commands/operationMetadata.js.map +7 -0
  38. package/dist/lib/commands/registry.js +43 -0
  39. package/dist/lib/commands/registry.js.map +7 -0
  40. package/dist/lib/commands/scope.js +44 -0
  41. package/dist/lib/commands/scope.js.map +7 -0
  42. package/dist/lib/commands/types.js +8 -0
  43. package/dist/lib/commands/types.js.map +7 -0
  44. package/dist/lib/crud/cache-stats.js +98 -0
  45. package/dist/lib/crud/cache-stats.js.map +7 -0
  46. package/dist/lib/crud/cache.js +175 -0
  47. package/dist/lib/crud/cache.js.map +7 -0
  48. package/dist/lib/crud/custom-fields-client.js +52 -0
  49. package/dist/lib/crud/custom-fields-client.js.map +7 -0
  50. package/dist/lib/crud/custom-fields.js +467 -0
  51. package/dist/lib/crud/custom-fields.js.map +7 -0
  52. package/dist/lib/crud/errors.js +24 -0
  53. package/dist/lib/crud/errors.js.map +7 -0
  54. package/dist/lib/crud/exporters.js +154 -0
  55. package/dist/lib/crud/exporters.js.map +7 -0
  56. package/dist/lib/crud/factory.js +1311 -0
  57. package/dist/lib/crud/factory.js.map +7 -0
  58. package/dist/lib/crud/types.js +1 -0
  59. package/dist/lib/crud/types.js.map +7 -0
  60. package/dist/lib/custom-fields/normalize.js +36 -0
  61. package/dist/lib/custom-fields/normalize.js.map +7 -0
  62. package/dist/lib/data/engine.js +396 -0
  63. package/dist/lib/data/engine.js.map +7 -0
  64. package/dist/lib/db/escapeLikePattern.js +5 -0
  65. package/dist/lib/db/escapeLikePattern.js.map +7 -0
  66. package/dist/lib/db/mikro.js +82 -0
  67. package/dist/lib/db/mikro.js.map +7 -0
  68. package/dist/lib/di/container.js +94 -0
  69. package/dist/lib/di/container.js.map +7 -0
  70. package/dist/lib/email/send.js +12 -0
  71. package/dist/lib/email/send.js.map +7 -0
  72. package/dist/lib/encryption/aes.js +58 -0
  73. package/dist/lib/encryption/aes.js.map +7 -0
  74. package/dist/lib/encryption/customFieldValues.js +49 -0
  75. package/dist/lib/encryption/customFieldValues.js.map +7 -0
  76. package/dist/lib/encryption/entityFields.js +26 -0
  77. package/dist/lib/encryption/entityFields.js.map +7 -0
  78. package/dist/lib/encryption/entityIds.js +80 -0
  79. package/dist/lib/encryption/entityIds.js.map +7 -0
  80. package/dist/lib/encryption/find.js +45 -0
  81. package/dist/lib/encryption/find.js.map +7 -0
  82. package/dist/lib/encryption/indexDoc.js +69 -0
  83. package/dist/lib/encryption/indexDoc.js.map +7 -0
  84. package/dist/lib/encryption/kms.js +282 -0
  85. package/dist/lib/encryption/kms.js.map +7 -0
  86. package/dist/lib/encryption/subscriber.js +330 -0
  87. package/dist/lib/encryption/subscriber.js.map +7 -0
  88. package/dist/lib/encryption/tenantDataEncryptionService.js +252 -0
  89. package/dist/lib/encryption/tenantDataEncryptionService.js.map +7 -0
  90. package/dist/lib/encryption/toggles.js +18 -0
  91. package/dist/lib/encryption/toggles.js.map +7 -0
  92. package/dist/lib/entities/naming.js +9 -0
  93. package/dist/lib/entities/naming.js.map +7 -0
  94. package/dist/lib/entities/system-entities.js +43 -0
  95. package/dist/lib/entities/system-entities.js.map +7 -0
  96. package/dist/lib/frontend/organizationEvents.js +41 -0
  97. package/dist/lib/frontend/organizationEvents.js.map +7 -0
  98. package/dist/lib/frontend/useOrganizationScope.js +32 -0
  99. package/dist/lib/frontend/useOrganizationScope.js.map +7 -0
  100. package/dist/lib/hotkeys/index.js +128 -0
  101. package/dist/lib/hotkeys/index.js.map +7 -0
  102. package/dist/lib/i18n/app-dictionaries.js +17 -0
  103. package/dist/lib/i18n/app-dictionaries.js.map +7 -0
  104. package/dist/lib/i18n/config.js +7 -0
  105. package/dist/lib/i18n/config.js.map +7 -0
  106. package/dist/lib/i18n/context.js +50 -0
  107. package/dist/lib/i18n/context.js.map +7 -0
  108. package/dist/lib/i18n/server.js +68 -0
  109. package/dist/lib/i18n/server.js.map +7 -0
  110. package/dist/lib/i18n/translate.js +45 -0
  111. package/dist/lib/i18n/translate.js.map +7 -0
  112. package/dist/lib/indexers/error-log.js +82 -0
  113. package/dist/lib/indexers/error-log.js.map +7 -0
  114. package/dist/lib/indexers/status-log.js +80 -0
  115. package/dist/lib/indexers/status-log.js.map +7 -0
  116. package/dist/lib/lib/auth/jwt.js +34 -0
  117. package/dist/lib/lib/auth/jwt.js.map +7 -0
  118. package/dist/lib/lib/auth/server.js +77 -0
  119. package/dist/lib/lib/auth/server.js.map +7 -0
  120. package/dist/lib/lib/email/send.js +12 -0
  121. package/dist/lib/lib/email/send.js.map +7 -0
  122. package/dist/lib/lib/i18n/config.js +7 -0
  123. package/dist/lib/lib/i18n/config.js.map +7 -0
  124. package/dist/lib/lib/i18n/context.js +31 -0
  125. package/dist/lib/lib/i18n/context.js.map +7 -0
  126. package/dist/lib/lib/utils.js +9 -0
  127. package/dist/lib/lib/utils.js.map +7 -0
  128. package/dist/lib/location/countries.js +68 -0
  129. package/dist/lib/location/countries.js.map +7 -0
  130. package/dist/lib/modules/index.js +6 -0
  131. package/dist/lib/modules/index.js.map +7 -0
  132. package/dist/lib/modules/registry.js +18 -0
  133. package/dist/lib/modules/registry.js.map +7 -0
  134. package/dist/lib/openapi/crud.js +137 -0
  135. package/dist/lib/openapi/crud.js.map +7 -0
  136. package/dist/lib/openapi/generator.js +1131 -0
  137. package/dist/lib/openapi/generator.js.map +7 -0
  138. package/dist/lib/openapi/index.js +10 -0
  139. package/dist/lib/openapi/index.js.map +7 -0
  140. package/dist/lib/openapi/sanitize.js +110 -0
  141. package/dist/lib/openapi/sanitize.js.map +7 -0
  142. package/dist/lib/openapi/types.js +1 -0
  143. package/dist/lib/openapi/types.js.map +7 -0
  144. package/dist/lib/profiler/index.js +258 -0
  145. package/dist/lib/profiler/index.js.map +7 -0
  146. package/dist/lib/query/engine.js +729 -0
  147. package/dist/lib/query/engine.js.map +7 -0
  148. package/dist/lib/query/join-utils.js +195 -0
  149. package/dist/lib/query/join-utils.js.map +7 -0
  150. package/dist/lib/query/types.js +9 -0
  151. package/dist/lib/query/types.js.map +7 -0
  152. package/dist/lib/search/config.js +32 -0
  153. package/dist/lib/search/config.js.map +7 -0
  154. package/dist/lib/search/tokenize.js +34 -0
  155. package/dist/lib/search/tokenize.js.map +7 -0
  156. package/dist/lib/slugify.js +24 -0
  157. package/dist/lib/slugify.js.map +7 -0
  158. package/dist/lib/testing/bootstrap.js +51 -0
  159. package/dist/lib/testing/bootstrap.js.map +7 -0
  160. package/dist/lib/testing/index.js +17 -0
  161. package/dist/lib/testing/index.js.map +7 -0
  162. package/dist/lib/testing/renderWithProviders.js +15 -0
  163. package/dist/lib/testing/renderWithProviders.js.map +7 -0
  164. package/dist/lib/url.js +12 -0
  165. package/dist/lib/url.js.map +7 -0
  166. package/dist/lib/utils.js +13 -0
  167. package/dist/lib/utils.js.map +7 -0
  168. package/dist/lib/version.js +7 -0
  169. package/dist/lib/version.js.map +7 -0
  170. package/dist/modules/dashboard/widgets.js +1 -0
  171. package/dist/modules/dashboard/widgets.js.map +7 -0
  172. package/dist/modules/dsl.js +30 -0
  173. package/dist/modules/dsl.js.map +7 -0
  174. package/dist/modules/entities/kinds.js +22 -0
  175. package/dist/modules/entities/kinds.js.map +7 -0
  176. package/dist/modules/entities/options.js +26 -0
  177. package/dist/modules/entities/options.js.map +7 -0
  178. package/dist/modules/entities/validation.js +102 -0
  179. package/dist/modules/entities/validation.js.map +7 -0
  180. package/dist/modules/entities/validators.js +88 -0
  181. package/dist/modules/entities/validators.js.map +7 -0
  182. package/dist/modules/entities.js +1 -0
  183. package/dist/modules/entities.js.map +7 -0
  184. package/dist/modules/navigation/sidebarPreferences.js +50 -0
  185. package/dist/modules/navigation/sidebarPreferences.js.map +7 -0
  186. package/dist/modules/perspectives/types.js +1 -0
  187. package/dist/modules/perspectives/types.js.map +7 -0
  188. package/dist/modules/registry.js +96 -0
  189. package/dist/modules/registry.js.map +7 -0
  190. package/dist/modules/search.js +15 -0
  191. package/dist/modules/search.js.map +7 -0
  192. package/dist/modules/vector.js +1 -0
  193. package/dist/modules/vector.js.map +7 -0
  194. package/dist/modules/widgets/injection-loader.js +180 -0
  195. package/dist/modules/widgets/injection-loader.js.map +7 -0
  196. package/dist/modules/widgets/injection.js +1 -0
  197. package/dist/modules/widgets/injection.js.map +7 -0
  198. package/dist/security/features.js +23 -0
  199. package/dist/security/features.js.map +7 -0
  200. package/dist/types/pg.d.js +1 -0
  201. package/dist/types/pg.d.js.map +7 -0
  202. package/dist/types/react-email.d.js +1 -0
  203. package/dist/types/react-email.d.js.map +7 -0
  204. package/dist/types/resend.d.js +1 -0
  205. package/dist/types/resend.d.js.map +7 -0
  206. package/jest.config.cjs +22 -0
  207. package/package.json +88 -0
  208. package/src/index.ts +0 -0
  209. package/src/lib/api/__tests__/scoped.test.ts +38 -0
  210. package/src/lib/api/crud.ts +59 -0
  211. package/src/lib/api/scoped.ts +239 -0
  212. package/src/lib/auth/jwt.ts +39 -0
  213. package/src/lib/auth/server.ts +199 -0
  214. package/src/lib/boolean.ts +17 -0
  215. package/src/lib/bootstrap/appResolver.ts +85 -0
  216. package/src/lib/bootstrap/dynamicLoader.ts +177 -0
  217. package/src/lib/bootstrap/factory.ts +108 -0
  218. package/src/lib/bootstrap/index.ts +23 -0
  219. package/src/lib/bootstrap/types.ts +31 -0
  220. package/src/lib/cache/segments.ts +56 -0
  221. package/src/lib/cli/progress.ts +55 -0
  222. package/src/lib/commands/__tests__/command-bus.test.ts +84 -0
  223. package/src/lib/commands/__tests__/helpers.test.ts +42 -0
  224. package/src/lib/commands/command-bus.ts +349 -0
  225. package/src/lib/commands/customFieldSnapshots.ts +86 -0
  226. package/src/lib/commands/helpers.ts +143 -0
  227. package/src/lib/commands/index.ts +4 -0
  228. package/src/lib/commands/operationMetadata.ts +40 -0
  229. package/src/lib/commands/registry.ts +46 -0
  230. package/src/lib/commands/scope.ts +59 -0
  231. package/src/lib/commands/types.ts +63 -0
  232. package/src/lib/crud/__tests__/crud-factory.test.ts +333 -0
  233. package/src/lib/crud/__tests__/custom-fields.test.ts +150 -0
  234. package/src/lib/crud/cache-stats.ts +127 -0
  235. package/src/lib/crud/cache.ts +205 -0
  236. package/src/lib/crud/custom-fields-client.ts +54 -0
  237. package/src/lib/crud/custom-fields.ts +607 -0
  238. package/src/lib/crud/errors.ts +23 -0
  239. package/src/lib/crud/exporters.ts +188 -0
  240. package/src/lib/crud/factory.ts +1622 -0
  241. package/src/lib/crud/types.ts +29 -0
  242. package/src/lib/custom-fields/normalize.ts +45 -0
  243. package/src/lib/data/engine.ts +562 -0
  244. package/src/lib/db/escapeLikePattern.ts +2 -0
  245. package/src/lib/db/mikro.ts +100 -0
  246. package/src/lib/di/container.ts +105 -0
  247. package/src/lib/email/send.ts +18 -0
  248. package/src/lib/encryption/__tests__/customFieldValues.test.ts +63 -0
  249. package/src/lib/encryption/__tests__/indexDoc.test.ts +115 -0
  250. package/src/lib/encryption/aes.ts +64 -0
  251. package/src/lib/encryption/customFieldValues.ts +67 -0
  252. package/src/lib/encryption/entityFields.ts +39 -0
  253. package/src/lib/encryption/entityIds.ts +107 -0
  254. package/src/lib/encryption/find.ts +81 -0
  255. package/src/lib/encryption/indexDoc.ts +104 -0
  256. package/src/lib/encryption/kms.ts +337 -0
  257. package/src/lib/encryption/subscriber.ts +416 -0
  258. package/src/lib/encryption/tenantDataEncryptionService.ts +313 -0
  259. package/src/lib/encryption/toggles.ts +15 -0
  260. package/src/lib/entities/naming.ts +6 -0
  261. package/src/lib/entities/system-entities.ts +43 -0
  262. package/src/lib/frontend/organizationEvents.ts +55 -0
  263. package/src/lib/frontend/useOrganizationScope.ts +30 -0
  264. package/src/lib/hotkeys/index.ts +168 -0
  265. package/src/lib/i18n/app-dictionaries.ts +18 -0
  266. package/src/lib/i18n/config.ts +4 -0
  267. package/src/lib/i18n/context.tsx +66 -0
  268. package/src/lib/i18n/server.ts +74 -0
  269. package/src/lib/i18n/translate.ts +54 -0
  270. package/src/lib/indexers/error-log.ts +106 -0
  271. package/src/lib/indexers/status-log.ts +119 -0
  272. package/src/lib/lib/auth/jwt.ts +39 -0
  273. package/src/lib/lib/auth/server.ts +94 -0
  274. package/src/lib/lib/email/send.ts +18 -0
  275. package/src/lib/lib/i18n/config.ts +4 -0
  276. package/src/lib/lib/i18n/context.tsx +38 -0
  277. package/src/lib/lib/utils.ts +6 -0
  278. package/src/lib/location/countries.ts +97 -0
  279. package/src/lib/modules/index.ts +1 -0
  280. package/src/lib/modules/registry.ts +18 -0
  281. package/src/lib/openapi/crud.ts +218 -0
  282. package/src/lib/openapi/generator.ts +1311 -0
  283. package/src/lib/openapi/index.ts +4 -0
  284. package/src/lib/openapi/sanitize.ts +137 -0
  285. package/src/lib/openapi/types.ts +79 -0
  286. package/src/lib/profiler/index.ts +371 -0
  287. package/src/lib/query/__tests__/engine.test.ts +274 -0
  288. package/src/lib/query/engine.ts +837 -0
  289. package/src/lib/query/join-utils.ts +238 -0
  290. package/src/lib/query/types.ts +121 -0
  291. package/src/lib/search/config.ts +49 -0
  292. package/src/lib/search/tokenize.ts +45 -0
  293. package/src/lib/slugify.ts +28 -0
  294. package/src/lib/testing/bootstrap.ts +124 -0
  295. package/src/lib/testing/index.ts +15 -0
  296. package/src/lib/testing/renderWithProviders.tsx +31 -0
  297. package/src/lib/url.ts +12 -0
  298. package/src/lib/utils.ts +17 -0
  299. package/src/lib/version.ts +5 -0
  300. package/src/modules/__tests__/dsl.test.ts +35 -0
  301. package/src/modules/__tests__/registry.test.ts +300 -0
  302. package/src/modules/dashboard/widgets.ts +57 -0
  303. package/src/modules/dsl.ts +32 -0
  304. package/src/modules/entities/__tests__/validation.test.ts +52 -0
  305. package/src/modules/entities/kinds.ts +20 -0
  306. package/src/modules/entities/options.ts +36 -0
  307. package/src/modules/entities/validation.ts +118 -0
  308. package/src/modules/entities/validators.ts +93 -0
  309. package/src/modules/entities.ts +102 -0
  310. package/src/modules/navigation/sidebarPreferences.ts +62 -0
  311. package/src/modules/perspectives/types.ts +40 -0
  312. package/src/modules/registry.ts +249 -0
  313. package/src/modules/search.ts +325 -0
  314. package/src/modules/vector.ts +122 -0
  315. package/src/modules/widgets/__tests__/injection.test.ts +48 -0
  316. package/src/modules/widgets/injection-loader.ts +235 -0
  317. package/src/modules/widgets/injection.ts +120 -0
  318. package/src/security/features.ts +22 -0
  319. package/src/types/pg.d.ts +2 -0
  320. package/src/types/react-email.d.ts +2 -0
  321. package/src/types/resend.d.ts +2 -0
  322. package/tsconfig.build.json +11 -0
  323. package/tsconfig.json +9 -0
  324. package/watch.mjs +6 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/crud/factory.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\nimport type { AwilixContainer } from 'awilix'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { buildScopedWhere } from '@open-mercato/shared/lib/api/crud'\nimport { getAuthFromCookies, getAuthFromRequest, type AuthContext } from '@open-mercato/shared/lib/auth/server'\nimport type { QueryEngine, Where, Sort, Page, QueryCustomFieldSource, QueryJoinEdge } from '@open-mercato/shared/lib/query/types'\nimport { SortDir } from '@open-mercato/shared/lib/query/types'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { resolveOrganizationScopeForRequest, type OrganizationScope } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { serializeOperationMetadata } from '@open-mercato/shared/lib/commands/operationMetadata'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport type {\n CrudEventAction,\n CrudEventsConfig,\n CrudIndexerConfig,\n CrudIdentifierResolver,\n} from './types'\nimport {\n extractCustomFieldValuesFromPayload,\n extractAllCustomFieldEntries,\n decorateRecordWithCustomFields,\n loadCustomFieldDefinitionIndex,\n} from './custom-fields'\nimport { serializeExport, normalizeExportFormat, defaultExportFilename, ensureColumns, type CrudExportFormat, type PreparedExport } from './exporters'\nimport { CrudHttpError } from './errors'\nimport type { CommandBus, CommandLogMetadata } from '@open-mercato/shared/lib/commands'\nimport type { EntityId } from '@open-mercato/shared/modules/entities'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport {\n buildCollectionTags,\n buildRecordTag,\n canonicalizeResourceTag,\n debugCrudCache,\n deriveResourceFromCommandId,\n expandResourceAliases,\n invalidateCrudCache,\n isCrudCacheDebugEnabled,\n isCrudCacheEnabled,\n normalizeIdentifierValue,\n normalizeTagSegment,\n resolveCrudCache,\n} from './cache'\nimport { deriveCrudSegmentTag } from './cache-stats'\nimport { createProfiler, shouldEnableProfiler, type Profiler } from '@open-mercato/shared/lib/profiler'\n\nexport type CrudHooks<TCreate, TUpdate, TList> = {\n beforeList?: (q: TList, ctx: CrudCtx) => Promise<void> | void\n afterList?: (res: any, ctx: CrudCtx & { query: TList }) => Promise<void> | void\n beforeCreate?: (input: TCreate, ctx: CrudCtx) => Promise<TCreate | void> | TCreate | void\n afterCreate?: (entity: any, ctx: CrudCtx & { input: TCreate }) => Promise<void> | void\n beforeUpdate?: (input: TUpdate, ctx: CrudCtx) => Promise<TUpdate | void> | TUpdate | void\n afterUpdate?: (entity: any, ctx: CrudCtx & { input: TUpdate }) => Promise<void> | void\n beforeDelete?: (id: string, ctx: CrudCtx) => Promise<void> | void\n afterDelete?: (id: string, ctx: CrudCtx) => Promise<void> | void\n}\n\nexport type CrudMetadata = {\n GET?: { requireAuth?: boolean; requireRoles?: string[]; requireFeatures?: string[] }\n POST?: { requireAuth?: boolean; requireRoles?: string[]; requireFeatures?: string[] }\n PUT?: { requireAuth?: boolean; requireRoles?: string[]; requireFeatures?: string[] }\n DELETE?: { requireAuth?: boolean; requireRoles?: string[]; requireFeatures?: string[] }\n}\n\nexport type OrmEntityConfig = {\n entity: any // MikroORM entity class\n idField?: string // default: 'id'\n orgField?: string | null // default: 'organizationId'; pass null to disable automatic org scoping\n tenantField?: string | null // default: 'tenantId'; pass null to disable automatic tenant scoping\n softDeleteField?: string | null // default: 'deletedAt'; pass null to disable implicit soft delete filter\n}\n\nexport type CustomFieldsConfig =\n | false\n | {\n enabled: true\n entityId: any // datamodel entity id, e.g. E.example.todo\n // If true, picks body keys starting with `cf_` and maps `cf_<name>` -> `<name>`\n pickPrefixed?: boolean\n // Optional custom mapper; if provided, used instead of pickPrefixed\n map?: (data: Record<string, any>) => Record<string, any>\n }\n\nexport type CrudListCustomFieldDecorator = {\n entityIds: EntityId | EntityId[]\n resolveContext?: (item: any, ctx: CrudCtx) => { organizationId?: string | null; tenantId?: string | null }\n}\n\nexport type ListConfig<TList> = {\n schema: z.ZodType<TList>\n // Optional: use the QueryEngine when entityId + fields are provided\n entityId?: any\n fields?: any[]\n sortFieldMap?: Record<string, any>\n buildFilters?: (query: TList, ctx: CrudCtx) => Where<any> | Promise<Where<any>>\n transformItem?: (item: any) => any\n allowCsv?: boolean\n csv?: {\n headers: string[]\n row: (item: any) => (string | number | boolean | null | undefined)[]\n filename?: string\n }\n export?: CrudExportOptions\n customFieldSources?: QueryCustomFieldSource[]\n joins?: QueryJoinEdge[]\n decorateCustomFields?: CrudListCustomFieldDecorator\n}\n\nexport type CrudExportColumnConfig = {\n field: string\n header?: string\n resolve?: (item: any) => unknown\n}\n\nexport type CrudExportOptions = {\n enabled?: boolean\n formats?: CrudExportFormat[]\n filename?: string | ((format: CrudExportFormat) => string)\n columns?: CrudExportColumnConfig[]\n batchSize?: number\n}\n\nconst DEFAULT_EXPORT_FORMATS: CrudExportFormat[] = ['csv', 'json', 'xml', 'markdown']\nconst DEFAULT_EXPORT_BATCH_SIZE = 1000\nconst MIN_EXPORT_BATCH_SIZE = 100\nconst MAX_EXPORT_BATCH_SIZE = 10000\n\ntype ColumnResolver = {\n field: string\n header: string\n resolve: (item: any) => unknown\n}\n\nfunction resolveAvailableExportFormats(list?: ListConfig<any>): CrudExportFormat[] {\n if (!list) return []\n if (list.export?.enabled === false) return []\n const formats = list.export?.formats && list.export.formats.length > 0\n ? [...list.export.formats]\n : [...DEFAULT_EXPORT_FORMATS]\n if (!list.export?.formats && list.allowCsv && !formats.includes('csv')) formats.push('csv')\n return Array.from(new Set(formats))\n}\n\nfunction resolveExportBatchSize(list: ListConfig<any> | undefined, requestedPageSize: number): number {\n const fallback = Math.max(requestedPageSize, DEFAULT_EXPORT_BATCH_SIZE)\n const raw = list?.export?.batchSize ?? fallback\n return Math.min(Math.max(raw, MIN_EXPORT_BATCH_SIZE), MAX_EXPORT_BATCH_SIZE)\n}\n\nfunction sanitizeFieldName(base: string, used: Set<string>, fallbackIndex: number): string {\n const trimmed = base.trim()\n const sanitized = trimmed.replace(/[^a-zA-Z0-9_\\-]/g, '_') || `field_${fallbackIndex}`\n const normalized = /^[A-Za-z_]/.test(sanitized) ? sanitized : `f_${sanitized}`\n let candidate = normalized\n let counter = 1\n while (used.has(candidate)) {\n candidate = `${normalized}_${counter++}`\n }\n used.add(candidate)\n return candidate\n}\n\nfunction buildExportFromColumns(items: any[], columnsConfig: CrudExportColumnConfig[]): PreparedExport {\n const used = new Set<string>()\n const columns: ColumnResolver[] = columnsConfig.map((col, idx) => {\n const fieldName = sanitizeFieldName(col.field || `field_${idx}`, used, idx)\n const header = col.header?.trim().length ? col.header!.trim() : col.field || `Field ${idx + 1}`\n const resolver = col.resolve\n ? col.resolve\n : ((item: any) => (item != null ? (item as any)[col.field] : undefined))\n return { field: fieldName, header, resolve: resolver }\n })\n const rows = items.map((item) => {\n const row: Record<string, unknown> = {}\n columns.forEach((column) => {\n try {\n row[column.field] = column.resolve(item)\n } catch {\n row[column.field] = undefined\n }\n })\n return row\n })\n return {\n columns: columns.map(({ field, header }) => ({ field, header })),\n rows,\n }\n}\n\nfunction buildExportFromCsv(items: any[], csv: NonNullable<ListConfig<any>['csv']>): PreparedExport {\n const used = new Set<string>()\n const columns = csv.headers.map((header, idx) => ({\n field: sanitizeFieldName(header || `column_${idx + 1}`, used, idx),\n header: header || `Column ${idx + 1}`,\n }))\n const rows = items.map((item) => {\n const values = csv.row(item) || []\n const row: Record<string, unknown> = {}\n columns.forEach((column, idx) => {\n row[column.field] = values[idx]\n })\n return row\n })\n return { columns, rows }\n}\n\nfunction buildDefaultExport(items: any[]): PreparedExport {\n const rows = items.map((item) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return { ...(item as Record<string, unknown>) }\n }\n return { value: item }\n })\n return {\n columns: ensureColumns(rows),\n rows,\n }\n}\n\nfunction prepareExportData(items: any[], list: ListConfig<any>): PreparedExport {\n if (list.export?.columns && list.export.columns.length > 0) {\n return buildExportFromColumns(items, list.export.columns)\n }\n if (list.csv) {\n return buildExportFromCsv(items, list.csv)\n }\n const prepared = buildDefaultExport(items)\n return {\n columns: ensureColumns(prepared.rows, prepared.columns),\n rows: prepared.rows,\n }\n}\n\nfunction finalizeExportFilename(list: ListConfig<any>, format: CrudExportFormat, fallbackBase: string): string {\n const extension = format === 'markdown' ? 'md' : format\n const fromExport = list.export?.filename\n const apply = (value: string | null | undefined): string | null => {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed) return null\n const sanitized = trimmed.replace(/[^a-z0-9_\\-\\.]/gi, '_')\n const lower = sanitized.toLowerCase()\n if (lower.endsWith(`.${extension}`)) return sanitized\n const withoutExtension = sanitized.includes('.') ? sanitized.replace(/\\.[^.]+$/, '') : sanitized\n const base = withoutExtension.trim().length > 0 ? withoutExtension : sanitized\n return `${base}.${extension}`\n }\n if (typeof fromExport === 'function') {\n const computed = apply(fromExport(format))\n if (computed) return computed\n } else {\n const computed = apply(fromExport)\n if (computed) return computed\n }\n if (format === 'csv' && list.csv?.filename) {\n const csvName = apply(list.csv.filename)\n if (csvName) return csvName\n }\n return defaultExportFilename(fallbackBase, format)\n}\n\nfunction normalizeFullRecordForExport(input: any): any {\n if (!input || typeof input !== 'object') return input\n if (Array.isArray(input)) return input.map((item) => normalizeFullRecordForExport(item))\n const record: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(input)) {\n if (key.startsWith('cf_') || key.startsWith('cf:')) continue\n record[key] = value\n }\n const custom = extractAllCustomFieldEntries(input)\n for (const [rawKey, value] of Object.entries(custom)) {\n const sanitizedKey = rawKey.replace(/^cf_/, '')\n record[sanitizedKey] = value\n }\n return record\n}\nexport type CreateConfig<TCreate> = {\n schema: z.ZodType<TCreate>\n mapToEntity: (input: TCreate, ctx: CrudCtx) => Record<string, any>\n customFields?: CustomFieldsConfig\n response?: (entity: any) => any\n}\n\nexport type UpdateConfig<TUpdate> = {\n schema: z.ZodType<TUpdate>\n // Must contain a string uuid `id` field\n getId?: (input: TUpdate) => string\n applyToEntity: (entity: any, input: TUpdate, ctx: CrudCtx) => void | Promise<void>\n customFields?: CustomFieldsConfig\n response?: (entity: any) => any\n}\n\nexport type DeleteConfig = {\n // Where to take id from; default: query param `id`\n idFrom?: 'query' | 'body'\n softDelete?: boolean // default true\n response?: (id: string) => any\n}\n\nexport type CrudCommandActionConfig = {\n commandId: string\n schema?: z.ZodTypeAny\n mapInput?: (args: { parsed: any; raw: any; ctx: CrudCtx }) => Promise<any> | any\n metadata?: (args: { input: any; parsed: any; raw: any; ctx: CrudCtx }) => Promise<CommandLogMetadata | null> | CommandLogMetadata | null\n response?: (args: { result: any; logEntry: any | null; ctx: CrudCtx }) => any\n status?: number\n}\n\nexport type CrudCtx = {\n container: AwilixContainer\n auth: AuthContext | null\n organizationScope: OrganizationScope | null\n selectedOrganizationId: string | null\n organizationIds: string[] | null\n request?: Request\n}\n\nexport type CrudFactoryOptions<TCreate, TUpdate, TList> = {\n metadata?: CrudMetadata\n orm: OrmEntityConfig\n list?: ListConfig<TList>\n create?: CreateConfig<TCreate>\n update?: UpdateConfig<TUpdate>\n del?: DeleteConfig\n events?: CrudEventsConfig\n indexer?: CrudIndexerConfig\n resolveIdentifiers?: CrudIdentifierResolver\n hooks?: CrudHooks<TCreate, TUpdate, TList>\n actions?: {\n create?: CrudCommandActionConfig\n update?: CrudCommandActionConfig\n delete?: CrudCommandActionConfig\n }\n}\n\nfunction deriveResourceFromActions(actions: CrudFactoryOptions<any, any, any>['actions']): string | null {\n if (!actions) return null\n const ids: Array<string | null | undefined> = [actions.create?.commandId, actions.update?.commandId, actions.delete?.commandId]\n for (const id of ids) {\n const resolved = deriveResourceFromCommandId(id)\n if (resolved) return resolved\n }\n return null\n}\n\nfunction resolveResourceAliasesList(\n opts: CrudFactoryOptions<any, any, any>,\n ormEntityName: string | undefined\n): { primary: string; aliases: string[] } {\n const eventsResource =\n opts.events?.module && opts.events?.entity ? `${opts.events.module}.${opts.events.entity}` : null\n const commandResource = deriveResourceFromActions(opts.actions)\n const rawCandidate = eventsResource ?? commandResource ?? ormEntityName ?? 'resource'\n const primary = canonicalizeResourceTag(rawCandidate) ?? 'resource'\n return { primary, aliases: [] }\n}\n\nfunction mergeCommandMetadata(base: CommandLogMetadata, override: CommandLogMetadata | null | undefined): CommandLogMetadata {\n if (!override) return base\n const mergedContext = {\n ...(base.context ?? {}),\n ...(override.context ?? {}),\n }\n const merged: CommandLogMetadata = {\n ...base,\n ...override,\n }\n if (Object.keys(mergedContext).length > 0) merged.context = mergedContext\n else if ('context' in merged) delete merged.context\n return merged\n}\n\nfunction json(data: any, init?: ResponseInit) {\n return new Response(JSON.stringify(data), {\n ...(init || {}),\n headers: { 'content-type': 'application/json', ...(init?.headers || {}) },\n })\n}\n\nfunction attachOperationHeader(res: Response, logEntry: any) {\n if (!res || !(res instanceof Response)) return res\n if (!logEntry || typeof logEntry !== 'object') return res\n const undoToken = typeof logEntry.undoToken === 'string' ? logEntry.undoToken : null\n const id = typeof logEntry.id === 'string' ? logEntry.id : null\n const commandId = typeof logEntry.commandId === 'string' ? logEntry.commandId : null\n if (!undoToken || !id || !commandId) return res\n const actionLabel = typeof logEntry.actionLabel === 'string' ? logEntry.actionLabel : null\n const resourceKind = typeof logEntry.resourceKind === 'string' ? logEntry.resourceKind : null\n const resourceId = typeof logEntry.resourceId === 'string' ? logEntry.resourceId : null\n const createdAt = logEntry.createdAt instanceof Date\n ? logEntry.createdAt.toISOString()\n : (typeof logEntry.createdAt === 'string' ? logEntry.createdAt : new Date().toISOString())\n const headerValue = serializeOperationMetadata({\n id,\n undoToken,\n commandId,\n actionLabel,\n resourceKind,\n resourceId,\n executedAt: createdAt,\n })\n try {\n res.headers.set('x-om-operation', headerValue)\n } catch {\n // no-op if headers already sent\n }\n return res\n}\n\nfunction handleError(err: unknown): Response {\n if (err instanceof Response) return err\n if (err instanceof CrudHttpError) return json(err.body, { status: err.status })\n if (err instanceof z.ZodError) return json({ error: 'Invalid input', details: err.issues }, { status: 400 })\n\n const message = err instanceof Error ? err.message : undefined\n const stack = err instanceof Error ? err.stack : undefined\n // eslint-disable-next-line no-console\n console.error('[crud] unexpected error', { message, stack, err })\n const body: Record<string, unknown> = {\n error: 'Internal server error',\n message: 'Something went wrong. Please try again later.',\n }\n return json(body, { status: 500 })\n}\n\nfunction isUuid(v: any): v is string {\n return typeof v === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v)\n}\n\ntype AccessLogServiceLike = { log: (input: any) => Promise<unknown> | unknown }\n\nfunction resolveAccessLogService(container: AwilixContainer): AccessLogServiceLike | null {\n try {\n const service = container.resolve?.('accessLogService') as AccessLogServiceLike | undefined\n if (service && typeof service.log === 'function') return service\n } catch (err) {\n try {\n console.warn('[crud] accessLogService not available in container', err)\n } catch {}\n }\n return null\n}\n\nfunction logForbidden(details: Record<string, unknown>) {\n try {\n // eslint-disable-next-line no-console\n console.warn('[crud] Forbidden request', details)\n } catch {}\n}\n\nfunction collectFieldNames(items: any[]): string[] {\n const set = new Set<string>()\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n for (const key of Object.keys(item)) {\n if (typeof key === 'string' && key.length > 0) set.add(key)\n }\n }\n return Array.from(set)\n}\n\nfunction determineAccessType(query: unknown, total: number, idField: string): string {\n if (query && typeof query === 'object' && query !== null && idField in (query as Record<string, unknown>)) {\n const value = (query as Record<string, unknown>)[idField]\n if (value !== undefined && value !== null && String(value).length > 0) return 'read:item'\n }\n return total > 1 ? 'read:list' : 'read'\n}\n\nfunction createCrudProfiler(resource: string, operation: string): Profiler {\n const enabled = shouldEnableProfiler(resource)\n return createProfiler({\n scope: `crud:${operation}`,\n target: resource,\n label: `${resource}:${operation}`,\n loggerLabel: '[crud:profile]',\n enabled,\n })\n}\n\nexport type LogCrudAccessOptions = {\n container: AwilixContainer\n auth: AuthContext | null\n request?: Request\n items: any[]\n idField?: string\n resourceKind: string\n organizationId?: string | null\n tenantId?: string | null\n query?: unknown\n accessType?: string\n fields?: string[]\n}\n\nexport async function logCrudAccess(options: LogCrudAccessOptions) {\n const { container, auth, request, items, resourceKind } = options\n if (!auth) return\n if (!Array.isArray(items) || items.length === 0) return\n const service = resolveAccessLogService(container)\n if (!service) return\n\n const idField = options.idField || 'id'\n const tenantId = options.tenantId ?? auth.tenantId ?? null\n const organizationId = options.organizationId ?? auth.orgId ?? null\n const actorUserId = (auth.keyId ?? auth.sub) ?? null\n const fields = options.fields && options.fields.length ? options.fields : collectFieldNames(items)\n const accessType = options.accessType ?? determineAccessType(options.query, items.length, idField)\n\n const context: Record<string, unknown> = {\n resultCount: items.length,\n accessType,\n }\n if (options.query && typeof options.query === 'object' && options.query !== null) {\n context.queryKeys = Object.keys(options.query as Record<string, unknown>)\n }\n try {\n if (request) {\n const url = new URL(request.url)\n context.path = url.pathname\n }\n } catch {\n // ignore url parsing issues\n }\n\n const uniqueIds = new Set<string>()\n const tasks: Promise<unknown>[] = []\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const rawId = (item as any)[idField]\n const resourceId = normalizeIdentifierValue(rawId)\n if (!resourceId || uniqueIds.has(resourceId)) continue\n uniqueIds.add(resourceId)\n const payload: Record<string, unknown> = {\n tenantId,\n organizationId,\n actorUserId,\n resourceKind,\n resourceId,\n accessType,\n }\n if (fields.length > 0) payload.fields = fields\n if (Object.keys(context).length > 0) payload.context = context\n tasks.push(\n Promise.resolve(service.log(payload)).catch((err) => {\n try {\n console.error('[crud] failed to record access log', { err, payload })\n } catch {}\n return undefined\n })\n )\n }\n if (tasks.length > 0) await Promise.all(tasks)\n}\n\ntype CrudCacheStoredValue = {\n payload: any\n generatedAt: number\n}\n\nfunction safeClone<T>(value: T): T {\n try {\n const structuredCloneFn = (globalThis as any).structuredClone\n if (typeof structuredCloneFn === 'function') {\n return structuredCloneFn(value)\n }\n } catch {}\n try {\n return JSON.parse(JSON.stringify(value)) as T\n } catch {\n return value\n }\n}\n\nfunction collectScopeOrganizationIds(ctx: CrudCtx): Array<string | null> {\n if (Array.isArray(ctx.organizationIds) && ctx.organizationIds.length > 0) {\n return Array.from(new Set(ctx.organizationIds))\n }\n const fallback = ctx.selectedOrganizationId ?? ctx.auth?.orgId ?? null\n return [fallback]\n}\n\nfunction serializeSearchParams(params: URLSearchParams): string {\n if (!params || params.keys().next().done) return ''\n const grouped = new Map<string, string[]>()\n params.forEach((value, key) => {\n const existing = grouped.get(key) ?? []\n existing.push(value)\n grouped.set(key, existing)\n })\n const normalized: Array<[string, string[]]> = Array.from(grouped.entries()).map(([key, values]) => [key, values.sort()])\n normalized.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n return JSON.stringify(normalized)\n}\n\nfunction buildCrudCacheKey(resource: string, request: Request, ctx: CrudCtx): string {\n const url = new URL(request.url)\n const scopeIds = collectScopeOrganizationIds(ctx)\n const scopeSegment = scopeIds.length\n ? scopeIds.map((id) => normalizeTagSegment(id)).sort().join(',')\n : 'none'\n return [\n 'crud',\n normalizeTagSegment(resource),\n 'GET',\n url.pathname,\n `tenant:${normalizeTagSegment(ctx.auth?.tenantId ?? null)}`,\n `selectedOrg:${normalizeTagSegment(ctx.selectedOrganizationId ?? null)}`,\n `scope:${scopeSegment}`,\n `query:${serializeSearchParams(url.searchParams)}`,\n ].join('|')\n}\n\nfunction extractRecordIds(items: any[], idField: string): string[] {\n if (!Array.isArray(items) || !items.length) return []\n const ids = new Set<string>()\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const rawId = (item as any)[idField]\n const id = normalizeIdentifierValue(rawId)\n if (id) ids.add(id)\n }\n return Array.from(ids)\n}\n\nexport function makeCrudRoute<TCreate = any, TUpdate = any, TList = any>(opts: CrudFactoryOptions<TCreate, TUpdate, TList>) {\n const metadata = opts.metadata || {}\n const ormCfg = {\n entity: opts.orm.entity,\n idField: opts.orm.idField ?? 'id',\n orgField: opts.orm.orgField === null ? null : opts.orm.orgField ?? 'organizationId',\n tenantField: opts.orm.tenantField === null ? null : opts.orm.tenantField ?? 'tenantId',\n softDeleteField: opts.orm.softDeleteField === null ? null : opts.orm.softDeleteField ?? 'deletedAt',\n }\n const entityName = typeof ormCfg.entity?.name === 'string' && ormCfg.entity.name.length > 0 ? ormCfg.entity.name : undefined\n const resourceInfo = resolveResourceAliasesList(opts, entityName)\n const resourceKind = resourceInfo.primary\n const resourceAliases = resourceInfo.aliases\n const resourceTargets = expandResourceAliases(resourceKind, resourceAliases)\n const defaultIdentifierResolver: CrudIdentifierResolver = (entity, _action) => {\n const id = normalizeIdentifierValue((entity as any)[ormCfg.idField!])\n const orgId = ormCfg.orgField ? normalizeIdentifierValue((entity as any)[ormCfg.orgField]) : null\n const tenantId = ormCfg.tenantField ? normalizeIdentifierValue((entity as any)[ormCfg.tenantField]) : null\n return {\n id: id ?? '',\n organizationId: orgId ?? null,\n tenantId: tenantId ?? null,\n }\n }\n const identifierResolver: CrudIdentifierResolver = opts.resolveIdentifiers\n ? (entity, action) => {\n const raw = opts.resolveIdentifiers!(entity, action)\n const id = normalizeIdentifierValue(raw?.id)\n const organizationId = normalizeIdentifierValue(raw?.organizationId)\n const tenantId = normalizeIdentifierValue(raw?.tenantId)\n return {\n id: id ?? '',\n organizationId: organizationId ?? null,\n tenantId: tenantId ?? null,\n }\n }\n : defaultIdentifierResolver\n\n const listCustomFieldDecorator = opts.list?.decorateCustomFields\n const indexerConfig = opts.indexer as CrudIndexerConfig | undefined\n const eventsConfig = opts.events as CrudEventsConfig | undefined\n\n const pickNormalizedIdentifier = (...values: Array<string | number | null | undefined>): string | null => {\n for (const value of values) {\n const normalized = normalizeIdentifierValue(value)\n if (normalized) return normalized\n }\n return null\n }\n\n const extractIdentifierFrom = (...payloads: Array<any>): string | null => {\n const candidates: Array<string | number | null | undefined> = []\n for (const payload of payloads) {\n if (!payload || typeof payload !== 'object') {\n candidates.push(payload as any)\n continue\n }\n candidates.push(\n (payload as any)?.id,\n (payload as any)?.shipmentId,\n (payload as any)?.paymentId,\n (payload as any)?.lineId,\n (payload as any)?.adjustmentId,\n (payload as any)?.itemId,\n (payload as any)?.orderAdjustmentId,\n (payload as any)?.orderId,\n (payload as any)?.quoteId,\n )\n }\n return pickNormalizedIdentifier(...candidates)\n }\n\n const markCommandResultForIndexing = async (\n id: string | null,\n action: CrudEventAction,\n ctx: CrudCtx,\n ) => {\n if (!id || (!indexerConfig && !eventsConfig)) return\n try {\n const em = ctx.container.resolve('em') as EntityManager\n const entity = await em.findOne(ormCfg.entity, { [ormCfg.idField!]: id } as any)\n const de = ctx.container.resolve('dataEngine') as DataEngine\n const identifiers = identifierResolver(\n entity ?? ({ [ormCfg.idField!]: id } as any),\n action,\n )\n const scopedIdentifiers = {\n ...identifiers,\n organizationId:\n identifiers.organizationId ??\n ctx.selectedOrganizationId ??\n ctx.auth?.orgId ??\n null,\n tenantId: identifiers.tenantId ?? ctx.auth?.tenantId ?? null,\n }\n de.markOrmEntityChange({\n action,\n entity: entity ?? ({ [ormCfg.idField!]: id } as any),\n identifiers: scopedIdentifiers,\n events: eventsConfig,\n indexer: indexerConfig,\n })\n await de.flushOrmEntityChanges()\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[crud] failed to mark command result for indexing', { err, id, action, resourceKind })\n }\n }\n }\n\n const inferFieldValue = (item: Record<string, unknown>, keys: string[]): string | null => {\n for (const key of keys) {\n const value = item[key]\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (trimmed.length) return trimmed\n }\n }\n return null\n }\n\n const decorateItemsWithCustomFields = async (items: any[], ctx: CrudCtx): Promise<any[]> => {\n if (!listCustomFieldDecorator || !Array.isArray(items) || items.length === 0) return items\n const entityIds = Array.isArray(listCustomFieldDecorator.entityIds)\n ? listCustomFieldDecorator.entityIds\n : [listCustomFieldDecorator.entityIds]\n if (!entityIds.length) return items\n const cfProfiler = createCrudProfiler(resourceKind, 'custom_fields')\n cfProfiler.mark('prepare')\n let profileClosed = false\n const endProfile = (extra?: Record<string, unknown>) => {\n if (!cfProfiler.enabled || profileClosed) return\n profileClosed = true\n cfProfiler.end(extra)\n }\n try {\n const em = (ctx.container.resolve('em') as EntityManager)\n const organizationIds =\n Array.isArray(ctx.organizationIds) && ctx.organizationIds.length\n ? ctx.organizationIds\n : [ctx.selectedOrganizationId ?? null]\n const definitionIndex = await loadCustomFieldDefinitionIndex({\n em,\n entityIds,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds,\n })\n cfProfiler.mark('definitions_loaded', { definitionCount: definitionIndex.size })\n const decoratedItems = items.map((raw) => {\n if (!raw || typeof raw !== 'object') return raw\n const item = raw as Record<string, unknown>\n const context = listCustomFieldDecorator.resolveContext\n ? listCustomFieldDecorator.resolveContext(raw, ctx) ?? {}\n : {}\n const organizationId =\n context.organizationId ??\n inferFieldValue(item, ['organization_id', 'organizationId'])\n const tenantId =\n context.tenantId ??\n inferFieldValue(item, ['tenant_id', 'tenantId']) ??\n ctx.auth?.tenantId ??\n null\n const decorated = decorateRecordWithCustomFields(item, definitionIndex, {\n organizationId: organizationId ?? null,\n tenantId: tenantId ?? null,\n })\n const output = {\n ...item,\n customValues: decorated.customValues,\n customFields: decorated.customFields,\n }\n return output\n })\n cfProfiler.mark('decorate_complete', { itemCount: decoratedItems.length })\n endProfile({\n entityIds: entityIds.length,\n itemCount: decoratedItems.length,\n })\n return decoratedItems\n } catch (err) {\n console.warn('[crud] failed to decorate custom fields', err)\n endProfile({\n result: 'error',\n entityIds: entityIds.length,\n itemCount: items.length,\n })\n return items\n }\n }\n\n async function ensureAuth(request?: Request | null) {\n const auth = request ? await getAuthFromRequest(request) : await getAuthFromCookies()\n if (!auth) return null\n if (auth.tenantId && !isUuid(auth.tenantId)) return null\n return auth\n }\n\n async function withCtx(request: Request): Promise<CrudCtx> {\n const container = await createRequestContainer()\n const rawAuth = await ensureAuth(request)\n let scope: OrganizationScope | null = null\n let selectedOrganizationId: string | null = null\n let organizationIds: string[] | null = null\n if (rawAuth) {\n try {\n scope = await resolveOrganizationScopeForRequest({ container, auth: rawAuth, request })\n } catch {\n scope = null\n }\n }\n const scopedTenantId = scope?.tenantId ?? rawAuth?.tenantId ?? null\n const scopedOrgId = scope ? (scope.selectedId ?? null) : (rawAuth?.orgId ?? null)\n selectedOrganizationId = scopedOrgId\n const scopedAuth = rawAuth\n ? {\n ...rawAuth,\n tenantId: scopedTenantId ?? null,\n orgId: scopedOrgId ?? null,\n }\n : null\n const fallbackOrgId = scopedOrgId ?? rawAuth?.orgId ?? null\n const rawScopeIds = scope?.filterIds\n const scopedIds = Array.isArray(rawScopeIds) ? rawScopeIds.filter((id): id is string => typeof id === 'string' && id.length > 0) : null\n if (!scope) {\n organizationIds = fallbackOrgId ? [fallbackOrgId] : null\n } else if (scopedIds === null) {\n organizationIds = scope.allowedIds === null ? null : (fallbackOrgId ? [fallbackOrgId] : null)\n } else if (scopedIds.length > 0) {\n organizationIds = Array.from(new Set(scopedIds))\n } else if (fallbackOrgId) {\n const allowedIds = Array.isArray(scope?.allowedIds) ? scope.allowedIds : null\n let canUseFallback = false\n if (allowedIds === null) {\n canUseFallback = true\n } else if (allowedIds.includes(fallbackOrgId) || allowedIds.length === 0) {\n canUseFallback = true\n }\n if (canUseFallback) {\n organizationIds = [fallbackOrgId]\n } else {\n organizationIds = []\n }\n } else {\n organizationIds = []\n }\n return { container, auth: scopedAuth, organizationScope: scope, selectedOrganizationId, organizationIds, request }\n }\n\n async function GET(request: Request) {\n const profiler = createCrudProfiler(resourceKind, 'list')\n const requestMeta: Record<string, unknown> = { method: request.method }\n try {\n const urlObj = new URL(request.url)\n requestMeta.path = urlObj.pathname\n requestMeta.url = request.url\n if (urlObj.search) requestMeta.query = urlObj.search\n } catch {\n requestMeta.url = request.url\n }\n profiler.mark('request_received', requestMeta)\n let profileClosed = false\n const finishProfile = (extra?: Record<string, unknown>) => {\n if (!profiler.enabled || profileClosed) return\n profileClosed = true\n const meta = extra ? { ...requestMeta, ...extra } : { ...requestMeta }\n profiler.end(meta)\n }\n try {\n profiler.mark('resolve_context')\n const ctx = await withCtx(request)\n profiler.mark('context_ready')\n if (!ctx.auth) {\n finishProfile({ reason: 'unauthorized' })\n return json({ error: 'Unauthorized' }, { status: 401 })\n }\n if (!opts.list) {\n finishProfile({ reason: 'list_not_configured' })\n return json({ error: 'Not implemented' }, { status: 501 })\n }\n const url = new URL(request.url)\n const queryParams = Object.fromEntries(url.searchParams.entries())\n profiler.mark('query_parsed')\n const validated = opts.list.schema.parse(queryParams)\n profiler.mark('query_validated')\n\n await opts.hooks?.beforeList?.(validated as any, ctx)\n profiler.mark('before_list_hook')\n\n const availableFormats = resolveAvailableExportFormats(opts.list)\n const requestedExport = normalizeExportFormat((queryParams as any).format)\n const exportRequested = requestedExport != null && availableFormats.includes(requestedExport)\n const requestedPage = Number((queryParams as any).page ?? 1) || 1\n const requestedPageSize = Math.min(Math.max(Number((queryParams as any).pageSize ?? 50) || 50, 1), 100)\n const exportPageSize = exportRequested ? resolveExportBatchSize(opts.list, requestedPageSize) : requestedPageSize\n const exportScopeParam = (queryParams as any).exportScope ?? (queryParams as any).export_scope\n const exportScope = typeof exportScopeParam === 'string' ? exportScopeParam.toLowerCase() : null\n const exportFullRequested = exportRequested && (exportScope === 'full' || parseBooleanToken((queryParams as any).full) === true)\n profiler.mark('export_configured', { exportRequested, exportFullRequested })\n\n const cacheEnabled = isCrudCacheEnabled() && !exportRequested\n const cacheTimerStart = cacheEnabled && isCrudCacheDebugEnabled()\n ? process.hrtime.bigint()\n : null\n const cache = cacheEnabled ? resolveCrudCache(ctx.container) : null\n const cacheKey = cacheEnabled ? buildCrudCacheKey(resourceKind, request, ctx) : null\n let cacheStatus: 'hit' | 'miss' = 'miss'\n let cachedValue: CrudCacheStoredValue | null = null\n\n if (cacheEnabled && cache && cacheKey) {\n const rawCached = await cache.get(cacheKey)\n if (rawCached !== null && rawCached !== undefined) {\n if (typeof rawCached === 'object' && 'payload' in (rawCached as any)) {\n cachedValue = rawCached as CrudCacheStoredValue\n } else {\n cachedValue = { payload: rawCached, generatedAt: Date.now() }\n }\n }\n }\n profiler.mark('cache_checked', { cached: cachedValue !== null })\n\n const tenantForScope = ctx.auth?.tenantId ?? null\n const maybeStoreCrudCache = async (payload: any) => {\n if (!cacheEnabled || !cache || !cacheKey) return\n if (!payload || typeof payload !== 'object') return\n const items = Array.isArray((payload as any).items) ? (payload as any).items : []\n const tags = new Set<string>()\n const scopeOrgIds = collectScopeOrganizationIds(ctx)\n const crudSegment = deriveCrudSegmentTag(resourceKind, request)\n for (const target of resourceTargets) {\n for (const tag of buildCollectionTags(target, tenantForScope, scopeOrgIds)) {\n tags.add(tag)\n }\n }\n const recordIds = extractRecordIds(items, ormCfg.idField!)\n for (const recordId of recordIds) {\n for (const target of resourceTargets) {\n tags.add(buildRecordTag(target, tenantForScope, recordId))\n }\n }\n if (crudSegment) {\n tags.add(`crud:segment:${crudSegment}`)\n }\n if (!tags.size) return\n try {\n await cache.set(cacheKey, { payload: safeClone(payload), generatedAt: Date.now() }, { tags: Array.from(tags) })\n debugCrudCache('store', {\n resource: resourceKind,\n key: cacheKey,\n tags: Array.from(tags),\n itemCount: items.length,\n })\n } catch (err) {\n debugCrudCache('store', {\n resource: resourceKind,\n key: cacheKey,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n const logCacheOutcome = (event: 'hit' | 'miss', itemCount: number) => {\n if (!cacheTimerStart) return\n const elapsedMs = Number(process.hrtime.bigint() - cacheTimerStart) / 1_000_000\n debugCrudCache(event, {\n resource: resourceKind,\n key: cacheKey,\n durationMs: Math.round(elapsedMs * 1000) / 1000,\n itemCount,\n })\n }\n\n const respondWithPayload = (payload: any, extraHeaders?: Record<string, string>) => {\n const headers: Record<string, string> = extraHeaders ? { ...extraHeaders } : {}\n const warning = payload && typeof payload === 'object' && payload.meta?.partialIndexWarning\n if (warning) {\n headers['x-om-partial-index'] = JSON.stringify({\n type: 'partial_index',\n entity: warning.entity,\n entityLabel: warning.entityLabel ?? warning.entity,\n baseCount: warning.baseCount ?? null,\n indexedCount: warning.indexedCount ?? null,\n scope: warning.scope ?? 'scoped',\n })\n }\n if (cacheEnabled) {\n headers['x-om-cache'] = cacheStatus\n }\n return json(payload, Object.keys(headers).length ? { headers } : undefined)\n }\n\n if (cachedValue) {\n cacheStatus = 'hit'\n profiler.mark('cache_hit', { generatedAt: cachedValue.generatedAt ?? null })\n const payload = safeClone(cachedValue.payload)\n const items = Array.isArray((payload as any)?.items) ? (payload as any).items : []\n profiler.mark('cache_payload_ready', { itemCount: items.length })\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n logCacheOutcome('hit', items.length)\n const response = respondWithPayload(payload)\n finishProfile({ result: 'cache_hit', cacheStatus })\n return response\n }\n\n // Prefer query engine when configured\n if (opts.list.entityId && opts.list.fields) {\n profiler.mark('query_engine_prepare')\n const qe = (ctx.container.resolve('queryEngine') as QueryEngine)\n profiler.mark('query_engine_resolved')\n const sortFieldRaw = (queryParams as any).sortField || 'id'\n const sortDirRaw = ((queryParams as any).sortDir || 'asc').toLowerCase() === 'desc' ? SortDir.Desc : SortDir.Asc\n const sortField = (opts.list.sortFieldMap && opts.list.sortFieldMap[sortFieldRaw]) || sortFieldRaw\n const sort: Sort[] = [{ field: sortField as any, dir: sortDirRaw } as any]\n const page: Page = exportRequested\n ? { page: 1, pageSize: exportPageSize }\n : { page: requestedPage, pageSize: requestedPageSize }\n const filters = exportFullRequested\n ? ({} as Where<any>)\n : (opts.list.buildFilters ? await opts.list.buildFilters(validated as any, ctx) : ({} as Where<any>))\n const withDeleted = parseBooleanToken((queryParams as any).withDeleted) === true\n profiler.mark('filters_ready', { withDeleted })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n profiler.mark('scope_blocked')\n logForbidden({\n resourceKind,\n action: 'list',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n const emptyPayload = { items: [], total: 0, page: page.page, pageSize: page.pageSize, totalPages: 0 }\n await opts.hooks?.afterList?.(emptyPayload, { ...ctx, query: validated as any })\n await maybeStoreCrudCache(emptyPayload)\n logCacheOutcome(cacheStatus, emptyPayload.items.length)\n const response = respondWithPayload(emptyPayload)\n finishProfile({ result: 'empty_scope', cacheStatus, itemCount: 0, total: 0 })\n return response\n }\n const queryOpts: any = {\n fields: opts.list.fields!,\n includeCustomFields: true,\n sort,\n page,\n filters,\n withDeleted,\n }\n if (opts.list.customFieldSources) {\n queryOpts.customFieldSources = opts.list.customFieldSources\n }\n if (opts.list.joins) {\n queryOpts.joins = opts.list.joins\n }\n if (ormCfg.tenantField) queryOpts.tenantId = ctx.auth.tenantId!\n if (ormCfg.orgField) {\n queryOpts.organizationId = ctx.selectedOrganizationId ?? undefined\n queryOpts.organizationIds = ctx.organizationIds ?? undefined\n }\n const queryEntity = String(opts.list.entityId)\n profiler.mark('query_options_ready')\n const queryProfiler = profiler.child('query_engine', { entity: queryEntity })\n const res = await qe.query(opts.list.entityId as any, { ...queryOpts, profiler: queryProfiler })\n const rawItems = res.items || []\n let transformedItems = rawItems.map(i => (opts.list!.transformItem ? opts.list!.transformItem(i) : i))\n profiler.mark('transform_complete', { itemCount: transformedItems.length })\n transformedItems = await decorateItemsWithCustomFields(transformedItems, ctx)\n profiler.mark('custom_fields_complete', { itemCount: transformedItems.length })\n\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items: transformedItems,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n profiler.mark('access_logged')\n\n if (exportRequested && requestedExport) {\n const total = typeof res.total === 'number' ? res.total : rawItems.length\n const initialExportItems = exportFullRequested\n ? rawItems.map(normalizeFullRecordForExport)\n : transformedItems\n let exportItems = [...initialExportItems]\n if (total > exportItems.length) {\n const exportPageSizeNumber = typeof page.pageSize === 'number' ? page.pageSize : exportPageSize\n const queryBase: any = { ...queryOpts }\n delete queryBase.page\n let nextPage = 2\n while (exportItems.length < total) {\n profiler.mark('export_next_page_request', { page: nextPage })\n const nextRes = await qe.query(opts.list.entityId as any, {\n ...queryBase,\n page: { page: nextPage, pageSize: exportPageSizeNumber },\n profiler: profiler.child('query_engine', { entity: queryEntity, page: nextPage, mode: 'export' }),\n })\n const nextItemsRaw = nextRes.items || []\n if (!nextItemsRaw.length) break\n let nextTransformed = nextItemsRaw.map(i => (opts.list!.transformItem ? opts.list!.transformItem(i) : i))\n nextTransformed = await decorateItemsWithCustomFields(nextTransformed, ctx)\n const nextExportItems = exportFullRequested\n ? nextItemsRaw.map(normalizeFullRecordForExport)\n : nextTransformed\n exportItems.push(...nextExportItems)\n if (nextExportItems.length < exportPageSizeNumber) break\n nextPage += 1\n }\n }\n const prepared = exportFullRequested\n ? { columns: ensureColumns(exportItems), rows: exportItems }\n : prepareExportData(exportItems, opts.list)\n const fallbackBase = `${opts.events?.entity || resourceKind || 'list'}${exportFullRequested ? '_full' : ''}`\n const filename = finalizeExportFilename(opts.list, requestedExport, fallbackBase)\n const serialized = serializeExport(prepared, requestedExport)\n const exportPayload = { items: exportItems, total, page: 1, pageSize: exportItems.length, totalPages: 1, ...(res.meta ? { meta: res.meta } : {}) }\n await opts.hooks?.afterList?.(exportPayload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const response = new Response(serialized.body, {\n headers: {\n 'content-type': serialized.contentType,\n 'content-disposition': `attachment; filename=\"${filename}\"`,\n },\n })\n if (res.meta?.partialIndexWarning) {\n response.headers.set(\n 'x-om-partial-index',\n JSON.stringify({\n type: 'partial_index',\n entity: res.meta.partialIndexWarning.entity,\n entityLabel: res.meta.partialIndexWarning.entityLabel ?? res.meta.partialIndexWarning.entity,\n baseCount: res.meta.partialIndexWarning.baseCount ?? null,\n indexedCount: res.meta.partialIndexWarning.indexedCount ?? null,\n scope: res.meta.partialIndexWarning.scope ?? 'scoped',\n }),\n )\n }\n finishProfile({\n result: 'export',\n cacheStatus,\n itemCount: exportItems.length,\n total,\n })\n return response\n }\n\n const payload = {\n items: transformedItems,\n total: res.total,\n page: page.page || requestedPage,\n pageSize: page.pageSize || requestedPageSize,\n totalPages: Math.ceil(res.total / (Number(page.pageSize) || 1)),\n ...(res.meta ? { meta: res.meta } : {}),\n }\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n await maybeStoreCrudCache(payload)\n profiler.mark('cache_store_attempt', { cacheEnabled })\n logCacheOutcome(cacheStatus, payload.items.length)\n const response = respondWithPayload(payload)\n finishProfile({\n result: 'ok',\n cacheStatus,\n itemCount: payload.items.length,\n total: payload.total ?? payload.items.length,\n })\n return response\n }\n\n // Fallback: plain ORM list\n profiler.mark('orm_fallback_prepare')\n const em = (ctx.container.resolve('em') as any)\n const repo = em.getRepository(ormCfg.entity)\n profiler.mark('orm_repo_ready')\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n profiler.mark('fallback_scope_blocked')\n logForbidden({\n resourceKind,\n action: 'list',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n const emptyPayload = { items: [], total: 0 }\n await opts.hooks?.afterList?.(emptyPayload, { ...ctx, query: validated as any })\n await maybeStoreCrudCache(emptyPayload)\n logCacheOutcome(cacheStatus, emptyPayload.items.length)\n const response = respondWithPayload(emptyPayload)\n finishProfile({\n result: 'empty_scope',\n cacheStatus,\n itemCount: 0,\n total: 0,\n branch: 'fallback',\n })\n return response\n }\n const where: any = buildScopedWhere(\n {},\n {\n organizationId: ormCfg.orgField ? (ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null) : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n let list = await repo.find(where)\n profiler.mark('orm_query_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n list = await decorateItemsWithCustomFields(list, ctx)\n profiler.mark('fallback_custom_fields_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items: list,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n profiler.mark('access_logged')\n if (exportRequested && requestedExport) {\n const exportItems = exportFullRequested ? list.map(normalizeFullRecordForExport) : list\n const prepared = exportFullRequested\n ? { columns: ensureColumns(exportItems), rows: exportItems }\n : prepareExportData(exportItems, opts.list)\n const fallbackBase = `${opts.events?.entity || resourceKind || 'list'}${exportFullRequested ? '_full' : ''}`\n const filename = finalizeExportFilename(opts.list, requestedExport, fallbackBase)\n const serialized = serializeExport(prepared, requestedExport)\n await opts.hooks?.afterList?.({ items: exportItems, total: exportItems.length, page: 1, pageSize: exportItems.length, totalPages: 1 }, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const response = new Response(serialized.body, {\n headers: {\n 'content-type': serialized.contentType,\n 'content-disposition': `attachment; filename=\"${filename}\"`,\n },\n })\n finishProfile({\n result: 'export',\n cacheStatus,\n itemCount: exportItems.length,\n total: exportItems.length,\n branch: 'fallback',\n })\n return response\n }\n const payload = { items: list, total: list.length }\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n await maybeStoreCrudCache(payload)\n profiler.mark('cache_store_attempt', { cacheEnabled })\n logCacheOutcome(cacheStatus, payload.items.length)\n const response = respondWithPayload(payload)\n finishProfile({\n result: 'ok',\n cacheStatus,\n itemCount: payload.items.length,\n total: payload.total,\n branch: 'fallback',\n })\n return response\n } catch (e) {\n finishProfile({ result: 'error' })\n return handleError(e)\n }\n }\n\n async function POST(request: Request) {\n try {\n const useCommand = !!opts.actions?.create\n if (!opts.create && !useCommand) return json({ error: 'Not implemented' }, { status: 501 })\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'create',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const body = await request.json().catch(() => ({}))\n\n if (useCommand) {\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const action = opts.actions!.create!\n const parsed = action.schema ? action.schema.parse(body) : body\n const input = action.mapInput ? await action.mapInput({ parsed, raw: body, ctx }) : parsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed, raw: body, ctx }) : null\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n const resolvedPayload = await Promise.resolve(payload)\n const status = action.status ?? 201\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n const indexedId = extractIdentifierFrom(resolvedPayload, result, parsed)\n await markCommandResultForIndexing(indexedId, 'created', ctx)\n return response\n }\n\n const createConfig = opts.create\n if (!createConfig) throw new Error('Create configuration missing')\n\n let input = createConfig.schema.parse(body)\n const modified = await opts.hooks?.beforeCreate?.(input as any, ctx)\n if (modified) input = modified\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const entityData = createConfig.mapToEntity(input as any, ctx)\n // Inject org/tenant\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField) {\n if (!targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n entityData[ormCfg.orgField] = targetOrgId\n }\n if (ormCfg.tenantField) {\n if (!ctx.auth.tenantId) return json({ error: 'Tenant context is required' }, { status: 400 })\n entityData[ormCfg.tenantField] = ctx.auth.tenantId\n }\n const entity = await de.createOrmEntity({ entity: ormCfg.entity, data: entityData })\n\n // Custom fields\n if (createConfig.customFields && (createConfig.customFields as any).enabled) {\n const cfc = createConfig.customFields as Exclude<CustomFieldsConfig, false>\n const values = cfc.map\n ? cfc.map(body)\n : (cfc.pickPrefixed ? extractCustomFieldValuesFromPayload(body as Record<string, unknown>) : {})\n if (values && Object.keys(values).length > 0) {\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await de.setCustomFields({\n entityId: cfc.entityId as any,\n recordId: String((entity as any)[ormCfg.idField!]),\n organizationId: targetOrgId,\n tenantId: ctx.auth.tenantId!,\n values,\n })\n }\n }\n\n await opts.hooks?.afterCreate?.(entity, { ...ctx, input: input as any })\n\n const identifiers = identifierResolver(entity, 'created')\n de.markOrmEntityChange({\n action: 'created',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'created', resourceTargets)\n\n const payload = createConfig.response ? createConfig.response(entity) : { id: String((entity as any)[ormCfg.idField!]) }\n return json(payload, { status: 201 })\n } catch (e) {\n return handleError(e)\n }\n }\n\n async function PUT(request: Request) {\n try {\n const useCommand = !!opts.actions?.update\n if (!opts.update && !useCommand) return json({ error: 'Not implemented' }, { status: 501 })\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'update',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const body = await request.json().catch(() => ({}))\n\n if (useCommand) {\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const action = opts.actions!.update!\n const parsed = action.schema ? action.schema.parse(body) : body\n const input = action.mapInput ? await action.mapInput({ parsed, raw: body, ctx }) : parsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed, raw: body, ctx }) : null\n const candidateId = normalizeIdentifierValue((input as Record<string, unknown> | null | undefined)?.id)\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n if (candidateId) baseMetadata.resourceId = candidateId\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n const resolvedPayload = await Promise.resolve(payload)\n const status = action.status ?? 200\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n const indexedId = extractIdentifierFrom(resolvedPayload, result, parsed)\n await markCommandResultForIndexing(indexedId, 'updated', ctx)\n return response\n }\n\n const updateConfig = opts.update\n if (!updateConfig) throw new Error('Update configuration missing')\n\n let input = updateConfig.schema.parse(body)\n const modified = await opts.hooks?.beforeUpdate?.(input as any, ctx)\n if (modified) input = modified\n\n const id = updateConfig.getId ? updateConfig.getId(input as any) : (input as any).id\n if (!isUuid(id)) return json({ error: 'Invalid id' }, { status: 400 })\n\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField && !targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const where: any = buildScopedWhere(\n { [ormCfg.idField!]: id },\n {\n organizationId: ormCfg.orgField ? targetOrgId : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n const entity = await de.updateOrmEntity({\n entity: ormCfg.entity,\n where,\n apply: (e: any) => updateConfig.applyToEntity(e, input as any, ctx),\n })\n if (!entity) return json({ error: 'Not found' }, { status: 404 })\n\n // Custom fields\n if (updateConfig.customFields && (updateConfig.customFields as any).enabled) {\n const cfc = updateConfig.customFields as Exclude<CustomFieldsConfig, false>\n const values = cfc.map\n ? cfc.map(body)\n : (cfc.pickPrefixed ? extractCustomFieldValuesFromPayload(body as Record<string, unknown>) : {})\n if (values && Object.keys(values).length > 0) {\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await de.setCustomFields({\n entityId: cfc.entityId as any,\n recordId: String((entity as any)[ormCfg.idField!]),\n organizationId: targetOrgId,\n tenantId: ctx.auth.tenantId!,\n values,\n })\n }\n }\n\n await opts.hooks?.afterUpdate?.(entity, { ...ctx, input: input as any })\n const identifiers = identifierResolver(entity, 'updated')\n de.markOrmEntityChange({\n action: 'updated',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'updated', resourceTargets)\n const payload = updateConfig.response ? updateConfig.response(entity) : { success: true }\n return json(payload)\n } catch (e) {\n return handleError(e)\n }\n }\n\n async function DELETE(request: Request) {\n try {\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'delete',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const useCommand = !!opts.actions?.delete\n const url = new URL(request.url)\n\n if (useCommand) {\n const action = opts.actions!.delete!\n const body = await request.json().catch(() => ({}))\n const raw = { body, query: Object.fromEntries(url.searchParams.entries()) }\n const parsed = action.schema ? action.schema.parse(raw) : raw\n const input = action.mapInput ? await action.mapInput({ parsed, raw, ctx }) : parsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed, raw, ctx }) : null\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const candidateId = normalizeIdentifierValue(\n (input as Record<string, unknown> | null | undefined)?.id\n ?? (raw.query as Record<string, unknown> | null | undefined)?.id\n ?? (raw.body as Record<string, unknown> | null | undefined)?.id\n )\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n if (candidateId) baseMetadata.resourceId = candidateId\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n const resolvedPayload = await Promise.resolve(payload)\n const status = action.status ?? 200\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n const indexedId = extractIdentifierFrom(resolvedPayload, result, (parsed as any)?.body, parsed)\n await markCommandResultForIndexing(indexedId, 'deleted', ctx)\n return response\n }\n\n const idFrom = opts.del?.idFrom || 'query'\n const id = idFrom === 'query'\n ? url.searchParams.get('id')\n : (await request.json().catch(() => ({}))).id\n if (!isUuid(id)) return json({ error: 'ID is required' }, { status: 400 })\n\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField && !targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const where: any = buildScopedWhere(\n { [ormCfg.idField!]: id },\n {\n organizationId: ormCfg.orgField ? targetOrgId : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n await opts.hooks?.beforeDelete?.(id!, ctx)\n const entity = await de.deleteOrmEntity({\n entity: ormCfg.entity,\n where,\n soft: opts.del?.softDelete !== false,\n softDeleteField: ormCfg.softDeleteField ?? undefined,\n })\n if (!entity) return json({ error: 'Not found' }, { status: 404 })\n await opts.hooks?.afterDelete?.(id!, ctx)\n if (entity) {\n const identifiers = identifierResolver(entity, 'deleted')\n de.markOrmEntityChange({\n action: 'deleted',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'deleted', resourceTargets)\n }\n const payload = opts.del?.response ? opts.del.response(id) : { success: true }\n return json(payload)\n } catch (e) {\n return handleError(e)\n }\n }\n\n return { metadata, GET, POST, PUT, DELETE }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["payload", "response", "input", "de"]
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ function normalizeCustomFieldValues(values) {
2
+ const result = {};
3
+ for (const [key, value] of Object.entries(values)) {
4
+ if (Array.isArray(value)) {
5
+ result[key] = value.map((entry) => normalizePrimitive(entry));
6
+ } else {
7
+ result[key] = normalizePrimitive(value);
8
+ }
9
+ }
10
+ return result;
11
+ }
12
+ function normalizePrimitive(value) {
13
+ if (value === null || value === void 0 || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
14
+ return value;
15
+ }
16
+ return String(value);
17
+ }
18
+ function normalizeCustomFieldResponse(values) {
19
+ if (!values) return void 0;
20
+ const entries = {};
21
+ for (const [key, value] of Object.entries(values)) {
22
+ if (value === void 0) continue;
23
+ if (key.startsWith("cf_") || key.startsWith("cf:")) {
24
+ const normalized = key.slice(3);
25
+ if (normalized) entries[normalized] = value;
26
+ continue;
27
+ }
28
+ entries[key] = value;
29
+ }
30
+ return Object.keys(entries).length ? entries : void 0;
31
+ }
32
+ export {
33
+ normalizeCustomFieldResponse,
34
+ normalizeCustomFieldValues
35
+ };
36
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/custom-fields/normalize.ts"],
4
+ "sourcesContent": ["import type { DataEngine } from '../data/engine'\n\ntype CustomFieldValueInput = Parameters<DataEngine['setCustomFields']>[0]['values']\n\nexport function normalizeCustomFieldValues(values: Record<string, unknown>): CustomFieldValueInput {\n const result: CustomFieldValueInput = {}\n for (const [key, value] of Object.entries(values)) {\n if (Array.isArray(value)) {\n result[key] = value.map((entry) => normalizePrimitive(entry)) as CustomFieldValueInput[string]\n } else {\n result[key] = normalizePrimitive(value)\n }\n }\n return result\n}\n\nfunction normalizePrimitive(value: unknown): CustomFieldValueInput[string] {\n if (\n value === null ||\n value === undefined ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value as CustomFieldValueInput[string]\n }\n return String(value) as CustomFieldValueInput[string]\n}\n\nexport function normalizeCustomFieldResponse(\n values: Record<string, unknown> | null | undefined,\n): Record<string, unknown> | undefined {\n if (!values) return undefined\n const entries: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(values)) {\n if (value === undefined) continue\n if (key.startsWith('cf_') || key.startsWith('cf:')) {\n const normalized = key.slice(3)\n if (normalized) entries[normalized] = value\n continue\n }\n entries[key] = value\n }\n return Object.keys(entries).length ? entries : undefined\n}\n"],
5
+ "mappings": "AAIO,SAAS,2BAA2B,QAAwD;AACjG,QAAM,SAAgC,CAAC;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,GAAG,IAAI,MAAM,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAAA,IAC9D,OAAO;AACL,aAAO,GAAG,IAAI,mBAAmB,KAAK;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA+C;AACzE,MACE,UAAU,QACV,UAAU,UACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,6BACd,QACqC;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAmC,CAAC;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,OAAW;AACzB,QAAI,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,KAAK,GAAG;AAClD,YAAM,aAAa,IAAI,MAAM,CAAC;AAC9B,UAAI,WAAY,SAAQ,UAAU,IAAI;AACtC;AAAA,IACF;AACA,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO,OAAO,KAAK,OAAO,EAAE,SAAS,UAAU;AACjD;",
6
+ "names": []
7
+ }