@porulle/core 0.63.0 → 0.65.0

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 (463) hide show
  1. package/dist/adapters/email-render.d.ts +18 -0
  2. package/dist/adapters/email-render.d.ts.map +1 -0
  3. package/dist/adapters/email-render.js +37 -0
  4. package/dist/auth/actor.d.ts.map +1 -1
  5. package/dist/auth/actor.js +11 -0
  6. package/dist/auth/auth-failure.d.ts +0 -2
  7. package/dist/auth/auth-failure.d.ts.map +1 -1
  8. package/dist/auth/auth-failure.js +0 -4
  9. package/dist/auth/middleware.d.ts +0 -1
  10. package/dist/auth/middleware.d.ts.map +1 -1
  11. package/dist/auth/middleware.js +7 -6
  12. package/dist/auth/permissions.d.ts +2 -0
  13. package/dist/auth/permissions.d.ts.map +1 -1
  14. package/dist/auth/permissions.js +8 -6
  15. package/dist/auth/role-authority.d.ts +0 -1
  16. package/dist/auth/role-authority.d.ts.map +1 -1
  17. package/dist/auth/role-authority.js +1 -8
  18. package/dist/auth/setup.d.ts.map +1 -1
  19. package/dist/auth/setup.js +8 -0
  20. package/dist/auth/strict-org-resolution.d.ts +8 -1
  21. package/dist/auth/strict-org-resolution.d.ts.map +1 -1
  22. package/dist/auth/strict-org-resolution.js +9 -19
  23. package/dist/auth/system-actor.d.ts +3 -2
  24. package/dist/auth/system-actor.d.ts.map +1 -1
  25. package/dist/auth/system-actor.js +3 -3
  26. package/dist/config/defaults.d.ts.map +1 -1
  27. package/dist/config/defaults.js +3 -20
  28. package/dist/config/define-config.d.ts +2 -2
  29. package/dist/config/define-config.d.ts.map +1 -1
  30. package/dist/config/define-config.js +3 -2
  31. package/dist/config/types.d.ts +13 -3
  32. package/dist/config/types.d.ts.map +1 -1
  33. package/dist/hooks/checkout.d.ts +2 -15
  34. package/dist/hooks/checkout.d.ts.map +1 -1
  35. package/dist/hooks/checkout.js +2 -51
  36. package/dist/index.d.ts +11 -19
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +11 -12
  39. package/dist/interfaces/rest/router.js +3 -3
  40. package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts.map +1 -1
  41. package/dist/interfaces/rest/routes/admin/compensation-failures.js +5 -5
  42. package/dist/interfaces/rest/routes/admin/entity-field-definitions.js +5 -5
  43. package/dist/interfaces/rest/routes/admin/staff.d.ts.map +1 -1
  44. package/dist/interfaces/rest/routes/admin/staff.js +2 -3
  45. package/dist/interfaces/rest/routes/analytics.d.ts.map +1 -1
  46. package/dist/interfaces/rest/routes/analytics.js +2 -2
  47. package/dist/interfaces/rest/routes/carts.d.ts.map +1 -1
  48. package/dist/interfaces/rest/routes/carts.js +12 -12
  49. package/dist/interfaces/rest/routes/catalog.js +37 -37
  50. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
  51. package/dist/interfaces/rest/routes/checkout.js +9 -10
  52. package/dist/interfaces/rest/routes/customers.d.ts.map +1 -1
  53. package/dist/interfaces/rest/routes/customers.js +12 -12
  54. package/dist/interfaces/rest/routes/documents.d.ts.map +1 -1
  55. package/dist/interfaces/rest/routes/documents.js +9 -9
  56. package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -1
  57. package/dist/interfaces/rest/routes/inventory.js +8 -8
  58. package/dist/interfaces/rest/routes/media.d.ts.map +1 -1
  59. package/dist/interfaces/rest/routes/media.js +5 -5
  60. package/dist/interfaces/rest/routes/orders.d.ts.map +1 -1
  61. package/dist/interfaces/rest/routes/orders.js +32 -32
  62. package/dist/interfaces/rest/routes/payments.d.ts.map +1 -1
  63. package/dist/interfaces/rest/routes/payments.js +2 -2
  64. package/dist/interfaces/rest/routes/pricing.d.ts.map +1 -1
  65. package/dist/interfaces/rest/routes/pricing.js +8 -8
  66. package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -1
  67. package/dist/interfaces/rest/routes/promotions.js +7 -7
  68. package/dist/interfaces/rest/routes/search.d.ts.map +1 -1
  69. package/dist/interfaces/rest/routes/search.js +3 -3
  70. package/dist/interfaces/rest/routes/settings.d.ts.map +1 -1
  71. package/dist/interfaces/rest/routes/settings.js +4 -4
  72. package/dist/interfaces/rest/routes/shipping.d.ts.map +1 -1
  73. package/dist/interfaces/rest/routes/shipping.js +9 -9
  74. package/dist/interfaces/rest/routes/tax.d.ts.map +1 -1
  75. package/dist/interfaces/rest/routes/tax.js +9 -9
  76. package/dist/interfaces/rest/routes/webhooks.d.ts.map +1 -1
  77. package/dist/interfaces/rest/routes/webhooks.js +4 -4
  78. package/dist/interfaces/rest/utils.d.ts +1 -1
  79. package/dist/interfaces/rest/utils.d.ts.map +1 -1
  80. package/dist/interfaces/rest/utils.js +4 -13
  81. package/dist/jobs.d.ts +1 -0
  82. package/dist/jobs.d.ts.map +1 -1
  83. package/dist/jobs.js +1 -0
  84. package/dist/kernel/database/adapter.d.ts +9 -0
  85. package/dist/kernel/database/adapter.d.ts.map +1 -1
  86. package/dist/kernel/database/adapter.js +1 -1
  87. package/dist/kernel/database/migrate.d.ts +0 -4
  88. package/dist/kernel/database/migrate.d.ts.map +1 -1
  89. package/dist/kernel/database/migrate.js +2 -14
  90. package/dist/kernel/database/pglite-transaction.d.ts +28 -0
  91. package/dist/kernel/database/pglite-transaction.d.ts.map +1 -0
  92. package/dist/kernel/database/pglite-transaction.js +52 -0
  93. package/dist/kernel/database/tx-context.d.ts +0 -1
  94. package/dist/kernel/database/tx-context.d.ts.map +1 -1
  95. package/dist/kernel/database/tx-context.js +2 -14
  96. package/dist/kernel/database/unique-violation.d.ts +3 -0
  97. package/dist/kernel/database/unique-violation.d.ts.map +1 -0
  98. package/dist/kernel/database/unique-violation.js +9 -0
  99. package/dist/kernel/error-mapper.d.ts.map +1 -1
  100. package/dist/kernel/error-mapper.js +1 -0
  101. package/dist/kernel/errors.d.ts +12 -0
  102. package/dist/kernel/errors.d.ts.map +1 -1
  103. package/dist/kernel/errors.js +16 -0
  104. package/dist/kernel/hooks/create-context.d.ts +18 -9
  105. package/dist/kernel/hooks/create-context.d.ts.map +1 -1
  106. package/dist/kernel/hooks/create-context.js +24 -3
  107. package/dist/kernel/hooks/registry.d.ts +0 -19
  108. package/dist/kernel/hooks/registry.d.ts.map +1 -1
  109. package/dist/kernel/hooks/registry.js +0 -32
  110. package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -1
  111. package/dist/kernel/jobs/drizzle-adapter.js +3 -10
  112. package/dist/kernel/jobs/prepare-enqueue.d.ts +20 -0
  113. package/dist/kernel/jobs/prepare-enqueue.d.ts.map +1 -0
  114. package/dist/kernel/jobs/prepare-enqueue.js +24 -0
  115. package/dist/kernel/jobs/types.d.ts +0 -4
  116. package/dist/kernel/jobs/types.d.ts.map +1 -1
  117. package/dist/kernel/jobs/types.js +0 -4
  118. package/dist/kernel/local-api.d.ts +0 -33
  119. package/dist/kernel/local-api.d.ts.map +1 -1
  120. package/dist/kernel/local-api.js +0 -36
  121. package/dist/kernel/plugin/manifest.d.ts +3 -5
  122. package/dist/kernel/plugin/manifest.d.ts.map +1 -1
  123. package/dist/modules/analytics/service.d.ts +0 -6
  124. package/dist/modules/analytics/service.d.ts.map +1 -1
  125. package/dist/modules/analytics/service.js +0 -32
  126. package/dist/modules/cart/service.d.ts.map +1 -1
  127. package/dist/modules/cart/service.js +5 -17
  128. package/dist/modules/catalog/entity-service.d.ts.map +1 -1
  129. package/dist/modules/catalog/entity-service.js +9 -17
  130. package/dist/modules/catalog/import-service.d.ts.map +1 -1
  131. package/dist/modules/catalog/import-service.js +4 -13
  132. package/dist/modules/catalog/service.d.ts +1 -81
  133. package/dist/modules/catalog/service.d.ts.map +1 -1
  134. package/dist/modules/catalog/service.js +1 -8
  135. package/dist/modules/customers/service.d.ts.map +1 -1
  136. package/dist/modules/customers/service.js +5 -17
  137. package/dist/modules/documents/render.d.ts +0 -3
  138. package/dist/modules/documents/render.d.ts.map +1 -1
  139. package/dist/modules/documents/render.js +2 -17
  140. package/dist/modules/fulfillment/service.d.ts.map +1 -1
  141. package/dist/modules/fulfillment/service.js +8 -26
  142. package/dist/modules/inventory/service.d.ts.map +1 -1
  143. package/dist/modules/inventory/service.js +3 -20
  144. package/dist/modules/media/service.d.ts.map +1 -1
  145. package/dist/modules/media/service.js +2 -10
  146. package/dist/modules/orders/quote.d.ts.map +1 -1
  147. package/dist/modules/orders/quote.js +1 -2
  148. package/dist/modules/orders/service.d.ts.map +1 -1
  149. package/dist/modules/orders/service.js +4 -17
  150. package/dist/modules/pricing/service.d.ts.map +1 -1
  151. package/dist/modules/pricing/service.js +7 -18
  152. package/dist/modules/promotions/service.d.ts.map +1 -1
  153. package/dist/modules/promotions/service.js +4 -16
  154. package/dist/modules/tax/service.d.ts +1 -3
  155. package/dist/modules/tax/service.d.ts.map +1 -1
  156. package/dist/modules/tax/service.js +16 -52
  157. package/dist/modules/webhooks/hook.d.ts.map +1 -1
  158. package/dist/modules/webhooks/hook.js +3 -2
  159. package/dist/modules/webhooks/service.d.ts.map +1 -1
  160. package/dist/modules/webhooks/service.js +1 -50
  161. package/dist/runtime/commerce.d.ts.map +1 -1
  162. package/dist/runtime/commerce.js +4 -11
  163. package/dist/runtime/kernel-modules.d.ts +38 -1799
  164. package/dist/runtime/kernel-modules.d.ts.map +1 -1
  165. package/dist/runtime/kernel-modules.js +160 -66
  166. package/dist/runtime/kernel-types.d.ts +3 -15
  167. package/dist/runtime/kernel-types.d.ts.map +1 -1
  168. package/dist/runtime/kernel-types.js +0 -10
  169. package/dist/runtime/kernel.d.ts +2 -3
  170. package/dist/runtime/kernel.d.ts.map +1 -1
  171. package/dist/runtime/kernel.js +10 -51
  172. package/dist/runtime/server.d.ts +1 -1
  173. package/dist/runtime/server.d.ts.map +1 -1
  174. package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -1
  175. package/dist/test-utils/create-pglite-adapter.js +5 -62
  176. package/dist/test-utils/create-plugin-test-app.d.ts.map +1 -1
  177. package/dist/test-utils/create-plugin-test-app.js +13 -32
  178. package/dist/test-utils/rest-api-test-utils.d.ts +0 -12
  179. package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -1
  180. package/dist/test-utils/rest-api-test-utils.js +3 -70
  181. package/dist/test-utils/test-actors.d.ts +9 -0
  182. package/dist/test-utils/test-actors.d.ts.map +1 -1
  183. package/dist/test-utils/test-actors.js +62 -0
  184. package/dist/testing.d.ts +1 -4
  185. package/dist/testing.d.ts.map +1 -1
  186. package/dist/testing.js +1 -4
  187. package/dist/utils/escape-html.d.ts +3 -0
  188. package/dist/utils/escape-html.d.ts.map +1 -0
  189. package/dist/utils/escape-html.js +9 -0
  190. package/dist/utils/id.d.ts +0 -1
  191. package/dist/utils/id.d.ts.map +1 -1
  192. package/dist/utils/id.js +0 -3
  193. package/dist/utils/logger.d.ts +1 -1
  194. package/dist/utils/logger.d.ts.map +1 -1
  195. package/dist/utils/logger.js +1 -1
  196. package/dist/utils/money.d.ts +13 -0
  197. package/dist/utils/money.d.ts.map +1 -0
  198. package/dist/utils/money.js +58 -0
  199. package/package.json +5 -6
  200. package/src/adapters/email-render.ts +63 -0
  201. package/src/auth/actor.ts +14 -0
  202. package/src/auth/auth-failure.ts +0 -5
  203. package/src/auth/middleware.ts +7 -6
  204. package/src/auth/permissions.ts +12 -6
  205. package/src/auth/role-authority.ts +1 -10
  206. package/src/auth/setup.ts +11 -0
  207. package/src/auth/strict-org-resolution.ts +9 -16
  208. package/src/auth/system-actor.ts +3 -3
  209. package/src/config/defaults.ts +3 -20
  210. package/src/config/define-config.ts +5 -4
  211. package/src/config/types.ts +13 -2
  212. package/src/hooks/checkout.ts +2 -86
  213. package/src/index.ts +9 -36
  214. package/src/interfaces/rest/router.ts +3 -3
  215. package/src/interfaces/rest/routes/admin/compensation-failures.ts +5 -5
  216. package/src/interfaces/rest/routes/admin/entity-field-definitions.ts +5 -5
  217. package/src/interfaces/rest/routes/admin/staff.ts +2 -3
  218. package/src/interfaces/rest/routes/analytics.ts +2 -2
  219. package/src/interfaces/rest/routes/carts.ts +12 -12
  220. package/src/interfaces/rest/routes/catalog.ts +37 -37
  221. package/src/interfaces/rest/routes/checkout.ts +8 -10
  222. package/src/interfaces/rest/routes/customers.ts +12 -12
  223. package/src/interfaces/rest/routes/documents.ts +9 -9
  224. package/src/interfaces/rest/routes/inventory.ts +8 -8
  225. package/src/interfaces/rest/routes/media.ts +5 -5
  226. package/src/interfaces/rest/routes/orders.ts +32 -32
  227. package/src/interfaces/rest/routes/payments.ts +2 -2
  228. package/src/interfaces/rest/routes/pricing.ts +8 -8
  229. package/src/interfaces/rest/routes/promotions.ts +7 -7
  230. package/src/interfaces/rest/routes/search.ts +3 -3
  231. package/src/interfaces/rest/routes/settings.ts +4 -4
  232. package/src/interfaces/rest/routes/shipping.ts +9 -9
  233. package/src/interfaces/rest/routes/tax.ts +9 -9
  234. package/src/interfaces/rest/routes/webhooks.ts +4 -4
  235. package/src/interfaces/rest/utils.ts +4 -14
  236. package/src/jobs.ts +2 -1
  237. package/src/kernel/database/adapter.ts +1 -1
  238. package/src/kernel/database/migrate.ts +2 -17
  239. package/src/kernel/database/pglite-transaction.ts +61 -0
  240. package/src/kernel/database/tx-context.ts +2 -20
  241. package/src/kernel/database/unique-violation.ts +7 -0
  242. package/src/kernel/error-mapper.ts +1 -0
  243. package/src/kernel/errors.ts +18 -0
  244. package/src/kernel/hooks/create-context.ts +38 -8
  245. package/src/kernel/hooks/registry.ts +0 -37
  246. package/src/kernel/jobs/drizzle-adapter.ts +4 -15
  247. package/src/kernel/jobs/prepare-enqueue.ts +42 -0
  248. package/src/kernel/jobs/types.ts +0 -5
  249. package/src/kernel/local-api.ts +0 -44
  250. package/src/kernel/plugin/manifest.ts +3 -5
  251. package/src/modules/analytics/service.ts +0 -36
  252. package/src/modules/cart/service.ts +6 -29
  253. package/src/modules/catalog/entity-service.ts +9 -19
  254. package/src/modules/catalog/import-service.ts +4 -11
  255. package/src/modules/catalog/service.ts +2 -286
  256. package/src/modules/customers/service.ts +6 -27
  257. package/src/modules/documents/render.ts +2 -19
  258. package/src/modules/fulfillment/service.ts +8 -27
  259. package/src/modules/inventory/service.ts +3 -21
  260. package/src/modules/media/service.ts +2 -8
  261. package/src/modules/orders/quote.ts +1 -2
  262. package/src/modules/orders/service.ts +5 -30
  263. package/src/modules/pricing/service.ts +12 -30
  264. package/src/modules/promotions/service.ts +5 -28
  265. package/src/modules/tax/service.ts +20 -48
  266. package/src/modules/webhooks/hook.ts +3 -2
  267. package/src/modules/webhooks/service.ts +1 -42
  268. package/src/runtime/commerce.ts +4 -11
  269. package/src/runtime/kernel-modules.ts +191 -67
  270. package/src/runtime/kernel-types.ts +3 -26
  271. package/src/runtime/kernel.ts +11 -66
  272. package/src/runtime/server.ts +1 -3
  273. package/src/test-utils/create-pglite-adapter.ts +5 -67
  274. package/src/test-utils/create-plugin-test-app.ts +13 -52
  275. package/src/test-utils/rest-api-test-utils.ts +3 -70
  276. package/src/test-utils/test-actors.ts +66 -0
  277. package/src/testing.ts +1 -3
  278. package/src/utils/escape-html.ts +9 -0
  279. package/src/utils/id.ts +0 -4
  280. package/src/utils/logger.ts +1 -1
  281. package/src/utils/money.ts +62 -0
  282. package/dist/auth/access.d.ts +0 -101
  283. package/dist/auth/access.d.ts.map +0 -1
  284. package/dist/auth/access.js +0 -128
  285. package/dist/generated/plugin-manifest.d.ts +0 -51
  286. package/dist/generated/plugin-manifest.d.ts.map +0 -1
  287. package/dist/generated/plugin-manifest.js +0 -21
  288. package/dist/kernel/factory/repository-factory.d.ts +0 -71
  289. package/dist/kernel/factory/repository-factory.d.ts.map +0 -1
  290. package/dist/kernel/factory/repository-factory.js +0 -138
  291. package/dist/kernel/http-error.d.ts +0 -30
  292. package/dist/kernel/http-error.d.ts.map +0 -1
  293. package/dist/kernel/http-error.js +0 -35
  294. package/dist/kernel/jobs/builtin-job-tasks.d.ts +0 -3
  295. package/dist/kernel/jobs/builtin-job-tasks.d.ts.map +0 -1
  296. package/dist/kernel/jobs/builtin-job-tasks.js +0 -6
  297. package/dist/kernel/module/define.d.ts +0 -21
  298. package/dist/kernel/module/define.d.ts.map +0 -1
  299. package/dist/kernel/module/define.js +0 -3
  300. package/dist/kernel/module/index.d.ts +0 -4
  301. package/dist/kernel/module/index.d.ts.map +0 -1
  302. package/dist/kernel/module/index.js +0 -2
  303. package/dist/kernel/module/topo-sort.d.ts +0 -7
  304. package/dist/kernel/module/topo-sort.d.ts.map +0 -1
  305. package/dist/kernel/module/topo-sort.js +0 -89
  306. package/dist/kernel/query/executor.d.ts +0 -21
  307. package/dist/kernel/query/executor.d.ts.map +0 -1
  308. package/dist/kernel/query/executor.js +0 -128
  309. package/dist/kernel/query/registry.d.ts +0 -33
  310. package/dist/kernel/query/registry.d.ts.map +0 -1
  311. package/dist/kernel/query/registry.js +0 -20
  312. package/dist/kernel/service-registry.d.ts +0 -109
  313. package/dist/kernel/service-registry.d.ts.map +0 -1
  314. package/dist/kernel/service-registry.js +0 -26
  315. package/dist/modules/analytics/hooks.d.ts +0 -13
  316. package/dist/modules/analytics/hooks.d.ts.map +0 -1
  317. package/dist/modules/analytics/hooks.js +0 -12
  318. package/dist/modules/analytics/module.d.ts +0 -3
  319. package/dist/modules/analytics/module.d.ts.map +0 -1
  320. package/dist/modules/analytics/module.js +0 -24
  321. package/dist/modules/analytics/repository/index.d.ts +0 -5
  322. package/dist/modules/analytics/repository/index.d.ts.map +0 -1
  323. package/dist/modules/analytics/repository/index.js +0 -1
  324. package/dist/modules/audit/index.d.ts +0 -2
  325. package/dist/modules/audit/index.d.ts.map +0 -1
  326. package/dist/modules/audit/index.js +0 -1
  327. package/dist/modules/audit/module.d.ts +0 -180
  328. package/dist/modules/audit/module.d.ts.map +0 -1
  329. package/dist/modules/audit/module.js +0 -8
  330. package/dist/modules/cart/access.d.ts +0 -11
  331. package/dist/modules/cart/access.d.ts.map +0 -1
  332. package/dist/modules/cart/access.js +0 -18
  333. package/dist/modules/cart/module.d.ts +0 -14
  334. package/dist/modules/cart/module.d.ts.map +0 -1
  335. package/dist/modules/cart/module.js +0 -17
  336. package/dist/modules/catalog/module.d.ts +0 -26
  337. package/dist/modules/catalog/module.d.ts.map +0 -1
  338. package/dist/modules/catalog/module.js +0 -33
  339. package/dist/modules/customers/index.d.ts +0 -2
  340. package/dist/modules/customers/index.d.ts.map +0 -1
  341. package/dist/modules/customers/index.js +0 -1
  342. package/dist/modules/customers/module.d.ts +0 -563
  343. package/dist/modules/customers/module.d.ts.map +0 -1
  344. package/dist/modules/customers/module.js +0 -20
  345. package/dist/modules/documents/module.d.ts +0 -7
  346. package/dist/modules/documents/module.d.ts.map +0 -1
  347. package/dist/modules/documents/module.js +0 -13
  348. package/dist/modules/fulfillment/module.d.ts +0 -13
  349. package/dist/modules/fulfillment/module.d.ts.map +0 -1
  350. package/dist/modules/fulfillment/module.js +0 -23
  351. package/dist/modules/inventory/module.d.ts +0 -13
  352. package/dist/modules/inventory/module.d.ts.map +0 -1
  353. package/dist/modules/inventory/module.js +0 -20
  354. package/dist/modules/media/index.d.ts +0 -2
  355. package/dist/modules/media/index.d.ts.map +0 -1
  356. package/dist/modules/media/index.js +0 -1
  357. package/dist/modules/media/module.d.ts +0 -360
  358. package/dist/modules/media/module.d.ts.map +0 -1
  359. package/dist/modules/media/module.js +0 -24
  360. package/dist/modules/orders/module.d.ts +0 -25
  361. package/dist/modules/orders/module.d.ts.map +0 -1
  362. package/dist/modules/orders/module.js +0 -33
  363. package/dist/modules/organization/index.d.ts +0 -2
  364. package/dist/modules/organization/index.d.ts.map +0 -1
  365. package/dist/modules/organization/index.js +0 -1
  366. package/dist/modules/organization/module.d.ts +0 -205
  367. package/dist/modules/organization/module.d.ts.map +0 -1
  368. package/dist/modules/organization/module.js +0 -8
  369. package/dist/modules/payments/module.d.ts +0 -3
  370. package/dist/modules/payments/module.d.ts.map +0 -1
  371. package/dist/modules/payments/module.js +0 -7
  372. package/dist/modules/payments/repository/index.d.ts +0 -5
  373. package/dist/modules/payments/repository/index.d.ts.map +0 -1
  374. package/dist/modules/payments/repository/index.js +0 -1
  375. package/dist/modules/pricing/index.d.ts +0 -2
  376. package/dist/modules/pricing/index.d.ts.map +0 -1
  377. package/dist/modules/pricing/index.js +0 -1
  378. package/dist/modules/pricing/module.d.ts +0 -14
  379. package/dist/modules/pricing/module.d.ts.map +0 -1
  380. package/dist/modules/pricing/module.js +0 -17
  381. package/dist/modules/promotions/module.d.ts +0 -14
  382. package/dist/modules/promotions/module.d.ts.map +0 -1
  383. package/dist/modules/promotions/module.js +0 -19
  384. package/dist/modules/search/module.d.ts +0 -8
  385. package/dist/modules/search/module.d.ts.map +0 -1
  386. package/dist/modules/search/module.js +0 -22
  387. package/dist/modules/search/repository/index.d.ts +0 -5
  388. package/dist/modules/search/repository/index.d.ts.map +0 -1
  389. package/dist/modules/search/repository/index.js +0 -1
  390. package/dist/modules/settings/module.d.ts +0 -6
  391. package/dist/modules/settings/module.d.ts.map +0 -1
  392. package/dist/modules/settings/module.js +0 -12
  393. package/dist/modules/shipping/module.d.ts +0 -12
  394. package/dist/modules/shipping/module.d.ts.map +0 -1
  395. package/dist/modules/shipping/module.js +0 -14
  396. package/dist/modules/tax/module.d.ts +0 -7
  397. package/dist/modules/tax/module.d.ts.map +0 -1
  398. package/dist/modules/tax/module.js +0 -13
  399. package/dist/modules/webhooks/index.d.ts +0 -2
  400. package/dist/modules/webhooks/index.d.ts.map +0 -1
  401. package/dist/modules/webhooks/index.js +0 -1
  402. package/dist/modules/webhooks/module.d.ts +0 -403
  403. package/dist/modules/webhooks/module.d.ts.map +0 -1
  404. package/dist/modules/webhooks/module.js +0 -16
  405. package/dist/test-utils/create-repository-test-harness.d.ts +0 -8
  406. package/dist/test-utils/create-repository-test-harness.d.ts.map +0 -1
  407. package/dist/test-utils/create-repository-test-harness.js +0 -7
  408. package/dist/test-utils/create-test-plugin-context.d.ts +0 -38
  409. package/dist/test-utils/create-test-plugin-context.d.ts.map +0 -1
  410. package/dist/test-utils/create-test-plugin-context.js +0 -39
  411. package/dist/test-utils/typed-hooks.d.ts +0 -44
  412. package/dist/test-utils/typed-hooks.d.ts.map +0 -1
  413. package/dist/test-utils/typed-hooks.js +0 -36
  414. package/dist/types/commerce-types.d.ts +0 -34
  415. package/dist/types/commerce-types.d.ts.map +0 -1
  416. package/dist/types/commerce-types.js +0 -1
  417. package/src/auth/access.ts +0 -187
  418. package/src/generated/plugin-capabilities.d.ts +0 -21
  419. package/src/generated/plugin-manifest.ts +0 -24
  420. package/src/generated/plugin-repositories.d.ts +0 -21
  421. package/src/kernel/factory/repository-factory.ts +0 -244
  422. package/src/kernel/http-error.ts +0 -44
  423. package/src/kernel/jobs/builtin-job-tasks.ts +0 -17
  424. package/src/kernel/module/define.ts +0 -36
  425. package/src/kernel/module/index.ts +0 -3
  426. package/src/kernel/module/topo-sort.ts +0 -99
  427. package/src/kernel/query/executor.ts +0 -184
  428. package/src/kernel/query/registry.ts +0 -46
  429. package/src/kernel/service-registry.ts +0 -76
  430. package/src/modules/analytics/hooks.ts +0 -11
  431. package/src/modules/analytics/module.ts +0 -35
  432. package/src/modules/analytics/repository/index.ts +0 -5
  433. package/src/modules/audit/index.ts +0 -1
  434. package/src/modules/audit/module.ts +0 -11
  435. package/src/modules/cart/access.ts +0 -27
  436. package/src/modules/cart/module.ts +0 -32
  437. package/src/modules/catalog/module.ts +0 -80
  438. package/src/modules/customers/index.ts +0 -1
  439. package/src/modules/customers/module.ts +0 -29
  440. package/src/modules/documents/module.ts +0 -21
  441. package/src/modules/fulfillment/module.ts +0 -44
  442. package/src/modules/inventory/module.ts +0 -37
  443. package/src/modules/media/index.ts +0 -1
  444. package/src/modules/media/module.ts +0 -27
  445. package/src/modules/orders/module.ts +0 -67
  446. package/src/modules/organization/index.ts +0 -1
  447. package/src/modules/organization/module.ts +0 -11
  448. package/src/modules/payments/module.ts +0 -14
  449. package/src/modules/payments/repository/index.ts +0 -5
  450. package/src/modules/pricing/index.ts +0 -1
  451. package/src/modules/pricing/module.ts +0 -32
  452. package/src/modules/promotions/module.ts +0 -34
  453. package/src/modules/search/module.ts +0 -32
  454. package/src/modules/search/repository/index.ts +0 -5
  455. package/src/modules/settings/module.ts +0 -20
  456. package/src/modules/shipping/module.ts +0 -27
  457. package/src/modules/tax/module.ts +0 -21
  458. package/src/modules/webhooks/index.ts +0 -1
  459. package/src/modules/webhooks/module.ts +0 -24
  460. package/src/test-utils/create-repository-test-harness.ts +0 -16
  461. package/src/test-utils/create-test-plugin-context.ts +0 -66
  462. package/src/test-utils/typed-hooks.ts +0 -55
  463. package/src/types/commerce-types.ts +0 -34
@@ -5,48 +5,7 @@ import { CommerceNotFoundError, CommerceValidationError } from "../../kernel/err
5
5
  import { Err, Ok, type Result } from "../../kernel/result.js";
6
6
  import type { TxContext } from "../../kernel/database/tx-context.js";
7
7
  import type { WebhooksRepository, WebhookEndpoint } from "./repository/index.js";
8
-
9
- /**
10
- * Checks whether a URL points to a private/internal IP address.
11
- * Blocks: loopback (127.x), link-local (169.254.x), private (10.x, 172.16-31.x, 192.168.x),
12
- * cloud metadata (169.254.169.254, metadata.google.internal), and localhost.
13
- */
14
- function isPrivateUrl(urlStr: string): boolean {
15
- try {
16
- const parsed = new URL(urlStr);
17
- // Strip IPv6 brackets: URL.hostname returns "[::1]" not "::1"
18
- const hostname = parsed.hostname.toLowerCase().replace(/^\[|\]$/g, "");
19
-
20
- // Loopback (IPv4 + IPv6)
21
- if (hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1") return true;
22
- if (hostname.endsWith(".localhost")) return true;
23
-
24
- // IPv6 loopback and link-local patterns
25
- if (hostname.startsWith("::ffff:")) return true; // IPv6-mapped IPv4 (e.g., ::ffff:127.0.0.1)
26
- if (hostname.startsWith("fe80:")) return true; // IPv6 link-local
27
- if (hostname === "::") return true; // Unspecified address
28
-
29
- // Cloud metadata endpoints
30
- if (hostname === "169.254.169.254") return true;
31
- if (hostname === "metadata.google.internal") return true;
32
-
33
- // Private IP ranges (RFC 1918 + link-local)
34
- const parts = hostname.split(".").map(Number);
35
- if (parts.length === 4 && parts.every((n) => !isNaN(n))) {
36
- const [a, b] = parts;
37
- if (a === 10) return true;
38
- if (a === 172 && b !== undefined && b >= 16 && b <= 31) return true;
39
- if (a === 192 && b === 168) return true;
40
- if (a === 169 && b === 254) return true;
41
- if (a === 127) return true; // Full 127.0.0.0/8 range
42
- if (a === 0) return true;
43
- }
44
-
45
- return false;
46
- } catch {
47
- return true; // Invalid URLs are blocked
48
- }
49
- }
8
+ import { isPrivateUrl } from "./ssrf-guard.js";
50
9
 
51
10
  interface WebhookServiceDeps {
52
11
  repository: WebhooksRepository;
@@ -3,8 +3,7 @@ import type { CommerceConfig } from "../config/types.js";
3
3
  import type { Kernel } from "./kernel.js";
4
4
  import { createKernel } from "./kernel.js";
5
5
  import { pushSchema } from "../kernel/database/migrate.js";
6
- import { ensureDefaultOrg, setBootDefaultOrgId } from "../auth/org.js";
7
- import { setBootStrictOrgResolution } from "../auth/strict-org-resolution.js";
6
+ import { ensureDefaultOrg } from "../auth/org.js";
8
7
  import { createAuth, type AuthInstance } from "../auth/setup.js";
9
8
  import { createLogger, type Logger } from "./logger.js";
10
9
  import { createLocalAPI, type CommerceLocalAPI, type LocalAPIOptions } from "../kernel/local-api.js";
@@ -132,15 +131,9 @@ export async function createCommerce(
132
131
  await pushSchema(kernel.database.db, config);
133
132
  }
134
133
 
135
- setBootStrictOrgResolution(config.auth?.strictOrgResolution === true);
136
-
137
- // Register the config-driven org ID so resolveOrgId() can use it
138
- // without requiring every service to have config access.
139
- if (config.auth?.defaultOrganizationId) {
140
- setBootDefaultOrgId(config.auth.defaultOrganizationId);
141
- } else {
142
- // Legacy fallback: auto-create org_default for deployments
143
- // that haven't migrated to seed-based org creation yet.
134
+ // createKernel registered a configured default organization; without one,
135
+ // create org_default for deployments that have not seeded their own.
136
+ if (!config.auth?.defaultOrganizationId) {
144
137
  await ensureDefaultOrg(kernel.database.db, config.storeName);
145
138
  }
146
139
 
@@ -1,70 +1,194 @@
1
- import type { AppModule } from "../kernel/module/index.js";
2
- import { topoSortModules } from "../kernel/module/index.js";
3
- import { auditModule } from "../modules/audit/index.js";
4
- import { analyticsModule } from "../modules/analytics/module.js";
5
- import { cartModule } from "../modules/cart/module.js";
6
- import { catalogModule } from "../modules/catalog/module.js";
7
- import { customersModule } from "../modules/customers/index.js";
8
- import { documentsModule } from "../modules/documents/module.js";
9
- import { fulfillmentModule } from "../modules/fulfillment/module.js";
10
- import { inventoryModule } from "../modules/inventory/module.js";
11
- import { mediaModule } from "../modules/media/index.js";
12
- import { ordersModule } from "../modules/orders/module.js";
13
- import { organizationModule } from "../modules/organization/index.js";
14
- import { paymentsModule } from "../modules/payments/module.js";
15
- import { pricingModule } from "../modules/pricing/index.js";
16
- import { promotionsModule } from "../modules/promotions/module.js";
17
- import { searchModule } from "../modules/search/module.js";
18
- import { settingsModule } from "../modules/settings/module.js";
19
- import { shippingModule } from "../modules/shipping/module.js";
20
- import { taxModule } from "../modules/tax/module.js";
21
- import { webhooksModule } from "../modules/webhooks/index.js";
1
+ import type { CommerceConfig } from "../config/types.js";
2
+ import type { DatabaseAdapter } from "../kernel/database/adapter.js";
3
+ import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
4
+ import type { PluginDb } from "../kernel/database/plugin-types.js";
5
+ import type { HookRegistry } from "../kernel/hooks/registry.js";
6
+ import { extendOrderStateMachine } from "../kernel/state-machine/machine.js";
7
+ import { DrizzleAnalyticsAdapter } from "../modules/analytics/drizzle-adapter.js";
8
+ import { BUILTIN_ANALYTICS_MODELS } from "../modules/analytics/models.js";
9
+ import { RetailReportsEngine } from "../modules/analytics/reports.js";
10
+ import { AnalyticsService } from "../modules/analytics/service.js";
11
+ import { createAuditService } from "../modules/audit/service.js";
12
+ import { CartRepository } from "../modules/cart/repository/index.js";
13
+ import { CartService } from "../modules/cart/service.js";
14
+ import { CatalogRepository } from "../modules/catalog/repository/index.js";
15
+ import { CatalogServiceImpl } from "../modules/catalog/service.js";
16
+ import { CustomersRepository } from "../modules/customers/repository/index.js";
17
+ import { CustomerService } from "../modules/customers/service.js";
18
+ import { DocumentsRepository } from "../modules/documents/repository/index.js";
19
+ import { DocumentsService } from "../modules/documents/service.js";
20
+ import { FulfillmentRepository } from "../modules/fulfillment/repository/index.js";
21
+ import { FulfillmentService } from "../modules/fulfillment/service.js";
22
+ import { InventoryRepository } from "../modules/inventory/repository/index.js";
23
+ import { InventoryService } from "../modules/inventory/service.js";
24
+ import { MediaRepository } from "../modules/media/repository/index.js";
25
+ import { MediaService } from "../modules/media/service.js";
26
+ import { OrdersRepository } from "../modules/orders/repository/index.js";
27
+ import { OrderService } from "../modules/orders/service.js";
28
+ import { OrganizationService } from "../modules/organization/service.js";
29
+ import { PaymentsService } from "../modules/payments/service.js";
30
+ import { PricingRepository } from "../modules/pricing/repository/index.js";
31
+ import { PricingService } from "../modules/pricing/service.js";
32
+ import { PromotionsRepository } from "../modules/promotions/repository/index.js";
33
+ import { PromotionService } from "../modules/promotions/service.js";
34
+ import { SearchService } from "../modules/search/service.js";
35
+ import { SettingsRepository } from "../modules/settings/repository/index.js";
36
+ import { SettingsService } from "../modules/settings/service.js";
37
+ import { ShippingConfigRepository } from "../modules/shipping/repository/index.js";
38
+ import { ShippingService } from "../modules/shipping/service.js";
39
+ import { TaxRatesRepository } from "../modules/tax/repository/index.js";
40
+ import { TaxService } from "../modules/tax/service.js";
41
+ import { WebhooksRepository } from "../modules/webhooks/repository/index.js";
42
+ import { WebhookService } from "../modules/webhooks/service.js";
22
43
 
23
- export const KERNEL_ALL_MODULES = {
24
- audit: auditModule,
25
- settings: settingsModule,
26
- documents: documentsModule,
27
- webhooks: webhooksModule,
28
- media: mediaModule,
29
- organization: organizationModule,
30
- customers: customersModule,
31
- pricing: pricingModule,
32
- catalog: catalogModule,
33
- inventory: inventoryModule,
34
- cart: cartModule,
35
- orders: ordersModule,
36
- fulfillment: fulfillmentModule,
37
- promotions: promotionsModule,
38
- search: searchModule,
39
- shipping: shippingModule,
40
- tax: taxModule,
41
- payments: paymentsModule,
42
- analytics: analyticsModule,
43
- } as const;
44
-
45
- /** Strip symmetric/lazy manifest edges so topo sort reflects constructor-safe ordering. */
46
- export function kernelModulesForTopoSort(): Record<string, AppModule> {
47
- return {
48
- ...KERNEL_ALL_MODULES,
49
- catalog: { ...catalogModule, dependencies: [] },
50
- promotions: {
51
- ...promotionsModule,
52
- dependencies: ["catalog"],
53
- },
54
- orders: {
55
- ...ordersModule,
56
- dependencies: [
57
- "cart",
58
- "inventory",
59
- "payments",
60
- "pricing",
61
- "fulfillment",
62
- "tax",
63
- ],
64
- },
65
- } as unknown as Record<string, AppModule>;
44
+ /** What every core service factory is built from. */
45
+ export interface ServiceFactoryDeps {
46
+ database: DatabaseAdapter;
47
+ db: DrizzleDatabase;
48
+ hooks: HookRegistry;
49
+ config: CommerceConfig;
50
+ /** The services built so far, in the order below. A factory may read only those above it. */
51
+ services: Record<string, unknown>;
66
52
  }
67
53
 
68
- export function kernelModuleInstantiationOrder(): readonly string[] {
69
- return topoSortModules(kernelModulesForTopoSort());
70
- }
54
+ type Built = {
55
+ catalog: CatalogServiceImpl;
56
+ inventory: InventoryService;
57
+ settings: SettingsService;
58
+ };
59
+
60
+ const built = (deps: ServiceFactoryDeps) => deps.services as Built;
61
+
62
+ /**
63
+ * The core services, in the order the kernel constructs them. A factory that
64
+ * reads another service at construction (catalog's repository, the inventory
65
+ * service) must come after it; services reached only at call time through
66
+ * `deps.services` may sit anywhere.
67
+ */
68
+ export const KERNEL_SERVICE_FACTORIES = [
69
+ ["audit", (d: ServiceFactoryDeps) => createAuditService(d.db)],
70
+ ["settings", (d: ServiceFactoryDeps) =>
71
+ new SettingsService({ repository: new SettingsRepository(d.db), config: d.config })],
72
+ ["documents", (d: ServiceFactoryDeps) =>
73
+ new DocumentsService({ repository: new DocumentsRepository(d.db), services: d.services, config: d.config })],
74
+ ["webhooks", (d: ServiceFactoryDeps) =>
75
+ new WebhookService({ repository: new WebhooksRepository(d.db), config: d.config })],
76
+ ["media", (d: ServiceFactoryDeps) => {
77
+ if (d.config.storage == null) throw new Error("Media module requires config.storage");
78
+ return new MediaService({
79
+ repository: new MediaRepository(d.db),
80
+ catalogRepository: new CatalogRepository(d.db),
81
+ storage: d.config.storage,
82
+ config: d.config,
83
+ database: d.database,
84
+ services: d.services,
85
+ });
86
+ }],
87
+ ["organization", (d: ServiceFactoryDeps) => new OrganizationService(d.db)],
88
+ ["customers", (d: ServiceFactoryDeps) =>
89
+ new CustomerService({
90
+ repository: new CustomersRepository(d.db),
91
+ hooks: d.hooks,
92
+ config: d.config,
93
+ services: d.services,
94
+ database: d.database,
95
+ })],
96
+ ["catalog", (d: ServiceFactoryDeps) =>
97
+ new CatalogServiceImpl({
98
+ repository: new CatalogRepository(d.db),
99
+ hooks: d.hooks,
100
+ config: d.config,
101
+ services: d.services,
102
+ database: d.database,
103
+ })],
104
+ ["tax", (d: ServiceFactoryDeps) =>
105
+ new TaxService({
106
+ adapter: d.config.tax?.adapter,
107
+ repository: new TaxRatesRepository(d.db),
108
+ config: d.config,
109
+ })],
110
+ ["payments", (d: ServiceFactoryDeps) => new PaymentsService(d.config.payments)],
111
+ ["analytics", (d: ServiceFactoryDeps) => {
112
+ const adapter = new DrizzleAnalyticsAdapter(d.db);
113
+ for (const model of BUILTIN_ANALYTICS_MODELS) adapter.registerModel(model);
114
+ // Settings is read at call time, not construction.
115
+ const reports = new RetailReportsEngine(d.db, (orgId, group) => built(d).settings.read(orgId, group));
116
+ return new AnalyticsService({ adapter, config: d.config, reports });
117
+ }],
118
+ ["pricing", (d: ServiceFactoryDeps) =>
119
+ new PricingService({
120
+ repository: new PricingRepository(d.db),
121
+ catalogRepository: built(d).catalog.repository,
122
+ hooks: d.hooks,
123
+ config: d.config,
124
+ services: d.services,
125
+ database: d.database,
126
+ })],
127
+ ["inventory", (d: ServiceFactoryDeps) =>
128
+ new InventoryService({
129
+ repository: new InventoryRepository(d.db),
130
+ hooks: d.hooks,
131
+ config: d.config,
132
+ services: d.services,
133
+ database: d.database,
134
+ })],
135
+ ["promotions", (d: ServiceFactoryDeps) =>
136
+ new PromotionService({
137
+ repository: new PromotionsRepository(d.db),
138
+ catalogRepository: built(d).catalog.repository,
139
+ ordersRepository: new OrdersRepository(d.db),
140
+ hooks: d.hooks,
141
+ config: d.config,
142
+ services: d.services,
143
+ database: d.database,
144
+ })],
145
+ ["search", (d: ServiceFactoryDeps) => {
146
+ const adapter = d.config.search?.adapter;
147
+ adapter?.init?.({ db: d.db as PluginDb });
148
+ const catalog = built(d).catalog;
149
+ return new SearchService({
150
+ catalogRepository: catalog.repository,
151
+ resolveEntityFieldDefinitions: catalog.resolveEntityFieldDefinitions.bind(catalog),
152
+ config: d.config,
153
+ ...(d.config.entities ? { entities: d.config.entities } : {}),
154
+ ...(adapter ? { adapter } : {}),
155
+ ...(d.config.search?.defaultFacets ? { defaultFacets: d.config.search.defaultFacets } : {}),
156
+ });
157
+ }],
158
+ ["shipping", (d: ServiceFactoryDeps) =>
159
+ new ShippingService({
160
+ config: d.config,
161
+ catalogRepository: built(d).catalog.repository,
162
+ repository: new ShippingConfigRepository(d.db),
163
+ })],
164
+ ["cart", (d: ServiceFactoryDeps) =>
165
+ new CartService({
166
+ repository: new CartRepository(d.db),
167
+ catalogRepository: built(d).catalog.repository,
168
+ hooks: d.hooks,
169
+ config: d.config,
170
+ services: d.services,
171
+ database: d.database,
172
+ })],
173
+ ["fulfillment", (d: ServiceFactoryDeps) =>
174
+ new FulfillmentService({
175
+ repository: new FulfillmentRepository(d.db),
176
+ ordersRepository: new OrdersRepository(d.db),
177
+ inventoryService: built(d).inventory,
178
+ hooks: d.hooks,
179
+ config: d.config,
180
+ services: d.services,
181
+ database: d.database,
182
+ })],
183
+ ["orders", (d: ServiceFactoryDeps) =>
184
+ new OrderService({
185
+ repository: new OrdersRepository(d.db),
186
+ hooks: d.hooks,
187
+ config: d.config,
188
+ services: d.services,
189
+ database: d.database,
190
+ ...(d.config.orders?.customTransitions
191
+ ? { stateMachine: extendOrderStateMachine(d.config.orders.customTransitions) }
192
+ : {}),
193
+ })],
194
+ ] as const;
@@ -24,14 +24,9 @@ import { SettingsService } from "../modules/settings/service.js";
24
24
  import { DocumentsService } from "../modules/documents/service.js";
25
25
  import type { AuditService } from "../modules/audit/service.js";
26
26
  import { OrganizationService } from "../modules/organization/service.js";
27
- import { createLogger } from "../utils/logger.js";
27
+ import { createConsoleLogger } from "../utils/logger.js";
28
28
  import { CompensationFailuresRepository } from "../kernel/compensation/repository.js";
29
29
 
30
- export interface WebhookDeliveryPayload {
31
- endpoint: { id: string; url: string; secret: string };
32
- eventName: string;
33
- payload: unknown;
34
- }
35
30
 
36
31
  export interface Kernel {
37
32
  config: CommerceConfig;
@@ -46,9 +41,7 @@ export interface Kernel {
46
41
  payments: PaymentsService;
47
42
  fulfillment: FulfillmentService;
48
43
  customers: CustomerService;
49
- webhooks: WebhookService & {
50
- enqueueDelivery(payload: WebhookDeliveryPayload): Promise<void>;
51
- };
44
+ webhooks: WebhookService;
52
45
  analytics: AnalyticsService;
53
46
  pricing: PricingService;
54
47
  promotions: PromotionService;
@@ -63,7 +56,7 @@ export interface Kernel {
63
56
  organization: OrganizationService;
64
57
  };
65
58
  pluginPermissions: PluginPermission[];
66
- logger: ReturnType<typeof createLogger>;
59
+ logger: ReturnType<typeof createConsoleLogger>;
67
60
  }
68
61
 
69
62
  export interface ConfigRouteDatabase extends DatabaseAdapter {
@@ -106,19 +99,3 @@ export function assertKernelServicesReady(
106
99
  }
107
100
  }
108
101
 
109
- export function assertSortedBefore(
110
- topo: readonly string[],
111
- a: string,
112
- b: string,
113
- ): void {
114
- const ia = topo.indexOf(a);
115
- const ib = topo.indexOf(b);
116
- if (ia < 0 || ib < 0) {
117
- throw new Error(`kernelModuleInstantiationOrder missing key: ${a} or ${b}`);
118
- }
119
- if (ia >= ib) {
120
- throw new Error(
121
- `Invalid kernel topo order: expected "${a}" before "${b}" (indices ${ia}, ${ib})`,
122
- );
123
- }
124
- }
@@ -2,47 +2,30 @@ import type { CommerceConfig } from "../config/types.js";
2
2
  import { HookRegistry, isHookMarkedInTransaction, type HookHandler } from "../kernel/hooks/registry.js";
3
3
  import { createDatabaseConnection } from "../kernel/database/adapter.js";
4
4
  import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
5
- import type { AppModule } from "../kernel/module/index.js";
6
- import { topoSortModules } from "../kernel/module/index.js";
7
- import { WebhookDeliveryWorker } from "../modules/webhooks/worker.js";
8
- import { WebhooksRepository } from "../modules/webhooks/repository/index.js";
9
- import { createLogger } from "../utils/logger.js";
5
+ import { createConsoleLogger } from "../utils/logger.js";
10
6
  import { withTiming } from "../kernel/service-timing.js";
11
7
  import { setBootDefaultOrgId } from "../auth/org.js";
12
- import { setBootStrictOrgResolution } from "../auth/strict-org-resolution.js";
13
8
  import { DrizzleJobsAdapter } from "../kernel/jobs/drizzle-adapter.js";
14
9
  import type { ExecutionEngine } from "../kernel/jobs/adapter.js";
15
10
  import { CompensationFailuresRepository } from "../kernel/compensation/repository.js";
16
11
 
17
- import {
18
- KERNEL_ALL_MODULES,
19
- kernelModulesForTopoSort,
20
- } from "./kernel-modules.js";
12
+ import { KERNEL_SERVICE_FACTORIES } from "./kernel-modules.js";
21
13
  import { registerConfiguredKernelHooks } from "./kernel-register-hooks.js";
22
14
  import {
23
15
  assertKernelServicesReady,
24
- assertSortedBefore,
25
16
  type Kernel,
26
- type WebhookDeliveryPayload,
27
17
  } from "./kernel-types.js";
28
18
 
29
- export type { Kernel, WebhookDeliveryPayload };
19
+ export type { Kernel };
30
20
  export type { ConfigRouteKernel, ConfigRouteDatabase } from "./kernel-types.js";
31
- export {
32
- KERNEL_ALL_MODULES,
33
- kernelModuleInstantiationOrder,
34
- } from "./kernel-modules.js";
35
21
 
36
22
  export function createKernel(config: CommerceConfig): Kernel {
37
23
  const hooks = new HookRegistry();
38
- const logger = createLogger("kernel");
39
- hooks.setLogger({ error: (obj, msg) => logger.error(msg, obj) });
40
-
41
- // Apply boot-time org resolution settings from config. Previously only
42
- // createCommerce did this, which meant tests calling createKernel directly
43
- // had services fall back to DEFAULT_ORG_ID with a deprecation warning even
44
- // when config.auth.defaultOrganizationId was set.
45
- setBootStrictOrgResolution(config.auth?.strictOrgResolution === true);
24
+ const logger = createConsoleLogger("kernel");
25
+
26
+ // Register the configured default organization for resolveOrgId(). Done here
27
+ // rather than only in createCommerce so tests calling createKernel directly
28
+ // see it too.
46
29
  if (config.auth?.defaultOrganizationId) {
47
30
  setBootDefaultOrgId(config.auth.defaultOrganizationId);
48
31
  }
@@ -76,57 +59,19 @@ export function createKernel(config: CommerceConfig): Kernel {
76
59
  );
77
60
  const jobsEngine: ExecutionEngine =
78
61
  config.jobs?.adapter ?? new DrizzleJobsAdapter(db);
79
- const jobLogger = {
80
- info: (message: string, data?: unknown) => logger.info(message, data),
81
- warn: (message: string, data?: unknown) => logger.warn(message, data),
82
- error: (message: string, data?: unknown) => logger.error(message, data),
83
- };
84
62
  jobsEngine.register({
85
63
  tasks: jobsTaskMap,
86
- context: { logger: jobLogger, db, services: serviceContainer },
64
+ context: { logger, db, services: serviceContainer },
87
65
  ...(config.jobs?.processingOrder !== undefined
88
66
  ? { processingOrder: config.jobs.processingOrder }
89
67
  : {}),
90
68
  });
91
69
  serviceContainer.jobs = jobsEngine;
92
70
 
93
- const topoGraph = kernelModulesForTopoSort();
94
- const order = topoSortModules(topoGraph);
95
- const moduleKeys = Object.keys(KERNEL_ALL_MODULES);
96
- if (order.length !== moduleKeys.length) {
97
- throw new Error(
98
- `topoSortModules length mismatch: got ${order.length}, expected ${moduleKeys.length}`,
99
- );
100
- }
101
- assertSortedBefore(order, "catalog", "inventory");
102
- assertSortedBefore(order, "catalog", "pricing");
103
-
104
- const moduleDeps = {
105
- db: database,
106
- hooks,
107
- config,
108
- logger,
109
- };
110
-
111
- for (const id of order) {
112
- const mod = KERNEL_ALL_MODULES[id as keyof typeof KERNEL_ALL_MODULES];
113
- const svc = (mod as AppModule<unknown, unknown, Record<string, unknown>>).service({
114
- ...moduleDeps,
115
- services: services as Record<string, unknown>,
116
- });
117
- (services as Record<string, unknown>)[id] = svc;
71
+ for (const [id, create] of KERNEL_SERVICE_FACTORIES) {
72
+ serviceContainer[id] = create({ database, db, hooks, config, services: serviceContainer });
118
73
  }
119
74
 
120
- const baseWebhooks = services.webhooks!;
121
- const webhookWorker = new WebhookDeliveryWorker({
122
- repository: new WebhooksRepository(db),
123
- });
124
- services.webhooks = Object.assign(baseWebhooks, {
125
- async enqueueDelivery(payload: WebhookDeliveryPayload) {
126
- await webhookWorker.deliver(payload);
127
- },
128
- });
129
-
130
75
  services.compensationFailures = new CompensationFailuresRepository(db);
131
76
 
132
77
  assertKernelServicesReady(services);
@@ -17,9 +17,7 @@ import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
17
17
  import { CommerceCsrfError } from "../kernel/errors.js";
18
18
  import { createRestRoutes } from "../interfaces/rest/index.js";
19
19
  import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal.js";
20
- import { createKernel } from "./kernel.js";
21
- import { ensureDefaultOrg } from "../auth/org.js";
22
- import { createLogger, type Logger } from "./logger.js";
20
+ import type { Logger } from "./logger.js";
23
21
  import { createCommerce, type CommerceInstance } from "./commerce.js";
24
22
  import { rewriteCommerceAliasRequest } from "./url-alias-rewrite.js";
25
23
  import { mapErrorToResponse } from "../kernel/error-mapper.js";
@@ -15,9 +15,9 @@
15
15
  import { PGlite } from "@electric-sql/pglite";
16
16
  import { drizzle } from "drizzle-orm/pglite";
17
17
  import { sql } from "drizzle-orm";
18
- import { createRequire } from "node:module";
19
18
  import type { DatabaseAdapter } from "../kernel/database/adapter.js";
20
- import { getSchema } from "../kernel/database/migrate.js";
19
+ import { createPGliteTransaction } from "../kernel/database/pglite-transaction.js";
20
+ import { pushSchema } from "../kernel/database/migrate.js";
21
21
  import { ensureDefaultOrg } from "../auth/org.js";
22
22
 
23
23
  // Single barrel import --- includes all core modules + auth tables
@@ -39,29 +39,6 @@ export interface QueryLog {
39
39
  stop(): string[];
40
40
  }
41
41
 
42
- // drizzle-kit/api uses CJS internally; createRequire provides ESM compat.
43
- const require = createRequire(import.meta.url);
44
-
45
- /**
46
- * Pushes the core Drizzle schema to the database using drizzle-kit/api.
47
- *
48
- * drizzle-kit introspects the live database via information_schema, diffs
49
- * against the pgTable definitions, and generates the minimal DDL needed.
50
- * Typed as DrizzleDatabase (our concrete schema type) to avoid the
51
- * PGlite → PgDatabase<HKT> invariance cast — drizzle-kit accepts any
52
- * Drizzle instance at runtime regardless of the schema generic.
53
- */
54
- async function pushCoreSchema(db: DrizzleDatabase): Promise<void> {
55
- const coreSchema = getSchema();
56
- const drizzleKit = require("drizzle-kit/api") as {
57
- pushSchema(
58
- imports: Record<string, unknown>,
59
- drizzleInstance: DrizzleDatabase,
60
- ): Promise<{ apply: () => Promise<void> }>;
61
- };
62
- const { apply } = await drizzleKit.pushSchema(coreSchema, db);
63
- await apply();
64
- }
65
42
 
66
43
  /**
67
44
  * Creates a PGlite-backed database adapter for testing.
@@ -117,51 +94,12 @@ export async function createPGliteTestAdapter(): Promise<{
117
94
  // PgliteDatabase<Schema> and DrizzleDatabase share the same Schema type;
118
95
  // the HKT parameter differs (PgliteQueryResultHKT vs PgQueryResultHKT)
119
96
  // but drizzle-kit's pushSchema doesn't use it at runtime.
120
- await pushCoreSchema(db as DrizzleDatabase);
97
+ await pushSchema(db);
121
98
 
122
99
  // Ensure the default organization exists for all tests
123
100
  await ensureDefaultOrg(db);
124
101
 
125
- /**
126
- * PGlite-compatible transaction wrapper.
127
- *
128
- * Drizzle's transaction() method can hang with PGlite due to how the adapter
129
- * manages transaction state, so this drives BEGIN/COMMIT manually.
130
- *
131
- * PGlite is a single connection, so two transaction bodies awaiting
132
- * concurrently would otherwise interleave their statements between one
133
- * BEGIN and one COMMIT — the second BEGIN is a no-op Postgres only warns
134
- * about. Merged that way, two callers share a snapshot and hold each other's
135
- * row locks, so an isolation bug reads as if the guard failed. Bodies are
136
- * queued instead, which is what a connection pool would do to two
137
- * transactions competing for the same rows.
138
- *
139
- * A nested call joins the transaction already open rather than deadlocking
140
- * on the queue; without savepoints that is the only sound reading.
141
- */
142
- let transactionQueue: Promise<unknown> = Promise.resolve();
143
- let inTransaction = false;
144
-
145
- async function transaction<T>(fn: (tx: unknown) => Promise<T>): Promise<T> {
146
- if (inTransaction) return fn(db);
147
-
148
- const run = transactionQueue.then(async () => {
149
- inTransaction = true;
150
- await pg.exec("BEGIN");
151
- try {
152
- const result = await fn(db);
153
- await pg.exec("COMMIT");
154
- return result;
155
- } catch (error) {
156
- await pg.exec("ROLLBACK");
157
- throw error;
158
- } finally {
159
- inTransaction = false;
160
- }
161
- });
162
- transactionQueue = run.catch(() => undefined);
163
- return run as Promise<T>;
164
- }
102
+ const { transaction, inTransaction } = createPGliteTransaction(pg, db);
165
103
 
166
104
  const adapter: DatabaseAdapter & { inTransaction(): boolean } = {
167
105
  provider: "postgresql",
@@ -181,7 +119,7 @@ export async function createPGliteTestAdapter(): Promise<{
181
119
  * Test-utils only. Production adapters do not carry it, and nothing outside a test may branch
182
120
  * on it — a behaviour that depends on this flag would be a behaviour no production adapter has.
183
121
  */
184
- inTransaction: () => inTransaction,
122
+ inTransaction,
185
123
  };
186
124
 
187
125
  /**