@buenojs/bueno 0.8.4 → 0.8.6

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 (234) hide show
  1. package/README.md +264 -17
  2. package/dist/cli/{index.js → bin.js} +413 -332
  3. package/dist/container/index.js +273 -0
  4. package/dist/context/index.js +219 -0
  5. package/dist/database/index.js +493 -0
  6. package/dist/frontend/index.js +7697 -0
  7. package/dist/graphql/index.js +2156 -0
  8. package/dist/health/index.js +364 -0
  9. package/dist/i18n/index.js +345 -0
  10. package/dist/index.js +9694 -5047
  11. package/dist/jobs/index.js +819 -0
  12. package/dist/lock/index.js +367 -0
  13. package/dist/logger/index.js +281 -0
  14. package/dist/metrics/index.js +289 -0
  15. package/dist/middleware/index.js +77 -0
  16. package/dist/migrations/index.js +571 -0
  17. package/dist/modules/index.js +3411 -0
  18. package/dist/notification/index.js +484 -0
  19. package/dist/observability/index.js +331 -0
  20. package/dist/openapi/index.js +795 -0
  21. package/dist/orm/index.js +1356 -0
  22. package/dist/router/index.js +886 -0
  23. package/dist/rpc/index.js +691 -0
  24. package/dist/schema/index.js +400 -0
  25. package/dist/telemetry/index.js +595 -0
  26. package/dist/template/index.js +640 -0
  27. package/dist/templates/index.js +640 -0
  28. package/dist/testing/index.js +1111 -0
  29. package/dist/types/index.js +60 -0
  30. package/llms.txt +231 -0
  31. package/package.json +125 -27
  32. package/src/cache/index.ts +2 -1
  33. package/src/cli/ARCHITECTURE.md +3 -3
  34. package/src/cli/bin.ts +2 -2
  35. package/src/cli/commands/build.ts +183 -165
  36. package/src/cli/commands/dev.ts +96 -89
  37. package/src/cli/commands/generate.ts +142 -111
  38. package/src/cli/commands/help.ts +20 -16
  39. package/src/cli/commands/index.ts +3 -6
  40. package/src/cli/commands/migration.ts +124 -105
  41. package/src/cli/commands/new.ts +294 -232
  42. package/src/cli/commands/start.ts +81 -79
  43. package/src/cli/core/args.ts +68 -50
  44. package/src/cli/core/console.ts +89 -95
  45. package/src/cli/core/index.ts +4 -4
  46. package/src/cli/core/prompt.ts +65 -62
  47. package/src/cli/core/spinner.ts +23 -20
  48. package/src/cli/index.ts +46 -38
  49. package/src/cli/templates/database/index.ts +37 -18
  50. package/src/cli/templates/database/mysql.ts +3 -3
  51. package/src/cli/templates/database/none.ts +2 -2
  52. package/src/cli/templates/database/postgresql.ts +3 -3
  53. package/src/cli/templates/database/sqlite.ts +3 -3
  54. package/src/cli/templates/deploy.ts +29 -26
  55. package/src/cli/templates/docker.ts +41 -30
  56. package/src/cli/templates/frontend/index.ts +33 -15
  57. package/src/cli/templates/frontend/none.ts +2 -2
  58. package/src/cli/templates/frontend/react.ts +18 -18
  59. package/src/cli/templates/frontend/solid.ts +15 -15
  60. package/src/cli/templates/frontend/svelte.ts +17 -17
  61. package/src/cli/templates/frontend/vue.ts +15 -15
  62. package/src/cli/templates/generators/index.ts +29 -29
  63. package/src/cli/templates/generators/types.ts +21 -21
  64. package/src/cli/templates/index.ts +6 -6
  65. package/src/cli/templates/project/api.ts +37 -36
  66. package/src/cli/templates/project/default.ts +25 -25
  67. package/src/cli/templates/project/fullstack.ts +28 -26
  68. package/src/cli/templates/project/index.ts +55 -16
  69. package/src/cli/templates/project/minimal.ts +17 -12
  70. package/src/cli/templates/project/types.ts +10 -5
  71. package/src/cli/templates/project/website.ts +15 -15
  72. package/src/cli/utils/fs.ts +55 -41
  73. package/src/cli/utils/index.ts +3 -3
  74. package/src/cli/utils/strings.ts +47 -33
  75. package/src/cli/utils/version.ts +14 -8
  76. package/src/config/env-validation.ts +100 -0
  77. package/src/config/env.ts +169 -41
  78. package/src/config/index.ts +28 -20
  79. package/src/config/loader.ts +25 -16
  80. package/src/config/merge.ts +21 -10
  81. package/src/config/types.ts +566 -25
  82. package/src/config/validation.ts +215 -7
  83. package/src/container/forward-ref.ts +22 -22
  84. package/src/container/index.ts +34 -12
  85. package/src/context/index.ts +11 -1
  86. package/src/database/index.ts +7 -190
  87. package/src/database/orm/builder.ts +457 -0
  88. package/src/database/orm/casts/index.ts +130 -0
  89. package/src/database/orm/casts/types.ts +25 -0
  90. package/src/database/orm/compiler.ts +304 -0
  91. package/src/database/orm/hooks/index.ts +114 -0
  92. package/src/database/orm/index.ts +61 -0
  93. package/src/database/orm/model-registry.ts +59 -0
  94. package/src/database/orm/model.ts +821 -0
  95. package/src/database/orm/relationships/base.ts +146 -0
  96. package/src/database/orm/relationships/belongs-to-many.ts +179 -0
  97. package/src/database/orm/relationships/belongs-to.ts +56 -0
  98. package/src/database/orm/relationships/has-many.ts +45 -0
  99. package/src/database/orm/relationships/has-one.ts +41 -0
  100. package/src/database/orm/relationships/index.ts +11 -0
  101. package/src/database/orm/scopes/index.ts +55 -0
  102. package/src/events/__tests__/event-system.test.ts +235 -0
  103. package/src/events/config.ts +238 -0
  104. package/src/events/example-usage.ts +185 -0
  105. package/src/events/index.ts +278 -0
  106. package/src/events/manager.ts +385 -0
  107. package/src/events/registry.ts +182 -0
  108. package/src/events/types.ts +124 -0
  109. package/src/frontend/api-routes.ts +65 -23
  110. package/src/frontend/bundler.ts +76 -34
  111. package/src/frontend/console-client.ts +2 -2
  112. package/src/frontend/console-stream.ts +94 -38
  113. package/src/frontend/dev-server.ts +94 -46
  114. package/src/frontend/file-router.ts +61 -19
  115. package/src/frontend/frameworks/index.ts +37 -10
  116. package/src/frontend/frameworks/react.ts +10 -8
  117. package/src/frontend/frameworks/solid.ts +11 -9
  118. package/src/frontend/frameworks/svelte.ts +15 -9
  119. package/src/frontend/frameworks/vue.ts +13 -11
  120. package/src/frontend/hmr-client.ts +12 -10
  121. package/src/frontend/hmr.ts +146 -103
  122. package/src/frontend/index.ts +14 -5
  123. package/src/frontend/islands.ts +41 -22
  124. package/src/frontend/isr.ts +59 -37
  125. package/src/frontend/layout.ts +36 -21
  126. package/src/frontend/ssr/react.ts +74 -27
  127. package/src/frontend/ssr/solid.ts +54 -20
  128. package/src/frontend/ssr/svelte.ts +48 -14
  129. package/src/frontend/ssr/vue.ts +50 -18
  130. package/src/frontend/ssr.ts +83 -39
  131. package/src/frontend/types.ts +91 -56
  132. package/src/graphql/built-in-engine.ts +598 -0
  133. package/src/graphql/context-builder.ts +110 -0
  134. package/src/graphql/decorators.ts +358 -0
  135. package/src/graphql/execution-pipeline.ts +227 -0
  136. package/src/graphql/graphql-module.ts +563 -0
  137. package/src/graphql/index.ts +101 -0
  138. package/src/graphql/metadata.ts +237 -0
  139. package/src/graphql/schema-builder.ts +319 -0
  140. package/src/graphql/subscription-handler.ts +283 -0
  141. package/src/graphql/types.ts +324 -0
  142. package/src/health/index.ts +21 -9
  143. package/src/i18n/engine.ts +305 -0
  144. package/src/i18n/index.ts +38 -0
  145. package/src/i18n/loader.ts +218 -0
  146. package/src/i18n/middleware.ts +164 -0
  147. package/src/i18n/negotiator.ts +162 -0
  148. package/src/i18n/types.ts +158 -0
  149. package/src/index.ts +182 -27
  150. package/src/jobs/drivers/memory.ts +315 -0
  151. package/src/jobs/drivers/redis.ts +459 -0
  152. package/src/jobs/index.ts +30 -0
  153. package/src/jobs/queue.ts +281 -0
  154. package/src/jobs/types.ts +295 -0
  155. package/src/jobs/worker.ts +380 -0
  156. package/src/logger/index.ts +1 -3
  157. package/src/logger/transports/index.ts +62 -22
  158. package/src/metrics/index.ts +25 -16
  159. package/src/migrations/index.ts +9 -0
  160. package/src/modules/filters.ts +13 -17
  161. package/src/modules/guards.ts +49 -26
  162. package/src/modules/index.ts +457 -299
  163. package/src/modules/interceptors.ts +58 -20
  164. package/src/modules/lazy.ts +11 -19
  165. package/src/modules/lifecycle.ts +15 -7
  166. package/src/modules/metadata.ts +15 -5
  167. package/src/modules/pipes.ts +94 -72
  168. package/src/notification/channels/base.ts +68 -0
  169. package/src/notification/channels/email.ts +105 -0
  170. package/src/notification/channels/push.ts +104 -0
  171. package/src/notification/channels/sms.ts +105 -0
  172. package/src/notification/channels/whatsapp.ts +104 -0
  173. package/src/notification/index.ts +48 -0
  174. package/src/notification/service.ts +354 -0
  175. package/src/notification/types.ts +344 -0
  176. package/src/observability/__tests__/observability.test.ts +483 -0
  177. package/src/observability/breadcrumbs.ts +114 -0
  178. package/src/observability/index.ts +136 -0
  179. package/src/observability/interceptor.ts +85 -0
  180. package/src/observability/service.ts +303 -0
  181. package/src/observability/trace.ts +37 -0
  182. package/src/observability/types.ts +196 -0
  183. package/src/openapi/__tests__/decorators.test.ts +335 -0
  184. package/src/openapi/__tests__/document-builder.test.ts +285 -0
  185. package/src/openapi/__tests__/route-scanner.test.ts +334 -0
  186. package/src/openapi/__tests__/schema-generator.test.ts +275 -0
  187. package/src/openapi/decorators.ts +328 -0
  188. package/src/openapi/document-builder.ts +274 -0
  189. package/src/openapi/index.ts +112 -0
  190. package/src/openapi/metadata.ts +112 -0
  191. package/src/openapi/route-scanner.ts +289 -0
  192. package/src/openapi/schema-generator.ts +256 -0
  193. package/src/openapi/swagger-module.ts +166 -0
  194. package/src/openapi/types.ts +398 -0
  195. package/src/orm/index.ts +10 -0
  196. package/src/rpc/index.ts +3 -1
  197. package/src/schema/index.ts +9 -0
  198. package/src/security/index.ts +15 -6
  199. package/src/ssg/index.ts +9 -8
  200. package/src/telemetry/index.ts +76 -22
  201. package/src/template/index.ts +7 -0
  202. package/src/templates/engine.ts +224 -0
  203. package/src/templates/index.ts +9 -0
  204. package/src/templates/loader.ts +331 -0
  205. package/src/templates/renderers/markdown.ts +212 -0
  206. package/src/templates/renderers/simple.ts +269 -0
  207. package/src/templates/types.ts +154 -0
  208. package/src/testing/index.ts +100 -27
  209. package/src/types/optional-deps.d.ts +347 -187
  210. package/src/validation/index.ts +92 -2
  211. package/src/validation/schemas.ts +536 -0
  212. package/tests/integration/cli.test.ts +19 -19
  213. package/tests/integration/fullstack.test.ts +4 -4
  214. package/tests/unit/cli.test.ts +1 -1
  215. package/tests/unit/database.test.ts +2 -72
  216. package/tests/unit/env-validation.test.ts +166 -0
  217. package/tests/unit/events.test.ts +910 -0
  218. package/tests/unit/graphql.test.ts +991 -0
  219. package/tests/unit/i18n.test.ts +455 -0
  220. package/tests/unit/jobs.test.ts +493 -0
  221. package/tests/unit/notification.test.ts +988 -0
  222. package/tests/unit/observability.test.ts +453 -0
  223. package/tests/unit/orm/builder.test.ts +323 -0
  224. package/tests/unit/orm/casts.test.ts +179 -0
  225. package/tests/unit/orm/compiler.test.ts +220 -0
  226. package/tests/unit/orm/eager-loading.test.ts +285 -0
  227. package/tests/unit/orm/hooks.test.ts +191 -0
  228. package/tests/unit/orm/model.test.ts +373 -0
  229. package/tests/unit/orm/relationships.test.ts +303 -0
  230. package/tests/unit/orm/scopes.test.ts +74 -0
  231. package/tests/unit/templates-simple.test.ts +53 -0
  232. package/tests/unit/templates.test.ts +454 -0
  233. package/tests/unit/validation.test.ts +18 -24
  234. package/tsconfig.json +11 -3
@@ -19,6 +19,9 @@ export type {
19
19
  MetricsConfig,
20
20
  TelemetryConfig,
21
21
  FrontendConfig,
22
+ JobsConfig,
23
+ NotificationConfig,
24
+ I18nConfig,
22
25
  DeepPartial,
23
26
  UserConfig,
24
27
  UserConfigFn,
@@ -70,21 +73,21 @@ export {
70
73
  } from "./validation";
71
74
 
72
75
  import type { StandardSchema } from "../types";
76
+ import { getEnvConfig, loadEnv } from "./env";
77
+ import { clearConfigCache, findConfigFile, loadConfig } from "./loader";
78
+ import { deepMerge, mergeConfigs } from "./merge";
73
79
  import type {
74
80
  BuenoConfig,
75
81
  DeepPartial,
82
+ InferConfig,
76
83
  UserConfig,
77
84
  UserConfigFn,
78
- InferConfig,
79
85
  } from "./types";
80
- import { deepMerge, mergeConfigs } from "./merge";
81
- import { loadEnv, getEnvConfig } from "./env";
82
- import { loadConfig, findConfigFile, clearConfigCache } from "./loader";
83
86
  import {
87
+ type ConfigValidationResult,
88
+ assertValidConfig,
84
89
  validateConfig,
85
90
  validateConfigSync,
86
- assertValidConfig,
87
- type ConfigValidationResult,
88
91
  } from "./validation";
89
92
 
90
93
  /**
@@ -178,9 +181,9 @@ export class ConfigManager<T extends BuenoConfig = BuenoConfig> {
178
181
 
179
182
  constructor(options: ConfigManagerOptions<T> = {}) {
180
183
  this.options = options;
181
- this.config = (options.useDefaults !== false
182
- ? { ...DEFAULT_CONFIG }
183
- : {}) as T;
184
+ this.config = (
185
+ options.useDefaults !== false ? { ...DEFAULT_CONFIG } : {}
186
+ ) as T;
184
187
 
185
188
  // Apply initial config if provided
186
189
  if (options.config) {
@@ -212,10 +215,10 @@ export class ConfigManager<T extends BuenoConfig = BuenoConfig> {
212
215
  // Merge all sources
213
216
  const merged = mergeConfigs(
214
217
  {} as T,
215
- this.options.useDefaults !== false ? DEFAULT_CONFIG : {} as T,
218
+ this.options.useDefaults !== false ? DEFAULT_CONFIG : ({} as T),
216
219
  fileConfig as T,
217
220
  envConfig as T,
218
- this.options.config as T || {} as T,
221
+ (this.options.config as T) || ({} as T),
219
222
  );
220
223
 
221
224
  this.config = merged as T;
@@ -270,7 +273,10 @@ export class ConfigManager<T extends BuenoConfig = BuenoConfig> {
270
273
  set(key: string, value: unknown): void;
271
274
  set(key: string, value: unknown): void {
272
275
  const parts = key.split(".");
273
- let current: Record<string, unknown> = this.config as Record<string, unknown>;
276
+ let current: Record<string, unknown> = this.config as Record<
277
+ string,
278
+ unknown
279
+ >;
274
280
 
275
281
  for (let i = 0; i < parts.length - 1; i++) {
276
282
  const part = parts[i];
@@ -320,7 +326,9 @@ export class ConfigManager<T extends BuenoConfig = BuenoConfig> {
320
326
  * Validate synchronously (only default rules)
321
327
  */
322
328
  validateSync(): ConfigValidationResult {
323
- return validateConfigSync(this.config as unknown as DeepPartial<BuenoConfig>);
329
+ return validateConfigSync(
330
+ this.config as unknown as DeepPartial<BuenoConfig>,
331
+ );
324
332
  }
325
333
 
326
334
  /**
@@ -452,9 +460,9 @@ export function defineConfigFn<T extends BuenoConfig = BuenoConfig>(
452
460
  * const config = await createConfigManager();
453
461
  * const port = config.get('server.port');
454
462
  */
455
- export async function createConfigManager<
456
- T extends BuenoConfig = BuenoConfig,
457
- >(options?: ConfigManagerOptions<T>): Promise<ConfigManager<T>> {
463
+ export async function createConfigManager<T extends BuenoConfig = BuenoConfig>(
464
+ options?: ConfigManagerOptions<T>,
465
+ ): Promise<ConfigManager<T>> {
458
466
  const manager = new ConfigManager<T>(options);
459
467
  await manager.load();
460
468
  return manager;
@@ -478,9 +486,9 @@ export function createConfigManagerSync<T extends BuenoConfig = BuenoConfig>(
478
486
  * const config = await loadConfigDirect();
479
487
  * console.log(config.server?.port);
480
488
  */
481
- export async function loadConfigDirect<
482
- T extends BuenoConfig = BuenoConfig,
483
- >(options?: ConfigManagerOptions<T>): Promise<T> {
489
+ export async function loadConfigDirect<T extends BuenoConfig = BuenoConfig>(
490
+ options?: ConfigManagerOptions<T>,
491
+ ): Promise<T> {
484
492
  const manager = await createConfigManager<T>(options);
485
493
  return manager.getAll();
486
494
  }
@@ -503,4 +511,4 @@ export function getConfigManager(): ConfigManager {
503
511
  */
504
512
  export function setConfigManager(manager: ConfigManager): void {
505
513
  defaultManager = manager;
506
- }
514
+ }
@@ -3,8 +3,13 @@
3
3
  * Uses Bun's native TypeScript loader to import config files
4
4
  */
5
5
 
6
- import type { BuenoConfig, DeepPartial, UserConfig, UserConfigFn } from "./types";
7
6
  import { deepMerge } from "./merge";
7
+ import type {
8
+ BuenoConfig,
9
+ DeepPartial,
10
+ UserConfig,
11
+ UserConfigFn,
12
+ } from "./types";
8
13
 
9
14
  /**
10
15
  * Configuration file search order
@@ -74,7 +79,9 @@ export function clearConfigCache(): void {
74
79
  /**
75
80
  * Get cached config
76
81
  */
77
- export function getCachedConfig(path: string): DeepPartial<BuenoConfig> | undefined {
82
+ export function getCachedConfig(
83
+ path: string,
84
+ ): DeepPartial<BuenoConfig> | undefined {
78
85
  return configCache.get(path);
79
86
  }
80
87
 
@@ -152,18 +159,18 @@ export async function loadConfigFile<T extends BuenoConfig = BuenoConfig>(
152
159
  * Load configuration from file
153
160
  * Searches for config files in order and loads the first one found
154
161
  */
155
- export async function loadConfig<T extends BuenoConfig = BuenoConfig>(
156
- options?: {
157
- /** Custom config file path */
158
- configPath?: string;
159
- /** Working directory to search for config */
160
- cwd?: string;
161
- /** Whether to use cache */
162
- useCache?: boolean;
163
- /** Additional context to pass to config function */
164
- context?: Record<string, unknown>;
165
- },
166
- ): Promise<LoadedConfig> {
162
+ export async function loadConfig<
163
+ T extends BuenoConfig = BuenoConfig,
164
+ >(options?: {
165
+ /** Custom config file path */
166
+ configPath?: string;
167
+ /** Working directory to search for config */
168
+ cwd?: string;
169
+ /** Whether to use cache */
170
+ useCache?: boolean;
171
+ /** Additional context to pass to config function */
172
+ context?: Record<string, unknown>;
173
+ }): Promise<LoadedConfig> {
167
174
  // If a specific path is provided, use it
168
175
  if (options?.configPath) {
169
176
  return loadConfigFile<T>(options.configPath, {
@@ -306,7 +313,9 @@ export function validateConfigStructure(
306
313
  /**
307
314
  * Extract config file path from CLI args
308
315
  */
309
- export function getConfigPathFromArgs(args: string[] = process.argv): string | undefined {
316
+ export function getConfigPathFromArgs(
317
+ args: string[] = process.argv,
318
+ ): string | undefined {
310
319
  const configIndex = args.indexOf("--config");
311
320
  if (configIndex !== -1 && args[configIndex + 1]) {
312
321
  return args[configIndex + 1];
@@ -326,4 +335,4 @@ export function getConfigPathFromArgs(args: string[] = process.argv): string | u
326
335
  */
327
336
  export function getConfigPathFromEnv(): string | undefined {
328
337
  return Bun.env.BUENO_CONFIG;
329
- }
338
+ }
@@ -7,7 +7,9 @@ import type { BuenoConfig, DeepPartial } from "./types";
7
7
  /**
8
8
  * Check if a value is a plain object (not an array, not null, not a class instance)
9
9
  */
10
- export function isPlainObject(value: unknown): value is Record<string, unknown> {
10
+ export function isPlainObject(
11
+ value: unknown,
12
+ ): value is Record<string, unknown> {
11
13
  if (value === null || typeof value !== "object") {
12
14
  return false;
13
15
  }
@@ -60,7 +62,10 @@ export function deepMerge<T>(target: T, source: DeepPartial<T>): T {
60
62
 
61
63
  if (isPlainObject(sourceValue) && isPlainObject(targetValue)) {
62
64
  // Both are objects, merge recursively
63
- result[key] = deepMerge(targetValue, sourceValue as DeepPartial<typeof targetValue>);
65
+ result[key] = deepMerge(
66
+ targetValue,
67
+ sourceValue as DeepPartial<typeof targetValue>,
68
+ );
64
69
  } else if (Array.isArray(sourceValue) && Array.isArray(targetValue)) {
65
70
  // Both are arrays, concatenate them
66
71
  result[key] = [...targetValue, ...sourceValue];
@@ -80,13 +85,19 @@ export function deepMerge<T>(target: T, source: DeepPartial<T>): T {
80
85
  export function mergeConfigs<T extends BuenoConfig = BuenoConfig>(
81
86
  ...configs: (DeepPartial<T> | undefined | null)[]
82
87
  ): DeepPartial<T> {
83
- return configs.reduce<DeepPartial<T>>((acc, config) => {
84
- if (config === undefined || config === null) {
85
- return acc;
86
- }
87
- // Use unknown as intermediate type to avoid recursive type issues
88
- return deepMerge(acc as unknown as T, config as unknown as DeepPartial<T>) as unknown as DeepPartial<T>;
89
- }, {} as DeepPartial<T>);
88
+ return configs.reduce<DeepPartial<T>>(
89
+ (acc, config) => {
90
+ if (config === undefined || config === null) {
91
+ return acc;
92
+ }
93
+ // Use unknown as intermediate type to avoid recursive type issues
94
+ return deepMerge(
95
+ acc as unknown as T,
96
+ config as unknown as DeepPartial<T>,
97
+ ) as unknown as DeepPartial<T>;
98
+ },
99
+ {} as DeepPartial<T>,
100
+ );
90
101
  }
91
102
 
92
103
  /**
@@ -282,4 +293,4 @@ export function diffConfigs(
282
293
  }
283
294
 
284
295
  return { added, removed, changed };
285
- }
296
+ }