@sixthsummit/ship-api 0.0.0-stage → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/CHANGELOG.md +605 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +4 -0
  4. package/README.md +58 -2
  5. package/cli/commands/add.js +537 -0
  6. package/cli/commands/contract.js +2 -0
  7. package/cli/commands/create.js +250 -0
  8. package/cli/commands/dev.js +227 -0
  9. package/cli/commands/doctor.js +286 -0
  10. package/cli/commands/generate.js +937 -0
  11. package/cli/commands/graph.js +2 -0
  12. package/cli/commands/migrate-orm.js +1171 -0
  13. package/cli/commands/update.js +37 -0
  14. package/cli/ship-api.js +285 -0
  15. package/lib/app/auth/AuthProvider.d.ts +91 -0
  16. package/lib/app/auth/AuthProvider.d.ts.map +1 -0
  17. package/lib/app/auth/AuthProvider.js +13 -0
  18. package/lib/app/auth/AuthProvider.js.map +1 -0
  19. package/lib/app/auth/adapters/firebase.d.ts +79 -0
  20. package/lib/app/auth/adapters/firebase.d.ts.map +1 -0
  21. package/lib/app/auth/adapters/firebase.js +122 -0
  22. package/lib/app/auth/adapters/firebase.js.map +1 -0
  23. package/lib/app/auth/adapters/jwtCookie.d.ts +55 -0
  24. package/lib/app/auth/adapters/jwtCookie.d.ts.map +1 -0
  25. package/lib/app/auth/adapters/jwtCookie.js +120 -0
  26. package/lib/app/auth/adapters/jwtCookie.js.map +1 -0
  27. package/lib/app/auth/index.d.ts +8 -0
  28. package/lib/app/auth/index.d.ts.map +1 -0
  29. package/lib/app/auth/index.js +7 -0
  30. package/lib/app/auth/index.js.map +1 -0
  31. package/lib/app/auth/jwt/AuthFlow.d.ts +94 -0
  32. package/lib/app/auth/jwt/AuthFlow.d.ts.map +1 -0
  33. package/lib/app/auth/jwt/AuthFlow.js +127 -0
  34. package/lib/app/auth/jwt/AuthFlow.js.map +1 -0
  35. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts +80 -0
  36. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts.map +1 -0
  37. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js +134 -0
  38. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js.map +1 -0
  39. package/lib/app/auth/jwt/JwtSigner.d.ts +123 -0
  40. package/lib/app/auth/jwt/JwtSigner.d.ts.map +1 -0
  41. package/lib/app/auth/jwt/JwtSigner.js +118 -0
  42. package/lib/app/auth/jwt/JwtSigner.js.map +1 -0
  43. package/lib/app/auth/jwt/RefreshTokenStore.d.ts +97 -0
  44. package/lib/app/auth/jwt/RefreshTokenStore.d.ts.map +1 -0
  45. package/lib/app/auth/jwt/RefreshTokenStore.js +122 -0
  46. package/lib/app/auth/jwt/RefreshTokenStore.js.map +1 -0
  47. package/lib/app/auth/permissionDefinition.d.ts +20 -0
  48. package/lib/app/auth/permissionDefinition.d.ts.map +1 -0
  49. package/lib/app/auth/permissionDefinition.js +2 -0
  50. package/lib/app/auth/permissionDefinition.js.map +1 -0
  51. package/lib/app/context/RequestContext.d.ts +59 -0
  52. package/lib/app/context/RequestContext.d.ts.map +1 -0
  53. package/lib/app/context/RequestContext.js +25 -0
  54. package/lib/app/context/RequestContext.js.map +1 -0
  55. package/lib/app/db/QueryOptions.d.ts +82 -0
  56. package/lib/app/db/QueryOptions.d.ts.map +1 -0
  57. package/lib/app/db/QueryOptions.js +37 -0
  58. package/lib/app/db/QueryOptions.js.map +1 -0
  59. package/lib/app/db/baseFields.d.ts +60 -0
  60. package/lib/app/db/baseFields.d.ts.map +1 -0
  61. package/lib/app/db/baseFields.js +54 -0
  62. package/lib/app/db/baseFields.js.map +1 -0
  63. package/lib/app/db/buildWhere.d.ts +22 -0
  64. package/lib/app/db/buildWhere.d.ts.map +1 -0
  65. package/lib/app/db/buildWhere.js +75 -0
  66. package/lib/app/db/buildWhere.js.map +1 -0
  67. package/lib/app/db/client.d.ts +111 -0
  68. package/lib/app/db/client.d.ts.map +1 -0
  69. package/lib/app/db/client.js +99 -0
  70. package/lib/app/db/client.js.map +1 -0
  71. package/lib/app/db/tenantScoped.d.ts +59 -0
  72. package/lib/app/db/tenantScoped.d.ts.map +1 -0
  73. package/lib/app/db/tenantScoped.js +54 -0
  74. package/lib/app/db/tenantScoped.js.map +1 -0
  75. package/lib/app/db/transaction.d.ts +58 -0
  76. package/lib/app/db/transaction.d.ts.map +1 -0
  77. package/lib/app/db/transaction.js +106 -0
  78. package/lib/app/db/transaction.js.map +1 -0
  79. package/lib/app/health/HealthCheck.d.ts +121 -0
  80. package/lib/app/health/HealthCheck.d.ts.map +1 -0
  81. package/lib/app/health/HealthCheck.js +151 -0
  82. package/lib/app/health/HealthCheck.js.map +1 -0
  83. package/lib/app/health/redisHealthCheck.d.ts +14 -0
  84. package/lib/app/health/redisHealthCheck.d.ts.map +1 -0
  85. package/lib/app/health/redisHealthCheck.js +21 -0
  86. package/lib/app/health/redisHealthCheck.js.map +1 -0
  87. package/lib/app/lifecycle/Bootstrapper.d.ts +92 -0
  88. package/lib/app/lifecycle/Bootstrapper.d.ts.map +1 -0
  89. package/lib/app/lifecycle/Bootstrapper.js +99 -0
  90. package/lib/app/lifecycle/Bootstrapper.js.map +1 -0
  91. package/lib/app/registry/routes.d.ts +89 -0
  92. package/lib/app/registry/routes.d.ts.map +1 -0
  93. package/lib/app/registry/routes.js +72 -0
  94. package/lib/app/registry/routes.js.map +1 -0
  95. package/lib/app/services/DrizzleEntityService.d.ts +123 -0
  96. package/lib/app/services/DrizzleEntityService.d.ts.map +1 -0
  97. package/lib/app/services/DrizzleEntityService.js +342 -0
  98. package/lib/app/services/DrizzleEntityService.js.map +1 -0
  99. package/lib/app/services/RedisProvider.d.ts +52 -0
  100. package/lib/app/services/RedisProvider.d.ts.map +1 -0
  101. package/lib/app/services/RedisProvider.js +75 -0
  102. package/lib/app/services/RedisProvider.js.map +1 -0
  103. package/lib/app/services/cache/Cache.d.ts +70 -0
  104. package/lib/app/services/cache/Cache.d.ts.map +1 -0
  105. package/lib/app/services/cache/Cache.js +18 -0
  106. package/lib/app/services/cache/Cache.js.map +1 -0
  107. package/lib/app/services/cache/InMemoryCache.d.ts +35 -0
  108. package/lib/app/services/cache/InMemoryCache.d.ts.map +1 -0
  109. package/lib/app/services/cache/InMemoryCache.js +76 -0
  110. package/lib/app/services/cache/InMemoryCache.js.map +1 -0
  111. package/lib/app/services/cache/RedisCache.d.ts +99 -0
  112. package/lib/app/services/cache/RedisCache.d.ts.map +1 -0
  113. package/lib/app/services/cache/RedisCache.js +150 -0
  114. package/lib/app/services/cache/RedisCache.js.map +1 -0
  115. package/lib/app/services/cache/cached.d.ts +30 -0
  116. package/lib/app/services/cache/cached.d.ts.map +1 -0
  117. package/lib/app/services/cache/cached.js +38 -0
  118. package/lib/app/services/cache/cached.js.map +1 -0
  119. package/lib/app/services/cache/index.d.ts +5 -0
  120. package/lib/app/services/cache/index.d.ts.map +1 -0
  121. package/lib/app/services/cache/index.js +4 -0
  122. package/lib/app/services/cache/index.js.map +1 -0
  123. package/lib/app/services/cron/defineCron.d.ts +57 -0
  124. package/lib/app/services/cron/defineCron.d.ts.map +1 -0
  125. package/lib/app/services/cron/defineCron.js +15 -0
  126. package/lib/app/services/cron/defineCron.js.map +1 -0
  127. package/lib/app/services/cron/index.d.ts +2 -0
  128. package/lib/app/services/cron/index.d.ts.map +1 -0
  129. package/lib/app/services/cron/index.js +2 -0
  130. package/lib/app/services/cron/index.js.map +1 -0
  131. package/lib/app/services/hooks/LifecycleHooks.d.ts +61 -0
  132. package/lib/app/services/hooks/LifecycleHooks.d.ts.map +1 -0
  133. package/lib/app/services/hooks/LifecycleHooks.js +85 -0
  134. package/lib/app/services/hooks/LifecycleHooks.js.map +1 -0
  135. package/lib/app/services/jobs/JobsManager.d.ts +67 -0
  136. package/lib/app/services/jobs/JobsManager.d.ts.map +1 -0
  137. package/lib/app/services/jobs/JobsManager.js +121 -0
  138. package/lib/app/services/jobs/JobsManager.js.map +1 -0
  139. package/lib/app/services/jobs/bullBoard.d.ts +72 -0
  140. package/lib/app/services/jobs/bullBoard.d.ts.map +1 -0
  141. package/lib/app/services/jobs/bullBoard.js +96 -0
  142. package/lib/app/services/jobs/bullBoard.js.map +1 -0
  143. package/lib/app/services/jobs/defineJob.d.ts +81 -0
  144. package/lib/app/services/jobs/defineJob.d.ts.map +1 -0
  145. package/lib/app/services/jobs/defineJob.js +49 -0
  146. package/lib/app/services/jobs/defineJob.js.map +1 -0
  147. package/lib/app/services/jobs/index.d.ts +4 -0
  148. package/lib/app/services/jobs/index.d.ts.map +1 -0
  149. package/lib/app/services/jobs/index.js +4 -0
  150. package/lib/app/services/jobs/index.js.map +1 -0
  151. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts +23 -0
  152. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts.map +1 -0
  153. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js +51 -0
  154. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js.map +1 -0
  155. package/lib/app/services/rateLimit/RateLimitBackend.d.ts +41 -0
  156. package/lib/app/services/rateLimit/RateLimitBackend.d.ts.map +1 -0
  157. package/lib/app/services/rateLimit/RateLimitBackend.js +19 -0
  158. package/lib/app/services/rateLimit/RateLimitBackend.js.map +1 -0
  159. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts +16 -0
  160. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts.map +1 -0
  161. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js +80 -0
  162. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js.map +1 -0
  163. package/lib/app/services/rateLimit/index.d.ts +4 -0
  164. package/lib/app/services/rateLimit/index.d.ts.map +1 -0
  165. package/lib/app/services/rateLimit/index.js +3 -0
  166. package/lib/app/services/rateLimit/index.js.map +1 -0
  167. package/lib/app/services/storage/DiskStorageAdapter.d.ts +62 -0
  168. package/lib/app/services/storage/DiskStorageAdapter.d.ts.map +1 -0
  169. package/lib/app/services/storage/DiskStorageAdapter.js +295 -0
  170. package/lib/app/services/storage/DiskStorageAdapter.js.map +1 -0
  171. package/lib/app/services/storage/GCSStorageAdapter.d.ts +44 -0
  172. package/lib/app/services/storage/GCSStorageAdapter.d.ts.map +1 -0
  173. package/lib/app/services/storage/GCSStorageAdapter.js +133 -0
  174. package/lib/app/services/storage/GCSStorageAdapter.js.map +1 -0
  175. package/lib/app/services/storage/S3StorageAdapter.d.ts +57 -0
  176. package/lib/app/services/storage/S3StorageAdapter.d.ts.map +1 -0
  177. package/lib/app/services/storage/S3StorageAdapter.js +162 -0
  178. package/lib/app/services/storage/S3StorageAdapter.js.map +1 -0
  179. package/lib/app/services/storage/StorageService.d.ts +88 -0
  180. package/lib/app/services/storage/StorageService.d.ts.map +1 -0
  181. package/lib/app/services/storage/StorageService.js +18 -0
  182. package/lib/app/services/storage/StorageService.js.map +1 -0
  183. package/lib/app/services/storage/index.d.ts +5 -0
  184. package/lib/app/services/storage/index.d.ts.map +1 -0
  185. package/lib/app/services/storage/index.js +4 -0
  186. package/lib/app/services/storage/index.js.map +1 -0
  187. package/lib/app/utils/ContextValidators.d.ts +46 -0
  188. package/lib/app/utils/ContextValidators.d.ts.map +1 -0
  189. package/lib/app/utils/ContextValidators.js +81 -0
  190. package/lib/app/utils/ContextValidators.js.map +1 -0
  191. package/lib/app/utils/defineEnv.d.ts +80 -0
  192. package/lib/app/utils/defineEnv.d.ts.map +1 -0
  193. package/lib/app/utils/defineEnv.js +95 -0
  194. package/lib/app/utils/defineEnv.js.map +1 -0
  195. package/lib/client.d.ts +139 -0
  196. package/lib/client.d.ts.map +1 -0
  197. package/lib/client.js +98 -0
  198. package/lib/client.js.map +1 -0
  199. package/lib/contract/application.d.ts +3 -0
  200. package/lib/contract/application.d.ts.map +1 -0
  201. package/lib/contract/application.js +2 -0
  202. package/lib/contract/application.js.map +1 -0
  203. package/lib/contract/client.d.ts +3 -0
  204. package/lib/contract/client.d.ts.map +1 -0
  205. package/lib/contract/client.js +3 -0
  206. package/lib/contract/client.js.map +1 -0
  207. package/lib/contract/index.d.ts +3 -0
  208. package/lib/contract/index.d.ts.map +1 -0
  209. package/lib/contract/index.js +3 -0
  210. package/lib/contract/index.js.map +1 -0
  211. package/lib/contract/manifest.d.ts +3 -0
  212. package/lib/contract/manifest.d.ts.map +1 -0
  213. package/lib/contract/manifest.js +2 -0
  214. package/lib/contract/manifest.js.map +1 -0
  215. package/lib/contract/openapi.d.ts +3 -0
  216. package/lib/contract/openapi.d.ts.map +1 -0
  217. package/lib/contract/openapi.js +3 -0
  218. package/lib/contract/openapi.js.map +1 -0
  219. package/lib/contract/project.d.ts +3 -0
  220. package/lib/contract/project.d.ts.map +1 -0
  221. package/lib/contract/project.js +3 -0
  222. package/lib/contract/project.js.map +1 -0
  223. package/lib/contract/schema.d.ts +3 -0
  224. package/lib/contract/schema.d.ts.map +1 -0
  225. package/lib/contract/schema.js +3 -0
  226. package/lib/contract/schema.js.map +1 -0
  227. package/lib/drizzle/index.d.ts +3 -0
  228. package/lib/drizzle/index.d.ts.map +1 -0
  229. package/lib/drizzle/index.js +3 -0
  230. package/lib/drizzle/index.js.map +1 -0
  231. package/lib/hono/auth.d.ts +6 -0
  232. package/lib/hono/auth.d.ts.map +1 -0
  233. package/lib/hono/auth.js +54 -0
  234. package/lib/hono/auth.js.map +1 -0
  235. package/lib/hono/index.d.ts +4 -0
  236. package/lib/hono/index.d.ts.map +1 -0
  237. package/lib/hono/index.js +4 -0
  238. package/lib/hono/index.js.map +1 -0
  239. package/lib/http/app/createApp.d.ts +132 -0
  240. package/lib/http/app/createApp.d.ts.map +1 -0
  241. package/lib/http/app/createApp.js +215 -0
  242. package/lib/http/app/createApp.js.map +1 -0
  243. package/lib/http/app/devRoutes.d.ts +31 -0
  244. package/lib/http/app/devRoutes.d.ts.map +1 -0
  245. package/lib/http/app/devRoutes.js +145 -0
  246. package/lib/http/app/devRoutes.js.map +1 -0
  247. package/lib/http/app/errors.d.ts +45 -0
  248. package/lib/http/app/errors.d.ts.map +1 -0
  249. package/lib/http/app/errors.js +93 -0
  250. package/lib/http/app/errors.js.map +1 -0
  251. package/lib/http/app/health.d.ts +66 -0
  252. package/lib/http/app/health.d.ts.map +1 -0
  253. package/lib/http/app/health.js +104 -0
  254. package/lib/http/app/health.js.map +1 -0
  255. package/lib/http/errors/AppError.d.ts +10 -0
  256. package/lib/http/errors/AppError.d.ts.map +1 -0
  257. package/lib/http/errors/AppError.js +19 -0
  258. package/lib/http/errors/AppError.js.map +1 -0
  259. package/lib/http/errors/AuthenticationError.d.ts +8 -0
  260. package/lib/http/errors/AuthenticationError.d.ts.map +1 -0
  261. package/lib/http/errors/AuthenticationError.js +10 -0
  262. package/lib/http/errors/AuthenticationError.js.map +1 -0
  263. package/lib/http/errors/AuthorizationError.d.ts +8 -0
  264. package/lib/http/errors/AuthorizationError.d.ts.map +1 -0
  265. package/lib/http/errors/AuthorizationError.js +10 -0
  266. package/lib/http/errors/AuthorizationError.js.map +1 -0
  267. package/lib/http/errors/BadRequestError.d.ts +8 -0
  268. package/lib/http/errors/BadRequestError.d.ts.map +1 -0
  269. package/lib/http/errors/BadRequestError.js +10 -0
  270. package/lib/http/errors/BadRequestError.js.map +1 -0
  271. package/lib/http/errors/ConflictError.d.ts +8 -0
  272. package/lib/http/errors/ConflictError.d.ts.map +1 -0
  273. package/lib/http/errors/ConflictError.js +10 -0
  274. package/lib/http/errors/ConflictError.js.map +1 -0
  275. package/lib/http/errors/InternalServerError.d.ts +8 -0
  276. package/lib/http/errors/InternalServerError.d.ts.map +1 -0
  277. package/lib/http/errors/InternalServerError.js +10 -0
  278. package/lib/http/errors/InternalServerError.js.map +1 -0
  279. package/lib/http/errors/NotFoundError.d.ts +8 -0
  280. package/lib/http/errors/NotFoundError.d.ts.map +1 -0
  281. package/lib/http/errors/NotFoundError.js +10 -0
  282. package/lib/http/errors/NotFoundError.js.map +1 -0
  283. package/lib/http/errors/RateLimitError.d.ts +13 -0
  284. package/lib/http/errors/RateLimitError.d.ts.map +1 -0
  285. package/lib/http/errors/RateLimitError.js +16 -0
  286. package/lib/http/errors/RateLimitError.js.map +1 -0
  287. package/lib/http/errors/ServiceUnavailableError.d.ts +8 -0
  288. package/lib/http/errors/ServiceUnavailableError.d.ts.map +1 -0
  289. package/lib/http/errors/ServiceUnavailableError.js +10 -0
  290. package/lib/http/errors/ServiceUnavailableError.js.map +1 -0
  291. package/lib/http/errors/ValidationError.d.ts +9 -0
  292. package/lib/http/errors/ValidationError.d.ts.map +1 -0
  293. package/lib/http/errors/ValidationError.js +12 -0
  294. package/lib/http/errors/ValidationError.js.map +1 -0
  295. package/lib/http/errors/index.d.ts +11 -0
  296. package/lib/http/errors/index.d.ts.map +1 -0
  297. package/lib/http/errors/index.js +12 -0
  298. package/lib/http/errors/index.js.map +1 -0
  299. package/lib/http/middleware/apiKey.d.ts +9 -0
  300. package/lib/http/middleware/apiKey.d.ts.map +1 -0
  301. package/lib/http/middleware/apiKey.js +71 -0
  302. package/lib/http/middleware/apiKey.js.map +1 -0
  303. package/lib/http/middleware/csrf.d.ts +63 -0
  304. package/lib/http/middleware/csrf.d.ts.map +1 -0
  305. package/lib/http/middleware/csrf.js +169 -0
  306. package/lib/http/middleware/csrf.js.map +1 -0
  307. package/lib/http/middleware/httpLogger.d.ts +39 -0
  308. package/lib/http/middleware/httpLogger.d.ts.map +1 -0
  309. package/lib/http/middleware/httpLogger.js +118 -0
  310. package/lib/http/middleware/httpLogger.js.map +1 -0
  311. package/lib/http/middleware/idempotency.d.ts +48 -0
  312. package/lib/http/middleware/idempotency.d.ts.map +1 -0
  313. package/lib/http/middleware/idempotency.js +180 -0
  314. package/lib/http/middleware/idempotency.js.map +1 -0
  315. package/lib/http/middleware/rateLimit.d.ts +105 -0
  316. package/lib/http/middleware/rateLimit.d.ts.map +1 -0
  317. package/lib/http/middleware/rateLimit.js +84 -0
  318. package/lib/http/middleware/rateLimit.js.map +1 -0
  319. package/lib/http/middleware/requireAuth.d.ts +58 -0
  320. package/lib/http/middleware/requireAuth.d.ts.map +1 -0
  321. package/lib/http/middleware/requireAuth.js +63 -0
  322. package/lib/http/middleware/requireAuth.js.map +1 -0
  323. package/lib/http/middleware/requirePermission.d.ts +23 -0
  324. package/lib/http/middleware/requirePermission.d.ts.map +1 -0
  325. package/lib/http/middleware/requirePermission.js +50 -0
  326. package/lib/http/middleware/requirePermission.js.map +1 -0
  327. package/lib/http/middleware/resolveTenant.d.ts +41 -0
  328. package/lib/http/middleware/resolveTenant.d.ts.map +1 -0
  329. package/lib/http/middleware/resolveTenant.js +17 -0
  330. package/lib/http/middleware/resolveTenant.js.map +1 -0
  331. package/lib/http/streaming/sse.d.ts +31 -0
  332. package/lib/http/streaming/sse.d.ts.map +1 -0
  333. package/lib/http/streaming/sse.js +11 -0
  334. package/lib/http/streaming/sse.js.map +1 -0
  335. package/lib/http/streaming/streamLLM.d.ts +94 -0
  336. package/lib/http/streaming/streamLLM.d.ts.map +1 -0
  337. package/lib/http/streaming/streamLLM.js +94 -0
  338. package/lib/http/streaming/streamLLM.js.map +1 -0
  339. package/lib/http/utils/authCookies.d.ts +74 -0
  340. package/lib/http/utils/authCookies.d.ts.map +1 -0
  341. package/lib/http/utils/authCookies.js +102 -0
  342. package/lib/http/utils/authCookies.js.map +1 -0
  343. package/lib/http/utils/clientIp.d.ts +85 -0
  344. package/lib/http/utils/clientIp.d.ts.map +1 -0
  345. package/lib/http/utils/clientIp.js +249 -0
  346. package/lib/http/utils/clientIp.js.map +1 -0
  347. package/lib/http/utils/index.d.ts +4 -0
  348. package/lib/http/utils/index.d.ts.map +1 -0
  349. package/lib/http/utils/index.js +5 -0
  350. package/lib/http/utils/index.js.map +1 -0
  351. package/lib/http/utils/metaTags.d.ts +49 -0
  352. package/lib/http/utils/metaTags.d.ts.map +1 -0
  353. package/lib/http/utils/metaTags.js +32 -0
  354. package/lib/http/utils/metaTags.js.map +1 -0
  355. package/lib/http/utils/publicSuffix.d.ts +34 -0
  356. package/lib/http/utils/publicSuffix.d.ts.map +1 -0
  357. package/lib/http/utils/publicSuffix.js +276 -0
  358. package/lib/http/utils/publicSuffix.js.map +1 -0
  359. package/lib/http/utils/uploads.d.ts +92 -0
  360. package/lib/http/utils/uploads.d.ts.map +1 -0
  361. package/lib/http/utils/uploads.js +126 -0
  362. package/lib/http/utils/uploads.js.map +1 -0
  363. package/lib/http/utils/validate.d.ts +41 -0
  364. package/lib/http/utils/validate.d.ts.map +1 -0
  365. package/lib/http/utils/validate.js +55 -0
  366. package/lib/http/utils/validate.js.map +1 -0
  367. package/lib/http/utils/webhooks.d.ts +63 -0
  368. package/lib/http/utils/webhooks.d.ts.map +1 -0
  369. package/lib/http/utils/webhooks.js +133 -0
  370. package/lib/http/utils/webhooks.js.map +1 -0
  371. package/lib/http/ws/auth.d.ts +46 -0
  372. package/lib/http/ws/auth.d.ts.map +1 -0
  373. package/lib/http/ws/auth.js +123 -0
  374. package/lib/http/ws/auth.js.map +1 -0
  375. package/lib/index.d.ts +80 -0
  376. package/lib/index.d.ts.map +1 -0
  377. package/lib/index.js +61 -0
  378. package/lib/index.js.map +1 -0
  379. package/lib/kernel/index.d.ts +3 -0
  380. package/lib/kernel/index.d.ts.map +1 -0
  381. package/lib/kernel/index.js +3 -0
  382. package/lib/kernel/index.js.map +1 -0
  383. package/lib/libraries/.gitkeep +0 -0
  384. package/lib/libraries/ai/CHANGELOG.md +17 -0
  385. package/lib/libraries/ai/README.md +164 -0
  386. package/lib/libraries/ai/adapters/AnthropicAdapter.ts +382 -0
  387. package/lib/libraries/ai/adapters/LLMProvider.ts +76 -0
  388. package/lib/libraries/ai/adapters/OpenAIAdapter.ts +466 -0
  389. package/lib/libraries/ai/experimental/index.ts +20 -0
  390. package/lib/libraries/ai/index.ts +128 -0
  391. package/lib/libraries/ai/library.json +19 -0
  392. package/lib/libraries/ai/loop/agentLoop.ts +377 -0
  393. package/lib/libraries/ai/prompts/definePrompt.ts +0 -0
  394. package/lib/libraries/ai/rag/retrieveAndAnswer.ts +177 -0
  395. package/lib/libraries/ai/streaming/streamLLM.ts +94 -0
  396. package/lib/libraries/ai/structured/completeStructured.ts +143 -0
  397. package/lib/libraries/ai/tokens/Tokenizer.ts +216 -0
  398. package/lib/libraries/ai/tools/defineTool.ts +208 -0
  399. package/lib/libraries/ai/types.ts +260 -0
  400. package/lib/libraries/chunking/ChunkingService.ts +103 -0
  401. package/lib/libraries/chunking/README.md +104 -0
  402. package/lib/libraries/chunking/docs/api-reference.md +549 -0
  403. package/lib/libraries/chunking/docs/best-practices.md +321 -0
  404. package/lib/libraries/chunking/docs/code-organization.md +538 -0
  405. package/lib/libraries/chunking/docs/configuration.md +418 -0
  406. package/lib/libraries/chunking/docs/index.md +236 -0
  407. package/lib/libraries/chunking/docs/quick-start.md +298 -0
  408. package/lib/libraries/chunking/docs/strategies.md +407 -0
  409. package/lib/libraries/chunking/docs/summary.md +258 -0
  410. package/lib/libraries/chunking/docs/troubleshooting.md +527 -0
  411. package/lib/libraries/chunking/index.ts +17 -0
  412. package/lib/libraries/chunking/library.json +16 -0
  413. package/lib/libraries/chunking/strategies/ChunkingStrategy.ts +13 -0
  414. package/lib/libraries/chunking/strategies/FixedLengthChunkingStrategy.ts +88 -0
  415. package/lib/libraries/chunking/strategies/SemanticChunkingStrategy.ts +389 -0
  416. package/lib/libraries/chunking/strategies/SlidingWindowChunkingStrategy.ts +258 -0
  417. package/lib/libraries/chunking/types/index.ts +63 -0
  418. package/lib/libraries/email/EmailService.ts +591 -0
  419. package/lib/libraries/email/README.md +777 -0
  420. package/lib/libraries/email/TemplateRegistry.ts +148 -0
  421. package/lib/libraries/email/TemplateRenderer.ts +273 -0
  422. package/lib/libraries/email/index.ts +4 -0
  423. package/lib/libraries/email/initializeEmailService.ts +60 -0
  424. package/lib/libraries/email/library.json +12 -0
  425. package/lib/libraries/email/types/EmailAddress.ts +4 -0
  426. package/lib/libraries/email/types/EmailAttachment.ts +11 -0
  427. package/lib/libraries/email/types/EmailTag.ts +9 -0
  428. package/lib/libraries/email/types/EmailTemplate.ts +124 -0
  429. package/lib/libraries/email/types/SendBatchEmailsOptions.ts +9 -0
  430. package/lib/libraries/email/types/SendBatchEmailsResult.ts +9 -0
  431. package/lib/libraries/email/types/SendEmailOptions.ts +33 -0
  432. package/lib/libraries/email/types/SendEmailResult.ts +9 -0
  433. package/lib/libraries/email/types/index.ts +8 -0
  434. package/lib/libraries/weaviate/QueryBuilder.ts +292 -0
  435. package/lib/libraries/weaviate/README.md +284 -0
  436. package/lib/libraries/weaviate/Weaviate.ts +1419 -0
  437. package/lib/libraries/weaviate/WeaviateConfig.ts +268 -0
  438. package/lib/libraries/weaviate/docs/.gitkeep +1 -0
  439. package/lib/libraries/weaviate/docs/API_REFERENCE.md +1067 -0
  440. package/lib/libraries/weaviate/docs/CONFIGURATION.md +320 -0
  441. package/lib/libraries/weaviate/docs/ERROR_HANDLING.md +271 -0
  442. package/lib/libraries/weaviate/docs/MULTI_TENANCY.md +348 -0
  443. package/lib/libraries/weaviate/docs/PERFORMANCE.md +602 -0
  444. package/lib/libraries/weaviate/docs/PLUGIN_DEVELOPMENT.md +547 -0
  445. package/lib/libraries/weaviate/docs/QUICK_START.md +443 -0
  446. package/lib/libraries/weaviate/docs/README.md +269 -0
  447. package/lib/libraries/weaviate/docs/SCHEMA_GUIDE.md +630 -0
  448. package/lib/libraries/weaviate/docs/WEAVIATE_README.md +520 -0
  449. package/lib/libraries/weaviate/errors/WeaviateError.ts +92 -0
  450. package/lib/libraries/weaviate/errors/index.ts +1 -0
  451. package/lib/libraries/weaviate/index.ts +35 -0
  452. package/lib/libraries/weaviate/library.json +26 -0
  453. package/lib/libraries/weaviate/plugins/index.ts +2 -0
  454. package/lib/libraries/weaviate/schemas/SchemaRegistry.ts +284 -0
  455. package/lib/libraries/weaviate/schemas/index.ts +2 -0
  456. package/lib/libraries/weaviate/types/BM25SearchOptions.ts +9 -0
  457. package/lib/libraries/weaviate/types/ExtendedWeaviateClient.ts +7 -0
  458. package/lib/libraries/weaviate/types/HybridSearchOptions.ts +11 -0
  459. package/lib/libraries/weaviate/types/MultiTenancy.ts +81 -0
  460. package/lib/libraries/weaviate/types/Plugin.ts +17 -0
  461. package/lib/libraries/weaviate/types/SchemaConfig.ts +25 -0
  462. package/lib/libraries/weaviate/types/SearchMethod.ts +8 -0
  463. package/lib/libraries/weaviate/types/SearchOptions.ts +16 -0
  464. package/lib/libraries/weaviate/types/SearchRequest.ts +19 -0
  465. package/lib/libraries/weaviate/types/SearchResult.ts +16 -0
  466. package/lib/libraries/weaviate/types/SearchableField.ts +87 -0
  467. package/lib/libraries/weaviate/types/VectorIndexConfig.ts +19 -0
  468. package/lib/libraries/weaviate/types/VectorSearchOptions.ts +18 -0
  469. package/lib/libraries/weaviate/types/VectorizerConfig.ts +8 -0
  470. package/lib/libraries/weaviate/types/index.ts +29 -0
  471. package/lib/libraries/weaviate/utils/TenantContextManager.ts +94 -0
  472. package/lib/modules/accounts/index.ts +47 -0
  473. package/lib/modules/accounts/module.json +15 -0
  474. package/lib/modules/accounts/permissions.ts +33 -0
  475. package/lib/modules/accounts/routes.ts +200 -0
  476. package/lib/modules/accounts/schema.ts +219 -0
  477. package/lib/modules/accounts/services/AccountService.ts +44 -0
  478. package/lib/modules/accounts/validation/schemas.ts +70 -0
  479. package/lib/modules/oauth/adapters/GmailOAuthAdapter.ts +35 -0
  480. package/lib/modules/oauth/adapters/GoogleOAuthAdapter.ts +278 -0
  481. package/lib/modules/oauth/adapters/MicrosoftOAuthAdapter.ts +269 -0
  482. package/lib/modules/oauth/adapters/MockOAuthAdapter.ts +138 -0
  483. package/lib/modules/oauth/adapters/OAuthAdapter.ts +211 -0
  484. package/lib/modules/oauth/adapters/OAuthAdapterRegistry.ts +77 -0
  485. package/lib/modules/oauth/adapters/OutlookOAuthAdapter.ts +38 -0
  486. package/lib/modules/oauth/index.ts +79 -0
  487. package/lib/modules/oauth/module.json +23 -0
  488. package/lib/modules/oauth/permissions.ts +39 -0
  489. package/lib/modules/oauth/routes.ts +497 -0
  490. package/lib/modules/oauth/schema.ts +127 -0
  491. package/lib/modules/oauth/services/OAuthConnectionService.ts +147 -0
  492. package/lib/modules/oauth/state.ts +234 -0
  493. package/lib/modules/oauth/stateJtiCache.ts +85 -0
  494. package/lib/modules/oauth/verifyIdToken.ts +178 -0
  495. package/lib/modules/outbox/EventEmitter.ts +106 -0
  496. package/lib/modules/outbox/OutboxDrainer.ts +163 -0
  497. package/lib/modules/outbox/handlers/EventHandler.ts +115 -0
  498. package/lib/modules/outbox/index.ts +43 -0
  499. package/lib/modules/outbox/module.json +15 -0
  500. package/lib/modules/outbox/permissions.ts +36 -0
  501. package/lib/modules/outbox/routes.ts +219 -0
  502. package/lib/modules/outbox/schema.ts +207 -0
  503. package/lib/modules/outbox/services/OutboxEventService.ts +223 -0
  504. package/lib/observability/logger.d.ts +30 -0
  505. package/lib/observability/logger.d.ts.map +1 -0
  506. package/lib/observability/logger.js +110 -0
  507. package/lib/observability/logger.js.map +1 -0
  508. package/lib/observability/metrics.d.ts +3 -0
  509. package/lib/observability/metrics.d.ts.map +1 -0
  510. package/lib/observability/metrics.js +3 -0
  511. package/lib/observability/metrics.js.map +1 -0
  512. package/lib/observability/otel.d.ts +3 -0
  513. package/lib/observability/otel.d.ts.map +1 -0
  514. package/lib/observability/otel.js +3 -0
  515. package/lib/observability/otel.js.map +1 -0
  516. package/lib/observability/safeErrorFields.d.ts +14 -0
  517. package/lib/observability/safeErrorFields.d.ts.map +1 -0
  518. package/lib/observability/safeErrorFields.js +14 -0
  519. package/lib/observability/safeErrorFields.js.map +1 -0
  520. package/lib/observability/tracing.d.ts +3 -0
  521. package/lib/observability/tracing.d.ts.map +1 -0
  522. package/lib/observability/tracing.js +3 -0
  523. package/lib/observability/tracing.js.map +1 -0
  524. package/lib/package.json +4 -0
  525. package/lib/testing.d.ts +3 -0
  526. package/lib/testing.d.ts.map +1 -0
  527. package/lib/testing.js +3 -0
  528. package/lib/testing.js.map +1 -0
  529. package/package.json +193 -3
  530. package/templates/default/.claude/agents/qa-brief.md +106 -0
  531. package/templates/default/.claude/commands/sherpa-brief.md +23 -0
  532. package/templates/default/.cursor/rules/api.mdc +80 -0
  533. package/templates/default/.cursor/rules/commits.mdc +88 -0
  534. package/templates/default/.cursor/rules/security.mdc +92 -0
  535. package/templates/default/.cursor/rules/testing.mdc +123 -0
  536. package/templates/default/.cursor/rules/typescript.mdc +86 -0
  537. package/templates/default/.env.example +79 -0
  538. package/templates/default/.github/workflows/sherpa-brief.yml +180 -0
  539. package/templates/default/AGENTS.md +166 -0
  540. package/templates/default/CLAUDE.md +17 -0
  541. package/templates/default/README.md +97 -0
  542. package/templates/default/_gitignore +27 -0
  543. package/templates/default/docker-compose.yml +83 -0
  544. package/templates/default/drizzle.config.ts +34 -0
  545. package/templates/default/eslint.config.mjs +106 -0
  546. package/templates/default/package.json +57 -0
  547. package/templates/default/ship-api.config.ts +21 -0
  548. package/templates/default/src/client.ts +34 -0
  549. package/templates/default/src/config/modules.ts +23 -0
  550. package/templates/default/src/db/schema.ts +26 -0
  551. package/templates/default/src/environment.ts +81 -0
  552. package/templates/default/src/index.test.ts +53 -0
  553. package/templates/default/src/index.ts +11 -0
  554. package/templates/default/src/instrumentation.ts +13 -0
  555. package/templates/default/src/server.ts +90 -0
  556. package/templates/default/tsconfig.json +24 -0
@@ -0,0 +1,123 @@
1
+ import { type SQL } from "drizzle-orm";
2
+ import type { PgColumn, PgTable } from "drizzle-orm/pg-core";
3
+ import type { ShipDb } from "../db/client.js";
4
+ import type { DslQueryFilter, OrderClause, QueryOptions } from "../db/QueryOptions.js";
5
+ import { type LifecycleHookContext, type LifecycleHooks } from "./hooks/LifecycleHooks.js";
6
+ /**
7
+ * Generic CRUD/list/search base for Drizzle-backed services.
8
+ *
9
+ * Replaces v3's TypeORM `EntityService<T>`. Same surface (`get`, `getAll`,
10
+ * `list`, `count`, etc.); abstract hooks renamed to fit Drizzle (`getTable()`
11
+ * instead of `getEntityClass()`).
12
+ *
13
+ * **This batch (alpha-1, sub-batch 3b)** ships the read surface: `get`,
14
+ * `getAll`, `list`, `count`, soft-delete filtering, free-text search across
15
+ * `getDefaultSearchFields()`, and lifecycle-hook integration for
16
+ * `beforeQuery`. Mutation methods (`create`, `update`, `delete`) and the
17
+ * full lifecycle pair land in sub-batch 3c.
18
+ *
19
+ * Internally uses Drizzle's `db.select().from(table)` builder so the base
20
+ * class is testable against a fake Drizzle-shaped client. Subclasses that
21
+ * need nested relations should override the read methods to delegate to
22
+ * `db.query.<table>.findMany(...)` — that path is opt-in until the
23
+ * relational-query helpers in this base class mature.
24
+ */
25
+ export interface ListResult<TRow> {
26
+ rows: TRow[];
27
+ total: number;
28
+ }
29
+ export declare abstract class DrizzleEntityService<TTable extends PgTable, TSchema extends Record<string, unknown> = Record<string, never>> {
30
+ protected readonly db: ShipDb<TSchema>;
31
+ constructor(db: ShipDb<TSchema>);
32
+ /** The Drizzle table this service operates on. */
33
+ protected abstract getTable(): TTable;
34
+ /** Relation keys to load by default. Currently advisory — used in v4.0 by
35
+ * subclasses that override read methods to delegate to the relational
36
+ * query builder. */
37
+ protected getDefaultRelations(): readonly string[];
38
+ /** Default order for `getAll` / `list`. Override per service. */
39
+ protected getDefaultOrder(): readonly OrderClause[];
40
+ /** Column names searched by free-text `?search=...`. Override per service. */
41
+ protected getDefaultSearchFields(): readonly string[];
42
+ /** Compose lifecycle hooks for this service. Override to register hooks
43
+ * alongside framework-global ones. */
44
+ protected getHooks(): LifecycleHooks;
45
+ /**
46
+ * Subclass-overridable hook for setting defaults / coercing optional fields
47
+ * before persistence (translates v3 `EntityService.applyOptionalFields`).
48
+ * Distinct from lifecycle hooks: this runs unconditionally per service,
49
+ * before any composed `beforeCreate`/`beforeUpdate` hook.
50
+ */
51
+ protected applyOptionalFields(values: unknown): Promise<unknown>;
52
+ /**
53
+ * Subclass-overridable hook for resolving "find or create by ID" relation
54
+ * references before INSERT (translates v3 `EntityService.handleRelationships`).
55
+ * Default no-op.
56
+ */
57
+ protected resolveRelationIds(values: unknown): Promise<unknown>;
58
+ /** Fetch by primary-key `id`. Returns null when not found. Soft-deleted
59
+ * rows are hidden unless `opts.includeDeleted: true`. */
60
+ get(id: string, opts?: QueryOptions): Promise<unknown | null>;
61
+ /** Fetch all rows matching the filter (no pagination). Default order applies. */
62
+ getAll(opts?: QueryOptions): Promise<unknown[]>;
63
+ /** Paginated list — returns rows + total count under the same filter. */
64
+ list(opts?: QueryOptions): Promise<ListResult<unknown>>;
65
+ /** Count of rows matching the filter (ignores limit/offset/order). */
66
+ count(opts?: QueryOptions): Promise<number>;
67
+ /**
68
+ * Insert a new row.
69
+ * Pipeline: `applyOptionalFields` → `resolveRelationIds` → auto-stamp
70
+ * `createdBy` from `RequestContext.userId` if column exists →
71
+ * `beforeCreate` hook chain → INSERT … RETURNING * → `afterCreate` hooks.
72
+ */
73
+ create(values: unknown): Promise<unknown>;
74
+ /**
75
+ * Update by primary-key `id` with a partial patch.
76
+ * Pipeline: load `prev` (404s if missing) → auto-stamp `updatedBy` →
77
+ * `beforeUpdate` hook chain (receives `prev` + `patch`) → UPDATE …
78
+ * RETURNING * → `afterUpdate` hooks (receive `prev` + `next` for diffing).
79
+ *
80
+ * `prev` is loaded *before* the write so audit / CDC consumers can compute
81
+ * diffs reliably even on tables without history triggers.
82
+ */
83
+ update(id: string, patch: unknown): Promise<unknown>;
84
+ /**
85
+ * Delete by primary-key `id`.
86
+ * Pipeline: load `prev` (404s if missing) → `beforeDelete` (may throw to
87
+ * abort) → soft-delete (UPDATE deleted_at = now() + updatedBy) when the
88
+ * table has a `deletedAt` column, otherwise hard DELETE → `afterDelete`.
89
+ */
90
+ delete(id: string): Promise<unknown>;
91
+ /**
92
+ * Compose user-filter + scoped clause + soft-delete clause into one `AND`
93
+ * expression. `undefined` when nothing applies.
94
+ */
95
+ protected composeWhere(userFilter: DslQueryFilter | undefined, extra: SQL | undefined, includeDeleted?: boolean): SQL | undefined;
96
+ /**
97
+ * Build a free-text search expression OR'ing `ilike '%query%'` across
98
+ * the columns returned by `getDefaultSearchFields()`. Returns `undefined`
99
+ * when there are no search fields or no query.
100
+ */
101
+ protected searchExpr(query: string | undefined): SQL | undefined;
102
+ /**
103
+ * Translate `OrderClause[]` into Drizzle `orderBy(...)` arguments. Falls
104
+ * back to `getDefaultOrder()` when the caller provides nothing.
105
+ */
106
+ protected resolveOrder(order: readonly OrderClause[] | undefined): SQL[];
107
+ /** Walk the configured hooks' `beforeQuery` (if any) over the user filter. */
108
+ protected runBeforeQuery(filter: DslQueryFilter | undefined): Promise<DslQueryFilter | undefined>;
109
+ /**
110
+ * Look up a column by property name on the configured table. Returns
111
+ * `undefined` for unknown names (callers should treat this as "skip").
112
+ */
113
+ protected getColumn(name: string): PgColumn | undefined;
114
+ /** Span-name prefix per service (override if you want a custom one). */
115
+ protected spanName(): string;
116
+ /**
117
+ * Auto-stamp `createdBy` / `updatedBy` from `RequestContext.userId` if the
118
+ * column exists on the table and the value isn't already set on the input.
119
+ * Returns a new object — does not mutate `values`.
120
+ */
121
+ protected stampActor(values: unknown, column: "createdBy" | "updatedBy", ctx: LifecycleHookContext): unknown;
122
+ }
123
+ //# sourceMappingURL=DrizzleEntityService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrizzleEntityService.d.ts","sourceRoot":"","sources":["../../../src/app/services/DrizzleEntityService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,342 @@
1
+ import { and, asc, count as countAggregate, desc, eq, ilike, isNull, or, } from "drizzle-orm";
2
+ import { NotFoundError } from "../../http/errors/NotFoundError.js";
3
+ import { withSpan } from "../../observability/tracing.js";
4
+ import { getRequestContext } from "../context/RequestContext.js";
5
+ import { buildWhere } from "../db/buildWhere.js";
6
+ import { composeHooks, } from "./hooks/LifecycleHooks.js";
7
+ /** Fallback default order: newest first by `createdAt`. */
8
+ const DEFAULT_ORDER = [{ field: "createdAt", direction: "desc" }];
9
+ export class DrizzleEntityService {
10
+ db;
11
+ constructor(db) {
12
+ this.db = db;
13
+ }
14
+ /** Relation keys to load by default. Currently advisory — used in v4.0 by
15
+ * subclasses that override read methods to delegate to the relational
16
+ * query builder. */
17
+ getDefaultRelations() {
18
+ return [];
19
+ }
20
+ /** Default order for `getAll` / `list`. Override per service. */
21
+ getDefaultOrder() {
22
+ return DEFAULT_ORDER;
23
+ }
24
+ /** Column names searched by free-text `?search=...`. Override per service. */
25
+ getDefaultSearchFields() {
26
+ return [];
27
+ }
28
+ /** Compose lifecycle hooks for this service. Override to register hooks
29
+ * alongside framework-global ones. */
30
+ getHooks() {
31
+ return {};
32
+ }
33
+ /**
34
+ * Subclass-overridable hook for setting defaults / coercing optional fields
35
+ * before persistence (translates v3 `EntityService.applyOptionalFields`).
36
+ * Distinct from lifecycle hooks: this runs unconditionally per service,
37
+ * before any composed `beforeCreate`/`beforeUpdate` hook.
38
+ */
39
+ async applyOptionalFields(values) {
40
+ return values;
41
+ }
42
+ /**
43
+ * Subclass-overridable hook for resolving "find or create by ID" relation
44
+ * references before INSERT (translates v3 `EntityService.handleRelationships`).
45
+ * Default no-op.
46
+ */
47
+ async resolveRelationIds(values) {
48
+ return values;
49
+ }
50
+ // ────────────────────────────── Read API ───────────────────────────────
51
+ /** Fetch by primary-key `id`. Returns null when not found. Soft-deleted
52
+ * rows are hidden unless `opts.includeDeleted: true`. */
53
+ async get(id, opts = {}) {
54
+ return withSpan(`${this.spanName()}.get`, async () => {
55
+ const table = this.getTable();
56
+ const idColumn = this.getColumn("id");
57
+ if (!idColumn) {
58
+ throw new Error(`${this.constructor.name}: getTable() must expose an "id" column`);
59
+ }
60
+ const userFilter = await this.runBeforeQuery(opts.where);
61
+ const where = this.composeWhere(userFilter, eq(idColumn, id), opts.includeDeleted);
62
+ const rows = (await this.db
63
+ .select()
64
+ .from(table)
65
+ .where(where)
66
+ .limit(1));
67
+ return rows[0] ?? null;
68
+ });
69
+ }
70
+ /** Fetch all rows matching the filter (no pagination). Default order applies. */
71
+ async getAll(opts = {}) {
72
+ return withSpan(`${this.spanName()}.getAll`, async () => {
73
+ const table = this.getTable();
74
+ const userFilter = await this.runBeforeQuery(opts.where);
75
+ const where = this.composeWhere(userFilter, this.searchExpr(opts.search), opts.includeDeleted);
76
+ const order = this.resolveOrder(opts.order);
77
+ let q = this.db.select().from(table);
78
+ if (where)
79
+ q = q.where(where);
80
+ if (order.length > 0)
81
+ q = q.orderBy(...order);
82
+ if (opts.limit !== undefined)
83
+ q = q.limit(opts.limit);
84
+ if (opts.offset !== undefined)
85
+ q = q.offset(opts.offset);
86
+ return (await q);
87
+ });
88
+ }
89
+ /** Paginated list — returns rows + total count under the same filter. */
90
+ async list(opts = {}) {
91
+ return withSpan(`${this.spanName()}.list`, async () => {
92
+ const [rows, total] = await Promise.all([
93
+ this.getAll(opts),
94
+ this.count({ where: opts.where, search: opts.search, includeDeleted: opts.includeDeleted }),
95
+ ]);
96
+ return { rows, total };
97
+ });
98
+ }
99
+ /** Count of rows matching the filter (ignores limit/offset/order). */
100
+ async count(opts = {}) {
101
+ return withSpan(`${this.spanName()}.count`, async () => {
102
+ const table = this.getTable();
103
+ const userFilter = await this.runBeforeQuery(opts.where);
104
+ const where = this.composeWhere(userFilter, this.searchExpr(opts.search), opts.includeDeleted);
105
+ let q = this.db.select({ value: countAggregate() }).from(table);
106
+ if (where)
107
+ q = q.where(where);
108
+ const rows = await q;
109
+ const v = rows[0]?.value ?? 0;
110
+ return typeof v === "string" ? Number.parseInt(v, 10) : v;
111
+ });
112
+ }
113
+ // ───────────────────────────── Mutate API ─────────────────────────────
114
+ /**
115
+ * Insert a new row.
116
+ * Pipeline: `applyOptionalFields` → `resolveRelationIds` → auto-stamp
117
+ * `createdBy` from `RequestContext.userId` if column exists →
118
+ * `beforeCreate` hook chain → INSERT … RETURNING * → `afterCreate` hooks.
119
+ */
120
+ async create(values) {
121
+ return withSpan(`${this.spanName()}.create`, async () => {
122
+ const ctx = (getRequestContext() ?? {});
123
+ const composed = composeHooks(this.getHooks());
124
+ let prepared = await this.applyOptionalFields(values);
125
+ prepared = await this.resolveRelationIds(prepared);
126
+ prepared = this.stampActor(prepared, "createdBy", ctx);
127
+ const beforeResult = await composed.beforeCreate?.(prepared, ctx);
128
+ if (beforeResult !== undefined)
129
+ prepared = beforeResult;
130
+ const inserted = (await this.db
131
+ .insert(this.getTable())
132
+ .values(prepared)
133
+ .returning());
134
+ const row = inserted[0];
135
+ if (row === undefined) {
136
+ throw new Error(`${this.constructor.name}.create: INSERT returned no rows`);
137
+ }
138
+ await composed.afterCreate?.(row, ctx);
139
+ return row;
140
+ });
141
+ }
142
+ /**
143
+ * Update by primary-key `id` with a partial patch.
144
+ * Pipeline: load `prev` (404s if missing) → auto-stamp `updatedBy` →
145
+ * `beforeUpdate` hook chain (receives `prev` + `patch`) → UPDATE …
146
+ * RETURNING * → `afterUpdate` hooks (receive `prev` + `next` for diffing).
147
+ *
148
+ * `prev` is loaded *before* the write so audit / CDC consumers can compute
149
+ * diffs reliably even on tables without history triggers.
150
+ */
151
+ async update(id, patch) {
152
+ return withSpan(`${this.spanName()}.update`, async () => {
153
+ const ctx = (getRequestContext() ?? {});
154
+ const composed = composeHooks(this.getHooks());
155
+ const prev = await this.get(id);
156
+ if (prev === null) {
157
+ throw new NotFoundError(`${this.constructor.name}: id "${id}" not found`);
158
+ }
159
+ let prepared = this.stampActor(patch, "updatedBy", ctx);
160
+ const beforeResult = await composed.beforeUpdate?.(prev, prepared, ctx);
161
+ if (beforeResult !== undefined)
162
+ prepared = beforeResult;
163
+ const idColumn = this.getColumn("id");
164
+ if (!idColumn) {
165
+ throw new Error(`${this.constructor.name}: getTable() must expose an "id" column`);
166
+ }
167
+ const updated = (await this.db
168
+ .update(this.getTable())
169
+ .set(prepared)
170
+ .where(eq(idColumn, id))
171
+ .returning());
172
+ const next = updated[0];
173
+ if (next === undefined) {
174
+ // Row vanished between the get() and the UPDATE — race condition.
175
+ throw new NotFoundError(`${this.constructor.name}: id "${id}" disappeared during update`);
176
+ }
177
+ await composed.afterUpdate?.(prev, next, ctx);
178
+ return next;
179
+ });
180
+ }
181
+ /**
182
+ * Delete by primary-key `id`.
183
+ * Pipeline: load `prev` (404s if missing) → `beforeDelete` (may throw to
184
+ * abort) → soft-delete (UPDATE deleted_at = now() + updatedBy) when the
185
+ * table has a `deletedAt` column, otherwise hard DELETE → `afterDelete`.
186
+ */
187
+ async delete(id) {
188
+ return withSpan(`${this.spanName()}.delete`, async () => {
189
+ const ctx = (getRequestContext() ?? {});
190
+ const composed = composeHooks(this.getHooks());
191
+ const prev = await this.get(id);
192
+ if (prev === null) {
193
+ throw new NotFoundError(`${this.constructor.name}: id "${id}" not found`);
194
+ }
195
+ await composed.beforeDelete?.(prev, ctx);
196
+ const idColumn = this.getColumn("id");
197
+ if (!idColumn) {
198
+ throw new Error(`${this.constructor.name}: getTable() must expose an "id" column`);
199
+ }
200
+ const deletedAtCol = this.getColumn("deletedAt");
201
+ let row;
202
+ if (deletedAtCol) {
203
+ // Soft delete
204
+ const updates = { deletedAt: new Date() };
205
+ if (ctx.userId !== undefined && this.getColumn("updatedBy")) {
206
+ updates.updatedBy = ctx.userId;
207
+ }
208
+ const result = (await this.db
209
+ .update(this.getTable())
210
+ .set(updates)
211
+ .where(eq(idColumn, id))
212
+ .returning());
213
+ row = result[0];
214
+ }
215
+ else {
216
+ // Hard delete
217
+ const result = (await this.db
218
+ .delete(this.getTable())
219
+ .where(eq(idColumn, id))
220
+ .returning());
221
+ row = result[0];
222
+ }
223
+ if (row === undefined) {
224
+ throw new NotFoundError(`${this.constructor.name}: id "${id}" disappeared during delete`);
225
+ }
226
+ await composed.afterDelete?.(row, ctx);
227
+ return row;
228
+ });
229
+ }
230
+ // ──────────────────────────── Helpers ──────────────────────────────────
231
+ /**
232
+ * Compose user-filter + scoped clause + soft-delete clause into one `AND`
233
+ * expression. `undefined` when nothing applies.
234
+ */
235
+ composeWhere(userFilter, extra, includeDeleted = false) {
236
+ const parts = [];
237
+ const userExpr = buildWhere(this.getTable(), userFilter);
238
+ if (userExpr)
239
+ parts.push(userExpr);
240
+ if (extra)
241
+ parts.push(extra);
242
+ if (!includeDeleted) {
243
+ const deletedAt = this.getColumn("deletedAt");
244
+ if (deletedAt)
245
+ parts.push(isNull(deletedAt));
246
+ }
247
+ if (parts.length === 0)
248
+ return undefined;
249
+ if (parts.length === 1)
250
+ return parts[0];
251
+ return and(...parts);
252
+ }
253
+ /**
254
+ * Build a free-text search expression OR'ing `ilike '%query%'` across
255
+ * the columns returned by `getDefaultSearchFields()`. Returns `undefined`
256
+ * when there are no search fields or no query.
257
+ */
258
+ searchExpr(query) {
259
+ if (!query)
260
+ return undefined;
261
+ const fields = this.getDefaultSearchFields();
262
+ if (fields.length === 0)
263
+ return undefined;
264
+ const like = `%${query}%`;
265
+ const exprs = [];
266
+ for (const name of fields) {
267
+ const col = this.getColumn(name);
268
+ if (col)
269
+ exprs.push(ilike(col, like));
270
+ }
271
+ if (exprs.length === 0)
272
+ return undefined;
273
+ if (exprs.length === 1)
274
+ return exprs[0];
275
+ return or(...exprs);
276
+ }
277
+ /**
278
+ * Translate `OrderClause[]` into Drizzle `orderBy(...)` arguments. Falls
279
+ * back to `getDefaultOrder()` when the caller provides nothing.
280
+ */
281
+ resolveOrder(order) {
282
+ const clauses = order && order.length > 0 ? order : this.getDefaultOrder();
283
+ const result = [];
284
+ for (const clause of clauses) {
285
+ const col = this.getColumn(clause.field);
286
+ if (!col)
287
+ continue;
288
+ const direction = clause.direction === "asc" ? asc(col) : desc(col);
289
+ // OrderClause's `nulls` is informational; Drizzle's asc/desc helpers
290
+ // don't expose nulls-first/last today. Subclasses override
291
+ // `getDefaultOrder()` and use raw `sql` if they need it.
292
+ result.push(direction);
293
+ }
294
+ return result;
295
+ }
296
+ /** Walk the configured hooks' `beforeQuery` (if any) over the user filter. */
297
+ async runBeforeQuery(filter) {
298
+ const hooks = this.getHooks();
299
+ if (!hooks.beforeQuery)
300
+ return filter;
301
+ const ctx = (getRequestContext() ?? {});
302
+ const composed = composeHooks(hooks);
303
+ const result = await composed.beforeQuery((filter ?? {}), ctx);
304
+ return (result ?? filter);
305
+ }
306
+ /**
307
+ * Look up a column by property name on the configured table. Returns
308
+ * `undefined` for unknown names (callers should treat this as "skip").
309
+ */
310
+ getColumn(name) {
311
+ const table = this.getTable();
312
+ const candidate = table[name];
313
+ if (!candidate)
314
+ return undefined;
315
+ if (typeof candidate.name !== "string")
316
+ return undefined;
317
+ return candidate;
318
+ }
319
+ /** Span-name prefix per service (override if you want a custom one). */
320
+ spanName() {
321
+ return this.constructor.name;
322
+ }
323
+ /**
324
+ * Auto-stamp `createdBy` / `updatedBy` from `RequestContext.userId` if the
325
+ * column exists on the table and the value isn't already set on the input.
326
+ * Returns a new object — does not mutate `values`.
327
+ */
328
+ stampActor(values, column, ctx) {
329
+ if (ctx.userId === undefined)
330
+ return values;
331
+ if (!this.getColumn(column))
332
+ return values;
333
+ if (typeof values !== "object" || values === null || Array.isArray(values)) {
334
+ return values;
335
+ }
336
+ const obj = values;
337
+ if (obj[column] !== undefined && obj[column] !== null)
338
+ return values;
339
+ return { ...obj, [column]: ctx.userId };
340
+ }
341
+ }
342
+ //# sourceMappingURL=DrizzleEntityService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrizzleEntityService.js","sourceRoot":"","sources":["../../../src/app/services/DrizzleEntityService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { Redis, type RedisOptions } from "ioredis";
2
+ import { logger as defaultLogger } from "../../observability/logger.js";
3
+ /**
4
+ * Connection-lifecycle wrapper around an ioredis client.
5
+ *
6
+ * One instance per service process; passed into `RedisCache`, `rateLimit`,
7
+ * `idempotency`, and BullMQ producers/workers. The connection is **lazy** —
8
+ * nothing happens until the first command, so unit tests that import code
9
+ * referencing the provider don't accidentally try to dial Redis.
10
+ *
11
+ * Configured per BullMQ's hard requirement (`maxRetriesPerRequest: null`)
12
+ * so the same client can drive both Cache and BullMQ. `enableReadyCheck`
13
+ * kept on so failures surface promptly via `/readyz` rather than as
14
+ * mysterious slow timeouts.
15
+ *
16
+ * Errors are logged via the framework pino logger but never crash the
17
+ * process — degraded operation is the framework default. `/readyz` (in
18
+ * a later batch) reports the unhealthy state so the load balancer pulls
19
+ * the pod out of rotation.
20
+ */
21
+ export interface RedisProviderOptions {
22
+ /** Full URL form, e.g. `redis://default:secret@host:6379/0`. */
23
+ url?: string;
24
+ /** Or piecewise. Used when `url` is not provided. */
25
+ host?: string;
26
+ port?: number;
27
+ password?: string;
28
+ username?: string;
29
+ db?: number;
30
+ tls?: boolean;
31
+ /** Override the framework default pino logger. */
32
+ logger?: typeof defaultLogger;
33
+ /**
34
+ * Override any underlying ioredis option. Use sparingly — the framework
35
+ * already sets the BullMQ-required values; overriding them risks subtle
36
+ * breakage.
37
+ */
38
+ ioredis?: Partial<RedisOptions>;
39
+ }
40
+ export declare class RedisProvider {
41
+ readonly client: Redis;
42
+ private readonly logger;
43
+ private quitting;
44
+ constructor(opts?: RedisProviderOptions);
45
+ /** Connect (no-op if already connected). Surfaced for `/readyz` use. */
46
+ connect(): Promise<void>;
47
+ /** Graceful shutdown. Idempotent. */
48
+ quit(): Promise<void>;
49
+ /** Health-check probe — used by `/readyz` (next batch). */
50
+ ping(): Promise<boolean>;
51
+ }
52
+ //# sourceMappingURL=RedisProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisProvider.d.ts","sourceRoot":"","sources":["../../../src/app/services/RedisProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAExE;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,aAAa,CAAC;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CACjC;AAKD,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,GAAE,oBAAyB;IAuC3C,wEAAwE;IAClE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,qCAAqC;IAC/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,2DAA2D;IACrD,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;CAQ/B"}
@@ -0,0 +1,75 @@
1
+ import { Redis } from "ioredis";
2
+ import { logger as defaultLogger } from "../../observability/logger.js";
3
+ const DEFAULT_HOST = "127.0.0.1";
4
+ const DEFAULT_PORT = 6379;
5
+ export class RedisProvider {
6
+ client;
7
+ logger;
8
+ quitting = false;
9
+ constructor(opts = {}) {
10
+ this.logger = opts.logger ?? defaultLogger;
11
+ const baseOptions = {
12
+ lazyConnect: true,
13
+ enableReadyCheck: true,
14
+ // BullMQ hard requirement: workers use blocking commands, so a
15
+ // bounded retry count would orphan jobs. Keep null. (BullMQ v5
16
+ // throws a clear error if this is anything else.)
17
+ maxRetriesPerRequest: null,
18
+ ...opts.ioredis,
19
+ };
20
+ if (opts.url) {
21
+ this.client = new Redis(opts.url, baseOptions);
22
+ }
23
+ else {
24
+ this.client = new Redis({
25
+ host: opts.host ?? DEFAULT_HOST,
26
+ port: opts.port ?? DEFAULT_PORT,
27
+ password: opts.password,
28
+ username: opts.username,
29
+ db: opts.db,
30
+ tls: opts.tls ? {} : undefined,
31
+ ...baseOptions,
32
+ });
33
+ }
34
+ this.client.on("error", (err) => {
35
+ // Silence the noisy "client lost connection during shutdown" path;
36
+ // log everything else.
37
+ if (this.quitting)
38
+ return;
39
+ this.logger.warn({ err }, "redis.error");
40
+ });
41
+ this.client.on("ready", () => {
42
+ this.logger.info("redis.ready");
43
+ });
44
+ }
45
+ /** Connect (no-op if already connected). Surfaced for `/readyz` use. */
46
+ async connect() {
47
+ if (this.client.status === "ready" || this.client.status === "connecting")
48
+ return;
49
+ await this.client.connect();
50
+ }
51
+ /** Graceful shutdown. Idempotent. */
52
+ async quit() {
53
+ if (this.quitting)
54
+ return;
55
+ this.quitting = true;
56
+ try {
57
+ await this.client.quit();
58
+ }
59
+ catch (err) {
60
+ // ioredis throws if the client is already disconnected; swallow.
61
+ this.logger.debug({ err }, "redis.quit.swallowed");
62
+ }
63
+ }
64
+ /** Health-check probe — used by `/readyz` (next batch). */
65
+ async ping() {
66
+ try {
67
+ const reply = await this.client.ping();
68
+ return reply === "PONG";
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=RedisProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisProvider.js","sourceRoot":"","sources":["../../../src/app/services/RedisProvider.ts"],"names":[],"mappings":"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"}