@porulle/core 0.1.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 (864) hide show
  1. package/README.md +56 -0
  2. package/dist/adapters/console-email.d.ts +23 -0
  3. package/dist/adapters/console-email.d.ts.map +1 -0
  4. package/dist/adapters/console-email.js +38 -0
  5. package/dist/auth/access.d.ts +101 -0
  6. package/dist/auth/access.d.ts.map +1 -0
  7. package/dist/auth/access.js +128 -0
  8. package/dist/auth/auth-schema.d.ts +1475 -0
  9. package/dist/auth/auth-schema.d.ts.map +1 -0
  10. package/dist/auth/auth-schema.js +124 -0
  11. package/dist/auth/middleware.d.ts +5 -0
  12. package/dist/auth/middleware.d.ts.map +1 -0
  13. package/dist/auth/middleware.js +220 -0
  14. package/dist/auth/org.d.ts +28 -0
  15. package/dist/auth/org.d.ts.map +1 -0
  16. package/dist/auth/org.js +68 -0
  17. package/dist/auth/permissions.d.ts +4 -0
  18. package/dist/auth/permissions.d.ts.map +1 -0
  19. package/dist/auth/permissions.js +24 -0
  20. package/dist/auth/setup.d.ts +29 -0
  21. package/dist/auth/setup.d.ts.map +1 -0
  22. package/dist/auth/setup.js +137 -0
  23. package/dist/auth/strict-org-resolution.d.ts +4 -0
  24. package/dist/auth/strict-org-resolution.d.ts.map +1 -0
  25. package/dist/auth/strict-org-resolution.js +13 -0
  26. package/dist/auth/system-actor.d.ts +7 -0
  27. package/dist/auth/system-actor.d.ts.map +1 -0
  28. package/dist/auth/system-actor.js +17 -0
  29. package/dist/auth/types.d.ts +11 -0
  30. package/dist/auth/types.d.ts.map +1 -0
  31. package/dist/auth/types.js +1 -0
  32. package/dist/config/defaults.d.ts +3 -0
  33. package/dist/config/defaults.d.ts.map +1 -0
  34. package/dist/config/defaults.js +83 -0
  35. package/dist/config/define-config.d.ts +10 -0
  36. package/dist/config/define-config.d.ts.map +1 -0
  37. package/dist/config/define-config.js +64 -0
  38. package/dist/config/types.d.ts +412 -0
  39. package/dist/config/types.d.ts.map +1 -0
  40. package/dist/config/types.js +1 -0
  41. package/dist/drizzle.d.ts +28 -0
  42. package/dist/drizzle.d.ts.map +1 -0
  43. package/dist/drizzle.js +24 -0
  44. package/dist/generated/plugin-manifest.d.ts +45 -0
  45. package/dist/generated/plugin-manifest.d.ts.map +1 -0
  46. package/dist/generated/plugin-manifest.js +19 -0
  47. package/dist/hooks/checkout-completion.d.ts +58 -0
  48. package/dist/hooks/checkout-completion.d.ts.map +1 -0
  49. package/dist/hooks/checkout-completion.js +146 -0
  50. package/dist/hooks/checkout.d.ts +99 -0
  51. package/dist/hooks/checkout.d.ts.map +1 -0
  52. package/dist/hooks/checkout.js +331 -0
  53. package/dist/hooks/order-emails.d.ts +16 -0
  54. package/dist/hooks/order-emails.d.ts.map +1 -0
  55. package/dist/hooks/order-emails.js +44 -0
  56. package/dist/index.d.ts +79 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +46 -0
  59. package/dist/interfaces/rest/customer-portal.d.ts +5 -0
  60. package/dist/interfaces/rest/customer-portal.d.ts.map +1 -0
  61. package/dist/interfaces/rest/customer-portal.js +206 -0
  62. package/dist/interfaces/rest/index.d.ts +5 -0
  63. package/dist/interfaces/rest/index.d.ts.map +1 -0
  64. package/dist/interfaces/rest/index.js +94 -0
  65. package/dist/interfaces/rest/router.d.ts +164 -0
  66. package/dist/interfaces/rest/router.d.ts.map +1 -0
  67. package/dist/interfaces/rest/router.js +259 -0
  68. package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts +5 -0
  69. package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts.map +1 -0
  70. package/dist/interfaces/rest/routes/admin/compensation-failures.js +114 -0
  71. package/dist/interfaces/rest/routes/admin/permissions.d.ts +5 -0
  72. package/dist/interfaces/rest/routes/admin/permissions.d.ts.map +1 -0
  73. package/dist/interfaces/rest/routes/admin/permissions.js +28 -0
  74. package/dist/interfaces/rest/routes/admin-jobs.d.ts +5 -0
  75. package/dist/interfaces/rest/routes/admin-jobs.d.ts.map +1 -0
  76. package/dist/interfaces/rest/routes/admin-jobs.js +48 -0
  77. package/dist/interfaces/rest/routes/audit.d.ts +5 -0
  78. package/dist/interfaces/rest/routes/audit.d.ts.map +1 -0
  79. package/dist/interfaces/rest/routes/audit.js +43 -0
  80. package/dist/interfaces/rest/routes/carts.d.ts +5 -0
  81. package/dist/interfaces/rest/routes/carts.d.ts.map +1 -0
  82. package/dist/interfaces/rest/routes/carts.js +61 -0
  83. package/dist/interfaces/rest/routes/catalog.d.ts +5 -0
  84. package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -0
  85. package/dist/interfaces/rest/routes/catalog.js +269 -0
  86. package/dist/interfaces/rest/routes/checkout.d.ts +5 -0
  87. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -0
  88. package/dist/interfaces/rest/routes/checkout.js +220 -0
  89. package/dist/interfaces/rest/routes/customers.d.ts +5 -0
  90. package/dist/interfaces/rest/routes/customers.d.ts.map +1 -0
  91. package/dist/interfaces/rest/routes/customers.js +78 -0
  92. package/dist/interfaces/rest/routes/inventory.d.ts +5 -0
  93. package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -0
  94. package/dist/interfaces/rest/routes/inventory.js +74 -0
  95. package/dist/interfaces/rest/routes/media.d.ts +5 -0
  96. package/dist/interfaces/rest/routes/media.d.ts.map +1 -0
  97. package/dist/interfaces/rest/routes/media.js +66 -0
  98. package/dist/interfaces/rest/routes/orders.d.ts +5 -0
  99. package/dist/interfaces/rest/routes/orders.d.ts.map +1 -0
  100. package/dist/interfaces/rest/routes/orders.js +64 -0
  101. package/dist/interfaces/rest/routes/payments.d.ts +5 -0
  102. package/dist/interfaces/rest/routes/payments.d.ts.map +1 -0
  103. package/dist/interfaces/rest/routes/payments.js +45 -0
  104. package/dist/interfaces/rest/routes/pricing.d.ts +5 -0
  105. package/dist/interfaces/rest/routes/pricing.d.ts.map +1 -0
  106. package/dist/interfaces/rest/routes/pricing.js +61 -0
  107. package/dist/interfaces/rest/routes/promotions.d.ts +5 -0
  108. package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -0
  109. package/dist/interfaces/rest/routes/promotions.js +76 -0
  110. package/dist/interfaces/rest/routes/search.d.ts +5 -0
  111. package/dist/interfaces/rest/routes/search.d.ts.map +1 -0
  112. package/dist/interfaces/rest/routes/search.js +72 -0
  113. package/dist/interfaces/rest/routes/webhooks.d.ts +5 -0
  114. package/dist/interfaces/rest/routes/webhooks.d.ts.map +1 -0
  115. package/dist/interfaces/rest/routes/webhooks.js +39 -0
  116. package/dist/interfaces/rest/schemas/admin-jobs.d.ts +327 -0
  117. package/dist/interfaces/rest/schemas/admin-jobs.d.ts.map +1 -0
  118. package/dist/interfaces/rest/schemas/admin-jobs.js +37 -0
  119. package/dist/interfaces/rest/schemas/admin-permissions.d.ts +27 -0
  120. package/dist/interfaces/rest/schemas/admin-permissions.d.ts.map +1 -0
  121. package/dist/interfaces/rest/schemas/admin-permissions.js +25 -0
  122. package/dist/interfaces/rest/schemas/audit.d.ts +59 -0
  123. package/dist/interfaces/rest/schemas/audit.d.ts.map +1 -0
  124. package/dist/interfaces/rest/schemas/audit.js +43 -0
  125. package/dist/interfaces/rest/schemas/carts.d.ts +1456 -0
  126. package/dist/interfaces/rest/schemas/carts.d.ts.map +1 -0
  127. package/dist/interfaces/rest/schemas/carts.js +109 -0
  128. package/dist/interfaces/rest/schemas/catalog.d.ts +5452 -0
  129. package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -0
  130. package/dist/interfaces/rest/schemas/catalog.js +397 -0
  131. package/dist/interfaces/rest/schemas/checkout.d.ts +160 -0
  132. package/dist/interfaces/rest/schemas/checkout.d.ts.map +1 -0
  133. package/dist/interfaces/rest/schemas/checkout.js +60 -0
  134. package/dist/interfaces/rest/schemas/compensation-failures.d.ts +122 -0
  135. package/dist/interfaces/rest/schemas/compensation-failures.d.ts.map +1 -0
  136. package/dist/interfaces/rest/schemas/compensation-failures.js +84 -0
  137. package/dist/interfaces/rest/schemas/customer-portal.d.ts +2237 -0
  138. package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -0
  139. package/dist/interfaces/rest/schemas/customer-portal.js +177 -0
  140. package/dist/interfaces/rest/schemas/customers.d.ts +422 -0
  141. package/dist/interfaces/rest/schemas/customers.d.ts.map +1 -0
  142. package/dist/interfaces/rest/schemas/customers.js +150 -0
  143. package/dist/interfaces/rest/schemas/inventory.d.ts +561 -0
  144. package/dist/interfaces/rest/schemas/inventory.d.ts.map +1 -0
  145. package/dist/interfaces/rest/schemas/inventory.js +148 -0
  146. package/dist/interfaces/rest/schemas/media.d.ts +303 -0
  147. package/dist/interfaces/rest/schemas/media.d.ts.map +1 -0
  148. package/dist/interfaces/rest/schemas/media.js +69 -0
  149. package/dist/interfaces/rest/schemas/orders.d.ts +1877 -0
  150. package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -0
  151. package/dist/interfaces/rest/schemas/orders.js +93 -0
  152. package/dist/interfaces/rest/schemas/pricing.d.ts +256 -0
  153. package/dist/interfaces/rest/schemas/pricing.d.ts.map +1 -0
  154. package/dist/interfaces/rest/schemas/pricing.js +72 -0
  155. package/dist/interfaces/rest/schemas/promotions.d.ts +374 -0
  156. package/dist/interfaces/rest/schemas/promotions.d.ts.map +1 -0
  157. package/dist/interfaces/rest/schemas/promotions.js +104 -0
  158. package/dist/interfaces/rest/schemas/responses.d.ts +4138 -0
  159. package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -0
  160. package/dist/interfaces/rest/schemas/responses.js +74 -0
  161. package/dist/interfaces/rest/schemas/search.d.ts +247 -0
  162. package/dist/interfaces/rest/schemas/search.d.ts.map +1 -0
  163. package/dist/interfaces/rest/schemas/search.js +55 -0
  164. package/dist/interfaces/rest/schemas/shared.d.ts +95 -0
  165. package/dist/interfaces/rest/schemas/shared.d.ts.map +1 -0
  166. package/dist/interfaces/rest/schemas/shared.js +51 -0
  167. package/dist/interfaces/rest/schemas/webhooks.d.ts +221 -0
  168. package/dist/interfaces/rest/schemas/webhooks.d.ts.map +1 -0
  169. package/dist/interfaces/rest/schemas/webhooks.js +62 -0
  170. package/dist/interfaces/rest/utils.d.ts +45 -0
  171. package/dist/interfaces/rest/utils.d.ts.map +1 -0
  172. package/dist/interfaces/rest/utils.js +71 -0
  173. package/dist/interfaces/rest/webhook-router.d.ts +41 -0
  174. package/dist/interfaces/rest/webhook-router.d.ts.map +1 -0
  175. package/dist/interfaces/rest/webhook-router.js +36 -0
  176. package/dist/kernel/compensation/executor.d.ts +21 -0
  177. package/dist/kernel/compensation/executor.d.ts.map +1 -0
  178. package/dist/kernel/compensation/executor.js +80 -0
  179. package/dist/kernel/compensation/repository.d.ts +47 -0
  180. package/dist/kernel/compensation/repository.d.ts.map +1 -0
  181. package/dist/kernel/compensation/repository.js +93 -0
  182. package/dist/kernel/compensation/schema.d.ts +217 -0
  183. package/dist/kernel/compensation/schema.d.ts.map +1 -0
  184. package/dist/kernel/compensation/schema.js +29 -0
  185. package/dist/kernel/compensation/types.d.ts +29 -0
  186. package/dist/kernel/compensation/types.d.ts.map +1 -0
  187. package/dist/kernel/compensation/types.js +1 -0
  188. package/dist/kernel/database/adapter.d.ts +18 -0
  189. package/dist/kernel/database/adapter.d.ts.map +1 -0
  190. package/dist/kernel/database/adapter.js +3 -0
  191. package/dist/kernel/database/drizzle-db.d.ts +49 -0
  192. package/dist/kernel/database/drizzle-db.d.ts.map +1 -0
  193. package/dist/kernel/database/drizzle-db.js +20 -0
  194. package/dist/kernel/database/migrate.d.ts +38 -0
  195. package/dist/kernel/database/migrate.d.ts.map +1 -0
  196. package/dist/kernel/database/migrate.js +61 -0
  197. package/dist/kernel/database/plugin-db-context.d.ts +3 -0
  198. package/dist/kernel/database/plugin-db-context.d.ts.map +1 -0
  199. package/dist/kernel/database/plugin-db-context.js +8 -0
  200. package/dist/kernel/database/plugin-types.d.ts +32 -0
  201. package/dist/kernel/database/plugin-types.d.ts.map +1 -0
  202. package/dist/kernel/database/plugin-types.js +10 -0
  203. package/dist/kernel/database/schema.d.ts +26 -0
  204. package/dist/kernel/database/schema.d.ts.map +1 -0
  205. package/dist/kernel/database/schema.js +39 -0
  206. package/dist/kernel/database/scoped-db.d.ts +14 -0
  207. package/dist/kernel/database/scoped-db.d.ts.map +1 -0
  208. package/dist/kernel/database/scoped-db.js +103 -0
  209. package/dist/kernel/database/tx-context.d.ts +15 -0
  210. package/dist/kernel/database/tx-context.d.ts.map +1 -0
  211. package/dist/kernel/database/tx-context.js +19 -0
  212. package/dist/kernel/error-mapper.d.ts +14 -0
  213. package/dist/kernel/error-mapper.d.ts.map +1 -0
  214. package/dist/kernel/error-mapper.js +93 -0
  215. package/dist/kernel/errors.d.ts +43 -0
  216. package/dist/kernel/errors.d.ts.map +1 -0
  217. package/dist/kernel/errors.js +78 -0
  218. package/dist/kernel/factory/repository-factory.d.ts +71 -0
  219. package/dist/kernel/factory/repository-factory.d.ts.map +1 -0
  220. package/dist/kernel/factory/repository-factory.js +138 -0
  221. package/dist/kernel/hooks/create-context.d.ts +32 -0
  222. package/dist/kernel/hooks/create-context.d.ts.map +1 -0
  223. package/dist/kernel/hooks/create-context.js +23 -0
  224. package/dist/kernel/hooks/executor.d.ts +13 -0
  225. package/dist/kernel/hooks/executor.d.ts.map +1 -0
  226. package/dist/kernel/hooks/executor.js +56 -0
  227. package/dist/kernel/hooks/registry.d.ts +28 -0
  228. package/dist/kernel/hooks/registry.d.ts.map +1 -0
  229. package/dist/kernel/hooks/registry.js +58 -0
  230. package/dist/kernel/hooks/types.d.ts +40 -0
  231. package/dist/kernel/hooks/types.d.ts.map +1 -0
  232. package/dist/kernel/hooks/types.js +1 -0
  233. package/dist/kernel/http-error.d.ts +30 -0
  234. package/dist/kernel/http-error.d.ts.map +1 -0
  235. package/dist/kernel/http-error.js +35 -0
  236. package/dist/kernel/jobs/adapter.d.ts +25 -0
  237. package/dist/kernel/jobs/adapter.d.ts.map +1 -0
  238. package/dist/kernel/jobs/adapter.js +9 -0
  239. package/dist/kernel/jobs/builtin-job-tasks.d.ts +3 -0
  240. package/dist/kernel/jobs/builtin-job-tasks.d.ts.map +1 -0
  241. package/dist/kernel/jobs/builtin-job-tasks.js +6 -0
  242. package/dist/kernel/jobs/drizzle-adapter.d.ts +15 -0
  243. package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -0
  244. package/dist/kernel/jobs/drizzle-adapter.js +46 -0
  245. package/dist/kernel/jobs/reaper.d.ts +12 -0
  246. package/dist/kernel/jobs/reaper.d.ts.map +1 -0
  247. package/dist/kernel/jobs/reaper.js +62 -0
  248. package/dist/kernel/jobs/runner.d.ts +24 -0
  249. package/dist/kernel/jobs/runner.d.ts.map +1 -0
  250. package/dist/kernel/jobs/runner.js +118 -0
  251. package/dist/kernel/jobs/schema.d.ts +280 -0
  252. package/dist/kernel/jobs/schema.d.ts.map +1 -0
  253. package/dist/kernel/jobs/schema.js +37 -0
  254. package/dist/kernel/jobs/types.d.ts +40 -0
  255. package/dist/kernel/jobs/types.d.ts.map +1 -0
  256. package/dist/kernel/jobs/types.js +4 -0
  257. package/dist/kernel/local-api.d.ts +104 -0
  258. package/dist/kernel/local-api.d.ts.map +1 -0
  259. package/dist/kernel/local-api.js +89 -0
  260. package/dist/kernel/module/define.d.ts +21 -0
  261. package/dist/kernel/module/define.d.ts.map +1 -0
  262. package/dist/kernel/module/define.js +3 -0
  263. package/dist/kernel/module/index.d.ts +4 -0
  264. package/dist/kernel/module/index.d.ts.map +1 -0
  265. package/dist/kernel/module/index.js +2 -0
  266. package/dist/kernel/module/topo-sort.d.ts +7 -0
  267. package/dist/kernel/module/topo-sort.d.ts.map +1 -0
  268. package/dist/kernel/module/topo-sort.js +89 -0
  269. package/dist/kernel/plugin/manifest.d.ts +84 -0
  270. package/dist/kernel/plugin/manifest.d.ts.map +1 -0
  271. package/dist/kernel/plugin/manifest.js +196 -0
  272. package/dist/kernel/query/executor.d.ts +21 -0
  273. package/dist/kernel/query/executor.d.ts.map +1 -0
  274. package/dist/kernel/query/executor.js +128 -0
  275. package/dist/kernel/query/registry.d.ts +33 -0
  276. package/dist/kernel/query/registry.d.ts.map +1 -0
  277. package/dist/kernel/query/registry.js +20 -0
  278. package/dist/kernel/result.d.ts +36 -0
  279. package/dist/kernel/result.d.ts.map +1 -0
  280. package/dist/kernel/result.js +16 -0
  281. package/dist/kernel/service-registry.d.ts +109 -0
  282. package/dist/kernel/service-registry.d.ts.map +1 -0
  283. package/dist/kernel/service-registry.js +26 -0
  284. package/dist/kernel/service-timing.d.ts +25 -0
  285. package/dist/kernel/service-timing.d.ts.map +1 -0
  286. package/dist/kernel/service-timing.js +62 -0
  287. package/dist/kernel/state-machine/machine.d.ts +24 -0
  288. package/dist/kernel/state-machine/machine.d.ts.map +1 -0
  289. package/dist/kernel/state-machine/machine.js +70 -0
  290. package/dist/modules/analytics/drizzle-adapter.d.ts +13 -0
  291. package/dist/modules/analytics/drizzle-adapter.d.ts.map +1 -0
  292. package/dist/modules/analytics/drizzle-adapter.js +358 -0
  293. package/dist/modules/analytics/hooks.d.ts +13 -0
  294. package/dist/modules/analytics/hooks.d.ts.map +1 -0
  295. package/dist/modules/analytics/hooks.js +12 -0
  296. package/dist/modules/analytics/models.d.ts +14 -0
  297. package/dist/modules/analytics/models.d.ts.map +1 -0
  298. package/dist/modules/analytics/models.js +118 -0
  299. package/dist/modules/analytics/module.d.ts +3 -0
  300. package/dist/modules/analytics/module.d.ts.map +1 -0
  301. package/dist/modules/analytics/module.js +18 -0
  302. package/dist/modules/analytics/repository/index.d.ts +5 -0
  303. package/dist/modules/analytics/repository/index.d.ts.map +1 -0
  304. package/dist/modules/analytics/repository/index.js +1 -0
  305. package/dist/modules/analytics/service.d.ts +45 -0
  306. package/dist/modules/analytics/service.d.ts.map +1 -0
  307. package/dist/modules/analytics/service.js +196 -0
  308. package/dist/modules/analytics/types.d.ts +119 -0
  309. package/dist/modules/analytics/types.d.ts.map +1 -0
  310. package/dist/modules/analytics/types.js +25 -0
  311. package/dist/modules/audit/hooks.d.ts +7 -0
  312. package/dist/modules/audit/hooks.d.ts.map +1 -0
  313. package/dist/modules/audit/hooks.js +67 -0
  314. package/dist/modules/audit/index.d.ts +2 -0
  315. package/dist/modules/audit/index.d.ts.map +1 -0
  316. package/dist/modules/audit/index.js +1 -0
  317. package/dist/modules/audit/module.d.ts +180 -0
  318. package/dist/modules/audit/module.d.ts.map +1 -0
  319. package/dist/modules/audit/module.js +8 -0
  320. package/dist/modules/audit/schema.d.ts +178 -0
  321. package/dist/modules/audit/schema.d.ts.map +1 -0
  322. package/dist/modules/audit/schema.js +21 -0
  323. package/dist/modules/audit/service.d.ts +38 -0
  324. package/dist/modules/audit/service.d.ts.map +1 -0
  325. package/dist/modules/audit/service.js +109 -0
  326. package/dist/modules/cart/access.d.ts +11 -0
  327. package/dist/modules/cart/access.d.ts.map +1 -0
  328. package/dist/modules/cart/access.js +18 -0
  329. package/dist/modules/cart/matcher.d.ts +20 -0
  330. package/dist/modules/cart/matcher.d.ts.map +1 -0
  331. package/dist/modules/cart/matcher.js +2 -0
  332. package/dist/modules/cart/module.d.ts +14 -0
  333. package/dist/modules/cart/module.d.ts.map +1 -0
  334. package/dist/modules/cart/module.js +17 -0
  335. package/dist/modules/cart/repository/index.d.ts +45 -0
  336. package/dist/modules/cart/repository/index.d.ts.map +1 -0
  337. package/dist/modules/cart/repository/index.js +158 -0
  338. package/dist/modules/cart/schema.d.ts +359 -0
  339. package/dist/modules/cart/schema.d.ts.map +1 -0
  340. package/dist/modules/cart/schema.js +40 -0
  341. package/dist/modules/cart/schemas.d.ts +29 -0
  342. package/dist/modules/cart/schemas.d.ts.map +1 -0
  343. package/dist/modules/cart/schemas.js +14 -0
  344. package/dist/modules/cart/service.d.ts +87 -0
  345. package/dist/modules/cart/service.d.ts.map +1 -0
  346. package/dist/modules/cart/service.js +454 -0
  347. package/dist/modules/catalog/brand-service.d.ts +18 -0
  348. package/dist/modules/catalog/brand-service.d.ts.map +1 -0
  349. package/dist/modules/catalog/brand-service.js +126 -0
  350. package/dist/modules/catalog/category-service.d.ts +17 -0
  351. package/dist/modules/catalog/category-service.d.ts.map +1 -0
  352. package/dist/modules/catalog/category-service.js +128 -0
  353. package/dist/modules/catalog/entity-service.d.ts +30 -0
  354. package/dist/modules/catalog/entity-service.d.ts.map +1 -0
  355. package/dist/modules/catalog/entity-service.js +481 -0
  356. package/dist/modules/catalog/module.d.ts +21 -0
  357. package/dist/modules/catalog/module.d.ts.map +1 -0
  358. package/dist/modules/catalog/module.js +28 -0
  359. package/dist/modules/catalog/repository/index.d.ts +106 -0
  360. package/dist/modules/catalog/repository/index.d.ts.map +1 -0
  361. package/dist/modules/catalog/repository/index.js +459 -0
  362. package/dist/modules/catalog/schema.d.ts +1193 -0
  363. package/dist/modules/catalog/schema.d.ts.map +1 -0
  364. package/dist/modules/catalog/schema.js +149 -0
  365. package/dist/modules/catalog/schemas.d.ts +81 -0
  366. package/dist/modules/catalog/schemas.d.ts.map +1 -0
  367. package/dist/modules/catalog/schemas.js +62 -0
  368. package/dist/modules/catalog/service.d.ts +167 -0
  369. package/dist/modules/catalog/service.d.ts.map +1 -0
  370. package/dist/modules/catalog/service.js +96 -0
  371. package/dist/modules/customers/index.d.ts +2 -0
  372. package/dist/modules/customers/index.d.ts.map +1 -0
  373. package/dist/modules/customers/index.js +1 -0
  374. package/dist/modules/customers/module.d.ts +563 -0
  375. package/dist/modules/customers/module.d.ts.map +1 -0
  376. package/dist/modules/customers/module.js +19 -0
  377. package/dist/modules/customers/repository/index.d.ts +47 -0
  378. package/dist/modules/customers/repository/index.d.ts.map +1 -0
  379. package/dist/modules/customers/repository/index.js +206 -0
  380. package/dist/modules/customers/schema.d.ts +560 -0
  381. package/dist/modules/customers/schema.d.ts.map +1 -0
  382. package/dist/modules/customers/schema.js +60 -0
  383. package/dist/modules/customers/service.d.ts +32 -0
  384. package/dist/modules/customers/service.d.ts.map +1 -0
  385. package/dist/modules/customers/service.js +132 -0
  386. package/dist/modules/fulfillment/module.d.ts +13 -0
  387. package/dist/modules/fulfillment/module.d.ts.map +1 -0
  388. package/dist/modules/fulfillment/module.js +22 -0
  389. package/dist/modules/fulfillment/repository/index.d.ts +63 -0
  390. package/dist/modules/fulfillment/repository/index.d.ts.map +1 -0
  391. package/dist/modules/fulfillment/repository/index.js +268 -0
  392. package/dist/modules/fulfillment/schema.d.ts +655 -0
  393. package/dist/modules/fulfillment/schema.d.ts.map +1 -0
  394. package/dist/modules/fulfillment/schema.js +83 -0
  395. package/dist/modules/fulfillment/service.d.ts +63 -0
  396. package/dist/modules/fulfillment/service.d.ts.map +1 -0
  397. package/dist/modules/fulfillment/service.js +351 -0
  398. package/dist/modules/fulfillment/types.d.ts +44 -0
  399. package/dist/modules/fulfillment/types.d.ts.map +1 -0
  400. package/dist/modules/fulfillment/types.js +1 -0
  401. package/dist/modules/inventory/module.d.ts +13 -0
  402. package/dist/modules/inventory/module.d.ts.map +1 -0
  403. package/dist/modules/inventory/module.js +20 -0
  404. package/dist/modules/inventory/repository/index.d.ts +96 -0
  405. package/dist/modules/inventory/repository/index.d.ts.map +1 -0
  406. package/dist/modules/inventory/repository/index.js +361 -0
  407. package/dist/modules/inventory/schema.d.ts +604 -0
  408. package/dist/modules/inventory/schema.d.ts.map +1 -0
  409. package/dist/modules/inventory/schema.js +78 -0
  410. package/dist/modules/inventory/schemas.d.ts +31 -0
  411. package/dist/modules/inventory/schemas.d.ts.map +1 -0
  412. package/dist/modules/inventory/schemas.js +28 -0
  413. package/dist/modules/inventory/service.d.ts +70 -0
  414. package/dist/modules/inventory/service.d.ts.map +1 -0
  415. package/dist/modules/inventory/service.js +284 -0
  416. package/dist/modules/media/adapter.d.ts +16 -0
  417. package/dist/modules/media/adapter.d.ts.map +1 -0
  418. package/dist/modules/media/adapter.js +1 -0
  419. package/dist/modules/media/index.d.ts +2 -0
  420. package/dist/modules/media/index.d.ts.map +1 -0
  421. package/dist/modules/media/index.js +1 -0
  422. package/dist/modules/media/module.d.ts +292 -0
  423. package/dist/modules/media/module.d.ts.map +1 -0
  424. package/dist/modules/media/module.js +22 -0
  425. package/dist/modules/media/repository/index.d.ts +35 -0
  426. package/dist/modules/media/repository/index.d.ts.map +1 -0
  427. package/dist/modules/media/repository/index.js +176 -0
  428. package/dist/modules/media/schema.d.ts +289 -0
  429. package/dist/modules/media/schema.d.ts.map +1 -0
  430. package/dist/modules/media/schema.js +35 -0
  431. package/dist/modules/media/service.d.ts +45 -0
  432. package/dist/modules/media/service.d.ts.map +1 -0
  433. package/dist/modules/media/service.js +149 -0
  434. package/dist/modules/orders/module.d.ts +25 -0
  435. package/dist/modules/orders/module.d.ts.map +1 -0
  436. package/dist/modules/orders/module.js +32 -0
  437. package/dist/modules/orders/repository/index.d.ts +48 -0
  438. package/dist/modules/orders/repository/index.d.ts.map +1 -0
  439. package/dist/modules/orders/repository/index.js +204 -0
  440. package/dist/modules/orders/schema.d.ts +689 -0
  441. package/dist/modules/orders/schema.d.ts.map +1 -0
  442. package/dist/modules/orders/schema.js +64 -0
  443. package/dist/modules/orders/sequences.d.ts +2 -0
  444. package/dist/modules/orders/sequences.d.ts.map +1 -0
  445. package/dist/modules/orders/sequences.js +5 -0
  446. package/dist/modules/orders/service.d.ts +81 -0
  447. package/dist/modules/orders/service.d.ts.map +1 -0
  448. package/dist/modules/orders/service.js +325 -0
  449. package/dist/modules/orders/stale-order-cleanup.d.ts +27 -0
  450. package/dist/modules/orders/stale-order-cleanup.d.ts.map +1 -0
  451. package/dist/modules/orders/stale-order-cleanup.js +55 -0
  452. package/dist/modules/organization/index.d.ts +2 -0
  453. package/dist/modules/organization/index.d.ts.map +1 -0
  454. package/dist/modules/organization/index.js +1 -0
  455. package/dist/modules/organization/module.d.ts +205 -0
  456. package/dist/modules/organization/module.d.ts.map +1 -0
  457. package/dist/modules/organization/module.js +8 -0
  458. package/dist/modules/organization/service.d.ts +53 -0
  459. package/dist/modules/organization/service.d.ts.map +1 -0
  460. package/dist/modules/organization/service.js +151 -0
  461. package/dist/modules/payments/adapter.d.ts +40 -0
  462. package/dist/modules/payments/adapter.d.ts.map +1 -0
  463. package/dist/modules/payments/adapter.js +1 -0
  464. package/dist/modules/payments/module.d.ts +3 -0
  465. package/dist/modules/payments/module.d.ts.map +1 -0
  466. package/dist/modules/payments/module.js +7 -0
  467. package/dist/modules/payments/repository/index.d.ts +5 -0
  468. package/dist/modules/payments/repository/index.d.ts.map +1 -0
  469. package/dist/modules/payments/repository/index.js +1 -0
  470. package/dist/modules/payments/service.d.ts +23 -0
  471. package/dist/modules/payments/service.d.ts.map +1 -0
  472. package/dist/modules/payments/service.js +72 -0
  473. package/dist/modules/pricing/index.d.ts +2 -0
  474. package/dist/modules/pricing/index.d.ts.map +1 -0
  475. package/dist/modules/pricing/index.js +1 -0
  476. package/dist/modules/pricing/module.d.ts +14 -0
  477. package/dist/modules/pricing/module.d.ts.map +1 -0
  478. package/dist/modules/pricing/module.js +16 -0
  479. package/dist/modules/pricing/repository/index.d.ts +34 -0
  480. package/dist/modules/pricing/repository/index.d.ts.map +1 -0
  481. package/dist/modules/pricing/repository/index.js +179 -0
  482. package/dist/modules/pricing/schema.d.ts +565 -0
  483. package/dist/modules/pricing/schema.d.ts.map +1 -0
  484. package/dist/modules/pricing/schema.js +57 -0
  485. package/dist/modules/pricing/schemas.d.ts +37 -0
  486. package/dist/modules/pricing/schemas.d.ts.map +1 -0
  487. package/dist/modules/pricing/schemas.js +30 -0
  488. package/dist/modules/pricing/service.d.ts +67 -0
  489. package/dist/modules/pricing/service.d.ts.map +1 -0
  490. package/dist/modules/pricing/service.js +329 -0
  491. package/dist/modules/promotions/module.d.ts +14 -0
  492. package/dist/modules/promotions/module.d.ts.map +1 -0
  493. package/dist/modules/promotions/module.js +18 -0
  494. package/dist/modules/promotions/repository/index.d.ts +41 -0
  495. package/dist/modules/promotions/repository/index.d.ts.map +1 -0
  496. package/dist/modules/promotions/repository/index.js +204 -0
  497. package/dist/modules/promotions/schema.d.ts +427 -0
  498. package/dist/modules/promotions/schema.d.ts.map +1 -0
  499. package/dist/modules/promotions/schema.js +52 -0
  500. package/dist/modules/promotions/schemas.d.ts +33 -0
  501. package/dist/modules/promotions/schemas.d.ts.map +1 -0
  502. package/dist/modules/promotions/schemas.js +32 -0
  503. package/dist/modules/promotions/service.d.ts +90 -0
  504. package/dist/modules/promotions/service.d.ts.map +1 -0
  505. package/dist/modules/promotions/service.js +387 -0
  506. package/dist/modules/search/adapter.d.ts +51 -0
  507. package/dist/modules/search/adapter.d.ts.map +1 -0
  508. package/dist/modules/search/adapter.js +1 -0
  509. package/dist/modules/search/hooks.d.ts +8 -0
  510. package/dist/modules/search/hooks.d.ts.map +1 -0
  511. package/dist/modules/search/hooks.js +6 -0
  512. package/dist/modules/search/module.d.ts +8 -0
  513. package/dist/modules/search/module.d.ts.map +1 -0
  514. package/dist/modules/search/module.js +17 -0
  515. package/dist/modules/search/repository/index.d.ts +5 -0
  516. package/dist/modules/search/repository/index.d.ts.map +1 -0
  517. package/dist/modules/search/repository/index.js +1 -0
  518. package/dist/modules/search/service.d.ts +24 -0
  519. package/dist/modules/search/service.d.ts.map +1 -0
  520. package/dist/modules/search/service.js +243 -0
  521. package/dist/modules/shipping/calculator.d.ts +42 -0
  522. package/dist/modules/shipping/calculator.d.ts.map +1 -0
  523. package/dist/modules/shipping/calculator.js +91 -0
  524. package/dist/modules/shipping/module.d.ts +8 -0
  525. package/dist/modules/shipping/module.d.ts.map +1 -0
  526. package/dist/modules/shipping/module.js +11 -0
  527. package/dist/modules/shipping/repository/index.d.ts +5 -0
  528. package/dist/modules/shipping/repository/index.d.ts.map +1 -0
  529. package/dist/modules/shipping/repository/index.js +1 -0
  530. package/dist/modules/shipping/service.d.ts +28 -0
  531. package/dist/modules/shipping/service.d.ts.map +1 -0
  532. package/dist/modules/shipping/service.js +20 -0
  533. package/dist/modules/tax/adapter.d.ts +58 -0
  534. package/dist/modules/tax/adapter.d.ts.map +1 -0
  535. package/dist/modules/tax/adapter.js +1 -0
  536. package/dist/modules/tax/module.d.ts +3 -0
  537. package/dist/modules/tax/module.d.ts.map +1 -0
  538. package/dist/modules/tax/module.js +9 -0
  539. package/dist/modules/tax/repository/index.d.ts +5 -0
  540. package/dist/modules/tax/repository/index.d.ts.map +1 -0
  541. package/dist/modules/tax/repository/index.js +1 -0
  542. package/dist/modules/tax/service.d.ts +19 -0
  543. package/dist/modules/tax/service.d.ts.map +1 -0
  544. package/dist/modules/tax/service.js +34 -0
  545. package/dist/modules/webhooks/hook.d.ts +13 -0
  546. package/dist/modules/webhooks/hook.d.ts.map +1 -0
  547. package/dist/modules/webhooks/hook.js +35 -0
  548. package/dist/modules/webhooks/index.d.ts +2 -0
  549. package/dist/modules/webhooks/index.d.ts.map +1 -0
  550. package/dist/modules/webhooks/index.js +1 -0
  551. package/dist/modules/webhooks/module.d.ts +403 -0
  552. package/dist/modules/webhooks/module.d.ts.map +1 -0
  553. package/dist/modules/webhooks/module.js +15 -0
  554. package/dist/modules/webhooks/repository/index.d.ts +40 -0
  555. package/dist/modules/webhooks/repository/index.d.ts.map +1 -0
  556. package/dist/modules/webhooks/repository/index.js +183 -0
  557. package/dist/modules/webhooks/schema.d.ts +404 -0
  558. package/dist/modules/webhooks/schema.d.ts.map +1 -0
  559. package/dist/modules/webhooks/schema.js +40 -0
  560. package/dist/modules/webhooks/service.d.ts +23 -0
  561. package/dist/modules/webhooks/service.d.ts.map +1 -0
  562. package/dist/modules/webhooks/service.js +94 -0
  563. package/dist/modules/webhooks/signing.d.ts +2 -0
  564. package/dist/modules/webhooks/signing.d.ts.map +1 -0
  565. package/dist/modules/webhooks/signing.js +5 -0
  566. package/dist/modules/webhooks/ssrf-guard.d.ts +19 -0
  567. package/dist/modules/webhooks/ssrf-guard.d.ts.map +1 -0
  568. package/dist/modules/webhooks/ssrf-guard.js +79 -0
  569. package/dist/modules/webhooks/tasks.d.ts +16 -0
  570. package/dist/modules/webhooks/tasks.d.ts.map +1 -0
  571. package/dist/modules/webhooks/tasks.js +42 -0
  572. package/dist/modules/webhooks/worker.d.ts +28 -0
  573. package/dist/modules/webhooks/worker.d.ts.map +1 -0
  574. package/dist/modules/webhooks/worker.js +133 -0
  575. package/dist/runtime/commerce.d.ts +110 -0
  576. package/dist/runtime/commerce.d.ts.map +1 -0
  577. package/dist/runtime/commerce.js +48 -0
  578. package/dist/runtime/kernel-modules.d.ts +1714 -0
  579. package/dist/runtime/kernel-modules.d.ts.map +1 -0
  580. package/dist/runtime/kernel-modules.js +62 -0
  581. package/dist/runtime/kernel-register-hooks.d.ts +4 -0
  582. package/dist/runtime/kernel-register-hooks.d.ts.map +1 -0
  583. package/dist/runtime/kernel-register-hooks.js +46 -0
  584. package/dist/runtime/kernel-types.d.ts +65 -0
  585. package/dist/runtime/kernel-types.d.ts.map +1 -0
  586. package/dist/runtime/kernel-types.js +36 -0
  587. package/dist/runtime/kernel.d.ts +6 -0
  588. package/dist/runtime/kernel.d.ts.map +1 -0
  589. package/dist/runtime/kernel.js +113 -0
  590. package/dist/runtime/logger.d.ts +11 -0
  591. package/dist/runtime/logger.d.ts.map +1 -0
  592. package/dist/runtime/logger.js +32 -0
  593. package/dist/runtime/server.d.ts +37 -0
  594. package/dist/runtime/server.d.ts.map +1 -0
  595. package/dist/runtime/server.js +398 -0
  596. package/dist/runtime/shutdown.d.ts +15 -0
  597. package/dist/runtime/shutdown.d.ts.map +1 -0
  598. package/dist/runtime/shutdown.js +34 -0
  599. package/dist/runtime/url-alias-rewrite.d.ts +3 -0
  600. package/dist/runtime/url-alias-rewrite.d.ts.map +1 -0
  601. package/dist/runtime/url-alias-rewrite.js +33 -0
  602. package/dist/test-utils/create-pglite-adapter.d.ts +32 -0
  603. package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -0
  604. package/dist/test-utils/create-pglite-adapter.js +107 -0
  605. package/dist/test-utils/create-plugin-test-app.d.ts +50 -0
  606. package/dist/test-utils/create-plugin-test-app.d.ts.map +1 -0
  607. package/dist/test-utils/create-plugin-test-app.js +90 -0
  608. package/dist/test-utils/create-repository-test-harness.d.ts +8 -0
  609. package/dist/test-utils/create-repository-test-harness.d.ts.map +1 -0
  610. package/dist/test-utils/create-repository-test-harness.js +7 -0
  611. package/dist/test-utils/create-test-config.d.ts +18 -0
  612. package/dist/test-utils/create-test-config.d.ts.map +1 -0
  613. package/dist/test-utils/create-test-config.js +172 -0
  614. package/dist/test-utils/create-test-kernel.d.ts +3 -0
  615. package/dist/test-utils/create-test-kernel.d.ts.map +1 -0
  616. package/dist/test-utils/create-test-kernel.js +5 -0
  617. package/dist/test-utils/create-test-plugin-context.d.ts +38 -0
  618. package/dist/test-utils/create-test-plugin-context.d.ts.map +1 -0
  619. package/dist/test-utils/create-test-plugin-context.js +39 -0
  620. package/dist/test-utils/rest-api-test-utils.d.ts +64 -0
  621. package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -0
  622. package/dist/test-utils/rest-api-test-utils.js +208 -0
  623. package/dist/test-utils/test-actors.d.ts +21 -0
  624. package/dist/test-utils/test-actors.d.ts.map +1 -0
  625. package/dist/test-utils/test-actors.js +64 -0
  626. package/dist/test-utils/typed-hooks.d.ts +44 -0
  627. package/dist/test-utils/typed-hooks.d.ts.map +1 -0
  628. package/dist/test-utils/typed-hooks.js +36 -0
  629. package/dist/testing.d.ts +15 -0
  630. package/dist/testing.d.ts.map +1 -0
  631. package/dist/testing.js +13 -0
  632. package/dist/types/commerce-types.d.ts +34 -0
  633. package/dist/types/commerce-types.d.ts.map +1 -0
  634. package/dist/types/commerce-types.js +1 -0
  635. package/dist/utils/agent-prompt.d.ts +2 -0
  636. package/dist/utils/agent-prompt.d.ts.map +1 -0
  637. package/dist/utils/agent-prompt.js +12 -0
  638. package/dist/utils/id.d.ts +2 -0
  639. package/dist/utils/id.d.ts.map +1 -0
  640. package/dist/utils/id.js +3 -0
  641. package/dist/utils/logger.d.ts +3 -0
  642. package/dist/utils/logger.d.ts.map +1 -0
  643. package/dist/utils/logger.js +16 -0
  644. package/dist/utils/pagination.d.ts +11 -0
  645. package/dist/utils/pagination.d.ts.map +1 -0
  646. package/dist/utils/pagination.js +15 -0
  647. package/package.json +89 -0
  648. package/src/adapters/console-email.ts +43 -0
  649. package/src/auth/access.ts +187 -0
  650. package/src/auth/auth-schema.ts +139 -0
  651. package/src/auth/middleware.ts +257 -0
  652. package/src/auth/org.ts +83 -0
  653. package/src/auth/permissions.ts +28 -0
  654. package/src/auth/setup.ts +187 -0
  655. package/src/auth/strict-org-resolution.ts +14 -0
  656. package/src/auth/system-actor.ts +19 -0
  657. package/src/auth/types.ts +10 -0
  658. package/src/config/defaults.ts +85 -0
  659. package/src/config/define-config.ts +81 -0
  660. package/src/config/types.ts +417 -0
  661. package/src/drizzle.ts +95 -0
  662. package/src/generated/plugin-capabilities.d.ts +19 -0
  663. package/src/generated/plugin-manifest.ts +22 -0
  664. package/src/generated/plugin-repositories.d.ts +19 -0
  665. package/src/hooks/checkout-completion.ts +285 -0
  666. package/src/hooks/checkout.ts +695 -0
  667. package/src/hooks/order-emails.ts +62 -0
  668. package/src/index.ts +213 -0
  669. package/src/interfaces/rest/customer-portal.ts +299 -0
  670. package/src/interfaces/rest/index.ts +105 -0
  671. package/src/interfaces/rest/router.ts +333 -0
  672. package/src/interfaces/rest/routes/admin/compensation-failures.ts +160 -0
  673. package/src/interfaces/rest/routes/admin/permissions.ts +37 -0
  674. package/src/interfaces/rest/routes/admin-jobs.ts +58 -0
  675. package/src/interfaces/rest/routes/audit.ts +50 -0
  676. package/src/interfaces/rest/routes/carts.ts +100 -0
  677. package/src/interfaces/rest/routes/catalog.ts +508 -0
  678. package/src/interfaces/rest/routes/checkout.ts +289 -0
  679. package/src/interfaces/rest/routes/customers.ts +100 -0
  680. package/src/interfaces/rest/routes/inventory.ts +93 -0
  681. package/src/interfaces/rest/routes/media.ts +87 -0
  682. package/src/interfaces/rest/routes/orders.ts +78 -0
  683. package/src/interfaces/rest/routes/payments.ts +60 -0
  684. package/src/interfaces/rest/routes/pricing.ts +78 -0
  685. package/src/interfaces/rest/routes/promotions.ts +96 -0
  686. package/src/interfaces/rest/routes/search.ts +81 -0
  687. package/src/interfaces/rest/routes/webhooks.ts +49 -0
  688. package/src/interfaces/rest/schemas/admin-jobs.ts +40 -0
  689. package/src/interfaces/rest/schemas/admin-permissions.ts +27 -0
  690. package/src/interfaces/rest/schemas/audit.ts +46 -0
  691. package/src/interfaces/rest/schemas/carts.ts +125 -0
  692. package/src/interfaces/rest/schemas/catalog.ts +450 -0
  693. package/src/interfaces/rest/schemas/checkout.ts +66 -0
  694. package/src/interfaces/rest/schemas/compensation-failures.ts +89 -0
  695. package/src/interfaces/rest/schemas/customer-portal.ts +195 -0
  696. package/src/interfaces/rest/schemas/customers.ts +155 -0
  697. package/src/interfaces/rest/schemas/inventory.ts +159 -0
  698. package/src/interfaces/rest/schemas/media.ts +75 -0
  699. package/src/interfaces/rest/schemas/orders.ts +104 -0
  700. package/src/interfaces/rest/schemas/pricing.ts +80 -0
  701. package/src/interfaces/rest/schemas/promotions.ts +116 -0
  702. package/src/interfaces/rest/schemas/responses.ts +96 -0
  703. package/src/interfaces/rest/schemas/search.ts +58 -0
  704. package/src/interfaces/rest/schemas/shared.ts +62 -0
  705. package/src/interfaces/rest/schemas/webhooks.ts +68 -0
  706. package/src/interfaces/rest/utils.ts +104 -0
  707. package/src/interfaces/rest/webhook-router.ts +50 -0
  708. package/src/kernel/compensation/executor.ts +123 -0
  709. package/src/kernel/compensation/repository.ts +157 -0
  710. package/src/kernel/compensation/schema.ts +45 -0
  711. package/src/kernel/compensation/types.ts +30 -0
  712. package/src/kernel/database/adapter.ts +21 -0
  713. package/src/kernel/database/drizzle-db.ts +56 -0
  714. package/src/kernel/database/migrate.ts +76 -0
  715. package/src/kernel/database/plugin-db-context.ts +14 -0
  716. package/src/kernel/database/plugin-types.ts +34 -0
  717. package/src/kernel/database/schema.ts +53 -0
  718. package/src/kernel/database/scoped-db.ts +112 -0
  719. package/src/kernel/database/tx-context.ts +46 -0
  720. package/src/kernel/error-mapper.ts +118 -0
  721. package/src/kernel/errors.ts +100 -0
  722. package/src/kernel/factory/repository-factory.ts +244 -0
  723. package/src/kernel/hooks/create-context.ts +52 -0
  724. package/src/kernel/hooks/executor.ts +95 -0
  725. package/src/kernel/hooks/registry.ts +74 -0
  726. package/src/kernel/hooks/types.ts +55 -0
  727. package/src/kernel/http-error.ts +44 -0
  728. package/src/kernel/jobs/adapter.ts +36 -0
  729. package/src/kernel/jobs/builtin-job-tasks.ts +17 -0
  730. package/src/kernel/jobs/drizzle-adapter.ts +65 -0
  731. package/src/kernel/jobs/reaper.ts +95 -0
  732. package/src/kernel/jobs/runner.ts +157 -0
  733. package/src/kernel/jobs/schema.ts +46 -0
  734. package/src/kernel/jobs/types.ts +42 -0
  735. package/src/kernel/local-api.ts +188 -0
  736. package/src/kernel/module/define.ts +36 -0
  737. package/src/kernel/module/index.ts +3 -0
  738. package/src/kernel/module/topo-sort.ts +99 -0
  739. package/src/kernel/plugin/manifest.ts +310 -0
  740. package/src/kernel/query/executor.ts +184 -0
  741. package/src/kernel/query/registry.ts +46 -0
  742. package/src/kernel/result.ts +33 -0
  743. package/src/kernel/service-registry.ts +76 -0
  744. package/src/kernel/service-timing.ts +89 -0
  745. package/src/kernel/state-machine/machine.ts +101 -0
  746. package/src/modules/analytics/drizzle-adapter.ts +426 -0
  747. package/src/modules/analytics/hooks.ts +11 -0
  748. package/src/modules/analytics/models.ts +125 -0
  749. package/src/modules/analytics/module.ts +25 -0
  750. package/src/modules/analytics/repository/index.ts +6 -0
  751. package/src/modules/analytics/service.ts +245 -0
  752. package/src/modules/analytics/types.ts +180 -0
  753. package/src/modules/audit/hooks.ts +78 -0
  754. package/src/modules/audit/index.ts +1 -0
  755. package/src/modules/audit/module.ts +11 -0
  756. package/src/modules/audit/schema.ts +33 -0
  757. package/src/modules/audit/service.ts +151 -0
  758. package/src/modules/cart/access.ts +27 -0
  759. package/src/modules/cart/matcher.ts +26 -0
  760. package/src/modules/cart/module.ts +32 -0
  761. package/src/modules/cart/repository/index.ts +234 -0
  762. package/src/modules/cart/schema.ts +42 -0
  763. package/src/modules/cart/schemas.ts +38 -0
  764. package/src/modules/cart/service.ts +710 -0
  765. package/src/modules/catalog/brand-service.ts +101 -0
  766. package/src/modules/catalog/category-service.ts +103 -0
  767. package/src/modules/catalog/entity-service.ts +469 -0
  768. package/src/modules/catalog/module.ts +65 -0
  769. package/src/modules/catalog/repository/index.ts +777 -0
  770. package/src/modules/catalog/schema.ts +203 -0
  771. package/src/modules/catalog/schemas.ts +104 -0
  772. package/src/modules/catalog/service.ts +392 -0
  773. package/src/modules/customers/index.ts +1 -0
  774. package/src/modules/customers/module.ts +27 -0
  775. package/src/modules/customers/repository/index.ts +327 -0
  776. package/src/modules/customers/schema.ts +64 -0
  777. package/src/modules/customers/service.ts +276 -0
  778. package/src/modules/fulfillment/module.ts +42 -0
  779. package/src/modules/fulfillment/repository/index.ts +426 -0
  780. package/src/modules/fulfillment/schema.ts +101 -0
  781. package/src/modules/fulfillment/service.ts +581 -0
  782. package/src/modules/fulfillment/types.ts +59 -0
  783. package/src/modules/inventory/module.ts +37 -0
  784. package/src/modules/inventory/repository/index.ts +677 -0
  785. package/src/modules/inventory/schema.ts +107 -0
  786. package/src/modules/inventory/schemas.ts +38 -0
  787. package/src/modules/inventory/service.ts +567 -0
  788. package/src/modules/media/adapter.ts +17 -0
  789. package/src/modules/media/index.ts +1 -0
  790. package/src/modules/media/module.ts +25 -0
  791. package/src/modules/media/repository/index.ts +274 -0
  792. package/src/modules/media/schema.ts +41 -0
  793. package/src/modules/media/service.ts +237 -0
  794. package/src/modules/orders/module.ts +66 -0
  795. package/src/modules/orders/repository/index.ts +290 -0
  796. package/src/modules/orders/schema.ts +67 -0
  797. package/src/modules/orders/sequences.ts +6 -0
  798. package/src/modules/orders/service.ts +639 -0
  799. package/src/modules/orders/stale-order-cleanup.ts +76 -0
  800. package/src/modules/organization/index.ts +1 -0
  801. package/src/modules/organization/module.ts +11 -0
  802. package/src/modules/organization/service.ts +191 -0
  803. package/src/modules/payments/adapter.ts +45 -0
  804. package/src/modules/payments/module.ts +14 -0
  805. package/src/modules/payments/repository/index.ts +6 -0
  806. package/src/modules/payments/service.ts +107 -0
  807. package/src/modules/pricing/index.ts +1 -0
  808. package/src/modules/pricing/module.ts +30 -0
  809. package/src/modules/pricing/repository/index.ts +305 -0
  810. package/src/modules/pricing/schema.ts +71 -0
  811. package/src/modules/pricing/schemas.ts +38 -0
  812. package/src/modules/pricing/service.ts +557 -0
  813. package/src/modules/promotions/module.ts +32 -0
  814. package/src/modules/promotions/repository/index.ts +325 -0
  815. package/src/modules/promotions/schema.ts +62 -0
  816. package/src/modules/promotions/schemas.ts +38 -0
  817. package/src/modules/promotions/service.ts +674 -0
  818. package/src/modules/search/adapter.ts +57 -0
  819. package/src/modules/search/hooks.ts +12 -0
  820. package/src/modules/search/module.ts +26 -0
  821. package/src/modules/search/repository/index.ts +6 -0
  822. package/src/modules/search/service.ts +341 -0
  823. package/src/modules/shipping/calculator.ts +188 -0
  824. package/src/modules/shipping/module.ts +23 -0
  825. package/src/modules/shipping/repository/index.ts +6 -0
  826. package/src/modules/shipping/service.ts +51 -0
  827. package/src/modules/tax/adapter.ts +60 -0
  828. package/src/modules/tax/module.ts +16 -0
  829. package/src/modules/tax/repository/index.ts +6 -0
  830. package/src/modules/tax/service.ts +53 -0
  831. package/src/modules/webhooks/hook.ts +41 -0
  832. package/src/modules/webhooks/index.ts +1 -0
  833. package/src/modules/webhooks/module.ts +22 -0
  834. package/src/modules/webhooks/repository/index.ts +304 -0
  835. package/src/modules/webhooks/schema.ts +56 -0
  836. package/src/modules/webhooks/service.ts +127 -0
  837. package/src/modules/webhooks/signing.ts +6 -0
  838. package/src/modules/webhooks/ssrf-guard.ts +71 -0
  839. package/src/modules/webhooks/tasks.ts +60 -0
  840. package/src/modules/webhooks/worker.ts +171 -0
  841. package/src/runtime/commerce.ts +158 -0
  842. package/src/runtime/kernel-modules.ts +66 -0
  843. package/src/runtime/kernel-register-hooks.ts +63 -0
  844. package/src/runtime/kernel-types.ts +109 -0
  845. package/src/runtime/kernel.ts +159 -0
  846. package/src/runtime/logger.ts +36 -0
  847. package/src/runtime/server.ts +470 -0
  848. package/src/runtime/shutdown.ts +43 -0
  849. package/src/runtime/url-alias-rewrite.ts +40 -0
  850. package/src/test-utils/create-pglite-adapter.ts +129 -0
  851. package/src/test-utils/create-plugin-test-app.ts +151 -0
  852. package/src/test-utils/create-repository-test-harness.ts +16 -0
  853. package/src/test-utils/create-test-config.ts +188 -0
  854. package/src/test-utils/create-test-kernel.ts +7 -0
  855. package/src/test-utils/create-test-plugin-context.ts +66 -0
  856. package/src/test-utils/rest-api-test-utils.ts +266 -0
  857. package/src/test-utils/test-actors.ts +70 -0
  858. package/src/test-utils/typed-hooks.ts +55 -0
  859. package/src/testing.ts +21 -0
  860. package/src/types/commerce-types.ts +34 -0
  861. package/src/utils/agent-prompt.ts +12 -0
  862. package/src/utils/id.ts +3 -0
  863. package/src/utils/logger.ts +18 -0
  864. package/src/utils/pagination.ts +22 -0
@@ -0,0 +1,398 @@
1
+ import { OpenAPIHono } from "@hono/zod-openapi";
2
+ import { cors } from "hono/cors";
3
+ import { csrf } from "hono/csrf";
4
+ import { bodyLimit } from "hono/body-limit";
5
+ import { rateLimiter } from "hono-rate-limiter";
6
+ import { createHash } from "node:crypto";
7
+ import { authMiddleware } from "../auth/middleware.js";
8
+ import { createRestRoutes } from "../interfaces/rest/index.js";
9
+ import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal.js";
10
+ import { createCommerce } from "./commerce.js";
11
+ import { rewriteCommerceAliasRequest } from "./url-alias-rewrite.js";
12
+ import { mapErrorToResponse } from "../kernel/error-mapper.js";
13
+ /**
14
+ * Returns true if running in a Node-like runtime that supports
15
+ * `process.on()` + `process.exit()`. Edge runtimes (Cloudflare Workers,
16
+ * Vercel Edge) return false — caller should skip process-crash handlers
17
+ * and defer unhandled errors to the platform.
18
+ *
19
+ * Exposed for direct unit testing — see test/server-edge-runtime.test.ts.
20
+ */
21
+ export function isNodeRuntime() {
22
+ return (typeof process !== "undefined" &&
23
+ typeof process.on === "function" &&
24
+ typeof process.exit === "function");
25
+ }
26
+ function hashRateLimitEmail(email) {
27
+ return createHash("sha256")
28
+ .update(email.trim().toLowerCase())
29
+ .digest("hex");
30
+ }
31
+ function matchPathPattern(path, pattern) {
32
+ if (pattern.endsWith("*")) {
33
+ return path.startsWith(pattern.slice(0, -1));
34
+ }
35
+ return path === pattern;
36
+ }
37
+ /**
38
+ * Create a full HTTP server (Hono) with all REST routes, auth, and middleware.
39
+ *
40
+ * For server-side frameworks (Next.js, TanStack Start, SvelteKit), use
41
+ * `createCommerce()` instead — it gives you a local API without HTTP overhead.
42
+ */
43
+ export async function createServer(config) {
44
+ const commerce = await createCommerce(config);
45
+ const { kernel, auth, logger } = commerce;
46
+ const isProdEnv = process.env.NODE_ENV === "production";
47
+ const app = new OpenAPIHono({
48
+ defaultHook: (result, c) => {
49
+ if (!result.success) {
50
+ return c.json({
51
+ error: {
52
+ code: "VALIDATION_FAILED",
53
+ message: isProdEnv
54
+ ? "Invalid input."
55
+ : result.error.issues
56
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
57
+ .join("; "),
58
+ },
59
+ }, 422);
60
+ }
61
+ },
62
+ });
63
+ // ─── Security Guards ──────────────────────────────────────────────
64
+ if (config.auth?.enableDevKey !== undefined) {
65
+ throw new Error("FATAL: auth.enableDevKey has been removed. " +
66
+ "Use 'bunx @porulle/cli api-key create --scope admin' to generate a real API key. " +
67
+ "See RFC-050: https://github.com/octalpixel/unified-commerce/blob/main/RFC-050-AUTH-KEY-SCOPING.md");
68
+ }
69
+ if (config.auth?.devKey !== undefined) {
70
+ throw new Error("FATAL: auth.devKey has been removed. " +
71
+ "Use 'bunx @porulle/cli api-key create --scope admin' to generate a real API key. " +
72
+ "See RFC-050: https://github.com/octalpixel/unified-commerce/blob/main/RFC-050-AUTH-KEY-SCOPING.md");
73
+ }
74
+ // exposed for direct unit testing — see test/server-edge-runtime.test.ts
75
+ // ─── Process Crash Handlers (F4) ─────────────────────────────────────
76
+ if (isNodeRuntime()) {
77
+ process.on("unhandledRejection", (reason) => {
78
+ logger.fatal({ err: reason }, "unhandled promise rejection -- exiting");
79
+ process.exit(1);
80
+ });
81
+ process.on("uncaughtException", (err) => {
82
+ logger.fatal({ err }, "uncaught exception -- exiting");
83
+ process.exit(1);
84
+ });
85
+ }
86
+ else {
87
+ logger.info("running on edge runtime — process crash handlers skipped");
88
+ }
89
+ // ─── Security Response Headers ──────────────────────────────────────
90
+ app.use("*", async (c, next) => {
91
+ c.header("X-Content-Type-Options", "nosniff");
92
+ c.header("X-Frame-Options", "DENY");
93
+ c.header("Referrer-Policy", "strict-origin-when-cross-origin");
94
+ c.header("Permissions-Policy", "camera=(), microphone=(), geolocation=()");
95
+ if (isProdEnv) {
96
+ c.header("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
97
+ }
98
+ await next();
99
+ });
100
+ // ─── Request ID + Logging (F2, F12) ──────────────────────────────────
101
+ app.use("*", async (c, next) => {
102
+ const requestId = c.req.header("x-request-id") ?? crypto.randomUUID();
103
+ c.header("x-request-id", requestId);
104
+ c.set("requestId", requestId);
105
+ const child = logger.child({ requestId, method: c.req.method, path: c.req.path });
106
+ c.set("logger", child);
107
+ const start = performance.now();
108
+ await next();
109
+ // Sanitize ZodError responses in production.
110
+ // @hono/zod-openapi returns { success: false, error: { name: "ZodError" } }
111
+ // which leaks schema details. The library does not respect defaultHook for
112
+ // this format, so we intercept at the response level.
113
+ if (isProdEnv && c.res.status >= 400 && c.res.status < 500) {
114
+ const ct = c.res.headers.get("content-type");
115
+ if (ct?.includes("json")) {
116
+ try {
117
+ const body = await c.res.clone().json();
118
+ if (body?.error?.name === "ZodError") {
119
+ c.res = new Response(JSON.stringify({ error: { code: "VALIDATION_FAILED", message: "Invalid input." } }), { status: 422, headers: { "content-type": "application/json" } });
120
+ }
121
+ }
122
+ catch { /* non-parseable, skip */ }
123
+ }
124
+ }
125
+ const duration = Math.round(performance.now() - start);
126
+ child.info({ status: c.res.status, durationMs: duration }, "request completed");
127
+ });
128
+ // ─── CORS (hardened by default) ──────────────────────────────────────
129
+ const trustedOrigins = config.auth?.trustedOrigins ?? [];
130
+ app.use("*", cors({
131
+ origin: trustedOrigins.length > 0
132
+ ? trustedOrigins
133
+ : (process.env.NODE_ENV === "production" ? [] : ["http://localhost:*"]),
134
+ credentials: true,
135
+ allowMethods: ["GET", "POST", "PATCH", "PUT", "DELETE", "OPTIONS"],
136
+ allowHeaders: ["Content-Type", "Authorization", "x-api-key", "x-request-id"],
137
+ maxAge: 86400,
138
+ }));
139
+ // ─── CSRF Protection (F14) ──────────────────────────────────────────
140
+ app.use("/api/*", csrf({
141
+ origin: trustedOrigins.length > 0
142
+ ? trustedOrigins
143
+ : (process.env.NODE_ENV === "production" ? [] : ["http://localhost:*"]),
144
+ }));
145
+ // ─── Body Size Limit (F6) ──────────────────────────────────────────
146
+ app.use("*", bodyLimit({
147
+ maxSize: 1024 * 1024, // 1 MB default
148
+ onError: (c) => c.json({
149
+ error: { code: "PAYLOAD_TOO_LARGE", message: "Request body exceeds 1MB limit." },
150
+ }, 413),
151
+ }));
152
+ // ─── Rate Limiting (F1) ──────────────────────────────────────────────
153
+ // Trust X-Forwarded-For ONLY from a known reverse proxy IP.
154
+ // Set TRUSTED_PROXY_IP env var to the proxy's IP (e.g., "127.0.0.1").
155
+ const trustedProxyIp = process.env.TRUSTED_PROXY_IP;
156
+ const signInEmailRateKeyCache = new WeakMap();
157
+ const getClientIp = (c) => {
158
+ const raw = c.req.raw;
159
+ const remoteAddress = raw.socket?.remoteAddress;
160
+ // Only trust X-Forwarded-For when the direct connection is from a trusted proxy
161
+ if (trustedProxyIp && remoteAddress === trustedProxyIp) {
162
+ const xff = c.req.header("x-forwarded-for")?.split(",")[0]?.trim();
163
+ if (xff)
164
+ return xff;
165
+ }
166
+ return remoteAddress ?? "unknown";
167
+ };
168
+ const keyGenerator = getClientIp;
169
+ app.use("/api/auth/*", rateLimiter({
170
+ windowMs: 60 * 1000,
171
+ limit: config.rateLimits?.auth ?? 10,
172
+ keyGenerator,
173
+ }));
174
+ app.use("/api/auth/sign-in/email", async (c, next) => {
175
+ if (c.req.method !== "POST") {
176
+ await next();
177
+ return;
178
+ }
179
+ try {
180
+ const payload = await c.req.raw.clone().json();
181
+ if (typeof payload.email === "string" && payload.email.trim().length > 0) {
182
+ signInEmailRateKeyCache.set(c.req.raw, hashRateLimitEmail(payload.email));
183
+ }
184
+ }
185
+ catch {
186
+ // Ignore parse failures; endpoint validation will handle malformed bodies.
187
+ }
188
+ await next();
189
+ });
190
+ app.use("/api/auth/sign-in/email", rateLimiter({
191
+ windowMs: 15 * 60 * 1000,
192
+ limit: config.rateLimits?.signInPerEmail ?? 10,
193
+ keyGenerator: (c) => signInEmailRateKeyCache.get(c.req.raw) ?? "signin-email:unknown",
194
+ }));
195
+ app.use("/api/checkout", rateLimiter({
196
+ windowMs: 60 * 1000,
197
+ limit: config.rateLimits?.checkout ?? 5,
198
+ keyGenerator,
199
+ }));
200
+ app.use("/api/*", rateLimiter({
201
+ windowMs: 60 * 1000,
202
+ limit: config.rateLimits?.api ?? 100,
203
+ keyGenerator,
204
+ }));
205
+ app.use("*", async (c, next) => {
206
+ await next();
207
+ const csp = config.security?.csp;
208
+ if (!csp)
209
+ return;
210
+ // Recommended checkout policy baseline (adjust provider domains):
211
+ // default-src 'self'; script-src 'self' https://js.stripe.com; frame-src https://js.stripe.com https://hooks.stripe.com; object-src 'none'; base-uri 'self'; frame-ancestors 'none'
212
+ const routePolicy = Object.entries(csp.perRoute ?? {}).find(([pattern]) => matchPathPattern(c.req.path, pattern))?.[1];
213
+ const policy = routePolicy ?? csp.default;
214
+ if (policy) {
215
+ c.header("Content-Security-Policy", policy);
216
+ }
217
+ });
218
+ // ─── Custom Middleware ──────────────────────────────────────────────
219
+ if (config.middleware) {
220
+ for (const middleware of config.middleware) {
221
+ app.use("*", middleware);
222
+ }
223
+ }
224
+ // ─── Auth ──────────────────────────────────────────────────────────
225
+ app.use("/api/auth/*", async (c, next) => {
226
+ if (c.req.path.startsWith("/api/auth/pos/")) {
227
+ await next();
228
+ return;
229
+ }
230
+ return auth.handler(c.req.raw);
231
+ });
232
+ app.use("*", authMiddleware(auth, config));
233
+ app.use("*", async (c, next) => {
234
+ c.set("auth", auth);
235
+ await next();
236
+ });
237
+ // ─── Global Error Handler ─────────────────────────────────────────
238
+ const isProd = process.env.NODE_ENV === "production";
239
+ app.onError((err, c) => {
240
+ const { body, status } = mapErrorToResponse(err, isProd, logger);
241
+ return c.json(body, status);
242
+ });
243
+ // ─── Routes ──────────────────────────────────────────────────────────
244
+ app.route("/api", createRestRoutes(kernel));
245
+ // Mounted under /api so the auth middleware, rate limiter, CSRF, and
246
+ // body-limit stack apply (all are scoped to /api/*).
247
+ app.route("/api/me", createCustomerPortalRoutes(kernel));
248
+ if (config.routes) {
249
+ config.routes(app, kernel);
250
+ }
251
+ // OpenAPI spec — disabled in production unless explicitly enabled
252
+ const exposeSpec = config.exposeOpenApiSpec ?? !isProd;
253
+ if (exposeSpec) {
254
+ app.doc("/api/doc", {
255
+ openapi: "3.0.0",
256
+ info: {
257
+ title: "UnifiedCommerce API",
258
+ version: config.version ?? "0.0.1",
259
+ description: "Headless commerce engine REST API. Includes core and plugin endpoints.",
260
+ },
261
+ tags: [
262
+ // ── Entity aliases (generated from config.entities[type].alias) ──
263
+ ...Object.entries(config.entities ?? {})
264
+ .filter(([, cfg]) => cfg.alias)
265
+ .map(([type, cfg]) => {
266
+ const name = cfg.alias.charAt(0).toUpperCase() + cfg.alias.slice(1);
267
+ return { name, description: `Ergonomic alias for ${type} entities — CRUD, variants, attributes` };
268
+ }),
269
+ // ── Storefront ──
270
+ { name: "Catalog", description: "Products, categories, brands, variants, and option types (unified entity API)" },
271
+ { name: "Search", description: "Full-text search and typeahead suggestions" },
272
+ { name: "Pricing", description: "Base prices, price modifiers, and customer group pricing" },
273
+ { name: "Carts", description: "Shopping cart lifecycle — create, add items, update quantities" },
274
+ { name: "Checkout", description: "Convert a cart into a paid order" },
275
+ { name: "Promotions", description: "Discount codes, validation, and usage tracking" },
276
+ // ── Admin ──
277
+ { name: "Orders", description: "Order management — list, detail, status transitions, fulfillments" },
278
+ { name: "Customers", description: "Customer profiles, addresses, groups, and order history" },
279
+ { name: "Inventory", description: "Stock levels, warehouse management, adjustments, and reservations" },
280
+ { name: "Media", description: "File uploads, entity attachments, and signed URLs" },
281
+ { name: "Payments", description: "Payment provider webhooks and event processing" },
282
+ // ── Operations ──
283
+ { name: "Webhooks", description: "Outbound webhook endpoint registration and management" },
284
+ { name: "Audit", description: "Immutable audit log — who changed what and when" },
285
+ { name: "Admin Jobs", description: "Background job queue — view failed jobs and retry" },
286
+ ],
287
+ });
288
+ // Serve enriched spec with x-tagGroups vendor extension (Scalar/Redocly sidebar grouping)
289
+ const aliasTags = Object.values(config.entities ?? {})
290
+ .filter((cfg) => cfg.alias)
291
+ .map((cfg) => cfg.alias.charAt(0).toUpperCase() + cfg.alias.slice(1));
292
+ const tagGroups = [
293
+ ...(aliasTags.length > 0 ? [{ name: "Quick Access", tags: aliasTags }] : []),
294
+ { name: "Storefront", tags: ["Catalog", "Search", "Pricing", "Carts", "Checkout", "Promotions"] },
295
+ { name: "Admin", tags: ["Orders", "Customers", "Inventory", "Media", "Payments"] },
296
+ { name: "Operations", tags: ["Webhooks", "Audit", "Admin Jobs"] },
297
+ ];
298
+ app.get("/api/doc-ext", (c) => {
299
+ const spec = app.getOpenAPIDocument({ openapi: "3.0.0", info: { title: "UnifiedCommerce API", version: config.version ?? "0.0.1" } });
300
+ return c.json({ ...spec, "x-tagGroups": tagGroups });
301
+ });
302
+ }
303
+ else {
304
+ app.get("/api/doc", (c) => c.json({ error: { code: "NOT_FOUND", message: "Not found." } }, 404));
305
+ }
306
+ // ─── Job Queue ───────────────────────────────────────────────────────
307
+ // Background job processing: webhook delivery, stale-job reaper, scheduled work.
308
+ //
309
+ // Three runner strategies (inspired by Payload CMS):
310
+ // 1. autorun: in-process polling (long-running servers)
311
+ // 2. GET /api/jobs/run: cron endpoint (serverless — Vercel, Cloudflare)
312
+ // 3. runPendingJobs() export (custom worker process)
313
+ const { runPendingJobs } = await import("../kernel/jobs/runner.js");
314
+ const { runStaleJobReaper, getJobReapThresholdMs, getJobsReaperIntervalMs } = await import("../kernel/jobs/reaper.js");
315
+ const taskMap = new Map();
316
+ for (const task of config.jobs?.tasks ?? []) {
317
+ const t = task;
318
+ taskMap.set(t.slug ?? t.name ?? "", task);
319
+ }
320
+ const jobLogger = {
321
+ info: (msg, data) => logger.info(data != null ? { data } : {}, msg),
322
+ warn: (msg, data) => logger.warn(data != null ? { data } : {}, msg),
323
+ error: (msg, data) => logger.error(data != null ? { data } : {}, msg),
324
+ };
325
+ let lastStaleJobReaperAt = 0;
326
+ const maybeRunStaleJobReaper = async () => {
327
+ const interval = getJobsReaperIntervalMs();
328
+ const now = Date.now();
329
+ if (now - lastStaleJobReaperAt < interval)
330
+ return;
331
+ lastStaleJobReaperAt = now;
332
+ try {
333
+ await runStaleJobReaper(kernel.database.db, getJobReapThresholdMs(), jobLogger);
334
+ }
335
+ catch (err) {
336
+ logger.error({ err }, "Stale job reaper failed");
337
+ }
338
+ };
339
+ const runJobs = async (queue, limit) => {
340
+ await maybeRunStaleJobReaper();
341
+ return runPendingJobs({
342
+ db: kernel.database.db,
343
+ tasks: taskMap,
344
+ queue: queue ?? "default",
345
+ limit: limit ?? 10,
346
+ logger: jobLogger,
347
+ services: kernel.services,
348
+ });
349
+ };
350
+ // Strategy 1: Built-in cron endpoint for serverless deployments.
351
+ // Point Vercel Cron or Cloudflare Cron Trigger at GET /api/jobs/run
352
+ // Optional query params: ?queue=emails&limit=20
353
+ app.get("/api/jobs/run", async (c) => {
354
+ // Always require admin — cron triggers must authenticate
355
+ const actor = c.get("actor");
356
+ if (!actor?.permissions?.includes("*:*")) {
357
+ return c.json({ error: { code: "FORBIDDEN", message: "Job runner requires admin access" } }, 403);
358
+ }
359
+ const queue = c.req.query("queue") ?? "default";
360
+ const limit = parseInt(c.req.query("limit") ?? "10", 10);
361
+ try {
362
+ const result = await runJobs(queue, limit);
363
+ return c.json({ data: result });
364
+ }
365
+ catch (err) {
366
+ logger.error({ err }, "Job runner endpoint failed");
367
+ return c.json({ error: { code: "INTERNAL_ERROR", message: "Job processing failed" } }, 500);
368
+ }
369
+ });
370
+ // Strategy 2: In-process polling for long-running servers (ECS, Cloud Run, Docker).
371
+ // Enable via config.jobs.autorun.enabled = true
372
+ if (config.jobs?.autorun?.enabled) {
373
+ const intervalMs = config.jobs.autorun.intervalMs ?? 10_000;
374
+ const jobInterval = setInterval(async () => {
375
+ try {
376
+ await runJobs();
377
+ }
378
+ catch (err) {
379
+ logger.error({ err }, "Job runner iteration failed");
380
+ }
381
+ }, intervalMs);
382
+ const cleanup = () => clearInterval(jobInterval);
383
+ process.on("SIGTERM", cleanup);
384
+ process.on("SIGINT", cleanup);
385
+ logger.info({ intervalMs }, "Job queue autorun started (in-process polling)");
386
+ }
387
+ else {
388
+ logger.info("Job queue autorun disabled. Use GET /api/jobs/run for serverless cron, " +
389
+ "or set config.jobs.autorun.enabled = true for in-process polling.");
390
+ }
391
+ const dispatchFetch = app.fetch.bind(app);
392
+ app.fetch = ((input, env, executionCtx) => {
393
+ const req = input instanceof Request ? input : new Request(input);
394
+ const rewritten = rewriteCommerceAliasRequest(req, config.entities);
395
+ return dispatchFetch(rewritten, env, executionCtx);
396
+ });
397
+ return { app, kernel, logger, commerce };
398
+ }
@@ -0,0 +1,15 @@
1
+ import type { Logger } from "./logger.js";
2
+ /**
3
+ * Sets up graceful shutdown handlers for SIGTERM and SIGINT.
4
+ *
5
+ * On signal:
6
+ * 1. Stops accepting new connections
7
+ * 2. Runs cleanup (close DB pool, flush logs)
8
+ * 3. Force-exits after timeout if cleanup hangs
9
+ */
10
+ export declare function setupGracefulShutdown(opts: {
11
+ cleanup: () => Promise<void>;
12
+ logger: Logger;
13
+ timeoutMs?: number;
14
+ }): void;
15
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/runtime/shutdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CA4BP"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Sets up graceful shutdown handlers for SIGTERM and SIGINT.
3
+ *
4
+ * On signal:
5
+ * 1. Stops accepting new connections
6
+ * 2. Runs cleanup (close DB pool, flush logs)
7
+ * 3. Force-exits after timeout if cleanup hangs
8
+ */
9
+ export function setupGracefulShutdown(opts) {
10
+ const { cleanup, logger, timeoutMs = 30_000 } = opts;
11
+ let isShuttingDown = false;
12
+ async function shutdown(signal) {
13
+ if (isShuttingDown)
14
+ return;
15
+ isShuttingDown = true;
16
+ logger.info({ signal }, "shutdown signal received, draining connections");
17
+ const forceTimer = setTimeout(() => {
18
+ logger.error("shutdown timeout exceeded, forcing exit");
19
+ process.exit(1);
20
+ }, timeoutMs);
21
+ forceTimer.unref();
22
+ try {
23
+ await cleanup();
24
+ logger.info("graceful shutdown complete");
25
+ process.exit(0);
26
+ }
27
+ catch (err) {
28
+ logger.error({ err }, "error during shutdown");
29
+ process.exit(1);
30
+ }
31
+ }
32
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
33
+ process.on("SIGINT", () => shutdown("SIGINT"));
34
+ }
@@ -0,0 +1,3 @@
1
+ import type { CommerceConfig } from "../config/types.js";
2
+ export declare function rewriteCommerceAliasRequest(request: Request, entities: CommerceConfig["entities"] | undefined): Request;
3
+ //# sourceMappingURL=url-alias-rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-alias-rewrite.d.ts","sourceRoot":"","sources":["../../src/runtime/url-alias-rewrite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,SAAS,GAC/C,OAAO,CAkCT"}
@@ -0,0 +1,33 @@
1
+ export function rewriteCommerceAliasRequest(request, entities) {
2
+ const url = new URL(request.url);
3
+ const path = url.pathname;
4
+ for (const [entityType, entityConfig] of Object.entries(entities ?? {})) {
5
+ if (!entityConfig.alias)
6
+ continue;
7
+ const alias = entityConfig.alias;
8
+ const prefix = `/api/${alias}`;
9
+ if (path === prefix) {
10
+ url.pathname = "/api/catalog/entities";
11
+ if (request.method === "GET") {
12
+ url.searchParams.set("type", entityType);
13
+ }
14
+ return new Request(url.toString(), request);
15
+ }
16
+ if (path.startsWith(`${prefix}/`)) {
17
+ url.pathname = path.replace(prefix, "/api/catalog/entities");
18
+ return new Request(url.toString(), request);
19
+ }
20
+ }
21
+ for (const [shortcut, target] of [["categories", "catalog/categories"], ["brands", "catalog/brands"]]) {
22
+ const prefix = `/api/${shortcut}`;
23
+ if (path === prefix) {
24
+ url.pathname = `/api/${target}`;
25
+ return new Request(url.toString(), request);
26
+ }
27
+ if (path.startsWith(`${prefix}/`)) {
28
+ url.pathname = path.replace(prefix, `/api/${target}`);
29
+ return new Request(url.toString(), request);
30
+ }
31
+ }
32
+ return request;
33
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * PGlite-backed test adapter for real PostgreSQL behavior in tests.
3
+ *
4
+ * Creates an in-memory PGlite (WASM PostgreSQL) instance, pushes the
5
+ * core Drizzle schema programmatically via drizzle-kit/api, and provides
6
+ * a cleanup function to reset data between tests.
7
+ *
8
+ * Benefits over in-memory repository doubles:
9
+ * - Real SQL execution (Drizzle query generation)
10
+ * - PostgreSQL type coercion and constraint enforcement
11
+ * - Real transaction rollback semantics
12
+ * - Production parity for query edge cases
13
+ */
14
+ import type { DatabaseAdapter } from "../kernel/database/adapter.js";
15
+ import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
16
+ /**
17
+ * Creates a PGlite-backed database adapter for testing.
18
+ *
19
+ * Each call creates a new isolated PGlite instance with its own
20
+ * in-memory database. Core schema is pushed once during initialization.
21
+ *
22
+ * @returns A promise resolving to an object containing:
23
+ * - adapter: The DatabaseAdapter for use with createKernel
24
+ * - db: The Drizzle ORM instance for direct queries
25
+ * - cleanup: Function to truncate all tables (call between tests)
26
+ */
27
+ export declare function createPGliteTestAdapter(): Promise<{
28
+ adapter: DatabaseAdapter;
29
+ db: DrizzleDatabase;
30
+ cleanup: () => Promise<void>;
31
+ }>;
32
+ //# sourceMappingURL=create-pglite-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-pglite-adapter.d.ts","sourceRoot":"","sources":["../../src/test-utils/create-pglite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AA0BxE;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,OAAO,EAAE,eAAe,CAAC;IACzB,EAAE,EAAE,eAAe,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CA+DD"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * PGlite-backed test adapter for real PostgreSQL behavior in tests.
3
+ *
4
+ * Creates an in-memory PGlite (WASM PostgreSQL) instance, pushes the
5
+ * core Drizzle schema programmatically via drizzle-kit/api, and provides
6
+ * a cleanup function to reset data between tests.
7
+ *
8
+ * Benefits over in-memory repository doubles:
9
+ * - Real SQL execution (Drizzle query generation)
10
+ * - PostgreSQL type coercion and constraint enforcement
11
+ * - Real transaction rollback semantics
12
+ * - Production parity for query edge cases
13
+ */
14
+ import { PGlite } from "@electric-sql/pglite";
15
+ import { drizzle } from "drizzle-orm/pglite";
16
+ import { sql } from "drizzle-orm";
17
+ import { createRequire } from "node:module";
18
+ import { getSchema } from "../kernel/database/migrate.js";
19
+ import { ensureDefaultOrg } from "../auth/org.js";
20
+ // Single barrel import --- includes all core modules + auth tables
21
+ import * as fullSchema from "../kernel/database/schema.js";
22
+ // drizzle-kit/api uses CJS internally; createRequire provides ESM compat.
23
+ const require = createRequire(import.meta.url);
24
+ /**
25
+ * Pushes the core Drizzle schema to the database using drizzle-kit/api.
26
+ *
27
+ * drizzle-kit introspects the live database via information_schema, diffs
28
+ * against the pgTable definitions, and generates the minimal DDL needed.
29
+ * Typed as DrizzleDatabase (our concrete schema type) to avoid the
30
+ * PGlite → PgDatabase<HKT> invariance cast — drizzle-kit accepts any
31
+ * Drizzle instance at runtime regardless of the schema generic.
32
+ */
33
+ async function pushCoreSchema(db) {
34
+ const coreSchema = getSchema();
35
+ const drizzleKit = require("drizzle-kit/api");
36
+ const { apply } = await drizzleKit.pushSchema(coreSchema, db);
37
+ await apply();
38
+ }
39
+ /**
40
+ * Creates a PGlite-backed database adapter for testing.
41
+ *
42
+ * Each call creates a new isolated PGlite instance with its own
43
+ * in-memory database. Core schema is pushed once during initialization.
44
+ *
45
+ * @returns A promise resolving to an object containing:
46
+ * - adapter: The DatabaseAdapter for use with createKernel
47
+ * - db: The Drizzle ORM instance for direct queries
48
+ * - cleanup: Function to truncate all tables (call between tests)
49
+ */
50
+ export async function createPGliteTestAdapter() {
51
+ // Create in-memory PGlite instance
52
+ const pg = new PGlite();
53
+ // Wrap with Drizzle ORM first (pushSchema needs the Drizzle instance)
54
+ const db = drizzle(pg, { schema: fullSchema });
55
+ // Push core schema via drizzle-kit/api (no migration files needed)
56
+ // PgliteDatabase<Schema> and DrizzleDatabase share the same Schema type;
57
+ // the HKT parameter differs (PgliteQueryResultHKT vs PgQueryResultHKT)
58
+ // but drizzle-kit's pushSchema doesn't use it at runtime.
59
+ await pushCoreSchema(db);
60
+ // Ensure the default organization exists for all tests
61
+ await ensureDefaultOrg(db);
62
+ /**
63
+ * PGlite-compatible transaction wrapper.
64
+ *
65
+ * Drizzle's transaction() method can hang with PGlite due to how
66
+ * the adapter manages transaction state. This implementation uses
67
+ * manual BEGIN/COMMIT control which works more reliably.
68
+ */
69
+ async function transaction(fn) {
70
+ await pg.exec("BEGIN");
71
+ try {
72
+ const result = await fn(db);
73
+ await pg.exec("COMMIT");
74
+ return result;
75
+ }
76
+ catch (error) {
77
+ await pg.exec("ROLLBACK");
78
+ throw error;
79
+ }
80
+ }
81
+ const adapter = {
82
+ provider: "postgresql",
83
+ db,
84
+ transaction,
85
+ };
86
+ /**
87
+ * Cleanup function to reset data between tests.
88
+ * Truncates all tables in reverse dependency order with CASCADE.
89
+ */
90
+ async function cleanup() {
91
+ await db.execute(sql `
92
+ DO $$ DECLARE
93
+ r RECORD;
94
+ BEGIN
95
+ FOR r IN (
96
+ SELECT tablename FROM pg_tables
97
+ WHERE schemaname = 'public'
98
+ ) LOOP
99
+ EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' CASCADE';
100
+ END LOOP;
101
+ END $$;
102
+ `);
103
+ // Re-insert default org after truncation (CASCADE wipes it)
104
+ await ensureDefaultOrg(db);
105
+ }
106
+ return { adapter, db, cleanup };
107
+ }