@unifiedcommerce/core 0.0.1

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 (749) hide show
  1. package/dist/adapters/console-email.d.ts +23 -0
  2. package/dist/adapters/console-email.d.ts.map +1 -0
  3. package/dist/adapters/console-email.js +38 -0
  4. package/dist/auth/access.d.ts +101 -0
  5. package/dist/auth/access.d.ts.map +1 -0
  6. package/dist/auth/access.js +128 -0
  7. package/dist/auth/auth-schema.d.ts +1383 -0
  8. package/dist/auth/auth-schema.d.ts.map +1 -0
  9. package/dist/auth/auth-schema.js +117 -0
  10. package/dist/auth/middleware.d.ts +5 -0
  11. package/dist/auth/middleware.d.ts.map +1 -0
  12. package/dist/auth/middleware.js +91 -0
  13. package/dist/auth/org.d.ts +22 -0
  14. package/dist/auth/org.d.ts.map +1 -0
  15. package/dist/auth/org.js +36 -0
  16. package/dist/auth/permissions.d.ts +4 -0
  17. package/dist/auth/permissions.d.ts.map +1 -0
  18. package/dist/auth/permissions.js +24 -0
  19. package/dist/auth/pos.d.ts +3 -0
  20. package/dist/auth/pos.d.ts.map +1 -0
  21. package/dist/auth/pos.js +62 -0
  22. package/dist/auth/setup.d.ts +31 -0
  23. package/dist/auth/setup.d.ts.map +1 -0
  24. package/dist/auth/setup.js +106 -0
  25. package/dist/auth/system-actor.d.ts +7 -0
  26. package/dist/auth/system-actor.d.ts.map +1 -0
  27. package/dist/auth/system-actor.js +17 -0
  28. package/dist/auth/types.d.ts +11 -0
  29. package/dist/auth/types.d.ts.map +1 -0
  30. package/dist/auth/types.js +1 -0
  31. package/dist/config/defaults.d.ts +3 -0
  32. package/dist/config/defaults.d.ts.map +1 -0
  33. package/dist/config/defaults.js +80 -0
  34. package/dist/config/define-config.d.ts +9 -0
  35. package/dist/config/define-config.d.ts.map +1 -0
  36. package/dist/config/define-config.js +44 -0
  37. package/dist/config/types.d.ts +299 -0
  38. package/dist/config/types.d.ts.map +1 -0
  39. package/dist/config/types.js +1 -0
  40. package/dist/generated/plugin-manifest.d.ts +48 -0
  41. package/dist/generated/plugin-manifest.d.ts.map +1 -0
  42. package/dist/generated/plugin-manifest.js +20 -0
  43. package/dist/hooks/checkout-completion.d.ts +58 -0
  44. package/dist/hooks/checkout-completion.d.ts.map +1 -0
  45. package/dist/hooks/checkout-completion.js +137 -0
  46. package/dist/hooks/checkout.d.ts +99 -0
  47. package/dist/hooks/checkout.d.ts.map +1 -0
  48. package/dist/hooks/checkout.js +317 -0
  49. package/dist/hooks/order-emails.d.ts +16 -0
  50. package/dist/hooks/order-emails.d.ts.map +1 -0
  51. package/dist/hooks/order-emails.js +44 -0
  52. package/dist/index.d.ts +82 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +13381 -0
  55. package/dist/index.js.map +156 -0
  56. package/dist/interfaces/graphql/index.d.ts +4 -0
  57. package/dist/interfaces/graphql/index.d.ts.map +1 -0
  58. package/dist/interfaces/graphql/index.js +415 -0
  59. package/dist/interfaces/mcp/agent-prompt.d.ts +16 -0
  60. package/dist/interfaces/mcp/agent-prompt.d.ts.map +1 -0
  61. package/dist/interfaces/mcp/agent-prompt.js +172 -0
  62. package/dist/interfaces/mcp/context-enrichment.d.ts +39 -0
  63. package/dist/interfaces/mcp/context-enrichment.d.ts.map +1 -0
  64. package/dist/interfaces/mcp/context-enrichment.js +119 -0
  65. package/dist/interfaces/mcp/server.d.ts +7 -0
  66. package/dist/interfaces/mcp/server.d.ts.map +1 -0
  67. package/dist/interfaces/mcp/server.js +515 -0
  68. package/dist/interfaces/mcp/transport.d.ts +5 -0
  69. package/dist/interfaces/mcp/transport.d.ts.map +1 -0
  70. package/dist/interfaces/mcp/transport.js +52 -0
  71. package/dist/interfaces/rest/customer-portal.d.ts +5 -0
  72. package/dist/interfaces/rest/customer-portal.d.ts.map +1 -0
  73. package/dist/interfaces/rest/customer-portal.js +206 -0
  74. package/dist/interfaces/rest/index.d.ts +5 -0
  75. package/dist/interfaces/rest/index.d.ts.map +1 -0
  76. package/dist/interfaces/rest/index.js +68 -0
  77. package/dist/interfaces/rest/router.d.ts +164 -0
  78. package/dist/interfaces/rest/router.d.ts.map +1 -0
  79. package/dist/interfaces/rest/router.js +259 -0
  80. package/dist/interfaces/rest/routes/admin-jobs.d.ts +5 -0
  81. package/dist/interfaces/rest/routes/admin-jobs.d.ts.map +1 -0
  82. package/dist/interfaces/rest/routes/admin-jobs.js +48 -0
  83. package/dist/interfaces/rest/routes/audit.d.ts +5 -0
  84. package/dist/interfaces/rest/routes/audit.d.ts.map +1 -0
  85. package/dist/interfaces/rest/routes/audit.js +43 -0
  86. package/dist/interfaces/rest/routes/carts.d.ts +5 -0
  87. package/dist/interfaces/rest/routes/carts.d.ts.map +1 -0
  88. package/dist/interfaces/rest/routes/carts.js +55 -0
  89. package/dist/interfaces/rest/routes/catalog.d.ts +5 -0
  90. package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -0
  91. package/dist/interfaces/rest/routes/catalog.js +256 -0
  92. package/dist/interfaces/rest/routes/checkout.d.ts +5 -0
  93. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -0
  94. package/dist/interfaces/rest/routes/checkout.js +216 -0
  95. package/dist/interfaces/rest/routes/inventory.d.ts +5 -0
  96. package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -0
  97. package/dist/interfaces/rest/routes/inventory.js +59 -0
  98. package/dist/interfaces/rest/routes/media.d.ts +5 -0
  99. package/dist/interfaces/rest/routes/media.d.ts.map +1 -0
  100. package/dist/interfaces/rest/routes/media.js +65 -0
  101. package/dist/interfaces/rest/routes/orders.d.ts +5 -0
  102. package/dist/interfaces/rest/routes/orders.d.ts.map +1 -0
  103. package/dist/interfaces/rest/routes/orders.js +64 -0
  104. package/dist/interfaces/rest/routes/payments.d.ts +5 -0
  105. package/dist/interfaces/rest/routes/payments.d.ts.map +1 -0
  106. package/dist/interfaces/rest/routes/payments.js +45 -0
  107. package/dist/interfaces/rest/routes/pricing.d.ts +5 -0
  108. package/dist/interfaces/rest/routes/pricing.d.ts.map +1 -0
  109. package/dist/interfaces/rest/routes/pricing.js +48 -0
  110. package/dist/interfaces/rest/routes/promotions.d.ts +5 -0
  111. package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -0
  112. package/dist/interfaces/rest/routes/promotions.js +75 -0
  113. package/dist/interfaces/rest/routes/search.d.ts +5 -0
  114. package/dist/interfaces/rest/routes/search.d.ts.map +1 -0
  115. package/dist/interfaces/rest/routes/search.js +60 -0
  116. package/dist/interfaces/rest/routes/webhooks.d.ts +5 -0
  117. package/dist/interfaces/rest/routes/webhooks.d.ts.map +1 -0
  118. package/dist/interfaces/rest/routes/webhooks.js +39 -0
  119. package/dist/interfaces/rest/schemas/admin-jobs.d.ts +327 -0
  120. package/dist/interfaces/rest/schemas/admin-jobs.d.ts.map +1 -0
  121. package/dist/interfaces/rest/schemas/admin-jobs.js +37 -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 +1446 -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 +5416 -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/customer-portal.d.ts +2197 -0
  135. package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -0
  136. package/dist/interfaces/rest/schemas/customer-portal.js +177 -0
  137. package/dist/interfaces/rest/schemas/inventory.d.ts +469 -0
  138. package/dist/interfaces/rest/schemas/inventory.d.ts.map +1 -0
  139. package/dist/interfaces/rest/schemas/inventory.js +128 -0
  140. package/dist/interfaces/rest/schemas/media.d.ts +303 -0
  141. package/dist/interfaces/rest/schemas/media.d.ts.map +1 -0
  142. package/dist/interfaces/rest/schemas/media.js +69 -0
  143. package/dist/interfaces/rest/schemas/orders.d.ts +1782 -0
  144. package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -0
  145. package/dist/interfaces/rest/schemas/orders.js +93 -0
  146. package/dist/interfaces/rest/schemas/pricing.d.ts +256 -0
  147. package/dist/interfaces/rest/schemas/pricing.d.ts.map +1 -0
  148. package/dist/interfaces/rest/schemas/pricing.js +72 -0
  149. package/dist/interfaces/rest/schemas/promotions.d.ts +363 -0
  150. package/dist/interfaces/rest/schemas/promotions.d.ts.map +1 -0
  151. package/dist/interfaces/rest/schemas/promotions.js +98 -0
  152. package/dist/interfaces/rest/schemas/responses.d.ts +4062 -0
  153. package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -0
  154. package/dist/interfaces/rest/schemas/responses.js +63 -0
  155. package/dist/interfaces/rest/schemas/search.d.ts +245 -0
  156. package/dist/interfaces/rest/schemas/search.d.ts.map +1 -0
  157. package/dist/interfaces/rest/schemas/search.js +55 -0
  158. package/dist/interfaces/rest/schemas/shared.d.ts +95 -0
  159. package/dist/interfaces/rest/schemas/shared.d.ts.map +1 -0
  160. package/dist/interfaces/rest/schemas/shared.js +51 -0
  161. package/dist/interfaces/rest/schemas/webhooks.d.ts +221 -0
  162. package/dist/interfaces/rest/schemas/webhooks.d.ts.map +1 -0
  163. package/dist/interfaces/rest/schemas/webhooks.js +62 -0
  164. package/dist/interfaces/rest/utils.d.ts +45 -0
  165. package/dist/interfaces/rest/utils.d.ts.map +1 -0
  166. package/dist/interfaces/rest/utils.js +71 -0
  167. package/dist/interfaces/rest/webhook-router.d.ts +41 -0
  168. package/dist/interfaces/rest/webhook-router.d.ts.map +1 -0
  169. package/dist/interfaces/rest/webhook-router.js +36 -0
  170. package/dist/kernel/compensation/executor.d.ts +21 -0
  171. package/dist/kernel/compensation/executor.d.ts.map +1 -0
  172. package/dist/kernel/compensation/executor.js +36 -0
  173. package/dist/kernel/compensation/types.d.ts +25 -0
  174. package/dist/kernel/compensation/types.d.ts.map +1 -0
  175. package/dist/kernel/compensation/types.js +1 -0
  176. package/dist/kernel/database/adapter.d.ts +10 -0
  177. package/dist/kernel/database/adapter.d.ts.map +1 -0
  178. package/dist/kernel/database/adapter.js +3 -0
  179. package/dist/kernel/database/drizzle-db.d.ts +49 -0
  180. package/dist/kernel/database/drizzle-db.d.ts.map +1 -0
  181. package/dist/kernel/database/drizzle-db.js +20 -0
  182. package/dist/kernel/database/migrate.d.ts +38 -0
  183. package/dist/kernel/database/migrate.d.ts.map +1 -0
  184. package/dist/kernel/database/migrate.js +61 -0
  185. package/dist/kernel/database/plugin-types.d.ts +32 -0
  186. package/dist/kernel/database/plugin-types.d.ts.map +1 -0
  187. package/dist/kernel/database/plugin-types.js +10 -0
  188. package/dist/kernel/database/schema.d.ts +24 -0
  189. package/dist/kernel/database/schema.d.ts.map +1 -0
  190. package/dist/kernel/database/schema.js +36 -0
  191. package/dist/kernel/database/scoped-db.d.ts +20 -0
  192. package/dist/kernel/database/scoped-db.d.ts.map +1 -0
  193. package/dist/kernel/database/scoped-db.js +62 -0
  194. package/dist/kernel/database/tx-context.d.ts +15 -0
  195. package/dist/kernel/database/tx-context.d.ts.map +1 -0
  196. package/dist/kernel/database/tx-context.js +19 -0
  197. package/dist/kernel/error-mapper.d.ts +3 -0
  198. package/dist/kernel/error-mapper.d.ts.map +1 -0
  199. package/dist/kernel/error-mapper.js +12 -0
  200. package/dist/kernel/errors.d.ts +38 -0
  201. package/dist/kernel/errors.d.ts.map +1 -0
  202. package/dist/kernel/errors.js +69 -0
  203. package/dist/kernel/factory/in-memory-repository-factory.d.ts +20 -0
  204. package/dist/kernel/factory/in-memory-repository-factory.d.ts.map +1 -0
  205. package/dist/kernel/factory/in-memory-repository-factory.js +83 -0
  206. package/dist/kernel/factory/repository-factory.d.ts +71 -0
  207. package/dist/kernel/factory/repository-factory.d.ts.map +1 -0
  208. package/dist/kernel/factory/repository-factory.js +136 -0
  209. package/dist/kernel/hooks/create-context.d.ts +25 -0
  210. package/dist/kernel/hooks/create-context.d.ts.map +1 -0
  211. package/dist/kernel/hooks/create-context.js +22 -0
  212. package/dist/kernel/hooks/executor.d.ts +12 -0
  213. package/dist/kernel/hooks/executor.d.ts.map +1 -0
  214. package/dist/kernel/hooks/executor.js +50 -0
  215. package/dist/kernel/hooks/registry.d.ts +28 -0
  216. package/dist/kernel/hooks/registry.d.ts.map +1 -0
  217. package/dist/kernel/hooks/registry.js +58 -0
  218. package/dist/kernel/hooks/types.d.ts +37 -0
  219. package/dist/kernel/hooks/types.d.ts.map +1 -0
  220. package/dist/kernel/hooks/types.js +1 -0
  221. package/dist/kernel/http-error.d.ts +30 -0
  222. package/dist/kernel/http-error.d.ts.map +1 -0
  223. package/dist/kernel/http-error.js +35 -0
  224. package/dist/kernel/jobs/adapter.d.ts +25 -0
  225. package/dist/kernel/jobs/adapter.d.ts.map +1 -0
  226. package/dist/kernel/jobs/adapter.js +9 -0
  227. package/dist/kernel/jobs/drizzle-adapter.d.ts +15 -0
  228. package/dist/kernel/jobs/drizzle-adapter.d.ts.map +1 -0
  229. package/dist/kernel/jobs/drizzle-adapter.js +42 -0
  230. package/dist/kernel/jobs/runner.d.ts +24 -0
  231. package/dist/kernel/jobs/runner.d.ts.map +1 -0
  232. package/dist/kernel/jobs/runner.js +114 -0
  233. package/dist/kernel/jobs/schema.d.ts +280 -0
  234. package/dist/kernel/jobs/schema.d.ts.map +1 -0
  235. package/dist/kernel/jobs/schema.js +37 -0
  236. package/dist/kernel/jobs/types.d.ts +30 -0
  237. package/dist/kernel/jobs/types.d.ts.map +1 -0
  238. package/dist/kernel/jobs/types.js +1 -0
  239. package/dist/kernel/local-api.d.ts +103 -0
  240. package/dist/kernel/local-api.d.ts.map +1 -0
  241. package/dist/kernel/local-api.js +87 -0
  242. package/dist/kernel/plugin/capability-registry.d.ts +9 -0
  243. package/dist/kernel/plugin/capability-registry.d.ts.map +1 -0
  244. package/dist/kernel/plugin/capability-registry.js +28 -0
  245. package/dist/kernel/plugin/dependency-graph.d.ts +6 -0
  246. package/dist/kernel/plugin/dependency-graph.d.ts.map +1 -0
  247. package/dist/kernel/plugin/dependency-graph.js +55 -0
  248. package/dist/kernel/plugin/manifest.d.ts +90 -0
  249. package/dist/kernel/plugin/manifest.d.ts.map +1 -0
  250. package/dist/kernel/plugin/manifest.js +140 -0
  251. package/dist/kernel/query/executor.d.ts +21 -0
  252. package/dist/kernel/query/executor.d.ts.map +1 -0
  253. package/dist/kernel/query/executor.js +128 -0
  254. package/dist/kernel/query/registry.d.ts +33 -0
  255. package/dist/kernel/query/registry.d.ts.map +1 -0
  256. package/dist/kernel/query/registry.js +20 -0
  257. package/dist/kernel/result.d.ts +36 -0
  258. package/dist/kernel/result.d.ts.map +1 -0
  259. package/dist/kernel/result.js +16 -0
  260. package/dist/kernel/schema/extra-columns.d.ts +23 -0
  261. package/dist/kernel/schema/extra-columns.d.ts.map +1 -0
  262. package/dist/kernel/schema/extra-columns.js +10 -0
  263. package/dist/kernel/service-registry.d.ts +109 -0
  264. package/dist/kernel/service-registry.d.ts.map +1 -0
  265. package/dist/kernel/service-registry.js +26 -0
  266. package/dist/kernel/service-timing.d.ts +25 -0
  267. package/dist/kernel/service-timing.d.ts.map +1 -0
  268. package/dist/kernel/service-timing.js +62 -0
  269. package/dist/kernel/state-machine/machine.d.ts +24 -0
  270. package/dist/kernel/state-machine/machine.d.ts.map +1 -0
  271. package/dist/kernel/state-machine/machine.js +70 -0
  272. package/dist/modules/analytics/cubes.d.ts +19 -0
  273. package/dist/modules/analytics/cubes.d.ts.map +1 -0
  274. package/dist/modules/analytics/cubes.js +187 -0
  275. package/dist/modules/analytics/drizzle-adapter.d.ts +13 -0
  276. package/dist/modules/analytics/drizzle-adapter.d.ts.map +1 -0
  277. package/dist/modules/analytics/drizzle-adapter.js +358 -0
  278. package/dist/modules/analytics/hooks.d.ts +13 -0
  279. package/dist/modules/analytics/hooks.d.ts.map +1 -0
  280. package/dist/modules/analytics/hooks.js +12 -0
  281. package/dist/modules/analytics/models.d.ts +14 -0
  282. package/dist/modules/analytics/models.d.ts.map +1 -0
  283. package/dist/modules/analytics/models.js +118 -0
  284. package/dist/modules/analytics/repository/index.d.ts +5 -0
  285. package/dist/modules/analytics/repository/index.d.ts.map +1 -0
  286. package/dist/modules/analytics/repository/index.js +1 -0
  287. package/dist/modules/analytics/service.d.ts +45 -0
  288. package/dist/modules/analytics/service.d.ts.map +1 -0
  289. package/dist/modules/analytics/service.js +196 -0
  290. package/dist/modules/analytics/types.d.ts +119 -0
  291. package/dist/modules/analytics/types.d.ts.map +1 -0
  292. package/dist/modules/analytics/types.js +25 -0
  293. package/dist/modules/audit/hooks.d.ts +7 -0
  294. package/dist/modules/audit/hooks.d.ts.map +1 -0
  295. package/dist/modules/audit/hooks.js +67 -0
  296. package/dist/modules/audit/schema.d.ts +178 -0
  297. package/dist/modules/audit/schema.d.ts.map +1 -0
  298. package/dist/modules/audit/schema.js +21 -0
  299. package/dist/modules/audit/service.d.ts +38 -0
  300. package/dist/modules/audit/service.d.ts.map +1 -0
  301. package/dist/modules/audit/service.js +109 -0
  302. package/dist/modules/cart/access.d.ts +11 -0
  303. package/dist/modules/cart/access.d.ts.map +1 -0
  304. package/dist/modules/cart/access.js +18 -0
  305. package/dist/modules/cart/matcher.d.ts +20 -0
  306. package/dist/modules/cart/matcher.d.ts.map +1 -0
  307. package/dist/modules/cart/matcher.js +2 -0
  308. package/dist/modules/cart/repository/in-memory.d.ts +30 -0
  309. package/dist/modules/cart/repository/in-memory.d.ts.map +1 -0
  310. package/dist/modules/cart/repository/in-memory.js +159 -0
  311. package/dist/modules/cart/repository/index.d.ts +45 -0
  312. package/dist/modules/cart/repository/index.d.ts.map +1 -0
  313. package/dist/modules/cart/repository/index.js +158 -0
  314. package/dist/modules/cart/schema.d.ts +359 -0
  315. package/dist/modules/cart/schema.d.ts.map +1 -0
  316. package/dist/modules/cart/schema.js +40 -0
  317. package/dist/modules/cart/schemas.d.ts +29 -0
  318. package/dist/modules/cart/schemas.d.ts.map +1 -0
  319. package/dist/modules/cart/schemas.js +14 -0
  320. package/dist/modules/cart/service.d.ts +63 -0
  321. package/dist/modules/cart/service.d.ts.map +1 -0
  322. package/dist/modules/cart/service.js +339 -0
  323. package/dist/modules/catalog/repository/in-memory.d.ts +82 -0
  324. package/dist/modules/catalog/repository/in-memory.d.ts.map +1 -0
  325. package/dist/modules/catalog/repository/in-memory.js +444 -0
  326. package/dist/modules/catalog/repository/index.d.ts +106 -0
  327. package/dist/modules/catalog/repository/index.d.ts.map +1 -0
  328. package/dist/modules/catalog/repository/index.js +455 -0
  329. package/dist/modules/catalog/schema.d.ts +1193 -0
  330. package/dist/modules/catalog/schema.d.ts.map +1 -0
  331. package/dist/modules/catalog/schema.js +149 -0
  332. package/dist/modules/catalog/schemas.d.ts +81 -0
  333. package/dist/modules/catalog/schemas.d.ts.map +1 -0
  334. package/dist/modules/catalog/schemas.js +62 -0
  335. package/dist/modules/catalog/service.d.ts +160 -0
  336. package/dist/modules/catalog/service.d.ts.map +1 -0
  337. package/dist/modules/catalog/service.js +759 -0
  338. package/dist/modules/customers/repository/in-memory.d.ts +37 -0
  339. package/dist/modules/customers/repository/in-memory.d.ts.map +1 -0
  340. package/dist/modules/customers/repository/in-memory.js +278 -0
  341. package/dist/modules/customers/repository/index.d.ts +47 -0
  342. package/dist/modules/customers/repository/index.d.ts.map +1 -0
  343. package/dist/modules/customers/repository/index.js +206 -0
  344. package/dist/modules/customers/schema.d.ts +560 -0
  345. package/dist/modules/customers/schema.d.ts.map +1 -0
  346. package/dist/modules/customers/schema.js +60 -0
  347. package/dist/modules/customers/service.d.ts +25 -0
  348. package/dist/modules/customers/service.d.ts.map +1 -0
  349. package/dist/modules/customers/service.js +91 -0
  350. package/dist/modules/fulfillment/repository/in-memory.d.ts +53 -0
  351. package/dist/modules/fulfillment/repository/in-memory.d.ts.map +1 -0
  352. package/dist/modules/fulfillment/repository/in-memory.js +327 -0
  353. package/dist/modules/fulfillment/repository/index.d.ts +63 -0
  354. package/dist/modules/fulfillment/repository/index.d.ts.map +1 -0
  355. package/dist/modules/fulfillment/repository/index.js +268 -0
  356. package/dist/modules/fulfillment/schema.d.ts +655 -0
  357. package/dist/modules/fulfillment/schema.d.ts.map +1 -0
  358. package/dist/modules/fulfillment/schema.js +83 -0
  359. package/dist/modules/fulfillment/service.d.ts +58 -0
  360. package/dist/modules/fulfillment/service.d.ts.map +1 -0
  361. package/dist/modules/fulfillment/service.js +338 -0
  362. package/dist/modules/fulfillment/types.d.ts +44 -0
  363. package/dist/modules/fulfillment/types.d.ts.map +1 -0
  364. package/dist/modules/fulfillment/types.js +1 -0
  365. package/dist/modules/inventory/repository/in-memory.d.ts +51 -0
  366. package/dist/modules/inventory/repository/in-memory.d.ts.map +1 -0
  367. package/dist/modules/inventory/repository/in-memory.js +281 -0
  368. package/dist/modules/inventory/repository/index.d.ts +81 -0
  369. package/dist/modules/inventory/repository/index.d.ts.map +1 -0
  370. package/dist/modules/inventory/repository/index.js +310 -0
  371. package/dist/modules/inventory/schema.d.ts +570 -0
  372. package/dist/modules/inventory/schema.d.ts.map +1 -0
  373. package/dist/modules/inventory/schema.js +69 -0
  374. package/dist/modules/inventory/schemas.d.ts +31 -0
  375. package/dist/modules/inventory/schemas.d.ts.map +1 -0
  376. package/dist/modules/inventory/schemas.js +28 -0
  377. package/dist/modules/inventory/service.d.ts +65 -0
  378. package/dist/modules/inventory/service.d.ts.map +1 -0
  379. package/dist/modules/inventory/service.js +271 -0
  380. package/dist/modules/media/adapter.d.ts +16 -0
  381. package/dist/modules/media/adapter.d.ts.map +1 -0
  382. package/dist/modules/media/adapter.js +1 -0
  383. package/dist/modules/media/repository/in-memory.d.ts +26 -0
  384. package/dist/modules/media/repository/in-memory.d.ts.map +1 -0
  385. package/dist/modules/media/repository/in-memory.js +145 -0
  386. package/dist/modules/media/repository/index.d.ts +35 -0
  387. package/dist/modules/media/repository/index.d.ts.map +1 -0
  388. package/dist/modules/media/repository/index.js +176 -0
  389. package/dist/modules/media/schema.d.ts +289 -0
  390. package/dist/modules/media/schema.d.ts.map +1 -0
  391. package/dist/modules/media/schema.js +35 -0
  392. package/dist/modules/media/service.d.ts +42 -0
  393. package/dist/modules/media/service.d.ts.map +1 -0
  394. package/dist/modules/media/service.js +89 -0
  395. package/dist/modules/orders/repository/in-memory.d.ts +40 -0
  396. package/dist/modules/orders/repository/in-memory.d.ts.map +1 -0
  397. package/dist/modules/orders/repository/in-memory.js +245 -0
  398. package/dist/modules/orders/repository/index.d.ts +48 -0
  399. package/dist/modules/orders/repository/index.d.ts.map +1 -0
  400. package/dist/modules/orders/repository/index.js +199 -0
  401. package/dist/modules/orders/schema.d.ts +672 -0
  402. package/dist/modules/orders/schema.d.ts.map +1 -0
  403. package/dist/modules/orders/schema.js +63 -0
  404. package/dist/modules/orders/service.d.ts +85 -0
  405. package/dist/modules/orders/service.d.ts.map +1 -0
  406. package/dist/modules/orders/service.js +313 -0
  407. package/dist/modules/orders/stale-order-cleanup.d.ts +27 -0
  408. package/dist/modules/orders/stale-order-cleanup.d.ts.map +1 -0
  409. package/dist/modules/orders/stale-order-cleanup.js +55 -0
  410. package/dist/modules/organization/service.d.ts +53 -0
  411. package/dist/modules/organization/service.d.ts.map +1 -0
  412. package/dist/modules/organization/service.js +151 -0
  413. package/dist/modules/payments/adapter.d.ts +42 -0
  414. package/dist/modules/payments/adapter.d.ts.map +1 -0
  415. package/dist/modules/payments/adapter.js +1 -0
  416. package/dist/modules/payments/repository/index.d.ts +5 -0
  417. package/dist/modules/payments/repository/index.d.ts.map +1 -0
  418. package/dist/modules/payments/repository/index.js +1 -0
  419. package/dist/modules/payments/service.d.ts +23 -0
  420. package/dist/modules/payments/service.d.ts.map +1 -0
  421. package/dist/modules/payments/service.js +72 -0
  422. package/dist/modules/pricing/repository/in-memory.d.ts +25 -0
  423. package/dist/modules/pricing/repository/in-memory.d.ts.map +1 -0
  424. package/dist/modules/pricing/repository/in-memory.js +288 -0
  425. package/dist/modules/pricing/repository/index.d.ts +34 -0
  426. package/dist/modules/pricing/repository/index.d.ts.map +1 -0
  427. package/dist/modules/pricing/repository/index.js +176 -0
  428. package/dist/modules/pricing/schema.d.ts +565 -0
  429. package/dist/modules/pricing/schema.d.ts.map +1 -0
  430. package/dist/modules/pricing/schema.js +57 -0
  431. package/dist/modules/pricing/schemas.d.ts +37 -0
  432. package/dist/modules/pricing/schemas.d.ts.map +1 -0
  433. package/dist/modules/pricing/schemas.js +30 -0
  434. package/dist/modules/pricing/service.d.ts +62 -0
  435. package/dist/modules/pricing/service.d.ts.map +1 -0
  436. package/dist/modules/pricing/service.js +308 -0
  437. package/dist/modules/promotions/repository/in-memory.d.ts +32 -0
  438. package/dist/modules/promotions/repository/in-memory.d.ts.map +1 -0
  439. package/dist/modules/promotions/repository/in-memory.js +227 -0
  440. package/dist/modules/promotions/repository/index.d.ts +41 -0
  441. package/dist/modules/promotions/repository/index.d.ts.map +1 -0
  442. package/dist/modules/promotions/repository/index.js +204 -0
  443. package/dist/modules/promotions/schema.d.ts +427 -0
  444. package/dist/modules/promotions/schema.d.ts.map +1 -0
  445. package/dist/modules/promotions/schema.js +52 -0
  446. package/dist/modules/promotions/schemas.d.ts +33 -0
  447. package/dist/modules/promotions/schemas.d.ts.map +1 -0
  448. package/dist/modules/promotions/schemas.js +32 -0
  449. package/dist/modules/promotions/service.d.ts +80 -0
  450. package/dist/modules/promotions/service.d.ts.map +1 -0
  451. package/dist/modules/promotions/service.js +347 -0
  452. package/dist/modules/search/adapter.d.ts +51 -0
  453. package/dist/modules/search/adapter.d.ts.map +1 -0
  454. package/dist/modules/search/adapter.js +1 -0
  455. package/dist/modules/search/hooks.d.ts +8 -0
  456. package/dist/modules/search/hooks.d.ts.map +1 -0
  457. package/dist/modules/search/hooks.js +6 -0
  458. package/dist/modules/search/repository/index.d.ts +5 -0
  459. package/dist/modules/search/repository/index.d.ts.map +1 -0
  460. package/dist/modules/search/repository/index.js +1 -0
  461. package/dist/modules/search/service.d.ts +24 -0
  462. package/dist/modules/search/service.d.ts.map +1 -0
  463. package/dist/modules/search/service.js +217 -0
  464. package/dist/modules/shipping/calculator.d.ts +42 -0
  465. package/dist/modules/shipping/calculator.d.ts.map +1 -0
  466. package/dist/modules/shipping/calculator.js +91 -0
  467. package/dist/modules/shipping/repository/index.d.ts +5 -0
  468. package/dist/modules/shipping/repository/index.d.ts.map +1 -0
  469. package/dist/modules/shipping/repository/index.js +1 -0
  470. package/dist/modules/shipping/service.d.ts +28 -0
  471. package/dist/modules/shipping/service.d.ts.map +1 -0
  472. package/dist/modules/shipping/service.js +20 -0
  473. package/dist/modules/tax/adapter.d.ts +58 -0
  474. package/dist/modules/tax/adapter.d.ts.map +1 -0
  475. package/dist/modules/tax/adapter.js +1 -0
  476. package/dist/modules/tax/repository/index.d.ts +5 -0
  477. package/dist/modules/tax/repository/index.d.ts.map +1 -0
  478. package/dist/modules/tax/repository/index.js +1 -0
  479. package/dist/modules/tax/service.d.ts +19 -0
  480. package/dist/modules/tax/service.d.ts.map +1 -0
  481. package/dist/modules/tax/service.js +34 -0
  482. package/dist/modules/webhooks/hook.d.ts +13 -0
  483. package/dist/modules/webhooks/hook.d.ts.map +1 -0
  484. package/dist/modules/webhooks/hook.js +29 -0
  485. package/dist/modules/webhooks/repository/in-memory.d.ts +31 -0
  486. package/dist/modules/webhooks/repository/in-memory.d.ts.map +1 -0
  487. package/dist/modules/webhooks/repository/in-memory.js +187 -0
  488. package/dist/modules/webhooks/repository/index.d.ts +40 -0
  489. package/dist/modules/webhooks/repository/index.d.ts.map +1 -0
  490. package/dist/modules/webhooks/repository/index.js +175 -0
  491. package/dist/modules/webhooks/schema.d.ts +404 -0
  492. package/dist/modules/webhooks/schema.d.ts.map +1 -0
  493. package/dist/modules/webhooks/schema.js +40 -0
  494. package/dist/modules/webhooks/service.d.ts +23 -0
  495. package/dist/modules/webhooks/service.d.ts.map +1 -0
  496. package/dist/modules/webhooks/service.js +92 -0
  497. package/dist/modules/webhooks/signing.d.ts +2 -0
  498. package/dist/modules/webhooks/signing.d.ts.map +1 -0
  499. package/dist/modules/webhooks/signing.js +5 -0
  500. package/dist/modules/webhooks/ssrf-guard.d.ts +19 -0
  501. package/dist/modules/webhooks/ssrf-guard.d.ts.map +1 -0
  502. package/dist/modules/webhooks/ssrf-guard.js +79 -0
  503. package/dist/modules/webhooks/tasks.d.ts +16 -0
  504. package/dist/modules/webhooks/tasks.d.ts.map +1 -0
  505. package/dist/modules/webhooks/tasks.js +35 -0
  506. package/dist/modules/webhooks/worker.d.ts +21 -0
  507. package/dist/modules/webhooks/worker.d.ts.map +1 -0
  508. package/dist/modules/webhooks/worker.js +113 -0
  509. package/dist/runtime/commerce.d.ts +110 -0
  510. package/dist/runtime/commerce.d.ts.map +1 -0
  511. package/dist/runtime/commerce.js +37 -0
  512. package/dist/runtime/kernel.d.ts +72 -0
  513. package/dist/runtime/kernel.d.ts.map +1 -0
  514. package/dist/runtime/kernel.js +298 -0
  515. package/dist/runtime/logger.d.ts +11 -0
  516. package/dist/runtime/logger.d.ts.map +1 -0
  517. package/dist/runtime/logger.js +32 -0
  518. package/dist/runtime/server.d.ts +28 -0
  519. package/dist/runtime/server.d.ts.map +1 -0
  520. package/dist/runtime/server.js +277 -0
  521. package/dist/runtime/shutdown.d.ts +15 -0
  522. package/dist/runtime/shutdown.d.ts.map +1 -0
  523. package/dist/runtime/shutdown.js +34 -0
  524. package/dist/runtime/state-manager.d.ts +14 -0
  525. package/dist/runtime/state-manager.d.ts.map +1 -0
  526. package/dist/runtime/state-manager.js +84 -0
  527. package/dist/runtime/state-repository.d.ts +13 -0
  528. package/dist/runtime/state-repository.d.ts.map +1 -0
  529. package/dist/runtime/state-repository.js +160 -0
  530. package/dist/runtime/state.d.ts +382 -0
  531. package/dist/runtime/state.d.ts.map +1 -0
  532. package/dist/runtime/state.js +37 -0
  533. package/dist/runtime/store.d.ts +382 -0
  534. package/dist/runtime/store.d.ts.map +1 -0
  535. package/dist/runtime/store.js +37 -0
  536. package/dist/test-utils/create-pglite-adapter.d.ts +32 -0
  537. package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -0
  538. package/dist/test-utils/create-pglite-adapter.js +106 -0
  539. package/dist/test-utils/create-plugin-test-app.d.ts +50 -0
  540. package/dist/test-utils/create-plugin-test-app.d.ts.map +1 -0
  541. package/dist/test-utils/create-plugin-test-app.js +74 -0
  542. package/dist/test-utils/create-repository-test-harness.d.ts +8 -0
  543. package/dist/test-utils/create-repository-test-harness.d.ts.map +1 -0
  544. package/dist/test-utils/create-repository-test-harness.js +7 -0
  545. package/dist/test-utils/create-test-config.d.ts +18 -0
  546. package/dist/test-utils/create-test-config.d.ts.map +1 -0
  547. package/dist/test-utils/create-test-config.js +174 -0
  548. package/dist/test-utils/create-test-kernel.d.ts +3 -0
  549. package/dist/test-utils/create-test-kernel.d.ts.map +1 -0
  550. package/dist/test-utils/create-test-kernel.js +5 -0
  551. package/dist/test-utils/create-test-plugin-context.d.ts +42 -0
  552. package/dist/test-utils/create-test-plugin-context.d.ts.map +1 -0
  553. package/dist/test-utils/create-test-plugin-context.js +46 -0
  554. package/dist/test-utils/rest-api-test-utils.d.ts +64 -0
  555. package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -0
  556. package/dist/test-utils/rest-api-test-utils.js +207 -0
  557. package/dist/test-utils/test-actors.d.ts +15 -0
  558. package/dist/test-utils/test-actors.d.ts.map +1 -0
  559. package/dist/test-utils/test-actors.js +57 -0
  560. package/dist/test-utils/typed-hooks.d.ts +43 -0
  561. package/dist/test-utils/typed-hooks.d.ts.map +1 -0
  562. package/dist/test-utils/typed-hooks.js +35 -0
  563. package/dist/tsconfig.tsbuildinfo +1 -0
  564. package/dist/types/commerce-types.d.ts +34 -0
  565. package/dist/types/commerce-types.d.ts.map +1 -0
  566. package/dist/types/commerce-types.js +1 -0
  567. package/dist/utils/id.d.ts +2 -0
  568. package/dist/utils/id.d.ts.map +1 -0
  569. package/dist/utils/id.js +3 -0
  570. package/dist/utils/logger.d.ts +3 -0
  571. package/dist/utils/logger.d.ts.map +1 -0
  572. package/dist/utils/logger.js +16 -0
  573. package/dist/utils/pagination.d.ts +11 -0
  574. package/dist/utils/pagination.d.ts.map +1 -0
  575. package/dist/utils/pagination.js +15 -0
  576. package/package.json +63 -0
  577. package/src/adapters/console-email.ts +43 -0
  578. package/src/auth/access.ts +187 -0
  579. package/src/auth/auth-schema.ts +131 -0
  580. package/src/auth/middleware.ts +115 -0
  581. package/src/auth/org.ts +41 -0
  582. package/src/auth/permissions.ts +28 -0
  583. package/src/auth/setup.ts +160 -0
  584. package/src/auth/system-actor.ts +19 -0
  585. package/src/auth/types.ts +10 -0
  586. package/src/config/defaults.ts +82 -0
  587. package/src/config/define-config.ts +53 -0
  588. package/src/config/types.ts +299 -0
  589. package/src/generated/plugin-capabilities.d.ts +20 -0
  590. package/src/generated/plugin-manifest.ts +23 -0
  591. package/src/generated/plugin-repositories.d.ts +20 -0
  592. package/src/hooks/checkout-completion.ts +262 -0
  593. package/src/hooks/checkout.ts +677 -0
  594. package/src/hooks/order-emails.ts +62 -0
  595. package/src/index.ts +214 -0
  596. package/src/interfaces/mcp/agent-prompt.ts +174 -0
  597. package/src/interfaces/mcp/context-enrichment.ts +177 -0
  598. package/src/interfaces/mcp/server.ts +617 -0
  599. package/src/interfaces/mcp/transport.ts +68 -0
  600. package/src/interfaces/rest/customer-portal.ts +299 -0
  601. package/src/interfaces/rest/index.ts +74 -0
  602. package/src/interfaces/rest/router.ts +334 -0
  603. package/src/interfaces/rest/routes/admin-jobs.ts +58 -0
  604. package/src/interfaces/rest/routes/audit.ts +50 -0
  605. package/src/interfaces/rest/routes/carts.ts +89 -0
  606. package/src/interfaces/rest/routes/catalog.ts +493 -0
  607. package/src/interfaces/rest/routes/checkout.ts +283 -0
  608. package/src/interfaces/rest/routes/inventory.ts +70 -0
  609. package/src/interfaces/rest/routes/media.ts +86 -0
  610. package/src/interfaces/rest/routes/orders.ts +78 -0
  611. package/src/interfaces/rest/routes/payments.ts +60 -0
  612. package/src/interfaces/rest/routes/pricing.ts +57 -0
  613. package/src/interfaces/rest/routes/promotions.ts +92 -0
  614. package/src/interfaces/rest/routes/search.ts +71 -0
  615. package/src/interfaces/rest/routes/webhooks.ts +46 -0
  616. package/src/interfaces/rest/schemas/admin-jobs.ts +40 -0
  617. package/src/interfaces/rest/schemas/audit.ts +46 -0
  618. package/src/interfaces/rest/schemas/carts.ts +125 -0
  619. package/src/interfaces/rest/schemas/catalog.ts +450 -0
  620. package/src/interfaces/rest/schemas/checkout.ts +66 -0
  621. package/src/interfaces/rest/schemas/customer-portal.ts +195 -0
  622. package/src/interfaces/rest/schemas/inventory.ts +138 -0
  623. package/src/interfaces/rest/schemas/media.ts +75 -0
  624. package/src/interfaces/rest/schemas/orders.ts +104 -0
  625. package/src/interfaces/rest/schemas/pricing.ts +80 -0
  626. package/src/interfaces/rest/schemas/promotions.ts +110 -0
  627. package/src/interfaces/rest/schemas/responses.ts +85 -0
  628. package/src/interfaces/rest/schemas/search.ts +58 -0
  629. package/src/interfaces/rest/schemas/shared.ts +62 -0
  630. package/src/interfaces/rest/schemas/webhooks.ts +68 -0
  631. package/src/interfaces/rest/utils.ts +104 -0
  632. package/src/interfaces/rest/webhook-router.ts +50 -0
  633. package/src/kernel/compensation/executor.ts +61 -0
  634. package/src/kernel/compensation/types.ts +26 -0
  635. package/src/kernel/database/adapter.ts +13 -0
  636. package/src/kernel/database/drizzle-db.ts +56 -0
  637. package/src/kernel/database/migrate.ts +76 -0
  638. package/src/kernel/database/plugin-types.ts +34 -0
  639. package/src/kernel/database/schema.ts +49 -0
  640. package/src/kernel/database/scoped-db.ts +68 -0
  641. package/src/kernel/database/tx-context.ts +46 -0
  642. package/src/kernel/error-mapper.ts +15 -0
  643. package/src/kernel/errors.ts +89 -0
  644. package/src/kernel/factory/repository-factory.ts +242 -0
  645. package/src/kernel/hooks/create-context.ts +43 -0
  646. package/src/kernel/hooks/executor.ts +88 -0
  647. package/src/kernel/hooks/registry.ts +74 -0
  648. package/src/kernel/hooks/types.ts +52 -0
  649. package/src/kernel/http-error.ts +44 -0
  650. package/src/kernel/jobs/adapter.ts +36 -0
  651. package/src/kernel/jobs/drizzle-adapter.ts +58 -0
  652. package/src/kernel/jobs/runner.ts +153 -0
  653. package/src/kernel/jobs/schema.ts +46 -0
  654. package/src/kernel/jobs/types.ts +30 -0
  655. package/src/kernel/local-api.ts +185 -0
  656. package/src/kernel/plugin/manifest.ts +253 -0
  657. package/src/kernel/query/executor.ts +184 -0
  658. package/src/kernel/query/registry.ts +46 -0
  659. package/src/kernel/result.ts +33 -0
  660. package/src/kernel/schema/extra-columns.ts +37 -0
  661. package/src/kernel/service-registry.ts +76 -0
  662. package/src/kernel/service-timing.ts +89 -0
  663. package/src/kernel/state-machine/machine.ts +101 -0
  664. package/src/modules/analytics/drizzle-adapter.ts +426 -0
  665. package/src/modules/analytics/hooks.ts +11 -0
  666. package/src/modules/analytics/models.ts +125 -0
  667. package/src/modules/analytics/repository/index.ts +6 -0
  668. package/src/modules/analytics/service.ts +245 -0
  669. package/src/modules/analytics/types.ts +180 -0
  670. package/src/modules/audit/hooks.ts +78 -0
  671. package/src/modules/audit/schema.ts +33 -0
  672. package/src/modules/audit/service.ts +151 -0
  673. package/src/modules/cart/access.ts +27 -0
  674. package/src/modules/cart/matcher.ts +26 -0
  675. package/src/modules/cart/repository/index.ts +234 -0
  676. package/src/modules/cart/schema.ts +42 -0
  677. package/src/modules/cart/schemas.ts +38 -0
  678. package/src/modules/cart/service.ts +541 -0
  679. package/src/modules/catalog/repository/index.ts +772 -0
  680. package/src/modules/catalog/schema.ts +203 -0
  681. package/src/modules/catalog/schemas.ts +104 -0
  682. package/src/modules/catalog/service.ts +1544 -0
  683. package/src/modules/customers/repository/index.ts +327 -0
  684. package/src/modules/customers/schema.ts +64 -0
  685. package/src/modules/customers/service.ts +171 -0
  686. package/src/modules/fulfillment/repository/index.ts +426 -0
  687. package/src/modules/fulfillment/schema.ts +101 -0
  688. package/src/modules/fulfillment/service.ts +555 -0
  689. package/src/modules/fulfillment/types.ts +59 -0
  690. package/src/modules/inventory/repository/index.ts +509 -0
  691. package/src/modules/inventory/schema.ts +94 -0
  692. package/src/modules/inventory/schemas.ts +38 -0
  693. package/src/modules/inventory/service.ts +490 -0
  694. package/src/modules/media/adapter.ts +17 -0
  695. package/src/modules/media/repository/index.ts +274 -0
  696. package/src/modules/media/schema.ts +41 -0
  697. package/src/modules/media/service.ts +151 -0
  698. package/src/modules/orders/repository/index.ts +287 -0
  699. package/src/modules/orders/schema.ts +66 -0
  700. package/src/modules/orders/service.ts +619 -0
  701. package/src/modules/orders/stale-order-cleanup.ts +76 -0
  702. package/src/modules/organization/service.ts +191 -0
  703. package/src/modules/payments/adapter.ts +47 -0
  704. package/src/modules/payments/repository/index.ts +6 -0
  705. package/src/modules/payments/service.ts +107 -0
  706. package/src/modules/pricing/repository/index.ts +291 -0
  707. package/src/modules/pricing/schema.ts +71 -0
  708. package/src/modules/pricing/schemas.ts +38 -0
  709. package/src/modules/pricing/service.ts +494 -0
  710. package/src/modules/promotions/repository/index.ts +325 -0
  711. package/src/modules/promotions/schema.ts +62 -0
  712. package/src/modules/promotions/schemas.ts +38 -0
  713. package/src/modules/promotions/service.ts +598 -0
  714. package/src/modules/search/adapter.ts +57 -0
  715. package/src/modules/search/hooks.ts +12 -0
  716. package/src/modules/search/repository/index.ts +6 -0
  717. package/src/modules/search/service.ts +315 -0
  718. package/src/modules/shipping/calculator.ts +188 -0
  719. package/src/modules/shipping/repository/index.ts +6 -0
  720. package/src/modules/shipping/service.ts +51 -0
  721. package/src/modules/tax/adapter.ts +60 -0
  722. package/src/modules/tax/repository/index.ts +6 -0
  723. package/src/modules/tax/service.ts +53 -0
  724. package/src/modules/webhooks/hook.ts +34 -0
  725. package/src/modules/webhooks/repository/index.ts +278 -0
  726. package/src/modules/webhooks/schema.ts +56 -0
  727. package/src/modules/webhooks/service.ts +117 -0
  728. package/src/modules/webhooks/signing.ts +6 -0
  729. package/src/modules/webhooks/ssrf-guard.ts +71 -0
  730. package/src/modules/webhooks/tasks.ts +52 -0
  731. package/src/modules/webhooks/worker.ts +134 -0
  732. package/src/runtime/commerce.ts +145 -0
  733. package/src/runtime/kernel.ts +419 -0
  734. package/src/runtime/logger.ts +36 -0
  735. package/src/runtime/server.ts +345 -0
  736. package/src/runtime/shutdown.ts +43 -0
  737. package/src/test-utils/create-pglite-adapter.ts +129 -0
  738. package/src/test-utils/create-plugin-test-app.ts +128 -0
  739. package/src/test-utils/create-repository-test-harness.ts +16 -0
  740. package/src/test-utils/create-test-config.ts +190 -0
  741. package/src/test-utils/create-test-kernel.ts +7 -0
  742. package/src/test-utils/create-test-plugin-context.ts +75 -0
  743. package/src/test-utils/rest-api-test-utils.ts +265 -0
  744. package/src/test-utils/test-actors.ts +62 -0
  745. package/src/test-utils/typed-hooks.ts +54 -0
  746. package/src/types/commerce-types.ts +34 -0
  747. package/src/utils/id.ts +3 -0
  748. package/src/utils/logger.ts +18 -0
  749. package/src/utils/pagination.ts +22 -0
@@ -0,0 +1,36 @@
1
+ import pino from "pino";
2
+ import type { CommerceConfig } from "../config/types";
3
+
4
+ export type Logger = pino.Logger;
5
+
6
+ /**
7
+ * Create a structured JSON logger for the commerce engine.
8
+ *
9
+ * Automatically redacts sensitive fields (authorization, password, token, etc.)
10
+ * from all log output. Uses Pino for high-performance, newline-delimited JSON.
11
+ */
12
+ export function createLogger(config: CommerceConfig): Logger {
13
+ return pino({
14
+ level: config.logLevel ?? "info",
15
+ redact: {
16
+ paths: [
17
+ "req.headers.authorization",
18
+ "req.headers.cookie",
19
+ "*.password",
20
+ "*.secret",
21
+ "*.apiKey",
22
+ "*.creditCard",
23
+ "*.token",
24
+ "*.apiToken",
25
+ ],
26
+ censor: "[REDACTED]",
27
+ },
28
+ serializers: {
29
+ req: pino.stdSerializers.req,
30
+ err: pino.stdSerializers.err,
31
+ },
32
+ formatters: {
33
+ level: (label) => ({ level: label }),
34
+ },
35
+ });
36
+ }
@@ -0,0 +1,345 @@
1
+ import { Hono } from "hono";
2
+ import { OpenAPIHono } from "@hono/zod-openapi";
3
+ import { cors } from "hono/cors";
4
+ import { csrf } from "hono/csrf";
5
+ import { bodyLimit } from "hono/body-limit";
6
+ import { rateLimiter } from "hono-rate-limiter";
7
+ import type { Actor } from "../auth/types";
8
+ import type { AuthInstance } from "../auth/setup";
9
+ import type { CommerceConfig } from "../config/types";
10
+ import { createAuth } from "../auth/setup";
11
+ import { authMiddleware } from "../auth/middleware";
12
+ import { createMCPHandler } from "../interfaces/mcp/transport";
13
+ import { createRestRoutes } from "../interfaces/rest";
14
+ import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal";
15
+ import { createKernel } from "./kernel";
16
+ import { ensureDefaultOrg } from "../auth/org";
17
+ import { createLogger, type Logger } from "./logger";
18
+ import { createCommerce, type CommerceInstance } from "./commerce";
19
+
20
+ type ServerEnv = {
21
+ Variables: {
22
+ auth: AuthInstance;
23
+ actor: Actor | null;
24
+ requestId: string;
25
+ logger: Logger;
26
+ };
27
+ };
28
+
29
+ /**
30
+ * Create a full HTTP server (Hono) with all REST routes, auth, and middleware.
31
+ *
32
+ * For server-side frameworks (Next.js, TanStack Start, SvelteKit), use
33
+ * `createCommerce()` instead — it gives you a local API without HTTP overhead.
34
+ */
35
+ export async function createServer(config: CommerceConfig) {
36
+ const commerce = await createCommerce(config);
37
+ const { kernel, auth, logger } = commerce;
38
+ const isProdEnv = process.env.NODE_ENV === "production";
39
+ const app = new OpenAPIHono<ServerEnv>({
40
+ defaultHook: (result, c) => {
41
+ if (!result.success) {
42
+ return c.json({
43
+ error: {
44
+ code: "VALIDATION_FAILED",
45
+ message: isProdEnv
46
+ ? "Invalid input."
47
+ : result.error.issues
48
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
49
+ .join("; "),
50
+ },
51
+ }, 422);
52
+ }
53
+ },
54
+ });
55
+
56
+ // ─── Security Guards ──────────────────────────────────────────────
57
+ if (config.auth?.enableDevKey && process.env.NODE_ENV === "production") {
58
+ throw new Error(
59
+ "FATAL: Dev key MUST NOT be enabled in production. " +
60
+ "Set auth.enableDevKey: false in production config.",
61
+ );
62
+ }
63
+ if (config.auth?.enableDevKey && process.env.NODE_ENV !== "development") {
64
+ logger.warn(
65
+ "Dev key is enabled outside NODE_ENV=development. " +
66
+ "Set auth.enableDevKey: false in production config to disable the dev backdoor.",
67
+ );
68
+ }
69
+
70
+ // ─── Process Crash Handlers (F4) ─────────────────────────────────────
71
+ process.on("unhandledRejection", (reason) => {
72
+ logger.fatal({ err: reason }, "unhandled promise rejection -- exiting");
73
+ process.exit(1);
74
+ });
75
+
76
+ process.on("uncaughtException", (err) => {
77
+ logger.fatal({ err }, "uncaught exception -- exiting");
78
+ process.exit(1);
79
+ });
80
+
81
+ // ─── Security Response Headers ──────────────────────────────────────
82
+ app.use("*", async (c, next) => {
83
+ c.header("X-Content-Type-Options", "nosniff");
84
+ c.header("X-Frame-Options", "DENY");
85
+ c.header("Referrer-Policy", "strict-origin-when-cross-origin");
86
+ c.header("Permissions-Policy", "camera=(), microphone=(), geolocation=()");
87
+ if (isProdEnv) {
88
+ c.header("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
89
+ }
90
+ await next();
91
+ });
92
+
93
+ // ─── Request ID + Logging (F2, F12) ──────────────────────────────────
94
+ app.use("*", async (c, next) => {
95
+ const requestId = c.req.header("x-request-id") ?? crypto.randomUUID();
96
+ c.header("x-request-id", requestId);
97
+ c.set("requestId", requestId);
98
+ const child = logger.child({ requestId, method: c.req.method, path: c.req.path });
99
+ c.set("logger", child);
100
+
101
+ const start = performance.now();
102
+ await next();
103
+
104
+ // Sanitize ZodError responses in production.
105
+ // @hono/zod-openapi returns { success: false, error: { name: "ZodError" } }
106
+ // which leaks schema details. The library does not respect defaultHook for
107
+ // this format, so we intercept at the response level.
108
+ if (isProdEnv && c.res.status >= 400 && c.res.status < 500) {
109
+ const ct = c.res.headers.get("content-type");
110
+ if (ct?.includes("json")) {
111
+ try {
112
+ const body = await c.res.clone().json();
113
+ if (body?.error?.name === "ZodError") {
114
+ c.res = new Response(
115
+ JSON.stringify({ error: { code: "VALIDATION_FAILED", message: "Invalid input." } }),
116
+ { status: 422, headers: { "content-type": "application/json" } },
117
+ );
118
+ }
119
+ } catch { /* non-parseable, skip */ }
120
+ }
121
+ }
122
+
123
+ const duration = Math.round(performance.now() - start);
124
+
125
+ child.info({ status: c.res.status, durationMs: duration }, "request completed");
126
+ });
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
+
140
+ // ─── CSRF Protection (F14) ──────────────────────────────────────────
141
+ app.use("/api/*", csrf({
142
+ origin: trustedOrigins.length > 0
143
+ ? trustedOrigins
144
+ : (process.env.NODE_ENV === "production" ? [] : ["http://localhost:*"]),
145
+ }));
146
+
147
+ // ─── Body Size Limit (F6) ──────────────────────────────────────────
148
+ app.use("*", bodyLimit({
149
+ maxSize: 1024 * 1024, // 1 MB default
150
+ onError: (c) => c.json({
151
+ error: { code: "PAYLOAD_TOO_LARGE", message: "Request body exceeds 1MB limit." },
152
+ }, 413),
153
+ }));
154
+
155
+ // ─── Rate Limiting (F1) ──────────────────────────────────────────────
156
+ // Trust X-Forwarded-For ONLY from a known reverse proxy IP.
157
+ // Set TRUSTED_PROXY_IP env var to the proxy's IP (e.g., "127.0.0.1").
158
+ const trustedProxyIp = process.env.TRUSTED_PROXY_IP;
159
+ const getClientIp = (c: { req: { raw: unknown; header: (name: string) => string | undefined } }): string => {
160
+ const raw = c.req.raw as { socket?: { remoteAddress?: string } };
161
+ const remoteAddress = raw.socket?.remoteAddress;
162
+ // Only trust X-Forwarded-For when the direct connection is from a trusted proxy
163
+ if (trustedProxyIp && remoteAddress === trustedProxyIp) {
164
+ const xff = c.req.header("x-forwarded-for")?.split(",")[0]?.trim();
165
+ if (xff) return xff;
166
+ }
167
+ return remoteAddress ?? "unknown";
168
+ };
169
+ const keyGenerator = getClientIp;
170
+
171
+ app.use("/api/auth/*", rateLimiter({
172
+ windowMs: 60 * 1000,
173
+ limit: config.rateLimits?.auth ?? 10,
174
+ keyGenerator,
175
+ }));
176
+
177
+ app.use("/api/checkout", rateLimiter({
178
+ windowMs: 60 * 1000,
179
+ limit: config.rateLimits?.checkout ?? 5,
180
+ keyGenerator,
181
+ }));
182
+
183
+ app.use("/api/*", rateLimiter({
184
+ windowMs: 60 * 1000,
185
+ limit: config.rateLimits?.api ?? 100,
186
+ keyGenerator,
187
+ }));
188
+
189
+ // ─── Custom Middleware ──────────────────────────────────────────────
190
+ if (config.middleware) {
191
+ for (const middleware of config.middleware) {
192
+ app.use("*", middleware);
193
+ }
194
+ }
195
+
196
+ // ─── Auth ──────────────────────────────────────────────────────────
197
+ app.use("/api/auth/*", async (c, next) => {
198
+ if (c.req.path.startsWith("/api/auth/pos/")) {
199
+ await next();
200
+ return;
201
+ }
202
+ return auth.handler(c.req.raw);
203
+ });
204
+
205
+ app.use("*", authMiddleware(auth, config));
206
+ app.use("*", async (c, next) => {
207
+ c.set("auth", auth);
208
+ await next();
209
+ });
210
+
211
+ // ─── Global Error Handler ─────────────────────────────────────────
212
+ // Sanitize errors in production — no stack traces, no class names, no schema details
213
+ const isProd = process.env.NODE_ENV === "production";
214
+ app.onError((err, c) => {
215
+ // Catch ZodError from @hono/zod-openapi validation (bypasses defaultHook)
216
+ if (err.constructor?.name === "ZodError" || "issues" in err) {
217
+ if (isProd) {
218
+ return c.json(
219
+ { error: { code: "VALIDATION_FAILED", message: "Invalid input." } },
220
+ 422,
221
+ );
222
+ }
223
+ const issues = (err as { issues?: Array<{ path: string[]; message: string }> }).issues ?? [];
224
+ return c.json(
225
+ {
226
+ error: {
227
+ code: "VALIDATION_FAILED",
228
+ message: issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; "),
229
+ },
230
+ },
231
+ 422,
232
+ );
233
+ }
234
+
235
+ if (isProd) {
236
+ logger.error({ err }, "unhandled request error");
237
+ return c.json(
238
+ { error: { code: "INTERNAL_ERROR", message: "An unexpected error occurred." } },
239
+ 500,
240
+ );
241
+ }
242
+ return c.json(
243
+ { error: { code: "INTERNAL_ERROR", message: err.message } },
244
+ 500,
245
+ );
246
+ });
247
+
248
+ // ─── Routes ──────────────────────────────────────────────────────────
249
+ app.route("/api", createRestRoutes(kernel));
250
+ app.route("/mcp", createMCPHandler(kernel, config.mcpTools));
251
+ app.route("/api/me", createCustomerPortalRoutes(kernel));
252
+
253
+ if (config.routes) {
254
+ config.routes(app as unknown as Hono, kernel);
255
+ }
256
+
257
+ // OpenAPI spec — disabled in production unless explicitly enabled
258
+ const exposeSpec = config.exposeOpenApiSpec ?? !isProd;
259
+ if (exposeSpec) {
260
+ app.doc("/api/doc", {
261
+ openapi: "3.0.0",
262
+ info: {
263
+ title: "UnifiedCommerce API",
264
+ version: config.version ?? "0.0.1",
265
+ description: "Headless commerce engine REST API. Includes core and plugin endpoints.",
266
+ },
267
+ });
268
+ } else {
269
+ app.get("/api/doc", (c) => c.json({ error: { code: "NOT_FOUND", message: "Not found." } }, 404));
270
+ }
271
+
272
+ // ─── Job Queue ───────────────────────────────────────────────────────
273
+ // Background job processing: webhook delivery, scheduled orders, email tasks.
274
+ //
275
+ // Three runner strategies (inspired by Payload CMS):
276
+ // 1. autorun: in-process polling (long-running servers)
277
+ // 2. GET /api/jobs/run: cron endpoint (serverless — Vercel, Cloudflare)
278
+ // 3. runPendingJobs() export (custom worker process)
279
+
280
+ const { runPendingJobs } = await import("../kernel/jobs/runner");
281
+ const taskMap = new Map<string, unknown>();
282
+ for (const task of config.jobs?.tasks ?? []) {
283
+ taskMap.set((task as unknown as { slug?: string; name?: string }).slug ?? (task as unknown as { name: string }).name, task);
284
+ }
285
+
286
+ const runJobs = async (queue?: string, limit?: number) => {
287
+ return runPendingJobs({
288
+ db: kernel.database.db as Parameters<typeof runPendingJobs>[0]["db"],
289
+ tasks: taskMap as Parameters<typeof runPendingJobs>[0]["tasks"],
290
+ queue: queue ?? "default",
291
+ limit: limit ?? 10,
292
+ logger: logger as Parameters<typeof runPendingJobs>[0]["logger"],
293
+ services: kernel.services as unknown as Parameters<typeof runPendingJobs>[0]["services"],
294
+ });
295
+ };
296
+
297
+ // Strategy 1: Built-in cron endpoint for serverless deployments.
298
+ // Point Vercel Cron or Cloudflare Cron Trigger at GET /api/jobs/run
299
+ // Optional query params: ?queue=emails&limit=20
300
+ app.get("/api/jobs/run", async (c) => {
301
+ // Always require admin — cron triggers must authenticate
302
+ const actor = c.get("actor") as { permissions?: string[] } | null;
303
+ if (!actor?.permissions?.includes("*:*")) {
304
+ return c.json({ error: { code: "FORBIDDEN", message: "Job runner requires admin access" } }, 403);
305
+ }
306
+
307
+ const queue = c.req.query("queue") ?? "default";
308
+ const limit = parseInt(c.req.query("limit") ?? "10", 10);
309
+
310
+ try {
311
+ const result = await runJobs(queue, limit);
312
+ return c.json({ data: result });
313
+ } catch (err) {
314
+ logger.error({ err }, "Job runner endpoint failed");
315
+ return c.json({ error: { code: "INTERNAL_ERROR", message: "Job processing failed" } }, 500);
316
+ }
317
+ });
318
+
319
+ // Strategy 2: In-process polling for long-running servers (ECS, Cloud Run, Docker).
320
+ // Enable via config.jobs.autorun.enabled = true
321
+ if (config.jobs?.autorun?.enabled) {
322
+ const intervalMs = config.jobs.autorun.intervalMs ?? 10_000;
323
+
324
+ const jobInterval = setInterval(async () => {
325
+ try {
326
+ await runJobs();
327
+ } catch (err) {
328
+ logger.error({ err }, "Job runner iteration failed");
329
+ }
330
+ }, intervalMs);
331
+
332
+ const cleanup = () => clearInterval(jobInterval);
333
+ process.on("SIGTERM", cleanup);
334
+ process.on("SIGINT", cleanup);
335
+
336
+ logger.info({ intervalMs }, "Job queue autorun started (in-process polling)");
337
+ } else {
338
+ logger.info(
339
+ "Job queue autorun disabled. Use GET /api/jobs/run for serverless cron, " +
340
+ "or set config.jobs.autorun.enabled = true for in-process polling.",
341
+ );
342
+ }
343
+
344
+ return { app, kernel, logger, commerce };
345
+ }
@@ -0,0 +1,43 @@
1
+ import type { Logger } from "./logger";
2
+
3
+ /**
4
+ * Sets up graceful shutdown handlers for SIGTERM and SIGINT.
5
+ *
6
+ * On signal:
7
+ * 1. Stops accepting new connections
8
+ * 2. Runs cleanup (close DB pool, flush logs)
9
+ * 3. Force-exits after timeout if cleanup hangs
10
+ */
11
+ export function setupGracefulShutdown(opts: {
12
+ cleanup: () => Promise<void>;
13
+ logger: Logger;
14
+ timeoutMs?: number;
15
+ }): void {
16
+ const { cleanup, logger, timeoutMs = 30_000 } = opts;
17
+ let isShuttingDown = false;
18
+
19
+ async function shutdown(signal: string) {
20
+ if (isShuttingDown) return;
21
+ isShuttingDown = true;
22
+
23
+ logger.info({ signal }, "shutdown signal received, draining connections");
24
+
25
+ const forceTimer = setTimeout(() => {
26
+ logger.error("shutdown timeout exceeded, forcing exit");
27
+ process.exit(1);
28
+ }, timeoutMs);
29
+ forceTimer.unref();
30
+
31
+ try {
32
+ await cleanup();
33
+ logger.info("graceful shutdown complete");
34
+ process.exit(0);
35
+ } catch (err) {
36
+ logger.error({ err }, "error during shutdown");
37
+ process.exit(1);
38
+ }
39
+ }
40
+
41
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
42
+ process.on("SIGINT", () => shutdown("SIGINT"));
43
+ }
@@ -0,0 +1,129 @@
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
+
15
+ import { PGlite } from "@electric-sql/pglite";
16
+ import { drizzle } from "drizzle-orm/pglite";
17
+ import { sql } from "drizzle-orm";
18
+ import { createRequire } from "node:module";
19
+ import type { PgDatabase, PgQueryResultHKT } from "drizzle-orm/pg-core";
20
+ import type { DatabaseAdapter } from "../kernel/database/adapter";
21
+ import { getSchema } from "../kernel/database/migrate";
22
+ import { ensureDefaultOrg } from "../auth/org";
23
+
24
+ // Single barrel import --- includes all core modules + auth tables
25
+ import * as fullSchema from "../kernel/database/schema";
26
+ import type { DrizzleDatabase } from "../kernel/database/drizzle-db";
27
+
28
+ // drizzle-kit/api uses CJS internally; createRequire provides ESM compat.
29
+ const require = createRequire(import.meta.url);
30
+
31
+ /**
32
+ * Pushes the core Drizzle schema to the database using drizzle-kit/api.
33
+ *
34
+ * Replaces the previous approach of reading migration SQL files. Instead,
35
+ * drizzle-kit introspects the live database via information_schema, diffs
36
+ * against the pgTable definitions, and generates the minimal DDL needed.
37
+ *
38
+ * For a fresh PGlite instance, all statements are CREATE TABLE + CREATE INDEX.
39
+ */
40
+ async function pushCoreSchema(db: PgDatabase<PgQueryResultHKT>): Promise<void> {
41
+ const coreSchema = getSchema();
42
+ const drizzleKit = require("drizzle-kit/api") as {
43
+ pushSchema(
44
+ imports: Record<string, unknown>,
45
+ drizzleInstance: PgDatabase<PgQueryResultHKT>,
46
+ ): Promise<{ apply: () => Promise<void> }>;
47
+ };
48
+ const { apply } = await drizzleKit.pushSchema(coreSchema, db);
49
+ await apply();
50
+ }
51
+
52
+ /**
53
+ * Creates a PGlite-backed database adapter for testing.
54
+ *
55
+ * Each call creates a new isolated PGlite instance with its own
56
+ * in-memory database. Core schema is pushed once during initialization.
57
+ *
58
+ * @returns A promise resolving to an object containing:
59
+ * - adapter: The DatabaseAdapter for use with createKernel
60
+ * - db: The Drizzle ORM instance for direct queries
61
+ * - cleanup: Function to truncate all tables (call between tests)
62
+ */
63
+ export async function createPGliteTestAdapter(): Promise<{
64
+ adapter: DatabaseAdapter;
65
+ db: DrizzleDatabase;
66
+ cleanup: () => Promise<void>;
67
+ }> {
68
+ // Create in-memory PGlite instance
69
+ const pg = new PGlite();
70
+
71
+ // Wrap with Drizzle ORM first (pushSchema needs the Drizzle instance)
72
+ const db = drizzle(pg, { schema: fullSchema });
73
+
74
+ // Push core schema via drizzle-kit/api (no migration files needed)
75
+ await pushCoreSchema(db as unknown as PgDatabase<PgQueryResultHKT>);
76
+
77
+ // Ensure the default organization exists for all tests
78
+ await ensureDefaultOrg(db);
79
+
80
+ /**
81
+ * PGlite-compatible transaction wrapper.
82
+ *
83
+ * Drizzle's transaction() method can hang with PGlite due to how
84
+ * the adapter manages transaction state. This implementation uses
85
+ * manual BEGIN/COMMIT control which works more reliably.
86
+ */
87
+ async function transaction<T>(fn: (tx: unknown) => Promise<T>): Promise<T> {
88
+ await pg.exec("BEGIN");
89
+ try {
90
+ const result = await fn(db);
91
+ await pg.exec("COMMIT");
92
+ return result;
93
+ } catch (error) {
94
+ await pg.exec("ROLLBACK");
95
+ throw error;
96
+ }
97
+ }
98
+
99
+ const adapter: DatabaseAdapter = {
100
+ provider: "postgresql",
101
+ db,
102
+ async transaction<T>(fn: (tx: unknown) => Promise<T>): Promise<T> {
103
+ return transaction(fn);
104
+ },
105
+ };
106
+
107
+ /**
108
+ * Cleanup function to reset data between tests.
109
+ * Truncates all tables in reverse dependency order with CASCADE.
110
+ */
111
+ async function cleanup(): Promise<void> {
112
+ await db.execute(sql`
113
+ DO $$ DECLARE
114
+ r RECORD;
115
+ BEGIN
116
+ FOR r IN (
117
+ SELECT tablename FROM pg_tables
118
+ WHERE schemaname = 'public'
119
+ ) LOOP
120
+ EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' CASCADE';
121
+ END LOOP;
122
+ END $$;
123
+ `);
124
+ // Re-insert default org after truncation (CASCADE wipes it)
125
+ await ensureDefaultOrg(db);
126
+ }
127
+
128
+ return { adapter, db, cleanup };
129
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * One-call plugin E2E test setup.
3
+ *
4
+ * Boots a PGlite kernel (or real PG if overridden), programmatically pushes
5
+ * the merged schema (core + plugin tables) via drizzle-kit/api, mounts the
6
+ * test actor middleware on an OpenAPIHono instance, and registers all plugin
7
+ * routes --- matching the production server.ts boot sequence.
8
+ *
9
+ * Usage:
10
+ * import { createPluginTestApp, jsonHeaders, testAdminActor } from "@unifiedcommerce/core";
11
+ * const { app } = await createPluginTestApp(myPlugin());
12
+ * const res = await app.request("/api/my-route", {
13
+ * method: "POST",
14
+ * headers: jsonHeaders(testAdminActor),
15
+ * body: JSON.stringify({ ... }),
16
+ * });
17
+ * expect(res.status).toBe(201);
18
+ */
19
+
20
+ import { OpenAPIHono } from "@hono/zod-openapi";
21
+ import { createRequire } from "node:module";
22
+ import type { PgDatabase, PgQueryResultHKT } from "drizzle-orm/pg-core";
23
+ import type { CommerceConfig, CommercePlugin } from "../config/types";
24
+ import type { Actor } from "../auth/types";
25
+ import { createTestConfig } from "./create-test-config";
26
+ import { createKernel } from "../runtime/kernel";
27
+ import type { Kernel } from "../runtime/kernel";
28
+ import { buildSchema } from "../kernel/database/migrate";
29
+ import { ensureDefaultOrg } from "../auth/org";
30
+
31
+ // drizzle-kit/api uses CJS internally; createRequire provides ESM compat.
32
+ const require = createRequire(import.meta.url);
33
+
34
+ type DrizzleKitPushResult = {
35
+ hasDataLoss: boolean;
36
+ warnings: string[];
37
+ statementsToExecute: string[];
38
+ apply: () => Promise<void>;
39
+ };
40
+
41
+ /**
42
+ * Hono environment type for the test app. Declares the `actor` context
43
+ * variable so c.set("actor", ...) / c.get("actor") are properly typed
44
+ * without `as never` casts.
45
+ */
46
+ export type TestAppEnv = {
47
+ Variables: {
48
+ actor: Actor | null;
49
+ };
50
+ };
51
+
52
+ export interface PluginTestApp {
53
+ /** OpenAPIHono instance with test actor middleware and all plugin routes registered. */
54
+ app: OpenAPIHono<TestAppEnv>;
55
+ /** The booted kernel with database, services, and config. */
56
+ kernel: Kernel;
57
+ /** Drizzle database instance for direct queries in test assertions. */
58
+ db: PgDatabase<PgQueryResultHKT, Record<string, unknown>>;
59
+ }
60
+
61
+ /**
62
+ * Creates a fully-wired test application for plugin E2E testing.
63
+ *
64
+ * @param plugin - The plugin under test (e.g., `appointmentPlugin()`)
65
+ * @param configOverrides - Optional config overrides. Pass `databaseAdapter`
66
+ * to use a real PostgreSQL instance instead of PGlite.
67
+ */
68
+ export async function createPluginTestApp(
69
+ plugin: CommercePlugin,
70
+ configOverrides: Partial<CommerceConfig> = {},
71
+ ): Promise<PluginTestApp> {
72
+ // 1. Build config with plugin applied (PGlite auto-provisioned if no adapter)
73
+ const config = await createTestConfig({
74
+ plugins: [plugin],
75
+ ...configOverrides,
76
+ });
77
+
78
+ // 2. Boot kernel (creates core services, hook registry)
79
+ const kernel = createKernel(config);
80
+
81
+ // 3. Merge core + plugin schemas
82
+ const mergedSchema = buildSchema(config);
83
+
84
+ // 4. Programmatic schema push via drizzle-kit/api
85
+ // Diffs current DB state against pgTable definitions, generates DDL, applies it.
86
+ // On fresh PGlite: creates all tables. On existing DB: creates only missing tables.
87
+ const drizzleKit = require("drizzle-kit/api") as {
88
+ pushSchema(
89
+ imports: Record<string, unknown>,
90
+ drizzleInstance: PgDatabase<PgQueryResultHKT>,
91
+ ): Promise<DrizzleKitPushResult>;
92
+ };
93
+ const { apply } = await drizzleKit.pushSchema(
94
+ mergedSchema,
95
+ kernel.database.db as PgDatabase<PgQueryResultHKT>,
96
+ );
97
+ await apply();
98
+
99
+ // Ensure the default organization exists for plugin tests
100
+ await ensureDefaultOrg(kernel.database.db);
101
+
102
+ // 5. Create OpenAPIHono --- matching production server.ts
103
+ // Plugin routes register via manifest.ts which calls app.openapi().
104
+ const app = new OpenAPIHono<TestAppEnv>();
105
+
106
+ // 6. Test actor middleware: parse x-test-actor header -> set on context
107
+ app.use("*", async (c, next) => {
108
+ const header = c.req.header("x-test-actor");
109
+ if (header) {
110
+ try {
111
+ c.set("actor", JSON.parse(header) as Actor);
112
+ } catch { /* malformed JSON --- fall through without actor */ }
113
+ }
114
+ await next();
115
+ });
116
+
117
+ // 7. Register plugin routes (deferred via config.routes)
118
+ const routes = config.routes as
119
+ | ((app: unknown, kernel: unknown) => void)
120
+ | undefined;
121
+ routes?.(app, kernel);
122
+
123
+ return {
124
+ app,
125
+ kernel,
126
+ db: kernel.database.db as PgDatabase<PgQueryResultHKT, Record<string, unknown>>,
127
+ };
128
+ }