@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,37 @@
1
+ import chalk from "chalk";
2
+ import { execSync } from "child_process";
3
+ import fs from "fs/promises";
4
+ import path from "path";
5
+
6
+ export async function updateProject(_options) {
7
+ console.log(chalk.blue("🔄 Updating ShipAPI project..."));
8
+
9
+ // Check if we're in a ShipAPI project
10
+ const packageJsonPath = path.join(process.cwd(), "package.json");
11
+ let packageJson;
12
+
13
+ try {
14
+ const packageJsonContent = await fs.readFile(packageJsonPath, "utf-8");
15
+ packageJson = JSON.parse(packageJsonContent);
16
+ } catch (_error) {
17
+ throw new Error("Not in a valid Node.js project directory");
18
+ }
19
+
20
+ if (!packageJson.dependencies || !packageJson.dependencies["@sixthsummit/ship-api"]) {
21
+ throw new Error("This is not a ShipAPI project (@sixthsummit/ship-api dependency not found)");
22
+ }
23
+
24
+ // Update ship-api package
25
+ console.log(chalk.yellow("📦 Updating @sixthsummit/ship-api package..."));
26
+ try {
27
+ execSync("npm update @sixthsummit/ship-api", { stdio: "inherit" });
28
+ } catch (_error) {
29
+ console.log(chalk.red("Failed to update @sixthsummit/ship-api package"));
30
+ throw _error;
31
+ }
32
+
33
+ console.log(chalk.green("✅ Project updated successfully!"));
34
+ console.log(chalk.cyan("\nNext steps:"));
35
+ console.log(chalk.cyan(" npm run build"));
36
+ console.log(chalk.cyan(" npm run test"));
37
+ }
@@ -0,0 +1,285 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { registerApplicationCommands } from "@sixthsummit/ship-cli";
4
+ import { Command } from "commander";
5
+ import { readFileSync } from "fs";
6
+ import { dirname, join } from "path";
7
+ import { fileURLToPath } from "url";
8
+ import { addLibrary, addModule, listLibraries, listModules } from "./commands/add.js";
9
+ import { createProject } from "./commands/create.js";
10
+ import { devCommand } from "./commands/dev.js";
11
+ import { doctorCommand } from "./commands/doctor.js";
12
+ import { generateCommand } from "./commands/generate.js";
13
+ import { updateProject } from "./commands/update.js";
14
+
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ const packageJson = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf8"));
18
+ const version = packageJson.version;
19
+
20
+ const program = new Command();
21
+
22
+ program
23
+ .name("ship-api")
24
+ .description(
25
+ "ShipAPI Framework CLI - Build TypeScript backends on Hono + Drizzle + BullMQ + OpenTelemetry",
26
+ )
27
+ .version(version);
28
+
29
+ registerApplicationCommands(program, { includeCreate: false });
30
+
31
+ program
32
+ .command("create <project-name>")
33
+ .description("Create a new ShipAPI project")
34
+ .option("-t, --template <template>", "Project template to use", "default")
35
+ .option("-d, --database <database>", "Database type (postgres, mysql, sqlite)", "postgres")
36
+ .option("--current-dir", "Install in current directory instead of creating new directory")
37
+ .option("--skip-install", "Skip npm install after project creation")
38
+ .option("--skip-git", "Skip git initialization")
39
+ .action(async (projectName, _options) => {
40
+ try {
41
+ await createProject(projectName, _options);
42
+ } catch (error) {
43
+ console.error("Error creating project:", error.message);
44
+ process.exit(1);
45
+ }
46
+ });
47
+
48
+ program
49
+ .command("add <name>")
50
+ .description("Add a module or library to your ShipAPI project")
51
+ .option("-f, --force", "Overwrite existing module/library")
52
+ .option("-l, --lib", "Add as library instead of module")
53
+ .action(async (name, options) => {
54
+ try {
55
+ if (options.lib) {
56
+ await addLibrary(name, options);
57
+ } else {
58
+ await addModule(name, options);
59
+ }
60
+ } catch (error) {
61
+ console.error("Error:", error.message);
62
+ process.exit(1);
63
+ }
64
+ });
65
+
66
+ program
67
+ .command("modules")
68
+ .description("List available modules")
69
+ .action(async () => {
70
+ try {
71
+ await listModules();
72
+ } catch (error) {
73
+ console.error("Error listing modules:", error.message);
74
+ process.exit(1);
75
+ }
76
+ });
77
+
78
+ program
79
+ .command("libraries")
80
+ .description("List available libraries")
81
+ .action(async () => {
82
+ try {
83
+ await listLibraries();
84
+ } catch (error) {
85
+ console.error("Error listing libraries:", error.message);
86
+ process.exit(1);
87
+ }
88
+ });
89
+
90
+ program
91
+ .command("update")
92
+ .description("Update an existing ShipAPI project to the latest framework version")
93
+ .option("-f, --force", "Force update even if there are conflicts")
94
+ .action(async (_options) => {
95
+ try {
96
+ await updateProject(_options);
97
+ } catch (error) {
98
+ console.error("Error updating project:", error.message);
99
+ process.exit(1);
100
+ }
101
+ });
102
+
103
+ // `ship-api g <type> [name]` (alias `generate`) — framework component
104
+ // generators per plan §C. Subcommands land incrementally: `doctor`
105
+ // first (no template dependencies), then module / resource / service /
106
+ // schema / middleware / job / test in subsequent commits.
107
+ const generate = program
108
+ .command("generate")
109
+ .alias("g")
110
+ .description("Generate framework components and run health checks");
111
+
112
+ generate
113
+ .command("doctor")
114
+ .description("Run a project health check (env vars, migrations, audit findings)")
115
+ .action(async () => {
116
+ try {
117
+ await doctorCommand();
118
+ } catch (error) {
119
+ console.error("ship-api g doctor failed:", error.message);
120
+ process.exit(1);
121
+ }
122
+ });
123
+
124
+ generate
125
+ .command("module <name>")
126
+ .description(
127
+ "Scaffold a new v4 module (schema + service + routes + validation + permissions + index barrel)",
128
+ )
129
+ .option("-f, --force", "Overwrite an existing non-empty target directory", false)
130
+ .action(async (name, options) => {
131
+ try {
132
+ await generateCommand("module", name, { force: options.force });
133
+ } catch (error) {
134
+ console.error("ship-api g module failed:", error.message);
135
+ process.exit(1);
136
+ }
137
+ });
138
+
139
+ generate
140
+ .command("resource <name>")
141
+ .description(
142
+ "Scaffold a CRUD module customized to a field spec (`--fields title:string,body:text,published:boolean?`)",
143
+ )
144
+ .requiredOption(
145
+ "--fields <spec>",
146
+ 'Comma-separated field list ("name:type[?]"). Types: string, text, integer, bigint, boolean, timestamp, uuid, json',
147
+ )
148
+ .option("-f, --force", "Overwrite an existing non-empty target directory", false)
149
+ .action(async (name, options) => {
150
+ try {
151
+ await generateCommand("resource", name, {
152
+ fields: options.fields,
153
+ force: options.force,
154
+ });
155
+ } catch (error) {
156
+ console.error("ship-api g resource failed:", error.message);
157
+ process.exit(1);
158
+ }
159
+ });
160
+
161
+ generate
162
+ .command("middleware <name>")
163
+ .description("Scaffold a Hono middleware skeleton at src/middleware/<name>.ts")
164
+ .option("-f, --force", "Overwrite an existing file", false)
165
+ .action(async (name, options) => {
166
+ try {
167
+ await generateCommand("middleware", name, { force: options.force });
168
+ } catch (error) {
169
+ console.error("ship-api g middleware failed:", error.message);
170
+ process.exit(1);
171
+ }
172
+ });
173
+
174
+ generate
175
+ .command("service <name>")
176
+ .description(
177
+ "Scaffold a DrizzleEntityService extension in an existing module's services/ directory",
178
+ )
179
+ .requiredOption("-m, --module <module>", "Target module name (e.g. accounts)")
180
+ .option("-f, --force", "Overwrite an existing file", false)
181
+ .action(async (name, options) => {
182
+ try {
183
+ await generateCommand("service", name, {
184
+ module: options.module,
185
+ force: options.force,
186
+ });
187
+ } catch (error) {
188
+ console.error("ship-api g service failed:", error.message);
189
+ process.exit(1);
190
+ }
191
+ });
192
+
193
+ generate
194
+ .command("schema <name>")
195
+ .description("Scaffold an additional Drizzle pgTable file in a module's schemas/ directory")
196
+ .requiredOption("-m, --module <module>", "Target module name")
197
+ .option("-f, --force", "Overwrite an existing file", false)
198
+ .action(async (name, options) => {
199
+ try {
200
+ await generateCommand("schema", name, {
201
+ module: options.module,
202
+ force: options.force,
203
+ });
204
+ } catch (error) {
205
+ console.error("ship-api g schema failed:", error.message);
206
+ process.exit(1);
207
+ }
208
+ });
209
+
210
+ generate
211
+ .command("job <name>")
212
+ .description("Scaffold a BullMQ job stub in a module's jobs/ directory")
213
+ .requiredOption("-m, --module <module>", "Target module name")
214
+ .option("-f, --force", "Overwrite an existing file", false)
215
+ .action(async (name, options) => {
216
+ try {
217
+ await generateCommand("job", name, {
218
+ module: options.module,
219
+ force: options.force,
220
+ });
221
+ } catch (error) {
222
+ console.error("ship-api g job failed:", error.message);
223
+ process.exit(1);
224
+ }
225
+ });
226
+
227
+ // `ship-api migrate-orm <path> [--write]` — codemod CLI for v3 → v4
228
+ // ORM migration. Default mode is analyze: lists detected TypeORM
229
+ // decorators and classifies each as auto / partial / manual /
230
+ // unknown. With `--write`, emits a Drizzle pgTable schema next to
231
+ // each entity (e.g., `Account.ts` → `Account.drizzle.ts`) with
232
+ // `// TODO[ship-api migrate-orm]:` markers for items requiring
233
+ // manual review.
234
+ //
235
+ // Loaded lazily: migrate-orm.js imports the `typescript` compiler
236
+ // API, which is an optional peer (the project being migrated has it
237
+ // as a devDependency; a fresh `npx ... create` environment does not).
238
+ // A static import here would crash every CLI command when typescript
239
+ // isn't resolvable.
240
+ program
241
+ .command("migrate-orm")
242
+ .description("Analyze TypeORM entities and (with --write) emit Drizzle schemas alongside them")
243
+ .argument("[path]", "Path to a .ts file or directory tree to analyze / transform", ".")
244
+ .option("--write", "Emit Drizzle pgTable schemas next to each entity (.ts → .drizzle.ts)", false)
245
+ .action(async (target, options) => {
246
+ try {
247
+ let migrateOrmCommand;
248
+ try {
249
+ ({ migrateOrmCommand } = await import("./commands/migrate-orm.js"));
250
+ } catch (error) {
251
+ if (error.code === "ERR_MODULE_NOT_FOUND" && /['"]typescript['"]/.test(error.message)) {
252
+ console.error(
253
+ "ship-api migrate-orm needs the `typescript` package to parse your TypeORM entities.\n" +
254
+ "Run it from the project being migrated (which has typescript as a devDependency),\n" +
255
+ "or install it first: npm install -D typescript",
256
+ );
257
+ process.exit(1);
258
+ }
259
+ throw error;
260
+ }
261
+ await migrateOrmCommand({ path: target, write: options.write });
262
+ } catch (error) {
263
+ console.error("ship-api migrate-orm failed:", error.message);
264
+ process.exit(1);
265
+ }
266
+ });
267
+
268
+ program
269
+ .command("dev")
270
+ .description(
271
+ "Run the local stack: docker compose up dependencies, tsx watch the app, wait for /livez",
272
+ )
273
+ .option("--bare", "Skip Docker Compose (use already-running services)")
274
+ .option("--reset", "docker compose down -v before starting (drops volumes)")
275
+ .option("-p, --port <port>", "Port to poll for /livez (default: $PORT or 3000)")
276
+ .action(async (options) => {
277
+ try {
278
+ await devCommand(options);
279
+ } catch (error) {
280
+ console.error("ship-api dev failed:", error.message);
281
+ process.exit(1);
282
+ }
283
+ });
284
+
285
+ program.parse();
@@ -0,0 +1,91 @@
1
+ /**
2
+ * `AuthProvider` — pluggable authentication contract.
3
+ *
4
+ * Foundation interface that lets v4.x ship Better-Auth, Clerk, WorkOS, Auth.js,
5
+ * Auth0, WebAuthn/passkeys, and edge-runtime JWKS adapters without breaking the
6
+ * public API. Firebase is the v4.0 default adapter (see `./adapters/firebase`).
7
+ *
8
+ * The shape is intentionally narrow: providers verify a credential and resolve
9
+ * an Account. They do *not* know about HTTP — `requireAuth(...)` middleware is
10
+ * the bridge between Hono `Context` and this interface.
11
+ */
12
+ /**
13
+ * Claims extracted from a verified credential. Provider-specific fields go in
14
+ * `metadata` so the `Account` resolver can use them without leaking provider
15
+ * types into the framework.
16
+ */
17
+ export interface AuthClaims {
18
+ /** Stable subject identifier from the IdP (e.g., Firebase UID, OIDC `sub`). */
19
+ subject: string;
20
+ /** Optional email if the IdP provides it. */
21
+ email?: string;
22
+ /** Optional verified-email flag if the IdP exposes it. */
23
+ emailVerified?: boolean;
24
+ /** Optional display name. */
25
+ name?: string;
26
+ /** Optional issued-at / expires-at if the IdP exposes them (epoch seconds). */
27
+ issuedAt?: number;
28
+ expiresAt?: number;
29
+ /** Provider-specific extra fields. The Account resolver may consume these. */
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ export type AuthVerifyResult = {
33
+ ok: true;
34
+ claims: AuthClaims;
35
+ } | {
36
+ ok: false;
37
+ reason: AuthFailureReason;
38
+ message?: string;
39
+ };
40
+ export type AuthFailureReason = "missing-token" | "invalid-token" | "expired-token" | "revoked-token" | "issuer-mismatch" | "provider-error";
41
+ /**
42
+ * Minimal Account interface that the framework requires from any provider's
43
+ * resolved account. Concrete `Account` entities (in `modules/accounts/`)
44
+ * implement this and add their own fields.
45
+ *
46
+ * Kept structural-only here so `AuthProvider` can be defined without depending
47
+ * on the `accounts` module.
48
+ */
49
+ export interface AuthenticatedAccount {
50
+ id: string;
51
+ hasPermission?(slug: string): boolean | Promise<boolean>;
52
+ }
53
+ /**
54
+ * The bridge between a verified credential and a domain Account. Implementations
55
+ * typically look up the Account by `claims.subject`; the optional `onUnknown`
56
+ * field controls whether unknown subjects auto-create an Account.
57
+ */
58
+ export interface AccountResolver<TAccount extends AuthenticatedAccount = AuthenticatedAccount> {
59
+ resolve(claims: AuthClaims): Promise<TAccount | null>;
60
+ }
61
+ export interface AuthProviderContext {
62
+ /** Raw credential from the request (e.g., `Authorization: Bearer <token>`). */
63
+ rawCredential?: string;
64
+ /** Request headers — providers may read additional fields (e.g., `X-Provider`). */
65
+ headers: Readonly<Record<string, string | undefined>>;
66
+ }
67
+ export interface AuthProvider<TAccount extends AuthenticatedAccount = AuthenticatedAccount> {
68
+ /** Stable name for logging / multi-provider routing. e.g. "firebase", "clerk". */
69
+ readonly name: string;
70
+ /** Verify a credential and return claims. Pure: must not perform DB lookups. */
71
+ verify(ctx: AuthProviderContext): Promise<AuthVerifyResult>;
72
+ /**
73
+ * Resolve a verified credential to a domain Account. Separate from `verify`
74
+ * so providers can be combined (verify with one, resolve via shared user store).
75
+ */
76
+ resolve(claims: AuthClaims): Promise<TAccount | null>;
77
+ /**
78
+ * Behavior when no credential is present on the request.
79
+ * - "reject" (default): respond 401 immediately
80
+ * - "next": continue without an authenticated user (opt-in via `requireAuth({ optional: true })`)
81
+ */
82
+ onMissingToken?: "reject" | "next";
83
+ /**
84
+ * Behavior when a credential verifies but no Account is found.
85
+ * - "reject" (default): respond 403
86
+ * - "create": delegate to a hook (provider-specific) to create the Account on first sight
87
+ * - "next": continue with `claims` only and no Account
88
+ */
89
+ onUnknownAccount?: "reject" | "create" | "next";
90
+ }
91
+ //# sourceMappingURL=AuthProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../../src/app/auth/AuthProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,gBAAgB,CAAC;AAErB;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,QAAQ,SAAS,oBAAoB,GAAG,oBAAoB;IAC3F,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,YAAY,CAAC,QAAQ,SAAS,oBAAoB,GAAG,oBAAoB;IACxF,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,gFAAgF;IAChF,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE5D;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEtD;;;;OAIG;IACH,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEnC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;CACjD"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `AuthProvider` — pluggable authentication contract.
3
+ *
4
+ * Foundation interface that lets v4.x ship Better-Auth, Clerk, WorkOS, Auth.js,
5
+ * Auth0, WebAuthn/passkeys, and edge-runtime JWKS adapters without breaking the
6
+ * public API. Firebase is the v4.0 default adapter (see `./adapters/firebase`).
7
+ *
8
+ * The shape is intentionally narrow: providers verify a credential and resolve
9
+ * an Account. They do *not* know about HTTP — `requireAuth(...)` middleware is
10
+ * the bridge between Hono `Context` and this interface.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=AuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../../../src/app/auth/AuthProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,79 @@
1
+ import admin from "firebase-admin";
2
+ import type { AuthClaims, AuthenticatedAccount, AuthProvider, AuthProviderContext, AuthVerifyResult } from "../AuthProvider.js";
3
+ /**
4
+ * Firebase `AuthProvider` adapter — the v4.0 default.
5
+ *
6
+ * Wraps `firebase-admin`'s `verifyIdToken` and a consumer-supplied account-lookup
7
+ * callback. Lives at the framework level so it has no opinion about persistence
8
+ * (TypeORM v3, Drizzle v4) — the consumer wires the lookup. This keeps the
9
+ * adapter testable in isolation and lets the same code work across the v3 → v4
10
+ * transition.
11
+ *
12
+ * Ports today's `JwtAuthMiddleware` token-verification behavior into the v4
13
+ * `AuthProvider` interface without changing semantics:
14
+ * - Reads `Authorization: Bearer <id-token>` (and `X-Forwarded-Authorization`).
15
+ * - Calls `admin.auth().verifyIdToken(token)` with `checkRevoked` opt-in.
16
+ * - Maps verification errors to `AuthFailureReason` codes so the framework
17
+ * can surface them consistently in `requireAuth`'s 401 responses.
18
+ * - Looks up the domain `Account` via the supplied `findAccount` callback.
19
+ */
20
+ export interface FirebaseAuthClaimsExtras {
21
+ /** Firebase project ID the token was issued for. */
22
+ audience?: string;
23
+ /** Token issuer (`https://securetoken.google.com/<project-id>`). */
24
+ issuer?: string;
25
+ /** Identity provider used to sign the user in (e.g., `password`, `google.com`). */
26
+ signInProvider?: string;
27
+ /** Whether Firebase considers the email verified at token issue time. */
28
+ firebaseEmailVerified?: boolean;
29
+ }
30
+ export interface FirebaseAuthProviderOptions<TAccount extends AuthenticatedAccount = AuthenticatedAccount> {
31
+ /**
32
+ * Look up the domain Account from a verified Firebase UID. Returns `null` if
33
+ * no Account is registered. Consumers supply this — the framework does not
34
+ * assume an ORM. Hooked into TypeORM in v3 transition; Drizzle in v4.
35
+ */
36
+ findAccount: (firebaseUid: string, claims: AuthClaims) => Promise<TAccount | null>;
37
+ /**
38
+ * If `true`, calls `verifyIdToken(token, true)` to also reject revoked tokens.
39
+ * Costs one extra Firestore RTT per request on cold paths. Default `false`.
40
+ */
41
+ checkRevoked?: boolean;
42
+ /**
43
+ * Behavior when no credential is on the request. Default `"reject"` — the v3
44
+ * silent fall-through becomes opt-in via `requireAuth({ optional: true })`.
45
+ */
46
+ onMissingToken?: "reject" | "next";
47
+ /**
48
+ * Behavior when a token verifies but no Account is registered for that UID.
49
+ * Default `"reject"` (403). Use `"next"` for endpoints that should serve
50
+ * unauthenticated traffic with degraded data.
51
+ */
52
+ onUnknownAccount?: "reject" | "create" | "next";
53
+ /**
54
+ * Optional override for token extraction. Default reads
55
+ * `X-Forwarded-Authorization` then `Authorization`, both `Bearer <token>`.
56
+ */
57
+ extractToken?: (ctx: AuthProviderContext) => string | undefined;
58
+ /**
59
+ * Optional Firebase Admin app override (for multi-project scenarios or tests).
60
+ * Falls back to the default `admin` app when not provided.
61
+ */
62
+ firebaseApp?: admin.app.App;
63
+ }
64
+ export declare class FirebaseAuthProvider<TAccount extends AuthenticatedAccount = AuthenticatedAccount> implements AuthProvider<TAccount> {
65
+ readonly name = "firebase";
66
+ readonly onMissingToken: "reject" | "next";
67
+ readonly onUnknownAccount: "reject" | "create" | "next";
68
+ private readonly opts;
69
+ private readonly extractToken;
70
+ constructor(opts: FirebaseAuthProviderOptions<TAccount>);
71
+ verify(ctx: AuthProviderContext): Promise<AuthVerifyResult>;
72
+ resolve(claims: AuthClaims): Promise<TAccount | null>;
73
+ }
74
+ /**
75
+ * Convenience factory matching the documented `firebaseAuth({ ... })` API in
76
+ * the plan's §F.
77
+ */
78
+ export declare function firebaseAuth<TAccount extends AuthenticatedAccount = AuthenticatedAccount>(opts: FirebaseAuthProviderOptions<TAccount>): FirebaseAuthProvider<TAccount>;
79
+ //# sourceMappingURL=firebase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase.d.ts","sourceRoot":"","sources":["../../../../src/app/auth/adapters/firebase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AACnC,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EAEpB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,2BAA2B,CAC1C,QAAQ,SAAS,oBAAoB,GAAG,oBAAoB;IAE5D;;;;OAIG;IACH,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEnF;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEnC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAEhD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,MAAM,GAAG,SAAS,CAAC;IAEhE;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;CAC7B;AA6FD,qBAAa,oBAAoB,CAAC,QAAQ,SAAS,oBAAoB,GAAG,oBAAoB,CAC5F,YAAW,YAAY,CAAC,QAAQ,CAAC;IAEjC,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwC;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmD;gBAEpE,IAAI,EAAE,2BAA2B,CAAC,QAAQ,CAAC;IAOjD,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiB3D,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;CAG5D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,SAAS,oBAAoB,GAAG,oBAAoB,EACvF,IAAI,EAAE,2BAA2B,CAAC,QAAQ,CAAC,GAC1C,oBAAoB,CAAC,QAAQ,CAAC,CAEhC"}
@@ -0,0 +1,122 @@
1
+ import admin from "firebase-admin";
2
+ const BEARER_PREFIX = /^Bearer\s+/i;
3
+ function defaultExtractToken(ctx) {
4
+ const direct = ctx.rawCredential?.replace(BEARER_PREFIX, "").trim();
5
+ if (direct)
6
+ return direct;
7
+ // `X-Forwarded-Authorization` — used when behind a Cloud Run / Cloudflare /
8
+ // GCP IAP proxy that has consumed the original `Authorization` header.
9
+ const forwarded = ctx.headers["x-forwarded-authorization"]?.replace(BEARER_PREFIX, "").trim();
10
+ if (forwarded)
11
+ return forwarded;
12
+ const auth = ctx.headers["authorization"]?.replace(BEARER_PREFIX, "").trim();
13
+ if (auth)
14
+ return auth;
15
+ return undefined;
16
+ }
17
+ function classifyFirebaseError(err) {
18
+ const e = err;
19
+ const code = e?.code ?? "";
20
+ const message = e?.message ?? "Token verification failed";
21
+ if (code.includes("id-token-expired"))
22
+ return { reason: "expired-token", message };
23
+ if (code.includes("id-token-revoked"))
24
+ return { reason: "revoked-token", message };
25
+ if (code.includes("argument-error"))
26
+ return { reason: "invalid-token", message };
27
+ if (code.includes("invalid-id-token"))
28
+ return { reason: "invalid-token", message };
29
+ if (code.includes("audience-mismatch") || code.includes("issuer-mismatch")) {
30
+ return { reason: "issuer-mismatch", message };
31
+ }
32
+ return { reason: "provider-error", message };
33
+ }
34
+ function decodedTokenToClaims(decoded) {
35
+ const claims = {
36
+ subject: decoded.uid,
37
+ email: decoded.email,
38
+ emailVerified: decoded.email_verified,
39
+ name: decoded.name,
40
+ issuedAt: decoded.iat,
41
+ expiresAt: decoded.exp,
42
+ };
43
+ const extras = {
44
+ audience: decoded.aud,
45
+ issuer: decoded.iss,
46
+ signInProvider: decoded.firebase?.sign_in_provider,
47
+ firebaseEmailVerified: decoded.email_verified,
48
+ };
49
+ // Pass the full decoded token through `metadata` for advanced consumers
50
+ // (custom claims, sign-in provider, tenant). Stable enough that v4.x
51
+ // adapters can consume it without provider-specific imports.
52
+ claims.metadata = {
53
+ firebase: extras,
54
+ customClaims: extractCustomClaims(decoded),
55
+ };
56
+ return claims;
57
+ }
58
+ function extractCustomClaims(decoded) {
59
+ // Firebase puts custom claims at the top level of the decoded token alongside
60
+ // standard JWT fields. Strip the standard fields out so consumers see only
61
+ // the actual custom claims.
62
+ const standard = new Set([
63
+ "uid",
64
+ "email",
65
+ "email_verified",
66
+ "name",
67
+ "picture",
68
+ "iss",
69
+ "aud",
70
+ "auth_time",
71
+ "user_id",
72
+ "sub",
73
+ "iat",
74
+ "exp",
75
+ "firebase",
76
+ ]);
77
+ const custom = {};
78
+ for (const [key, value] of Object.entries(decoded)) {
79
+ if (!standard.has(key))
80
+ custom[key] = value;
81
+ }
82
+ return custom;
83
+ }
84
+ export class FirebaseAuthProvider {
85
+ name = "firebase";
86
+ onMissingToken;
87
+ onUnknownAccount;
88
+ opts;
89
+ extractToken;
90
+ constructor(opts) {
91
+ this.opts = opts;
92
+ this.onMissingToken = opts.onMissingToken ?? "reject";
93
+ this.onUnknownAccount = opts.onUnknownAccount ?? "reject";
94
+ this.extractToken = opts.extractToken ?? defaultExtractToken;
95
+ }
96
+ async verify(ctx) {
97
+ const token = this.extractToken(ctx);
98
+ if (!token) {
99
+ return { ok: false, reason: "missing-token", message: "No bearer token on request" };
100
+ }
101
+ const auth = this.opts.firebaseApp ? this.opts.firebaseApp.auth() : admin.auth();
102
+ try {
103
+ const decoded = await auth.verifyIdToken(token, this.opts.checkRevoked === true);
104
+ return { ok: true, claims: decodedTokenToClaims(decoded) };
105
+ }
106
+ catch (err) {
107
+ const { reason, message } = classifyFirebaseError(err);
108
+ return { ok: false, reason, message };
109
+ }
110
+ }
111
+ async resolve(claims) {
112
+ return this.opts.findAccount(claims.subject, claims);
113
+ }
114
+ }
115
+ /**
116
+ * Convenience factory matching the documented `firebaseAuth({ ... })` API in
117
+ * the plan's §F.
118
+ */
119
+ export function firebaseAuth(opts) {
120
+ return new FirebaseAuthProvider(opts);
121
+ }
122
+ //# sourceMappingURL=firebase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase.js","sourceRoot":"","sources":["../../../../src/app/auth/adapters/firebase.ts"],"names":[],"mappings":"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"}