@mantajs/core 0.1.6 → 0.2.0-beta.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 (564) hide show
  1. package/dist/adapters/auth-mock.d.ts +44 -0
  2. package/dist/adapters/auth-mock.d.ts.map +1 -0
  3. package/dist/adapters/auth-mock.js +160 -0
  4. package/dist/adapters/auth-mock.js.map +1 -0
  5. package/dist/adapters/cache-memory.d.ts +11 -0
  6. package/dist/adapters/cache-memory.d.ts.map +1 -0
  7. package/dist/adapters/cache-memory.js +32 -0
  8. package/dist/adapters/cache-memory.js.map +1 -0
  9. package/dist/adapters/database-memory.d.ts +24 -0
  10. package/dist/adapters/database-memory.d.ts.map +1 -0
  11. package/dist/adapters/database-memory.js +141 -0
  12. package/dist/adapters/database-memory.js.map +1 -0
  13. package/dist/adapters/eventbus-memory.d.ts +37 -0
  14. package/dist/adapters/eventbus-memory.d.ts.map +1 -0
  15. package/dist/adapters/eventbus-memory.js +166 -0
  16. package/dist/adapters/eventbus-memory.js.map +1 -0
  17. package/dist/adapters/file-memory.d.ts +24 -0
  18. package/dist/adapters/file-memory.d.ts.map +1 -0
  19. package/dist/adapters/file-memory.js +77 -0
  20. package/dist/adapters/file-memory.js.map +1 -0
  21. package/dist/adapters/http-memory.d.ts +23 -0
  22. package/dist/adapters/http-memory.d.ts.map +1 -0
  23. package/dist/adapters/http-memory.js +149 -0
  24. package/dist/adapters/http-memory.js.map +1 -0
  25. package/dist/adapters/index.d.ts +14 -0
  26. package/dist/adapters/index.d.ts.map +1 -0
  27. package/dist/adapters/index.js +15 -0
  28. package/dist/adapters/index.js.map +1 -0
  29. package/dist/adapters/job-scheduler-memory.d.ts +20 -0
  30. package/dist/adapters/job-scheduler-memory.d.ts.map +1 -0
  31. package/dist/adapters/job-scheduler-memory.js +103 -0
  32. package/dist/adapters/job-scheduler-memory.js.map +1 -0
  33. package/dist/adapters/locking-memory.d.ts +20 -0
  34. package/dist/adapters/locking-memory.d.ts.map +1 -0
  35. package/dist/adapters/locking-memory.js +85 -0
  36. package/dist/adapters/locking-memory.js.map +1 -0
  37. package/dist/adapters/logger-test.d.ts +30 -0
  38. package/dist/adapters/logger-test.d.ts.map +1 -0
  39. package/dist/adapters/logger-test.js +77 -0
  40. package/dist/adapters/logger-test.js.map +1 -0
  41. package/dist/adapters/notification-memory.d.ts +27 -0
  42. package/dist/adapters/notification-memory.d.ts.map +1 -0
  43. package/dist/adapters/notification-memory.js +69 -0
  44. package/dist/adapters/notification-memory.js.map +1 -0
  45. package/dist/adapters/relational-query-memory.d.ts +47 -0
  46. package/dist/adapters/relational-query-memory.d.ts.map +1 -0
  47. package/dist/adapters/relational-query-memory.js +263 -0
  48. package/dist/adapters/relational-query-memory.js.map +1 -0
  49. package/dist/adapters/repository-factory-memory.d.ts +17 -0
  50. package/dist/adapters/repository-factory-memory.d.ts.map +1 -0
  51. package/dist/adapters/repository-factory-memory.js +32 -0
  52. package/dist/adapters/repository-factory-memory.js.map +1 -0
  53. package/dist/adapters/repository-memory.d.ts +30 -0
  54. package/dist/adapters/repository-memory.d.ts.map +1 -0
  55. package/dist/adapters/repository-memory.js +183 -0
  56. package/dist/adapters/repository-memory.js.map +1 -0
  57. package/dist/ai/index.d.ts +53 -0
  58. package/dist/ai/index.d.ts.map +1 -0
  59. package/dist/ai/index.js +48 -0
  60. package/dist/ai/index.js.map +1 -0
  61. package/dist/app/index.d.ts +97 -0
  62. package/dist/app/index.d.ts.map +1 -0
  63. package/dist/app/index.js +217 -0
  64. package/dist/app/index.js.map +1 -0
  65. package/dist/app/request-context.d.ts +35 -0
  66. package/dist/app/request-context.d.ts.map +1 -0
  67. package/dist/app/request-context.js +32 -0
  68. package/dist/app/request-context.js.map +1 -0
  69. package/dist/auth/auth-module-service.d.ts +62 -0
  70. package/dist/auth/auth-module-service.d.ts.map +1 -0
  71. package/dist/auth/auth-module-service.js +210 -0
  72. package/dist/auth/auth-module-service.js.map +1 -0
  73. package/dist/auth/index.d.ts +7 -0
  74. package/dist/auth/index.d.ts.map +1 -0
  75. package/dist/auth/index.js +5 -0
  76. package/dist/auth/index.js.map +1 -0
  77. package/dist/auth/middleware.d.ts +19 -0
  78. package/dist/auth/middleware.d.ts.map +1 -0
  79. package/dist/auth/middleware.js +61 -0
  80. package/dist/auth/middleware.js.map +1 -0
  81. package/dist/auth/models/auth-identity.d.ts +11 -0
  82. package/dist/auth/models/auth-identity.d.ts.map +1 -0
  83. package/dist/auth/models/auth-identity.js +12 -0
  84. package/dist/auth/models/auth-identity.js.map +1 -0
  85. package/dist/auth/providers/emailpass.d.ts +7 -0
  86. package/dist/auth/providers/emailpass.d.ts.map +1 -0
  87. package/dist/auth/providers/emailpass.js +94 -0
  88. package/dist/auth/providers/emailpass.js.map +1 -0
  89. package/dist/auth/providers/types.d.ts +66 -0
  90. package/dist/auth/providers/types.d.ts.map +1 -0
  91. package/dist/auth/providers/types.js +3 -0
  92. package/dist/auth/providers/types.js.map +1 -0
  93. package/dist/auth/types.d.ts +36 -0
  94. package/dist/auth/types.d.ts.map +1 -0
  95. package/dist/auth/types.js +3 -0
  96. package/dist/auth/types.js.map +1 -0
  97. package/dist/command/define-command-graph.d.ts +63 -0
  98. package/dist/command/define-command-graph.d.ts.map +1 -0
  99. package/dist/command/define-command-graph.js +80 -0
  100. package/dist/command/define-command-graph.js.map +1 -0
  101. package/dist/command/dml-to-zod.d.ts +34 -0
  102. package/dist/command/dml-to-zod.d.ts.map +1 -0
  103. package/dist/command/dml-to-zod.js +140 -0
  104. package/dist/command/dml-to-zod.js.map +1 -0
  105. package/dist/command/generate-entity-commands.d.ts +68 -0
  106. package/dist/command/generate-entity-commands.d.ts.map +1 -0
  107. package/dist/command/generate-entity-commands.js +350 -0
  108. package/dist/command/generate-entity-commands.js.map +1 -0
  109. package/dist/command/index.d.ts +54 -0
  110. package/dist/command/index.d.ts.map +1 -0
  111. package/dist/command/index.js +338 -0
  112. package/dist/command/index.js.map +1 -0
  113. package/dist/command/types.d.ts +131 -0
  114. package/dist/command/types.d.ts.map +1 -0
  115. package/dist/command/types.js +2 -0
  116. package/dist/command/types.js.map +1 -0
  117. package/dist/config/built-in-presets.d.ts +20 -0
  118. package/dist/config/built-in-presets.d.ts.map +1 -0
  119. package/dist/config/built-in-presets.js +70 -0
  120. package/dist/config/built-in-presets.js.map +1 -0
  121. package/dist/config/config-manager.d.ts +117 -0
  122. package/dist/config/config-manager.d.ts.map +1 -0
  123. package/dist/config/config-manager.js +245 -0
  124. package/dist/config/config-manager.js.map +1 -0
  125. package/dist/config/define-config.d.ts +20 -0
  126. package/dist/config/define-config.d.ts.map +1 -0
  127. package/dist/config/define-config.js +64 -0
  128. package/dist/config/define-config.js.map +1 -0
  129. package/dist/config/feature-flags.d.ts +48 -0
  130. package/dist/config/feature-flags.d.ts.map +1 -0
  131. package/dist/config/feature-flags.js +97 -0
  132. package/dist/config/feature-flags.js.map +1 -0
  133. package/dist/config/index.d.ts +9 -0
  134. package/dist/config/index.d.ts.map +1 -0
  135. package/dist/config/index.js +8 -0
  136. package/dist/config/index.js.map +1 -0
  137. package/dist/config/presets.d.ts +38 -0
  138. package/dist/config/presets.d.ts.map +1 -0
  139. package/dist/config/presets.js +29 -0
  140. package/dist/config/presets.js.map +1 -0
  141. package/dist/config/types.d.ts +707 -0
  142. package/dist/config/types.d.ts.map +1 -0
  143. package/dist/config/types.js +112 -0
  144. package/dist/config/types.js.map +1 -0
  145. package/dist/context/index.d.ts +95 -0
  146. package/dist/context/index.d.ts.map +1 -0
  147. package/dist/context/index.js +26 -0
  148. package/dist/context/index.js.map +1 -0
  149. package/dist/context/registry.d.ts +32 -0
  150. package/dist/context/registry.d.ts.map +1 -0
  151. package/dist/context/registry.js +142 -0
  152. package/dist/context/registry.js.map +1 -0
  153. package/dist/db/index.d.ts +2 -0
  154. package/dist/db/index.d.ts.map +1 -0
  155. package/dist/db/index.js +4 -0
  156. package/dist/db/index.js.map +1 -0
  157. package/dist/db/schema.d.ts +839 -0
  158. package/dist/db/schema.d.ts.map +1 -0
  159. package/dist/db/schema.js +106 -0
  160. package/dist/db/schema.js.map +1 -0
  161. package/dist/dml/entity.d.ts +132 -0
  162. package/dist/dml/entity.d.ts.map +1 -0
  163. package/dist/dml/entity.js +110 -0
  164. package/dist/dml/entity.js.map +1 -0
  165. package/dist/dml/from-zod.d.ts +13 -0
  166. package/dist/dml/from-zod.d.ts.map +1 -0
  167. package/dist/dml/from-zod.js +81 -0
  168. package/dist/dml/from-zod.js.map +1 -0
  169. package/dist/dml/generator/index.d.ts +62 -0
  170. package/dist/dml/generator/index.d.ts.map +1 -0
  171. package/dist/dml/generator/index.js +208 -0
  172. package/dist/dml/generator/index.js.map +1 -0
  173. package/dist/dml/index.d.ts +11 -0
  174. package/dist/dml/index.d.ts.map +1 -0
  175. package/dist/dml/index.js +13 -0
  176. package/dist/dml/index.js.map +1 -0
  177. package/dist/dml/infer.d.ts +36 -0
  178. package/dist/dml/infer.d.ts.map +1 -0
  179. package/dist/dml/infer.js +5 -0
  180. package/dist/dml/infer.js.map +1 -0
  181. package/dist/dml/model.d.ts +58 -0
  182. package/dist/dml/model.d.ts.map +1 -0
  183. package/dist/dml/model.js +95 -0
  184. package/dist/dml/model.js.map +1 -0
  185. package/dist/dml/modifiers.d.ts +9 -0
  186. package/dist/dml/modifiers.d.ts.map +1 -0
  187. package/dist/dml/modifiers.js +25 -0
  188. package/dist/dml/modifiers.js.map +1 -0
  189. package/dist/dml/properties/array.d.ts +7 -0
  190. package/dist/dml/properties/array.d.ts.map +1 -0
  191. package/dist/dml/properties/array.js +5 -0
  192. package/dist/dml/properties/array.js.map +1 -0
  193. package/dist/dml/properties/autoincrement.d.ts +7 -0
  194. package/dist/dml/properties/autoincrement.d.ts.map +1 -0
  195. package/dist/dml/properties/autoincrement.js +5 -0
  196. package/dist/dml/properties/autoincrement.js.map +1 -0
  197. package/dist/dml/properties/base.d.ts +124 -0
  198. package/dist/dml/properties/base.d.ts.map +1 -0
  199. package/dist/dml/properties/base.js +76 -0
  200. package/dist/dml/properties/base.js.map +1 -0
  201. package/dist/dml/properties/big-number.d.ts +7 -0
  202. package/dist/dml/properties/big-number.d.ts.map +1 -0
  203. package/dist/dml/properties/big-number.js +5 -0
  204. package/dist/dml/properties/big-number.js.map +1 -0
  205. package/dist/dml/properties/boolean.d.ts +7 -0
  206. package/dist/dml/properties/boolean.d.ts.map +1 -0
  207. package/dist/dml/properties/boolean.js +5 -0
  208. package/dist/dml/properties/boolean.js.map +1 -0
  209. package/dist/dml/properties/computed.d.ts +9 -0
  210. package/dist/dml/properties/computed.d.ts.map +1 -0
  211. package/dist/dml/properties/computed.js +22 -0
  212. package/dist/dml/properties/computed.js.map +1 -0
  213. package/dist/dml/properties/date-time.d.ts +7 -0
  214. package/dist/dml/properties/date-time.d.ts.map +1 -0
  215. package/dist/dml/properties/date-time.js +5 -0
  216. package/dist/dml/properties/date-time.js.map +1 -0
  217. package/dist/dml/properties/enum.d.ts +12 -0
  218. package/dist/dml/properties/enum.d.ts.map +1 -0
  219. package/dist/dml/properties/enum.js +14 -0
  220. package/dist/dml/properties/enum.js.map +1 -0
  221. package/dist/dml/properties/float.d.ts +7 -0
  222. package/dist/dml/properties/float.d.ts.map +1 -0
  223. package/dist/dml/properties/float.js +5 -0
  224. package/dist/dml/properties/float.js.map +1 -0
  225. package/dist/dml/properties/index.d.ts +15 -0
  226. package/dist/dml/properties/index.d.ts.map +1 -0
  227. package/dist/dml/properties/index.js +15 -0
  228. package/dist/dml/properties/index.js.map +1 -0
  229. package/dist/dml/properties/json.d.ts +7 -0
  230. package/dist/dml/properties/json.d.ts.map +1 -0
  231. package/dist/dml/properties/json.js +6 -0
  232. package/dist/dml/properties/json.js.map +1 -0
  233. package/dist/dml/properties/nullable.d.ts +23 -0
  234. package/dist/dml/properties/nullable.d.ts.map +1 -0
  235. package/dist/dml/properties/nullable.js +46 -0
  236. package/dist/dml/properties/nullable.js.map +1 -0
  237. package/dist/dml/properties/number.d.ts +10 -0
  238. package/dist/dml/properties/number.d.ts.map +1 -0
  239. package/dist/dml/properties/number.js +13 -0
  240. package/dist/dml/properties/number.js.map +1 -0
  241. package/dist/dml/properties/primary-key.d.ts +14 -0
  242. package/dist/dml/properties/primary-key.d.ts.map +1 -0
  243. package/dist/dml/properties/primary-key.js +23 -0
  244. package/dist/dml/properties/primary-key.js.map +1 -0
  245. package/dist/dml/properties/text.d.ts +15 -0
  246. package/dist/dml/properties/text.d.ts.map +1 -0
  247. package/dist/dml/properties/text.js +19 -0
  248. package/dist/dml/properties/text.js.map +1 -0
  249. package/dist/dml/relations/belongs-to.d.ts +20 -0
  250. package/dist/dml/relations/belongs-to.d.ts.map +1 -0
  251. package/dist/dml/relations/belongs-to.js +29 -0
  252. package/dist/dml/relations/belongs-to.js.map +1 -0
  253. package/dist/dml/relations/has-many.d.ts +16 -0
  254. package/dist/dml/relations/has-many.d.ts.map +1 -0
  255. package/dist/dml/relations/has-many.js +25 -0
  256. package/dist/dml/relations/has-many.js.map +1 -0
  257. package/dist/dml/relations/has-one.d.ts +26 -0
  258. package/dist/dml/relations/has-one.d.ts.map +1 -0
  259. package/dist/dml/relations/has-one.js +46 -0
  260. package/dist/dml/relations/has-one.js.map +1 -0
  261. package/dist/dml/relations/many-to-many.d.ts +9 -0
  262. package/dist/dml/relations/many-to-many.d.ts.map +1 -0
  263. package/dist/dml/relations/many-to-many.js +11 -0
  264. package/dist/dml/relations/many-to-many.js.map +1 -0
  265. package/dist/errors/manta-error.d.ts +68 -0
  266. package/dist/errors/manta-error.d.ts.map +1 -0
  267. package/dist/errors/manta-error.js +80 -0
  268. package/dist/errors/manta-error.js.map +1 -0
  269. package/dist/events/index.d.ts +3 -0
  270. package/dist/events/index.d.ts.map +1 -0
  271. package/dist/events/index.js +3 -0
  272. package/dist/events/index.js.map +1 -0
  273. package/dist/events/message-aggregator.d.ts +25 -0
  274. package/dist/events/message-aggregator.d.ts.map +1 -0
  275. package/dist/events/message-aggregator.js +35 -0
  276. package/dist/events/message-aggregator.js.map +1 -0
  277. package/dist/events/types.d.ts +42 -0
  278. package/dist/events/types.d.ts.map +1 -0
  279. package/dist/events/types.js +3 -0
  280. package/dist/events/types.js.map +1 -0
  281. package/dist/index.d.ts +55 -0
  282. package/dist/index.d.ts.map +1 -0
  283. package/dist/index.js +53 -0
  284. package/dist/index.js.map +1 -0
  285. package/dist/job/index.d.ts +52 -0
  286. package/dist/job/index.d.ts.map +1 -0
  287. package/dist/job/index.js +31 -0
  288. package/dist/job/index.js.map +1 -0
  289. package/dist/link/index.d.ts +97 -0
  290. package/dist/link/index.d.ts.map +1 -0
  291. package/dist/link/index.js +185 -0
  292. package/dist/link/index.js.map +1 -0
  293. package/dist/middleware/define-middleware.d.ts +54 -0
  294. package/dist/middleware/define-middleware.d.ts.map +1 -0
  295. package/dist/middleware/define-middleware.js +40 -0
  296. package/dist/middleware/define-middleware.js.map +1 -0
  297. package/dist/middleware/index.d.ts +56 -0
  298. package/dist/middleware/index.d.ts.map +1 -0
  299. package/dist/middleware/index.js +50 -0
  300. package/dist/middleware/index.js.map +1 -0
  301. package/dist/module/index.d.ts +56 -0
  302. package/dist/module/index.d.ts.map +1 -0
  303. package/dist/module/index.js +52 -0
  304. package/dist/module/index.js.map +1 -0
  305. package/dist/module/versioning.d.ts +27 -0
  306. package/dist/module/versioning.d.ts.map +1 -0
  307. package/dist/module/versioning.js +64 -0
  308. package/dist/module/versioning.js.map +1 -0
  309. package/dist/naming.d.ts +39 -0
  310. package/dist/naming.d.ts.map +1 -0
  311. package/dist/naming.js +95 -0
  312. package/dist/naming.js.map +1 -0
  313. package/dist/ports/analytics.d.ts +7 -0
  314. package/dist/ports/analytics.d.ts.map +1 -0
  315. package/dist/ports/analytics.js +3 -0
  316. package/dist/ports/analytics.js.map +1 -0
  317. package/dist/ports/auth.d.ts +27 -0
  318. package/dist/ports/auth.d.ts.map +1 -0
  319. package/dist/ports/auth.js +3 -0
  320. package/dist/ports/auth.js.map +1 -0
  321. package/dist/ports/cache.d.ts +35 -0
  322. package/dist/ports/cache.d.ts.map +1 -0
  323. package/dist/ports/cache.js +3 -0
  324. package/dist/ports/cache.js.map +1 -0
  325. package/dist/ports/database.d.ts +40 -0
  326. package/dist/ports/database.d.ts.map +1 -0
  327. package/dist/ports/database.js +3 -0
  328. package/dist/ports/database.js.map +1 -0
  329. package/dist/ports/event-bus.d.ts +85 -0
  330. package/dist/ports/event-bus.d.ts.map +1 -0
  331. package/dist/ports/event-bus.js +3 -0
  332. package/dist/ports/event-bus.js.map +1 -0
  333. package/dist/ports/file.d.ts +62 -0
  334. package/dist/ports/file.d.ts.map +1 -0
  335. package/dist/ports/file.js +3 -0
  336. package/dist/ports/file.js.map +1 -0
  337. package/dist/ports/http.d.ts +20 -0
  338. package/dist/ports/http.d.ts.map +1 -0
  339. package/dist/ports/http.js +3 -0
  340. package/dist/ports/http.js.map +1 -0
  341. package/dist/ports/in-memory-progress-channel.d.ts +9 -0
  342. package/dist/ports/in-memory-progress-channel.d.ts.map +1 -0
  343. package/dist/ports/in-memory-progress-channel.js +19 -0
  344. package/dist/ports/in-memory-progress-channel.js.map +1 -0
  345. package/dist/ports/in-memory-queue.d.ts +24 -0
  346. package/dist/ports/in-memory-queue.d.ts.map +1 -0
  347. package/dist/ports/in-memory-queue.js +63 -0
  348. package/dist/ports/in-memory-queue.js.map +1 -0
  349. package/dist/ports/index.d.ts +27 -0
  350. package/dist/ports/index.d.ts.map +1 -0
  351. package/dist/ports/index.js +6 -0
  352. package/dist/ports/index.js.map +1 -0
  353. package/dist/ports/job-scheduler.d.ts +42 -0
  354. package/dist/ports/job-scheduler.d.ts.map +1 -0
  355. package/dist/ports/job-scheduler.js +3 -0
  356. package/dist/ports/job-scheduler.js.map +1 -0
  357. package/dist/ports/locking.d.ts +43 -0
  358. package/dist/ports/locking.d.ts.map +1 -0
  359. package/dist/ports/locking.js +3 -0
  360. package/dist/ports/locking.js.map +1 -0
  361. package/dist/ports/logger.d.ts +65 -0
  362. package/dist/ports/logger.d.ts.map +1 -0
  363. package/dist/ports/logger.js +3 -0
  364. package/dist/ports/logger.js.map +1 -0
  365. package/dist/ports/notification.d.ts +71 -0
  366. package/dist/ports/notification.d.ts.map +1 -0
  367. package/dist/ports/notification.js +3 -0
  368. package/dist/ports/notification.js.map +1 -0
  369. package/dist/ports/progress-channel.d.ts +46 -0
  370. package/dist/ports/progress-channel.d.ts.map +1 -0
  371. package/dist/ports/progress-channel.js +6 -0
  372. package/dist/ports/progress-channel.js.map +1 -0
  373. package/dist/ports/queue.d.ts +21 -0
  374. package/dist/ports/queue.d.ts.map +1 -0
  375. package/dist/ports/queue.js +15 -0
  376. package/dist/ports/queue.js.map +1 -0
  377. package/dist/ports/relational-query.d.ts +37 -0
  378. package/dist/ports/relational-query.d.ts.map +1 -0
  379. package/dist/ports/relational-query.js +3 -0
  380. package/dist/ports/relational-query.js.map +1 -0
  381. package/dist/ports/repository-factory.d.ts +21 -0
  382. package/dist/ports/repository-factory.d.ts.map +1 -0
  383. package/dist/ports/repository-factory.js +4 -0
  384. package/dist/ports/repository-factory.js.map +1 -0
  385. package/dist/ports/repository.d.ts +73 -0
  386. package/dist/ports/repository.d.ts.map +1 -0
  387. package/dist/ports/repository.js +3 -0
  388. package/dist/ports/repository.js.map +1 -0
  389. package/dist/ports/schema-generator.d.ts +15 -0
  390. package/dist/ports/schema-generator.d.ts.map +1 -0
  391. package/dist/ports/schema-generator.js +4 -0
  392. package/dist/ports/schema-generator.js.map +1 -0
  393. package/dist/ports/search.d.ts +7 -0
  394. package/dist/ports/search.d.ts.map +1 -0
  395. package/dist/ports/search.js +3 -0
  396. package/dist/ports/search.js.map +1 -0
  397. package/dist/ports/types.d.ts +112 -0
  398. package/dist/ports/types.d.ts.map +1 -0
  399. package/dist/ports/types.js +26 -0
  400. package/dist/ports/types.js.map +1 -0
  401. package/dist/ports/workflow-store.d.ts +111 -0
  402. package/dist/ports/workflow-store.d.ts.map +1 -0
  403. package/dist/ports/workflow-store.js +5 -0
  404. package/dist/ports/workflow-store.js.map +1 -0
  405. package/dist/query/define-query-graph.d.ts +55 -0
  406. package/dist/query/define-query-graph.d.ts.map +1 -0
  407. package/dist/query/define-query-graph.js +59 -0
  408. package/dist/query/define-query-graph.js.map +1 -0
  409. package/dist/query/define-query.d.ts +79 -0
  410. package/dist/query/define-query.d.ts.map +1 -0
  411. package/dist/query/define-query.js +77 -0
  412. package/dist/query/define-query.js.map +1 -0
  413. package/dist/query/extend-query-graph.d.ts +36 -0
  414. package/dist/query/extend-query-graph.d.ts.map +1 -0
  415. package/dist/query/extend-query-graph.js +34 -0
  416. package/dist/query/extend-query-graph.js.map +1 -0
  417. package/dist/query/index.d.ts +181 -0
  418. package/dist/query/index.d.ts.map +1 -0
  419. package/dist/query/index.js +288 -0
  420. package/dist/query/index.js.map +1 -0
  421. package/dist/service/define.d.ts +97 -0
  422. package/dist/service/define.d.ts.map +1 -0
  423. package/dist/service/define.js +45 -0
  424. package/dist/service/define.js.map +1 -0
  425. package/dist/service/index.d.ts +52 -0
  426. package/dist/service/index.d.ts.map +1 -0
  427. package/dist/service/index.js +281 -0
  428. package/dist/service/index.js.map +1 -0
  429. package/dist/service/instantiate.d.ts +15 -0
  430. package/dist/service/instantiate.d.ts.map +1 -0
  431. package/dist/service/instantiate.js +143 -0
  432. package/dist/service/instantiate.js.map +1 -0
  433. package/dist/service/snapshot-repository.d.ts +31 -0
  434. package/dist/service/snapshot-repository.d.ts.map +1 -0
  435. package/dist/service/snapshot-repository.js +114 -0
  436. package/dist/service/snapshot-repository.js.map +1 -0
  437. package/dist/service/types.d.ts +39 -0
  438. package/dist/service/types.d.ts.map +1 -0
  439. package/dist/service/types.js +3 -0
  440. package/dist/service/types.js.map +1 -0
  441. package/dist/strict-mode/index.d.ts +42 -0
  442. package/dist/strict-mode/index.d.ts.map +1 -0
  443. package/dist/strict-mode/index.js +84 -0
  444. package/dist/strict-mode/index.js.map +1 -0
  445. package/dist/subscriber/index.d.ts +117 -0
  446. package/dist/subscriber/index.d.ts.map +1 -0
  447. package/dist/subscriber/index.js +76 -0
  448. package/dist/subscriber/index.js.map +1 -0
  449. package/dist/testing/relational-query-suite.d.ts +22 -0
  450. package/dist/testing/relational-query-suite.d.ts.map +1 -0
  451. package/dist/testing/relational-query-suite.js +233 -0
  452. package/dist/testing/relational-query-suite.js.map +1 -0
  453. package/dist/user/auto-routes.d.ts +32 -0
  454. package/dist/user/auto-routes.d.ts.map +1 -0
  455. package/dist/user/auto-routes.js +424 -0
  456. package/dist/user/auto-routes.js.map +1 -0
  457. package/dist/user/define-user.d.ts +54 -0
  458. package/dist/user/define-user.d.ts.map +1 -0
  459. package/dist/user/define-user.js +103 -0
  460. package/dist/user/define-user.js.map +1 -0
  461. package/dist/user/index.d.ts +7 -0
  462. package/dist/user/index.d.ts.map +1 -0
  463. package/dist/user/index.js +5 -0
  464. package/dist/user/index.js.map +1 -0
  465. package/dist/user/models/user.d.ts +15 -0
  466. package/dist/user/models/user.d.ts.map +1 -0
  467. package/dist/user/models/user.js +16 -0
  468. package/dist/user/models/user.js.map +1 -0
  469. package/dist/user/user-module-service.d.ts +55 -0
  470. package/dist/user/user-module-service.d.ts.map +1 -0
  471. package/dist/user/user-module-service.js +100 -0
  472. package/dist/user/user-module-service.js.map +1 -0
  473. package/dist/workflows/ai-step.d.ts +2 -0
  474. package/dist/workflows/ai-step.d.ts.map +1 -0
  475. package/dist/workflows/ai-step.js +54 -0
  476. package/dist/workflows/ai-step.js.map +1 -0
  477. package/dist/workflows/create-step.d.ts +16 -0
  478. package/dist/workflows/create-step.d.ts.map +1 -0
  479. package/dist/workflows/create-step.js +194 -0
  480. package/dist/workflows/create-step.js.map +1 -0
  481. package/dist/workflows/create-workflow.d.ts +16 -0
  482. package/dist/workflows/create-workflow.d.ts.map +1 -0
  483. package/dist/workflows/create-workflow.js +21 -0
  484. package/dist/workflows/create-workflow.js.map +1 -0
  485. package/dist/workflows/define-workflow.d.ts +55 -0
  486. package/dist/workflows/define-workflow.d.ts.map +1 -0
  487. package/dist/workflows/define-workflow.js +72 -0
  488. package/dist/workflows/define-workflow.js.map +1 -0
  489. package/dist/workflows/emit-event-step.d.ts +17 -0
  490. package/dist/workflows/emit-event-step.d.ts.map +1 -0
  491. package/dist/workflows/emit-event-step.js +46 -0
  492. package/dist/workflows/emit-event-step.js.map +1 -0
  493. package/dist/workflows/for-each.d.ts +6 -0
  494. package/dist/workflows/for-each.d.ts.map +1 -0
  495. package/dist/workflows/for-each.js +79 -0
  496. package/dist/workflows/for-each.js.map +1 -0
  497. package/dist/workflows/index.d.ts +15 -0
  498. package/dist/workflows/index.d.ts.map +1 -0
  499. package/dist/workflows/index.js +12 -0
  500. package/dist/workflows/index.js.map +1 -0
  501. package/dist/workflows/manager.d.ts +99 -0
  502. package/dist/workflows/manager.d.ts.map +1 -0
  503. package/dist/workflows/manager.js +450 -0
  504. package/dist/workflows/manager.js.map +1 -0
  505. package/dist/workflows/orphan-reaper.d.ts +50 -0
  506. package/dist/workflows/orphan-reaper.d.ts.map +1 -0
  507. package/dist/workflows/orphan-reaper.js +69 -0
  508. package/dist/workflows/orphan-reaper.js.map +1 -0
  509. package/dist/workflows/progress-helper.d.ts +20 -0
  510. package/dist/workflows/progress-helper.d.ts.map +1 -0
  511. package/dist/workflows/progress-helper.js +48 -0
  512. package/dist/workflows/progress-helper.js.map +1 -0
  513. package/dist/workflows/step.d.ts +103 -0
  514. package/dist/workflows/step.d.ts.map +1 -0
  515. package/dist/workflows/step.js +949 -0
  516. package/dist/workflows/step.js.map +1 -0
  517. package/dist/workflows/types.d.ts +215 -0
  518. package/dist/workflows/types.d.ts.map +1 -0
  519. package/dist/workflows/types.js +9 -0
  520. package/dist/workflows/types.js.map +1 -0
  521. package/dist/workflows/yield.d.ts +12 -0
  522. package/dist/workflows/yield.d.ts.map +1 -0
  523. package/dist/workflows/yield.js +29 -0
  524. package/dist/workflows/yield.js.map +1 -0
  525. package/docs/00-overview.md +254 -0
  526. package/docs/01-getting-started.md +224 -0
  527. package/docs/02-models.md +163 -0
  528. package/docs/03-services.md +208 -0
  529. package/docs/04-users.md +165 -0
  530. package/docs/05-commands.md +501 -0
  531. package/docs/06-queries.md +342 -0
  532. package/docs/07-events.md +248 -0
  533. package/docs/08-links.md +182 -0
  534. package/docs/09-agents.md +142 -0
  535. package/docs/10-spa.md +327 -0
  536. package/docs/11-config.md +481 -0
  537. package/docs/12-constraints.md +183 -0
  538. package/docs/13-testing.md +345 -0
  539. package/docs/14-adapters.md +204 -0
  540. package/docs/15-hosts.md +163 -0
  541. package/docs/16-reference.md +274 -0
  542. package/docs/17-dashboard.md +619 -0
  543. package/docs/AGENT.md +501 -0
  544. package/package.json +49 -52
  545. package/.medusa/server/src/admin/index.js +0 -5358
  546. package/.medusa/server/src/admin/index.mjs +0 -5356
  547. package/.medusa/server/src/api/admin/companies/[id]/route.js +0 -39
  548. package/.medusa/server/src/api/admin/companies/middlewares.js +0 -41
  549. package/.medusa/server/src/api/admin/companies/route.js +0 -37
  550. package/.medusa/server/src/api/admin/companies/validators.js +0 -29
  551. package/.medusa/server/src/api/middlewares.js +0 -8
  552. package/.medusa/server/src/index.js +0 -5
  553. package/.medusa/server/src/modules/company/index.js +0 -13
  554. package/.medusa/server/src/modules/company/migrations/Migration20260126141741.js +0 -26
  555. package/.medusa/server/src/modules/company/models/company.js +0 -24
  556. package/.medusa/server/src/modules/company/models/employee.js +0 -15
  557. package/.medusa/server/src/modules/company/models/index.js +0 -11
  558. package/.medusa/server/src/modules/company/service.js +0 -11
  559. package/.medusa/server/src/workflows/create-company.js +0 -10
  560. package/.medusa/server/src/workflows/delete-company.js +0 -10
  561. package/.medusa/server/src/workflows/steps/create-company.js +0 -16
  562. package/.medusa/server/src/workflows/steps/delete-company.js +0 -30
  563. package/.medusa/server/src/workflows/steps/update-company.js +0 -30
  564. package/.medusa/server/src/workflows/update-company.js +0 -10
@@ -0,0 +1,345 @@
1
+ # Testing
2
+
3
+ ## Philosophy
4
+
5
+ The framework provides `@mantajs/test-utils` with in-memory adapters, spies, and helpers so tests run fast (no database, no network) and are deterministic.
6
+
7
+ **Types of tests:**
8
+
9
+ | Type | What it tests | Speed | Database |
10
+ |------|--------------|-------|----------|
11
+ | Unit | Models, services, validators | <1ms | No |
12
+ | Integration | Commands, workflows, compensation | <100ms | No (in-memory) |
13
+ | E2E | Full HTTP flow (command → event → subscriber) | <500ms | Optional |
14
+
15
+ ## Project structure
16
+
17
+ Tests live in a `tests/` folder at the root of your project (outside `src/`):
18
+
19
+ ```
20
+ my-project/
21
+ ├── src/
22
+ │ ├── modules/
23
+ │ ├── commands/
24
+ │ ├── queries/
25
+ │ └── ...
26
+ ├── tests/
27
+ │ ├── unit/
28
+ │ │ ├── product.test.ts # Service CRUD + custom methods
29
+ │ │ ├── inventory.test.ts
30
+ │ │ └── commands.test.ts # Command validation
31
+ │ ├── integration/
32
+ │ │ ├── create-product.test.ts # Full workflow with compensation
33
+ │ │ └── auth.test.ts # Login/logout flow
34
+ │ └── e2e/
35
+ │ └── api.test.ts # HTTP endpoint testing
36
+ ├── manta.config.ts
37
+ └── package.json
38
+ ```
39
+
40
+ Why outside `src/`? The framework scans `src/` for modules, commands, queries, etc. Test files in `src/` could be picked up accidentally.
41
+
42
+ ## Setup
43
+
44
+ ```typescript
45
+ import {
46
+ createTestMantaApp,
47
+ InMemoryCacheAdapter,
48
+ InMemoryEventBusAdapter,
49
+ InMemoryFileAdapter,
50
+ InMemoryLockingAdapter,
51
+ InMemoryRepository,
52
+ TestLogger,
53
+ } from '@mantajs/test-utils'
54
+ import { describe, expect, it, beforeEach, afterEach } from 'vitest'
55
+
56
+ function makeTestInfra() {
57
+ return {
58
+ eventBus: new InMemoryEventBusAdapter(),
59
+ logger: new TestLogger(),
60
+ cache: new InMemoryCacheAdapter(),
61
+ locking: new InMemoryLockingAdapter(),
62
+ file: new InMemoryFileAdapter(),
63
+ }
64
+ }
65
+
66
+ describe('My tests', () => {
67
+ let app: TestMantaApp
68
+
69
+ beforeEach(() => {
70
+ app = createTestMantaApp({ infra: makeTestInfra() })
71
+ })
72
+
73
+ afterEach(async () => {
74
+ await app.dispose()
75
+ })
76
+ })
77
+ ```
78
+
79
+ ## Testing a service
80
+
81
+ ```typescript
82
+ import { InMemoryRepository, instantiateServiceDescriptor } from '@mantajs/test-utils'
83
+ import productService from '../src/modules/catalog/entities/product/service'
84
+ import productModel from '../src/modules/catalog/entities/product/model'
85
+
86
+ describe('Product service', () => {
87
+ let repo: InMemoryRepository
88
+ let service: Record<string, Function>
89
+
90
+ beforeEach(() => {
91
+ repo = new InMemoryRepository('product')
92
+ service = instantiateServiceDescriptor(productService, repo, undefined, new TestLogger())
93
+ })
94
+
95
+ it('createProducts creates a product', async () => {
96
+ const product = await service.createProducts({
97
+ title: 'Widget', sku: 'W-001', price: 999, status: 'draft',
98
+ })
99
+ expect(product.title).toBe('Widget')
100
+ expect(product.id).toBeDefined()
101
+ })
102
+
103
+ it('activate changes status', async () => {
104
+ const product = await service.createProducts({
105
+ title: 'Widget', sku: 'W-001', price: 999, status: 'draft',
106
+ })
107
+ await service.activate(product.id)
108
+ const updated = await repo.find({ where: { id: product.id } })
109
+ expect(updated[0].status).toBe('active')
110
+ })
111
+
112
+ it('listProducts returns all products', async () => {
113
+ await service.createProducts({ title: 'A', sku: 'A-001', price: 10, status: 'draft' })
114
+ await service.createProducts({ title: 'B', sku: 'B-001', price: 20, status: 'active' })
115
+ const list = await service.listProducts()
116
+ expect(list).toHaveLength(2)
117
+ })
118
+ })
119
+ ```
120
+
121
+ Service methods are auto-compensated via repository snapshots. No manual `__compensate` needed.
122
+
123
+ ## Testing a command
124
+
125
+ ```typescript
126
+ describe('create-product command', () => {
127
+ it('validates input with Zod', () => {
128
+ const cmd = defineCommand({
129
+ name: 'create-product',
130
+ description: 'Create a product',
131
+ input: z.object({
132
+ title: z.string().min(1),
133
+ sku: z.string(),
134
+ price: z.number().min(0),
135
+ }),
136
+ workflow: async (input, { step }) => {
137
+ return await step.service.catalog.create(input)
138
+ },
139
+ })
140
+
141
+ // Valid input
142
+ expect(cmd.input.safeParse({ title: 'Widget', sku: 'W-001', price: 99 }).success).toBe(true)
143
+
144
+ // Invalid input
145
+ expect(cmd.input.safeParse({ title: '', price: -1 }).success).toBe(false)
146
+ })
147
+ })
148
+ ```
149
+
150
+ ## Testing a subscriber
151
+
152
+ Subscribers receive `(event, { command, log })`. Test them by calling the handler directly:
153
+
154
+ ```typescript
155
+ import productCreated from '../src/subscribers/product-created'
156
+
157
+ describe('product-created subscriber', () => {
158
+ it('dispatches a command', async () => {
159
+ let commandCalled = false
160
+ const mockCommand = {
161
+ initializeInventory: async (input: unknown) => { commandCalled = true },
162
+ }
163
+ const mockLog = { info: () => {}, warn: () => {}, error: () => {} }
164
+
165
+ const event = {
166
+ eventName: 'product.created',
167
+ data: { id: 'prod_1', sku: 'W-001' },
168
+ metadata: { timestamp: Date.now() },
169
+ }
170
+
171
+ await productCreated.handler(event, { command: mockCommand, log: mockLog })
172
+ expect(commandCalled).toBe(true)
173
+ })
174
+ })
175
+ ```
176
+
177
+ ## Testing a job
178
+
179
+ Jobs also receive `{ command, log }`:
180
+
181
+ ```typescript
182
+ import cleanupJob from '../src/jobs/cleanup-drafts'
183
+
184
+ describe('cleanup-drafts job', () => {
185
+ it('dispatches cleanup command', async () => {
186
+ let cleanupInput: unknown = null
187
+ const mockCommand = {
188
+ cleanupDraftProducts: async (input: unknown) => { cleanupInput = input },
189
+ }
190
+ const mockLog = { info: () => {} }
191
+
192
+ await cleanupJob.handler({ command: mockCommand, log: mockLog })
193
+ expect(cleanupInput).toEqual({ olderThanDays: 30 })
194
+ })
195
+ })
196
+ ```
197
+
198
+ ## Testing events with spies
199
+
200
+ ```typescript
201
+ describe('Event emission', () => {
202
+ let bus: InMemoryEventBusAdapter
203
+
204
+ beforeEach(() => {
205
+ bus = new InMemoryEventBusAdapter()
206
+ })
207
+
208
+ it('product.created event is emitted', async () => {
209
+ const received: Message[] = []
210
+ bus.subscribe('product.created', (event) => { received.push(event) })
211
+
212
+ await bus.emit({
213
+ eventName: 'product.created',
214
+ data: { id: 'prod_1', sku: 'W-001' },
215
+ metadata: { timestamp: Date.now() },
216
+ })
217
+
218
+ expect(received).toHaveLength(1)
219
+ expect(received[0].data).toEqual({ id: 'prod_1', sku: 'W-001' })
220
+ })
221
+
222
+ it('grouped events are buffered until release', async () => {
223
+ const received: Message[] = []
224
+ bus.subscribe('order.placed', (event) => { received.push(event) })
225
+
226
+ await bus.emit(
227
+ { eventName: 'order.placed', data: { id: 'ord_1' }, metadata: { timestamp: Date.now() } },
228
+ { groupId: 'workflow-1' },
229
+ )
230
+
231
+ expect(received).toHaveLength(0) // Buffered
232
+
233
+ await bus.releaseGroupedEvents('workflow-1')
234
+ expect(received).toHaveLength(1) // Released
235
+ })
236
+ })
237
+ ```
238
+
239
+ ## Testing queries
240
+
241
+ ```typescript
242
+ import { QueryService } from '@mantajs/test-utils'
243
+
244
+ describe('list-products query', () => {
245
+ it('returns products via graph', async () => {
246
+ const queryService = new QueryService()
247
+ queryService.registerResolver('product', async (config) => {
248
+ return [
249
+ { id: '1', title: 'Widget', status: 'active' },
250
+ { id: '2', title: 'Gadget', status: 'draft' },
251
+ ].filter((p) => !config.filters?.status || p.status === config.filters.status)
252
+ })
253
+
254
+ const result = await queryService.graph({
255
+ entity: 'product',
256
+ filters: { status: 'active' },
257
+ })
258
+
259
+ expect(result).toHaveLength(1)
260
+ expect(result[0].title).toBe('Widget')
261
+ })
262
+ })
263
+ ```
264
+
265
+ ## Testing with database (integration)
266
+
267
+ For tests that need a real PostgreSQL database:
268
+
269
+ ```typescript
270
+ import { createTestDatabase, waitForPg } from '@mantajs/test-utils/pg'
271
+
272
+ describe('Database integration', () => {
273
+ let dbUrl: string
274
+ let cleanup: () => Promise<void>
275
+
276
+ beforeAll(async () => {
277
+ await waitForPg(30)
278
+ const result = await createTestDatabase('test_catalog')
279
+ dbUrl = result.url
280
+ cleanup = result.cleanup
281
+ })
282
+
283
+ afterAll(async () => {
284
+ await cleanup()
285
+ })
286
+
287
+ it('creates and queries products', async () => {
288
+ // Use dbUrl to connect a real DrizzlePgAdapter
289
+ })
290
+ })
291
+ ```
292
+
293
+ Name integration test files with `.integration.test.ts` — they are excluded from `pnpm test` and run separately via `pnpm test:integration`.
294
+
295
+ ## Test utilities reference
296
+
297
+ | Utility | Purpose |
298
+ |---------|---------|
299
+ | `createTestMantaApp(options)` | Create test app with in-memory adapters |
300
+ | `InMemoryRepository(name)` | In-memory data store |
301
+ | `InMemoryEventBusAdapter()` | Event pub/sub with grouped events |
302
+ | `InMemoryCacheAdapter()` | Key-value cache with TTL |
303
+ | `InMemoryLockingAdapter()` | Distributed lock simulation |
304
+ | `InMemoryFileAdapter()` | File storage simulation |
305
+ | `InMemoryJobScheduler()` | Cron job simulation |
306
+ | `TestLogger()` | Logger that captures output |
307
+ | `MockAuthPort()` | Mock JWT/API key verification |
308
+ | `MockAuthModuleService()` | Mock auth with session management |
309
+ | `MessageAggregator()` | Capture events emitted by services |
310
+ | `instantiateServiceDescriptor()` | Create service instance from defineService result |
311
+ | `QueryService()` | Test query handlers with mock resolvers |
312
+ | `WorkflowManager(app)` | Execute workflows in tests |
313
+ | `createTestDatabase(name)` | Isolated PostgreSQL DB per test file |
314
+ | `resetAll(app)` | Reset all in-memory state between tests |
315
+ | `spyOnEvents(app)` | Intercept events for assertions |
316
+
317
+ ## Running tests
318
+
319
+ ```bash
320
+ # Unit + integration tests (fast, no DB)
321
+ pnpm test
322
+
323
+ # Integration tests only (needs PostgreSQL)
324
+ pnpm test:integration
325
+
326
+ # Specific file
327
+ npx vitest run tests/unit/product.test.ts
328
+
329
+ # Watch mode
330
+ npx vitest tests/unit/product.test.ts
331
+ ```
332
+
333
+ ## AI guidance: writing tests
334
+
335
+ When generating tests:
336
+
337
+ 1. **Start with CRUD** — Test all auto-generated methods first (createX, listX, retrieveX, updateX, deleteX)
338
+ 2. **Test custom methods** — Each method defined in defineService
339
+ 3. **Test validation** — Invalid inputs via Zod safeParse
340
+ 4. **Test events** — Verify CRUD operations emit `entity.created`, `entity.updated`, `entity.deleted`
341
+ 5. **Test subscribers** — Call handler directly with mock `{ command, log }`
342
+ 6. **Test jobs** — Call handler directly with mock `{ command, log }`
343
+ 7. **Use in-memory adapters** — No database needed for unit tests
344
+ 8. **Isolate tests** — `beforeEach` creates fresh state, `afterEach` disposes. No shared state.
345
+ 9. **Name clearly** — `it('createProducts creates a product with valid data')`
@@ -0,0 +1,204 @@
1
+ # Creating Adapters
2
+
3
+ An adapter is a concrete implementation of a port interface. The framework ships with in-memory adapters for dev and production adapters for cloud platforms. You can create your own for any service.
4
+
5
+ ## Port interfaces
6
+
7
+ Every infrastructure concern is abstracted behind a port. Here are all ports you can implement:
8
+
9
+ | Port | Responsibility | Dev adapter | Prod adapter |
10
+ |------|---------------|-------------|--------------|
11
+ | `ICachePort` | Key-value cache | InMemoryCacheAdapter | UpstashCacheAdapter |
12
+ | `IEventBusPort` | Event pub/sub | InMemoryEventBusAdapter | Upstash Queues |
13
+ | `IFilePort` | File storage | InMemoryFileAdapter | VercelBlobAdapter |
14
+ | `ILoggerPort` | Structured logging | TestLogger | PinoLoggerAdapter |
15
+ | `ILockingPort` | Distributed locks | InMemoryLockingAdapter | Neon advisory locks |
16
+ | `IJobSchedulerPort` | Cron scheduling | InMemoryJobScheduler | VercelCronAdapter |
17
+ | `IDatabasePort` | Database connection | InMemoryDatabaseAdapter | DrizzlePgAdapter |
18
+ | `IHttpPort` | HTTP server | InMemoryHttpAdapter | H3Adapter |
19
+ | `IRepository` | Entity CRUD | InMemoryRepository | DrizzleRepository |
20
+ | `INotificationPort` | Notifications | InMemoryNotificationAdapter | (custom) |
21
+ | `IAuthPort` | JWT/API key crypto | MockAuthPort | (built-in) |
22
+
23
+ ## Creating a cache adapter (example)
24
+
25
+ ### 1. Implement the port interface
26
+
27
+ ```typescript
28
+ // packages/manta-adapter-cache-redis/src/adapter.ts
29
+ import type { ICachePort } from '@mantajs/core'
30
+ import { MantaError } from '@mantajs/core'
31
+ import { createClient } from 'redis'
32
+
33
+ export interface RedisCacheOptions {
34
+ url?: string
35
+ }
36
+
37
+ export class RedisCacheAdapter implements ICachePort {
38
+ private client: ReturnType<typeof createClient>
39
+
40
+ constructor(options: RedisCacheOptions = {}) {
41
+ const url = options.url ?? process.env.REDIS_URL
42
+ if (!url) throw new MantaError('INVALID_DATA', 'REDIS_URL is required for RedisCacheAdapter')
43
+ this.client = createClient({ url })
44
+ }
45
+
46
+ async get(key: string): Promise<unknown> {
47
+ const value = await this.client.get(key)
48
+ return value ? JSON.parse(value) : null
49
+ }
50
+
51
+ async set(key: string, data: unknown, ttl?: number): Promise<void> {
52
+ const serialized = JSON.stringify(data)
53
+ if (ttl) {
54
+ await this.client.set(key, serialized, { EX: Math.ceil(ttl / 1000) })
55
+ } else {
56
+ await this.client.set(key, serialized)
57
+ }
58
+ }
59
+
60
+ async invalidate(key: string): Promise<void> {
61
+ await this.client.del(key)
62
+ }
63
+
64
+ async clear(): Promise<void> {
65
+ await this.client.flushDb()
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### 2. Create the barrel export
71
+
72
+ ```typescript
73
+ // packages/manta-adapter-cache-redis/src/index.ts
74
+ export type { RedisCacheOptions } from './adapter'
75
+ export { RedisCacheAdapter } from './adapter'
76
+ ```
77
+
78
+ ### 3. Package metadata
79
+
80
+ ```json
81
+ {
82
+ "name": "manta-adapter-cache-redis",
83
+ "version": "1.0.0",
84
+ "type": "module",
85
+ "main": "src/index.ts",
86
+ "exports": { ".": "./src/index.ts" },
87
+ "peerDependencies": { "@mantajs/core": ">=0.1.0" },
88
+ "dependencies": { "redis": "^4.0.0" }
89
+ }
90
+ ```
91
+
92
+ ### 4. Register in config
93
+
94
+ ```typescript
95
+ // manta.config.ts
96
+ export default defineConfig({
97
+ adapters: {
98
+ ICachePort: {
99
+ adapter: 'manta-adapter-cache-redis',
100
+ options: { url: process.env.REDIS_URL },
101
+ },
102
+ },
103
+ })
104
+ ```
105
+
106
+ ## Port interface reference
107
+
108
+ ### ICachePort
109
+
110
+ ```typescript
111
+ interface ICachePort {
112
+ get(key: string): Promise<unknown>
113
+ set(key: string, data: unknown, ttl?: number): Promise<void>
114
+ invalidate(key: string): Promise<void>
115
+ clear(): Promise<void>
116
+ }
117
+ ```
118
+
119
+ ### IEventBusPort
120
+
121
+ ```typescript
122
+ interface IEventBusPort {
123
+ emit(event: Message | Message[]): Promise<void>
124
+ subscribe(eventName: string, handler: (event: Message) => Promise<void> | void, options?: { subscriberId?: string }): void
125
+ unsubscribe(subscriberId: string): void
126
+ releaseGroupedEvents(eventGroupId: string): Promise<void>
127
+ clearGroupedEvents(eventGroupId: string): Promise<void>
128
+ }
129
+ ```
130
+
131
+ ### IFilePort
132
+
133
+ ```typescript
134
+ interface IFilePort {
135
+ upload(key: string, data: Buffer | ReadableStream, contentType?: string): Promise<{ key: string; url: string }>
136
+ delete(key: string | string[]): Promise<void>
137
+ getPresignedDownloadUrl(key: string): Promise<string>
138
+ getDownloadStream(key: string): Promise<ReadableStream>
139
+ getAsBuffer(key: string): Promise<Buffer>
140
+ list(prefix?: string): Promise<string[]>
141
+ }
142
+ ```
143
+
144
+ ### ILockingPort
145
+
146
+ ```typescript
147
+ interface ILockingPort {
148
+ execute<T>(keys: string[], job: () => Promise<T>, options?: { timeout?: number }): Promise<T>
149
+ acquire(keys: string | string[], options?: { ownerId?: string; expire?: number }): Promise<boolean>
150
+ release(keys: string | string[], options?: { ownerId?: string }): Promise<void>
151
+ releaseAll(options?: { ownerId?: string }): Promise<void>
152
+ }
153
+ ```
154
+
155
+ ### ILoggerPort
156
+
157
+ ```typescript
158
+ interface ILoggerPort {
159
+ error(msg: string, ...args: unknown[]): void
160
+ warn(msg: string, ...args: unknown[]): void
161
+ info(msg: string, ...args: unknown[]): void
162
+ debug(msg: string, ...args: unknown[]): void
163
+ setLogLevel(level: string): void
164
+ }
165
+ ```
166
+
167
+ ### IJobSchedulerPort
168
+
169
+ ```typescript
170
+ interface IJobSchedulerPort {
171
+ register(name: string, schedule: string, handler: (ctx: { app: MantaApp }) => Promise<JobResult>, options?: { concurrency?: 'allow' | 'forbid'; timeout?: number }): void
172
+ runJob(name: string): Promise<JobResult>
173
+ getJobHistory(jobName: string, limit?: number): Promise<JobExecution[]>
174
+ }
175
+ ```
176
+
177
+ ### IDatabasePort
178
+
179
+ ```typescript
180
+ interface IDatabasePort {
181
+ initialize(config: DatabaseConfig): Promise<void>
182
+ dispose(): Promise<void>
183
+ healthCheck(): Promise<boolean>
184
+ getClient(): unknown
185
+ getPool(): unknown
186
+ raw<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<T[]>
187
+ transaction<T>(fn: (tx: unknown) => Promise<T>, options?: TransactionOptions): Promise<T>
188
+ }
189
+ ```
190
+
191
+ ## Naming convention
192
+
193
+ Published adapters: `manta-adapter-{port}-{implementation}`
194
+
195
+ Examples:
196
+ - `manta-adapter-cache-redis`
197
+ - `manta-adapter-cache-memcached`
198
+ - `manta-adapter-file-s3`
199
+ - `manta-adapter-file-gcs`
200
+ - `manta-adapter-eventbus-kafka`
201
+ - `manta-adapter-locking-redis`
202
+ - `manta-adapter-database-mysql` (if supported in the future)
203
+
204
+ Include `AGENT.md` with instructions for AI and `README.md` with setup/config docs.
@@ -0,0 +1,163 @@
1
+ # Creating Hosts
2
+
3
+ A host bridges Manta's HTTP adapter (H3Adapter) to a specific runtime or server framework. The default host is Nitro (which powers Nuxt). You can create hosts for Express, Fastify, Hono, AWS Lambda, Cloudflare Workers, etc.
4
+
5
+ ## What a host does
6
+
7
+ 1. Bootstraps the Manta app (calls `bootstrapApp()`)
8
+ 2. Mounts the H3Adapter's routes on the target server
9
+ 3. Handles request/response translation (if the target uses a different API than Web `Request`/`Response`)
10
+ 4. Manages lifecycle (startup, shutdown, health checks)
11
+
12
+ ## Default host: Nitro
13
+
14
+ Manta ships with a Nitro host (`packages/host-nitro/`). It:
15
+ - Starts a Nitro dev server with HMR
16
+ - Mounts the H3Adapter as middleware
17
+ - Handles the catch-all route `server/routes/[...].ts`
18
+ - Passes requests through to Manta's 12-step pipeline
19
+
20
+ ## Creating a custom host
21
+
22
+ ### Example: Express host
23
+
24
+ ```typescript
25
+ // packages/manta-host-express/src/index.ts
26
+ import express from 'express'
27
+ import { bootstrapApp } from '@mantajs/cli/bootstrap'
28
+
29
+ export async function startExpressHost(options: { port?: number; cwd?: string } = {}) {
30
+ const port = options.port ?? 3000
31
+ const cwd = options.cwd ?? process.cwd()
32
+
33
+ // Bootstrap the Manta app (same as manta dev / manta start)
34
+ const { app, adapter, logger, shutdown } = await bootstrapApp({
35
+ cwd,
36
+ mode: 'production',
37
+ })
38
+
39
+ // Create Express app
40
+ const server = express()
41
+
42
+ // Mount Manta's H3 adapter — translate Express req/res to Web Request/Response
43
+ server.all('*', async (req, res) => {
44
+ const url = new URL(req.url, `http://${req.headers.host}`)
45
+ const webRequest = new Request(url, {
46
+ method: req.method,
47
+ headers: Object.fromEntries(
48
+ Object.entries(req.headers).filter(([_, v]) => v != null) as [string, string][],
49
+ ),
50
+ body: ['GET', 'HEAD'].includes(req.method) ? undefined : req,
51
+ })
52
+
53
+ const webResponse = await adapter.handleRequest(webRequest)
54
+
55
+ res.status(webResponse.status)
56
+ for (const [key, value] of webResponse.headers.entries()) {
57
+ res.setHeader(key, value)
58
+ }
59
+ const body = await webResponse.text()
60
+ res.send(body)
61
+ })
62
+
63
+ // Start
64
+ server.listen(port, () => {
65
+ logger.info(`Manta (Express) running at http://localhost:${port}`)
66
+ })
67
+
68
+ // Graceful shutdown
69
+ process.on('SIGTERM', async () => {
70
+ await shutdown()
71
+ process.exit(0)
72
+ })
73
+ }
74
+ ```
75
+
76
+ ### Example: AWS Lambda host
77
+
78
+ ```typescript
79
+ // packages/manta-host-lambda/src/index.ts
80
+ import { bootstrapApp } from '@mantajs/cli/bootstrap'
81
+
82
+ let bootstrapped: Awaited<ReturnType<typeof bootstrapApp>> | null = null
83
+
84
+ export async function handler(event: APIGatewayProxyEventV2) {
85
+ // Cold start: bootstrap once
86
+ if (!bootstrapped) {
87
+ bootstrapped = await bootstrapApp({ cwd: process.cwd(), mode: 'production' })
88
+ }
89
+
90
+ // Translate Lambda event to Web Request
91
+ const url = `https://${event.requestContext.domainName}${event.rawPath}${event.rawQueryString ? '?' + event.rawQueryString : ''}`
92
+ const request = new Request(url, {
93
+ method: event.requestContext.http.method,
94
+ headers: event.headers as Record<string, string>,
95
+ body: event.body ? Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf-8') : undefined,
96
+ })
97
+
98
+ // Delegate to Manta
99
+ const response = await bootstrapped.adapter.handleRequest(request)
100
+
101
+ // Translate back to Lambda response
102
+ return {
103
+ statusCode: response.status,
104
+ headers: Object.fromEntries(response.headers.entries()),
105
+ body: await response.text(),
106
+ }
107
+ }
108
+ ```
109
+
110
+ ## The host interface
111
+
112
+ A host must:
113
+
114
+ 1. **Call `bootstrapApp()`** — This returns the fully wired `MantaApp` + `H3Adapter` + `logger` + `shutdown()`
115
+ 2. **Translate requests** — Convert the target runtime's request format to Web `Request`, call `adapter.handleRequest(request)`, convert `Response` back
116
+ 3. **Handle lifecycle** — Call `shutdown()` on SIGTERM/SIGINT for graceful cleanup (connection pools, pending jobs, etc.)
117
+
118
+ The H3Adapter's `handleRequest(request: Request): Promise<Response>` is the single entry point. It runs the full 12-step pipeline (auth, validation, routing, error handling).
119
+
120
+ ## What the pipeline provides
121
+
122
+ Every request passing through `adapter.handleRequest()` goes through:
123
+
124
+ | Step | What it does |
125
+ |------|-------------|
126
+ | 1. RequestID | Adds correlation ID header |
127
+ | 2. CORS | Origin validation |
128
+ | 3. Rate limit | Sliding window by IP (if enabled) |
129
+ | 4. Scope | Creates AsyncLocalStorage context |
130
+ | 5. Body parser | Parses JSON body |
131
+ | 6. Auth | Extracts AuthContext from Bearer/API key/Cookie |
132
+ | 7. Publishable key | Adds to context (if applicable) |
133
+ | 8. Validation | Zod schema check (for commands) |
134
+ | 9. Custom | App-defined middleware |
135
+ | 10. RBAC | Role-based access (if enabled) |
136
+ | 11. Handler | Route execution |
137
+ | 12. Error handler | Catch + format MantaError → HTTP response |
138
+
139
+ ## Naming convention
140
+
141
+ Published hosts: `manta-host-{runtime}`
142
+
143
+ Examples:
144
+ - `manta-host-express`
145
+ - `manta-host-fastify`
146
+ - `manta-host-hono`
147
+ - `manta-host-lambda`
148
+ - `manta-host-cloudflare`
149
+ - `manta-host-bun`
150
+ - `manta-host-deno`
151
+
152
+ Include `AGENT.md` with deployment instructions and `README.md` with setup docs.
153
+
154
+ ## Package structure
155
+
156
+ ```
157
+ manta-host-express/
158
+ ├── src/
159
+ │ └── index.ts # startExpressHost() + Lambda handler
160
+ ├── package.json # name: "manta-host-express"
161
+ ├── AGENT.md # AI instructions for deployment
162
+ └── README.md # Setup & config docs
163
+ ```