@gettersethya/mira 0.1.0-alpha.10

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 (399) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/src/app/app.d.ts +100 -0
  4. package/dist/src/app/app.d.ts.map +1 -0
  5. package/dist/src/app/app.js +176 -0
  6. package/dist/src/app/app.js.map +1 -0
  7. package/dist/src/app/builder.d.ts +106 -0
  8. package/dist/src/app/builder.d.ts.map +1 -0
  9. package/dist/src/app/builder.js +122 -0
  10. package/dist/src/app/builder.js.map +1 -0
  11. package/dist/src/app/index.d.ts +33 -0
  12. package/dist/src/app/index.d.ts.map +1 -0
  13. package/dist/src/app/index.js +30 -0
  14. package/dist/src/app/index.js.map +1 -0
  15. package/dist/src/app/plugin.d.ts +60 -0
  16. package/dist/src/app/plugin.d.ts.map +1 -0
  17. package/dist/src/app/plugin.js +20 -0
  18. package/dist/src/app/plugin.js.map +1 -0
  19. package/dist/src/app/types.d.ts +55 -0
  20. package/dist/src/app/types.d.ts.map +1 -0
  21. package/dist/src/app/types.js +2 -0
  22. package/dist/src/app/types.js.map +1 -0
  23. package/dist/src/cache/cached-collection.d.ts +30 -0
  24. package/dist/src/cache/cached-collection.d.ts.map +1 -0
  25. package/dist/src/cache/cached-collection.js +107 -0
  26. package/dist/src/cache/cached-collection.js.map +1 -0
  27. package/dist/src/cache/collection-cache.d.ts +17 -0
  28. package/dist/src/cache/collection-cache.d.ts.map +1 -0
  29. package/dist/src/cache/collection-cache.js +37 -0
  30. package/dist/src/cache/collection-cache.js.map +1 -0
  31. package/dist/src/cache/index.d.ts +4 -0
  32. package/dist/src/cache/index.d.ts.map +1 -0
  33. package/dist/src/cache/index.js +3 -0
  34. package/dist/src/cache/index.js.map +1 -0
  35. package/dist/src/cache/types.d.ts +12 -0
  36. package/dist/src/cache/types.d.ts.map +1 -0
  37. package/dist/src/cache/types.js +2 -0
  38. package/dist/src/cache/types.js.map +1 -0
  39. package/dist/src/collection-service/collection-service.d.ts +62 -0
  40. package/dist/src/collection-service/collection-service.d.ts.map +1 -0
  41. package/dist/src/collection-service/collection-service.js +289 -0
  42. package/dist/src/collection-service/collection-service.js.map +1 -0
  43. package/dist/src/collection-service/context.d.ts +19 -0
  44. package/dist/src/collection-service/context.d.ts.map +1 -0
  45. package/dist/src/collection-service/context.js +2 -0
  46. package/dist/src/collection-service/context.js.map +1 -0
  47. package/dist/src/collection-service/decode.d.ts +6 -0
  48. package/dist/src/collection-service/decode.d.ts.map +1 -0
  49. package/dist/src/collection-service/decode.js +26 -0
  50. package/dist/src/collection-service/decode.js.map +1 -0
  51. package/dist/src/collection-service/errors.d.ts +67 -0
  52. package/dist/src/collection-service/errors.d.ts.map +1 -0
  53. package/dist/src/collection-service/errors.js +43 -0
  54. package/dist/src/collection-service/errors.js.map +1 -0
  55. package/dist/src/collection-service/index.d.ts +5 -0
  56. package/dist/src/collection-service/index.d.ts.map +1 -0
  57. package/dist/src/collection-service/index.js +3 -0
  58. package/dist/src/collection-service/index.js.map +1 -0
  59. package/dist/src/collection-service/input-schema.d.ts +10 -0
  60. package/dist/src/collection-service/input-schema.d.ts.map +1 -0
  61. package/dist/src/collection-service/input-schema.js +123 -0
  62. package/dist/src/collection-service/input-schema.js.map +1 -0
  63. package/dist/src/collection-service/where.d.ts +35 -0
  64. package/dist/src/collection-service/where.d.ts.map +1 -0
  65. package/dist/src/collection-service/where.js +91 -0
  66. package/dist/src/collection-service/where.js.map +1 -0
  67. package/dist/src/config/config.d.ts +44 -0
  68. package/dist/src/config/config.d.ts.map +1 -0
  69. package/dist/src/config/config.js +89 -0
  70. package/dist/src/config/config.js.map +1 -0
  71. package/dist/src/config/index.d.ts +3 -0
  72. package/dist/src/config/index.d.ts.map +1 -0
  73. package/dist/src/config/index.js +2 -0
  74. package/dist/src/config/index.js.map +1 -0
  75. package/dist/src/config/types.d.ts +29 -0
  76. package/dist/src/config/types.d.ts.map +1 -0
  77. package/dist/src/config/types.js +2 -0
  78. package/dist/src/config/types.js.map +1 -0
  79. package/dist/src/crypto/crypto.d.ts +11 -0
  80. package/dist/src/crypto/crypto.d.ts.map +1 -0
  81. package/dist/src/crypto/crypto.js +4 -0
  82. package/dist/src/crypto/crypto.js.map +1 -0
  83. package/dist/src/crypto/index.d.ts +3 -0
  84. package/dist/src/crypto/index.d.ts.map +1 -0
  85. package/dist/src/crypto/index.js +3 -0
  86. package/dist/src/crypto/index.js.map +1 -0
  87. package/dist/src/crypto/node.d.ts +4 -0
  88. package/dist/src/crypto/node.d.ts.map +1 -0
  89. package/dist/src/crypto/node.js +9 -0
  90. package/dist/src/crypto/node.js.map +1 -0
  91. package/dist/src/databases/index.d.ts +2 -0
  92. package/dist/src/databases/index.d.ts.map +1 -0
  93. package/dist/src/databases/index.js +2 -0
  94. package/dist/src/databases/index.js.map +1 -0
  95. package/dist/src/databases/sqlite.d.ts +24 -0
  96. package/dist/src/databases/sqlite.d.ts.map +1 -0
  97. package/dist/src/databases/sqlite.js +27 -0
  98. package/dist/src/databases/sqlite.js.map +1 -0
  99. package/dist/src/hooks/hook-collection.d.ts +5 -0
  100. package/dist/src/hooks/hook-collection.d.ts.map +1 -0
  101. package/dist/src/hooks/hook-collection.js +77 -0
  102. package/dist/src/hooks/hook-collection.js.map +1 -0
  103. package/dist/src/hooks/hook-service.d.ts +33 -0
  104. package/dist/src/hooks/hook-service.d.ts.map +1 -0
  105. package/dist/src/hooks/hook-service.js +118 -0
  106. package/dist/src/hooks/hook-service.js.map +1 -0
  107. package/dist/src/hooks/index.d.ts +4 -0
  108. package/dist/src/hooks/index.d.ts.map +1 -0
  109. package/dist/src/hooks/index.js +3 -0
  110. package/dist/src/hooks/index.js.map +1 -0
  111. package/dist/src/hooks/types.d.ts +52 -0
  112. package/dist/src/hooks/types.d.ts.map +1 -0
  113. package/dist/src/hooks/types.js +2 -0
  114. package/dist/src/hooks/types.js.map +1 -0
  115. package/dist/src/http/auth-node.d.ts +4 -0
  116. package/dist/src/http/auth-node.d.ts.map +1 -0
  117. package/dist/src/http/auth-node.js +34 -0
  118. package/dist/src/http/auth-node.js.map +1 -0
  119. package/dist/src/http/auth.d.ts +40 -0
  120. package/dist/src/http/auth.d.ts.map +1 -0
  121. package/dist/src/http/auth.js +76 -0
  122. package/dist/src/http/auth.js.map +1 -0
  123. package/dist/src/http/errors.d.ts +31 -0
  124. package/dist/src/http/errors.d.ts.map +1 -0
  125. package/dist/src/http/errors.js +36 -0
  126. package/dist/src/http/errors.js.map +1 -0
  127. package/dist/src/http/file-serve.d.ts +10 -0
  128. package/dist/src/http/file-serve.d.ts.map +1 -0
  129. package/dist/src/http/file-serve.js +159 -0
  130. package/dist/src/http/file-serve.js.map +1 -0
  131. package/dist/src/http/file-token.d.ts +7 -0
  132. package/dist/src/http/file-token.d.ts.map +1 -0
  133. package/dist/src/http/file-token.js +57 -0
  134. package/dist/src/http/file-token.js.map +1 -0
  135. package/dist/src/http/files.d.ts +11 -0
  136. package/dist/src/http/files.d.ts.map +1 -0
  137. package/dist/src/http/files.js +85 -0
  138. package/dist/src/http/files.js.map +1 -0
  139. package/dist/src/http/index.d.ts +11 -0
  140. package/dist/src/http/index.d.ts.map +1 -0
  141. package/dist/src/http/index.js +9 -0
  142. package/dist/src/http/index.js.map +1 -0
  143. package/dist/src/http/ip-middleware.d.ts +4 -0
  144. package/dist/src/http/ip-middleware.d.ts.map +1 -0
  145. package/dist/src/http/ip-middleware.js +24 -0
  146. package/dist/src/http/ip-middleware.js.map +1 -0
  147. package/dist/src/http/params.d.ts +15 -0
  148. package/dist/src/http/params.d.ts.map +1 -0
  149. package/dist/src/http/params.js +48 -0
  150. package/dist/src/http/params.js.map +1 -0
  151. package/dist/src/http/router.d.ts +11 -0
  152. package/dist/src/http/router.d.ts.map +1 -0
  153. package/dist/src/http/router.js +300 -0
  154. package/dist/src/http/router.js.map +1 -0
  155. package/dist/src/http/schema.d.ts +5 -0
  156. package/dist/src/http/schema.d.ts.map +1 -0
  157. package/dist/src/http/schema.js +17 -0
  158. package/dist/src/http/schema.js.map +1 -0
  159. package/dist/src/http/server-factory-node.d.ts +4 -0
  160. package/dist/src/http/server-factory-node.d.ts.map +1 -0
  161. package/dist/src/http/server-factory-node.js +8 -0
  162. package/dist/src/http/server-factory-node.js.map +1 -0
  163. package/dist/src/http/server-factory.d.ts +11 -0
  164. package/dist/src/http/server-factory.d.ts.map +1 -0
  165. package/dist/src/http/server-factory.js +4 -0
  166. package/dist/src/http/server-factory.js.map +1 -0
  167. package/dist/src/http/telemetry-routes.d.ts +5 -0
  168. package/dist/src/http/telemetry-routes.d.ts.map +1 -0
  169. package/dist/src/http/telemetry-routes.js +156 -0
  170. package/dist/src/http/telemetry-routes.js.map +1 -0
  171. package/dist/src/index.d.ts +19 -0
  172. package/dist/src/index.d.ts.map +1 -0
  173. package/dist/src/index.js +22 -0
  174. package/dist/src/index.js.map +1 -0
  175. package/dist/src/migrator/dialect-sqlite.d.ts +9 -0
  176. package/dist/src/migrator/dialect-sqlite.d.ts.map +1 -0
  177. package/dist/src/migrator/dialect-sqlite.js +102 -0
  178. package/dist/src/migrator/dialect-sqlite.js.map +1 -0
  179. package/dist/src/migrator/dialect.d.ts +24 -0
  180. package/dist/src/migrator/dialect.d.ts.map +1 -0
  181. package/dist/src/migrator/dialect.js +5 -0
  182. package/dist/src/migrator/dialect.js.map +1 -0
  183. package/dist/src/migrator/index.d.ts +8 -0
  184. package/dist/src/migrator/index.d.ts.map +1 -0
  185. package/dist/src/migrator/index.js +6 -0
  186. package/dist/src/migrator/index.js.map +1 -0
  187. package/dist/src/migrator/migrator.d.ts +36 -0
  188. package/dist/src/migrator/migrator.d.ts.map +1 -0
  189. package/dist/src/migrator/migrator.js +200 -0
  190. package/dist/src/migrator/migrator.js.map +1 -0
  191. package/dist/src/migrator/schema-diff.d.ts +25 -0
  192. package/dist/src/migrator/schema-diff.d.ts.map +1 -0
  193. package/dist/src/migrator/schema-diff.js +157 -0
  194. package/dist/src/migrator/schema-diff.js.map +1 -0
  195. package/dist/src/migrator/types.d.ts +91 -0
  196. package/dist/src/migrator/types.d.ts.map +1 -0
  197. package/dist/src/migrator/types.js +13 -0
  198. package/dist/src/migrator/types.js.map +1 -0
  199. package/dist/src/platforms/node.d.ts +40 -0
  200. package/dist/src/platforms/node.d.ts.map +1 -0
  201. package/dist/src/platforms/node.js +45 -0
  202. package/dist/src/platforms/node.js.map +1 -0
  203. package/dist/src/repository/id.d.ts +5 -0
  204. package/dist/src/repository/id.d.ts.map +1 -0
  205. package/dist/src/repository/id.js +9 -0
  206. package/dist/src/repository/id.js.map +1 -0
  207. package/dist/src/repository/index.d.ts +3 -0
  208. package/dist/src/repository/index.d.ts.map +1 -0
  209. package/dist/src/repository/index.js +2 -0
  210. package/dist/src/repository/index.js.map +1 -0
  211. package/dist/src/repository/repository.d.ts +53 -0
  212. package/dist/src/repository/repository.d.ts.map +1 -0
  213. package/dist/src/repository/repository.js +150 -0
  214. package/dist/src/repository/repository.js.map +1 -0
  215. package/dist/src/repository/types.d.ts +42 -0
  216. package/dist/src/repository/types.d.ts.map +1 -0
  217. package/dist/src/repository/types.js +2 -0
  218. package/dist/src/repository/types.js.map +1 -0
  219. package/dist/src/rule/compiler.d.ts +52 -0
  220. package/dist/src/rule/compiler.d.ts.map +1 -0
  221. package/dist/src/rule/compiler.js +115 -0
  222. package/dist/src/rule/compiler.js.map +1 -0
  223. package/dist/src/rule/enforcer.d.ts +47 -0
  224. package/dist/src/rule/enforcer.d.ts.map +1 -0
  225. package/dist/src/rule/enforcer.js +60 -0
  226. package/dist/src/rule/enforcer.js.map +1 -0
  227. package/dist/src/rule/index.d.ts +3 -0
  228. package/dist/src/rule/index.d.ts.map +1 -0
  229. package/dist/src/rule/index.js +3 -0
  230. package/dist/src/rule/index.js.map +1 -0
  231. package/dist/src/storage/index.d.ts +3 -0
  232. package/dist/src/storage/index.d.ts.map +1 -0
  233. package/dist/src/storage/index.js +3 -0
  234. package/dist/src/storage/index.js.map +1 -0
  235. package/dist/src/storage/local-preset.d.ts +21 -0
  236. package/dist/src/storage/local-preset.d.ts.map +1 -0
  237. package/dist/src/storage/local-preset.js +21 -0
  238. package/dist/src/storage/local-preset.js.map +1 -0
  239. package/dist/src/storage/storage.d.ts +83 -0
  240. package/dist/src/storage/storage.d.ts.map +1 -0
  241. package/dist/src/storage/storage.js +120 -0
  242. package/dist/src/storage/storage.js.map +1 -0
  243. package/dist/src/telemetry/collections.d.ts +4 -0
  244. package/dist/src/telemetry/collections.d.ts.map +1 -0
  245. package/dist/src/telemetry/collections.js +19 -0
  246. package/dist/src/telemetry/collections.js.map +1 -0
  247. package/dist/src/telemetry/index.d.ts +9 -0
  248. package/dist/src/telemetry/index.d.ts.map +1 -0
  249. package/dist/src/telemetry/index.js +9 -0
  250. package/dist/src/telemetry/index.js.map +1 -0
  251. package/dist/src/telemetry/logger.d.ts +4 -0
  252. package/dist/src/telemetry/logger.d.ts.map +1 -0
  253. package/dist/src/telemetry/logger.js +27 -0
  254. package/dist/src/telemetry/logger.js.map +1 -0
  255. package/dist/src/telemetry/sqlite-logger.d.ts +24 -0
  256. package/dist/src/telemetry/sqlite-logger.d.ts.map +1 -0
  257. package/dist/src/telemetry/sqlite-logger.js +152 -0
  258. package/dist/src/telemetry/sqlite-logger.js.map +1 -0
  259. package/dist/src/telemetry/telemetry-sql-client.d.ts +11 -0
  260. package/dist/src/telemetry/telemetry-sql-client.d.ts.map +1 -0
  261. package/dist/src/telemetry/telemetry-sql-client.js +8 -0
  262. package/dist/src/telemetry/telemetry-sql-client.js.map +1 -0
  263. package/dist/src/telemetry/tracer.d.ts +16 -0
  264. package/dist/src/telemetry/tracer.d.ts.map +1 -0
  265. package/dist/src/telemetry/tracer.js +106 -0
  266. package/dist/src/telemetry/tracer.js.map +1 -0
  267. package/dist/src/thumbnail/index.d.ts +4 -0
  268. package/dist/src/thumbnail/index.d.ts.map +1 -0
  269. package/dist/src/thumbnail/index.js +3 -0
  270. package/dist/src/thumbnail/index.js.map +1 -0
  271. package/dist/src/thumbnail/photon.d.ts +9 -0
  272. package/dist/src/thumbnail/photon.d.ts.map +1 -0
  273. package/dist/src/thumbnail/photon.js +73 -0
  274. package/dist/src/thumbnail/photon.js.map +1 -0
  275. package/dist/src/thumbnail/types.d.ts +23 -0
  276. package/dist/src/thumbnail/types.d.ts.map +1 -0
  277. package/dist/src/thumbnail/types.js +22 -0
  278. package/dist/src/thumbnail/types.js.map +1 -0
  279. package/dist/tests/app/app.test.d.ts +2 -0
  280. package/dist/tests/app/app.test.d.ts.map +1 -0
  281. package/dist/tests/app/app.test.js +125 -0
  282. package/dist/tests/app/app.test.js.map +1 -0
  283. package/dist/tests/app/builder.test.d.ts +2 -0
  284. package/dist/tests/app/builder.test.d.ts.map +1 -0
  285. package/dist/tests/app/builder.test.js +70 -0
  286. package/dist/tests/app/builder.test.js.map +1 -0
  287. package/dist/tests/cache/cached-collection.test.d.ts +2 -0
  288. package/dist/tests/cache/cached-collection.test.d.ts.map +1 -0
  289. package/dist/tests/cache/cached-collection.test.js +244 -0
  290. package/dist/tests/cache/cached-collection.test.js.map +1 -0
  291. package/dist/tests/cache/collection-cache.test.d.ts +2 -0
  292. package/dist/tests/cache/collection-cache.test.d.ts.map +1 -0
  293. package/dist/tests/cache/collection-cache.test.js +73 -0
  294. package/dist/tests/cache/collection-cache.test.js.map +1 -0
  295. package/dist/tests/collection-service/collection-service.test.d.ts +2 -0
  296. package/dist/tests/collection-service/collection-service.test.d.ts.map +1 -0
  297. package/dist/tests/collection-service/collection-service.test.js +938 -0
  298. package/dist/tests/collection-service/collection-service.test.js.map +1 -0
  299. package/dist/tests/collection-service/input-schema.test.d.ts +2 -0
  300. package/dist/tests/collection-service/input-schema.test.d.ts.map +1 -0
  301. package/dist/tests/collection-service/input-schema.test.js +327 -0
  302. package/dist/tests/collection-service/input-schema.test.js.map +1 -0
  303. package/dist/tests/config/config.test.d.ts +2 -0
  304. package/dist/tests/config/config.test.d.ts.map +1 -0
  305. package/dist/tests/config/config.test.js +84 -0
  306. package/dist/tests/config/config.test.js.map +1 -0
  307. package/dist/tests/crypto/crypto.test.d.ts +2 -0
  308. package/dist/tests/crypto/crypto.test.d.ts.map +1 -0
  309. package/dist/tests/crypto/crypto.test.js +56 -0
  310. package/dist/tests/crypto/crypto.test.js.map +1 -0
  311. package/dist/tests/hooks/hook-collection.test.d.ts +2 -0
  312. package/dist/tests/hooks/hook-collection.test.d.ts.map +1 -0
  313. package/dist/tests/hooks/hook-collection.test.js +103 -0
  314. package/dist/tests/hooks/hook-collection.test.js.map +1 -0
  315. package/dist/tests/hooks/hook-service.test.d.ts +2 -0
  316. package/dist/tests/hooks/hook-service.test.d.ts.map +1 -0
  317. package/dist/tests/hooks/hook-service.test.js +216 -0
  318. package/dist/tests/hooks/hook-service.test.js.map +1 -0
  319. package/dist/tests/http/file-serve.test.d.ts +2 -0
  320. package/dist/tests/http/file-serve.test.d.ts.map +1 -0
  321. package/dist/tests/http/file-serve.test.js +210 -0
  322. package/dist/tests/http/file-serve.test.js.map +1 -0
  323. package/dist/tests/http/file-token.test.d.ts +2 -0
  324. package/dist/tests/http/file-token.test.d.ts.map +1 -0
  325. package/dist/tests/http/file-token.test.js +165 -0
  326. package/dist/tests/http/file-token.test.js.map +1 -0
  327. package/dist/tests/http/ip-middleware.test.d.ts +2 -0
  328. package/dist/tests/http/ip-middleware.test.d.ts.map +1 -0
  329. package/dist/tests/http/ip-middleware.test.js +58 -0
  330. package/dist/tests/http/ip-middleware.test.js.map +1 -0
  331. package/dist/tests/http/router.test.d.ts +2 -0
  332. package/dist/tests/http/router.test.d.ts.map +1 -0
  333. package/dist/tests/http/router.test.js +312 -0
  334. package/dist/tests/http/router.test.js.map +1 -0
  335. package/dist/tests/migrator/dialect-sqlite.test.d.ts +2 -0
  336. package/dist/tests/migrator/dialect-sqlite.test.d.ts.map +1 -0
  337. package/dist/tests/migrator/dialect-sqlite.test.js +90 -0
  338. package/dist/tests/migrator/dialect-sqlite.test.js.map +1 -0
  339. package/dist/tests/migrator/integration.test.d.ts +2 -0
  340. package/dist/tests/migrator/integration.test.d.ts.map +1 -0
  341. package/dist/tests/migrator/integration.test.js +180 -0
  342. package/dist/tests/migrator/integration.test.js.map +1 -0
  343. package/dist/tests/migrator/migrator.test.d.ts +2 -0
  344. package/dist/tests/migrator/migrator.test.d.ts.map +1 -0
  345. package/dist/tests/migrator/migrator.test.js +225 -0
  346. package/dist/tests/migrator/migrator.test.js.map +1 -0
  347. package/dist/tests/migrator/schema-diff.test.d.ts +2 -0
  348. package/dist/tests/migrator/schema-diff.test.d.ts.map +1 -0
  349. package/dist/tests/migrator/schema-diff.test.js +323 -0
  350. package/dist/tests/migrator/schema-diff.test.js.map +1 -0
  351. package/dist/tests/repository/repository.test.d.ts +2 -0
  352. package/dist/tests/repository/repository.test.d.ts.map +1 -0
  353. package/dist/tests/repository/repository.test.js +255 -0
  354. package/dist/tests/repository/repository.test.js.map +1 -0
  355. package/dist/tests/rule/compiler.test.d.ts +2 -0
  356. package/dist/tests/rule/compiler.test.d.ts.map +1 -0
  357. package/dist/tests/rule/compiler.test.js +226 -0
  358. package/dist/tests/rule/compiler.test.js.map +1 -0
  359. package/dist/tests/rule/enforcer.test.d.ts +2 -0
  360. package/dist/tests/rule/enforcer.test.d.ts.map +1 -0
  361. package/dist/tests/rule/enforcer.test.js +190 -0
  362. package/dist/tests/rule/enforcer.test.js.map +1 -0
  363. package/dist/tests/storage/storage.test.d.ts +2 -0
  364. package/dist/tests/storage/storage.test.d.ts.map +1 -0
  365. package/dist/tests/storage/storage.test.js +76 -0
  366. package/dist/tests/storage/storage.test.js.map +1 -0
  367. package/dist/tests/telemetry/collections.test.d.ts +2 -0
  368. package/dist/tests/telemetry/collections.test.d.ts.map +1 -0
  369. package/dist/tests/telemetry/collections.test.js +67 -0
  370. package/dist/tests/telemetry/collections.test.js.map +1 -0
  371. package/dist/tests/telemetry/instrumentation.test.d.ts +2 -0
  372. package/dist/tests/telemetry/instrumentation.test.d.ts.map +1 -0
  373. package/dist/tests/telemetry/instrumentation.test.js +226 -0
  374. package/dist/tests/telemetry/instrumentation.test.js.map +1 -0
  375. package/dist/tests/telemetry/logger.test.d.ts +2 -0
  376. package/dist/tests/telemetry/logger.test.d.ts.map +1 -0
  377. package/dist/tests/telemetry/logger.test.js +56 -0
  378. package/dist/tests/telemetry/logger.test.js.map +1 -0
  379. package/dist/tests/telemetry/sqlite-logger.test.d.ts +2 -0
  380. package/dist/tests/telemetry/sqlite-logger.test.d.ts.map +1 -0
  381. package/dist/tests/telemetry/sqlite-logger.test.js +218 -0
  382. package/dist/tests/telemetry/sqlite-logger.test.js.map +1 -0
  383. package/dist/tests/telemetry/telemetry-routes.test.d.ts +2 -0
  384. package/dist/tests/telemetry/telemetry-routes.test.d.ts.map +1 -0
  385. package/dist/tests/telemetry/telemetry-routes.test.js +133 -0
  386. package/dist/tests/telemetry/telemetry-routes.test.js.map +1 -0
  387. package/dist/tests/telemetry/tracer.test.d.ts +2 -0
  388. package/dist/tests/telemetry/tracer.test.d.ts.map +1 -0
  389. package/dist/tests/telemetry/tracer.test.js +63 -0
  390. package/dist/tests/telemetry/tracer.test.js.map +1 -0
  391. package/dist/tests/thumbnail/photon.test.d.ts +2 -0
  392. package/dist/tests/thumbnail/photon.test.d.ts.map +1 -0
  393. package/dist/tests/thumbnail/photon.test.js +478 -0
  394. package/dist/tests/thumbnail/photon.test.js.map +1 -0
  395. package/dist/tests/thumbnail/thumbnail.test.d.ts +2 -0
  396. package/dist/tests/thumbnail/thumbnail.test.d.ts.map +1 -0
  397. package/dist/tests/thumbnail/thumbnail.test.js +35 -0
  398. package/dist/tests/thumbnail/thumbnail.test.js.map +1 -0
  399. package/package.json +46 -0
@@ -0,0 +1,123 @@
1
+ import { ParseResult, Schema } from "effect";
2
+ import { ValidationError } from "./errors.js";
3
+ // Fields auto-generated by the system — excluded from all input schemas.
4
+ const GENERATED_FIELDS = new Set(["id", "seqId", "created", "updated"]);
5
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
6
+ function filterAnnotations(kind, errorFn) {
7
+ if (errorFn === undefined)
8
+ return undefined;
9
+ const msg = errorFn(kind);
10
+ if (msg === undefined)
11
+ return undefined;
12
+ return { message: () => msg };
13
+ }
14
+ function propertyToSchema(prop, fieldDef) {
15
+ const errorFn = fieldDef?.error;
16
+ if (prop["x-kind"] === "literalText") {
17
+ const typeMsg = errorFn?.("type");
18
+ const base = typeMsg !== undefined
19
+ ? Schema.String.annotations({ message: () => typeMsg })
20
+ : Schema.String;
21
+ const literalValues = prop["x-literal"];
22
+ if (literalValues && literalValues.length > 0) {
23
+ const literalSet = new Set(literalValues);
24
+ return base.pipe(Schema.filter((a) => literalSet.has(a), filterAnnotations("literal", errorFn)));
25
+ }
26
+ return base;
27
+ }
28
+ if (prop["x-kind"] === "json")
29
+ return Schema.Unknown;
30
+ if (prop["x-kind"] === "date" ||
31
+ prop["x-kind"] === "relation" ||
32
+ prop["x-kind"] === "file")
33
+ return Schema.String;
34
+ if (prop.type === "string") {
35
+ const typeMsg = errorFn?.("type");
36
+ const base = typeMsg !== undefined
37
+ ? Schema.String.annotations({ message: () => typeMsg })
38
+ : Schema.String;
39
+ let s = base;
40
+ if (prop.format === "email") {
41
+ s = s.pipe(Schema.pattern(EMAIL_RE, filterAnnotations("email", errorFn)));
42
+ }
43
+ if (prop.minLength !== undefined) {
44
+ s = s.pipe(Schema.minLength(prop.minLength, filterAnnotations("minLength", errorFn)));
45
+ }
46
+ if (prop.maxLength !== undefined) {
47
+ s = s.pipe(Schema.maxLength(prop.maxLength, filterAnnotations("maxLength", errorFn)));
48
+ }
49
+ return s;
50
+ }
51
+ if (prop.type === "integer") {
52
+ const typeMsg = errorFn?.("type");
53
+ const base = typeMsg !== undefined
54
+ ? Schema.Number.annotations({ message: () => typeMsg })
55
+ : Schema.Number;
56
+ let s = base.pipe(Schema.int(filterAnnotations("int", errorFn)));
57
+ if (prop.minimum !== undefined) {
58
+ s = s.pipe(Schema.greaterThanOrEqualTo(prop.minimum, filterAnnotations("minimum", errorFn)));
59
+ }
60
+ if (prop.maximum !== undefined) {
61
+ s = s.pipe(Schema.lessThanOrEqualTo(prop.maximum, filterAnnotations("maximum", errorFn)));
62
+ }
63
+ return s;
64
+ }
65
+ if (prop.type === "number") {
66
+ const typeMsg = errorFn?.("type");
67
+ const base = typeMsg !== undefined
68
+ ? Schema.Number.annotations({ message: () => typeMsg })
69
+ : Schema.Number;
70
+ let s = base;
71
+ if (prop.minimum !== undefined) {
72
+ s = s.pipe(Schema.greaterThanOrEqualTo(prop.minimum, filterAnnotations("minimum", errorFn)));
73
+ }
74
+ if (prop.maximum !== undefined) {
75
+ s = s.pipe(Schema.lessThanOrEqualTo(prop.maximum, filterAnnotations("maximum", errorFn)));
76
+ }
77
+ return s;
78
+ }
79
+ if (prop.type === "boolean") {
80
+ const typeMsg = errorFn?.("type");
81
+ return typeMsg !== undefined
82
+ ? Schema.Boolean.annotations({ message: () => typeMsg })
83
+ : Schema.Boolean;
84
+ }
85
+ return Schema.Unknown;
86
+ }
87
+ export function buildInputSchemas(colDef) {
88
+ const schema = colDef.schema;
89
+ const required = new Set(schema.required ?? []);
90
+ const createFields = {};
91
+ const updateFields = {};
92
+ for (const [key, prop] of Object.entries(schema.properties)) {
93
+ if (GENERATED_FIELDS.has(key))
94
+ continue;
95
+ const fieldDef = colDef.fields[key];
96
+ const errorFn = fieldDef?.error;
97
+ const base = propertyToSchema(prop, fieldDef);
98
+ if (required.has(key)) {
99
+ const requiredMsg = errorFn?.("required");
100
+ createFields[key] = requiredMsg !== undefined
101
+ ? Schema.propertySignature(base).annotations({ missingMessage: () => requiredMsg })
102
+ : base;
103
+ }
104
+ else {
105
+ createFields[key] = Schema.optional(base);
106
+ }
107
+ updateFields[key] = Schema.optional(base);
108
+ }
109
+ return {
110
+ create: Schema.Struct(createFields),
111
+ update: Schema.Struct(updateFields)
112
+ };
113
+ }
114
+ export function parseErrToValidationError(collection) {
115
+ return (err) => {
116
+ const issues = ParseResult.ArrayFormatter.formatIssueSync(err.issue).map((i) => {
117
+ const prefix = i.path.length > 0 ? `${i.path.join(".")}: ` : "";
118
+ return `${prefix}${i.message}`;
119
+ });
120
+ return new ValidationError({ collection, issues });
121
+ };
122
+ }
123
+ //# sourceMappingURL=input-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-schema.js","sourceRoot":"","sources":["../../../src/collection-service/input-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { Effect } from "effect";
2
+ import type { CollectionSchema } from "@gettersethya/mira-client";
3
+ import type { EnforceResult } from "../rule/enforcer.js";
4
+ import type { RepoRecord, SortOrder, WhereClause } from "../repository/types.js";
5
+ import type { RequestCtx } from "./context.js";
6
+ import { ForbiddenError } from "./errors.js";
7
+ /** Combines two WHERE clauses with AND. Both inputs are trusted internal code. */
8
+ export declare function andWhere(a: WhereClause, b: WhereClause): WhereClause;
9
+ /** Produces a WHERE clause that matches a single record by id. */
10
+ export declare function idClause(id: string): WhereClause;
11
+ /** Produces a WHERE clause for cursor pagination: seqId strictly after the given cursor. */
12
+ export declare function cursorClause(after: number): WhereClause;
13
+ /**
14
+ * Resolves `@auth_<field>` and `@request_<source>_<key>` placeholders produced by the
15
+ * rule compiler into positional `?` params bound from `RequestCtx`.
16
+ *
17
+ * The replacement is done in a single left-to-right pass so that the param array stays
18
+ * in the same order as the `?` placeholders in the resulting SQL.
19
+ *
20
+ * Returns `ForbiddenError` if the rule references auth but `ctx.auth` is absent.
21
+ */
22
+ export declare function resolveCtxPlaceholders(result: EnforceResult, ctx: RequestCtx, collection: string, action: string): Effect.Effect<{
23
+ sql: string;
24
+ params: unknown[];
25
+ }, ForbiddenError, never>;
26
+ /**
27
+ * Replaces `t.<fieldName>` column references in a WHERE clause with `?` params
28
+ * bound to the corresponding values in `record`.
29
+ *
30
+ * Used for the `create` permission pre-check: `SELECT 1 WHERE <rule>` without a FROM.
31
+ * The replacement is done left-to-right to preserve param ordering with existing `?`.
32
+ */
33
+ export declare function resolveFieldRefs(clause: WhereClause, record: RepoRecord): WhereClause;
34
+ export declare function buildUserSort(query: RequestCtx["query"], schema: CollectionSchema): SortOrder | null;
35
+ //# sourceMappingURL=where.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../../src/collection-service/where.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,WAAW,CAKpE;AAED,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAEhD;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;0BAiChH;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,CAgBrF;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAC1B,MAAM,EAAE,gBAAgB,GACvB,SAAS,GAAG,IAAI,CAMlB"}
@@ -0,0 +1,91 @@
1
+ import { Effect } from "effect";
2
+ import { ForbiddenError } from "./errors.js";
3
+ /** Combines two WHERE clauses with AND. Both inputs are trusted internal code. */
4
+ export function andWhere(a, b) {
5
+ return {
6
+ sql: `(${a.sql}) AND (${b.sql})`,
7
+ params: [...a.params, ...b.params]
8
+ };
9
+ }
10
+ /** Produces a WHERE clause that matches a single record by id. */
11
+ export function idClause(id) {
12
+ return { sql: "t.id = ?", params: [id] };
13
+ }
14
+ /** Produces a WHERE clause for cursor pagination: seqId strictly after the given cursor. */
15
+ export function cursorClause(after) {
16
+ return { sql: "t.seqId > ?", params: [after] };
17
+ }
18
+ /**
19
+ * Resolves `@auth_<field>` and `@request_<source>_<key>` placeholders produced by the
20
+ * rule compiler into positional `?` params bound from `RequestCtx`.
21
+ *
22
+ * The replacement is done in a single left-to-right pass so that the param array stays
23
+ * in the same order as the `?` placeholders in the resulting SQL.
24
+ *
25
+ * Returns `ForbiddenError` if the rule references auth but `ctx.auth` is absent.
26
+ */
27
+ export function resolveCtxPlaceholders(result, ctx, collection, action) {
28
+ return Effect.gen(function* () {
29
+ const needsAuth = /@auth_\w+/.test(result.sql);
30
+ if (needsAuth && ctx.auth === undefined) {
31
+ return yield* new ForbiddenError({ collection, action });
32
+ }
33
+ const resolved = [];
34
+ let pIdx = 0;
35
+ const { params } = result;
36
+ // Single-pass left-to-right replacement preserves param ordering.
37
+ // Groups: (1) @auth field, (2) @request source, (3) @request key
38
+ const newSql = result.sql.replace(/\?|@auth_(\w+)|@request_(\w+)_(\w+)/g, (match, g1, g2, g3) => {
39
+ const authField = typeof g1 === "string" ? g1 : undefined;
40
+ const reqSource = typeof g2 === "string" ? g2 : undefined;
41
+ const reqKey = typeof g3 === "string" ? g3 : undefined;
42
+ if (match === "?") {
43
+ resolved.push(params[pIdx++]);
44
+ }
45
+ else if (authField === "collection") {
46
+ resolved.push(ctx.auth?.collection ?? null);
47
+ }
48
+ else if (authField !== undefined) {
49
+ resolved.push(ctx.auth?.record[authField] ?? null);
50
+ }
51
+ else if (reqSource !== undefined && reqKey !== undefined) {
52
+ const val = reqSource === "query" ? ctx.query[reqKey] : ctx.headers[reqKey];
53
+ resolved.push(Array.isArray(val) ? val[0] : (val ?? null));
54
+ }
55
+ return "?";
56
+ });
57
+ return yield* Effect.succeed({ sql: newSql, params: resolved });
58
+ });
59
+ }
60
+ /**
61
+ * Replaces `t.<fieldName>` column references in a WHERE clause with `?` params
62
+ * bound to the corresponding values in `record`.
63
+ *
64
+ * Used for the `create` permission pre-check: `SELECT 1 WHERE <rule>` without a FROM.
65
+ * The replacement is done left-to-right to preserve param ordering with existing `?`.
66
+ */
67
+ export function resolveFieldRefs(clause, record) {
68
+ const resolved = [];
69
+ let pIdx = 0;
70
+ const { params } = clause;
71
+ const newSql = clause.sql.replace(/\?|\bt\.(\w+)\b/g, (_, g1) => {
72
+ const field = typeof g1 === "string" ? g1 : undefined;
73
+ if (field !== undefined) {
74
+ resolved.push(record[field] ?? null);
75
+ }
76
+ else {
77
+ resolved.push(params[pIdx++]);
78
+ }
79
+ return "?";
80
+ });
81
+ return { sql: newSql, params: resolved };
82
+ }
83
+ export function buildUserSort(query, schema) {
84
+ const sortField = typeof query["sort"] === "string" ? query["sort"] : null;
85
+ if (sortField === null || !schema.properties[sortField])
86
+ return null;
87
+ const rawOrder = typeof query["order"] === "string" ? query["order"] : null;
88
+ const direction = rawOrder === "desc" ? "desc" : "asc";
89
+ return { field: sortField, direction };
90
+ }
91
+ //# sourceMappingURL=where.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.js","sourceRoot":"","sources":["../../../src/collection-service/where.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { SqlClient } from "@effect/sql";
2
+ import { CryptoService } from "../crypto/index.js";
3
+ import { Context, Layer } from "effect";
4
+ import type { AppConfigShape } from "./types.js";
5
+ declare const AppConfig_base: Context.TagClass<AppConfig, "AppConfig", AppConfigShape>;
6
+ /**
7
+ * Application configuration tag, backed by the `_config` table in the database.
8
+ *
9
+ * On first boot, seeds default values (including an auto-generated `jwt_secret`)
10
+ * into the `_config` table. Runtime reads go through the database — no env vars
11
+ * or config files are needed for basic operation.
12
+ *
13
+ * Provides access to:
14
+ * - `appName`, `port`, `applicationUrl` — basic server configuration
15
+ * - `jwtSecret` — Redacted JWT signing secret (auto-generated)
16
+ * - `useS3`, `s3Config` — optional S3 storage configuration
17
+ *
18
+ * @example
19
+ * import { AppConfig } from "@gettersethya/mira"
20
+ *
21
+ * Effect.gen(function* () {
22
+ * const cfg = yield* AppConfig
23
+ * console.log(cfg.appName, cfg.port)
24
+ * const secret = cfg.jwtSecret // Redacted<string>
25
+ * })
26
+ *
27
+ * @see AppConfigLive — the live layer implementation
28
+ * @see AppConfigShape — the full config shape
29
+ */
30
+ export declare class AppConfig extends AppConfig_base {
31
+ }
32
+ /**
33
+ * Live layer for `AppConfig`.
34
+ * Seeds the `_config` table on first boot with sensible defaults
35
+ * (including auto-generating `jwt_secret` via CryptoService).
36
+ *
37
+ * @example
38
+ * Layer.provideMerge(AppConfigLive)
39
+ *
40
+ * @see AppConfig — the service tag
41
+ */
42
+ export declare const AppConfigLive: Layer.Layer<AppConfig, import("effect/ParseResult").ParseError | import("@effect/sql/SqlError").SqlError, CryptoService | SqlClient.SqlClient>;
43
+ export {};
44
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAU,KAAK,EAA4B,MAAM,QAAQ,CAAA;AACzE,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,YAAY,CAAA;;AAO1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,SAAU,SAAQ,cAAqD;CAAG;AAEvF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,gJA8DzB,CAAA"}
@@ -0,0 +1,89 @@
1
+ import { SqlClient, SqlSchema } from "@effect/sql";
2
+ import { CryptoService } from "../crypto/index.js";
3
+ import { Context, Effect, Layer, Option, Redacted, Schema } from "effect";
4
+ const ConfigRowSchema = Schema.Struct({
5
+ key: Schema.String,
6
+ value: Schema.String
7
+ });
8
+ /**
9
+ * Application configuration tag, backed by the `_config` table in the database.
10
+ *
11
+ * On first boot, seeds default values (including an auto-generated `jwt_secret`)
12
+ * into the `_config` table. Runtime reads go through the database — no env vars
13
+ * or config files are needed for basic operation.
14
+ *
15
+ * Provides access to:
16
+ * - `appName`, `port`, `applicationUrl` — basic server configuration
17
+ * - `jwtSecret` — Redacted JWT signing secret (auto-generated)
18
+ * - `useS3`, `s3Config` — optional S3 storage configuration
19
+ *
20
+ * @example
21
+ * import { AppConfig } from "@gettersethya/mira"
22
+ *
23
+ * Effect.gen(function* () {
24
+ * const cfg = yield* AppConfig
25
+ * console.log(cfg.appName, cfg.port)
26
+ * const secret = cfg.jwtSecret // Redacted<string>
27
+ * })
28
+ *
29
+ * @see AppConfigLive — the live layer implementation
30
+ * @see AppConfigShape — the full config shape
31
+ */
32
+ export class AppConfig extends Context.Tag("AppConfig")() {
33
+ }
34
+ /**
35
+ * Live layer for `AppConfig`.
36
+ * Seeds the `_config` table on first boot with sensible defaults
37
+ * (including auto-generating `jwt_secret` via CryptoService).
38
+ *
39
+ * @example
40
+ * Layer.provideMerge(AppConfigLive)
41
+ *
42
+ * @see AppConfig — the service tag
43
+ */
44
+ export const AppConfigLive = Layer.effect(AppConfig, Effect.gen(function* () {
45
+ const sql = yield* SqlClient.SqlClient;
46
+ // DDL — sql.unsafe is fine for CREATE TABLE
47
+ yield* sql.unsafe(`CREATE TABLE IF NOT EXISTS _config (key TEXT PRIMARY KEY, value TEXT NOT NULL)`);
48
+ const rows = yield* SqlSchema.findAll({
49
+ Request: Schema.Void,
50
+ Result: ConfigRowSchema,
51
+ execute: () => sql `SELECT key, value FROM ${sql("_config")}`
52
+ })(undefined);
53
+ const stored = new Map(rows.map((r) => [r.key, r.value]));
54
+ const seed = (key, defaultValue) => Effect.gen(function* () {
55
+ const existing = stored.get(key);
56
+ if (existing !== undefined)
57
+ return existing;
58
+ yield* sql `INSERT INTO ${sql("_config")} ${sql.insert({ key, value: defaultValue })}`;
59
+ return defaultValue;
60
+ });
61
+ const require = (key) => Effect.fromNullable(stored.get(key)).pipe(Effect.mapError(() => new Error(`_config key "${key}" is required when use_s3=true`)), Effect.orDie);
62
+ const appName = yield* seed("app_name", "mira");
63
+ const port = Number(yield* seed("port", "8080"));
64
+ const applicationUrl = yield* seed("application_url", `http://localhost:${port}`);
65
+ // Generated once on first boot, persisted so tokens survive restarts
66
+ const existingSecret = stored.get("jwt_secret");
67
+ const jwtSecretStr = existingSecret !== undefined
68
+ ? existingSecret
69
+ : yield* Effect.gen(function* () {
70
+ const cryptoSvc = yield* CryptoService;
71
+ const generated = Buffer.from(yield* cryptoSvc.randomBytes(48)).toString("hex");
72
+ yield* sql `INSERT INTO ${sql("_config")} ${sql.insert({ key: "jwt_secret", value: generated })}`;
73
+ yield* Effect.logInfo("jwt_secret generated and persisted to _config table.");
74
+ return generated;
75
+ });
76
+ const jwtSecret = Redacted.make(jwtSecretStr);
77
+ const useS3 = (yield* seed("use_s3", "false")) === "true";
78
+ const s3Config = useS3
79
+ ? Option.some({
80
+ endpoint: Redacted.make(yield* require("s3_endpoint")),
81
+ bucketName: yield* require("s3_bucket_name"),
82
+ regionName: yield* require("s3_region_name"),
83
+ accessKey: Redacted.make(yield* require("s3_access_key")),
84
+ secret: Redacted.make(yield* require("s3_secret"))
85
+ })
86
+ : Option.none();
87
+ return { appName, port, applicationUrl, jwtSecret, useS3, s3Config };
88
+ }));
89
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { AppConfig, AppConfigLive } from "./config.js";
2
+ export type { AppConfigShape, S3Config } from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACtD,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { AppConfig, AppConfigLive } from "./config.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,29 @@
1
+ import type { Option, Redacted } from "effect";
2
+ /**
3
+ * Optional S3 storage configuration.
4
+ * Only loaded when `useS3` is true in AppConfig.
5
+ *
6
+ * @see AppConfig.useS3 — whether S3 is enabled
7
+ * @see AppConfig.s3Config — the Option<S3Config>
8
+ */
9
+ export interface S3Config {
10
+ readonly endpoint: Redacted.Redacted<string>;
11
+ readonly bucketName: string;
12
+ readonly regionName: string;
13
+ readonly accessKey: Redacted.Redacted<string>;
14
+ readonly secret: Redacted.Redacted<string>;
15
+ }
16
+ /**
17
+ * Shape of the application configuration stored in the `_config` DB table.
18
+ *
19
+ * @see AppConfig — the Context.Tag that provides this
20
+ */
21
+ export interface AppConfigShape {
22
+ readonly appName: string;
23
+ readonly port: number;
24
+ readonly applicationUrl: string;
25
+ readonly jwtSecret: Redacted.Redacted<string>;
26
+ readonly useS3: boolean;
27
+ readonly s3Config: Option.Option<S3Config>;
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { Context, Effect } from "effect";
2
+ declare const CryptoService_base: Context.TagClass<CryptoService, "CryptoService", {
3
+ /** Synchronous variant — for use in callbacks that cannot yield an Effect. */
4
+ randomBytesSync(size: number): Uint8Array;
5
+ randomBytes(size: number): Effect.Effect<Uint8Array>;
6
+ randomUUID(): Effect.Effect<string>;
7
+ }>;
8
+ export declare class CryptoService extends CryptoService_base {
9
+ }
10
+ export {};
11
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;;IAKpC,8EAA8E;0BACxD,MAAM,GAAG,UAAU;sBACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;kBACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;;AANvC,qBAAa,aAAc,SAAQ,kBAQhC;CAAG"}
@@ -0,0 +1,4 @@
1
+ import { Context } from "effect";
2
+ export class CryptoService extends Context.Tag("CryptoService")() {
3
+ }
4
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/crypto/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,QAAQ,CAAA;AAExC,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAQ5D;CAAG"}
@@ -0,0 +1,3 @@
1
+ export { CryptoService } from "./crypto.js";
2
+ export { NodeCryptoLayer } from "./node.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { CryptoService } from "./crypto.js";
2
+ export { NodeCryptoLayer } from "./node.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { Layer } from "effect";
2
+ import { CryptoService } from "./crypto.js";
3
+ export declare const NodeCryptoLayer: Layer.Layer<CryptoService, never, never>;
4
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/crypto/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,eAAO,MAAM,eAAe,0CAO3B,CAAA"}
@@ -0,0 +1,9 @@
1
+ import * as nodeCrypto from "node:crypto";
2
+ import { Effect, Layer } from "effect";
3
+ import { CryptoService } from "./crypto.js";
4
+ export const NodeCryptoLayer = Layer.succeed(CryptoService, CryptoService.of({
5
+ randomBytesSync: (size) => nodeCrypto.randomBytes(size),
6
+ randomBytes: (size) => Effect.sync(() => nodeCrypto.randomBytes(size)),
7
+ randomUUID: () => Effect.sync(() => nodeCrypto.randomUUID())
8
+ }));
9
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/crypto/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAC1C,aAAa,EACb,aAAa,CAAC,EAAE,CAAC;IACf,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC;IACvD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtE,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;CAC7D,CAAC,CACH,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { SqliteDatabase } from "./sqlite.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/databases/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { SqliteDatabase } from "./sqlite.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/databases/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,24 @@
1
+ import type { MiraDatabase } from "../app/types.js";
2
+ /**
3
+ * SQLite database preset using `@effect/sql-sqlite-node`.
4
+ *
5
+ * Creates a `MiraDatabase` that provides both the SQLite `SqlClient`
6
+ * and the `Dialect` (for schema generation). The layer uses `Layer.orDie`
7
+ * to convert `ConfigError` into a runtime panic — if the config is wrong,
8
+ * the server should not start.
9
+ *
10
+ * @param config.filename - Path to the SQLite database file (use `":memory:"` for testing)
11
+ * @returns A MiraDatabase preset
12
+ *
13
+ * @example
14
+ * Mira.builder()
15
+ * .database(SqliteDatabase({ filename: "data.db" }))
16
+ * // or for testing:
17
+ * .database(SqliteDatabase({ filename: ":memory:" }))
18
+ *
19
+ * @see MiraDatabase — the interface SqliteDatabase implements
20
+ */
21
+ export declare const SqliteDatabase: (config: {
22
+ filename: string;
23
+ }) => MiraDatabase;
24
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/databases/sqlite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,KAAG,YAK5D,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { SqliteClient } from "@effect/sql-sqlite-node";
2
+ import { Layer } from "effect";
3
+ import { Dialect } from "../migrator/dialect.js";
4
+ import { sqliteDialect } from "../migrator/dialect-sqlite.js";
5
+ /**
6
+ * SQLite database preset using `@effect/sql-sqlite-node`.
7
+ *
8
+ * Creates a `MiraDatabase` that provides both the SQLite `SqlClient`
9
+ * and the `Dialect` (for schema generation). The layer uses `Layer.orDie`
10
+ * to convert `ConfigError` into a runtime panic — if the config is wrong,
11
+ * the server should not start.
12
+ *
13
+ * @param config.filename - Path to the SQLite database file (use `":memory:"` for testing)
14
+ * @returns A MiraDatabase preset
15
+ *
16
+ * @example
17
+ * Mira.builder()
18
+ * .database(SqliteDatabase({ filename: "data.db" }))
19
+ * // or for testing:
20
+ * .database(SqliteDatabase({ filename: ":memory:" }))
21
+ *
22
+ * @see MiraDatabase — the interface SqliteDatabase implements
23
+ */
24
+ export const SqliteDatabase = (config) => ({
25
+ layer: Layer.mergeAll(SqliteClient.layer({ filename: config.filename }).pipe(Layer.orDie), Layer.succeed(Dialect, sqliteDialect)),
26
+ });
27
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/databases/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAG5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAA4B,EAAgB,EAAE,CAAC,CAAC;IAC7E,KAAK,EAAE,KAAK,CAAC,QAAQ,CACnB,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EACnE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CACtC;CACF,CAAC,CAAA"}