@gettersethya/mira 0.1.0-alpha.2

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 (338) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/app/app.d.ts +96 -0
  3. package/dist/src/app/app.d.ts.map +1 -0
  4. package/dist/src/app/app.js +139 -0
  5. package/dist/src/app/app.js.map +1 -0
  6. package/dist/src/app/builder.d.ts +106 -0
  7. package/dist/src/app/builder.d.ts.map +1 -0
  8. package/dist/src/app/builder.js +122 -0
  9. package/dist/src/app/builder.js.map +1 -0
  10. package/dist/src/app/index.d.ts +31 -0
  11. package/dist/src/app/index.d.ts.map +1 -0
  12. package/dist/src/app/index.js +29 -0
  13. package/dist/src/app/index.js.map +1 -0
  14. package/dist/src/app/types.d.ts +55 -0
  15. package/dist/src/app/types.d.ts.map +1 -0
  16. package/dist/src/app/types.js +2 -0
  17. package/dist/src/app/types.js.map +1 -0
  18. package/dist/src/cache/cached-collection.d.ts +30 -0
  19. package/dist/src/cache/cached-collection.d.ts.map +1 -0
  20. package/dist/src/cache/cached-collection.js +107 -0
  21. package/dist/src/cache/cached-collection.js.map +1 -0
  22. package/dist/src/cache/collection-cache.d.ts +17 -0
  23. package/dist/src/cache/collection-cache.d.ts.map +1 -0
  24. package/dist/src/cache/collection-cache.js +37 -0
  25. package/dist/src/cache/collection-cache.js.map +1 -0
  26. package/dist/src/cache/index.d.ts +4 -0
  27. package/dist/src/cache/index.d.ts.map +1 -0
  28. package/dist/src/cache/index.js +3 -0
  29. package/dist/src/cache/index.js.map +1 -0
  30. package/dist/src/cache/types.d.ts +12 -0
  31. package/dist/src/cache/types.d.ts.map +1 -0
  32. package/dist/src/cache/types.js +2 -0
  33. package/dist/src/cache/types.js.map +1 -0
  34. package/dist/src/collection-service/collection-service.d.ts +62 -0
  35. package/dist/src/collection-service/collection-service.d.ts.map +1 -0
  36. package/dist/src/collection-service/collection-service.js +267 -0
  37. package/dist/src/collection-service/collection-service.js.map +1 -0
  38. package/dist/src/collection-service/context.d.ts +17 -0
  39. package/dist/src/collection-service/context.d.ts.map +1 -0
  40. package/dist/src/collection-service/context.js +2 -0
  41. package/dist/src/collection-service/context.js.map +1 -0
  42. package/dist/src/collection-service/decode.d.ts +6 -0
  43. package/dist/src/collection-service/decode.d.ts.map +1 -0
  44. package/dist/src/collection-service/decode.js +26 -0
  45. package/dist/src/collection-service/decode.js.map +1 -0
  46. package/dist/src/collection-service/errors.d.ts +67 -0
  47. package/dist/src/collection-service/errors.d.ts.map +1 -0
  48. package/dist/src/collection-service/errors.js +43 -0
  49. package/dist/src/collection-service/errors.js.map +1 -0
  50. package/dist/src/collection-service/index.d.ts +5 -0
  51. package/dist/src/collection-service/index.d.ts.map +1 -0
  52. package/dist/src/collection-service/index.js +3 -0
  53. package/dist/src/collection-service/index.js.map +1 -0
  54. package/dist/src/collection-service/input-schema.d.ts +10 -0
  55. package/dist/src/collection-service/input-schema.d.ts.map +1 -0
  56. package/dist/src/collection-service/input-schema.js +109 -0
  57. package/dist/src/collection-service/input-schema.js.map +1 -0
  58. package/dist/src/collection-service/where.d.ts +35 -0
  59. package/dist/src/collection-service/where.d.ts.map +1 -0
  60. package/dist/src/collection-service/where.js +88 -0
  61. package/dist/src/collection-service/where.js.map +1 -0
  62. package/dist/src/config/config.d.ts +44 -0
  63. package/dist/src/config/config.d.ts.map +1 -0
  64. package/dist/src/config/config.js +89 -0
  65. package/dist/src/config/config.js.map +1 -0
  66. package/dist/src/config/index.d.ts +3 -0
  67. package/dist/src/config/index.d.ts.map +1 -0
  68. package/dist/src/config/index.js +2 -0
  69. package/dist/src/config/index.js.map +1 -0
  70. package/dist/src/config/types.d.ts +29 -0
  71. package/dist/src/config/types.d.ts.map +1 -0
  72. package/dist/src/config/types.js +2 -0
  73. package/dist/src/config/types.js.map +1 -0
  74. package/dist/src/crypto/crypto.d.ts +11 -0
  75. package/dist/src/crypto/crypto.d.ts.map +1 -0
  76. package/dist/src/crypto/crypto.js +4 -0
  77. package/dist/src/crypto/crypto.js.map +1 -0
  78. package/dist/src/crypto/index.d.ts +3 -0
  79. package/dist/src/crypto/index.d.ts.map +1 -0
  80. package/dist/src/crypto/index.js +3 -0
  81. package/dist/src/crypto/index.js.map +1 -0
  82. package/dist/src/crypto/node.d.ts +4 -0
  83. package/dist/src/crypto/node.d.ts.map +1 -0
  84. package/dist/src/crypto/node.js +9 -0
  85. package/dist/src/crypto/node.js.map +1 -0
  86. package/dist/src/databases/index.d.ts +2 -0
  87. package/dist/src/databases/index.d.ts.map +1 -0
  88. package/dist/src/databases/index.js +2 -0
  89. package/dist/src/databases/index.js.map +1 -0
  90. package/dist/src/databases/sqlite.d.ts +24 -0
  91. package/dist/src/databases/sqlite.d.ts.map +1 -0
  92. package/dist/src/databases/sqlite.js +27 -0
  93. package/dist/src/databases/sqlite.js.map +1 -0
  94. package/dist/src/http/auth-node.d.ts +4 -0
  95. package/dist/src/http/auth-node.d.ts.map +1 -0
  96. package/dist/src/http/auth-node.js +34 -0
  97. package/dist/src/http/auth-node.js.map +1 -0
  98. package/dist/src/http/auth.d.ts +38 -0
  99. package/dist/src/http/auth.d.ts.map +1 -0
  100. package/dist/src/http/auth.js +66 -0
  101. package/dist/src/http/auth.js.map +1 -0
  102. package/dist/src/http/errors.d.ts +31 -0
  103. package/dist/src/http/errors.d.ts.map +1 -0
  104. package/dist/src/http/errors.js +36 -0
  105. package/dist/src/http/errors.js.map +1 -0
  106. package/dist/src/http/file-serve.d.ts +10 -0
  107. package/dist/src/http/file-serve.d.ts.map +1 -0
  108. package/dist/src/http/file-serve.js +159 -0
  109. package/dist/src/http/file-serve.js.map +1 -0
  110. package/dist/src/http/file-token.d.ts +7 -0
  111. package/dist/src/http/file-token.d.ts.map +1 -0
  112. package/dist/src/http/file-token.js +55 -0
  113. package/dist/src/http/file-token.js.map +1 -0
  114. package/dist/src/http/files.d.ts +11 -0
  115. package/dist/src/http/files.d.ts.map +1 -0
  116. package/dist/src/http/files.js +85 -0
  117. package/dist/src/http/files.js.map +1 -0
  118. package/dist/src/http/index.d.ts +10 -0
  119. package/dist/src/http/index.d.ts.map +1 -0
  120. package/dist/src/http/index.js +8 -0
  121. package/dist/src/http/index.js.map +1 -0
  122. package/dist/src/http/ip-middleware.d.ts +4 -0
  123. package/dist/src/http/ip-middleware.d.ts.map +1 -0
  124. package/dist/src/http/ip-middleware.js +21 -0
  125. package/dist/src/http/ip-middleware.js.map +1 -0
  126. package/dist/src/http/params.d.ts +15 -0
  127. package/dist/src/http/params.d.ts.map +1 -0
  128. package/dist/src/http/params.js +48 -0
  129. package/dist/src/http/params.js.map +1 -0
  130. package/dist/src/http/router.d.ts +11 -0
  131. package/dist/src/http/router.d.ts.map +1 -0
  132. package/dist/src/http/router.js +216 -0
  133. package/dist/src/http/router.js.map +1 -0
  134. package/dist/src/http/server-factory-node.d.ts +4 -0
  135. package/dist/src/http/server-factory-node.d.ts.map +1 -0
  136. package/dist/src/http/server-factory-node.js +8 -0
  137. package/dist/src/http/server-factory-node.js.map +1 -0
  138. package/dist/src/http/server-factory.d.ts +11 -0
  139. package/dist/src/http/server-factory.d.ts.map +1 -0
  140. package/dist/src/http/server-factory.js +4 -0
  141. package/dist/src/http/server-factory.js.map +1 -0
  142. package/dist/src/index.d.ts +8 -0
  143. package/dist/src/index.d.ts.map +1 -0
  144. package/dist/src/index.js +10 -0
  145. package/dist/src/index.js.map +1 -0
  146. package/dist/src/migrator/dialect-sqlite.d.ts +9 -0
  147. package/dist/src/migrator/dialect-sqlite.d.ts.map +1 -0
  148. package/dist/src/migrator/dialect-sqlite.js +102 -0
  149. package/dist/src/migrator/dialect-sqlite.js.map +1 -0
  150. package/dist/src/migrator/dialect.d.ts +24 -0
  151. package/dist/src/migrator/dialect.d.ts.map +1 -0
  152. package/dist/src/migrator/dialect.js +5 -0
  153. package/dist/src/migrator/dialect.js.map +1 -0
  154. package/dist/src/migrator/index.d.ts +8 -0
  155. package/dist/src/migrator/index.d.ts.map +1 -0
  156. package/dist/src/migrator/index.js +6 -0
  157. package/dist/src/migrator/index.js.map +1 -0
  158. package/dist/src/migrator/migrator.d.ts +36 -0
  159. package/dist/src/migrator/migrator.d.ts.map +1 -0
  160. package/dist/src/migrator/migrator.js +200 -0
  161. package/dist/src/migrator/migrator.js.map +1 -0
  162. package/dist/src/migrator/schema-diff.d.ts +25 -0
  163. package/dist/src/migrator/schema-diff.d.ts.map +1 -0
  164. package/dist/src/migrator/schema-diff.js +157 -0
  165. package/dist/src/migrator/schema-diff.js.map +1 -0
  166. package/dist/src/migrator/types.d.ts +91 -0
  167. package/dist/src/migrator/types.d.ts.map +1 -0
  168. package/dist/src/migrator/types.js +13 -0
  169. package/dist/src/migrator/types.js.map +1 -0
  170. package/dist/src/platforms/node.d.ts +40 -0
  171. package/dist/src/platforms/node.d.ts.map +1 -0
  172. package/dist/src/platforms/node.js +45 -0
  173. package/dist/src/platforms/node.js.map +1 -0
  174. package/dist/src/repository/id.d.ts +5 -0
  175. package/dist/src/repository/id.d.ts.map +1 -0
  176. package/dist/src/repository/id.js +9 -0
  177. package/dist/src/repository/id.js.map +1 -0
  178. package/dist/src/repository/index.d.ts +3 -0
  179. package/dist/src/repository/index.d.ts.map +1 -0
  180. package/dist/src/repository/index.js +2 -0
  181. package/dist/src/repository/index.js.map +1 -0
  182. package/dist/src/repository/repository.d.ts +53 -0
  183. package/dist/src/repository/repository.d.ts.map +1 -0
  184. package/dist/src/repository/repository.js +150 -0
  185. package/dist/src/repository/repository.js.map +1 -0
  186. package/dist/src/repository/types.d.ts +42 -0
  187. package/dist/src/repository/types.d.ts.map +1 -0
  188. package/dist/src/repository/types.js +2 -0
  189. package/dist/src/repository/types.js.map +1 -0
  190. package/dist/src/rule/compiler.d.ts +52 -0
  191. package/dist/src/rule/compiler.d.ts.map +1 -0
  192. package/dist/src/rule/compiler.js +113 -0
  193. package/dist/src/rule/compiler.js.map +1 -0
  194. package/dist/src/rule/enforcer.d.ts +47 -0
  195. package/dist/src/rule/enforcer.d.ts.map +1 -0
  196. package/dist/src/rule/enforcer.js +60 -0
  197. package/dist/src/rule/enforcer.js.map +1 -0
  198. package/dist/src/rule/index.d.ts +3 -0
  199. package/dist/src/rule/index.d.ts.map +1 -0
  200. package/dist/src/rule/index.js +3 -0
  201. package/dist/src/rule/index.js.map +1 -0
  202. package/dist/src/storage/index.d.ts +3 -0
  203. package/dist/src/storage/index.d.ts.map +1 -0
  204. package/dist/src/storage/index.js +3 -0
  205. package/dist/src/storage/index.js.map +1 -0
  206. package/dist/src/storage/local-preset.d.ts +21 -0
  207. package/dist/src/storage/local-preset.d.ts.map +1 -0
  208. package/dist/src/storage/local-preset.js +21 -0
  209. package/dist/src/storage/local-preset.js.map +1 -0
  210. package/dist/src/storage/storage.d.ts +83 -0
  211. package/dist/src/storage/storage.d.ts.map +1 -0
  212. package/dist/src/storage/storage.js +120 -0
  213. package/dist/src/storage/storage.js.map +1 -0
  214. package/dist/src/telemetry/index.d.ts +6 -0
  215. package/dist/src/telemetry/index.d.ts.map +1 -0
  216. package/dist/src/telemetry/index.js +7 -0
  217. package/dist/src/telemetry/index.js.map +1 -0
  218. package/dist/src/telemetry/logger.d.ts +4 -0
  219. package/dist/src/telemetry/logger.d.ts.map +1 -0
  220. package/dist/src/telemetry/logger.js +27 -0
  221. package/dist/src/telemetry/logger.js.map +1 -0
  222. package/dist/src/telemetry/tracer.d.ts +16 -0
  223. package/dist/src/telemetry/tracer.d.ts.map +1 -0
  224. package/dist/src/telemetry/tracer.js +106 -0
  225. package/dist/src/telemetry/tracer.js.map +1 -0
  226. package/dist/src/thumbnail/index.d.ts +4 -0
  227. package/dist/src/thumbnail/index.d.ts.map +1 -0
  228. package/dist/src/thumbnail/index.js +3 -0
  229. package/dist/src/thumbnail/index.js.map +1 -0
  230. package/dist/src/thumbnail/photon.d.ts +9 -0
  231. package/dist/src/thumbnail/photon.d.ts.map +1 -0
  232. package/dist/src/thumbnail/photon.js +73 -0
  233. package/dist/src/thumbnail/photon.js.map +1 -0
  234. package/dist/src/thumbnail/types.d.ts +23 -0
  235. package/dist/src/thumbnail/types.d.ts.map +1 -0
  236. package/dist/src/thumbnail/types.js +22 -0
  237. package/dist/src/thumbnail/types.js.map +1 -0
  238. package/dist/tests/app/app.test.d.ts +2 -0
  239. package/dist/tests/app/app.test.d.ts.map +1 -0
  240. package/dist/tests/app/app.test.js +78 -0
  241. package/dist/tests/app/app.test.js.map +1 -0
  242. package/dist/tests/app/builder.test.d.ts +2 -0
  243. package/dist/tests/app/builder.test.d.ts.map +1 -0
  244. package/dist/tests/app/builder.test.js +69 -0
  245. package/dist/tests/app/builder.test.js.map +1 -0
  246. package/dist/tests/cache/cached-collection.test.d.ts +2 -0
  247. package/dist/tests/cache/cached-collection.test.d.ts.map +1 -0
  248. package/dist/tests/cache/cached-collection.test.js +244 -0
  249. package/dist/tests/cache/cached-collection.test.js.map +1 -0
  250. package/dist/tests/cache/collection-cache.test.d.ts +2 -0
  251. package/dist/tests/cache/collection-cache.test.d.ts.map +1 -0
  252. package/dist/tests/cache/collection-cache.test.js +73 -0
  253. package/dist/tests/cache/collection-cache.test.js.map +1 -0
  254. package/dist/tests/collection-service/collection-service.test.d.ts +2 -0
  255. package/dist/tests/collection-service/collection-service.test.d.ts.map +1 -0
  256. package/dist/tests/collection-service/collection-service.test.js +805 -0
  257. package/dist/tests/collection-service/collection-service.test.js.map +1 -0
  258. package/dist/tests/collection-service/input-schema.test.d.ts +2 -0
  259. package/dist/tests/collection-service/input-schema.test.d.ts.map +1 -0
  260. package/dist/tests/collection-service/input-schema.test.js +260 -0
  261. package/dist/tests/collection-service/input-schema.test.js.map +1 -0
  262. package/dist/tests/config/config.test.d.ts +2 -0
  263. package/dist/tests/config/config.test.d.ts.map +1 -0
  264. package/dist/tests/config/config.test.js +84 -0
  265. package/dist/tests/config/config.test.js.map +1 -0
  266. package/dist/tests/crypto/crypto.test.d.ts +2 -0
  267. package/dist/tests/crypto/crypto.test.d.ts.map +1 -0
  268. package/dist/tests/crypto/crypto.test.js +56 -0
  269. package/dist/tests/crypto/crypto.test.js.map +1 -0
  270. package/dist/tests/http/file-serve.test.d.ts +2 -0
  271. package/dist/tests/http/file-serve.test.d.ts.map +1 -0
  272. package/dist/tests/http/file-serve.test.js +210 -0
  273. package/dist/tests/http/file-serve.test.js.map +1 -0
  274. package/dist/tests/http/file-token.test.d.ts +2 -0
  275. package/dist/tests/http/file-token.test.d.ts.map +1 -0
  276. package/dist/tests/http/file-token.test.js +155 -0
  277. package/dist/tests/http/file-token.test.js.map +1 -0
  278. package/dist/tests/http/ip-middleware.test.d.ts +2 -0
  279. package/dist/tests/http/ip-middleware.test.d.ts.map +1 -0
  280. package/dist/tests/http/ip-middleware.test.js +58 -0
  281. package/dist/tests/http/ip-middleware.test.js.map +1 -0
  282. package/dist/tests/http/router.test.d.ts +2 -0
  283. package/dist/tests/http/router.test.d.ts.map +1 -0
  284. package/dist/tests/http/router.test.js +252 -0
  285. package/dist/tests/http/router.test.js.map +1 -0
  286. package/dist/tests/migrator/dialect-sqlite.test.d.ts +2 -0
  287. package/dist/tests/migrator/dialect-sqlite.test.d.ts.map +1 -0
  288. package/dist/tests/migrator/dialect-sqlite.test.js +90 -0
  289. package/dist/tests/migrator/dialect-sqlite.test.js.map +1 -0
  290. package/dist/tests/migrator/integration.test.d.ts +2 -0
  291. package/dist/tests/migrator/integration.test.d.ts.map +1 -0
  292. package/dist/tests/migrator/integration.test.js +180 -0
  293. package/dist/tests/migrator/integration.test.js.map +1 -0
  294. package/dist/tests/migrator/migrator.test.d.ts +2 -0
  295. package/dist/tests/migrator/migrator.test.d.ts.map +1 -0
  296. package/dist/tests/migrator/migrator.test.js +225 -0
  297. package/dist/tests/migrator/migrator.test.js.map +1 -0
  298. package/dist/tests/migrator/schema-diff.test.d.ts +2 -0
  299. package/dist/tests/migrator/schema-diff.test.d.ts.map +1 -0
  300. package/dist/tests/migrator/schema-diff.test.js +323 -0
  301. package/dist/tests/migrator/schema-diff.test.js.map +1 -0
  302. package/dist/tests/repository/repository.test.d.ts +2 -0
  303. package/dist/tests/repository/repository.test.d.ts.map +1 -0
  304. package/dist/tests/repository/repository.test.js +255 -0
  305. package/dist/tests/repository/repository.test.js.map +1 -0
  306. package/dist/tests/rule/compiler.test.d.ts +2 -0
  307. package/dist/tests/rule/compiler.test.d.ts.map +1 -0
  308. package/dist/tests/rule/compiler.test.js +226 -0
  309. package/dist/tests/rule/compiler.test.js.map +1 -0
  310. package/dist/tests/rule/enforcer.test.d.ts +2 -0
  311. package/dist/tests/rule/enforcer.test.d.ts.map +1 -0
  312. package/dist/tests/rule/enforcer.test.js +190 -0
  313. package/dist/tests/rule/enforcer.test.js.map +1 -0
  314. package/dist/tests/storage/storage.test.d.ts +2 -0
  315. package/dist/tests/storage/storage.test.d.ts.map +1 -0
  316. package/dist/tests/storage/storage.test.js +76 -0
  317. package/dist/tests/storage/storage.test.js.map +1 -0
  318. package/dist/tests/telemetry/instrumentation.test.d.ts +2 -0
  319. package/dist/tests/telemetry/instrumentation.test.d.ts.map +1 -0
  320. package/dist/tests/telemetry/instrumentation.test.js +226 -0
  321. package/dist/tests/telemetry/instrumentation.test.js.map +1 -0
  322. package/dist/tests/telemetry/logger.test.d.ts +2 -0
  323. package/dist/tests/telemetry/logger.test.d.ts.map +1 -0
  324. package/dist/tests/telemetry/logger.test.js +56 -0
  325. package/dist/tests/telemetry/logger.test.js.map +1 -0
  326. package/dist/tests/telemetry/tracer.test.d.ts +2 -0
  327. package/dist/tests/telemetry/tracer.test.d.ts.map +1 -0
  328. package/dist/tests/telemetry/tracer.test.js +63 -0
  329. package/dist/tests/telemetry/tracer.test.js.map +1 -0
  330. package/dist/tests/thumbnail/photon.test.d.ts +2 -0
  331. package/dist/tests/thumbnail/photon.test.d.ts.map +1 -0
  332. package/dist/tests/thumbnail/photon.test.js +478 -0
  333. package/dist/tests/thumbnail/photon.test.js.map +1 -0
  334. package/dist/tests/thumbnail/thumbnail.test.d.ts +2 -0
  335. package/dist/tests/thumbnail/thumbnail.test.d.ts.map +1 -0
  336. package/dist/tests/thumbnail/thumbnail.test.js +35 -0
  337. package/dist/tests/thumbnail/thumbnail.test.js.map +1 -0
  338. package/package.json +46 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Getter Sethya
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,96 @@
1
+ import { HttpServer } from "@effect/platform";
2
+ import { Layer } from "effect";
3
+ import { Migrator } from "../migrator/migrator.js";
4
+ import { AppConfig } from "../config/index.js";
5
+ import type { MiraAppConfig } from "./builder.js";
6
+ /**
7
+ * The assembled Mira application, ready to serve.
8
+ *
9
+ * Created by `MiraBuilder.build()`. Do not construct directly — use the
10
+ * `Mira.builder()` fluent API.
11
+ *
12
+ * `MiraApp` wires all layers (database, storage, collection service, HTTP server,
13
+ * telemetry, auto-migration) and provides `serve()` to start the server.
14
+ * Use `extend()` to add custom layers before serving.
15
+ *
16
+ * @example
17
+ * const app = Mira.builder()
18
+ * .platform(NodePlatform)
19
+ * .database(SqliteDatabase({ filename: "data.db" }))
20
+ * .storage(LocalFileStorage({ directory: "./uploads" }))
21
+ * .collections([Posts, Users])
22
+ * .build()
23
+ *
24
+ * app.serve()
25
+ *
26
+ * @example
27
+ * // With custom layer
28
+ * app.extend(MyCustomLayer).serve({ port: 8080 })
29
+ *
30
+ * @see MiraBuilder — builds MiraApp
31
+ * @see Mira — entry point: Mira.builder()
32
+ */
33
+ export declare class MiraApp {
34
+ #private;
35
+ constructor(config: MiraAppConfig);
36
+ /** @internal for tests only */
37
+ _getConfig(): MiraAppConfig;
38
+ /** @internal for tests only */
39
+ _getExtras(): ReadonlyArray<Layer.Layer<never, never, never>>;
40
+ /**
41
+ * Add an arbitrary Effect Layer to the application's layer composition.
42
+ * Useful for providing custom services (e.g., custom telemetry, custom auth).
43
+ * Layers are merged in order of calls to `extend()`.
44
+ *
45
+ * @param layer - Any Layer<never, never, never>
46
+ * @returns this (for chaining)
47
+ *
48
+ * @example
49
+ * app.extend(Layer.succeed(MyTag, myImpl))
50
+ */
51
+ extend(layer: Layer.Layer<never, never, never>): this;
52
+ /**
53
+ * Build the full service layer without the HTTP server.
54
+ * Useful for testing — you can run Effects against the service layer without
55
+ * starting a network server.
56
+ *
57
+ * Includes: database, storage, telemetry, repository, migrator, app config,
58
+ * collection service (with cache), and auto-migration.
59
+ *
60
+ * @returns A Layer providing all services
61
+ *
62
+ * @example
63
+ * const serviceLayer = app.buildServiceLayer()
64
+ * const result = await Effect.runPromise(
65
+ * Effect.gen(function* () { ... }).pipe(Effect.provide(serviceLayer))
66
+ * )
67
+ */
68
+ buildServiceLayer(): Layer.Layer<import("../index.js").FileStorage | import("./types.js").PlatformServices | import("./types.js").DatabaseServices | import("../repository/repository.js").Repository | Migrator | import("../collection-service/collection-service.js").CollectionService | import("../thumbnail/index.js").ThumbnailService | AppConfig, import("effect/ParseResult").ParseError | import("@effect/sql/SqlError").SqlError, never>;
69
+ /**
70
+ * Build the complete server layer including the HTTP router and server.
71
+ * Accepts an optional port override (otherwise uses the port from AppConfig).
72
+ *
73
+ * @param options.port - Optional port number override
74
+ * @returns A Layer ready to be launched
75
+ *
76
+ * @internal Called by serve() — most users should use serve() directly.
77
+ */
78
+ buildLayer(options?: {
79
+ port?: number;
80
+ }): Layer.Layer<HttpServer.HttpServer | import("@effect/platform/HttpPlatform").HttpPlatform | import("@effect/platform/Etag").Generator | import("../index.js").FileStorage | import("./types.js").PlatformServices | import("./types.js").DatabaseServices | import("../repository/repository.js").Repository | Migrator | import("../collection-service/collection-service.js").CollectionService | import("../thumbnail/index.js").ThumbnailService | AppConfig, import("effect/ParseResult").ParseError | import("@effect/platform/HttpServerError").ServeError | import("@effect/sql/SqlError").SqlError, never>;
81
+ /**
82
+ * Start the Mira HTTP server.
83
+ * Sets up all services, runs auto-migration, and listens for incoming requests.
84
+ * Blocks the main thread until the server is shut down.
85
+ *
86
+ * @param options.port - Optional port override (default: from AppConfig, typically 8080)
87
+ *
88
+ * @example
89
+ * app.serve() // default port
90
+ * app.serve({ port: 8080 }) // port override
91
+ */
92
+ serve(options?: {
93
+ port?: number;
94
+ }): void;
95
+ }
96
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/app/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAgB,MAAM,wBAAwB,CAAA;AAM/D,OAAO,EAAE,SAAS,EAAiB,MAAM,mBAAmB,CAAA;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,OAAO;;gBAIN,MAAM,EAAE,aAAa;IAKjC,+BAA+B;IAC/B,UAAU,IAAI,aAAa;IAI3B,+BAA+B;IAC/B,UAAU,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAI7D;;;;;;;;;;OAUG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI;IAKrD;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB;IAsCjB;;;;;;;;OAQG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IAoBtC;;;;;;;;;;OAUG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAKzC"}
@@ -0,0 +1,139 @@
1
+ import { HttpServer } from "@effect/platform";
2
+ import { Effect, Layer } from "effect";
3
+ import { RepositoryLive } from "../repository/repository.js";
4
+ import { Migrator, MigratorLive } from "../migrator/migrator.js";
5
+ import { makeCachedCollectionServiceLayer } from "../cache/index.js";
6
+ import { makeCollectionRouter } from "../http/router.js";
7
+ import { ThumbnailServicePhotonLive } from "../thumbnail/index.js";
8
+ import { ipAnnotationMiddleware } from "../http/ip-middleware.js";
9
+ import { AppConfig, AppConfigLive } from "../config/index.js";
10
+ import { HttpServerFactory } from "../http/server-factory.js";
11
+ /**
12
+ * The assembled Mira application, ready to serve.
13
+ *
14
+ * Created by `MiraBuilder.build()`. Do not construct directly — use the
15
+ * `Mira.builder()` fluent API.
16
+ *
17
+ * `MiraApp` wires all layers (database, storage, collection service, HTTP server,
18
+ * telemetry, auto-migration) and provides `serve()` to start the server.
19
+ * Use `extend()` to add custom layers before serving.
20
+ *
21
+ * @example
22
+ * const app = Mira.builder()
23
+ * .platform(NodePlatform)
24
+ * .database(SqliteDatabase({ filename: "data.db" }))
25
+ * .storage(LocalFileStorage({ directory: "./uploads" }))
26
+ * .collections([Posts, Users])
27
+ * .build()
28
+ *
29
+ * app.serve()
30
+ *
31
+ * @example
32
+ * // With custom layer
33
+ * app.extend(MyCustomLayer).serve({ port: 8080 })
34
+ *
35
+ * @see MiraBuilder — builds MiraApp
36
+ * @see Mira — entry point: Mira.builder()
37
+ */
38
+ export class MiraApp {
39
+ #config;
40
+ #extras;
41
+ constructor(config) {
42
+ this.#config = config;
43
+ this.#extras = [];
44
+ }
45
+ /** @internal for tests only */
46
+ _getConfig() {
47
+ return this.#config;
48
+ }
49
+ /** @internal for tests only */
50
+ _getExtras() {
51
+ return this.#extras;
52
+ }
53
+ /**
54
+ * Add an arbitrary Effect Layer to the application's layer composition.
55
+ * Useful for providing custom services (e.g., custom telemetry, custom auth).
56
+ * Layers are merged in order of calls to `extend()`.
57
+ *
58
+ * @param layer - Any Layer<never, never, never>
59
+ * @returns this (for chaining)
60
+ *
61
+ * @example
62
+ * app.extend(Layer.succeed(MyTag, myImpl))
63
+ */
64
+ extend(layer) {
65
+ this.#extras.push(layer);
66
+ return this;
67
+ }
68
+ /**
69
+ * Build the full service layer without the HTTP server.
70
+ * Useful for testing — you can run Effects against the service layer without
71
+ * starting a network server.
72
+ *
73
+ * Includes: database, storage, telemetry, repository, migrator, app config,
74
+ * collection service (with cache), and auto-migration.
75
+ *
76
+ * @returns A Layer providing all services
77
+ *
78
+ * @example
79
+ * const serviceLayer = app.buildServiceLayer()
80
+ * const result = await Effect.runPromise(
81
+ * Effect.gen(function* () { ... }).pipe(Effect.provide(serviceLayer))
82
+ * )
83
+ */
84
+ buildServiceLayer() {
85
+ const { platform, database, storage, collections, telemetry } = this.#config;
86
+ const collectionList = collections;
87
+ const extrasLayer = this.#extras.length > 0
88
+ ? this.#extras.reduce((acc, l) => Layer.merge(acc, l))
89
+ : Layer.empty;
90
+ // Foundation: database + storage + thumbnail + telemetry + extras, wired on platform
91
+ const foundation = Layer.mergeAll(database.layer, storage.layer, ThumbnailServicePhotonLive, telemetry, extrasLayer).pipe(Layer.provideMerge(platform.layer));
92
+ // Mid: Repository + Migrator + AppConfig, wired on foundation
93
+ const mid = Layer.mergeAll(RepositoryLive, MigratorLive, AppConfigLive).pipe(Layer.provideMerge(foundation));
94
+ // Auto-migrate on boot: runs during layer initialization before requests are served
95
+ const schemas = collectionList.map((c) => ({ name: c.name, schema: c.schema }));
96
+ const autoMigrateLayer = Layer.effectDiscard(Effect.gen(function* () {
97
+ const migrator = yield* Migrator;
98
+ yield* migrator.migrate(schemas);
99
+ }).pipe(Effect.orDie)).pipe(Layer.provide(mid));
100
+ // Top: CollectionService + all mid services + auto-migration side effect
101
+ return makeCachedCollectionServiceLayer(collectionList).pipe(Layer.provideMerge(Layer.merge(mid, autoMigrateLayer)));
102
+ }
103
+ /**
104
+ * Build the complete server layer including the HTTP router and server.
105
+ * Accepts an optional port override (otherwise uses the port from AppConfig).
106
+ *
107
+ * @param options.port - Optional port number override
108
+ * @returns A Layer ready to be launched
109
+ *
110
+ * @internal Called by serve() — most users should use serve() directly.
111
+ */
112
+ buildLayer(options) {
113
+ const { collections } = this.#config;
114
+ const collectionList = collections;
115
+ const router = makeCollectionRouter(collectionList);
116
+ const serviceLayer = this.buildServiceLayer();
117
+ const serverLayer = Layer.unwrapEffect(Effect.gen(function* () {
118
+ const cfg = yield* AppConfig;
119
+ const factory = yield* HttpServerFactory;
120
+ return factory.makeLayer(options?.port ?? cfg.port);
121
+ }));
122
+ return HttpServer.serve(ipAnnotationMiddleware(router)).pipe(Layer.provideMerge(serverLayer), Layer.provideMerge(serviceLayer));
123
+ }
124
+ /**
125
+ * Start the Mira HTTP server.
126
+ * Sets up all services, runs auto-migration, and listens for incoming requests.
127
+ * Blocks the main thread until the server is shut down.
128
+ *
129
+ * @param options.port - Optional port override (default: from AppConfig, typically 8080)
130
+ *
131
+ * @example
132
+ * app.serve() // default port
133
+ * app.serve({ port: 8080 }) // port override
134
+ */
135
+ serve(options) {
136
+ this.#config.platform.runMain(Layer.launch(this.buildLayer(options)).pipe(Effect.orDie));
137
+ }
138
+ }
139
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/app/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import type { Layer } from "effect";
2
+ import type { AnyCollectionDef } from "@gettersethya/mira-client";
3
+ import type { MiraPlatform, MiraDatabase, MiraStorage } from "./types.js";
4
+ import { MiraApp } from "./app.js";
5
+ /**
6
+ * Configuration object for `MiraApp`. Constructed by `MiraBuilder` after all
7
+ * required steps are called. Only the `telemetry` field is optional — it defaults
8
+ * to `ConsoleTelemetryLayer`.
9
+ *
10
+ * @see MiraBuilder — builds this config
11
+ */
12
+ export interface MiraAppConfig {
13
+ platform: MiraPlatform;
14
+ database: MiraDatabase;
15
+ storage: MiraStorage;
16
+ collections: ReadonlyArray<AnyCollectionDef>;
17
+ telemetry: Layer.Layer<never, never, never>;
18
+ }
19
+ /**
20
+ * Phantom-type builder for constructing a `MiraApp`.
21
+ *
22
+ * Uses TypeScript's type system to enforce that all required steps are called
23
+ * before `build()` is allowed. The type parameter `Has` tracks which steps have
24
+ * been completed.
25
+ *
26
+ * Required steps (order does not matter):
27
+ * 1. `.platform(p)` — choose Node, Bun, etc.
28
+ * 2. `.database(d)` — choose SQLite, etc.
29
+ * 3. `.storage(s)` — choose LocalFileStorage, S3, etc.
30
+ * 4. `.collections(c)` — provide collection definitions
31
+ *
32
+ * Optional step: `.telemetry(l)` — custom telemetry layer
33
+ *
34
+ * @example
35
+ * const app = Mira.builder()
36
+ * .platform(NodePlatform)
37
+ * .database(SqliteDatabase({ filename: "data.db" }))
38
+ * .storage(LocalFileStorage({ directory: "./uploads" }))
39
+ * .collections([Posts, Users])
40
+ * .build()
41
+ * .serve()
42
+ *
43
+ * @see MiraApp — the assembled application
44
+ * @see Mira.builder — entry point
45
+ */
46
+ export declare class MiraBuilder<Has extends string = never> {
47
+ #private;
48
+ constructor(config?: Partial<MiraAppConfig>);
49
+ /** @internal for tests only */
50
+ _getPartialConfig(): Partial<MiraAppConfig>;
51
+ /**
52
+ * Set the platform (runtime environment).
53
+ * Required step. The platform provides CryptoService, FileSystem, Path,
54
+ * HttpServerFactory, and AuthService implementations.
55
+ *
56
+ * @param p - A MiraPlatform preset (e.g., NodePlatform)
57
+ * @returns A new builder with "platform" added to the phantom type
58
+ */
59
+ platform(p: MiraPlatform): MiraBuilder<Has | "platform">;
60
+ /**
61
+ * Set the database backend.
62
+ * Required step. The database provides SqlClient and Dialect implementations.
63
+ *
64
+ * @param d - A MiraDatabase preset (e.g., SqliteDatabase({ filename: "data.db" }))
65
+ * @returns A new builder with "database" added to the phantom type
66
+ */
67
+ database(d: MiraDatabase): MiraBuilder<Has | "database">;
68
+ /**
69
+ * Set the file storage backend.
70
+ * Required step. Storage provides FileStorage for file upload/download operations.
71
+ *
72
+ * @param s - A MiraStorage preset (e.g., LocalFileStorage({ directory: "./uploads" }))
73
+ * @returns A new builder with "storage" added to the phantom type
74
+ */
75
+ storage(s: MiraStorage): MiraBuilder<Has | "storage">;
76
+ /**
77
+ * Set the collection definitions.
78
+ * Required step. The collections define the schema, rules, and indexes for all entities.
79
+ *
80
+ * @param c - Array of collection definitions from BaseCollection.define(), AuthCollection.define(),
81
+ * or ViewCollection.define()
82
+ * @returns A new builder with "collections" added to the phantom type
83
+ */
84
+ collections(c: ReadonlyArray<AnyCollectionDef>): MiraBuilder<Has | "collections">;
85
+ /**
86
+ * Set a custom telemetry layer (optional).
87
+ * Defaults to `ConsoleTelemetryLayer` (prints JSON trace lines to stdout).
88
+ *
89
+ * @param l - A Layer providing telemetry services
90
+ * @returns A new builder with "telemetry" added to the phantom type
91
+ */
92
+ telemetry(l: Layer.Layer<never, never, never>): MiraBuilder<Has | "telemetry">;
93
+ /**
94
+ * Build the MiraApp from the accumulated configuration.
95
+ * Only compiles when all required steps (platform, database, storage, collections)
96
+ * have been called. If telemetry was not set, defaults to ConsoleTelemetryLayer.
97
+ *
98
+ * @param this - Constrained to MiraBuilder with all four required tags
99
+ * @returns A fully configured MiraApp ready to serve()
100
+ *
101
+ * @throws If build() is called before all required steps are completed
102
+ * (caught at compile time by the phantom type)
103
+ */
104
+ build(this: MiraBuilder<"platform" | "database" | "storage" | "collections">): MiraApp;
105
+ }
106
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/app/builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAA;IACtB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;IAC5C,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAC5C;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,WAAW,CAAC,GAAG,SAAS,MAAM,GAAG,KAAK;;gBAGrC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAI/C,+BAA+B;IAC/B,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC;IAI3C;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC;IAIxD;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC;IAIxD;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,GAAG,SAAS,CAAC;IAIrD;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,aAAa,CAAC;IAIjF;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC;IAI9E;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,CAAC;CAa7E"}
@@ -0,0 +1,122 @@
1
+ import { ConsoleTelemetryLayer } from "../telemetry/index.js";
2
+ import { MiraApp } from "./app.js";
3
+ function isMiraAppConfig(config) {
4
+ return (config.platform !== undefined &&
5
+ config.database !== undefined &&
6
+ config.storage !== undefined &&
7
+ config.collections !== undefined);
8
+ }
9
+ /**
10
+ * Phantom-type builder for constructing a `MiraApp`.
11
+ *
12
+ * Uses TypeScript's type system to enforce that all required steps are called
13
+ * before `build()` is allowed. The type parameter `Has` tracks which steps have
14
+ * been completed.
15
+ *
16
+ * Required steps (order does not matter):
17
+ * 1. `.platform(p)` — choose Node, Bun, etc.
18
+ * 2. `.database(d)` — choose SQLite, etc.
19
+ * 3. `.storage(s)` — choose LocalFileStorage, S3, etc.
20
+ * 4. `.collections(c)` — provide collection definitions
21
+ *
22
+ * Optional step: `.telemetry(l)` — custom telemetry layer
23
+ *
24
+ * @example
25
+ * const app = Mira.builder()
26
+ * .platform(NodePlatform)
27
+ * .database(SqliteDatabase({ filename: "data.db" }))
28
+ * .storage(LocalFileStorage({ directory: "./uploads" }))
29
+ * .collections([Posts, Users])
30
+ * .build()
31
+ * .serve()
32
+ *
33
+ * @see MiraApp — the assembled application
34
+ * @see Mira.builder — entry point
35
+ */
36
+ export class MiraBuilder {
37
+ #config;
38
+ constructor(config = {}) {
39
+ this.#config = config;
40
+ }
41
+ /** @internal for tests only */
42
+ _getPartialConfig() {
43
+ return this.#config;
44
+ }
45
+ /**
46
+ * Set the platform (runtime environment).
47
+ * Required step. The platform provides CryptoService, FileSystem, Path,
48
+ * HttpServerFactory, and AuthService implementations.
49
+ *
50
+ * @param p - A MiraPlatform preset (e.g., NodePlatform)
51
+ * @returns A new builder with "platform" added to the phantom type
52
+ */
53
+ platform(p) {
54
+ return new MiraBuilder({ ...this.#config, platform: p });
55
+ }
56
+ /**
57
+ * Set the database backend.
58
+ * Required step. The database provides SqlClient and Dialect implementations.
59
+ *
60
+ * @param d - A MiraDatabase preset (e.g., SqliteDatabase({ filename: "data.db" }))
61
+ * @returns A new builder with "database" added to the phantom type
62
+ */
63
+ database(d) {
64
+ return new MiraBuilder({ ...this.#config, database: d });
65
+ }
66
+ /**
67
+ * Set the file storage backend.
68
+ * Required step. Storage provides FileStorage for file upload/download operations.
69
+ *
70
+ * @param s - A MiraStorage preset (e.g., LocalFileStorage({ directory: "./uploads" }))
71
+ * @returns A new builder with "storage" added to the phantom type
72
+ */
73
+ storage(s) {
74
+ return new MiraBuilder({ ...this.#config, storage: s });
75
+ }
76
+ /**
77
+ * Set the collection definitions.
78
+ * Required step. The collections define the schema, rules, and indexes for all entities.
79
+ *
80
+ * @param c - Array of collection definitions from BaseCollection.define(), AuthCollection.define(),
81
+ * or ViewCollection.define()
82
+ * @returns A new builder with "collections" added to the phantom type
83
+ */
84
+ collections(c) {
85
+ return new MiraBuilder({ ...this.#config, collections: c });
86
+ }
87
+ /**
88
+ * Set a custom telemetry layer (optional).
89
+ * Defaults to `ConsoleTelemetryLayer` (prints JSON trace lines to stdout).
90
+ *
91
+ * @param l - A Layer providing telemetry services
92
+ * @returns A new builder with "telemetry" added to the phantom type
93
+ */
94
+ telemetry(l) {
95
+ return new MiraBuilder({ ...this.#config, telemetry: l });
96
+ }
97
+ /**
98
+ * Build the MiraApp from the accumulated configuration.
99
+ * Only compiles when all required steps (platform, database, storage, collections)
100
+ * have been called. If telemetry was not set, defaults to ConsoleTelemetryLayer.
101
+ *
102
+ * @param this - Constrained to MiraBuilder with all four required tags
103
+ * @returns A fully configured MiraApp ready to serve()
104
+ *
105
+ * @throws If build() is called before all required steps are completed
106
+ * (caught at compile time by the phantom type)
107
+ */
108
+ build() {
109
+ const config = this._getPartialConfig();
110
+ if (!isMiraAppConfig(config)) {
111
+ throw new Error("build() called on incomplete builder");
112
+ }
113
+ return new MiraApp({
114
+ platform: config.platform,
115
+ database: config.database,
116
+ storage: config.storage,
117
+ collections: config.collections,
118
+ telemetry: config.telemetry ?? ConsoleTelemetryLayer
119
+ });
120
+ }
121
+ }
122
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/app/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAI5D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAiBlC,SAAS,eAAe,CAAC,MAA8B;IACrD,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC7B,MAAM,CAAC,OAAO,KAAK,SAAS;QAC5B,MAAM,CAAC,WAAW,KAAK,SAAS,CACjC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,WAAW;IACb,OAAO,CAAwB;IAExC,YAAY,SAAiC,EAAE;QAC7C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,+BAA+B;IAC/B,iBAAiB;QACf,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAe;QACtB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,CAAe;QACtB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,CAAc;QACpB,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,CAAkC;QAC5C,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,SAAS,CAAC,CAAmC;QAC3C,OAAO,IAAI,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACvC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,IAAI,OAAO,CAAC;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,qBAAqB;SACrD,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Entry point for the Mira server library.
3
+ *
4
+ * Usage:
5
+ * ```ts
6
+ * import { Mira, NodePlatform, SqliteDatabase, LocalFileStorage } from "@gettersethya/mira"
7
+ *
8
+ * const app = Mira.builder()
9
+ * .platform(NodePlatform)
10
+ * .database(SqliteDatabase({ filename: "data.db" }))
11
+ * .storage(LocalFileStorage({ directory: "./uploads" }))
12
+ * .collections([Posts, Users])
13
+ * .build()
14
+ * .serve()
15
+ * ```
16
+ *
17
+ * @example
18
+ * // Server-only: all client exports are re-exported from @gettersethya/mira too
19
+ * import { BaseCollection, Field } from "@gettersethya/mira"
20
+ *
21
+ * @see MiraBuilder — the phantom-type fluent builder
22
+ * @see MiraApp — the assembled server
23
+ */
24
+ import { MiraBuilder } from "./builder.js";
25
+ export declare const Mira: {
26
+ builder: () => MiraBuilder<never>;
27
+ };
28
+ export type { MiraPlatform, MiraDatabase, MiraStorage } from "./types.js";
29
+ export type { MiraApp } from "./app.js";
30
+ export { MiraBuilder } from "./builder.js";
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/app/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,eAAO,MAAM,IAAI;;CAEhB,CAAA;AAED,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Entry point for the Mira server library.
3
+ *
4
+ * Usage:
5
+ * ```ts
6
+ * import { Mira, NodePlatform, SqliteDatabase, LocalFileStorage } from "@gettersethya/mira"
7
+ *
8
+ * const app = Mira.builder()
9
+ * .platform(NodePlatform)
10
+ * .database(SqliteDatabase({ filename: "data.db" }))
11
+ * .storage(LocalFileStorage({ directory: "./uploads" }))
12
+ * .collections([Posts, Users])
13
+ * .build()
14
+ * .serve()
15
+ * ```
16
+ *
17
+ * @example
18
+ * // Server-only: all client exports are re-exported from @gettersethya/mira too
19
+ * import { BaseCollection, Field } from "@gettersethya/mira"
20
+ *
21
+ * @see MiraBuilder — the phantom-type fluent builder
22
+ * @see MiraApp — the assembled server
23
+ */
24
+ import { MiraBuilder } from "./builder.js";
25
+ export const Mira = {
26
+ builder: () => new MiraBuilder(),
27
+ };
28
+ export { MiraBuilder } from "./builder.js";
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;CACjC,CAAA;AAID,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,55 @@
1
+ import type { FileSystem, Path } from "@effect/platform";
2
+ import type { Effect, Layer } from "effect";
3
+ import type { SqlClient } from "@effect/sql";
4
+ import type { AuthService } from "../http/auth.js";
5
+ import type { HttpServerFactory } from "../http/server-factory.js";
6
+ import type { CryptoService } from "../crypto/crypto.js";
7
+ import type { Dialect } from "../migrator/dialect.js";
8
+ import type { FileStorage } from "../storage/storage.js";
9
+ /**
10
+ * Services that a platform preset must provide.
11
+ * Union type including CryptoService, FileSystem, Path, HttpServerFactory, and AuthService.
12
+ *
13
+ * @see MiraPlatform — requires a Layer providing these services
14
+ */
15
+ export type PlatformServices = CryptoService | FileSystem.FileSystem | Path.Path | HttpServerFactory | AuthService;
16
+ /**
17
+ * Services that a database preset must provide.
18
+ * Union type including SqlClient and Dialect.
19
+ *
20
+ * @see MiraDatabase — requires a Layer providing these services
21
+ */
22
+ export type DatabaseServices = SqlClient.SqlClient | Dialect;
23
+ /**
24
+ * Interface for a platform preset (e.g., Node, Bun).
25
+ * Must provide a Layer with all PlatformServices and a `runMain` function
26
+ * that runs an Effect to completion.
27
+ *
28
+ * @see NodePlatform — Node.js implementation
29
+ * @see MiraBuilder.platform — where MiraPlatform is used
30
+ */
31
+ export interface MiraPlatform {
32
+ layer: Layer.Layer<PlatformServices>;
33
+ runMain: (effect: Effect.Effect<never, never, never>) => void;
34
+ }
35
+ /**
36
+ * Interface for a database preset (e.g., SQLite).
37
+ * Must provide a Layer with all DatabaseServices.
38
+ *
39
+ * @see SqliteDatabase — SQLite implementation
40
+ * @see MiraBuilder.database — where MiraDatabase is used
41
+ */
42
+ export interface MiraDatabase {
43
+ layer: Layer.Layer<DatabaseServices>;
44
+ }
45
+ /**
46
+ * Interface for a storage preset (e.g., local disk, S3).
47
+ * Must provide a Layer with FileStorage, requiring FileSystem and Path.
48
+ *
49
+ * @see LocalFileStorage — local disk implementation
50
+ * @see MiraBuilder.storage — where MiraStorage is used
51
+ */
52
+ export interface MiraStorage {
53
+ layer: Layer.Layer<FileStorage, never, FileSystem.FileSystem | Path.Path>;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/app/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,UAAU,CAAC,UAAU,GACrB,IAAI,CAAC,IAAI,GACT,iBAAiB,GACjB,WAAW,CAAA;AAEf;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,OAAO,CAAA;AAE5D;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACpC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAA;CAC9D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;CACrC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;CAC1E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/app/types.ts"],"names":[],"mappings":""}