@buenojs/bueno 0.8.5 → 0.8.7

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 (421) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/README.md +259 -15
  3. package/dist/cache/index.d.ts +187 -0
  4. package/dist/cache/index.d.ts.map +1 -0
  5. package/dist/cli/bin.d.ts +8 -0
  6. package/dist/cli/bin.d.ts.map +1 -0
  7. package/dist/cli/bin.js +484 -156
  8. package/dist/cli/commands/add-frontend.d.ts +7 -0
  9. package/dist/cli/commands/add-frontend.d.ts.map +1 -0
  10. package/dist/cli/commands/build.d.ts +7 -0
  11. package/dist/cli/commands/build.d.ts.map +1 -0
  12. package/dist/cli/commands/dev.d.ts +7 -0
  13. package/dist/cli/commands/dev.d.ts.map +1 -0
  14. package/dist/cli/commands/generate.d.ts +7 -0
  15. package/dist/cli/commands/generate.d.ts.map +1 -0
  16. package/dist/cli/commands/help.d.ts +7 -0
  17. package/dist/cli/commands/help.d.ts.map +1 -0
  18. package/dist/cli/commands/index.d.ts +59 -0
  19. package/dist/cli/commands/index.d.ts.map +1 -0
  20. package/dist/cli/commands/migration.d.ts +7 -0
  21. package/dist/cli/commands/migration.d.ts.map +1 -0
  22. package/dist/cli/commands/new.d.ts +7 -0
  23. package/dist/cli/commands/new.d.ts.map +1 -0
  24. package/dist/cli/commands/start.d.ts +7 -0
  25. package/dist/cli/commands/start.d.ts.map +1 -0
  26. package/dist/cli/core/args.d.ts +61 -0
  27. package/dist/cli/core/args.d.ts.map +1 -0
  28. package/dist/cli/core/console.d.ts +135 -0
  29. package/dist/cli/core/console.d.ts.map +1 -0
  30. package/dist/cli/core/index.d.ts +10 -0
  31. package/dist/cli/core/index.d.ts.map +1 -0
  32. package/dist/cli/core/prompt.d.ts +63 -0
  33. package/dist/cli/core/prompt.d.ts.map +1 -0
  34. package/dist/cli/core/spinner.d.ts +111 -0
  35. package/dist/cli/core/spinner.d.ts.map +1 -0
  36. package/dist/cli/index.d.ts +47 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/templates/database/index.d.ts +24 -0
  39. package/dist/cli/templates/database/index.d.ts.map +1 -0
  40. package/dist/cli/templates/database/mysql.d.ts +6 -0
  41. package/dist/cli/templates/database/mysql.d.ts.map +1 -0
  42. package/dist/cli/templates/database/none.d.ts +8 -0
  43. package/dist/cli/templates/database/none.d.ts.map +1 -0
  44. package/dist/cli/templates/database/postgresql.d.ts +6 -0
  45. package/dist/cli/templates/database/postgresql.d.ts.map +1 -0
  46. package/dist/cli/templates/database/sqlite.d.ts +6 -0
  47. package/dist/cli/templates/database/sqlite.d.ts.map +1 -0
  48. package/dist/cli/templates/deploy.d.ts +41 -0
  49. package/dist/cli/templates/deploy.d.ts.map +1 -0
  50. package/dist/cli/templates/docker.d.ts +30 -0
  51. package/dist/cli/templates/docker.d.ts.map +1 -0
  52. package/dist/cli/templates/frontend/index.d.ts +25 -0
  53. package/dist/cli/templates/frontend/index.d.ts.map +1 -0
  54. package/dist/cli/templates/frontend/none.d.ts +8 -0
  55. package/dist/cli/templates/frontend/none.d.ts.map +1 -0
  56. package/dist/cli/templates/frontend/react.d.ts +6 -0
  57. package/dist/cli/templates/frontend/react.d.ts.map +1 -0
  58. package/dist/cli/templates/frontend/solid.d.ts +6 -0
  59. package/dist/cli/templates/frontend/solid.d.ts.map +1 -0
  60. package/dist/cli/templates/frontend/svelte.d.ts +6 -0
  61. package/dist/cli/templates/frontend/svelte.d.ts.map +1 -0
  62. package/dist/cli/templates/frontend/vue.d.ts +6 -0
  63. package/dist/cli/templates/frontend/vue.d.ts.map +1 -0
  64. package/dist/cli/templates/generators/index.d.ts +29 -0
  65. package/dist/cli/templates/generators/index.d.ts.map +1 -0
  66. package/dist/cli/templates/generators/types.d.ts +32 -0
  67. package/dist/cli/templates/generators/types.d.ts.map +1 -0
  68. package/dist/cli/templates/index.d.ts +12 -0
  69. package/dist/cli/templates/index.d.ts.map +1 -0
  70. package/dist/cli/templates/project/api.d.ts +6 -0
  71. package/dist/cli/templates/project/api.d.ts.map +1 -0
  72. package/dist/cli/templates/project/default.d.ts +6 -0
  73. package/dist/cli/templates/project/default.d.ts.map +1 -0
  74. package/dist/cli/templates/project/fullstack.d.ts +14 -0
  75. package/dist/cli/templates/project/fullstack.d.ts.map +1 -0
  76. package/dist/cli/templates/project/index.d.ts +26 -0
  77. package/dist/cli/templates/project/index.d.ts.map +1 -0
  78. package/dist/cli/templates/project/minimal.d.ts +6 -0
  79. package/dist/cli/templates/project/minimal.d.ts.map +1 -0
  80. package/dist/cli/templates/project/types.d.ts +80 -0
  81. package/dist/cli/templates/project/types.d.ts.map +1 -0
  82. package/dist/cli/templates/project/website.d.ts +8 -0
  83. package/dist/cli/templates/project/website.d.ts.map +1 -0
  84. package/dist/cli/utils/fs.d.ts +137 -0
  85. package/dist/cli/utils/fs.d.ts.map +1 -0
  86. package/dist/cli/utils/index.d.ts +9 -0
  87. package/dist/cli/utils/index.d.ts.map +1 -0
  88. package/dist/cli/utils/strings.d.ts +86 -0
  89. package/dist/cli/utils/strings.d.ts.map +1 -0
  90. package/dist/cli/utils/version.d.ts +15 -0
  91. package/dist/cli/utils/version.d.ts.map +1 -0
  92. package/dist/config/env-validation.d.ts +49 -0
  93. package/dist/config/env-validation.d.ts.map +1 -0
  94. package/dist/config/env.d.ts +167 -0
  95. package/dist/config/env.d.ts.map +1 -0
  96. package/dist/config/index.d.ts +168 -0
  97. package/dist/config/index.d.ts.map +1 -0
  98. package/dist/config/loader.d.ts +81 -0
  99. package/dist/config/loader.d.ts.map +1 -0
  100. package/dist/config/merge.d.ts +66 -0
  101. package/dist/config/merge.d.ts.map +1 -0
  102. package/dist/config/types.d.ts +322 -0
  103. package/dist/config/types.d.ts.map +1 -0
  104. package/dist/config/validation.d.ts +100 -0
  105. package/dist/config/validation.d.ts.map +1 -0
  106. package/dist/container/forward-ref.d.ts +116 -0
  107. package/dist/container/forward-ref.d.ts.map +1 -0
  108. package/dist/container/index.d.ts +95 -0
  109. package/dist/container/index.d.ts.map +1 -0
  110. package/dist/container/index.js +26 -3
  111. package/dist/context/index.d.ts +143 -0
  112. package/dist/context/index.d.ts.map +1 -0
  113. package/dist/database/index.d.ts +219 -0
  114. package/dist/database/index.d.ts.map +1 -0
  115. package/dist/database/migrations/index.d.ts +146 -0
  116. package/dist/database/migrations/index.d.ts.map +1 -0
  117. package/dist/database/orm/builder.d.ts +122 -0
  118. package/dist/database/orm/builder.d.ts.map +1 -0
  119. package/dist/database/orm/casts/index.d.ts +16 -0
  120. package/dist/database/orm/casts/index.d.ts.map +1 -0
  121. package/dist/database/orm/casts/types.d.ts +16 -0
  122. package/dist/database/orm/casts/types.d.ts.map +1 -0
  123. package/dist/database/orm/compiler.d.ts +90 -0
  124. package/dist/database/orm/compiler.d.ts.map +1 -0
  125. package/dist/database/orm/hooks/index.d.ts +53 -0
  126. package/dist/database/orm/hooks/index.d.ts.map +1 -0
  127. package/dist/database/orm/index.d.ts +21 -0
  128. package/dist/database/orm/index.d.ts.map +1 -0
  129. package/dist/database/orm/model-registry.d.ts +33 -0
  130. package/dist/database/orm/model-registry.d.ts.map +1 -0
  131. package/dist/database/orm/model.d.ts +245 -0
  132. package/dist/database/orm/model.d.ts.map +1 -0
  133. package/dist/database/orm/relationships/base.d.ts +69 -0
  134. package/dist/database/orm/relationships/base.d.ts.map +1 -0
  135. package/dist/database/orm/relationships/belongs-to-many.d.ts +47 -0
  136. package/dist/database/orm/relationships/belongs-to-many.d.ts.map +1 -0
  137. package/dist/database/orm/relationships/belongs-to.d.ts +17 -0
  138. package/dist/database/orm/relationships/belongs-to.d.ts.map +1 -0
  139. package/dist/database/orm/relationships/has-many.d.ts +14 -0
  140. package/dist/database/orm/relationships/has-many.d.ts.map +1 -0
  141. package/dist/database/orm/relationships/has-one.d.ts +14 -0
  142. package/dist/database/orm/relationships/has-one.d.ts.map +1 -0
  143. package/dist/database/orm/relationships/index.d.ts +10 -0
  144. package/dist/database/orm/relationships/index.d.ts.map +1 -0
  145. package/dist/database/orm/scopes/index.d.ts +36 -0
  146. package/dist/database/orm/scopes/index.d.ts.map +1 -0
  147. package/dist/database/schema/index.d.ts +155 -0
  148. package/dist/database/schema/index.d.ts.map +1 -0
  149. package/dist/events/__tests__/event-system.test.d.ts +2 -0
  150. package/dist/events/__tests__/event-system.test.d.ts.map +1 -0
  151. package/dist/events/config.d.ts +16 -0
  152. package/dist/events/config.d.ts.map +1 -0
  153. package/dist/events/example-usage.d.ts +12 -0
  154. package/dist/events/example-usage.d.ts.map +1 -0
  155. package/dist/events/index.d.ts +27 -0
  156. package/dist/events/index.d.ts.map +1 -0
  157. package/dist/events/manager.d.ts +33 -0
  158. package/dist/events/manager.d.ts.map +1 -0
  159. package/dist/events/registry.d.ts +31 -0
  160. package/dist/events/registry.d.ts.map +1 -0
  161. package/dist/events/types.d.ts +105 -0
  162. package/dist/events/types.d.ts.map +1 -0
  163. package/dist/frontend/api-routes.d.ts +189 -0
  164. package/dist/frontend/api-routes.d.ts.map +1 -0
  165. package/dist/frontend/bundler.d.ts +99 -0
  166. package/dist/frontend/bundler.d.ts.map +1 -0
  167. package/dist/frontend/console-client.d.ts +11 -0
  168. package/dist/frontend/console-client.d.ts.map +1 -0
  169. package/dist/frontend/console-stream.d.ts +138 -0
  170. package/dist/frontend/console-stream.d.ts.map +1 -0
  171. package/dist/frontend/dev-server.d.ts +174 -0
  172. package/dist/frontend/dev-server.d.ts.map +1 -0
  173. package/dist/frontend/file-router.d.ts +170 -0
  174. package/dist/frontend/file-router.d.ts.map +1 -0
  175. package/dist/frontend/frameworks/index.d.ts +41 -0
  176. package/dist/frontend/frameworks/index.d.ts.map +1 -0
  177. package/dist/frontend/frameworks/react.d.ts +32 -0
  178. package/dist/frontend/frameworks/react.d.ts.map +1 -0
  179. package/dist/frontend/frameworks/solid.d.ts +42 -0
  180. package/dist/frontend/frameworks/solid.d.ts.map +1 -0
  181. package/dist/frontend/frameworks/svelte.d.ts +57 -0
  182. package/dist/frontend/frameworks/svelte.d.ts.map +1 -0
  183. package/dist/frontend/frameworks/vue.d.ts +36 -0
  184. package/dist/frontend/frameworks/vue.d.ts.map +1 -0
  185. package/dist/frontend/hmr-client.d.ts +22 -0
  186. package/dist/frontend/hmr-client.d.ts.map +1 -0
  187. package/dist/frontend/hmr.d.ts +185 -0
  188. package/dist/frontend/hmr.d.ts.map +1 -0
  189. package/dist/frontend/index.d.ts +34 -0
  190. package/dist/frontend/index.d.ts.map +1 -0
  191. package/dist/frontend/islands.d.ts +135 -0
  192. package/dist/frontend/islands.d.ts.map +1 -0
  193. package/dist/frontend/isr.d.ts +143 -0
  194. package/dist/frontend/isr.d.ts.map +1 -0
  195. package/dist/frontend/layout.d.ts +140 -0
  196. package/dist/frontend/layout.d.ts.map +1 -0
  197. package/dist/frontend/ssr/react.d.ts +118 -0
  198. package/dist/frontend/ssr/react.d.ts.map +1 -0
  199. package/dist/frontend/ssr/solid.d.ts +141 -0
  200. package/dist/frontend/ssr/solid.d.ts.map +1 -0
  201. package/dist/frontend/ssr/svelte.d.ts +158 -0
  202. package/dist/frontend/ssr/svelte.d.ts.map +1 -0
  203. package/dist/frontend/ssr/vue.d.ts +161 -0
  204. package/dist/frontend/ssr/vue.d.ts.map +1 -0
  205. package/dist/frontend/ssr.d.ts +147 -0
  206. package/dist/frontend/ssr.d.ts.map +1 -0
  207. package/dist/frontend/types.d.ts +1902 -0
  208. package/dist/frontend/types.d.ts.map +1 -0
  209. package/dist/graphql/built-in-engine.d.ts +36 -0
  210. package/dist/graphql/built-in-engine.d.ts.map +1 -0
  211. package/dist/graphql/context-builder.d.ts +44 -0
  212. package/dist/graphql/context-builder.d.ts.map +1 -0
  213. package/dist/graphql/decorators.d.ts +162 -0
  214. package/dist/graphql/decorators.d.ts.map +1 -0
  215. package/dist/graphql/execution-pipeline.d.ts +67 -0
  216. package/dist/graphql/execution-pipeline.d.ts.map +1 -0
  217. package/dist/graphql/graphql-module.d.ts +70 -0
  218. package/dist/graphql/graphql-module.d.ts.map +1 -0
  219. package/dist/graphql/index.d.ts +48 -0
  220. package/dist/graphql/index.d.ts.map +1 -0
  221. package/dist/graphql/index.js +2156 -0
  222. package/dist/graphql/metadata.d.ts +37 -0
  223. package/dist/graphql/metadata.d.ts.map +1 -0
  224. package/dist/graphql/schema-builder.d.ts +34 -0
  225. package/dist/graphql/schema-builder.d.ts.map +1 -0
  226. package/dist/graphql/subscription-handler.d.ts +47 -0
  227. package/dist/graphql/subscription-handler.d.ts.map +1 -0
  228. package/dist/graphql/types.d.ts +252 -0
  229. package/dist/graphql/types.d.ts.map +1 -0
  230. package/dist/health/index.d.ts +176 -0
  231. package/dist/health/index.d.ts.map +1 -0
  232. package/dist/i18n/engine.d.ts +105 -0
  233. package/dist/i18n/engine.d.ts.map +1 -0
  234. package/dist/i18n/index.d.ts +13 -0
  235. package/dist/i18n/index.d.ts.map +1 -0
  236. package/dist/i18n/loader.d.ts +79 -0
  237. package/dist/i18n/loader.d.ts.map +1 -0
  238. package/dist/i18n/middleware.d.ts +96 -0
  239. package/dist/i18n/middleware.d.ts.map +1 -0
  240. package/dist/i18n/negotiator.d.ts +84 -0
  241. package/dist/i18n/negotiator.d.ts.map +1 -0
  242. package/dist/i18n/types.d.ts +129 -0
  243. package/dist/i18n/types.d.ts.map +1 -0
  244. package/dist/index.d.ts +48 -0
  245. package/dist/index.d.ts.map +1 -0
  246. package/dist/index.js +520 -434
  247. package/dist/jobs/drivers/memory.d.ts +38 -0
  248. package/dist/jobs/drivers/memory.d.ts.map +1 -0
  249. package/dist/jobs/drivers/redis.d.ts +34 -0
  250. package/dist/jobs/drivers/redis.d.ts.map +1 -0
  251. package/dist/jobs/index.d.ts +12 -0
  252. package/dist/jobs/index.d.ts.map +1 -0
  253. package/dist/jobs/queue.d.ts +93 -0
  254. package/dist/jobs/queue.d.ts.map +1 -0
  255. package/dist/jobs/types.d.ts +193 -0
  256. package/dist/jobs/types.d.ts.map +1 -0
  257. package/dist/jobs/worker.d.ts +91 -0
  258. package/dist/jobs/worker.d.ts.map +1 -0
  259. package/dist/lock/index.d.ts +141 -0
  260. package/dist/lock/index.d.ts.map +1 -0
  261. package/dist/logger/index.d.ts +156 -0
  262. package/dist/logger/index.d.ts.map +1 -0
  263. package/dist/logger/transports/index.d.ts +371 -0
  264. package/dist/logger/transports/index.d.ts.map +1 -0
  265. package/dist/metrics/index.d.ts +163 -0
  266. package/dist/metrics/index.d.ts.map +1 -0
  267. package/dist/middleware/built-in.d.ts +50 -0
  268. package/dist/middleware/built-in.d.ts.map +1 -0
  269. package/dist/middleware/index.d.ts +40 -0
  270. package/dist/middleware/index.d.ts.map +1 -0
  271. package/dist/migrations/index.d.ts +10 -0
  272. package/dist/migrations/index.d.ts.map +1 -0
  273. package/dist/modules/filters.d.ts +150 -0
  274. package/dist/modules/filters.d.ts.map +1 -0
  275. package/dist/modules/guards.d.ts +188 -0
  276. package/dist/modules/guards.d.ts.map +1 -0
  277. package/dist/modules/index.d.ts +266 -0
  278. package/dist/modules/index.d.ts.map +1 -0
  279. package/dist/modules/index.js +514 -449
  280. package/dist/modules/interceptors.d.ts +242 -0
  281. package/dist/modules/interceptors.d.ts.map +1 -0
  282. package/dist/modules/lazy.d.ts +187 -0
  283. package/dist/modules/lazy.d.ts.map +1 -0
  284. package/dist/modules/lifecycle.d.ts +221 -0
  285. package/dist/modules/lifecycle.d.ts.map +1 -0
  286. package/dist/modules/metadata.d.ts +32 -0
  287. package/dist/modules/metadata.d.ts.map +1 -0
  288. package/dist/modules/pipes.d.ts +287 -0
  289. package/dist/modules/pipes.d.ts.map +1 -0
  290. package/dist/notification/channels/base.d.ts +32 -0
  291. package/dist/notification/channels/base.d.ts.map +1 -0
  292. package/dist/notification/channels/email.d.ts +37 -0
  293. package/dist/notification/channels/email.d.ts.map +1 -0
  294. package/dist/notification/channels/push.d.ts +37 -0
  295. package/dist/notification/channels/push.d.ts.map +1 -0
  296. package/dist/notification/channels/sms.d.ts +37 -0
  297. package/dist/notification/channels/sms.d.ts.map +1 -0
  298. package/dist/notification/channels/whatsapp.d.ts +37 -0
  299. package/dist/notification/channels/whatsapp.d.ts.map +1 -0
  300. package/dist/notification/index.d.ts +15 -0
  301. package/dist/notification/index.d.ts.map +1 -0
  302. package/dist/notification/service.d.ts +100 -0
  303. package/dist/notification/service.d.ts.map +1 -0
  304. package/dist/notification/types.d.ts +253 -0
  305. package/dist/notification/types.d.ts.map +1 -0
  306. package/dist/observability/__tests__/observability.test.d.ts +2 -0
  307. package/dist/observability/__tests__/observability.test.d.ts.map +1 -0
  308. package/dist/observability/breadcrumbs.d.ts +48 -0
  309. package/dist/observability/breadcrumbs.d.ts.map +1 -0
  310. package/dist/observability/index.d.ts +95 -0
  311. package/dist/observability/index.d.ts.map +1 -0
  312. package/dist/observability/interceptor.d.ts +19 -0
  313. package/dist/observability/interceptor.d.ts.map +1 -0
  314. package/dist/observability/service.d.ts +101 -0
  315. package/dist/observability/service.d.ts.map +1 -0
  316. package/dist/observability/trace.d.ts +21 -0
  317. package/dist/observability/trace.d.ts.map +1 -0
  318. package/dist/observability/types.d.ts +172 -0
  319. package/dist/observability/types.d.ts.map +1 -0
  320. package/dist/openapi/__tests__/decorators.test.d.ts +2 -0
  321. package/dist/openapi/__tests__/decorators.test.d.ts.map +1 -0
  322. package/dist/openapi/__tests__/document-builder.test.d.ts +2 -0
  323. package/dist/openapi/__tests__/document-builder.test.d.ts.map +1 -0
  324. package/dist/openapi/__tests__/route-scanner.test.d.ts +2 -0
  325. package/dist/openapi/__tests__/route-scanner.test.d.ts.map +1 -0
  326. package/dist/openapi/__tests__/schema-generator.test.d.ts +2 -0
  327. package/dist/openapi/__tests__/schema-generator.test.d.ts.map +1 -0
  328. package/dist/openapi/decorators.d.ts +173 -0
  329. package/dist/openapi/decorators.d.ts.map +1 -0
  330. package/dist/openapi/document-builder.d.ts +82 -0
  331. package/dist/openapi/document-builder.d.ts.map +1 -0
  332. package/dist/openapi/index.d.ts +48 -0
  333. package/dist/openapi/index.d.ts.map +1 -0
  334. package/dist/openapi/index.js +59 -40
  335. package/dist/openapi/metadata.d.ts +36 -0
  336. package/dist/openapi/metadata.d.ts.map +1 -0
  337. package/dist/openapi/route-scanner.d.ts +34 -0
  338. package/dist/openapi/route-scanner.d.ts.map +1 -0
  339. package/dist/openapi/schema-generator.d.ts +53 -0
  340. package/dist/openapi/schema-generator.d.ts.map +1 -0
  341. package/dist/openapi/swagger-module.d.ts +57 -0
  342. package/dist/openapi/swagger-module.d.ts.map +1 -0
  343. package/dist/openapi/types.d.ts +344 -0
  344. package/dist/openapi/types.d.ts.map +1 -0
  345. package/dist/orm/index.d.ts +10 -0
  346. package/dist/orm/index.d.ts.map +1 -0
  347. package/dist/router/index.d.ts +73 -0
  348. package/dist/router/index.d.ts.map +1 -0
  349. package/dist/router/linear.d.ts +54 -0
  350. package/dist/router/linear.d.ts.map +1 -0
  351. package/dist/router/regex.d.ts +49 -0
  352. package/dist/router/regex.d.ts.map +1 -0
  353. package/dist/router/tree.d.ts +112 -0
  354. package/dist/router/tree.d.ts.map +1 -0
  355. package/dist/rpc/index.d.ts +321 -0
  356. package/dist/rpc/index.d.ts.map +1 -0
  357. package/dist/schema/index.d.ts +10 -0
  358. package/dist/schema/index.d.ts.map +1 -0
  359. package/dist/security/index.d.ts +126 -0
  360. package/dist/security/index.d.ts.map +1 -0
  361. package/dist/ssg/index.d.ts +73 -0
  362. package/dist/ssg/index.d.ts.map +1 -0
  363. package/dist/storage/index.d.ts +99 -0
  364. package/dist/storage/index.d.ts.map +1 -0
  365. package/dist/telemetry/index.d.ts +376 -0
  366. package/dist/telemetry/index.d.ts.map +1 -0
  367. package/dist/template/index.d.ts +7 -0
  368. package/dist/template/index.d.ts.map +1 -0
  369. package/dist/templates/engine.d.ts +60 -0
  370. package/dist/templates/engine.d.ts.map +1 -0
  371. package/dist/templates/index.d.ts +9 -0
  372. package/dist/templates/index.d.ts.map +1 -0
  373. package/dist/templates/loader.d.ts +45 -0
  374. package/dist/templates/loader.d.ts.map +1 -0
  375. package/dist/templates/renderers/markdown.d.ts +46 -0
  376. package/dist/templates/renderers/markdown.d.ts.map +1 -0
  377. package/dist/templates/renderers/simple.d.ts +35 -0
  378. package/dist/templates/renderers/simple.d.ts.map +1 -0
  379. package/dist/templates/types.d.ts +138 -0
  380. package/dist/templates/types.d.ts.map +1 -0
  381. package/dist/testing/index.d.ts +539 -0
  382. package/dist/testing/index.d.ts.map +1 -0
  383. package/dist/types/index.d.ts +116 -0
  384. package/dist/types/index.d.ts.map +1 -0
  385. package/dist/validation/index.d.ts +89 -0
  386. package/dist/validation/index.d.ts.map +1 -0
  387. package/dist/validation/schemas.d.ts +243 -0
  388. package/dist/validation/schemas.d.ts.map +1 -0
  389. package/dist/websocket/index.d.ts +252 -0
  390. package/dist/websocket/index.d.ts.map +1 -0
  391. package/llms.txt +231 -0
  392. package/package.json +6 -2
  393. package/src/cli/ARCHITECTURE.md +3 -3
  394. package/src/cli/commands/add-frontend.ts +444 -0
  395. package/src/cli/commands/new.ts +23 -0
  396. package/src/cli/index.ts +1 -0
  397. package/src/cli/templates/frontend/react.ts +2 -1
  398. package/src/cli/templates/frontend/solid.ts +2 -1
  399. package/src/cli/templates/frontend/svelte.ts +2 -1
  400. package/src/cli/templates/frontend/vue.ts +2 -1
  401. package/src/cli/templates/project/api.ts +1 -1
  402. package/src/cli/templates/project/default.ts +1 -1
  403. package/src/cli/templates/project/fullstack.ts +14 -104
  404. package/src/cli/templates/project/website.ts +63 -12
  405. package/src/config/types.ts +21 -0
  406. package/src/graphql/built-in-engine.ts +598 -0
  407. package/src/graphql/context-builder.ts +110 -0
  408. package/src/graphql/decorators.ts +358 -0
  409. package/src/graphql/execution-pipeline.ts +227 -0
  410. package/src/graphql/graphql-module.ts +563 -0
  411. package/src/graphql/index.ts +101 -0
  412. package/src/graphql/metadata.ts +237 -0
  413. package/src/graphql/schema-builder.ts +319 -0
  414. package/src/graphql/subscription-handler.ts +283 -0
  415. package/src/graphql/types.ts +324 -0
  416. package/src/index.ts +3 -0
  417. package/src/modules/index.ts +48 -1
  418. package/tests/integration/cli.test.ts +19 -19
  419. package/tests/unit/cli.test.ts +1 -1
  420. package/tests/unit/graphql.test.ts +991 -0
  421. package/tsconfig.declaration.json +14 -0
package/dist/index.js CHANGED
@@ -26,6 +26,237 @@ var __legacyMetadataTS = (k, v) => {
26
26
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
27
27
  var __require = import.meta.require;
28
28
 
29
+ // src/container/forward-ref.ts
30
+ function forwardRef(fn) {
31
+ return {
32
+ __forwardRef: FORWARD_REF_SYMBOL,
33
+ forwardRef: fn
34
+ };
35
+ }
36
+ function isForwardRef(value) {
37
+ return typeof value === "object" && value !== null && "__forwardRef" in value && "forwardRef" in value && typeof value.forwardRef === "function";
38
+ }
39
+ function resolveForwardRef(ref) {
40
+ if (isForwardRef(ref)) {
41
+ return ref.forwardRef();
42
+ }
43
+ return ref;
44
+ }
45
+ var FORWARD_REF_SYMBOL;
46
+ var init_forward_ref = __esm(() => {
47
+ FORWARD_REF_SYMBOL = Symbol.for("buno.forwardRef");
48
+ });
49
+
50
+ // src/container/index.ts
51
+ var exports_container = {};
52
+ __export(exports_container, {
53
+ setContainerMetadata: () => setContainerMetadata,
54
+ resolveForwardRef: () => resolveForwardRef,
55
+ isForwardRef: () => isForwardRef,
56
+ getInjectTokens: () => getContainerMetadata,
57
+ getContainerMetadata: () => getContainerMetadata,
58
+ forwardRef: () => forwardRef,
59
+ createToken: () => createToken,
60
+ Token: () => Token,
61
+ Injectable: () => Injectable,
62
+ Inject: () => Inject,
63
+ Container: () => Container2
64
+ });
65
+ function createToken(description) {
66
+ return Symbol(description);
67
+ }
68
+
69
+ class ResolutionStack {
70
+ stack = new Set;
71
+ lazyResolutions = new Map;
72
+ push(token) {
73
+ if (this.stack.has(token)) {
74
+ throw new Error("Circular dependency detected: Token already in resolution stack");
75
+ }
76
+ this.stack.add(token);
77
+ }
78
+ pop(token) {
79
+ this.stack.delete(token);
80
+ }
81
+ has(token) {
82
+ return this.stack.has(token);
83
+ }
84
+ markLazy(token, placeholder) {
85
+ this.lazyResolutions.set(token, placeholder);
86
+ }
87
+ hasLazy(token) {
88
+ return this.lazyResolutions.has(token);
89
+ }
90
+ getLazy(token) {
91
+ return this.lazyResolutions.get(token);
92
+ }
93
+ clearLazy(token) {
94
+ this.lazyResolutions.delete(token);
95
+ }
96
+ }
97
+
98
+ class Container2 {
99
+ providers = new Map;
100
+ resolutionStack = new ResolutionStack;
101
+ register(provider) {
102
+ if (this.providers.has(provider.token)) {
103
+ throw new Error(`Provider already registered for token: ${String(provider.token)}`);
104
+ }
105
+ this.providers.set(provider.token, {
106
+ provider: {
107
+ ...provider,
108
+ scope: provider.scope ?? "singleton"
109
+ }
110
+ });
111
+ }
112
+ registerAll(providers) {
113
+ for (const provider of providers) {
114
+ this.register(provider);
115
+ }
116
+ }
117
+ has(token) {
118
+ return this.providers.has(token);
119
+ }
120
+ resolve(token) {
121
+ const resolved = this.providers.get(token);
122
+ if (!resolved) {
123
+ throw new Error(`No provider registered for token: ${String(token)}`);
124
+ }
125
+ const { provider } = resolved;
126
+ if (this.resolutionStack.has(token)) {
127
+ return this.createLazyProxy(token, resolved);
128
+ }
129
+ if (provider.scope === "singleton" && resolved.instance !== undefined) {
130
+ return resolved.instance;
131
+ }
132
+ this.resolutionStack.push(token);
133
+ try {
134
+ const instance = this.createInstance(provider);
135
+ if (provider.scope === "singleton") {
136
+ resolved.instance = instance;
137
+ }
138
+ return instance;
139
+ } finally {
140
+ this.resolutionStack.pop(token);
141
+ }
142
+ }
143
+ createLazyProxy(token, resolved) {
144
+ const existingLazy = this.resolutionStack.getLazy(token);
145
+ if (existingLazy && existingLazy.instance) {
146
+ return existingLazy.instance;
147
+ }
148
+ const placeholder = {
149
+ resolved: false
150
+ };
151
+ this.resolutionStack.markLazy(token, placeholder);
152
+ const proxy = new Proxy({}, {
153
+ get: (target, prop) => {
154
+ if (placeholder.resolved && placeholder.instance) {
155
+ const value = placeholder.instance[prop];
156
+ return typeof value === "function" ? value.bind(placeholder.instance) : value;
157
+ }
158
+ if (resolved.instance !== undefined) {
159
+ placeholder.instance = resolved.instance;
160
+ placeholder.resolved = true;
161
+ } else {
162
+ if (prop === "then") {
163
+ return;
164
+ }
165
+ }
166
+ if (placeholder.instance) {
167
+ const value = placeholder.instance[prop];
168
+ return typeof value === "function" ? value.bind(placeholder.instance) : value;
169
+ }
170
+ return () => {
171
+ return;
172
+ };
173
+ },
174
+ set: (target, prop, value) => {
175
+ if (placeholder.instance) {
176
+ placeholder.instance[prop] = value;
177
+ return true;
178
+ }
179
+ return false;
180
+ },
181
+ has: (target, prop) => {
182
+ if (placeholder.instance) {
183
+ return prop in placeholder.instance;
184
+ }
185
+ return false;
186
+ }
187
+ });
188
+ placeholder.instance = proxy;
189
+ return proxy;
190
+ }
191
+ createInstance(provider) {
192
+ if (provider.useValue !== undefined) {
193
+ return provider.useValue;
194
+ }
195
+ if (provider.useFactory) {
196
+ const deps = this.resolveDeps(provider.inject ?? []);
197
+ return provider.useFactory(...deps);
198
+ }
199
+ if (provider.useClass) {
200
+ const deps = this.resolveDeps(provider.inject ?? []);
201
+ return new provider.useClass(...deps);
202
+ }
203
+ throw new Error(`Invalid provider configuration for token: ${String(provider.token)}`);
204
+ }
205
+ resolveDeps(tokens) {
206
+ return tokens.map((tokenOrRef) => {
207
+ const token = resolveForwardRef(tokenOrRef);
208
+ return this.resolve(token);
209
+ });
210
+ }
211
+ clear() {
212
+ this.providers.clear();
213
+ }
214
+ getTokens() {
215
+ return Array.from(this.providers.keys());
216
+ }
217
+ createChild() {
218
+ const child = new Container2;
219
+ for (const [token, resolved] of this.providers) {
220
+ if (resolved.provider.scope === "singleton") {
221
+ child.providers.set(token, resolved);
222
+ }
223
+ }
224
+ return child;
225
+ }
226
+ }
227
+ function setContainerMetadata(target, key, value) {
228
+ if (!containerMetadata.has(target)) {
229
+ containerMetadata.set(target, new Map);
230
+ }
231
+ containerMetadata.get(target)?.set(key, value);
232
+ }
233
+ function getContainerMetadata(target, key) {
234
+ return containerMetadata.get(target)?.get(key);
235
+ }
236
+ function Injectable(token) {
237
+ return (target) => {
238
+ setContainerMetadata(target, "injectable", true);
239
+ if (token) {
240
+ setContainerMetadata(target, "token", token);
241
+ }
242
+ return target;
243
+ };
244
+ }
245
+ function Inject(token) {
246
+ return (target, propertyKey, parameterIndex) => {
247
+ const targetObj = target;
248
+ const existingTokens = getContainerMetadata(targetObj, "inject:tokens") ?? [];
249
+ existingTokens[parameterIndex] = token;
250
+ setContainerMetadata(targetObj, "inject:tokens", existingTokens);
251
+ };
252
+ }
253
+ var Token, containerMetadata;
254
+ var init_container = __esm(() => {
255
+ init_forward_ref();
256
+ Token = createToken;
257
+ containerMetadata = new WeakMap;
258
+ });
259
+
29
260
  // src/context/index.ts
30
261
  var exports_context = {};
31
262
  __export(exports_context, {
@@ -259,6 +490,150 @@ function createPipeline() {
259
490
  return new Pipeline;
260
491
  }
261
492
 
493
+ // src/modules/guards.ts
494
+ var exports_guards = {};
495
+ __export(exports_guards, {
496
+ getMethodRoles: () => getMethodRoles,
497
+ getMethodGuards: () => getMethodGuards,
498
+ getClassGuards: () => getClassGuards,
499
+ executeGuards: () => executeGuards,
500
+ createForbiddenResponse: () => createForbiddenResponse,
501
+ UseGuards: () => UseGuards,
502
+ RolesGuard: () => RolesGuard,
503
+ Roles: () => Roles,
504
+ AuthGuard: () => AuthGuard
505
+ });
506
+ function setClassGuards(target, guards) {
507
+ guardsClassMetadata.set(target, guards);
508
+ }
509
+ function getClassGuards(target) {
510
+ return guardsClassMetadata.get(target);
511
+ }
512
+ function setMethodGuards(target, propertyKey, guards) {
513
+ if (!guardsMethodMetadata.has(target)) {
514
+ guardsMethodMetadata.set(target, new Map);
515
+ }
516
+ guardsMethodMetadata.get(target)?.set(propertyKey, guards);
517
+ }
518
+ function getMethodGuards(target, propertyKey) {
519
+ return guardsMethodMetadata.get(target)?.get(propertyKey);
520
+ }
521
+ function UseGuards(...guards) {
522
+ const decorator = (target, propertyKey, descriptor2) => {
523
+ if (propertyKey !== undefined && descriptor2 !== undefined) {
524
+ const targetObj = target;
525
+ const existingGuards = getMethodGuards(targetObj, propertyKey) ?? [];
526
+ setMethodGuards(targetObj, propertyKey, [...existingGuards, ...guards]);
527
+ return descriptor2;
528
+ } else {
529
+ const targetClass = target;
530
+ const existingGuards = getClassGuards(targetClass) ?? [];
531
+ setClassGuards(targetClass, [...existingGuards, ...guards]);
532
+ }
533
+ };
534
+ return decorator;
535
+ }
536
+
537
+ class AuthGuard {
538
+ canActivate(context) {
539
+ const authHeader = context.req.headers.get("Authorization");
540
+ return authHeader !== null && authHeader.length > 0;
541
+ }
542
+ }
543
+ function setMethodRoles(target, propertyKey, roles) {
544
+ if (!rolesMethodMetadata.has(target)) {
545
+ rolesMethodMetadata.set(target, new Map);
546
+ }
547
+ rolesMethodMetadata.get(target)?.set(propertyKey, roles);
548
+ }
549
+ function getMethodRoles(target, propertyKey) {
550
+ return rolesMethodMetadata.get(target)?.get(propertyKey);
551
+ }
552
+ function Roles(...roles) {
553
+ return (target, propertyKey, descriptor2) => {
554
+ const targetObj = target;
555
+ setMethodRoles(targetObj, propertyKey, roles);
556
+ return descriptor2;
557
+ };
558
+ }
559
+
560
+ class RolesGuard {
561
+ canActivate(context) {
562
+ const requiredRoles = context.requiredRoles;
563
+ if (!requiredRoles || requiredRoles.length === 0) {
564
+ return true;
565
+ }
566
+ const user = context.user;
567
+ if (!user || !user.roles) {
568
+ return false;
569
+ }
570
+ return requiredRoles.some((role) => user.roles?.includes(role));
571
+ }
572
+ }
573
+ async function executeGuards(context, options) {
574
+ const {
575
+ globalGuards = [],
576
+ classGuards = [],
577
+ methodGuards = [],
578
+ resolveGuard
579
+ } = options;
580
+ const allGuards = [...globalGuards, ...classGuards, ...methodGuards];
581
+ for (const guard of allGuards) {
582
+ let guardInstance = null;
583
+ if (typeof guard === "function") {
584
+ const funcGuard = guard;
585
+ if (funcGuard.prototype && typeof funcGuard.prototype === "object" && "canActivate" in funcGuard.prototype) {
586
+ guardInstance = resolveGuard ? resolveGuard(guard) : null;
587
+ if (!guardInstance) {
588
+ const GuardClass = guard;
589
+ guardInstance = new GuardClass;
590
+ }
591
+ } else {
592
+ guardInstance = guard;
593
+ }
594
+ } else if (typeof guard === "object" && guard !== null) {
595
+ const objGuard = guard;
596
+ if ("canActivate" in objGuard && typeof objGuard.canActivate === "function") {
597
+ guardInstance = guard;
598
+ } else {
599
+ guardInstance = resolveGuard ? resolveGuard(guard) : null;
600
+ }
601
+ }
602
+ if (!guardInstance) {
603
+ console.warn("Guard could not be resolved:", guard);
604
+ continue;
605
+ }
606
+ let result;
607
+ if (typeof guardInstance === "function") {
608
+ result = await guardInstance(context);
609
+ } else {
610
+ result = await guardInstance.canActivate(context);
611
+ }
612
+ if (!result) {
613
+ return false;
614
+ }
615
+ }
616
+ return true;
617
+ }
618
+ function createForbiddenResponse() {
619
+ return new Response(JSON.stringify({
620
+ statusCode: 403,
621
+ error: "Forbidden",
622
+ message: "Access denied"
623
+ }), {
624
+ status: 403,
625
+ headers: {
626
+ "Content-Type": "application/json"
627
+ }
628
+ });
629
+ }
630
+ var guardsClassMetadata, guardsMethodMetadata, rolesMethodMetadata;
631
+ var init_guards = __esm(() => {
632
+ guardsClassMetadata = new WeakMap;
633
+ guardsMethodMetadata = new WeakMap;
634
+ rolesMethodMetadata = new WeakMap;
635
+ });
636
+
262
637
  // src/validation/index.ts
263
638
  async function validate(schema, data) {
264
639
  try {
@@ -413,6 +788,59 @@ function validateEnvSync(schema, envVars) {
413
788
  }
414
789
  }
415
790
 
791
+ // src/openapi/metadata.ts
792
+ var exports_metadata = {};
793
+ __export(exports_metadata, {
794
+ setApiPropertyMetadata: () => setApiPropertyMetadata,
795
+ setApiMethodMetadata: () => setApiMethodMetadata,
796
+ setApiMetadata: () => setApiMetadata,
797
+ getApiPropertyMetadata: () => getApiPropertyMetadata,
798
+ getApiPropertyKeys: () => getApiPropertyKeys,
799
+ getApiMethodMetadata: () => getApiMethodMetadata,
800
+ getApiMetadata: () => getApiMetadata
801
+ });
802
+ function setApiMetadata(target, key, value) {
803
+ if (!classMetadataStore.has(target)) {
804
+ classMetadataStore.set(target, new Map);
805
+ }
806
+ classMetadataStore.get(target)?.set(key, value);
807
+ }
808
+ function getApiMetadata(target, key) {
809
+ return classMetadataStore.get(target)?.get(key);
810
+ }
811
+ function setApiMethodMetadata(target, key, value) {
812
+ if (!methodMetadataStore.has(target)) {
813
+ methodMetadataStore.set(target, new Map);
814
+ }
815
+ methodMetadataStore.get(target)?.set(key, value);
816
+ }
817
+ function getApiMethodMetadata(target, key) {
818
+ return methodMetadataStore.get(target)?.get(key);
819
+ }
820
+ function setApiPropertyMetadata(target, propertyKey, value) {
821
+ if (!propertyMetadataStore.has(target)) {
822
+ propertyMetadataStore.set(target, new Map);
823
+ }
824
+ const key = typeof propertyKey === "symbol" ? propertyKey.toString() : propertyKey;
825
+ propertyMetadataStore.get(target)?.set(key, value);
826
+ }
827
+ function getApiPropertyMetadata(target, propertyKey) {
828
+ const key = typeof propertyKey === "symbol" ? propertyKey.toString() : propertyKey;
829
+ return propertyMetadataStore.get(target)?.get(key);
830
+ }
831
+ function getApiPropertyKeys(target) {
832
+ const metaMap = propertyMetadataStore.get(target);
833
+ if (!metaMap)
834
+ return [];
835
+ return Array.from(metaMap.keys());
836
+ }
837
+ var classMetadataStore, methodMetadataStore, propertyMetadataStore;
838
+ var init_metadata = __esm(() => {
839
+ classMetadataStore = new WeakMap;
840
+ methodMetadataStore = new WeakMap;
841
+ propertyMetadataStore = new WeakMap;
842
+ });
843
+
416
844
  // src/config/merge.ts
417
845
  function isPlainObject(value) {
418
846
  if (value === null || typeof value !== "object") {
@@ -1599,278 +2027,69 @@ function watchConfig(filePath, callback, options) {
1599
2027
  try {
1600
2028
  configCache.delete(filePath);
1601
2029
  const { config } = await loadConfigFile(filePath, { useCache: false });
1602
- if (timeout) {
1603
- clearTimeout(timeout);
1604
- }
1605
- timeout = setTimeout(() => {
1606
- callback(config);
1607
- }, debounce);
1608
- } catch {}
1609
- }, 1000);
1610
- return () => {
1611
- clearInterval(interval);
1612
- if (timeout) {
1613
- clearTimeout(timeout);
1614
- }
1615
- };
1616
- }
1617
- function validateConfigStructure(config) {
1618
- if (config === null || typeof config !== "object") {
1619
- return false;
1620
- }
1621
- const validKeys = new Set([
1622
- "server",
1623
- "database",
1624
- "cache",
1625
- "logger",
1626
- "health",
1627
- "metrics",
1628
- "telemetry",
1629
- "frontend"
1630
- ]);
1631
- const cfg = config;
1632
- for (const key of Object.keys(cfg)) {
1633
- if (!validKeys.has(key)) {
1634
- console.warn(`Unknown config key: ${key}`);
1635
- }
1636
- }
1637
- return true;
1638
- }
1639
- function getConfigPathFromArgs(args = process.argv) {
1640
- const configIndex = args.indexOf("--config");
1641
- if (configIndex !== -1 && args[configIndex + 1]) {
1642
- return args[configIndex + 1];
1643
- }
1644
- const shortIndex = args.indexOf("-c");
1645
- if (shortIndex !== -1 && args[shortIndex + 1]) {
1646
- return args[shortIndex + 1];
1647
- }
1648
- return;
1649
- }
1650
- function getConfigPathFromEnv() {
1651
- return Bun.env.BUENO_CONFIG;
1652
- }
1653
- var CONFIG_FILES, configCache;
1654
- var init_loader = __esm(() => {
1655
- CONFIG_FILES = [
1656
- "bueno.config.ts",
1657
- "bueno.config.js",
1658
- ".buenorc.ts",
1659
- ".buenorc.js",
1660
- "bueno.config.mjs"
1661
- ];
1662
- configCache = new Map;
1663
- });
1664
-
1665
- // src/container/forward-ref.ts
1666
- var FORWARD_REF_SYMBOL = Symbol.for("buno.forwardRef");
1667
- function forwardRef(fn) {
1668
- return {
1669
- __forwardRef: FORWARD_REF_SYMBOL,
1670
- forwardRef: fn
1671
- };
1672
- }
1673
- function isForwardRef(value) {
1674
- return typeof value === "object" && value !== null && "__forwardRef" in value && "forwardRef" in value && typeof value.forwardRef === "function";
1675
- }
1676
- function resolveForwardRef(ref) {
1677
- if (isForwardRef(ref)) {
1678
- return ref.forwardRef();
1679
- }
1680
- return ref;
1681
- }
1682
-
1683
- // src/container/index.ts
1684
- function createToken(description) {
1685
- return Symbol(description);
1686
- }
1687
- var Token = createToken;
1688
-
1689
- class ResolutionStack {
1690
- stack = new Set;
1691
- lazyResolutions = new Map;
1692
- push(token) {
1693
- if (this.stack.has(token)) {
1694
- throw new Error("Circular dependency detected: Token already in resolution stack");
1695
- }
1696
- this.stack.add(token);
1697
- }
1698
- pop(token) {
1699
- this.stack.delete(token);
1700
- }
1701
- has(token) {
1702
- return this.stack.has(token);
1703
- }
1704
- markLazy(token, placeholder) {
1705
- this.lazyResolutions.set(token, placeholder);
1706
- }
1707
- hasLazy(token) {
1708
- return this.lazyResolutions.has(token);
1709
- }
1710
- getLazy(token) {
1711
- return this.lazyResolutions.get(token);
1712
- }
1713
- clearLazy(token) {
1714
- this.lazyResolutions.delete(token);
1715
- }
1716
- }
1717
-
1718
- class Container2 {
1719
- providers = new Map;
1720
- resolutionStack = new ResolutionStack;
1721
- register(provider) {
1722
- if (this.providers.has(provider.token)) {
1723
- throw new Error(`Provider already registered for token: ${String(provider.token)}`);
1724
- }
1725
- this.providers.set(provider.token, {
1726
- provider: {
1727
- ...provider,
1728
- scope: provider.scope ?? "singleton"
1729
- }
1730
- });
1731
- }
1732
- registerAll(providers) {
1733
- for (const provider of providers) {
1734
- this.register(provider);
1735
- }
1736
- }
1737
- has(token) {
1738
- return this.providers.has(token);
1739
- }
1740
- resolve(token) {
1741
- const resolved = this.providers.get(token);
1742
- if (!resolved) {
1743
- throw new Error(`No provider registered for token: ${String(token)}`);
1744
- }
1745
- const { provider } = resolved;
1746
- if (this.resolutionStack.has(token)) {
1747
- return this.createLazyProxy(token, resolved);
1748
- }
1749
- if (provider.scope === "singleton" && resolved.instance !== undefined) {
1750
- return resolved.instance;
1751
- }
1752
- this.resolutionStack.push(token);
1753
- try {
1754
- const instance = this.createInstance(provider);
1755
- if (provider.scope === "singleton") {
1756
- resolved.instance = instance;
1757
- }
1758
- return instance;
1759
- } finally {
1760
- this.resolutionStack.pop(token);
1761
- }
1762
- }
1763
- createLazyProxy(token, resolved) {
1764
- const existingLazy = this.resolutionStack.getLazy(token);
1765
- if (existingLazy && existingLazy.instance) {
1766
- return existingLazy.instance;
1767
- }
1768
- const placeholder = {
1769
- resolved: false
1770
- };
1771
- this.resolutionStack.markLazy(token, placeholder);
1772
- const proxy = new Proxy({}, {
1773
- get: (target, prop) => {
1774
- if (placeholder.resolved && placeholder.instance) {
1775
- const value = placeholder.instance[prop];
1776
- return typeof value === "function" ? value.bind(placeholder.instance) : value;
1777
- }
1778
- if (resolved.instance !== undefined) {
1779
- placeholder.instance = resolved.instance;
1780
- placeholder.resolved = true;
1781
- } else {
1782
- if (prop === "then") {
1783
- return;
1784
- }
1785
- }
1786
- if (placeholder.instance) {
1787
- const value = placeholder.instance[prop];
1788
- return typeof value === "function" ? value.bind(placeholder.instance) : value;
1789
- }
1790
- return () => {
1791
- return;
1792
- };
1793
- },
1794
- set: (target, prop, value) => {
1795
- if (placeholder.instance) {
1796
- placeholder.instance[prop] = value;
1797
- return true;
1798
- }
1799
- return false;
1800
- },
1801
- has: (target, prop) => {
1802
- if (placeholder.instance) {
1803
- return prop in placeholder.instance;
1804
- }
1805
- return false;
1806
- }
1807
- });
1808
- placeholder.instance = proxy;
1809
- return proxy;
1810
- }
1811
- createInstance(provider) {
1812
- if (provider.useValue !== undefined) {
1813
- return provider.useValue;
1814
- }
1815
- if (provider.useFactory) {
1816
- const deps = this.resolveDeps(provider.inject ?? []);
1817
- return provider.useFactory(...deps);
1818
- }
1819
- if (provider.useClass) {
1820
- const deps = this.resolveDeps(provider.inject ?? []);
1821
- return new provider.useClass(...deps);
1822
- }
1823
- throw new Error(`Invalid provider configuration for token: ${String(provider.token)}`);
1824
- }
1825
- resolveDeps(tokens) {
1826
- return tokens.map((tokenOrRef) => {
1827
- const token = resolveForwardRef(tokenOrRef);
1828
- return this.resolve(token);
1829
- });
1830
- }
1831
- clear() {
1832
- this.providers.clear();
1833
- }
1834
- getTokens() {
1835
- return Array.from(this.providers.keys());
1836
- }
1837
- createChild() {
1838
- const child = new Container2;
1839
- for (const [token, resolved] of this.providers) {
1840
- if (resolved.provider.scope === "singleton") {
1841
- child.providers.set(token, resolved);
2030
+ if (timeout) {
2031
+ clearTimeout(timeout);
1842
2032
  }
2033
+ timeout = setTimeout(() => {
2034
+ callback(config);
2035
+ }, debounce);
2036
+ } catch {}
2037
+ }, 1000);
2038
+ return () => {
2039
+ clearInterval(interval);
2040
+ if (timeout) {
2041
+ clearTimeout(timeout);
1843
2042
  }
1844
- return child;
1845
- }
2043
+ };
1846
2044
  }
1847
- var containerMetadata = new WeakMap;
1848
- function setContainerMetadata(target, key, value) {
1849
- if (!containerMetadata.has(target)) {
1850
- containerMetadata.set(target, new Map);
2045
+ function validateConfigStructure(config) {
2046
+ if (config === null || typeof config !== "object") {
2047
+ return false;
1851
2048
  }
1852
- containerMetadata.get(target)?.set(key, value);
1853
- }
1854
- function getContainerMetadata(target, key) {
1855
- return containerMetadata.get(target)?.get(key);
1856
- }
1857
- function Injectable(token) {
1858
- return (target) => {
1859
- setContainerMetadata(target, "injectable", true);
1860
- if (token) {
1861
- setContainerMetadata(target, "token", token);
2049
+ const validKeys = new Set([
2050
+ "server",
2051
+ "database",
2052
+ "cache",
2053
+ "logger",
2054
+ "health",
2055
+ "metrics",
2056
+ "telemetry",
2057
+ "frontend"
2058
+ ]);
2059
+ const cfg = config;
2060
+ for (const key of Object.keys(cfg)) {
2061
+ if (!validKeys.has(key)) {
2062
+ console.warn(`Unknown config key: ${key}`);
1862
2063
  }
1863
- return target;
1864
- };
2064
+ }
2065
+ return true;
1865
2066
  }
1866
- function Inject(token) {
1867
- return (target, propertyKey, parameterIndex) => {
1868
- const targetObj = target;
1869
- const existingTokens = getContainerMetadata(targetObj, "inject:tokens") ?? [];
1870
- existingTokens[parameterIndex] = token;
1871
- setContainerMetadata(targetObj, "inject:tokens", existingTokens);
1872
- };
2067
+ function getConfigPathFromArgs(args = process.argv) {
2068
+ const configIndex = args.indexOf("--config");
2069
+ if (configIndex !== -1 && args[configIndex + 1]) {
2070
+ return args[configIndex + 1];
2071
+ }
2072
+ const shortIndex = args.indexOf("-c");
2073
+ if (shortIndex !== -1 && args[shortIndex + 1]) {
2074
+ return args[shortIndex + 1];
2075
+ }
2076
+ return;
2077
+ }
2078
+ function getConfigPathFromEnv() {
2079
+ return Bun.env.BUENO_CONFIG;
1873
2080
  }
2081
+ var CONFIG_FILES, configCache;
2082
+ var init_loader = __esm(() => {
2083
+ CONFIG_FILES = [
2084
+ "bueno.config.ts",
2085
+ "bueno.config.js",
2086
+ ".buenorc.ts",
2087
+ ".buenorc.js",
2088
+ "bueno.config.mjs"
2089
+ ];
2090
+ configCache = new Map;
2091
+ });
2092
+
1874
2093
  // src/router/linear.ts
1875
2094
  function patternToRegex(pattern) {
1876
2095
  const paramNames = [];
@@ -2747,6 +2966,9 @@ class NotFoundError extends BuenoError {
2747
2966
  }
2748
2967
  }
2749
2968
 
2969
+ // src/modules/index.ts
2970
+ init_container();
2971
+
2750
2972
  // src/modules/filters.ts
2751
2973
  var filterMetadataStore = new WeakMap;
2752
2974
  var catchMetadataStore = new WeakMap;
@@ -2947,134 +3169,8 @@ function createInternalErrorResponse(exception) {
2947
3169
  });
2948
3170
  }
2949
3171
 
2950
- // src/modules/guards.ts
2951
- var guardsClassMetadata = new WeakMap;
2952
- var guardsMethodMetadata = new WeakMap;
2953
- function setClassGuards(target, guards) {
2954
- guardsClassMetadata.set(target, guards);
2955
- }
2956
- function getClassGuards(target) {
2957
- return guardsClassMetadata.get(target);
2958
- }
2959
- function setMethodGuards(target, propertyKey, guards) {
2960
- if (!guardsMethodMetadata.has(target)) {
2961
- guardsMethodMetadata.set(target, new Map);
2962
- }
2963
- guardsMethodMetadata.get(target)?.set(propertyKey, guards);
2964
- }
2965
- function getMethodGuards(target, propertyKey) {
2966
- return guardsMethodMetadata.get(target)?.get(propertyKey);
2967
- }
2968
- function UseGuards(...guards) {
2969
- const decorator = (target, propertyKey, descriptor2) => {
2970
- if (propertyKey !== undefined && descriptor2 !== undefined) {
2971
- const targetObj = target;
2972
- const existingGuards = getMethodGuards(targetObj, propertyKey) ?? [];
2973
- setMethodGuards(targetObj, propertyKey, [...existingGuards, ...guards]);
2974
- return descriptor2;
2975
- } else {
2976
- const targetClass = target;
2977
- const existingGuards = getClassGuards(targetClass) ?? [];
2978
- setClassGuards(targetClass, [...existingGuards, ...guards]);
2979
- }
2980
- };
2981
- return decorator;
2982
- }
2983
-
2984
- class AuthGuard {
2985
- canActivate(context) {
2986
- const authHeader = context.req.headers.get("Authorization");
2987
- return authHeader !== null && authHeader.length > 0;
2988
- }
2989
- }
2990
- var rolesMethodMetadata = new WeakMap;
2991
- function setMethodRoles(target, propertyKey, roles) {
2992
- if (!rolesMethodMetadata.has(target)) {
2993
- rolesMethodMetadata.set(target, new Map);
2994
- }
2995
- rolesMethodMetadata.get(target)?.set(propertyKey, roles);
2996
- }
2997
- function getMethodRoles(target, propertyKey) {
2998
- return rolesMethodMetadata.get(target)?.get(propertyKey);
2999
- }
3000
- function Roles(...roles) {
3001
- return (target, propertyKey, descriptor2) => {
3002
- const targetObj = target;
3003
- setMethodRoles(targetObj, propertyKey, roles);
3004
- return descriptor2;
3005
- };
3006
- }
3007
-
3008
- class RolesGuard {
3009
- canActivate(context) {
3010
- const requiredRoles = context.requiredRoles;
3011
- if (!requiredRoles || requiredRoles.length === 0) {
3012
- return true;
3013
- }
3014
- const user = context.user;
3015
- if (!user || !user.roles) {
3016
- return false;
3017
- }
3018
- return requiredRoles.some((role) => user.roles?.includes(role));
3019
- }
3020
- }
3021
- async function executeGuards(context, options) {
3022
- const {
3023
- globalGuards = [],
3024
- classGuards = [],
3025
- methodGuards = [],
3026
- resolveGuard
3027
- } = options;
3028
- const allGuards = [...globalGuards, ...classGuards, ...methodGuards];
3029
- for (const guard of allGuards) {
3030
- let guardInstance = null;
3031
- if (typeof guard === "function") {
3032
- const funcGuard = guard;
3033
- if (funcGuard.prototype && typeof funcGuard.prototype === "object" && "canActivate" in funcGuard.prototype) {
3034
- guardInstance = resolveGuard ? resolveGuard(guard) : null;
3035
- if (!guardInstance) {
3036
- const GuardClass = guard;
3037
- guardInstance = new GuardClass;
3038
- }
3039
- } else {
3040
- guardInstance = guard;
3041
- }
3042
- } else if (typeof guard === "object" && guard !== null) {
3043
- const objGuard = guard;
3044
- if ("canActivate" in objGuard && typeof objGuard.canActivate === "function") {
3045
- guardInstance = guard;
3046
- } else {
3047
- guardInstance = resolveGuard ? resolveGuard(guard) : null;
3048
- }
3049
- }
3050
- if (!guardInstance) {
3051
- console.warn("Guard could not be resolved:", guard);
3052
- continue;
3053
- }
3054
- let result;
3055
- if (typeof guardInstance === "function") {
3056
- result = await guardInstance(context);
3057
- } else {
3058
- result = await guardInstance.canActivate(context);
3059
- }
3060
- if (!result) {
3061
- return false;
3062
- }
3063
- }
3064
- return true;
3065
- }
3066
- function createForbiddenResponse() {
3067
- return new Response(JSON.stringify({
3068
- statusCode: 403,
3069
- error: "Forbidden",
3070
- message: "Access denied"
3071
- }), {
3072
- status: 403,
3073
- headers: {
3074
- "Content-Type": "application/json"
3075
- }
3076
- });
3077
- }
3172
+ // src/modules/index.ts
3173
+ init_guards();
3078
3174
 
3079
3175
  // src/modules/interceptors.ts
3080
3176
  var interceptorsClassMetadata = new WeakMap;
@@ -3949,7 +4045,10 @@ function isPipeTransform(value) {
3949
4045
  function isPipeFn(value) {
3950
4046
  return typeof value === "function" && !isPipeTransform(value);
3951
4047
  }
4048
+
3952
4049
  // src/modules/index.ts
4050
+ init_guards();
4051
+ init_container();
3953
4052
  function Inject2(token) {
3954
4053
  return (target, propertyKey, parameterIndex) => {
3955
4054
  const targetObj = target;
@@ -4053,6 +4152,7 @@ class Application {
4053
4152
  routeInterceptorMetadata = new Map;
4054
4153
  moduleLoader;
4055
4154
  loadedLazyModules = new Set;
4155
+ websocketHandler = null;
4056
4156
  constructor(moduleClass) {
4057
4157
  this.container = new Container2;
4058
4158
  this.router = new Router;
@@ -4065,6 +4165,15 @@ class Application {
4065
4165
  this.globalGuards.push(...guards);
4066
4166
  return this;
4067
4167
  }
4168
+ getGlobalGuards() {
4169
+ return this.globalGuards;
4170
+ }
4171
+ getGlobalInterceptors() {
4172
+ return this.globalInterceptors;
4173
+ }
4174
+ setWebSocketHandler(handler) {
4175
+ this.websocketHandler = handler;
4176
+ }
4068
4177
  useGlobalPipes(...pipes) {
4069
4178
  this.globalPipes.push(...pipes);
4070
4179
  return this;
@@ -4238,7 +4347,16 @@ class Application {
4238
4347
  this.server = Bun.serve({
4239
4348
  port,
4240
4349
  hostname,
4241
- fetch: async (request) => {
4350
+ ...this.websocketHandler ? { websocket: this.websocketHandler } : {},
4351
+ fetch: async (request, server) => {
4352
+ if (this.websocketHandler && request.headers.get("upgrade")?.toLowerCase() === "websocket") {
4353
+ const wsUpgradeHandler = this.websocketHandler.__upgradeHandler;
4354
+ if (wsUpgradeHandler) {
4355
+ const response = wsUpgradeHandler(request, server);
4356
+ if (response)
4357
+ return response;
4358
+ }
4359
+ }
4242
4360
  if (this.isShuttingDown) {
4243
4361
  return new Response("Service Unavailable", { status: 503 });
4244
4362
  }
@@ -7938,47 +8056,9 @@ class DocumentBuilder {
7938
8056
  return this.document;
7939
8057
  }
7940
8058
  }
7941
- // src/openapi/metadata.ts
7942
- var classMetadataStore = new WeakMap;
7943
- function setApiMetadata(target, key, value) {
7944
- if (!classMetadataStore.has(target)) {
7945
- classMetadataStore.set(target, new Map);
7946
- }
7947
- classMetadataStore.get(target)?.set(key, value);
7948
- }
7949
- function getApiMetadata(target, key) {
7950
- return classMetadataStore.get(target)?.get(key);
7951
- }
7952
- var methodMetadataStore = new WeakMap;
7953
- function setApiMethodMetadata(target, key, value) {
7954
- if (!methodMetadataStore.has(target)) {
7955
- methodMetadataStore.set(target, new Map);
7956
- }
7957
- methodMetadataStore.get(target)?.set(key, value);
7958
- }
7959
- function getApiMethodMetadata(target, key) {
7960
- return methodMetadataStore.get(target)?.get(key);
7961
- }
7962
- var propertyMetadataStore = new WeakMap;
7963
- function setApiPropertyMetadata(target, propertyKey, value) {
7964
- if (!propertyMetadataStore.has(target)) {
7965
- propertyMetadataStore.set(target, new Map);
7966
- }
7967
- const key = typeof propertyKey === "symbol" ? propertyKey.toString() : propertyKey;
7968
- propertyMetadataStore.get(target)?.set(key, value);
7969
- }
7970
- function getApiPropertyMetadata(target, propertyKey) {
7971
- const key = typeof propertyKey === "symbol" ? propertyKey.toString() : propertyKey;
7972
- return propertyMetadataStore.get(target)?.get(key);
7973
- }
7974
- function getApiPropertyKeys(target) {
7975
- const metaMap = propertyMetadataStore.get(target);
7976
- if (!metaMap)
7977
- return [];
7978
- return Array.from(metaMap.keys());
7979
- }
7980
-
7981
8059
  // src/openapi/schema-generator.ts
8060
+ init_metadata();
8061
+
7982
8062
  class SchemaGenerator {
7983
8063
  schemas = new Map;
7984
8064
  typeNames = new Map;
@@ -8147,6 +8227,7 @@ class SchemaGenerator {
8147
8227
  }
8148
8228
  }
8149
8229
  // src/openapi/route-scanner.ts
8230
+ init_metadata();
8150
8231
  class RouteScanner {
8151
8232
  schemaGenerator;
8152
8233
  constructor(schemaGenerator) {
@@ -8357,6 +8438,7 @@ class SwaggerModule {
8357
8438
  }
8358
8439
  }
8359
8440
  // src/openapi/decorators.ts
8441
+ init_metadata();
8360
8442
  function ApiTags(...tags) {
8361
8443
  return (target) => {
8362
8444
  const existingTags = getApiMetadata(target, "api:tags") ?? [];
@@ -10446,6 +10528,10 @@ class ObservabilityModule {
10446
10528
  return service;
10447
10529
  }
10448
10530
  }
10531
+
10532
+ // src/index.ts
10533
+ init_container();
10534
+
10449
10535
  // src/middleware/built-in.ts
10450
10536
  function logger(options = {}) {
10451
10537
  const { format = "text", level = "info" } = options;