@mantajs/core 0.1.7 → 0.2.0-beta.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 (566) 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 -5493
  546. package/.medusa/server/src/admin/index.mjs +0 -5491
  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/admin/employees/middlewares.js +0 -15
  552. package/.medusa/server/src/api/admin/employees/route.js +0 -21
  553. package/.medusa/server/src/api/middlewares.js +0 -9
  554. package/.medusa/server/src/index.js +0 -5
  555. package/.medusa/server/src/modules/company/index.js +0 -13
  556. package/.medusa/server/src/modules/company/migrations/Migration20260126141741.js +0 -26
  557. package/.medusa/server/src/modules/company/models/company.js +0 -24
  558. package/.medusa/server/src/modules/company/models/employee.js +0 -15
  559. package/.medusa/server/src/modules/company/models/index.js +0 -11
  560. package/.medusa/server/src/modules/company/service.js +0 -11
  561. package/.medusa/server/src/workflows/create-company.js +0 -10
  562. package/.medusa/server/src/workflows/delete-company.js +0 -10
  563. package/.medusa/server/src/workflows/steps/create-company.js +0 -16
  564. package/.medusa/server/src/workflows/steps/delete-company.js +0 -30
  565. package/.medusa/server/src/workflows/steps/update-company.js +0 -30
  566. package/.medusa/server/src/workflows/update-company.js +0 -10
@@ -0,0 +1,619 @@
1
+ # Dashboard — defineSpa(), definePage() & defineForm()
2
+
3
+ ## Philosophy
4
+
5
+ The backend is fast because it's constrained: `defineModel()` + `defineService()` leave no room for error. The dashboard follows the same principle: **declarative specs, not React pages.**
6
+
7
+ Three primitives:
8
+
9
+ - `defineSpa()` — SPA configuration (navigation, branding, settings)
10
+ - `definePage()` — display page (listing, detail, dashboard, anything)
11
+ - `defineForm()` — form overlay (create, edit)
12
+
13
+ Pages are composed of **blocks** — reusable components provided by the framework or created by the developer. Blocks are standard React components. The framework provides ~10 built-in blocks. Developers can add their own.
14
+
15
+ **The AI never writes React.** It writes `defineSpa()`, `definePage()` and `defineForm()` specs using a finite vocabulary of blocks. The result is consistent, error-free, and maintainable.
16
+
17
+ ---
18
+
19
+ ## SPA — Auto-detected from filesystem
20
+
21
+ SPAs are auto-detected from `src/spa/{name}/`. Everything is auto-discovered:
22
+
23
+ ```
24
+ src/spa/admin/
25
+ ├── config.ts # defineSpa() — navigation, title, branding
26
+ ├── pages/
27
+ │ ├── page.tsx # → /admin/ (React page, for custom home)
28
+ │ ├── products/
29
+ │ │ └── page.ts # → /admin/products (listing)
30
+ │ ├── products/[id]/
31
+ │ │ └── page.ts # → /admin/products/:id (detail)
32
+ │ │ └── edit/
33
+ │ │ └── page.ts # → /admin/products/:id/edit (form overlay)
34
+ │ ├── products/create/
35
+ │ │ └── page.ts # → /admin/products/create (form overlay)
36
+ │ └── dashboard/
37
+ │ └── page.ts # → /admin/dashboard
38
+ ├── blocks/ # Custom blocks (auto-discovered)
39
+ │ ├── inventory-matrix.tsx
40
+ │ └── pricing-editor.tsx
41
+ └── components/ # Local React components (not blocks)
42
+ └── product-card.tsx
43
+ ```
44
+
45
+ **Auto-discovered:**
46
+ - `config.ts` → SPA configuration (navigation, branding)
47
+ - `pages/` → file-based routing (`.ts` for specs, `.tsx` for React pages)
48
+ - `blocks/` → custom blocks (kebab-case filename → PascalCase type)
49
+
50
+ **Route = filesystem path.** No route declaration in `definePage()`.
51
+
52
+ **`.ts` not `.tsx`** — pages export `definePage()` or `defineForm()` specs (pure data), not JSX. Only files in `blocks/` and `components/` are `.tsx`.
53
+
54
+ ---
55
+
56
+ ## defineSpa()
57
+
58
+ Defines the SPA's configuration: navigation, branding, settings. Auto-discovered from `src/spa/{name}/config.ts`.
59
+
60
+ ```typescript
61
+ // src/spa/admin/config.ts
62
+ import { defineSpa } from '@mantajs/dashboard'
63
+
64
+ export default defineSpa({
65
+ title: 'Commerce Admin',
66
+ logo: '/logo.svg',
67
+ favicon: '/favicon.ico',
68
+ primaryColor: '#6366f1',
69
+
70
+ navigation: [
71
+ { icon: 'LayoutGrid', label: 'Dashboard', to: '/dashboard' },
72
+ { icon: 'Tag', label: 'Products', to: '/products', items: [
73
+ { label: 'Categories', to: '/categories' },
74
+ { label: 'Collections', to: '/collections' },
75
+ ]},
76
+ { icon: 'ShoppingCart', label: 'Orders', to: '/orders' },
77
+ { icon: 'Users', label: 'Customers', to: '/customers', items: [
78
+ { label: 'Groups', to: '/customer-groups' },
79
+ ]},
80
+ ],
81
+
82
+ settings: [
83
+ { icon: 'Store', label: 'Store Details', to: '/settings/store' },
84
+ { icon: 'Users', label: 'Team', to: '/settings/team' },
85
+ { icon: 'Key', label: 'API Keys', to: '/settings/api-keys' },
86
+ ],
87
+
88
+ defaultRedirect: '/dashboard',
89
+ })
90
+ ```
91
+
92
+ ### Navigation
93
+
94
+ | Property | Type | Description |
95
+ |----------|------|-------------|
96
+ | `icon` | `string` | Lucide icon name (`'Users'`, `'Tag'`, `'ShoppingCart'`, etc.) |
97
+ | `label` | `string` | Display label in the sidebar |
98
+ | `to` | `string` | Route path |
99
+ | `items` | `Array<{ label, to }>` | Nested sub-items (one level) |
100
+
101
+ ### Branding
102
+
103
+ | Property | Type | Description |
104
+ |----------|------|-------------|
105
+ | `title` | `string` | App name in sidebar header |
106
+ | `logo` | `string` | Path to logo image |
107
+ | `favicon` | `string` | Path to favicon |
108
+ | `primaryColor` | `string` | Brand color (CSS value) |
109
+
110
+ ### Settings
111
+
112
+ `settings` defines a separate navigation section at the bottom of the sidebar (gear icon). Same interface as `navigation` items.
113
+
114
+ ---
115
+
116
+ ## definePage()
117
+
118
+ A page is a composition of blocks with optional layout.
119
+
120
+ ### Listing page
121
+
122
+ ```typescript
123
+ // src/spa/admin/pages/products/page.ts
124
+ export default definePage({
125
+ header: { title: 'Products', actions: ['create'] },
126
+ main: [
127
+ {
128
+ type: 'DataTable',
129
+ query: {
130
+ graph: {
131
+ entity: 'product',
132
+ fields: ['title', 'status', 'price', 'created_at'],
133
+ pagination: { limit: 20 },
134
+ sort: { field: 'created_at', order: 'desc' },
135
+ },
136
+ },
137
+ columns: [
138
+ { key: 'title', label: 'Product' },
139
+ { key: 'price', label: 'Price', format: 'currency' },
140
+ { key: 'status', label: 'Status', format: 'badge' },
141
+ { key: 'created_at', label: 'Created', format: 'date' },
142
+ ],
143
+ searchable: ['title'],
144
+ navigateTo: '/admin/products/:id',
145
+ },
146
+ ],
147
+ })
148
+ ```
149
+
150
+ ### Detail page
151
+
152
+ ```typescript
153
+ // src/spa/admin/pages/products/[id]/page.ts
154
+ export default definePage({
155
+ header: { titleField: 'title', statusField: 'status', actions: ['edit', 'delete'] },
156
+ main: [
157
+ {
158
+ type: 'InfoCard',
159
+ title: 'General',
160
+ query: {
161
+ graph: {
162
+ entity: 'product',
163
+ fields: ['title', 'description', 'handle', 'price'],
164
+ },
165
+ },
166
+ },
167
+ {
168
+ type: 'RelationTable',
169
+ title: 'Variants',
170
+ query: {
171
+ graph: {
172
+ entity: 'product',
173
+ relations: ['variant'],
174
+ fields: ['variant.sku', 'variant.price', 'variant.stock'],
175
+ },
176
+ },
177
+ columns: [
178
+ { key: 'sku', label: 'SKU' },
179
+ { key: 'price', label: 'Price', format: 'currency' },
180
+ { key: 'stock', label: 'Stock', format: 'number' },
181
+ ],
182
+ },
183
+ {
184
+ type: 'MediaCard',
185
+ query: {
186
+ graph: {
187
+ entity: 'product',
188
+ relations: ['image'],
189
+ },
190
+ },
191
+ },
192
+ ],
193
+ sidebar: [
194
+ {
195
+ type: 'InfoCard',
196
+ title: 'Status',
197
+ query: {
198
+ graph: {
199
+ entity: 'product',
200
+ fields: ['status'],
201
+ },
202
+ },
203
+ },
204
+ {
205
+ type: 'InfoCard',
206
+ title: 'Dates',
207
+ query: {
208
+ graph: {
209
+ entity: 'product',
210
+ fields: ['created_at', 'updated_at'],
211
+ },
212
+ },
213
+ },
214
+ ],
215
+ })
216
+ ```
217
+
218
+ ### Dashboard page (multiple entities, no shared entity)
219
+
220
+ ```typescript
221
+ // src/spa/admin/pages/dashboard/page.ts
222
+ export default definePage({
223
+ header: { title: 'Dashboard' },
224
+ main: [
225
+ {
226
+ type: 'StatsCard',
227
+ query: { name: 'dashboard-stats', input: { period: 'month' } },
228
+ metrics: [
229
+ { key: 'orders_count', label: 'Orders', format: 'number' },
230
+ { key: 'revenue', label: 'Revenue', format: 'currency' },
231
+ { key: 'new_customers', label: 'New Customers', format: 'number' },
232
+ ],
233
+ },
234
+ {
235
+ type: 'DataTable',
236
+ title: 'Recent Orders',
237
+ query: {
238
+ graph: {
239
+ entity: 'order',
240
+ fields: ['number', 'total', 'status', 'created_at'],
241
+ pagination: { limit: 5 },
242
+ sort: { field: 'created_at', order: 'desc' },
243
+ },
244
+ },
245
+ columns: [
246
+ { key: 'number', label: 'Order' },
247
+ { key: 'total', label: 'Total', format: 'currency' },
248
+ { key: 'status', label: 'Status', format: 'badge' },
249
+ ],
250
+ },
251
+ ],
252
+ })
253
+ ```
254
+
255
+ ### Layout rules
256
+
257
+ - **`sidebar` present** → two-column layout (main + sidebar)
258
+ - **`sidebar` absent** → single-column layout
259
+ - **No layout declaration needed** — inferred from structure
260
+
261
+ ---
262
+
263
+ ## defineForm()
264
+
265
+ Forms render as overlays (FocusModal by default) on top of the parent route.
266
+
267
+ ### Simple create form
268
+
269
+ ```typescript
270
+ // src/spa/admin/pages/products/create/page.ts
271
+ export default defineForm({
272
+ title: 'Create Product',
273
+ command: 'create-product',
274
+ fields: [
275
+ { key: 'title', label: 'Title', type: 'text', required: true },
276
+ { key: 'description', label: 'Description', type: 'textarea' },
277
+ { key: 'handle', label: 'Handle', type: 'text' },
278
+ { key: 'price', label: 'Price', type: 'currency' },
279
+ { key: 'status', label: 'Status', type: 'select', options: ['draft', 'active', 'archived'] },
280
+ ],
281
+ })
282
+ ```
283
+
284
+ ### Edit form
285
+
286
+ ```typescript
287
+ // src/spa/admin/pages/products/[id]/edit/page.ts
288
+ export default defineForm({
289
+ title: 'Edit Product',
290
+ command: 'update-product',
291
+ query: {
292
+ graph: {
293
+ entity: 'product',
294
+ fields: ['title', 'description', 'handle', 'price', 'status'],
295
+ },
296
+ },
297
+ fields: [
298
+ { key: 'title', label: 'Title', type: 'text', required: true },
299
+ { key: 'description', label: 'Description', type: 'textarea' },
300
+ { key: 'handle', label: 'Handle', type: 'text' },
301
+ { key: 'price', label: 'Price', type: 'currency' },
302
+ { key: 'status', label: 'Status', type: 'select', options: ['draft', 'active', 'archived'] },
303
+ ],
304
+ })
305
+ ```
306
+
307
+ The framework detects edit mode from the route (`:id` param) and pre-fills the form with data from the `query`.
308
+
309
+ ### Multi-step form
310
+
311
+ ```typescript
312
+ // src/spa/admin/pages/products/create/page.ts
313
+ export default defineForm({
314
+ title: 'Create Product',
315
+ command: 'create-product',
316
+ steps: [
317
+ {
318
+ name: 'General',
319
+ fields: [
320
+ { key: 'title', label: 'Title', type: 'text', required: true },
321
+ { key: 'description', label: 'Description', type: 'textarea' },
322
+ { key: 'price', label: 'Price', type: 'currency' },
323
+ ],
324
+ },
325
+ {
326
+ name: 'Media',
327
+ blocks: [
328
+ { type: 'MediaUpload', relation: 'images', multiple: true },
329
+ ],
330
+ },
331
+ {
332
+ name: 'Inventory',
333
+ blocks: [
334
+ { type: 'InventoryMatrix', warehouses: ['paris', 'lyon'] },
335
+ ],
336
+ },
337
+ ],
338
+ })
339
+ ```
340
+
341
+ Each step contains either `fields` (auto-rendered form fields) or `blocks` (custom block components).
342
+
343
+ ### Form field types
344
+
345
+ | Type | Renders as | Deduced from model |
346
+ |------|-----------|-------------------|
347
+ | `text` | Input | `field.text()` |
348
+ | `textarea` | Textarea | `field.text()` with long content |
349
+ | `number` | Number input | `field.number()` |
350
+ | `currency` | Currency input | `field.number()` with currency context |
351
+ | `select` | Select dropdown | `field.enum([...])` |
352
+ | `boolean` | Toggle switch | `field.boolean()` |
353
+ | `date` | Date picker | `field.dateTime()` |
354
+ | `entity-select` | EntitySelect modal | From `defineLink()` |
355
+ | `media` | File upload | Relation to file entity |
356
+
357
+ ---
358
+
359
+ ## Query in blocks
360
+
361
+ Every block that needs data declares a `query` prop. Two modes, matching the backend exactly:
362
+
363
+ ### Graph query — `useGraphQuery()` under the hood
364
+
365
+ ```typescript
366
+ query: {
367
+ graph: {
368
+ entity: 'product',
369
+ fields: ['title', 'status', 'price'],
370
+ filters: { status: 'active' },
371
+ relations: ['variant', 'image'],
372
+ pagination: { limit: 20, offset: 0 },
373
+ sort: { field: 'created_at', order: 'desc' },
374
+ },
375
+ }
376
+ ```
377
+
378
+ This is the exact same contract as `query.graph()` in the backend and `useGraphQuery()` in `@mantajs/sdk`. The block calls `useGraphQuery()` internally with this config.
379
+
380
+ **Requires** `defineQueryGraph()` in the SPA's context. If the context has `defineQueryGraph('*')`, all entities are available. If scoped, only listed entities work. If no `defineQueryGraph` exists, graph queries are not available — use named queries instead.
381
+
382
+ ### Named query — `useQuery()` under the hood
383
+
384
+ ```typescript
385
+ query: {
386
+ name: 'dashboard-stats',
387
+ input: { period: 'month' },
388
+ }
389
+ ```
390
+
391
+ Calls the `defineQuery()` endpoint. The input matches the Zod schema defined in the backend.
392
+
393
+ ---
394
+
395
+ ## Query consolidation (automatic)
396
+
397
+ The framework reads all `query` props from all blocks on a page. When multiple blocks query the same entity, the framework consolidates them into a single prefetch:
398
+
399
+ ```
400
+ Page: products/[id]
401
+
402
+ Block 1 (InfoCard): graph: { entity: 'product', fields: ['title', 'description'] }
403
+ Block 2 (RelationTable): graph: { entity: 'product', relations: ['variant'] }
404
+ Block 3 (MediaCard): graph: { entity: 'product', relations: ['image'] }
405
+ Block 4 (InfoCard): graph: { entity: 'product', fields: ['status', 'created_at'] }
406
+
407
+ Framework consolidates → 1 prefetch:
408
+ entity: 'product'
409
+ fields: ['title', 'description', 'status', 'created_at']
410
+ relations: ['variant', 'image']
411
+
412
+ Each block calls useGraphQuery() → TanStack Query cache hit → no extra request.
413
+ ```
414
+
415
+ **This is transparent.** Blocks don't know about the consolidation. They call `useGraphQuery()` with their own query. The framework pre-populated the cache. If a block queries a different entity, it gets its own request — no consolidation attempted.
416
+
417
+ **Consolidation is a performance optimization, not a requirement.** If a block does its own fetch internally (autonomous block), it works — just with an extra request.
418
+
419
+ ---
420
+
421
+ ## Blocks
422
+
423
+ Blocks are the building blocks of pages. Three categories:
424
+
425
+ ### 1. Framework blocks (built-in)
426
+
427
+ Provided by `@mantajs/dashboard`. Generic, configurable via props. They receive `query` as a prop and call `useGraphQuery()` or `useQuery()` internally.
428
+
429
+ | Block | Purpose |
430
+ |-------|---------|
431
+ | `DataTable` | List with columns, search, sort, filter, pagination, row actions |
432
+ | `InfoCard` | Key-value display (title + fields) |
433
+ | `RelationTable` | Related entities table |
434
+ | `RelationList` | Related entities as a list (display variant) |
435
+ | `MediaCard` | Image/file gallery |
436
+ | `StatsCard` | Metric cards |
437
+ | `ActivityCard` | Event timeline |
438
+ | `JsonCard` | Raw JSON display |
439
+ | `TreeList` | Hierarchical list |
440
+ | `PageHeader` | Title, status badge, action buttons (used via `header` shortcut) |
441
+
442
+ ### 2. Autonomous blocks (custom, self-contained)
443
+
444
+ A developer creates a standard React component. It handles its own data fetching, state, and rendering. No framework contract to follow.
445
+
446
+ ```tsx
447
+ // src/spa/admin/blocks/product-quick-stats.tsx
448
+ import { useGraphQuery } from '@mantajs/sdk'
449
+ import { useParams } from 'react-router-dom'
450
+
451
+ export default function ProductQuickStats() {
452
+ const { id } = useParams()
453
+ const { data } = useGraphQuery({
454
+ entity: 'product',
455
+ filters: { id },
456
+ relations: ['variant', 'order'],
457
+ })
458
+
459
+ const product = data?.[0]
460
+ if (!product) return null
461
+
462
+ return (
463
+ <div>
464
+ <span>{product.variant?.length ?? 0} variants</span>
465
+ <span>{product.order?.length ?? 0} orders</span>
466
+ </div>
467
+ )
468
+ }
469
+ ```
470
+
471
+ Usage in `definePage()`:
472
+
473
+ ```typescript
474
+ main: [
475
+ { type: 'ProductQuickStats' }, // no query prop — it fetches its own data
476
+ ]
477
+ ```
478
+
479
+ **Trade-off:** Does not benefit from query consolidation. Makes its own request.
480
+
481
+ ### 3. Custom generic blocks (reusable, optimized)
482
+
483
+ A developer creates a reusable block that accepts `query` as a prop — same pattern as framework blocks. Benefits from query consolidation.
484
+
485
+ ```tsx
486
+ // src/spa/admin/blocks/inventory-matrix.tsx
487
+ import { useGraphQuery } from '@mantajs/sdk'
488
+
489
+ interface InventoryMatrixProps {
490
+ query: Parameters<typeof useGraphQuery>[0]
491
+ warehouses?: string[]
492
+ editable?: boolean
493
+ }
494
+
495
+ export default function InventoryMatrix({ query, warehouses = ['default'], editable = true }: InventoryMatrixProps) {
496
+ const { data } = useGraphQuery(query)
497
+ // ... render matrix from data
498
+ }
499
+ ```
500
+
501
+ Usage in `definePage()`:
502
+
503
+ ```typescript
504
+ main: [
505
+ {
506
+ type: 'InventoryMatrix',
507
+ query: { graph: { entity: 'product', relations: ['variant'] } },
508
+ warehouses: ['paris', 'lyon'],
509
+ },
510
+ ]
511
+ ```
512
+
513
+ **Benefits from consolidation** because the framework sees the `query` prop in the spec and includes it in the prefetch.
514
+
515
+ ### Block resolution
516
+
517
+ | Priority | Source |
518
+ |----------|--------|
519
+ | 1 | `src/spa/{name}/blocks/` (app blocks — overrides framework blocks if same name) |
520
+ | 2 | `@mantajs/dashboard` built-in blocks |
521
+
522
+ A block in `blocks/info-card.tsx` overrides the framework's `InfoCard`. All pages using `{ type: 'InfoCard' }` will use the app's version.
523
+
524
+ ### Block discovery
525
+
526
+ Blocks in `src/spa/{name}/blocks/` are auto-discovered by filename:
527
+
528
+ ```
529
+ blocks/
530
+ inventory-matrix.tsx → type: 'InventoryMatrix'
531
+ pricing-editor.tsx → type: 'PricingEditor'
532
+ info-card.tsx → type: 'InfoCard' (overrides framework)
533
+ ```
534
+
535
+ Filename is kebab-case, block type is PascalCase. The `export default` must be a React component.
536
+
537
+ ---
538
+
539
+ ## Header shortcut
540
+
541
+ `header` is a shortcut — not a block in `main`. It renders a `PageHeader` at the top of the page.
542
+
543
+ ```typescript
544
+ // Simple listing
545
+ header: { title: 'Products', actions: ['create'] }
546
+
547
+ // Detail page with dynamic title
548
+ header: { titleField: 'title', statusField: 'status', actions: ['edit', 'delete'] }
549
+ ```
550
+
551
+ `actions` are predefined behaviors:
552
+
553
+ | Action | Behavior |
554
+ |--------|----------|
555
+ | `'create'` | Navigate to `./create` |
556
+ | `'edit'` | Navigate to `./edit` |
557
+ | `'delete'` | Confirm dialog → execute `delete-{entity}` command |
558
+
559
+ For custom actions:
560
+
561
+ ```typescript
562
+ header: {
563
+ title: 'Products',
564
+ actions: [
565
+ 'create',
566
+ { label: 'Export', command: 'export-products' },
567
+ { label: 'Import', to: '/admin/products/import' },
568
+ ],
569
+ }
570
+ ```
571
+
572
+ ---
573
+
574
+ ## Typing
575
+
576
+ The framework generates types from backend definitions. In `definePage()` and `defineForm()`:
577
+
578
+ - **Graph queries** — entity names, field names, and relation names are autocompleted based on the `defineQueryGraph()` access rules of the SPA's context
579
+ - **Named queries** — query names and input schemas are autocompleted based on `defineQuery()` definitions in the SPA's context
580
+ - **Commands** — command names in `defineForm()` and header actions are autocompleted based on `defineCommand()` definitions
581
+ - **Block types** — autocompleted from framework blocks + discovered custom blocks
582
+
583
+ If the context has `defineQueryGraph('*')`, all entities and fields are available. If scoped (`defineQueryGraph({ product: true })`), only allowed entities appear. If no `defineQueryGraph`, graph queries are not available — only named queries.
584
+
585
+ ```typescript
586
+ // ✅ TypeScript OK — 'product' is allowed in admin context
587
+ query: { graph: { entity: 'product', fields: ['title', 'status'] } }
588
+
589
+ // ❌ TypeScript error — 'banana' is not a field of 'product'
590
+ query: { graph: { entity: 'product', fields: ['banana'] } }
591
+
592
+ // ❌ TypeScript error — 'secret-data' query does not exist in admin context
593
+ query: { name: 'secret-data' }
594
+
595
+ // ❌ TypeScript error — graph queries not available (no defineQueryGraph in this context)
596
+ query: { graph: { entity: 'product' } }
597
+ ```
598
+
599
+ ---
600
+
601
+ ## Summary
602
+
603
+ | Primitive | Purpose | File | Contains React? |
604
+ |-----------|---------|------|----------------|
605
+ | `defineSpa()` | SPA config (navigation, branding) | `config.ts` | No |
606
+ | `definePage()` | Display page (listing, detail, dashboard) | `pages/**/page.ts` | No |
607
+ | `defineForm()` | Form overlay (create, edit) | `pages/**/page.ts` | No |
608
+ | Custom block | Reusable UI component | `blocks/*.tsx` | Yes |
609
+
610
+ | Concept | Rule |
611
+ |---------|------|
612
+ | SPA config | `src/spa/{name}/config.ts` — auto-discovered |
613
+ | Route | Filesystem path (no declaration) |
614
+ | Layout | Inferred: `sidebar` present → two-column, absent → single-column |
615
+ | Form display | FocusModal by default |
616
+ | Data fetching | Each block owns its query (prop or internal) |
617
+ | Query consolidation | Automatic — framework prefetches, blocks get cache hits |
618
+ | Block override | Same filename in `blocks/` → overrides framework block |
619
+ | Block discovery | `blocks/` folder, auto-discovered, kebab-case filename → PascalCase type |